57 |
int len, c, d, last, delta, k, j; |
int len, c, d, last, delta, k, j; |
58 |
int last_input0; |
int last_input0; |
59 |
|
|
60 |
last = 0; |
last = 0; |
61 |
nb_starts = 0; |
nb_starts = 0; |
62 |
last_input0 = 0; |
last_input0 = 0; |
63 |
offset = 0; |
offset = 0; |
64 |
for(k=0;k<nb_inputs;k++) { |
for (k = 0; k < nb_inputs; k++) { |
65 |
unsigned char *input = inputs[k].input; |
unsigned char *input = inputs[k].input; |
66 |
int first, output; |
int first, output; |
67 |
|
|
68 |
if (gen_table) { |
if (gen_table) { |
69 |
if (last_input0 != inputs[k].input[0]) { |
if (last_input0 != inputs[k].input[0]) { |
70 |
if (last_input0 != 0) |
if (last_input0 != 0) |
71 |
put_byte(0); |
put_byte(0); |
72 |
last_input0 = inputs[k].input[0]; |
last_input0 = inputs[k].input[0]; |
73 |
table_val[nb_starts] = last_input0; |
table_val[nb_starts] = last_input0; |
74 |
table_start[nb_starts++] = offset; |
table_start[nb_starts++] = offset; |
75 |
last = 0; |
last = 0; |
|
} |
|
76 |
} |
} |
77 |
|
} |
78 |
|
|
79 |
len = inputs[k].len; |
len = inputs[k].len; |
80 |
output = inputs[k].output; |
output = inputs[k].output; |
81 |
delta = output - last; |
delta = output - last; |
82 |
last = output; |
last = output; |
83 |
|
|
84 |
#ifdef TEST |
#ifdef TEST |
85 |
/* frequencies */ |
/* frequencies */ |
86 |
if (delta > 30) |
if (delta > 30) |
87 |
delta = 30; |
delta = 30; |
88 |
else if (delta < -1) |
else if (delta < -1) |
89 |
delta = -1; |
delta = -1; |
90 |
freq[delta + 1]++; |
freq[delta + 1]++; |
91 |
#endif |
#endif |
92 |
|
|
93 |
if (is_chinese_cj) { |
if (is_chinese_cj) { |
94 |
assert(input[len-1] == ' '); |
assert(input[len-1] == ' '); |
95 |
len--; |
len--; |
96 |
} |
} |
97 |
|
|
98 |
first = 0; |
first = 0; |
99 |
if (gen_table) |
if (gen_table) |
100 |
first = 1; |
first = 1; |
101 |
|
|
102 |
/* c = 0 : end of table |
/* c = 0 : end of table |
103 |
c = 1..0x1d : delta unicode |
c = 1..0x1d : delta unicode |
104 |
c = 0x1e : unicode char follows. |
c = 0x1e : unicode char follows. |
105 |
c = 0x1f : unicode mapping follows |
c = 0x1f : unicode mapping follows |
106 |
bit 7 : eof and delta == 1 |
bit 7 : eof and delta == 1 |
107 |
*/ |
*/ |
108 |
for(j=first;j<len;j++) { |
for (j = first; j < len; j++) { |
109 |
c = input[j]; |
c = input[j]; |
110 |
d = 0; |
d = 0; |
111 |
if ((j == (len - 1) && delta == 1)) |
if ((j == (len - 1) && delta == 1)) |
112 |
d = 0x80; |
d = 0x80; |
113 |
if (c >= 0x20 && c <= 0x7f) { |
if (c >= 0x20 && c <= 0x7f) { |
114 |
put_byte(c | d); |
put_byte(c | d); |
115 |
} else { |
} else { |
116 |
put_byte(d | 0x1f); |
put_byte(d | 0x1f); |
117 |
put_byte((c >> 8) & 0xff); |
put_byte((c >> 8) & 0xff); |
118 |
put_byte(c & 0xff); |
put_byte(c & 0xff); |
|
} |
|
119 |
} |
} |
120 |
/* XXX: potential problem if first == len. We avoid it |
} |
121 |
by forcing an emission of a unicode char */ |
/* XXX: potential problem if first == len. We avoid it |
122 |
if (first == len) |
by forcing an emission of a unicode char */ |
123 |
delta = 0; |
if (first == len) |
124 |
if (delta != 1) { |
delta = 0; |
125 |
if (delta >= 1 && delta <= 0x1d) { |
if (delta != 1) { |
126 |
put_byte(delta); |
if (delta >= 1 && delta <= 0x1d) { |
127 |
} else { |
put_byte(delta); |
128 |
put_byte(0x1e); |
} else { |
129 |
put_byte((output >> 8) & 0xff); |
put_byte(0x1e); |
130 |
put_byte(output & 0xff); |
put_byte((output >> 8) & 0xff); |
131 |
} |
put_byte(output & 0xff); |
132 |
} |
} |
133 |
} |
} |
134 |
put_byte(0); |
} |
135 |
|
put_byte(0); |
136 |
} |
} |
137 |
|
|
138 |
int main(int argc, char **argv) |
int main(int argc, char **argv) |
160 |
memset(freq, 0, sizeof(freq)); |
memset(freq, 0, sizeof(freq)); |
161 |
|
|
162 |
nb_kmaps = 0; |
nb_kmaps = 0; |
163 |
for(i=2;i<argc;i++) { |
for (i = 2; i < argc; i++) { |
164 |
filename = argv[i]; |
filename = argv[i]; |
165 |
f = fopen(filename, "r"); |
f = fopen(filename, "r"); |
166 |
if (!f) { |
if (!f) { |
191 |
col = 0; |
col = 0; |
192 |
nb_inputs = 0; |
nb_inputs = 0; |
193 |
line_num = 0; |
line_num = 0; |
194 |
for(;;) { |
for (;;) { |
195 |
if (fgets(line, sizeof(line), f) == NULL) |
if (fgets(line, sizeof(line), f) == NULL) |
196 |
break; |
break; |
197 |
line_num++; |
line_num++; |
203 |
continue; |
continue; |
204 |
p++; |
p++; |
205 |
q = inputs[nb_inputs].input; |
q = inputs[nb_inputs].input; |
206 |
for(;;) { |
for (;;) { |
207 |
while (isspace(*p)) |
while (isspace(*p)) |
208 |
p++; |
p++; |
209 |
if (*p == '=') |
if (*p == '=') |
236 |
/* write start map */ |
/* write start map */ |
237 |
put_byte(nb_starts | (is_chinese_cj ? 0x80 : 0)); |
put_byte(nb_starts | (is_chinese_cj ? 0x80 : 0)); |
238 |
if (gen_table) { |
if (gen_table) { |
239 |
for(k=0;k<nb_starts;k++) { |
for (k = 0; k < nb_starts; k++) { |
240 |
j = table_start[k]; |
j = table_start[k]; |
241 |
put_byte(table_val[k]); |
put_byte(table_val[k]); |
242 |
put_byte((j >> 16) & 0xff); |
put_byte((j >> 16) & 0xff); |
251 |
} |
} |
252 |
|
|
253 |
#ifdef TEST |
#ifdef TEST |
254 |
for(k=0;k<32;k++) { |
for (k = 0; k < 32; k++) { |
255 |
fprintf(stderr, "freq[%d] = %d\n", k, freq[k]); |
fprintf(stderr, "freq[%d] = %d\n", k, freq[k]); |
256 |
} |
} |
257 |
#endif |
#endif |
258 |
|
|
259 |
/* write header */ |
/* write header */ |
260 |
size = 4; |
size = 4; |
261 |
for(i=0;i<nb_kmaps;i++) { |
for (i = 0; i < nb_kmaps; i++) { |
262 |
size += strlen(kmap_names[i]) + 1 + 4; |
size += strlen(kmap_names[i]) + 1 + 4; |
263 |
} |
} |
264 |
size += 4; /* last offset at zero */ |
size += 4; /* last offset at zero */ |
265 |
|
|
266 |
fwrite("kmap", 1, 4, outfile); |
fwrite("kmap", 1, 4, outfile); |
267 |
|
|
268 |
for(i=0;i<nb_kmaps;i++) { |
for (i = 0; i < nb_kmaps; i++) { |
269 |
int off; |
int off; |
270 |
off = kmap_offsets[i] + size; |
off = kmap_offsets[i] + size; |
271 |
fputc((off >> 24) & 0xff, outfile); |
fputc((off >> 24) & 0xff, outfile); |