summaryrefslogtreecommitdiff
path: root/src/tools
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools')
-rw-r--r--src/tools/Makefile.am4
-rw-r--r--src/tools/genunicode.c26
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)
{