OSDN Git Service

shipout routines.
[putex/putex.git] / src / texsourc / libtoua / ptexenc / kanjicnv.c
1 /*
2  *  KANJI Code conversion routines.
3  */
4
5 /*
6      enccode     byte1       byte2
7    1 EUC-JP 0208 0xA1 - 0xFE 0xA1 - 0xFE
8    2 EUC-CN      0xA1 - 0xF7 0xA1 - 0xFE
9    3 EUC-KR      0xA1 - 0xFE 0xA1 - 0xFE
10    4 EUC-TW      0xA1 - 0xFE 0xA1 - 0xFE
11    5 big-5       0x80 - 0xFE 0x40 - 0x7E
12                              0xA1 - 0xFE
13    6 SJIS        
14  
15  */
16
17 #include <ptexenc/c-auto.h>
18 #include <ptexenc/kanjicnv.h>
19
20 boolean isEUCkanji1(int c)
21 {
22     c &= 0xff;
23     return (0xa1 <= c && c <= 0xfe);
24 }
25
26 boolean isEUCkanji2(int c)
27 {
28     c &= 0xff;
29     return (0xa1 <= c && c <= 0xfe);
30 }
31
32 boolean isSJISkanji1(int c)
33 {
34     c &= 0xff;
35     return ((0x81 <= c && c <= 0x9f) || (0xe0 <= c && c <= 0xfc));
36 }
37
38 boolean isSJISkanji2(int c)
39 {
40     c &= 0xff;
41     return (0x40 <= c && c <= 0xfc && c != 0x7f);
42 }
43
44 /* EUC <=> JIS X 0208 code conversion */
45 int EUCtoJIS(int kcode)
46 {
47     return (kcode & 0x7f7f);
48 }
49
50 int JIStoEUC(int kcode)
51 {
52     return (kcode | 0x8080);
53 }
54
55 /* Shift JIS <=> JIS Kanji code conversion */
56 int SJIStoJIS(int kcode)
57 {
58     int byte1, byte2;
59
60     byte1 = HI(kcode);
61     byte2 = LO(kcode);
62     byte1 -= ( byte1>=0xa0 ) ? 0xc1 : 0x81;
63     kcode = ((byte1<<1) + 0x21)<<8;
64     if ( byte2 >= 0x9f ) {
65         kcode += 0x0100;
66         kcode |= (byte2 - 0x7e) & 0xff;
67     } else {
68         kcode |= (byte2 - ((byte2<=0x7e) ? 0x1f : 0x20 )) & 0xff;
69     }
70     return kcode;
71 }
72
73 int JIStoSJIS(int kcode)
74 {
75     int high, low;
76     int nh,   nl;
77
78     high = HI(kcode);
79     low  = LO(kcode);
80     nh = ((high-0x21)>>1) + 0x81;
81     if (nh > 0x9f) nh += 0x40;
82     if (high & 1) {
83         nl = low + 0x1f;
84         if (low > 0x5f) nl++;
85     } else
86         nl = low + 0x7e;
87     if (isSJISkanji1(nh) && isSJISkanji2(nl)) {
88         return HILO(nh, nl);
89     } else {
90         return 0x813f;
91     }
92 }
93
94 /* Shift JIS <=> EUC Kanji code conversion */
95 int SJIStoEUC(int kcode)
96 {
97     return JIStoEUC(SJIStoJIS(kcode));
98 }
99
100 int EUCtoSJIS(int kcode)
101 {
102     return JIStoSJIS(EUCtoJIS(kcode));
103 }
104
105 /* KUTEN to JIS kanji code conversion */
106 int KUTENtoJIS(int kcode)
107 {
108     /* in case of undefined in kuten code table */
109     if (HI(kcode) == 0 || HI(kcode) > 95) return -1;
110     if (LO(kcode) == 0 || LO(kcode) > 95) return -1;
111
112     return kcode + 0x2020;
113 }