X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fmule-charset.c;h=0a4b0ed313fea25047574b7731c5b37273bb4260;hb=9a54074238a035dbf783b24383f640d215ec8894;hp=a941f9bdf6c720cd444dc9f146e263c21d8726e2;hpb=9c50bd77ac02bb990563e5b2e0716ac395fd8af7;p=chise%2Fxemacs-chise.git diff --git a/src/mule-charset.c b/src/mule-charset.c index a941f9b..0a4b0ed 100644 --- a/src/mule-charset.c +++ b/src/mule-charset.c @@ -441,8 +441,13 @@ print_charset (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag) write_c_string (buf, printcharfun); } +static const struct lrecord_description charset_description[] = { + { XD_LISP_OBJECT, offsetof(struct Lisp_Charset, name), 7 }, + { XD_END } +}; + DEFINE_LRECORD_IMPLEMENTATION ("charset", charset, - mark_charset, print_charset, 0, 0, 0, + mark_charset, print_charset, 0, 0, 0, charset_description, struct Lisp_Charset); /* Make a new charset. */ @@ -1050,7 +1055,10 @@ Set the 'registry property of CHARSET to REGISTRY. /************************************************************************/ DEFUN ("make-char", Fmake_char, 2, 3, 0, /* -Make a multi-byte character from CHARSET and octets ARG1 and ARG2. +Make a character from CHARSET and octets ARG1 and ARG2. +ARG2 is required only for characters from two-dimensional charsets. +For example, (make-char 'latin-iso8859-2 185) will return the Latin 2 +character s with caron. */ (charset, arg1, arg2)) { @@ -1067,7 +1075,11 @@ Make a multi-byte character from CHARSET and octets ARG1 and ARG2. else /* CHARSET_CHARS (cs) == 96) */ lowlim = 32, highlim = 127; CHECK_INT (arg1); - a1 = XINT (arg1); + /* It is useful (and safe, according to Olivier Galibert) to strip + the 8th bit off ARG1 and ARG2 becaue it allows programmers to + write (make-char 'latin-iso8859-2 CODE) where code is the actual + Latin 2 code of the character. */ + a1 = XINT (arg1) & 0x7f; if (a1 < lowlim || a1 > highlim) args_out_of_range_3 (arg1, make_int (lowlim), make_int (highlim)); @@ -1080,7 +1092,7 @@ Make a multi-byte character from CHARSET and octets ARG1 and ARG2. } CHECK_INT (arg2); - a2 = XINT (arg2); + a2 = XINT (arg2) & 0x7f; if (a2 < lowlim || a2 > highlim) args_out_of_range_3 (arg2, make_int (lowlim), make_int (highlim)); @@ -1098,27 +1110,33 @@ Return the character set of char CH. (CHAR_LEADING_BYTE (XCHAR (ch)))); } -DEFUN ("char-octet", Fchar_octet, 1, 2, 0, /* -Return the octet numbered N (should be 0 or 1) of char CH. -N defaults to 0 if omitted. +DEFUN ("split-char", Fsplit_char, 1, 1, 0, /* +Return list of charset and one or two position-codes of CHAR. */ - (ch, n)) + (character)) { - Lisp_Object charset; - int c1, c2, int_n; + /* This function can GC */ + struct gcpro gcpro1, gcpro2; + Lisp_Object charset = Qnil; + Lisp_Object rc = Qnil; + int c1, c2; - CHECK_CHAR_COERCE_INT (ch); - if (NILP (n)) - int_n = 0; + GCPRO2 (charset, rc); + CHECK_CHAR_COERCE_INT (character); + + BREAKUP_CHAR (XCHAR (character), charset, c1, c2); + + if (XCHARSET_DIMENSION (Fget_charset (charset)) == 2) + { + rc = list3 (XCHARSET_NAME (charset), make_int (c1), make_int (c2)); + } else { - CHECK_INT (n); - int_n = XINT (n); - if (int_n != 0 && int_n != 1) - signal_simple_error ("Octet number must be 0 or 1", n); + rc = list2 (XCHARSET_NAME (charset), make_int (c1)); } - BREAKUP_CHAR (XCHAR (ch), charset, c1, c2); - return make_int (int_n == 0 ? c1 : c2); + UNGCPRO; + + return rc; } @@ -1223,7 +1241,7 @@ syms_of_mule_charset (void) DEFSUBR (Fmake_char); DEFSUBR (Fchar_charset); - DEFSUBR (Fchar_octet); + DEFSUBR (Fsplit_char); #ifdef ENABLE_COMPOSITE_CHARS DEFSUBR (Fmake_composite_char);