aboutsummaryrefslogtreecommitdiff
path: root/src/json.c
diff options
context:
space:
mode:
authordrh <>2023-04-27 12:24:00 +0000
committerdrh <>2023-04-27 12:24:00 +0000
commitf59c01e24cb3146f5e5ec6ccb73731a8a365b6c5 (patch)
treef86f0405a56d3364d093c7e5205233d5deacced2 /src/json.c
parentc5ee2d8e8076b03a1d5d50f89c62a9d1ddbb2a5f (diff)
downloadsqlite-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.c36
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, '"');
}