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