w32tex
About: TeX Live provides a comprehensive TeX system including all the major TeX-related programs, macro packages, and fonts that are free software. Windows sources.
  Fossies Dox: w32tex-src.tar.xz  ("unofficial" and yet experimental doxygen-generated source code documentation)  

write.c
Go to the documentation of this file.
1 #include <kpathsea/config.h>
2 #include "makejvf.h"
3 #include "uniblock.h"
4 #include "usrtable.h"
5 
6 #include <stdio.h>
7 #include <stdlib.h>
8 
9 int pstfm_codes[256];
10 
11 FILE *vfopen(char *name)
12 {
13  FILE *fp;
14  int fidshift=0;
15 
16  if (fidzero) fidshift=-1;
17  fp = fopen(name,"wb");
18  if (fp == NULL) {
19  fprintf(stderr,"I cannot create VF file, %s.",name);
20  exit(100);
21  }
22 
23  fputc(247,fp); /* PRE */
24  fputc(202,fp); /* ID */
25  fputc(0,fp); /* comment size */
26  fputnum(0,4,fp); /* TFM check sum */
27  fputnum(10*(1<<20),4,fp); /* TFM design size */
28 
29  fputc(243,fp); /* fnt_def1 */
30  fputc(1+fidshift,fp); /* Font ID */
31  fputnum(0,4,fp); /* TFM check sum */
32  if (chotai)
33  fputnum(zh,4,fp); /* font design size (scaled) */
34  else
35  fputnum(zw,4,fp); /* font design size (scaled) */
36  fputnum(10*(1<<20),4,fp); /* font design size */
37  fputc(0,fp); /* directory length */
38  fputc(strlen(vtfmname),fp); /* fontname length */
39  fputstr(vtfmname,strlen(vtfmname),fp); /* directory + fontname */
40 
41  if (kanatfm) {
42  fputc(243,fp); /* fnt_def1 */
43  fputc(2+fidshift,fp); /* Font ID */
44  fputnum(0,4,fp); /* TFM check sum */
45  if (chotai)
46  fputnum(zh,4,fp); /* font design size (scaled) */
47  else
48  fputnum(zw,4,fp); /* font design size (scaled) */
49  fputnum(10*(1<<20),4,fp); /* font design size */
50  fputc(0,fp); /* directory length */
51  fputc(strlen(kanatfm),fp); /* fontname length */
52  fputstr(kanatfm,strlen(kanatfm),fp); /* directory + fontname */
53  }
54 
55  if (ucsqtfm) {
56  fputc(243,fp); /* fnt_def1 */
57  fputc(3+fidshift,fp); /* Font ID */
58  fputnum(0,4,fp); /* TFM check sum */
59  if (chotai)
60  fputnum(zh,4,fp); /* font design size (scaled) */
61  else
62  fputnum(zw,4,fp); /* font design size (scaled) */
63  fputnum(10*(1<<20),4,fp); /* font design size */
64  fputc(0,fp); /* directory length */
65  fputc(strlen(ucsqtfm),fp); /* fontname length */
66  fputstr(ucsqtfm,strlen(ucsqtfm),fp); /* directory + fontname */
67  }
68  else if (jistfm) {
69  fputc(243,fp); /* fnt_def1 */
70  fputc(3+fidshift,fp); /* Font ID */
71  fputnum(0,4,fp); /* TFM check sum */
72  if (chotai)
73  fputnum(zh,4,fp); /* font design size (scaled) */
74  else
75  fputnum(zw,4,fp); /* font design size (scaled) */
76  fputnum(10*(1<<20),4,fp); /* font design size */
77  fputc(0,fp); /* directory length */
78  fputc(strlen(jistfm),fp); /* fontname length */
79  fputstr(jistfm,strlen(jistfm),fp); /* directory + fontname */
80  }
81 
82  return fp;
83 }
84 
85 void writevf(int code, FILE *fp)
86 {
87  int cc,cc2,cc3,cc4,w,skip=0,skip2=0,height=1000;
88  char buf[256],buf2[256];
89  int fidshift=0,l;
90  int outcode=code;
91 
92  if (fidzero) fidshift=-1;
93 
94  w = jfmread(code); /* rightamount is also obtained */
95 
96  skip2=baseshift;
97  switch (code) {
98  case 0x2146: /* ‘ */
99  case 0x2148: /* “ */
100  if (jfm_id == 9 && minute) { /* 縦書き時はミニュートへ変換 */
101  if (afp) {
102  if (code == 0x2146)
103  sprintf(buf2,"CH <216C>");
104  else
105  sprintf(buf2,"CH <216D>");
106  rewind(afp);
107  while (fgets(buf,255,afp)!=NULL) {
108  if (jfm_id==9 && !strncmp(buf,"FontBBox ",9)) {
109  sscanf(&buf[9],"%d %d %d %d",&cc,&cc2,&cc3,&cc4);
110  height=cc4;
111  }
112  if (!strncmp(buf,buf2,strlen(buf2))) {
113  sscanf(&buf[14],"%d %d %d %d",&cc,&cc2,&cc3,&cc4);
114  skip=(int)(w+((double)(cc2-height)/1000.0-0.05)*zw);
115  break;
116  }
117  }
118  }
119  else
120  skip=(int)((0.1)*zw);
121  if (code == 0x2146) {
122  skip2+=-(int)((0.65)*zh);
123  }
124  else {
125  skip2+=-(int)(zh*3/5.0); /* skip2+=-(int)((0.6)*zh); */
126  }
127 
128  fputc(242,fp); /* long_char */
129  if (kanatfm)
130  cc=4;
131  else
132  cc=3;
133  if (skip)
134  cc+=numcount(skip)+1;
135  if (skip2)
136  cc+=numcount(skip2)+1;
137  fputnum(cc,4,fp);
138  fputnum(code,4,fp); /* char code */
139  fputnum(w,4,fp); /* char width */
140  if (skip) {
141  fputc(143+numcount(skip)-1,fp); /* RIGHT */
142  fputnum2(skip,fp);
143  }
144  if (skip2) {
145  fputc(157+numcount(skip2)-1,fp); /* DOWN */
146  fputnum2(skip2,fp);
147  }
148  if (kanatfm) fputc(173+fidshift,fp); /* FONT_NUM_2 */
149  fputc(129,fp); /* SET2 */
150  if (code == 0x2146)
151  fputnum(0x216c,2,fp); /* char code */
152  else
153  fputnum(0x216d,2,fp); /* char code */
154  return;
155  }
156  case 0x214a: /* ( */
157  case 0x214c: /* 〔 */
158  case 0x214e: /* [ */
159  case 0x2150: /* { */
160  case 0x2152: /* 〈 */
161  case 0x2154: /* 《 */
162  case 0x2156: /* 「 */
163  case 0x2158: /* 『 */
164  case 0x215a: /* 【 */
165  skip = -(zw-w);
166  break;
167  case 0x2147: /* ’ */
168  case 0x2149: /* ” */
169  if (jfm_id == 9 && minute) { /* 縦書き時はミニュートへ変換 */
170  if (afp) {
171  if (code == 0x2147)
172  sprintf(buf2,"CH <216C>");
173  else
174  sprintf(buf2,"CH <216D>");
175  rewind(afp);
176  while (fgets(buf,255,afp)!=NULL) {
177  if (jfm_id==9 && !strncmp(buf,"FontBBox ",9)) {
178  sscanf(&buf[9],"%d %d %d %d",&cc,&cc2,&cc3,&cc4);
179  height=cc4;
180  }
181  if (!strncmp(buf,buf2,strlen(buf2))) {
182  sscanf(&buf[14],"%d %d %d %d",&cc,&cc2,&cc3,&cc4);
183  skip=(int)(((double)(height-cc2)/1000.0+0.05)*zw);
184  break;
185  }
186  }
187  }
188  else
189  skip=(int)((0.4)*zw);
190  if (code == 0x2147) {
191  skip2+=(int)((0.65)*zh);
192  }
193  else {
194  skip2+=(int)(zh*3/5.0); /* skip2+=(int)((0.6)*zh); */
195  }
196 
197  fputc(242,fp); /* long_char */
198  if (kanatfm)
199  cc=4;
200  else
201  cc=3;
202  if (skip)
203  cc+=numcount(skip)+1;
204  if (skip2)
205  cc+=numcount(skip2)+1;
206  fputnum(cc+2+88+2+32,4,fp);
207  fputnum(code,4,fp); /* char code */
208  fputnum(w,4,fp); /* char width */
209  if (skip) {
210  fputc(143+numcount(skip)-1,fp); /* RIGHT */
211  fputnum2(skip,fp);
212  }
213  if (skip2) {
214  fputc(157+numcount(skip2)-1,fp); /* DOWN */
215  fputnum2(skip2,fp);
216  }
217  fputc(239,fp); /* XXX1 */
218  fputc(88,fp);
219  fputs("ps: gsave currentpoint currentpoint translate 180 neg rotate neg exch neg exch translate",fp);
220  if (kanatfm) fputc(173+fidshift,fp); /* FONT_NUM_2 */
221  fputc(129,fp); /* SET2 */
222  if (code == 0x2147)
223  fputnum(0x216c,2,fp); /* char code */
224  else
225  fputnum(0x216d,2,fp); /* char code */
226  fputc(239,fp); /* XXX1 */
227  fputc(32,fp);
228  fputs("ps: currentpoint grestore moveto",fp);
229  return;
230  }
231  case 0x2121: /* spc */
232  case 0x2122: /* 、 */
233  case 0x2123: /* 。 */
234  case 0x2124: /* , */
235  case 0x2125: /* . */
236  case 0x212b: /* ゛ */
237  case 0x212c: /* ゜ */
238  case 0x214b: /* ) */
239  case 0x214d: /* 〕 */
240  case 0x214f: /* ] */
241  case 0x2151: /* } */
242  case 0x2153: /* 〉 */
243  case 0x2155: /* 》 */
244  case 0x2157: /* 」 */
245  case 0x2159: /* 』 */
246  case 0x215b: /* 】 */
247  case 0x216b: /* ° */
248  case 0x216c: /* ′ */
249  case 0x216d: /* ″ */
250  break;
251  default:
252  if (w != zw) {
253  if (((code >= 0x2421 && code <= 0x2576) || code == 0x213c ) && kanatume>=0) {
254  sprintf(buf2,"CH <%X>",code);
255  rewind(afp);
256  while (fgets(buf,255,afp)!=NULL) {
257  if (jfm_id==9 && !strncmp(buf,"FontBBox ",9)) {
258  sscanf(&buf[9],"%d %d %d %d",&cc,&cc2,&cc3,&cc4);
259  height=cc4;
260  }
261  if (!strncmp(buf,buf2,strlen(buf2))) {
262  sscanf(&buf[14],"%d %d %d %d",&cc,&cc2,&cc3,&cc4);
263  if (jfm_id==9) {
264  switch (code) {
265  case 0x2421:
266  case 0x2423:
267  case 0x2425:
268  case 0x2427:
269  case 0x2429:
270  case 0x2443:
271  case 0x2463:
272  case 0x2465:
273  case 0x2467:
274  case 0x246e:
275  case 0x2521:
276  case 0x2523:
277  case 0x2525:
278  case 0x2527:
279  case 0x2529:
280  case 0x2543:
281  case 0x2563:
282  case 0x2565:
283  case 0x2567:
284  case 0x256e:
285  case 0x2575:
286  case 0x2576:
287  skip=-(int)(((double)(1000-(cc4-cc2)-kanatume*2)/2/1000.0)*zw);
288  break;
289  case 0x213c:
290  skip=-(int)((double)(cc-kanatume)/1000.0*zw);
291  break;
292  default:
293  skip=-(int)(((double)(height-cc4-kanatume)/1000.0)*zw);
294  break;
295  }
296  }
297  else {
298  skip=-(int)(((double)(cc-kanatume)/1000.0)*zw);
299  }
300  break;
301  }
302  }
303  }
304  else {
305  skip = -(zw-w)/2;
306  }
307  }
308  else {
309  if (omitzw) { /* Omit entries in VF for characters with default ZW metric */
310  if (!kanatfm || code > 0x2576)
311  return;
312  }
313  }
314  break;
315  }
316 
317  fputc(242,fp); /* long_char */
318 
319  for (l = 0; l < usertable_replace_max; l++) {
320  if (code == usertable_replace[l].codepoint) {
321  outcode = usertable_replace[l].newcodepoint;
322  break;
323  }
324  }
325  for (l = 0; l < usertable_move_max; l++) {
326  if (code == usertable_move[l].codepoint) {
328  skip2 = usertable_move[l].movedown * zh;
329  goto outputj;
330  }
331  }
332  if (enhanced) {
333 #ifdef DEBUG
334  if (skip != -rightamount) {
335  fprintf(stderr,
336  "[DEBUG] Conflicting MOVERIGHT value for code %x,\n"
337  "[DEBUG] makejvf default: %08x\n"
338  "[DEBUG] suggested from JFM: %08x <= I'll use this ...\n",
339  code, skip, -rightamount);
340  }
341 #endif
342  skip=-rightamount;
343  }
344 
345 outputj:
346  if (kanatfm)
347  cc=4;
348  else
349  cc=3;
350  if (skip)
351  cc+=numcount(skip)+1;
352  if (skip2)
353  cc+=numcount(skip2)+1;
354  fputnum(cc,4,fp);
355  fputnum(code,4,fp); /* char code */
356  fputnum(w,4,fp); /* char width */
357  if (skip) {
358  fputc(143+numcount(skip)-1,fp); /* RIGHT */
359  fputnum2(skip,fp);
360  }
361  if (skip2) {
362  fputc(157+numcount(skip2)-1,fp); /* DOWN */
363  fputnum2(skip2,fp);
364  }
365  if (kanatfm) {
366  if (code <= 0x2576)
367  fputc(173+fidshift,fp); /* FONT_NUM_2 */
368  else
369  fputc(172+fidshift,fp); /* FONT_NUM_1 */
370  }
371  fputc(129,fp); /* SET2 */
372  fputnum(outcode,2,fp); /* char code */
373 }
374 
375 void writevfu(int code, FILE *fp)
376 {
377  int cc,cc2,cc3,cc4,w,skip=0,skip2=0,height=1000;
378  char buf[256],buf2[256];
379  int fidshift=0,l;
380  int outcode=code;
381 
382  if (fidzero) fidshift=-1;
383 
384  w = jfmread(code); /* rightamount is also obtained */
385 
386  skip2=baseshift;
387  switch (code) {
388  case 0x2018: /* ‘ */
389  case 0x201c: /* “ */
390  if (jfm_id == 9 && minute) { /* 縦書き時はミニュートへ変換 */
391  if (afp) {
392  if (code == 0x2018)
393  sprintf(buf2,"CH <2032>");
394  else
395  sprintf(buf2,"CH <2033>");
396  rewind(afp);
397  while (fgets(buf,255,afp)!=NULL) {
398  if (jfm_id==9 && !strncmp(buf,"FontBBox ",9)) {
399  sscanf(&buf[9],"%d %d %d %d",&cc,&cc2,&cc3,&cc4);
400  height=cc4;
401  }
402  if (!strncmp(buf,buf2,strlen(buf2))) {
403  sscanf(&buf[14],"%d %d %d %d",&cc,&cc2,&cc3,&cc4);
404  skip=(int)(w+((double)(cc2-height)/1000.0-0.05)*zw);
405  break;
406  }
407  }
408  }
409  else
410  skip = -(zw-w); /* changed */
411  /* no correction needed for skip2 */
412 
413  fputc(242,fp); /* long_char */
414  if (kanatfm)
415  cc=4;
416  else
417  cc=3;
418  if (skip)
419  cc+=numcount(skip)+1;
420  if (skip2)
421  cc+=numcount(skip2)+1;
422  fputnum(cc,4,fp);
423  fputnum(code,4,fp); /* char code */
424  fputnum(w,4,fp); /* char width */
425  if (skip) {
426  fputc(143+numcount(skip)-1,fp); /* RIGHT */
427  fputnum2(skip,fp);
428  }
429  if (skip2) {
430  fputc(157+numcount(skip2)-1,fp); /* DOWN */
431  fputnum2(skip2,fp);
432  }
433  if (kanatfm) fputc(173+fidshift,fp); /* FONT_NUM_2 */
434  fputc(129,fp); /* SET2 */
435  if (code == 0x2018)
436  fputnum(0x2032,2,fp); /* char code */
437  else
438  fputnum(0x2033,2,fp); /* char code */
439  return;
440  }
441  else if (ucsqtfm) { /* UniJIS-UCS2-H系へ変換 */
442  fputc(242,fp); /* long_char */
443  cc=4;
444  skip = -(zw-w);
445  if (skip)
446  cc+=numcount(skip)+1;
447  if (skip2)
448  cc+=numcount(skip2)+1;
449  fputnum(cc,4,fp);
450  fputnum(code,4,fp); /* char code */
451  fputnum(w,4,fp); /* char width */
452  if (skip) {
453  fputc(143+numcount(skip)-1,fp); /* RIGHT */
454  fputnum2(skip,fp);
455  }
456  if (skip2) {
457  fputc(157+numcount(skip2)-1,fp); /* DOWN */
458  fputnum2(skip2,fp);
459  }
460  fputc(174+fidshift,fp); /* FONT_NUM_3 */
461  fputc(129,fp); /* SET2 */
462  fputnum(code,2,fp); /* char code */
463  return;
464  }
465  else if (jfm_id == 11 && jistfm) { /* 横書き時はJIS系へ変換 */
466  /* UCS U+2018 → JIS 0x2146, UCS U+201C → JIS 0x2148 */
467  fputc(242,fp); /* long_char */
468  cc=4;
469  skip = -(zw-w);
470  if (skip)
471  cc+=numcount(skip)+1;
472  if (skip2)
473  cc+=numcount(skip2)+1;
474  fputnum(cc,4,fp);
475  fputnum(code,4,fp); /* char code */
476  fputnum(w,4,fp); /* char width */
477  if (skip) {
478  fputc(143+numcount(skip)-1,fp); /* RIGHT */
479  fputnum2(skip,fp);
480  }
481  if (skip2) {
482  fputc(157+numcount(skip2)-1,fp); /* DOWN */
483  fputnum2(skip2,fp);
484  }
485  fputc(174+fidshift,fp); /* FONT_NUM_3 */
486  fputc(129,fp); /* SET2 */
487  if (code == 0x2018)
488  fputnum(0x2146,2,fp); /* char code */
489  else
490  fputnum(0x2148,2,fp); /* char code */
491  return;
492  }
493  case 0xFF08: /* ( */
494  case 0x3014: /* 〔 */
495  case 0xFF3B: /* [ */
496  case 0xFF5B: /* { */
497  case 0x3008: /* 〈 */
498  case 0x300A: /* 《 */
499  case 0x300C: /* 「 */
500  case 0x300E: /* 『 */
501  case 0x3010: /* 【 */
502  case 0xFF5F: /* JIS X 0213 1-02-54 始め二重パーレン */
503  case 0x3018: /* JIS X 0213 1-02-56 始め二重亀甲括弧 */
504  case 0x3016: /* JIS X 0213 1-02-58 始めすみ付き括弧(白) */
505  case 0x00AB: /* JIS X 0213 1-09-08 始め二重山括弧引用記号/始めギュメ */
506  case 0x301D: /* JIS X 0213 1-13-64 始めダブルミニュート */
507  case 0x2329: /* LEFT-POINTING ANGLE BRACKET */
508  case 0x301A: /* LEFT WHITE SQUARE BRACKET */
509  case 0xFE59: /* SMALL LEFT PARENTHESIS */
510  case 0xFE5B: /* SMALL LEFT CURLY BRACKET */
511  case 0xFE5D: /* SMALL LEFT TORTOISE SHELL BRACKET */
512  if (ucs != ENTRY_JQ)
513  skip = -(zw-w);
514  break;
515  case 0x2019: /* ’ */
516  case 0x201d: /* ” */
517  if (jfm_id == 9 && minute) { /* 縦書き時はミニュートへ変換 */
518  if (afp) {
519  if (code == 0x2019)
520  sprintf(buf2,"CH <2032>");
521  else
522  sprintf(buf2,"CH <2033>");
523  rewind(afp);
524  while (fgets(buf,255,afp)!=NULL) {
525  if (jfm_id==9 && !strncmp(buf,"FontBBox ",9)) {
526  sscanf(&buf[9],"%d %d %d %d",&cc,&cc2,&cc3,&cc4);
527  height=cc4;
528  }
529  if (!strncmp(buf,buf2,strlen(buf2))) {
530  sscanf(&buf[14],"%d %d %d %d",&cc,&cc2,&cc3,&cc4);
531  skip=(int)(((double)(height-cc2)/1000.0+0.05)*zw);
532  break;
533  }
534  }
535  }
536  else
537  skip = zw; /* changed */
538  /* no correction needed for skip2 */
539 
540  fputc(242,fp); /* long_char */
541  if (kanatfm)
542  cc=4;
543  else
544  cc=3;
545  if (skip)
546  cc+=numcount(skip)+1;
547  if (skip2)
548  cc+=numcount(skip2)+1;
549  fputnum(cc+2+88+2+32,4,fp);
550  fputnum(code,4,fp); /* char code */
551  fputnum(w,4,fp); /* char width */
552  if (skip) {
553  fputc(143+numcount(skip)-1,fp); /* RIGHT */
554  fputnum2(skip,fp);
555  }
556  if (skip2) {
557  fputc(157+numcount(skip2)-1,fp); /* DOWN */
558  fputnum2(skip2,fp);
559  }
560  fputc(239,fp); /* XXX1 */
561  fputc(88,fp);
562  fputs("ps: gsave currentpoint currentpoint translate 180 neg rotate neg exch neg exch translate",fp);
563  if (kanatfm) fputc(173+fidshift,fp); /* FONT_NUM_2 */
564  fputc(129,fp); /* SET2 */
565  if (code == 0x2019)
566  fputnum(0x2032,2,fp); /* char code */
567  else
568  fputnum(0x2033,2,fp); /* char code */
569  fputc(239,fp); /* XXX1 */
570  fputc(32,fp);
571  fputs("ps: currentpoint grestore moveto",fp);
572  return;
573  }
574  else if (ucsqtfm) { /* UniJIS-UCS2-H系へ変換 */
575  fputc(242,fp); /* long_char */
576  cc=4;
577  if (skip2)
578  cc+=numcount(skip2)+1;
579  fputnum(cc,4,fp);
580  fputnum(code,4,fp); /* char code */
581  fputnum(w,4,fp); /* char width */
582  if (skip2) {
583  fputc(157+numcount(skip2)-1,fp); /* DOWN */
584  fputnum2(skip2,fp);
585  }
586  fputc(174+fidshift,fp); /* FONT_NUM_3 */
587  fputc(129,fp); /* SET2 */
588  fputnum(code,2,fp); /* char code */
589  return;
590  }
591  else if (jfm_id == 11 && jistfm) { /* 横書き時はJIS系へ変換 */
592  /* UCS U+2019 → JIS 0x2147, UCS U+201D → JIS 0x2149 */
593  fputc(242,fp); /* long_char */
594  cc=4;
595  if (skip2)
596  cc+=numcount(skip2)+1;
597  fputnum(cc,4,fp);
598  fputnum(code,4,fp); /* char code */
599  fputnum(w,4,fp); /* char width */
600  if (skip2) {
601  fputc(157+numcount(skip2)-1,fp); /* DOWN */
602  fputnum2(skip2,fp);
603  }
604  fputc(174+fidshift,fp); /* FONT_NUM_3 */
605  fputc(129,fp); /* SET2 */
606  if (code == 0x2019)
607  fputnum(0x2147,2,fp); /* char code */
608  else
609  fputnum(0x2149,2,fp); /* char code */
610  return;
611  }
612  case 0x3000: /* spc */
613  case 0x3001: /* 、 */
614  case 0x3002: /* 。 */
615  case 0xFF0C: /* , */
616  case 0xFF0E: /* . */
617  case 0x309B: /* ゛ */
618  case 0x309C: /* ゜ */
619  case 0xFF09: /* ) */
620  case 0x3015: /* 〕 */
621  case 0xFF3D: /* ] */
622  case 0xFF5D: /* } */
623  case 0x3009: /* 〉 */
624  case 0x300B: /* 》 */
625  case 0x300D: /* 」 */
626  case 0x300F: /* 』 */
627  case 0x3011: /* 】 */
628  case 0xFF60: /* JIS X 0213 1-02-55 終わり二重パーレン */
629  case 0x3019: /* JIS X 0213 1-02-57 終わり二重亀甲括弧 */
630  case 0x3017: /* JIS X 0213 1-02-59 終わりすみ付き括弧(白) */
631  case 0x00BB: /* JIS X 0213 1-09-18 終わり二重山括弧引用記号/終わりギュメ */
632  case 0x301F: /* JIS X 0213 1-13-65 終わりダブルミニュート */
633  case 0x301E: /* --- - ---- ------- 上付き終わりダブルミニュート */
634  case 0x232A: /* RIGHT-POINTING ANGLE BRACKET */
635  case 0x301B: /* RIGHT WHITE SQUARE BRACKET */
636  case 0xFE5A: /* SMALL RIGHT PARENTHESIS */
637  case 0xFE5C: /* SMALL RIGHT CURLY BRACKET */
638  case 0xFE5E: /* SMALL RIGHT TORTOISE SHELL BRACKET */
639  case 0x00B0: /* ° */
640  case 0x2032: /* ′ */
641  case 0x2033: /* ″ */
642  break;
643  default:
644  if (w != zw) {
645  if ((code >= 0xFF61 && code <= 0xFFDC) || (code >= 0xFFE8 && code <= 0xFFEE)) {
646  if (jfm_id == 11 && hankana) { /* 半角片仮名など、横書き時 */
648  pstfm_nt+=1;
649  rightamount=0; /* discard jfmread() result */
650  break;
651  }
652  }
653  if (!uniblock_iskanji && kanatume>=0) {
654  sprintf(buf2,"CH <%X>",code);
655  rewind(afp);
656  while (fgets(buf,255,afp)!=NULL) {
657  if (jfm_id==9 && !strncmp(buf,"FontBBox ",9)) {
658  sscanf(&buf[9],"%d %d %d %d",&cc,&cc2,&cc3,&cc4);
659  height=cc4;
660  }
661  if (!strncmp(buf,buf2,strlen(buf2))) {
662  sscanf(&buf[14],"%d %d %d %d",&cc,&cc2,&cc3,&cc4);
663  if (jfm_id==9) {
664  switch (code) {
665  case 0x3041:
666  case 0x3043:
667  case 0x3045:
668  case 0x3047:
669  case 0x3049:
670  case 0x3063:
671  case 0x3083:
672  case 0x3085:
673  case 0x3087:
674  case 0x308E:
675  case 0x30A1:
676  case 0x30A3:
677  case 0x30A5:
678  case 0x30A7:
679  case 0x30A9:
680  case 0x30C3:
681  case 0x30E3:
682  case 0x30E5:
683  case 0x30E7:
684  case 0x30EE:
685  case 0x30F5:
686  case 0x30F6:
687  case 0x3095: /* JIS X 0213 1-04-85 小書き平仮名か */
688  case 0x3096: /* JIS X 0213 1-04-86 小書き平仮名け */
689  case 0x31F0: /* JIS X 0213 1-06-78 小書き片仮名ク */
690  case 0x31F1: /* JIS X 0213 1-06-79 小書き片仮名シ */
691  case 0x31F2: /* JIS X 0213 1-06-80 小書き片仮名ス */
692  case 0x31F3: /* JIS X 0213 1-06-81 小書き片仮名ト */
693  case 0x31F4: /* JIS X 0213 1-06-82 小書き片仮名ヌ */
694  case 0x31F5: /* JIS X 0213 1-06-83 小書き片仮名ハ */
695  case 0x31F6: /* JIS X 0213 1-06-84 小書き片仮名ヒ */
696  case 0x31F7: /* JIS X 0213 1-06-85 小書き片仮名フ */
697  case 0x31F8: /* JIS X 0213 1-06-86 小書き片仮名ヘ */
698  case 0x31F9: /* JIS X 0213 1-06-87 小書き片仮名ホ */
699  case 0x31FA: /* JIS X 0213 1-06-89 小書き片仮名ム */
700  case 0x31FB: /* JIS X 0213 1-06-90 小書き片仮名ラ */
701  case 0x31FC: /* JIS X 0213 1-06-91 小書き片仮名リ */
702  case 0x31FD: /* JIS X 0213 1-06-92 小書き片仮名ル */
703  case 0x31FE: /* JIS X 0213 1-06-93 小書き片仮名レ */
704  case 0x31FF: /* JIS X 0213 1-06-94 小書き片仮名ロ */
705  skip=-(int)(((double)(1000-(cc4-cc2)-kanatume*2)/2/1000.0)*zw);
706  break;
707  case 0x30FC:
708  skip=-(int)((double)(cc-kanatume)/1000.0*zw);
709  break;
710  default:
711  skip=-(int)(((double)(height-cc4-kanatume)/1000.0)*zw);
712  break;
713  }
714  }
715  else {
716  skip=-(int)(((double)(cc-kanatume)/1000.0)*zw);
717  }
718  break;
719  }
720  }
721  }
722  else {
723  skip = -(zw-w)/2;
724  }
725  }
726  else {
727  if (omitzw) { /* Omit entries in VF for characters with default ZW metric */
728  if (!kanatfm || uniblock_iskanji)
729  return;
730  }
731  }
732  break;
733  }
734 
735  fputc(242,fp); /* long_char */
736 
737  for (l = 0; l < usertable_replace_max; l++) {
738  if (code == usertable_replace[l].codepoint) {
739  outcode = usertable_replace[l].newcodepoint;
740  break;
741  }
742  }
743  for (l = 0; l < usertable_move_max; l++) {
744  if (code == usertable_move[l].codepoint) {
746  skip2 = usertable_move[l].movedown * zh;
747  goto outputu;
748  }
749  }
750  if (enhanced) {
751 #ifdef DEBUG
752  if (skip != -rightamount) {
753  fprintf(stderr,
754  "[DEBUG] Conflicting MOVERIGHT value for code %x,\n"
755  "[DEBUG] makejvf default: %08x\n"
756  "[DEBUG] suggested from JFM: %08x <= I'll use this ...\n",
757  code, skip, -rightamount);
758  }
759 #endif
760  skip=-rightamount;
761  }
762 
763 outputu:
764  if (kanatfm)
765  cc=4;
766  else
767  cc=3;
768  if (outcode>=0x10000)
769  cc+=1;
770  if (skip)
771  cc+=numcount(skip)+1;
772  if (skip2)
773  cc+=numcount(skip2)+1;
774  fputnum(cc,4,fp);
775  fputnum(code,4,fp); /* char code */
776  fputnum(w,4,fp); /* char width */
777  if (skip) {
778  fputc(143+numcount(skip)-1,fp); /* RIGHT */
779  fputnum2(skip,fp);
780  }
781  if (skip2) {
782  fputc(157+numcount(skip2)-1,fp); /* DOWN */
783  fputnum2(skip2,fp);
784  }
785  if (kanatfm) {
786  if (!uniblock_iskanji)
787  fputc(173+fidshift,fp); /* FONT_NUM_2 */
788  else
789  fputc(172+fidshift,fp); /* FONT_NUM_1 */
790  }
791  if (outcode>=0x10000) {
792  fputc(130,fp); /* SET3 */
793  fputnum(outcode,3,fp); /* char code */
794  } else {
795  fputc(129,fp); /* SET2 */
796  fputnum(outcode,2,fp); /* char code */
797  }
798 }
799 
801 {
802  int i,cc;
803 
804  cc = ftell(fp);
805  for (i = 0 ; i < 4-(cc%4) ; i++) {
806  fputc(248,fp); /* POST */
807  }
808  fclose(fp);
809 }
810 
811 void maketfm(char *name)
812 {
813  char nbuf[256];
814  FILE *fp;
815  int i;
816 
817  if (strlen(name) >= 252) { /* <buffer size> - ".tfm" */
818  fprintf(stderr,"Too long output file name.\n");
819  exit(1);
820  }
821  strcpy(nbuf,name);
822  strcat(nbuf,".tfm");
823  fp = fopen(nbuf,"wb");
824  if (fp == NULL) {
825  fprintf(stderr,"I cannot create TFM file, %s.",name);
826  exit(100);
827  }
828 
829  fputnum(jfm_id,2,fp); /* JFM ID */
830  fputnum(pstfm_nt,2,fp); /* number of char type */
831  if (pstfm_nt>1)
832  fputnum(27+pstfm_nt+1,2,fp); /* file words */
833  else
834  fputnum(27,2,fp); /* file words */
835  fputnum(2,2,fp); /* header words */
836  if (pstfm_nt>1) {
837  fputnum(0,2,fp); /* min of char type */
838  fputnum(1,2,fp); /* max of char type */
839  fputnum(3,2,fp); /* width words */
840  }
841  else {
842  fputnum(0,2,fp); /* min of char type */
843  fputnum(0,2,fp); /* max of char type */
844  fputnum(2,2,fp); /* width words */
845  }
846  fputnum(2,2,fp); /* height words */
847  fputnum(2,2,fp); /* depth words */
848  fputnum(1,2,fp); /* italic words */
849  fputnum(0,2,fp); /* glue/kern words */
850  fputnum(0,2,fp); /* kern words */
851  fputnum(0,2,fp); /* glue words */
852  fputnum(9,2,fp); /* param words */
853 
854  fputnum(0,4,fp); /* check sum */
855  fputnum(10*(1<<20),4,fp); /* design size */
856 
857  fputnum(0,2,fp); /* char code */
858  fputnum(0,2,fp); /* char type */
859  for (i=0;i<pstfm_nt-1;i++) {
860  fputnum(pstfm_codes[i],2,fp); /* char code */
861  fputnum(1,2,fp); /* char type */
862  }
863 
864  if (pstfm_nt>1)
865  fputnum((2<<24)+(1<<20)+(1<<16),4,fp); /* char info */
866  fputnum((1<<24)+(1<<20)+(1<<16),4,fp); /* char info */
867  fputnum(0,4,fp); /* width */
868  if (pstfm_nt>1)
869  fputnum(1<<19,4,fp); /* width, hankaku-kana */
870  fputnum(1<<20,4,fp); /* width, others */
871  if (jfm_id == 11) {
872  fputnum(0,4,fp); /* height */
873  fputnum((int)((1<<20)*0.9),4,fp); /* height */
874  fputnum(0,4,fp); /* depth */
875  fputnum((1<<20)-(int)((1<<20)*0.9),4,fp); /* depth */
876  }
877  else {
878  fputnum(0,4,fp); /* height */
879  fputnum(1<<19,4,fp); /* height */
880  fputnum(0,4,fp); /* depth */
881  fputnum(1<<19,4,fp); /* depth */
882  }
883  fputnum(0,4,fp); /* italic */
884 
885  fputnum(0,4,fp); /* tan */
886  fputnum(0,4,fp); /* kanjiskip */
887  fputnum(0,4,fp); /* +kanjiskip */
888  fputnum(0,4,fp); /* -kanjiskip */
889  fputnum(1<<20,4,fp); /* zh */
890  fputnum(1<<20,4,fp); /* zw */
891  fputnum(0,4,fp); /* xkanjiskip */
892  fputnum(0,4,fp); /* +xkanjiskip */
893  fputnum(0,4,fp); /* -xkanjiskip */
894 
895  fclose(fp);
896 }
int code
Definition: aftopl.c:52
#define name
#define height(a)
Definition: aptex-macros.h:200
int w
Definition: dviconv.c:26
#define fopen
Definition: xxstdio.h:21
#define fgets
Definition: xxstdio.h:29
#define ftell
Definition: xxstdio.h:31
#define skip(p, c)
Definition: ptexmac.h:70
int sscanf()
char * strcpy()
static char nbuf[100]
Definition: hpcdtoppm.c:135
#define NULL
Definition: ftobjs.h:61
small capitals from c petite p scientific i
Definition: afcover.h:80
void exit()
#define buf
#define fclose
Definition: debug.h:100
void vfclose(FILE *fp)
Definition: write.c:800
FILE * vfopen(char *name)
Definition: write.c:11
void writevfu(int code, FILE *fp)
Definition: write.c:375
void writevf(int code, FILE *fp)
Definition: write.c:85
void maketfm(char *name)
Definition: write.c:811
int pstfm_codes[256]
Definition: write.c:9
#define fputs
Definition: mendex.h:67
#define fprintf
Definition: mendex.h:64
int strncmp()
#define sprintf
Definition: snprintf.c:44
int enhanced
Definition: main-euc.c:14
int hankana
Definition: main-euc.c:14
int chotai
Definition: main-euc.c:14
FILE * afp
Definition: main-euc.c:12
int fidzero
Definition: main-euc.c:14
char * ucsqtfm
Definition: main-euc.c:13
int minute
Definition: main-euc.c:14
long ucs
Definition: main-euc.c:16
int baseshift
Definition: main-euc.c:14
char * vtfmname
Definition: main-euc.c:13
int kanatume
Definition: main-euc.c:14
int omitzw
Definition: main-euc.c:14
char * jistfm
Definition: main-euc.c:13
int pstfm_nt
Definition: main-euc.c:15
char * kanatfm
Definition: main-euc.c:13
int rightamount
Definition: makejvf.h:2
int jfmread(int kcode)
Definition: tfmread.c:12
int fputnum2(int num, FILE *fp)
Definition: tool.c:247
int zh
Definition: makejvf.h:2
int jfm_id
Definition: makejvf.h:2
int numcount(int num)
Definition: tool.c:215
int zw
Definition: makejvf.h:2
int fputnum(int num, int byte, FILE *fp)
Definition: tool.c:186
int fputstr(char *str, int byte, FILE *fp)
Definition: tool.c:253
#define fp
static int codepoint(lua_State *L)
Definition: lutf8lib.c:100
double moveright
Definition: usrtable.h:13
double movedown
Definition: usrtable.h:14
Definition: inftrees.h:24
#define FILE
Definition: t1stdio.h:34
*job_name strlen((char *) job_name) - 4)
return() int(((double) *(font_tbl[cur_fnt].wtbl+(int)(*(font_tbl[cur_fnt].char_wi+(int)(ch - font_tbl[cur_fnt].char_f)% 256)))/(double)(1L<< 20)) *(double) font_tbl[cur_fnt].scale)
int uniblock_iskanji
Definition: uniblock.c:10
#define ENTRY_JQ
Definition: uniblock.h:5
struct USERTABLE_MOVE usertable_move[1024]
Definition: usrtable.c:16
struct USERTABLE_REPLACE usertable_replace[1024]
Definition: usrtable.c:15
int usertable_move_max
Definition: usrtable.c:14
int usertable_replace_max
Definition: usrtable.c:14