X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/ab5796a9f97180707734a81320e3eb81937281fe..73f0d9965568d40bc84eaa82ca6c3e55eac82e8f:/src/charset.c diff --git a/src/charset.c b/src/charset.c index 7015213935..c03107a9c4 100644 --- a/src/charset.c +++ b/src/charset.c @@ -1,7 +1,7 @@ /* Basic multilingual character support. Copyright (C) 1995, 1997, 1998 Electrotechnical Laboratory, JAPAN. Licensed to the Free Software Foundation. - Copyright (C) 2001 Free Software Foundation, Inc. + Copyright (C) 2001, 2004 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -730,7 +730,7 @@ It includes a generic character for a charset not yet defined. */) DEFUN ("get-unused-iso-final-char", Fget_unused_iso_final_char, Sget_unused_iso_final_char, 2, 2, 0, - doc: /* Return an unsed ISO's final char for a charset of DIMENISION and CHARS. + doc: /* Return an unused ISO's final char for a charset of DIMENSION and CHARS. DIMENSION is the number of bytes to represent a character: 1 or 2. CHARS is the number of characters in a dimension: 94 or 96. @@ -760,17 +760,20 @@ return nil. */) DEFUN ("declare-equiv-charset", Fdeclare_equiv_charset, Sdeclare_equiv_charset, 4, 4, 0, - doc: /* Declare a charset of DIMENSION, CHARS, FINAL-CHAR is the same as CHARSET. -CHARSET should be defined by `defined-charset' in advance. */) - (dimension, chars, final_char, charset_symbol) - Lisp_Object dimension, chars, final_char, charset_symbol; + doc: /* Declare an equivalent charset for ISO-2022 decoding. + +On decoding by an ISO-2022 base coding system, when a charset +specified by DIMENSION, CHARS, and FINAL-CHAR is designated, behave as +if CHARSET is designated instead. */) + (dimension, chars, final_char, charset) + Lisp_Object dimension, chars, final_char, charset; { - int charset; + int charset_id; CHECK_NUMBER (dimension); CHECK_NUMBER (chars); CHECK_NUMBER (final_char); - CHECK_SYMBOL (charset_symbol); + CHECK_SYMBOL (charset); if (XINT (dimension) != 1 && XINT (dimension) != 2) error ("Invalid DIMENSION %d, it should be 1 or 2", XINT (dimension)); @@ -778,10 +781,10 @@ CHARSET should be defined by `defined-charset' in advance. */) error ("Invalid CHARS %d, it should be 94 or 96", XINT (chars)); if (XINT (final_char) < '0' || XFASTINT (final_char) > '~') error ("Invalid FINAL-CHAR %c, it should be `0'..`~'", XINT (chars)); - if ((charset = get_charset_id (charset_symbol)) < 0) - error ("Invalid charset %s", SDATA (SYMBOL_NAME (charset_symbol))); + if ((charset_id = get_charset_id (charset)) < 0) + error ("Invalid charset %s", SDATA (SYMBOL_NAME (charset))); - ISO_CHARSET_TABLE (dimension, chars, final_char) = charset; + ISO_CHARSET_TABLE (dimension, chars, final_char) = charset_id; return Qnil; } @@ -1025,9 +1028,9 @@ Internal use only. */) } DEFUN ("split-char", Fsplit_char, Ssplit_char, 1, 1, 0, - doc: /* Return list of charset and one or two position-codes of CHAR. -If CHAR is invalid as a character code, -return a list of symbol `unknown' and CHAR. */) + doc: /* Return list of charset and one or two position-codes of CH. +If CH is invalid as a character code, +return a list of symbol `unknown' and CH. */) (ch) Lisp_Object ch; { @@ -1045,7 +1048,7 @@ return a list of symbol `unknown' and CHAR. */) } DEFUN ("char-charset", Fchar_charset, Schar_charset, 1, 1, 0, - doc: /* Return charset of CHAR. */) + doc: /* Return charset of CH. */) (ch) Lisp_Object ch; { @@ -1176,7 +1179,7 @@ The conversion is done based on `nonascii-translation-table' (which see) } DEFUN ("char-bytes", Fchar_bytes, Schar_bytes, 1, 1, 0, - doc: /* Return 1 regardless of the argument CHAR. */) + doc: /* Return 1 regardless of the argument CH. */) (ch) Lisp_Object ch; { @@ -1220,7 +1223,7 @@ char_bytes (c) : 4)))) DEFUN ("char-width", Fchar_width, Schar_width, 1, 1, 0, - doc: /* Return width of CHAR when displayed in the current buffer. + doc: /* Return width of CH when displayed in the current buffer. The width is measured by how many columns it occupies on the screen. Tab is taken to occupy `tab-width' columns. */) (ch) @@ -1403,18 +1406,18 @@ When calculating width of a multibyte character in STRING, only the base leading-code is considered; the validity of the following bytes is not checked. Tabs in STRING are always taken to occupy `tab-width' columns. */) - (str) - Lisp_Object str; + (string) + Lisp_Object string; { Lisp_Object val; - CHECK_STRING (str); - XSETFASTINT (val, lisp_string_width (str, -1, NULL, NULL)); + CHECK_STRING (string); + XSETFASTINT (val, lisp_string_width (string, -1, NULL, NULL)); return val; } DEFUN ("char-direction", Fchar_direction, Schar_direction, 1, 1, 0, - doc: /* Return the direction of CHAR. + doc: /* Return the direction of CH. The returned value is 0 for left-to-right and 1 for right-to-left. */) (ch) Lisp_Object ch; @@ -1642,11 +1645,16 @@ usage: (string &rest CHARACTERS) */) int n; Lisp_Object *args; { - int i; - unsigned char *buf = (unsigned char *) alloca (MAX_MULTIBYTE_LENGTH * n); - unsigned char *p = buf; + int i, bufsize; + unsigned char *buf, *p; int c; int multibyte = 0; + Lisp_Object ret; + USE_SAFE_ALLOCA; + + bufsize = MAX_MULTIBYTE_LENGTH * n; + SAFE_ALLOCA (buf, unsigned char *, bufsize); + p = buf; for (i = 0; i < n; i++) { @@ -1664,7 +1672,10 @@ usage: (string &rest CHARACTERS) */) *p++ = c; } - return make_string_from_bytes (buf, n, p - buf); + ret = make_string_from_bytes (buf, n, p - buf); + SAFE_FREE (); + + return ret; } #endif /* emacs */