2 * ʸ»ú(xchar)¤Î¥¿¥¤¥×¤Ê¤É¤ò°·¤¦
4 * Copyright (C) 2001-2006 TABATA Yusuke
9 #include <anthy/xstr.h>
10 #include <anthy/xchar.h>
12 #include "diclib_inner.h"
20 static struct xchar_ent {
23 struct xchar_ent *next;/* hash chain */
26 {0xFF40, XCT_OPEN , 0}, /* ¡®, Äɲà */
27 {0x2032, XCT_CLOSE, 0}, /* ¡ì, Äɲà */
28 {0x2018, XCT_OPEN , 0}, /* ¡Æ, Äɲà */
29 {0x2019, XCT_CLOSE, 0}, /* ¡Ç, Äɲà */
30 {0x201C, XCT_OPEN , 0}, /* ¡È, Äɲà */
31 {0x201D, XCT_CLOSE, 0}, /* ¡É, ʸ»ú¥³¡¼¥É¤¬´Ö°ã¤Ã¤Æ¤¤¤ë¤È»×¤ï¤ì¤ë¤Î¤Ç½¤Àµ */
32 {0xff08, XCT_OPEN, 0}, /* ¡Ê¡¡*/
33 {0xff09, XCT_CLOSE, 0}, /* ¡Ë */
34 {0x3014, XCT_OPEN, 0}, /* ¡Ì */
35 {0x3015, XCT_CLOSE, 0}, /* ¡Í */
36 {0xff3b, XCT_OPEN, 0}, /* ¡Î */
37 {0xff3d, XCT_CLOSE, 0}, /* ] */
38 {0xff5b, XCT_OPEN, 0}, /* { */
39 {0xff5d, XCT_CLOSE, 0}, /* ¡Ñ¡¡*/
40 {0x3008, XCT_OPEN, 0}, /* ¡ã¡¡*/
41 {0x3009, XCT_CLOSE, 0}, /* ¡ä¡¡*/
42 {0x300a, XCT_OPEN, 0}, /* ¡Ô¡¡*/
43 {0x300b, XCT_CLOSE, 0}, /* ¡Õ¡¡*/
44 {0x300c, XCT_OPEN, 0}, /* ¡Ö¡¡*/
45 {0x300d, XCT_CLOSE, 0}, /* ¡×¡¡*/
46 {0x300e, XCT_OPEN, 0}, /* ¡Ø¡¡*/
47 {0x300f, XCT_CLOSE, 0}, /* ¡Ù¡¡*/
48 {0x3010, XCT_OPEN, 0}, /* ¡Ú¡¡*/
49 {0x3011, XCT_CLOSE, 0}, /* ¡Û¡¡*/
50 {0x3001, XCT_PUNCTUATION, 0}, /* ¡¢¡¡*/
51 {0x3002, XCT_PUNCTUATION, 0}, /* ¡£¡¡*/
52 {0xff0c, XCT_PUNCTUATION, 0}, /* ¡¤¡¡*/
53 {0xff0e, XCT_PUNCTUATION, 0}, /* ¡¥¡¡*/
54 {0xff1f, XCT_PUNCTUATION, 0}, /* ¡©¡¡*/
55 {0xff01, XCT_PUNCTUATION, 0}, /* ¡ª¡¡*/
57 {28, XCT_OPEN, 0}, /* ( */
58 {133, XCT_OPEN, 0}, /* [ */
59 {29, XCT_CLOSE, 0}, /* ) */
60 {135, XCT_CLOSE, 0}, /* ] */
61 {HK_TO, XCT_DEP, 0},/* ¤È */
62 {HK_HA, XCT_DEP, 0},/* ¤Ï */
63 {HK_NO, XCT_DEP, 0},/* ¤Î */
64 {HK_NI, XCT_DEP, 0},/* ¤Ë */
65 {HK_GA, XCT_DEP, 0},/* ¤¬ */
66 {HK_WO, XCT_DEP, 0},/* ¤ò */
67 {WIDE_0, XCT_WIDENUM, 0},
68 {WIDE_1, XCT_WIDENUM, 0},
69 {WIDE_2, XCT_WIDENUM, 0},
70 {WIDE_3, XCT_WIDENUM, 0},
71 {WIDE_4, XCT_WIDENUM, 0},
72 {WIDE_5, XCT_WIDENUM, 0},
73 {WIDE_6, XCT_WIDENUM, 0},
74 {WIDE_7, XCT_WIDENUM, 0},
75 {WIDE_8, XCT_WIDENUM, 0},
76 {WIDE_9, XCT_WIDENUM, 0},
77 {HK_DDOT, XCT_PART, 0},
83 {HK_XYA, XCT_PART, 0},
84 {HK_XYU, XCT_PART, 0},
85 {HK_XYO, XCT_PART, 0},
93 static const struct half_kana_table half_kana_tab[] = {
168 {HK_PA,0x8eca,CIRCLE},
169 {HK_PI,0x8ecb,CIRCLE},
170 {HK_PU,0x8ecc,CIRCLE},
171 {HK_PE,0x8ecd,CIRCLE},
172 {HK_PO,0x8ece,CIRCLE},
182 static const struct half_wide_ent {
185 } half_wide_tab[] = {
222 anthy_lookup_half_wide(xchar xc)
224 const struct half_wide_ent *hw;
225 for (hw = half_wide_tab; hw->half; hw ++) {
226 if (hw->half == xc) {
229 if (hw->wide == xc) {
236 const struct half_kana_table *
237 anthy_find_half_kana(xchar xc)
239 const struct half_kana_table *tab;
240 for (tab = half_kana_tab; tab->src; tab ++) {
241 if (tab->src == xc && tab->dst) {
249 find_xchar_type(xchar xc)
251 struct xchar_ent *xe = xchar_tab;
253 for (; xe->xc; xe++) {
271 xc = anthy_ucs_to_euc(xc);
272 if ((xc & 0xff00) == 0xa400) {
284 xc = anthy_ucs_to_euc(xc);
285 if ((xc & 0xff00) == 0xa500) {
294 if (xc == UCS_GETA) {
297 xc = anthy_ucs_to_euc(xc);
298 if (xc == EUC_GETA) {
301 if ((xc & 0xff00) == 0xa100) {
304 if ((xc & 0xff00) == 0xa200) {
313 if (xc > 0x4e00 && xc < 0xa000) {
320 search(const int *tab[], int v, int geta)
322 int page = v / PAGE_SIZE;
323 int off = v % PAGE_SIZE;
325 if (page >= NR_PAGES) {
339 anthy_euc_to_ucs(int ec)
341 return search(e2u_index, ec, UCS_GETA);
345 anthy_ucs_to_euc(int uc)
347 int r = search(u2e_index, uc, EUC_GETA);
355 anthy_get_xchar_type(const xchar xc)
357 int t = find_xchar_type(xc);
358 if (xc > 47 && xc < 58) {
371 if (!(t & XCT_OPEN) && !(t & XCT_CLOSE)) {
382 anthy_get_xstr_type(const xstr *xs)
385 for (i = 0; i < xs->len; i++) {
386 t &= anthy_get_xchar_type(xs->str[i]);
392 anthy_xchar_to_num(xchar xc)
395 case WIDE_0:return 0;
396 case WIDE_1:return 1;
397 case WIDE_2:return 2;
398 case WIDE_3:return 3;
399 case WIDE_4:return 4;
400 case WIDE_5:return 5;
401 case WIDE_6:return 6;
402 case WIDE_7:return 7;
403 case WIDE_8:return 8;
404 case WIDE_9:return 9;
406 if (xc >= '0' && xc <= '9') {
407 return xc - (int)'0';
413 anthy_xchar_wide_num_to_num(xchar c)
416 case WIDE_0:return '0';
417 case WIDE_1:return '1';
418 case WIDE_2:return '2';
419 case WIDE_3:return '3';
420 case WIDE_4:return '4';
421 case WIDE_5:return '5';
422 case WIDE_6:return '6';
423 case WIDE_7:return '7';
424 case WIDE_8:return '8';
425 case WIDE_9:return '9';
431 anthy_init_xchar_tab(void)