diff options
Diffstat (limited to 'decoder/json_parse.cc')
| -rw-r--r-- | decoder/json_parse.cc | 50 | 
1 files changed, 50 insertions, 0 deletions
| diff --git a/decoder/json_parse.cc b/decoder/json_parse.cc new file mode 100644 index 00000000..f6fdfea8 --- /dev/null +++ b/decoder/json_parse.cc @@ -0,0 +1,50 @@ +#include "json_parse.h" + +#include <string> +#include <iostream> + +using namespace std; + +static const char *json_hex_chars = "0123456789abcdef"; + +void JSONParser::WriteEscapedString(const string& in, ostream* out) { +  int pos = 0; +  int start_offset = 0; +  unsigned char c = 0; +  (*out) << '"'; +  while(pos < in.size()) { +    c = in[pos]; +    switch(c) { +    case '\b': +    case '\n': +    case '\r': +    case '\t': +    case '"': +    case '\\': +    case '/': +      if(pos - start_offset > 0) +	(*out) << in.substr(start_offset, pos - start_offset); +      if(c == '\b') (*out) << "\\b"; +      else if(c == '\n') (*out) << "\\n"; +      else if(c == '\r') (*out) << "\\r"; +      else if(c == '\t') (*out) << "\\t"; +      else if(c == '"') (*out) << "\\\""; +      else if(c == '\\') (*out) << "\\\\"; +      else if(c == '/') (*out) << "\\/"; +      start_offset = ++pos; +      break; +    default: +      if(c < ' ') { +        cerr << "Warning, bad character (" << static_cast<int>(c) << ") in string\n"; +	if(pos - start_offset > 0) +	  (*out) << in.substr(start_offset, pos - start_offset); +	(*out) << "\\u00" << json_hex_chars[c >> 4] << json_hex_chars[c & 0xf]; +	start_offset = ++pos; +      } else pos++; +    } +  } +  if(pos - start_offset > 0) +    (*out) << in.substr(start_offset, pos - start_offset); +  (*out) << '"'; +} + | 
