# HG changeset patch # User Kenichi Handa # Date 1044779856 0 # Node ID 46090ea2c5c3ef372c7c873ec3c6fa1a9f925a5f # Parent 9ae045dbc3372bcba9f1a2c0d501625ce36c4837 (string_to_multibyte): New function. (Fstring_to_multibyte): New function. (syms_of_fns): Defsubr it. diff -r 9ae045dbc337 -r 46090ea2c5c3 src/fns.c --- a/src/fns.c Sun Feb 09 01:46:04 2003 +0000 +++ b/src/fns.c Sun Feb 09 08:37:36 2003 +0000 @@ -1035,6 +1035,37 @@ return make_multibyte_string (buf, SCHARS (string), nbytes); } + +/* Convert STRING to a multibyte string without changing each + character codes. Thus, characters 0200 trough 0237 are converted + to eight-bit-control characters, and characters 0240 through 0377 + are converted eight-bit-graphic characters. */ + +Lisp_Object +string_to_multibyte (string) + Lisp_Object string; +{ + unsigned char *buf; + int nbytes; + int i; + + if (STRING_MULTIBYTE (string)) + return string; + + nbytes = parse_str_to_multibyte (SDATA (string), SBYTES (string)); + /* If all the chars are ASCII, they won't need any more bytes + once converted. In that case, we can return STRING itself. */ + if (nbytes == SBYTES (string)) + return string; + + buf = (unsigned char *) alloca (nbytes); + bcopy (SDATA (string), buf, SBYTES (string)); + str_to_multibyte (buf, nbytes, SBYTES (string)); + + return make_multibyte_string (buf, SCHARS (string), nbytes); +} + + /* Convert STRING to a single-byte string. */ Lisp_Object @@ -1140,6 +1171,24 @@ } return string; } + +DEFUN ("string-to-multibyte", Fstring_to_multibyte, Sstring_to_multibyte, + 1, 1, 0, + doc: /* Return a multibyte string with the same individual chars as STRING. +If STRING is multibyte, the resutl is STRING itself. +Otherwise it is a newly created string, with no text properties. +Characters 0200 through 0237 are converted to eight-bit-control +characters of the same character code. Characters 0240 through 0377 +are converted to eight-bit-control characters of the same character +codes. */) + (string) + Lisp_Object string; +{ + CHECK_STRING (string); + + return string_to_multibyte (string); +} + DEFUN ("copy-alist", Fcopy_alist, Scopy_alist, 1, 1, 0, doc: /* Return a copy of ALIST. @@ -5545,6 +5594,7 @@ defsubr (&Sstring_make_unibyte); defsubr (&Sstring_as_multibyte); defsubr (&Sstring_as_unibyte); + defsubr (&Sstring_to_multibyte); defsubr (&Scopy_alist); defsubr (&Ssubstring); defsubr (&Ssubstring_no_properties);