40 lines
		
	
	
		
			905 B
		
	
	
	
		
			Awk
		
	
	
	
	
	
			
		
		
	
	
			40 lines
		
	
	
		
			905 B
		
	
	
	
		
			Awk
		
	
	
	
	
	
BEGIN {
 | 
						|
    FS = "[; ]";
 | 
						|
    i = 0;
 | 
						|
}
 | 
						|
$2 == "A" { 
 | 
						|
    code = code2 = strtonum(sprintf("0x%s", $1))
 | 
						|
    if (match($1, /[.]+[0-9A-Fa-f]+/)) {
 | 
						|
	s = substr($1, RSTART, RLENGTH)
 | 
						|
	sub(/[.]+/, "0x", s)
 | 
						|
	code2 = strtonum(s)
 | 
						|
    }
 | 
						|
    for (; code <= code2; code++) {
 | 
						|
	if (code >= 0x10000) { break }
 | 
						|
	map[i] = sprintf("0x%04X", code)
 | 
						|
	i++;
 | 
						|
    }
 | 
						|
}
 | 
						|
END {
 | 
						|
    n = 0;
 | 
						|
    start = map[0]
 | 
						|
    prev = strtonum(map[0]);
 | 
						|
    for (j = 1; j < i; j++) {
 | 
						|
	cur = strtonum(map[j]);
 | 
						|
	if (cur - prev > 1) {
 | 
						|
	    map2[n] = sprintf("%s, %s", start, map[j - 1]);
 | 
						|
	    n++;
 | 
						|
	    start = map[j];
 | 
						|
	}
 | 
						|
	prev = cur;
 | 
						|
    }
 | 
						|
    if (i > 0) { map2[n] = sprintf("%s, %s", start, map[i - 1]); n++ }
 | 
						|
 | 
						|
    printf("static wc_map ucs_ambwidth_map[] = {\n");
 | 
						|
    for (j = 0; j < n; j++) {
 | 
						|
	printf("   { %s },\n", map2[j]);
 | 
						|
    }
 | 
						|
    printf("};\n");
 | 
						|
    printf("#define N_ucs_ambwidth_map (sizeof(ucs_ambwidth_map) / sizeof(*ucs_ambwidth_map))\n");
 | 
						|
}
 |