buffer-builder 0.2.4.2 → 0.2.4.3
raw patch · 4 files changed
+32/−8 lines, 4 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Data.BufferBuilder.Json: infixr 8 `row`
Files
- buffer-builder.cabal +1/−1
- cbits/buffer.cpp +25/−7
- changelog.md +4/−0
- test/JsonTest.hs +2/−0
buffer-builder.cabal view
@@ -1,5 +1,5 @@ name: buffer-builder-version: 0.2.4.2+version: 0.2.4.3 synopsis: Library for efficiently building up buffers, one piece at a time description:
cbits/buffer.cpp view
@@ -37,6 +37,10 @@ namespace {+ static const unsigned char DEC2HEX[16] = {+ '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'+ };+ struct BufferWriter { unsigned char* end; // the most commonly-accessed field unsigned char* capacity;@@ -269,14 +273,20 @@ case '\t': rv += 2; break; case '\\': rv += 2; break; case '\"': rv += 2; break;- default: rv += 1; break;+ default:+ if (data[i] <= 0x1F) {+ rv += 6;+ } else {+ rv += 1;+ }+ break; } } return rv; } extern "C" void bw_append_json_escaped(BufferWriter* bw, size_t size, const unsigned char* data) {- BW_ENSURE_CAPACITY(bw, 2 + size * 2, count_escaped_json_length(size, data));+ BW_ENSURE_CAPACITY(bw, 2 + size * 6, count_escaped_json_length(size, data)); unsigned char* dest = bw->end; *dest++ = '\"';@@ -289,7 +299,19 @@ case '\t': *dest++ = '\\'; *dest++ = 't'; break; case '\\': *dest++ = '\\'; *dest++ = '\\'; break; case '\"': *dest++ = '\\'; *dest++ = '\"'; break;- default: *dest++ = data[i]; break;+ default:+ unsigned char d = data[i];+ if (d <= 0x1F) {+ *dest++ = '\\';+ *dest++ = 'u';+ *dest++ = '0';+ *dest++ = '0';+ *dest++ = DEC2HEX[d >> 4];+ *dest++ = DEC2HEX[d & 0xF];+ } else {+ *dest++ = d;+ }+ break; } ++i; }@@ -434,10 +456,6 @@ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0-};--static const unsigned char DEC2HEX[16] = {- '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f' }; inline size_t count_url_encoded_length(size_t size, const unsigned char* data) {
changelog.md view
@@ -1,3 +1,7 @@+0.2.4.3++* Fix a bug where control characters (codepoints 1 through 31) were not being escaped.+ 0.2.4.2 * Include test.json in sdist so benchmarks can be run from Hackage. (Thanks Ryan Scott!)
test/JsonTest.hs view
@@ -38,6 +38,8 @@ ae "\"\\\"\\\\\\n\\r\\t\"" (encodeJson (fromString ['\"', '\\', '\n', '\r', '\t'] :: Text)) + ae "\"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\u0008\\t\\n\\u000b\\u000c\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f\"" (encodeJson (fromString $ map toEnum [0..31] :: Text))+ test_encode_object :: IO () test_encode_object = do ae "{\"key\":\"value\"}" (encodeJson ("key" .= ("value" :: Text)))