diff options
author | Florian Frank <flori@ping.de> | 2009-11-07 14:45:06 +0100 |
---|---|---|
committer | Florian Frank <flori@ping.de> | 2009-11-07 14:45:06 +0100 |
commit | cb8e702b2408e1e8a21607e443e6a69e3050939d (patch) | |
tree | e57d7ba42a90114d0b6f90f0a31f78c66c3c4439 | |
parent | 66f233eaad0f745463d50e3efdc0ea0d9c56fc1e (diff) | |
parent | af6975e9b627a00e8010683ae50bb862ce65d967 (diff) | |
download | json-cb8e702b2408e1e8a21607e443e6a69e3050939d.tar.gz |
Merge branch 'opti'
-rw-r--r-- | ext/json/ext/generator/unicode.c | 74 |
1 files changed, 40 insertions, 34 deletions
diff --git a/ext/json/ext/generator/unicode.c b/ext/json/ext/generator/unicode.c index 181f807..cece042 100644 --- a/ext/json/ext/generator/unicode.c +++ b/ext/json/ext/generator/unicode.c @@ -199,49 +199,55 @@ inline void convert_UTF8_to_JSON(FBuffer *buffer, VALUE string) int len = RSTRING_LEN(string), start = 0, end = 0; const char *escape = NULL; int escape_len; + unsigned char c; char buf[6] = { '\\', 'u' }; for (start = 0, end = 0; end < len;) { p = ptr + end; - switch (*p) { - case '\n': - escape = "\\n"; - escape_len = 2; - break; - case '\r': - escape = "\\r"; - escape_len = 2; - break; - case '\\': - escape = "\\\\"; - escape_len = 2; - break; - case '"': - escape = "\\\""; - escape_len = 2; - break; - case '\t': - escape = "\\t"; - escape_len = 2; - break; - case '\f': - escape = "\\f"; - escape_len = 2; - break; - case '\b': - escape = "\\b"; - escape_len = 2; - break; - default: - if ((unsigned char) *p < 0x20) { + c = (unsigned char) *p; + if (c < 0x20) { + switch (c) { + case '\n': + escape = "\\n"; + escape_len = 2; + break; + case '\r': + escape = "\\r"; + escape_len = 2; + break; + case '\t': + escape = "\\t"; + escape_len = 2; + break; + case '\f': + escape = "\\f"; + escape_len = 2; + break; + case '\b': + escape = "\\b"; + escape_len = 2; + break; + default: unicode_escape(buf, (UTF16) *p); escape = buf; escape_len = 6; - } else { + break; + } + } else { + switch (c) { + case '\\': + escape = "\\\\"; + escape_len = 2; + break; + case '"': + escape = "\\\""; + escape_len = 2; + break; + default: end++; continue; - } - break; + break; + } } fbuffer_append(buffer, ptr + start, end - start); fbuffer_append(buffer, escape, escape_len); |