OSDN Git Service

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