Fixed JSON string escaping to support non-printable characters, made some JSON lib private functions static in the .cpp file instead.

This commit is contained in:
Thulinma 2013-08-28 12:18:22 +02:00
parent f48833343a
commit 2769d3cc6c
2 changed files with 18 additions and 9 deletions

View file

@ -7,14 +7,21 @@
#include <stdint.h> //for uint64_t #include <stdint.h> //for uint64_t
#include <string.h> //for memcpy #include <string.h> //for memcpy
#include <arpa/inet.h> //for htonl #include <arpa/inet.h> //for htonl
int JSON::Value::c2hex(int c){
static int c2hex(char c){
if (c >= '0' && c <= '9') return c - '0'; if (c >= '0' && c <= '9') return c - '0';
if (c >= 'a' && c <= 'f') return c - 'a' + 10; if (c >= 'a' && c <= 'f') return c - 'a' + 10;
if (c >= 'A' && c <= 'F') return c - 'A' + 10; if (c >= 'A' && c <= 'F') return c - 'A' + 10;
return 0; return 0;
} }
std::string JSON::Value::read_string(int separator, std::istream & fromstream){ static char hex2c(char c){
if (c < 10){return '0' + c;}
if (c < 16){return 'A' + (c - 10);}
return '0';
}
static std::string read_string(int separator, std::istream & fromstream){
std::string out; std::string out;
bool escaped = false; bool escaped = false;
while (fromstream.good()){ while (fromstream.good()){
@ -64,7 +71,7 @@ std::string JSON::Value::read_string(int separator, std::istream & fromstream){
return out; return out;
} }
std::string JSON::Value::string_escape(const std::string val){ static std::string string_escape(const std::string val){
std::string out = "\""; std::string out = "\"";
for (unsigned int i = 0; i < val.size(); ++i){ for (unsigned int i = 0; i < val.size(); ++i){
switch (val[i]){ switch (val[i]){
@ -90,7 +97,13 @@ std::string JSON::Value::string_escape(const std::string val){
out += "\\t"; out += "\\t";
break; break;
default: default:
if (val[i] < 32 || val[i] > 126){
out += "\\u00";
out += hex2c((val[i] >> 4) & 0xf);
out += hex2c(val[i] & 0xf);
}else{
out += val[i]; out += val[i];
}
break; break;
} }
} }
@ -99,7 +112,7 @@ std::string JSON::Value::string_escape(const std::string val){
} }
/// Skips an std::istream forward until any of the following characters is seen: ,]} /// Skips an std::istream forward until any of the following characters is seen: ,]}
void JSON::Value::skipToEnd(std::istream & fromstream){ static void skipToEnd(std::istream & fromstream){
while (fromstream.good()){ while (fromstream.good()){
char peek = fromstream.peek(); char peek = fromstream.peek();
if (peek == ','){ if (peek == ','){

View file

@ -35,10 +35,6 @@ namespace JSON {
std::string strVal; std::string strVal;
std::deque<Value> arrVal; std::deque<Value> arrVal;
std::map<std::string, Value> objVal; std::map<std::string, Value> objVal;
std::string read_string(int separator, std::istream & fromstream);
static std::string string_escape(const std::string val);
int c2hex(int c);
static void skipToEnd(std::istream & fromstream);
public: public:
//friends //friends
friend class DTSC::Stream; //for access to strVal friend class DTSC::Stream; //for access to strVal