diff options
Diffstat (limited to 'src/tools')
| -rw-r--r-- | src/tools/Makefile.am | 4 | ||||
| -rw-r--r-- | src/tools/genunicode.c | 26 |
2 files changed, 24 insertions, 6 deletions
diff --git a/src/tools/Makefile.am b/src/tools/Makefile.am index 1930970..b05ab8a 100644 --- a/src/tools/Makefile.am +++ b/src/tools/Makefile.am @@ -4,13 +4,13 @@ genboot_SOURCES = src/tools/genboot.c genunicode_SOURCES = src/tools/genunicode.c BUILT_SOURCES += $(top_builddir)/generated/boot.h -BUILT_SOURCES += $(top_builddir)/generated/unicode.h +BUILT_SOURCES += $(top_builddir)/generated/unicode_properties.c $(top_builddir)/generated/boot.h: genboot src/lib/boot.aplwc $(MKDIR_P) $(top_builddir)/generated ./genboot $(top_srcdir)/src/lib/boot.aplwc > $@ -$(top_builddir)/generated/unicode.h: genunicode src/unicode/DerivedCoreProperties.txt src/unicode/PropList.txt +$(top_builddir)/generated/unicode_properties.c: genunicode src/unicode/DerivedCoreProperties.txt src/unicode/PropList.txt $(MKDIR_P) $(top_builddir)/generated ./genunicode $(top_srcdir)/src/unicode > $@ 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) { |