diff options
author | Mike Pall <mike> | 2015-08-29 23:58:28 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2015-08-30 00:10:15 +0200 |
commit | 55c3b29f7b20f3801848e0ab71e9de1d22207b95 (patch) | |
tree | 133d38b282623935b050a6eb799f8bcf22cabdff /src | |
parent | a3a6866d4c2cc096b478c8f81b73a3b818034b89 (diff) | |
download | luajit-55c3b29f7b20f3801848e0ab71e9de1d22207b95.tar.gz luajit-55c3b29f7b20f3801848e0ab71e9de1d22207b95.tar.bz2 luajit-55c3b29f7b20f3801848e0ab71e9de1d22207b95.zip |
Parse Unicode string escape \u{XX...}.
Thanks to drbo.
Diffstat (limited to 'src')
-rw-r--r-- | src/lj_lex.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/src/lj_lex.c b/src/lj_lex.c index 8409cd78..5a918f74 100644 --- a/src/lj_lex.c +++ b/src/lj_lex.c | |||
@@ -214,6 +214,33 @@ static void lex_string(LexState *ls, TValue *tv) | |||
214 | c += 9; | 214 | c += 9; |
215 | } | 215 | } |
216 | break; | 216 | break; |
217 | case 'u': /* Unicode escape '\u{XX...}'. */ | ||
218 | if (lex_next(ls) != '{') goto err_xesc; | ||
219 | lex_next(ls); | ||
220 | c = 0; | ||
221 | do { | ||
222 | c = (c << 4) | (ls->c & 15u); | ||
223 | if (!lj_char_isdigit(ls->c)) { | ||
224 | if (!lj_char_isxdigit(ls->c)) goto err_xesc; | ||
225 | c += 9; | ||
226 | } | ||
227 | if (c >= 0x110000) goto err_xesc; /* Out of Unicode range. */ | ||
228 | } while (lex_next(ls) != '}'); | ||
229 | if (c < 0x800) { | ||
230 | if (c < 0x80) break; | ||
231 | lex_save(ls, 0xc0 | (c >> 6)); | ||
232 | } else { | ||
233 | if (c >= 0x10000) { | ||
234 | lex_save(ls, 0xf0 | (c >> 18)); | ||
235 | lex_save(ls, 0x80 | ((c >> 12) & 0x3f)); | ||
236 | } else { | ||
237 | if (c >= 0xd800 && c < 0xe000) goto err_xesc; /* No surrogates. */ | ||
238 | lex_save(ls, 0xe0 | (c >> 12)); | ||
239 | } | ||
240 | lex_save(ls, 0x80 | ((c >> 6) & 0x3f)); | ||
241 | } | ||
242 | c = 0x80 | (c & 0x3f); | ||
243 | break; | ||
217 | case 'z': /* Skip whitespace. */ | 244 | case 'z': /* Skip whitespace. */ |
218 | lex_next(ls); | 245 | lex_next(ls); |
219 | while (lj_char_isspace(ls->c)) | 246 | while (lj_char_isspace(ls->c)) |