Blame


1 08708877 2003-11-25 devnull /*
2 08708877 2003-11-25 devnull following astonishing goo courtesy of kogure.
3 08708877 2003-11-25 devnull */
4 08708877 2003-11-25 devnull /*
5 08708877 2003-11-25 devnull * MicroSoft Kanji Encoding (SJIS) Transformation
6 08708877 2003-11-25 devnull */
7 08708877 2003-11-25 devnull
8 08708877 2003-11-25 devnull /*
9 08708877 2003-11-25 devnull * void
10 08708877 2003-11-25 devnull * J2S(unsigned char *_h, unsigned char *_l)
11 08708877 2003-11-25 devnull * JIS X 208 to MS kanji transformation.
12 08708877 2003-11-25 devnull *
13 08708877 2003-11-25 devnull * Calling/Exit State:
14 08708877 2003-11-25 devnull * _h and _l should be in their valid range.
15 08708877 2003-11-25 devnull * No return value.
16 08708877 2003-11-25 devnull */
17 08708877 2003-11-25 devnull #define J2S(_h, _l) { \
18 08708877 2003-11-25 devnull /* lower: 21-7e >> 40-9d,9e-fb >> 40-7e,(skip 7f),80-fc */ \
19 08708877 2003-11-25 devnull if (((_l) += (((_h)-- % 2) ? 0x1f : 0x7d)) > 0x7e) (_l)++; \
20 08708877 2003-11-25 devnull /* upper: 21-7e >> 81-af >> 81-9f,(skip a0-df),e0-ef */ \
21 08708877 2003-11-25 devnull if (((_h) = ((_h) / 2 + 0x71)) > 0x9f) (_h) += 0x40; \
22 08708877 2003-11-25 devnull }
23 08708877 2003-11-25 devnull
24 08708877 2003-11-25 devnull /*
25 08708877 2003-11-25 devnull * void
26 08708877 2003-11-25 devnull * S2J(unsigned char *_h, unsigned char *_l)
27 08708877 2003-11-25 devnull * MS kanji to JIS X 208 transformation.
28 08708877 2003-11-25 devnull *
29 08708877 2003-11-25 devnull * Calling/Exit State:
30 08708877 2003-11-25 devnull * _h and _l should be in valid range.
31 08708877 2003-11-25 devnull * No return value.
32 08708877 2003-11-25 devnull */
33 08708877 2003-11-25 devnull #define S2J(_h, _l) { \
34 08708877 2003-11-25 devnull /* lower: 40-7e,80-fc >> 21-5f,61-dd >> 21-7e,7f-dc */ \
35 08708877 2003-11-25 devnull if (((_l) -= 0x1f) > 0x60) (_l)--; \
36 08708877 2003-11-25 devnull /* upper: 81-9f,e0-ef >> 00-1e,5f-6e >> 00-2e >> 21-7d */ \
37 08708877 2003-11-25 devnull if (((_h) -= 0x81) > 0x5e) (_h) -= 0x40; (_h) *= 2, (_h) += 0x21; \
38 08708877 2003-11-25 devnull /* upper: ,21-7d >> ,22-7e ; lower: ,7f-dc >> ,21-7e */ \
39 08708877 2003-11-25 devnull if ((_l) > 0x7e) (_h)++, (_l) -= 0x5e; \
40 08708877 2003-11-25 devnull }
41 08708877 2003-11-25 devnull
42 08708877 2003-11-25 devnull /*
43 08708877 2003-11-25 devnull * int
44 08708877 2003-11-25 devnull * ISJKANA(const unsigned char *_b)
45 08708877 2003-11-25 devnull * Tests given byte is in the range of JIS X 0201 katakana.
46 08708877 2003-11-25 devnull *
47 08708877 2003-11-25 devnull * Calling/Exit State:
48 08708877 2003-11-25 devnull * Returns 1 if it is, or 0 otherwise.
49 08708877 2003-11-25 devnull */
50 08708877 2003-11-25 devnull #define ISJKANA(_b) (0xa0 <= (_b) && (_b) < 0xe0)
51 08708877 2003-11-25 devnull
52 08708877 2003-11-25 devnull /*
53 08708877 2003-11-25 devnull * int
54 08708877 2003-11-25 devnull * CANS2JH(const unsigned char *_h)
55 08708877 2003-11-25 devnull * Tests given byte is in the range of valid first byte of MS
56 08708877 2003-11-25 devnull * kanji code; either acts as a subroutine of CANS2J() macro
57 08708877 2003-11-25 devnull * or can be used to parse MS kanji encoded strings.
58 08708877 2003-11-25 devnull *
59 08708877 2003-11-25 devnull * Calling/Exit State:
60 08708877 2003-11-25 devnull * Returns 1 if it is, or 0 otherwise.
61 08708877 2003-11-25 devnull */
62 08708877 2003-11-25 devnull #define CANS2JH(_h) ((0x81 <= (_h) && (_h) < 0xf0) && !ISJKANA(_h))
63 08708877 2003-11-25 devnull
64 08708877 2003-11-25 devnull /*
65 08708877 2003-11-25 devnull * int
66 08708877 2003-11-25 devnull * CANS2JL(const unsigned char *_l)
67 08708877 2003-11-25 devnull * Tests given byte is in the range of valid second byte of MS
68 08708877 2003-11-25 devnull * kanji code; acts as a subroutine of CANS2J() macro.
69 08708877 2003-11-25 devnull *
70 08708877 2003-11-25 devnull * Calling/Exit State:
71 08708877 2003-11-25 devnull * Returns 1 if it is, or 0 otherwise.
72 08708877 2003-11-25 devnull */
73 08708877 2003-11-25 devnull #define CANS2JL(_l) (0x40 <= (_l) && (_l) < 0xfd && (_l) != 0x7f)
74 08708877 2003-11-25 devnull
75 08708877 2003-11-25 devnull /*
76 08708877 2003-11-25 devnull * int
77 08708877 2003-11-25 devnull * CANS2J(const unsigned char *_h, const unsinged char *_l)
78 08708877 2003-11-25 devnull * Tests given bytes form a MS kanji code point which can be
79 08708877 2003-11-25 devnull * transformed to a valid JIS X 208 code point.
80 08708877 2003-11-25 devnull *
81 08708877 2003-11-25 devnull * Calling/Exit State:
82 08708877 2003-11-25 devnull * Returns 1 if they are, or 0 otherwise.
83 08708877 2003-11-25 devnull */
84 08708877 2003-11-25 devnull #define CANS2J(_h, _l) (CANS2JH(_h) && CANS2JL(_l))
85 08708877 2003-11-25 devnull
86 08708877 2003-11-25 devnull /*
87 08708877 2003-11-25 devnull * int
88 08708877 2003-11-25 devnull * CANJ2SB(const unsigned char *_b)
89 08708877 2003-11-25 devnull * Tests given bytes is in the range of valid 94 graphic
90 08708877 2003-11-25 devnull * character set; acts as a subroutine of CANJ2S() macro.
91 08708877 2003-11-25 devnull *
92 08708877 2003-11-25 devnull * Calling/Exit State:
93 08708877 2003-11-25 devnull * Returns 1 if it is, or 0 otherwise.
94 08708877 2003-11-25 devnull */
95 08708877 2003-11-25 devnull #define CANJ2SB(_b) (0x21 <= (_b) && (_b) < 0x7f)
96 08708877 2003-11-25 devnull
97 08708877 2003-11-25 devnull /*
98 08708877 2003-11-25 devnull * int
99 08708877 2003-11-25 devnull * CANJ2S(const unsigned char *_h, const unsigned char *_l)
100 08708877 2003-11-25 devnull * Tests given bytes form valid JIS X 208 code points
101 08708877 2003-11-25 devnull * (which can be transformed to MS kanji).
102 08708877 2003-11-25 devnull *
103 08708877 2003-11-25 devnull * Calling/Exit State:
104 08708877 2003-11-25 devnull * Returns 1 if they are, or 0 otherwise.
105 08708877 2003-11-25 devnull */
106 08708877 2003-11-25 devnull #define CANJ2S(_h, _l) (CANJ2SB(_h) && CANJ2SB(_l))
107 08708877 2003-11-25 devnull
108 08708877 2003-11-25 devnull #define JIS208MAX 8407
109 08708877 2003-11-25 devnull #define GB2312MAX 8795
110 08708877 2003-11-25 devnull #define BIG5MAX 13973
111 08708877 2003-11-25 devnull
112 08708877 2003-11-25 devnull extern Rune tabjis208[JIS208MAX]; /* runes indexed by kuten */
113 08708877 2003-11-25 devnull extern Rune tabgb2312[GB2312MAX];
114 08708877 2003-11-25 devnull extern Rune tabbig5[BIG5MAX];