diff options
Diffstat (limited to 'src/tools/genunicode.c')
| -rw-r--r-- | src/tools/genunicode.c | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/src/tools/genunicode.c b/src/tools/genunicode.c index 0d5d428..76f2c60 100644 --- a/src/tools/genunicode.c +++ b/src/tools/genunicode.c @@ -41,6 +41,7 @@ struct line { char property[64]; }; +static void emit_line(struct line *, int *); static int peek(FILE *); static int parse_line(FILE *, struct line *); static int parse_int(FILE *); @@ -55,7 +56,7 @@ main(int argc, char *argv[]) FILE *f; char *dir, *buf; size_t dir_size, tmp_size, max_size, i, j, nfiles; - struct line line; + struct line line, prev_line; int current, n; assert(argc == 2); @@ -86,23 +87,28 @@ main(int argc, char *argv[]) printf("%s%s", (i == 0) ? "\n\t" : ",\n\t", properties[i]); printf("\n};\n\n"); - printf("struct unicode_range {\n\tint from;\n\tint to;\n};\n\n"); + printf("struct unicode_range {\n\tuint32_t from;\n\tuint32_t to;\n};\n\n"); for(i = 0; i < sizeof(files)/sizeof(files[0]); i++){ memcpy(buf+dir_size+1, files[i], strlen(files[i])+1); f = fopen(buf, "r"); assert(f != NULL); + printf("/* %s */\n\n", files[i]); + + memset(&prev_line, 0, sizeof(prev_line)); while(parse_line(f, &line)){ if(!line.valid) continue; if((current == -1) || (strcmp(line.property, properties[current]) != 0)){ if(current != -1){ + emit_line(&prev_line, &n); printf("\n};\n"); printf("#define %s_count %d\n\n", properties[current], n); } + prev_line.valid = 0; current = -1; for(j = 0; j < sizeof(properties)/sizeof(properties[0]); j++){ if(strcmp(line.property, properties[j]) == 0){ @@ -115,8 +121,13 @@ main(int argc, char *argv[]) } if(current != -1){ - printf("%s{%d, %d}", (n == 0) ? "\n\t" : ",\n\t", line.from, line.to); - n++; + if(prev_line.valid){ + if(prev_line.to+1 == line.from) + line.from = prev_line.from; + else + emit_line(&prev_line, &n); + } + prev_line = line; } } fclose(f); @@ -137,6 +148,13 @@ main(int argc, char *argv[]) return 0; } +static void +emit_line(struct line *line, int *n) +{ + printf("%s{0x%X, 0x%X}", (*n == 0) ? "\n\t" : ",\n\t", line->from, line->to); + (*n)++; +} + static int peek(FILE *f) { |