summaryrefslogtreecommitdiff
path: root/json-glib/json-scanner.c
diff options
context:
space:
mode:
authorEiichi Sato <eiichi.for.public@gmail.com>2010-04-10 01:52:10 +0900
committerEmmanuele Bassi <ebassi@linux.intel.com>2010-04-15 09:27:45 +0100
commitfcd07918d3ed2b31b047900da9d2fed23dddf7da (patch)
treee2a54257aa6056534c3e1be3ef7f1ee6afcf40de /json-glib/json-scanner.c
parent37a7931f91f8d79def3f4895bc349ba621a826a1 (diff)
downloadjson-glib-fcd07918d3ed2b31b047900da9d2fed23dddf7da.tar.gz
Support for surrogate pairs in json string.
https://bugzilla.gnome.org/show_bug.cgi?id=615799 Signed-off-by: Emmanuele Bassi <ebassi@linux.intel.com>
Diffstat (limited to 'json-glib/json-scanner.c')
-rw-r--r--json-glib/json-scanner.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/json-glib/json-scanner.c b/json-glib/json-scanner.c
index 9cd0938..6eca2ba 100644
--- a/json-glib/json-scanner.c
+++ b/json-glib/json-scanner.c
@@ -892,7 +892,7 @@ json_scanner_get_unichar (JsonScanner *scanner,
break;
}
- g_assert (g_unichar_validate (uchar));
+ g_assert (g_unichar_validate (uchar) || g_unichar_type (uchar) == G_UNICODE_SURROGATE);
return uchar;
}
@@ -1439,6 +1439,20 @@ json_scanner_get_token_ll (JsonScanner *scanner,
gunichar ucs;
ucs = json_scanner_get_unichar (scanner, line_p, position_p);
+
+ if (g_unichar_type (ucs) == G_UNICODE_SURROGATE)
+ {
+ /* read next surrogate */
+ if ('\\' == json_scanner_get_char (scanner, line_p, position_p)
+ && 'u' == json_scanner_get_char (scanner, line_p, position_p))
+ {
+ gunichar ucs_lo = json_scanner_get_unichar (scanner, line_p, position_p);
+ g_assert (g_unichar_type (ucs_lo) == G_UNICODE_SURROGATE);
+ ucs = (((ucs & 0x3ff) << 10) | (ucs_lo & 0x3ff)) + 0x10000;
+ }
+ }
+
+ g_assert (g_unichar_validate (ucs));
gstring = g_string_append_unichar (gstring, ucs);
}
break;