Index: runtime/platform/json.cc |
=================================================================== |
--- runtime/platform/json.cc (revision 9716) |
+++ runtime/platform/json.cc (working copy) |
@@ -376,46 +376,83 @@ |
} |
+void TextBuffer::PrintEscapedChar(uint32_t cp) { |
+ switch (cp) { |
+ case '"': |
+ Printf("%s", "\\\""); |
+ break; |
+ case '\\': |
+ Printf("%s", "\\\\"); |
+ break; |
+ case '/': |
+ Printf("%s", "\\/"); |
+ break; |
+ case '\b': |
+ Printf("%s", "\\b"); |
+ break; |
+ case '\f': |
+ Printf("%s", "\\f"); |
+ break; |
+ case '\n': |
+ Printf("%s", "\\n"); |
+ break; |
+ case '\r': |
+ Printf("%s", "\\r"); |
+ break; |
+ case '\t': |
+ Printf("%s", "\\t"); |
+ break; |
+ default: |
+ if ((0x20 <= cp) && (cp <= 0x7e)) { |
+ Printf("%c", cp); |
+ } else if (cp <= 0xffff) { |
+ // Encode character as \uHHHH. |
+ uint8_t digit0 = (cp & 0xf000) >> 12; |
+ uint8_t digit1 = (cp & 0x0f00) >> 8; |
+ uint8_t digit2 = (cp & 0x00f0) >> 4; |
+ uint8_t digit3 = (cp & 0x000f); |
+ Printf("\\u%c%c%c%c", |
+ digit0 > 9 ? 'A' + (digit0 - 10) : '0' + digit0, |
siva
2012/07/18 17:11:31
We have a Utils::IntToHexDigit(..) function for th
hausner
2012/07/18 22:20:36
Ok, but that function contains an assert that the
|
+ digit1 > 9 ? 'A' + (digit1 - 10) : '0' + digit1, |
+ digit2 > 9 ? 'A' + (digit2 - 10) : '0' + digit2, |
+ digit3 > 9 ? 'A' + (digit3 - 10) : '0' + digit3); |
+ } else { |
+ // Non-standard 32 bit character escape code of format \UHHHHHHHH. |
+ uint8_t digit0 = (cp & 0xf0000000) >> 28; |
+ uint8_t digit1 = (cp & 0x0f000000) >> 24; |
+ uint8_t digit2 = (cp & 0x00f00000) >> 20; |
+ uint8_t digit3 = (cp & 0x000f0000) >> 16; |
+ uint8_t digit4 = (cp & 0x0000f000) >> 12; |
+ uint8_t digit5 = (cp & 0x00000f00) >> 8; |
+ uint8_t digit6 = (cp & 0x000000f0) >> 4; |
+ uint8_t digit7 = (cp & 0x0000000f); |
+ Printf("\\u%c%c%c%c%c%c%c%c", |
+ digit0 > 9 ? 'A' + (digit0 - 10) : '0' + digit0, |
+ digit1 > 9 ? 'A' + (digit1 - 10) : '0' + digit1, |
+ digit2 > 9 ? 'A' + (digit2 - 10) : '0' + digit2, |
+ digit3 > 9 ? 'A' + (digit3 - 10) : '0' + digit3, |
+ digit4 > 9 ? 'A' + (digit4 - 10) : '0' + digit4, |
+ digit5 > 9 ? 'A' + (digit5 - 10) : '0' + digit5, |
+ digit6 > 9 ? 'A' + (digit6 - 10) : '0' + digit6, |
+ digit7 > 9 ? 'A' + (digit7 - 10) : '0' + digit7); |
+ } |
+ } |
+} |
+ |
+ |
+void TextBuffer::PrintJsonString32(const uint32_t* codepoints, |
+ intptr_t length) { |
+ for (intptr_t i = 0; i < length; i++) { |
+ uint32_t cp = codepoints[i]; |
+ PrintEscapedChar(cp); |
+ } |
+} |
+ |
+ |
void TextBuffer::PrintJsonString8(const uint8_t* codepoints, intptr_t length) { |
for (intptr_t i = 0; i < length; i++) { |
uint8_t cp = codepoints[i]; |
- switch (cp) { |
- case '"': |
- Printf("%s", "\\\""); |
- break; |
- case '\\': |
- Printf("%s", "\\\\"); |
- break; |
- case '/': |
- Printf("%s", "\\/"); |
- break; |
- case '\b': |
- Printf("%s", "\\b"); |
- break; |
- case '\f': |
- Printf("%s", "\\f"); |
- break; |
- case '\n': |
- Printf("%s", "\\n"); |
- break; |
- case '\r': |
- Printf("%s", "\\r"); |
- break; |
- case '\t': |
- Printf("%s", "\\t"); |
- break; |
- default: |
- if ((0x20 <= cp) && (cp <= 0x7e)) { |
- Printf("%c", cp); |
- } else { |
- // Encode character as \u00HH. |
- uint8_t digit2 = (cp & 0xf0) >> 4; |
- uint8_t digit3 = cp & 0xf; |
- Printf("\\u00%c%c", |
- digit2 > 9 ? 'A' + (digit2 - 10) : '0' + digit2, |
- digit3 > 9 ? 'A' + (digit3 - 10) : '0' + digit3); |
- } |
- } |
+ PrintEscapedChar(cp); |
} |
} |