/* convert unicode cp pages to qe source code */ #include #include #include #include char *getline(char *buf, int buf_size, FILE *f) { char *str; int len; str = fgets(buf, buf_size, f); if (!str) return NULL; len = strlen(buf); if (len > 0 && buf[len - 1] == '\n') { buf[len - 1] = '\0'; } return str; } void handle_cp(FILE *f, const char *name) { char line[1024]; const char *p; int table[256]; int min_code, max_code, c1, c2, i, nb, j, c; char name1[256], *q; getline(line, sizeof(line), f); getline(line, sizeof(line), f); printf("static const char *aliases_%s[] = { %s, NULL };\n\n", name, line); for(i=0;i<256;i++) table[i] = i; nb = 0; for(;;) { if (!getline(line, sizeof(line), f)) break; if (!strcasecmp(line, "# compatibility")) break; if (line[0] == '\0' || line[0] == '#') continue; p = line; c1 = strtol(p, (char **)&p, 0); if (!isspace(*p)) continue; c2 = strtol(p, (char **)&p, 0); if (c1 >= 256) { fprintf(stderr, "%s: ERROR %d %d\n", name, c1, c2); continue; } table[c1] = c2; nb++; } if (table[10] != 10) fprintf(stderr, "%s: warning: newline is not preserved\n", name); min_code = 0x7fffffff; max_code = -1; for(i=0;i<256;i++) { if (table[i] != i) { if (i < min_code) min_code = i; if (i > max_code) max_code = i; } } // fprintf(stderr, "%s: %3d %02x %02x\n", name, nb, min_code, max_code); if (max_code != -1) { printf("static const unsigned short table_%s[%d] = {\n", name, max_code - min_code + 1); j = 0; for(i=min_code;i<=max_code;i++) { printf("0x%04x, ", table[i]); if ((j++ & 7) == 7) printf("\n"); } if ((j & 7) != 0) printf("\n"); printf("};\n\n"); } q = name1; for(p = name; *p != '\0'; p++) { c = *p; if (c == '_') c = '-'; *q++ = c; } *q = '\0'; printf("QECharset charset_%s = {\n" "\"%s\",\n" "aliases_%s,\n" "decode_8bit_init,\n" "NULL,\n" "encode_8bit,\n" "table_alloc: 1,\n" "min_char: %d,\n" "max_char: %d,\n" "private_table: table_%s,\n" "};\n\n", name, name1, name, min_code, max_code, name); } /* handle jis208 or jis212 table */ void handle_jis(FILE *f, int is_jis208) { int c1, c2, b1, b2, b1_max, b2_max, i, j, nb, n; int table[94*94]; int table_b2_max[94]; char line[1024]; const char *p; const char *name = is_jis208 ? "jis208" : "jis212"; memset(table, 0, sizeof(table)); memset(table_b2_max, 0, sizeof(table_b2_max)); b1_max = 0; b2_max = 0; nb = 0; for(;;) { if (!getline(line, sizeof(line), f)) break; if (line[0] == '\0' || line[0] == '#') continue; p = line; if (is_jis208) c1 = strtol(p, (char **)&p, 0); c1 = strtol(p, (char **)&p, 0); c2 = strtol(p, (char **)&p, 0); b1 = (c1 >> 8) & 0xff; b2 = (c1) & 0xff; /* compress the code */ b1 = b1 - 0x21; b2 = b2 - 0x21; if (b1 > b1_max) b1_max = b1; if (b2 > b2_max) b2_max = b2; if (b2 > table_b2_max[b1]) table_b2_max[b1] = b2; table[b1 * 94 + b2] = c2; nb++; } printf("/* max row = %d. The following rows are excluded:", b1_max); n = 0; for(i=0;i<=b1_max;i++) { if (table_b2_max[i] == 0) { printf(" %d", i); } else { n++; } } printf(", density=%d%% */\n", nb * 100 / (n * (b2_max + 1))); printf("const unsigned short table_%s[%d] = {\n", name, n * (b2_max + 1)); n = 0; for(i=0;i<=b1_max;i++) { if (table_b2_max[i] != 0) { for(j=0;j<=b2_max;j++) { printf("0x%04x, ", table[i * 94 + j]); if ((n++ & 7) == 7) printf("\n"); } } } if ((n & 7) != 0) printf("\n"); printf("};\n\n"); } int main(int argc, char **argv) { int i; const char *filename, *p; char *q; char name[256]; FILE *f; printf("#include \"qe.h\"\n\n"); for(i=1;i