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