X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fmule-canna.c;h=249e21dfbebc169c1c0793e3aa1450709fcc7c13;hb=ac645215c78bf4fcd6a9d863b3de7ba5666b670c;hp=ea01f0f6a1ccf1256a747fbb980e9430631b5caa;hpb=2fd9701a4f902054649dde9143a3f77809afee8f;p=chise%2Fxemacs-chise.git- diff --git a/src/mule-canna.c b/src/mule-canna.c index ea01f0f..249e21d 100644 --- a/src/mule-canna.c +++ b/src/mule-canna.c @@ -1,4 +1,4 @@ -/* CANNA interface +/* CANNA interface -*- coding: euc-jp -*- Copyright (C) 1995 Free Software Foundation, Inc. Copyright (C) 1995 Sun Microsystems, Inc. @@ -190,6 +190,7 @@ static int IRCP_context; static Lisp_Object storeResults (unsigned char *, int, jrKanjiStatus *); static Lisp_Object kanjiYomiList (int, int); +static Lisp_Object CANNA_mode_keys (void); #ifdef CANNA_MULE static void m2c (unsigned char *, int, unsigned char *); @@ -326,10 +327,9 @@ No separator will be used otherwise. } /* For whatever reason, calling Fding directly from libCanna loses */ -static void call_Fding() +static void +call_Fding (void) { - extern Lisp_Object Fding(); - Fding (Qnil, Qnil, Qnil); } @@ -421,8 +421,7 @@ If nil is specified for each arg, the default value will be used. } else { - extern void (*jrBeepFunc)(); - Lisp_Object CANNA_mode_keys (); + extern void (*jrBeepFunc) (void); jrBeepFunc = call_Fding; @@ -535,7 +534,7 @@ Change Japanese pre-edit mode. return val; } -Lisp_Object +static Lisp_Object CANNA_mode_keys (void) { #define CANNAWORKBUFSIZE 32 @@ -1780,8 +1779,72 @@ For canna static void c2mu (unsigned char *cp, int l, unsigned char *mp) { - unsigned char ch, *ep = cp+l; + unsigned char ch, *ep = cp+l; +#ifdef UTF2000 + Emchar chr; + while ((cp < ep) && (ch = *cp++)) + { + if (ch == ISO_CODE_SS2) + { + chr = (*cp++) + MIN_CHAR_HALFWIDTH_KATAKANA - 0x20; + } + else if (ch == ISO_CODE_SS3) + { + ch = *cp++; + chr = MAKE_CHAR (Vcharset_japanese_jisx0212, + ch & 0x7f, (*cp++) & 0x7f); + } + else if (ch & 0x80) + { + chr = MAKE_CHAR (Vcharset_japanese_jisx0208, + ch & 0x7f, (*cp++) & 0x7f); + } + else + { + chr = ch; + } + if ( chr <= 0x7f ) + { + *mp++ = chr; + } + else if ( chr <= 0x7ff ) + { + *mp++ = (chr >> 6) | 0xc0; + *mp++ = (chr & 0x3f) | 0x80; + } + else if ( chr <= 0xffff ) + { + *mp++ = (chr >> 12) | 0xe0; + *mp++ = ((chr >> 6) & 0x3f) | 0x80; + *mp++ = (chr & 0x3f) | 0x80; + } + else if ( chr <= 0x1fffff ) + { + *mp++ = (chr >> 18) | 0xf0; + *mp++ = ((chr >> 12) & 0x3f) | 0x80; + *mp++ = ((chr >> 6) & 0x3f) | 0x80; + *mp++ = (chr & 0x3f) | 0x80; + } + else if ( chr <= 0x3ffffff ) + { + *mp++ = (chr >> 24) | 0xf8; + *mp++ = ((chr >> 18) & 0x3f) | 0x80; + *mp++ = ((chr >> 12) & 0x3f) | 0x80; + *mp++ = ((chr >> 6) & 0x3f) | 0x80; + *mp++ = (chr & 0x3f) | 0x80; + } + else + { + *mp++ = (chr >> 30) | 0xfc; + *mp++ = ((chr >> 24) & 0x3f) | 0x80; + *mp++ = ((chr >> 18) & 0x3f) | 0x80; + *mp++ = ((chr >> 12) & 0x3f) | 0x80; + *mp++ = ((chr >> 6) & 0x3f) | 0x80; + *mp++ = (chr & 0x3f) | 0x80; + } + } +#else while ((cp < ep) && (ch = *cp)) { if ((unsigned char) ch == ISO_CODE_SS2) @@ -1802,6 +1865,7 @@ c2mu (unsigned char *cp, int l, unsigned char *mp) } *mp++ = *cp++; } +#endif *mp = 0; } @@ -1811,9 +1875,74 @@ static void m2c (unsigned char *mp, int l, unsigned char *cp) { unsigned char ch, *ep = mp + l; +#ifdef UTF2000 + unsigned char fb; + int len; + Emchar chr; +#endif while ((mp < ep) && (ch = *mp++)) { +#ifdef UTF2000 + if ( ch >= 0xfc ) + { + chr = (ch & 0x01); + len = 5; + } + else if ( ch >= 0xf8 ) + { + chr = ch & 0x03; + len = 4; + } + else if ( ch >= 0xf0 ) + { + chr = ch & 0x07; + len = 3; + } + else if ( ch >= 0xe0 ) + { + chr = ch & 0x0f; + len = 2; + } + else if ( ch >= 0xc0 ) + { + chr = ch & 0x1f; + len = 1; + } + else + { + chr = ch; + len = 0; + } + for( ; len > 0; len-- ) + { + ch = *mp++; + chr = ( chr << 6 ) | ( ch & 0x3f ); + } + if ( chr <= 0x7f ) + *cp++ = chr; + else if ( chr <= MAX_CHAR_HALFWIDTH_KATAKANA ) + { + *cp++ = ISO_CODE_SS2; + *cp++ = ( chr & 0x7f ) | 0x80; + } + else + { + Lisp_Object charset; + int c1, c2; + + BREAKUP_CHAR (chr, charset, c1, c2); + fb = XCHARSET_FINAL (charset); + switch (fb) + { + case 'D': + *cp++ = ISO_CODE_SS3; + default: + *cp++ = c1; + *cp++ = c2; + } + } +#else switch (ch) { case LEADING_BYTE_KATAKANA_JISX0201: @@ -1830,6 +1959,7 @@ m2c (unsigned char *mp, int l, unsigned char *cp) *cp++ = ch; break; } +#endif } *cp = 0; }