diff options
author | drh <> | 2023-04-27 12:24:00 +0000 |
---|---|---|
committer | drh <> | 2023-04-27 12:24:00 +0000 |
commit | f59c01e24cb3146f5e5ec6ccb73731a8a365b6c5 (patch) | |
tree | f86f0405a56d3364d093c7e5205233d5deacced2 /src/json.c | |
parent | c5ee2d8e8076b03a1d5d50f89c62a9d1ddbb2a5f (diff) | |
download | sqlite-f59c01e24cb3146f5e5ec6ccb73731a8a365b6c5.tar.gz sqlite-f59c01e24cb3146f5e5ec6ccb73731a8a365b6c5.zip |
Translate JSON5-only string literal escape sequences into the JSON equivalents.
FossilOrigin-Name: 14e82f36eed31af1237898728bf353b968523c62b1f8d1d90dbbabd92d0c2834
Diffstat (limited to 'src/json.c')
-rw-r--r-- | src/json.c | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/src/json.c b/src/json.c index 3e2d6646d..0cbcac3c4 100644 --- a/src/json.c +++ b/src/json.c @@ -302,8 +302,42 @@ static void jsonAppendString(JsonString *p, const char *zIn, u32 N){ ** features. */ static void jsonAppendNormalizedString(JsonString *p, const char *zIn, u32 N){ + int i; jsonAppendChar(p, '"'); - jsonAppendRaw(p, &zIn[1], N-2); /* TODO: translate JSON5 escapes */ + zIn++; + N -= 2; + while( N>0 ){ + for(i=0; i<N && zIn[i]!='\\'; i++){} + if( i>0 ){ + jsonAppendRaw(p, zIn, i); + zIn += i; + N -= i; + if( N==0 ) break; + } + assert( zIn[0]=='\\' ); + switch( zIn[1] ){ + case '\'': + jsonAppendChar(p, '\''); + break; + case 'v': + jsonAppendRaw(p, "\\u0009", 6); + break; + case 'x': + jsonAppendRaw(p, "\\u00", 4); + jsonAppendRaw(p, &zIn[2], 2); + zIn += 2; + N -= 2; + break; + case '0': + jsonAppendRaw(p, "\\u0000", 6); + break; + default: + jsonAppendRaw(p, zIn, 2); + break; + } + zIn += 2; + N -= 2; + } jsonAppendChar(p, '"'); } |