diff options
Diffstat (limited to 'xs_json.h')
| -rw-r--r-- | xs_json.h | 19 |
1 files changed, 15 insertions, 4 deletions
| @@ -255,6 +255,9 @@ static xs_val *_xs_json_load_lexer(FILE *f, js_type *t) | |||
| 255 | case 'n': cp = '\n'; break; | 255 | case 'n': cp = '\n'; break; |
| 256 | case 'r': cp = '\r'; break; | 256 | case 'r': cp = '\r'; break; |
| 257 | case 't': cp = '\t'; break; | 257 | case 't': cp = '\t'; break; |
| 258 | case '"': cp = '"'; break; | ||
| 259 | case '\\': cp = '\\'; break; | ||
| 260 | case '/': cp = '/'; break; | ||
| 258 | case 'u': /* Unicode codepoint as an hex char */ | 261 | case 'u': /* Unicode codepoint as an hex char */ |
| 259 | if (fscanf(f, "%04x", &cp) != 1) { | 262 | if (fscanf(f, "%04x", &cp) != 1) { |
| 260 | *t = JS_ERROR; | 263 | *t = JS_ERROR; |
| @@ -282,20 +285,28 @@ static xs_val *_xs_json_load_lexer(FILE *f, js_type *t) | |||
| 282 | cp += 0x2400; | 285 | cp += 0x2400; |
| 283 | 286 | ||
| 284 | break; | 287 | break; |
| 288 | |||
| 289 | default: | ||
| 290 | *t = JS_ERROR; | ||
| 291 | break; | ||
| 285 | } | 292 | } |
| 286 | 293 | ||
| 287 | v = xs_utf8_insert(v, cp, &offset); | 294 | v = xs_utf8_insert(v, cp, &offset); |
| 288 | } | 295 | } |
| 289 | else { | 296 | else { |
| 290 | char cc = c; | 297 | if (c >= 0 && c < ' ') { |
| 291 | v = xs_insert_m(v, offset, &cc, 1); | 298 | v = xs_utf8_insert(v, c + 0x2400, &offset); |
| 299 | } | ||
| 300 | else { | ||
| 301 | char cc = c; | ||
| 302 | v = xs_insert_m(v, offset, &cc, 1); | ||
| 303 | offset++; | ||
| 304 | } | ||
| 292 | 305 | ||
| 293 | if (!xs_is_string(v)) { | 306 | if (!xs_is_string(v)) { |
| 294 | *t = JS_ERROR; | 307 | *t = JS_ERROR; |
| 295 | break; | 308 | break; |
| 296 | } | 309 | } |
| 297 | |||
| 298 | offset++; | ||
| 299 | } | 310 | } |
| 300 | } | 311 | } |
| 301 | 312 | ||