summaryrefslogtreecommitdiff
path: root/xs_json.h
diff options
context:
space:
mode:
Diffstat (limited to 'xs_json.h')
-rw-r--r--xs_json.h19
1 files changed, 15 insertions, 4 deletions
diff --git a/xs_json.h b/xs_json.h
index a9577ee..6f42eab 100644
--- a/xs_json.h
+++ b/xs_json.h
@@ -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