diff options
author | drh <drh@noemail.net> | 2015-08-24 12:42:41 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2015-08-24 12:42:41 +0000 |
commit | 80d874083b38c5e24d854a76ab07b791fb0dc2cb (patch) | |
tree | 68771e5a3c21acd785cce145b293793fb02426b5 /ext/misc/json1.c | |
parent | 442a7c601505dc0aec141b1b05450ddb530562e4 (diff) | |
download | sqlite-80d874083b38c5e24d854a76ab07b791fb0dc2cb.tar.gz sqlite-80d874083b38c5e24d854a76ab07b791fb0dc2cb.zip |
Improvements to JSON string dequoting.
FossilOrigin-Name: 196d66d34d9783622e6f2f79eafea1488fc6f5cf
Diffstat (limited to 'ext/misc/json1.c')
-rw-r--r-- | ext/misc/json1.c | 14 |
1 files changed, 5 insertions, 9 deletions
diff --git a/ext/misc/json1.c b/ext/misc/json1.c index 4945826b9..cd4531bcc 100644 --- a/ext/misc/json1.c +++ b/ext/misc/json1.c @@ -454,33 +454,29 @@ static void jsonReturn( } for(i=1, j=0; i<n-1; i++){ char c = z[i]; - if( c!='\\' && z[i+1] ){ + if( c!='\\' ){ zOut[j++] = c; }else{ c = z[++i]; - if( c=='u' && z[1] ){ + if( c=='u' ){ u32 v = 0, k; - for(k=0; k<4 && z[i+1]; i++, k++){ + for(k=0; k<4 && i<n-2; i++, k++){ c = z[i+1]; if( c>='0' && c<='9' ) v = v*16 + c - '0'; else if( c>='A' && c<='F' ) v = v*16 + c - 'A' + 10; else if( c>='a' && c<='f' ) v = v*16 + c - 'a' + 10; else break; } + if( v==0 ) break; if( v<=0x7f ){ zOut[j++] = v; }else if( v<=0x7ff ){ zOut[j++] = 0xc0 | (v>>6); zOut[j++] = 0x80 | (v&0x3f); - }else if( v<=0xffff ){ + }else{ zOut[j++] = 0xe0 | (v>>12); zOut[j++] = 0x80 | ((v>>6)&0x3f); zOut[j++] = 0x80 | (v&0x3f); - }else if( v<=0x10ffff ){ - zOut[j++] = 0xf0 | (v>>18); - zOut[j++] = 0x80 | ((v>>12)&0x3f); - zOut[j++] = 0x80 | ((v>>6)&0x3f); - zOut[j++] = 0x80 | (v&0x3f); } }else{ if( c=='b' ){ |