-/* CANNA interface
+/* CANNA interface -*- coding: euc-jp -*-
Copyright (C) 1995 Free Software Foundation, Inc.
Copyright (C) 1995 Sun Microsystems, Inc.
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 *);
}
/* 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);
}
char servername[256];
CHECK_STRING (server);
- strncpy (servername, XSTRING (server)->_data, XSTRING (server)->_size);
- servername[XSTRING (server)->_size] = '\0';
+ strncpy (servername, XSTRING_DATA (server), XSTRING_LENGTH (server));
+ servername[XSTRING_LENGTH (server)] = '\0';
jrKanjiControl (0, KC_SETSERVERNAME, servername);
}
char rcname[256];
CHECK_STRING (rcfile);
- strncpy (rcname, XSTRING (rcfile)->_data, XSTRING (rcfile)->_size);
- rcname[XSTRING (rcfile)->_size] = '\0';
+ strncpy (rcname, XSTRING_DATA (rcfile), XSTRING_LENGTH (rcfile));
+ rcname[XSTRING_LENGTH (rcfile)] = '\0';
jrKanjiControl (0, KC_SETINITFILENAME, rcname);
}
if (res == -1)
{
- val = Fcons (make_string ((unsigned char*) jrKanjiError,
+ val = Fcons (make_string ((unsigned char*) jrKanjiError,
strlen (jrKanjiError)), val);
/* ¥¤¥Ë¥·¥ã¥é¥¤¥º¤Ç¼ºÇÔ¤·¤¿¾ì¹ç¡£ */
return Fcons (Qnil, val);
}
else
{
- extern void (*jrBeepFunc)();
- Lisp_Object CANNA_mode_keys ();
+ extern void (*jrBeepFunc) (void);
jrBeepFunc = call_Fding;
ksv.buffer = (unsigned char *) buf;
ksv.bytes_buffer = KEYTOSTRSIZE;
#ifndef CANNA_MULE
- ks.echoStr = XSTRING (str)->_data;
- ks.length = XSTRING (str)->_size;
+ ks.echoStr = XSTRING_DATA (str);
+ ks.length = XSTRING_LENGTH (str);
#else /* CANNA_MULE */
- m2c (XSTRING (str)->_data, XSTRING (str)->_size, cbuf);
+ m2c (XSTRING_DATA (str), XSTRING_LENGTH (str), cbuf);
ks.echoStr = cbuf;
ks.length = strlen (cbuf);
#endif /* CANNA_MULE */
}
DEFUN ("canna-set-width", Fcanna_set_width, 1, 1, 0, /*
-Set status-line width information, which is used to display
+Set status-line width information, which is used to display
kanji candidates.
*/
(num))
return val;
}
-Lisp_Object
+static Lisp_Object
CANNA_mode_keys (void)
{
#define CANNAWORKBUFSIZE 32
CHECK_STRING (yomi);
#ifndef CANNA_MULE
- strncpy (buf, XSTRING (yomi)->_data, XSTRING (yomi)->_size);
- ks.length = XSTRING (yomi)->_size;
+ strncpy (buf, XSTRING_DATA (yomi), XSTRING_LENGTH (yomi));
+ ks.length = XSTRING_LENGTH (yomi);
buf[ks.length] = '\0';
#else /* CANNA_MULE */
- m2c (XSTRING (yomi)->_data, XSTRING (yomi)->_size, buf);
+ m2c (XSTRING_DATA (yomi), XSTRING_LENGTH (yomi), buf);
ks.length = strlen (buf);
#endif /* CANNA_MULE */
CHECK_STRING (roma);
#ifndef CANNA_MULE
- strncpy (buf + XSTRING (yomi)->_size + 1, XSTRING (roma)->_data,
- XSTRING (roma)->_size);
- buf[XSTRING (yomi)->_size + 1 + XSTRING (roma)->_size] = '\0';
- ks.mode = (unsigned char *)(buf + XSTRING (yomi)->_size + 1);
+ strncpy (buf + XSTRING_LENGTH (yomi) + 1, XSTRING_DATA (roma),
+ XSTRING_LENGTH (roma));
+ buf[XSTRING_LENGTH (yomi) + 1 + XSTRING_LENGTH (roma)] = '\0';
+ ks.mode = (unsigned char *)(buf + XSTRING_LENGTH (yomi) + 1);
#else /* CANNA_MULE */
ks.mode = (unsigned char *)(buf + ks.length + 1);
- m2c (XSTRING (roma)->_data, XSTRING (roma)->_size, ks.mode);
+ m2c (XSTRING_DATA (roma), XSTRING_LENGTH (roma), ks.mode);
#endif /* CANNA_MULE */
}
CHECK_STRING (str);
#ifndef CANNA_MULE
- strncpy (buf, XSTRING (str)->_data, XSTRING (str)->_size);
- buf[XSTRING (str)->_size] = '\0';
+ strncpy (buf, XSTRING_DATA (str), XSTRING_LENGTH (str));
+ buf[XSTRING_LENGTH (str)] = '\0';
#else /* CANNA_MULE */
- m2c (XSTRING (str)->_data, XSTRING (str)->_size, buf);
+ m2c (XSTRING_DATA (str), XSTRING_LENGTH (str), buf);
#endif /* CANNA_MULE */
p = (unsigned char**) buf;
n = jrKanjiControl (0, KC_PARSE, (char *) &p);
}
DEFUN ("canna-henkan-begin", Fcanna_henkan_begin, 1, 1, 0, /*
-¤«¤Ê´Á»úÊÑ´¹¤·¤¿·ë²Ì¤òÊÖ´Ô¤¹¤ë¡£Ê¸ÀáÀڤ꤬¤·¤Æ¤¢¤ë¡£
+Return the result of kana-to-kanji conversion.
+Clause separator is set.
*/
(yomi))
{
return Qnil;
}
#ifndef CANNA_MULE
- strncpy (yomibuf, XSTRING (yomi)->_data, XSTRING (yomi)->_size);
- yomibuf[XSTRING (yomi)->_size] = '\0';
- nbun = RkBgnBun (IRCP_context, XSTRING (yomi)->_data, XSTRING (yomi)->_size,
+ strncpy (yomibuf, XSTRING_DATA (yomi), XSTRING_LENGTH (yomi));
+ yomibuf[XSTRING_LENGTH (yomi)] = '\0';
+ nbun = RkBgnBun (IRCP_context, XSTRING_DATA (yomi), XSTRING_LENGTH (yomi),
(RK_XFER << RK_XFERBITS) | RK_KFER);
#else /* CANNA_MULE */
- m2c (XSTRING (yomi)->_data, XSTRING (yomi)->_size, yomibuf);
+ m2c (XSTRING_DATA (yomi), XSTRING_LENGTH (yomi), yomibuf);
nbun = RkBgnBun (IRCP_context, (char *) yomibuf, strlen (yomibuf),
(RK_XFER << RK_XFERBITS) | RK_KFER);
#endif /* CANNA_MULE */
}
DEFUN ("canna-henkan-next", Fcanna_henkan_next, 1, 1, 0, /*
-¸õÊä°ìÍ÷¤òµá¤á¤ë¡£
+Return the list of candidates.
*/
(bunsetsu))
{
}
else
{
- endp = XCDR (endp) = Fcons (make_string (p, slen), Qnil);
+ endp = XCDR (res) = Fcons (make_string (p, slen), Qnil);
}
p += slen + 1;
}
}
DEFUN ("canna-bunsetu-henkou", Fcanna_bunsetu_henkou, 2, 2, 0, /*
-ʸÀá¤ÎŤµ¤ò»ØÄꤹ¤ë¡£
+Specify the length of a clause.
*/
(bunsetsu, bunlen))
{
CHECK_INT (bunsetsu);
CHECK_INT (bunlen);
-
+
nbun = XINT (bunsetsu);
if (confirmContext () == 0)
{
}
DEFUN ("canna-henkan-kakutei", Fcanna_henkan_kakutei, 2, 2, 0, /*
-¸õÊäÁªÂò¡£
+Select a candidate.
*/
(bun, kouho))
{
}
DEFUN ("canna-henkan-end", Fcanna_henkan_end, 0, 0, 0, /*
-ÊÑ´¹½ªÎ»¡£
+End conversion.
*/
())
{
}
DEFUN ("canna-henkan-quit", Fcanna_henkan_quit, 0, 0, 0, /*
-ÊÑ´¹½ªÎ»¡£
+Quit conversion.
*/
())
{
void
syms_of_mule_canna (void)
{
- DEFVAR_LISP ("CANNA", &VCANNA); /* hir@nec, 1992.5.21 */
- VCANNA = Qt; /* hir@nec, 1992.5.21 */
-
DEFSUBR (Fcanna_key_proc);
DEFSUBR (Fcanna_initialize);
DEFSUBR (Fcanna_finalize);
void
vars_of_mule_canna (void)
{
+ DEFVAR_LISP ("CANNA", &VCANNA); /* hir@nec, 1992.5.21 */
+ VCANNA = Qt; /* hir@nec, 1992.5.21 */
+
DEFVAR_LISP ("canna-kakutei-string", &Vcanna_kakutei_string /*
*/ );
/* EUC multibyte string to MULE internal string */
static void
-c2mu (char *cp, int l, char *mp)
+c2mu (unsigned char *cp, int l, unsigned char *mp)
{
- 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)
}
*mp++ = *cp++;
}
+#endif
*mp = 0;
}
static void
m2c (unsigned char *mp, int l, unsigned char *cp)
{
- unsigned char ch, *ep = mp + l;;
-
+ 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:
*cp++ = ch;
break;
}
- }
+#endif
+ }
*cp = 0;
}
mule_make_string (unsigned char *p, int l)
{
unsigned char cbuf[4096];
-
+
c2mu (p,l,cbuf);
return (make_string (cbuf,strlen (cbuf)));
-}
+}
/* return the MULE internal string length of EUC string */
/* Modified by sb to return a character count not byte count. */
{
unsigned char ch, *cp = p;
int len = 0;
-
+
while ((cp < p + l) && (ch = *cp))
{
if ((unsigned char) ch == ISO_CODE_SS2)
else
{
len++;
- cp++;
+ cp++;
}
}
return (len);
int *crev)
{
unsigned char *q = p;
-
+
*clen = *cpos = *crev = 0;
if (len == 0) return;
while (q < p + pos)
(*clen)++;
(*crev)++;
if (*q++ & 0x80) q++;
- }
+ }
while (q < p + len)
{
(*clen)++;