218 lines
5.2 KiB
C
218 lines
5.2 KiB
C
/* convert unicode cp pages to qe source code */
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <ctype.h>
|
|
|
|
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 < argc; i++) {
|
|
filename = argv[i];
|
|
|
|
p = strrchr(filename, '/');
|
|
if (!p)
|
|
p = filename;
|
|
else
|
|
p++;
|
|
strcpy(name, p);
|
|
q = strrchr(name, '.');
|
|
if (q)
|
|
*q = '\0';
|
|
|
|
f = fopen(filename, "r");
|
|
if (!f) {
|
|
perror(filename);
|
|
exit(1);
|
|
}
|
|
|
|
if (!strcmp(name, "JIS0208"))
|
|
handle_jis(f, 1);
|
|
else if (!strcmp(name, "JIS0212"))
|
|
handle_jis(f, 0);
|
|
else
|
|
handle_cp(f, name);
|
|
|
|
fclose(f);
|
|
}
|
|
return 0;
|
|
}
|