mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-11 14:38:29 +01:00
Squashed 'src/univalue/' changes from 2740c4f..f32df99
f32df99 Merge branch '2016_04_unicode' into bitcoin 280b191 Merge remote-tracking branch 'jgarzik/master' into bitcoin c9a716c Handle UTF-8 bed8dd9 Version 1.0.2. 5e7985a Merge pull request #14 from laanwj/2015_11_escape_plan git-subtree-dir: src/univalue git-subtree-split: f32df99e96d99ab49e5eeda16cac93747d388245
This commit is contained in:
@@ -6,6 +6,7 @@
|
||||
#include <vector>
|
||||
#include <stdio.h>
|
||||
#include "univalue.h"
|
||||
#include "univalue_utffilter.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
@@ -174,41 +175,31 @@ enum jtokentype getJsonToken(string& tokenVal, unsigned int& consumed,
|
||||
raw++; // skip "
|
||||
|
||||
string valStr;
|
||||
JSONUTF8StringFilter writer(valStr);
|
||||
|
||||
while (*raw) {
|
||||
if (*raw < 0x20)
|
||||
if ((unsigned char)*raw < 0x20)
|
||||
return JTOK_ERR;
|
||||
|
||||
else if (*raw == '\\') {
|
||||
raw++; // skip backslash
|
||||
|
||||
switch (*raw) {
|
||||
case '"': valStr += "\""; break;
|
||||
case '\\': valStr += "\\"; break;
|
||||
case '/': valStr += "/"; break;
|
||||
case 'b': valStr += "\b"; break;
|
||||
case 'f': valStr += "\f"; break;
|
||||
case 'n': valStr += "\n"; break;
|
||||
case 'r': valStr += "\r"; break;
|
||||
case 't': valStr += "\t"; break;
|
||||
case '"': writer.push_back('\"'); break;
|
||||
case '\\': writer.push_back('\\'); break;
|
||||
case '/': writer.push_back('/'); break;
|
||||
case 'b': writer.push_back('\b'); break;
|
||||
case 'f': writer.push_back('\f'); break;
|
||||
case 'n': writer.push_back('\n'); break;
|
||||
case 'r': writer.push_back('\r'); break;
|
||||
case 't': writer.push_back('\t'); break;
|
||||
|
||||
case 'u': {
|
||||
unsigned int codepoint;
|
||||
if (hatoui(raw + 1, raw + 1 + 4, codepoint) !=
|
||||
raw + 1 + 4)
|
||||
return JTOK_ERR;
|
||||
|
||||
if (codepoint <= 0x7f)
|
||||
valStr.push_back((char)codepoint);
|
||||
else if (codepoint <= 0x7FF) {
|
||||
valStr.push_back((char)(0xC0 | (codepoint >> 6)));
|
||||
valStr.push_back((char)(0x80 | (codepoint & 0x3F)));
|
||||
} else if (codepoint <= 0xFFFF) {
|
||||
valStr.push_back((char)(0xE0 | (codepoint >> 12)));
|
||||
valStr.push_back((char)(0x80 | ((codepoint >> 6) & 0x3F)));
|
||||
valStr.push_back((char)(0x80 | (codepoint & 0x3F)));
|
||||
}
|
||||
|
||||
writer.push_back_u(codepoint);
|
||||
raw += 4;
|
||||
break;
|
||||
}
|
||||
@@ -226,11 +217,13 @@ enum jtokentype getJsonToken(string& tokenVal, unsigned int& consumed,
|
||||
}
|
||||
|
||||
else {
|
||||
valStr += *raw;
|
||||
writer.push_back(*raw);
|
||||
raw++;
|
||||
}
|
||||
}
|
||||
|
||||
if (!writer.finalize())
|
||||
return JTOK_ERR;
|
||||
tokenVal = valStr;
|
||||
consumed = (raw - rawStart);
|
||||
return JTOK_STRING;
|
||||
|
||||
Reference in New Issue
Block a user