/[qemacs]/qemacs/kmaptoqe.c
ViewVC logotype

Diff of /qemacs/kmaptoqe.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.1.1.1 by bellard, Sat May 29 10:18:13 2004 UTC revision 1.2 by chqrlie, Wed May 11 15:12:14 2005 UTC
# Line 57  void gen_map(void) Line 57  void gen_map(void)
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)
# Line 160  int main(int argc, char **argv) Line 160  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) {
# Line 191  int main(int argc, char **argv) Line 191  int main(int argc, char **argv)
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++;
# Line 203  int main(int argc, char **argv) Line 203  int main(int argc, char **argv)
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 == '=')
# Line 236  int main(int argc, char **argv) Line 236  int main(int argc, char **argv)
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);
# Line 251  int main(int argc, char **argv) Line 251  int main(int argc, char **argv)
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);

Legend:
Removed from v.1.1.1.1  
changed lines
  Added in v.1.2

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26