From: Kenichi Handa Date: Wed, 25 Jun 2008 02:43:59 +0000 (+0000) Subject: (Fstring_to_unibyte): New function. X-Git-Tag: emacs-pretest-23.0.90~4531 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=b4480f1678bbda4bea13cff29d79a13b18f1df9f;p=emacs.git (Fstring_to_unibyte): New function. (syms_of_fns): Defsubr it. --- diff --git a/src/fns.c b/src/fns.c index b4c84b16f70..7511eacb03a 100644 --- a/src/fns.c +++ b/src/fns.c @@ -1131,6 +1131,35 @@ correct sequence. */) return string_to_multibyte (string); } +DEFUN ("string-to-unibyte", Fstring_to_unibyte, Sstring_to_unibyte, + 1, 2, 0, + doc: /* Return a unibyte string with the same individual chars as STRING. +If STRING is unibyte, the result is STRING itself. +Otherwise it is a newly created string, with no text properties, +where each `eight-bit' character is converted to the corresponding byte. +If STRING contains a non-ASCII, non-`eight-bit' character, +an error is signaled. +If the optional 2nd arg ACCEPT-LATIN-1 is non-nil, a Latin-1 character +doesn't cause an error, but is converted to a byte of same code. */) + (string, accept_latin_1) + Lisp_Object string, accept_latin_1; +{ + CHECK_STRING (string); + + if (STRING_MULTIBYTE (string)) + { + EMACS_INT chars = SCHARS (string); + unsigned char *str = (unsigned char *) xmalloc (chars); + EMACS_INT converted = str_to_unibyte (SDATA (string), str, chars, + ! NILP (accept_latin_1)); + if (converted < chars) + error ("Can't convert the %dth character to unibyte", converted); + string = make_unibyte_string (str, chars); + xfree (str); + } + return string; +} + DEFUN ("copy-alist", Fcopy_alist, Scopy_alist, 1, 1, 0, doc: /* Return a copy of ALIST. @@ -5235,6 +5264,7 @@ both `use-dialog-box' and this variable are non-nil. */); defsubr (&Sstring_as_multibyte); defsubr (&Sstring_as_unibyte); defsubr (&Sstring_to_multibyte); + defsubr (&Sstring_to_unibyte); defsubr (&Scopy_alist); defsubr (&Ssubstring); defsubr (&Ssubstring_no_properties);