1 /* zenhan.c */
2 /*****************************************************************************
3 �ԣ�������У�������أԣ�
4
5 �����ѡ�Ⱦ���Ѵ�������
6 *****************************************************************************/
7
8 #include "xtr.h"
9
10 /* ANK-�����Ѵ������� */
11
12 #if UNIX
13
14 static ushort asczen[] = {
15 0x8140, 0x8149, 0x8168, 0x8194, 0x8190, 0x8193, 0x8195, 0x8166, /* �����ɡ������� */
16 0x8169, 0x816a, 0x8196, 0x817b, 0x8143, 0x817c, 0x8144, 0x815e, /* �ʡˡ��ܡ��ݡ��� */
17 0x824f, 0x8250, 0x8251, 0x8252, 0x8253, 0x8254, 0x8255, 0x8256, /* ���������������� */
18 0x8257, 0x8258, 0x8146, 0x8147, 0x8183, 0x8181, 0x8184, 0x8148, /* �����������䡩 */
19 0x8197, 0x8260, 0x8261, 0x8262, 0x8263, 0x8264, 0x8265, 0x8266, /* �����£ãģţƣ� */
20 0x8267, 0x8268, 0x8269, 0x826a, 0x826b, 0x826c, 0x826d, 0x826e, /* �ȣɣʣˣ̣ͣΣ� */
21 0x826f, 0x8270, 0x8271, 0x8272, 0x8273, 0x8274, 0x8275, 0x8276, /* �Уѣңӣԣգ֣� */
22 0x8277, 0x8278, 0x8279, 0x816d, 0x818f, 0x816e, 0x814f, 0x8151, /* �أ٣ڡΡ�ϡ��� */
23 0x8165, 0x8281, 0x8282, 0x8283, 0x8284, 0x8285, 0x8286, 0x8287, /* �ƣ������� */
24 0x8288, 0x8289, 0x828a, 0x828b, 0x828c, 0x828d, 0x828e, 0x828f, /* ��������� */
25 0x8290, 0x8291, 0x8292, 0x8293, 0x8294, 0x8295, 0x8296, 0x8297, /* ������������ */
26 0x8298, 0x8299, 0x829a, 0x816f, 0x8162, 0x8170, 0x8150, 0x0000 /* �������Сáѡ� */
27 };
28
29 static ushort kanazen[] = {
30 0x8142, 0x8175, 0x8176, 0x8141, 0x8145, 0x8392, 0x8340, /* ���֡ס����� */
31 0x8342, 0x8344, 0x8346, 0x8348, 0x8383, 0x8385, 0x8387, 0x8362, /* ������������� */
32 0x815b, 0x8341, 0x8343, 0x8345, 0x8347, 0x8349, 0x834a, 0x834c, /* ���������������� */
33 0x834e, 0x8350, 0x8352, 0x8354, 0x8356, 0x8358, 0x835a, 0x835c, /* ���������������� */
34 0x835e, 0x8360, 0x8363, 0x8365, 0x8367, 0x8369, 0x836a, 0x836b, /* �����ĥƥȥʥ˥� */
35 0x836c, 0x836d, 0x836e, 0x8371, 0x8374, 0x8377, 0x837a, 0x837d, /* �ͥΥϥҥեإۥ� */
36 0x837e, 0x8380, 0x8381, 0x8382, 0x8384, 0x8386, 0x8388, 0x8389, /* �ߥ������� */
37 0x838a, 0x838b, 0x838c, 0x838d, 0x838f, 0x8393, 0x814a, 0x814b, /* ������� */
38 0x0000
39 };
40
41 static ushort hwtok1[] = {
42 0x8390, 0x8391, 0x838e, 0x8395, 0x8396, 0x8394, 0x834b, 0x834d, /* ������������� */
43 0x834f, 0x8351, 0x8353, 0x8355, 0x8357, 0x8359, 0x835b, 0x835d, /* ���������������� */
44 0x835f, 0x8361, 0x8364, 0x8366, 0x8368, 0x836f, 0x8370, 0x8372, /* ���¥ťǥɥХѥ� */
45 0x8373, 0x8375, 0x8376, 0x8378, 0x8379, 0x837b, 0x837c, 0x0000 /* �ԥ֥ץ٥ڥܥ� */
46 };
47 static ushort hwtok2[] = {
48 0x814c, 0x814e, 0x8165, 0x8167, 0x816b, 0x816c, 0x8171, 0x8172, /* �����ơȡ̡͡ҡ� */
49 0x8173, 0x8174, 0x8177, 0x8178, 0x8179, 0x817a, 0x815c, 0x0000 /* �ԡաء١ڡۡ� */
50 };
51
52 static ushort daku_zen[] = {
53 0x8394, 0x834b, 0x834d, 0x834f, 0x8351, 0x8353, 0x8355, 0x8357, /* ���������������� */
54 0x8359, 0x835b, 0x835d, 0x835f, 0x8361, 0x8364, 0x8366, 0x8368, /* ���������¥ťǥ� */
55 0x836f, 0x8372, 0x8375, 0x8378, 0x837b, 0x0000 /* �Хӥ֥٥� */
56 };
57
58 static ushort handaku_zen[] = { 0x8370, 0x8373, 0x8376, 0x8379, 0x837c, 0x0000 };
59
60 #else /* !UNIX */
61
62 static uchar asczen[] =
63 "�����ɡ������ǡʡˡ��ܡ��ݡ���"
64 "���������������������������䡩"
65 "�����£ãģţƣǣȣɣʣˣ̣ͣΣ�"
66 "�Уѣңӣԣգ֣ףأ٣ڡΡ�ϡ���"
67 "�ƣ���������������"
68 "�������������������Сáѡ�";
69
70 static uchar kanazen[] =
71 "���֡ס����������������"
72 "��������������������������������"
73 "�����ĥƥȥʥ˥̥ͥΥϥҥեإۥ�"
74 "�ߥ�������������";
75
76 static uchar hwtok1[] = "�����������������������������"
77 "���¥ťǥɥХѥӥԥ֥ץ٥ڥܥ�";
78 static uchar hwtok2[] = "�����ơȡ̡͡ҡӡԡաء١ڡۡ�";
79
80 static uchar daku_zen[] = "�������������������������¥ťǥɥХӥ֥٥�";
81
82 static uchar handaku_zen[] = "�ѥԥץڥ�";
83
84 #endif /* !UNIX */
85
86 static uchar daku_han[] = {
87 0xb3, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, /* ���������������� */
88 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, /* �����������ĥƥ� */
89 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0x00 /* �ϥҥեإ� */
90 };
91
92 static uchar handaku_han[] = { 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0x00 }; /* �ϥҥեإ� */
93
94 #define HANDAKUTEN 0xdf /* �� */
95 #define DAKUTEN 0xde /* �� */
96
97 #if UNIX
98 static int
windex(ushort * wstr,ushort wc)99 windex(ushort *wstr, ushort wc)
100 {
101 int n;
102
103 n = 0;
104 while (*wstr) {
105 if (*wstr++ == wc)
106 return n;
107 n++;
108 }
109 return -1;
110 }
111 #endif
112
113 unsigned
ANKtoHW(unsigned ank)114 ANKtoHW(unsigned ank)
115 /* ���Σ�ʸ����Σţã��Х���Ⱦ��ʸ�����Ѵ� */
116 {
117 if (ank < 0x20 || ank > 0xdf)
118 return (ank);
119 else if (ank == SP)
120 return (HWSP);
121 else if (ank >= 0xa1)
122 return ((0x859f - 0xa1) + ank);
123 else if (ank >= 0x7f)
124 return (ank);
125 else if (ank >= 0x60)
126 return ((0x8580 - 0x60) + ank);
127 else
128 return ((0x8540 - 0x21) + ank);
129 }
130
131
132 unsigned
HWtoANK(unsigned hw)133 HWtoANK(unsigned hw)
134 /* ���Х���Ⱦ��ʸ������Σ�ʸ�����Ѵ� */
135 {
136 if (hw == HWSP)
137 return (SP);
138 else if (hw < 0x8540 || hw > 0x85dd)
139 return (hw);
140 else if (hw >= 0x859f)
141 return (hw - 0x859f + 0xa1);
142 else if (hw >= 0x8580)
143 return (hw - 0x8580 + 0x60);
144 else if (hw == 0x857f)
145 return (hw);
146 else
147 return (hw - 0x8540 + 0x21);
148 }
149
150 unsigned
HWtoZen(unsigned hw)151 HWtoZen(unsigned hw)
152 /* ���Х���Ⱦ�Ѥ�������ʸ�����Ѵ� */
153 {
154 if (hw == HWSP)
155 return (ZENSP);
156 else if (hw <= 0x85dd)
157 return (ANKtoZen(HWtoANK(hw)));
158 else if (hw <= 0x85fc)
159 #if UNIX
160 return hwtok1[hw - 0x85de];
161 #else
162 return (MkMoji(hwtok1[(hw - 0x85de) * 2],
163 hwtok1[(hw - 0x85de) * 2 + 1]));
164 #endif
165 else if (hw <= 0x867e)
166 return (hw + 0x86a0 - 0x8641);
167 else if (hw <= 0x868f)
168 return (hw + 0x86de - 0x8680);
169 else if (hw <= 0x869e)
170 #if UNIX
171 return hwtok2[hw - 0x8690];
172 #else
173 return (MkMoji(hwtok2[(hw - 0x8690) * 2],
174 hwtok2[(hw - 0x8690) * 2 + 1]));
175 #endif
176 else
177 return (ANKtoZen(hw));
178 }
179
180
181 unsigned
ANKtoZen(unsigned ank)182 ANKtoZen(unsigned ank)
183 {
184 if (ank >= 0xe0)
185 return (ank);
186 else if (ank >= 0xa1)
187 #if UNIX
188 return kanazen[ank - 0xa1];
189 #else
190 return (MkMoji(kanazen[(ank - 0xa1) * 2],
191 kanazen[(ank - 0xa1) * 2 + 1]));
192 #endif
193 else if (ank >= 0x7f)
194 return (ank);
195 else if (ank >= 0x20)
196 #if UNIX
197 return asczen[ank - 0x20];
198 #else
199 return (MkMoji(asczen[(ank - 0x20) * 2],
200 asczen[(ank - 0x20) * 2 + 1]));
201 #endif
202 else
203 return (ank);
204 }
205
206 unsigned
ANKtoZen2(unsigned ank,unsigned ank2,unsigned * dakuten)207 ANKtoZen2(unsigned ank, unsigned ank2, unsigned *dakuten)
208 {
209 uchar *p;
210
211 assert(dakuten != NULL);
212 *dakuten = 0;
213 if (ank >= 0xe0) {
214 return ank;
215 } else if (ank2 == HANDAKUTEN && (p = (uchar *)strchr((char *)handaku_han, ank)) != NULL) {
216 *dakuten = HANDAKUTEN;
217 #if UNIX
218 return handaku_zen[(ulong)p - (ulong)handaku_han];
219 #else
220 return MkMoji(handaku_zen[(p - handaku_han) * 2],
221 handaku_zen[(p - handaku_han) * 2 + 1]);
222 #endif
223 } else if (ank2 == DAKUTEN && (p = (uchar *)strchr((char *)daku_han, ank)) != NULL) {
224 *dakuten = DAKUTEN;
225 #if UNIX
226 return daku_zen[(ulong)p - (ulong)daku_han];
227 #else
228 return MkMoji(daku_zen[(p - daku_han) * 2],
229 daku_zen[(p - daku_han) * 2 + 1]);
230 #endif
231 } else {
232 return ANKtoZen(ank);
233 }
234 }
235
236 unsigned
ASCtoZen(unsigned asc)237 ASCtoZen(unsigned asc)
238 {
239 if (asc < 0x20 || asc > 0x7e)
240 return (asc);
241 else
242 #if UNIX
243 return asczen[asc - 0x20];
244 #else
245 return (MkMoji(asczen[(asc - 0x20) * 2],
246 asczen[(asc - 0x20) * 2 + 1]));
247 #endif
248 }
249
250
251 unsigned
ZentoASC(unsigned zen)252 ZentoASC(unsigned zen)
253 /* ���Ѥαѿ������Ⱦ�ѤΥ�������ʸ�� (0x20��0x7e) ���Ѵ� */
254 {
255 #if UNIX
256 int n;
257
258 if (Is1B(zen) || !IsANKZen(zen) || (n = windex(asczen, zen)) < 0)
259 return zen;
260 else
261 return 0x20 + n;
262 #else
263 uchar *p;
264
265 if (Is1B(zen) || !IsANKZen(zen) || (p = jstrchr(asczen, zen)) == NULL)
266 return zen;
267 else
268 return 0x20 + (p - asczen) / 2;
269 #endif
270 }
271
272 unsigned
ZentoANK(unsigned zen)273 ZentoANK(unsigned zen)
274 {
275 #if UNIX
276 int n;
277
278 if (Is1B(zen) || !IsANKZen(zen))
279 return zen;
280 else if ((n = windex(asczen, zen)) >= 0)
281 return 0x20 + n;
282 else if ((n = windex(kanazen, zen)) >= 0)
283 return 0xa1 + n;
284 else
285 return zen;
286 #else
287 uchar *p;
288
289 if (Is1B(zen) || !IsANKZen(zen))
290 return zen;
291 else if ((p = jstrchr(asczen, zen)) != NULL)
292 return 0x20 + (p - asczen) / 2;
293 else if ((p = jstrchr(kanazen, zen)) != NULL)
294 return 0xa1 + (p - kanazen) / 2;
295 else
296 return zen;
297 #endif
298 }
299
300 unsigned
ZentoANK2(unsigned zen,unsigned * dakuten)301 ZentoANK2(unsigned zen, unsigned *dakuten)
302 {
303 #if UNIX
304 int n;
305
306 assert(dakuten != NULL);
307 *dakuten = 0;
308 if (Is1B(zen) || !IsANKZen(zen)) {
309 return zen;
310 } else if ((n = windex(handaku_zen, zen)) >= 0) {
311 *dakuten = HANDAKUTEN;
312 return handaku_han[n];
313 } else if ((n = windex(daku_zen, zen)) >= 0) {
314 *dakuten = DAKUTEN;
315 return daku_han[n];
316 } else {
317 return ZentoANK(zen);
318 }
319 #else
320 uchar *p;
321
322 assert(dakuten != NULL);
323 *dakuten = 0;
324 if (Is1B(zen) || !IsANKZen(zen)) {
325 return zen;
326 } else if ((p = jstrchr(handaku_zen, zen)) != NULL) {
327 *dakuten = HANDAKUTEN;
328 return handaku_han[(p - handaku_zen) / 2];
329 } else if ((p = jstrchr(daku_zen, zen)) != NULL) {
330 *dakuten = DAKUTEN;
331 return daku_han[(p - daku_zen) / 2];
332 } else {
333 return ZentoANK(zen);
334 }
335 #endif
336 }
337
338 unsigned
ChangeANKtoZen(unsigned ank,unsigned zen)339 ChangeANKtoZen(unsigned ank, unsigned zen)
340 /* ANK-�����Ѵ��ơ��֥��������
341 * ANKʸ�����Ф��Ƥɤδ������б������뤫����ꤹ�롣
342 * �֤����������δ��������ɤ��֤���
343 * ANK�������Υ����ɤ��ϰϳ��ʤ� 0 ���֤���
344 */
345 {
346 #if UNIX
347 ushort *tblp = NULL;
348 unsigned oldzen;
349
350 if (!IsANKZen(zen))
351 ;
352 else if (0x20 <= ank && ank < 0x7f)
353 tblp = &asczen[ank - 0x20];
354 else if (0xa1 <= ank && ank < 0xe0)
355 tblp = &kanazen[ank - 0xa1];
356
357 if (tblp == NULL)
358 return 0;
359 else {
360 oldzen = *tblp;
361 *tblp = zen;
362 return oldzen;
363 }
364 #else
365 uchar *tblp = NULL;
366 unsigned oldzen;
367
368 if (!IsANKZen(zen))
369 ;
370 else if (ank >= 0xe0)
371 ;
372 else if (ank >= 0xa1)
373 tblp = kanazen + (ank - 0xa1) * 2;
374 else if (ank >= 0x7f)
375 ;
376 else if (ank >= 0x20)
377 tblp = asczen + (ank - 0x20) * 2;
378
379 if (tblp == NULL)
380 return 0;
381 else {
382 oldzen = MojiK(tblp);
383 SetKanji_(zen, tblp);
384 return oldzen;
385 }
386 #endif
387 }
388
389 /*
390 * Local variables:
391 * mode: c
392 * c-indent-level: 4
393 * c-continued-statement-offset: 4
394 * c-brace-offset: -4
395 * c-argdecl-indent: 4
396 * c-label-offset: -4
397 * tab-width: 4
398 * tab-stop-list: (4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80)
399 * End:
400 */
401