Mercurial > emacs
changeset 100759:fd802fcbb882
(font_intern_prop): Validate str as multibyte.
author | Kenichi Handa <handa@m17n.org> |
---|---|
date | Tue, 30 Dec 2008 00:46:01 +0000 |
parents | de8e6ec1f29a |
children | c8c3813f6b68 |
files | src/font.c |
diffstat | 1 files changed, 15 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/src/font.c Mon Dec 29 19:19:26 2008 +0000 +++ b/src/font.c Tue Dec 30 00:46:01 2008 +0000 @@ -254,6 +254,7 @@ int i; Lisp_Object tem; Lisp_Object obarray; + int nbytes, nchars; if (len == 1 && *str == '*') return Qnil; @@ -266,14 +267,25 @@ return make_number (atoi (str)); } - /* The following code is copied from the function intern (in lread.c). */ + /* The following code is copied from the function intern (in + lread.c), and modified to suite our purpose. */ obarray = Vobarray; if (!VECTORP (obarray) || XVECTOR (obarray)->size == 0) obarray = check_obarray (obarray); - tem = oblookup (obarray, str, len, len); + parse_str_as_multibyte (str, len, &nchars, &nbytes); + if (len == nchars || len != nbytes) + /* CONTENTS contains no multibyte sequences or contains an invalid + multibyte sequence. We'll make a unibyte string. */ + tem = oblookup (obarray, str, len, len); + else + tem = oblookup (obarray, str, nchars, len); if (SYMBOLP (tem)) return tem; - return Fintern (make_unibyte_string (str, len), obarray); + if (len == nchars || len != nbytes) + tem = make_unibyte_string (str, len); + else + tem = make_multibyte_string (str, nchars, len); + return Fintern (tem, obarray); } /* Return a pixel size of font-spec SPEC on frame F. */