summaryrefslogtreecommitdiff
path: root/project2/json
diff options
context:
space:
mode:
Diffstat (limited to 'project2/json')
-rw-r--r--project2/json/Jamfile.jam2
-rw-r--r--project2/json/conversion.cpp7
-rw-r--r--project2/json/conversion.h3
-rw-r--r--project2/json/couchSession.cpp2
-rw-r--r--project2/json/json.h44
-rw-r--r--project2/json/parse.cpp224
-rw-r--r--project2/json/presenter.cpp2
-rw-r--r--project2/json/presenter.h2
-rw-r--r--project2/json/serialize.cpp150
9 files changed, 12 insertions, 424 deletions
diff --git a/project2/json/Jamfile.jam b/project2/json/Jamfile.jam
index 7453a04..0f87d50 100644
--- a/project2/json/Jamfile.jam
+++ b/project2/json/Jamfile.jam
@@ -4,6 +4,7 @@ alias glibmm : : : :
;
lib boost_filesystem : : <name>boost_filesystem ;
lib boost_date_time : : <name>boost_date_time ;
+lib jsonpp ;
cpp-pch pch : pch.hpp :
<include>../../libmisc
@@ -16,6 +17,7 @@ lib p2json :
<include>.
<include>../libmisc
<library>glibmm
+ <library>jsonpp
<library>../common//p2common
<library>../lib//p2lib
<library>../url//p2url
diff --git a/project2/json/conversion.cpp b/project2/json/conversion.cpp
index 8f7fc55..0e858af 100644
--- a/project2/json/conversion.cpp
+++ b/project2/json/conversion.cpp
@@ -8,8 +8,8 @@ json::Value Project2ToJson::operator()(const boost::posix_time::time_duration &
json::Value Project2ToJson::operator()(const boost::posix_time::ptime & i) const {
return boost::posix_time::to_iso_extended_string(i);
}
-json::Value Project2ToJson::operator()(const Null & c) const {
- return c;
+json::Value Project2ToJson::operator()(const Null &) const {
+ return json::Null();
}
json::Value Project2ToJson::operator()(const Glib::ustring & c) const {
return c;
@@ -24,4 +24,7 @@ VariableType JsonToProject2::operator()(const json::Object &) const {
VariableType JsonToProject2::operator()(const json::Array &) const {
throw ConversionNotSupported();
}
+VariableType JsonToProject2::operator()(const json::Null &) const {
+ return Null();
+}
diff --git a/project2/json/conversion.h b/project2/json/conversion.h
index 51a8938..0e9d56d 100644
--- a/project2/json/conversion.h
+++ b/project2/json/conversion.h
@@ -2,7 +2,7 @@
#define JSON_CONVERSION_H
#include "variables.h"
-#include "json.h"
+#include "jsonpp.h"
#include <boost/numeric/conversion/cast.hpp>
class ConversionNotSupported { };
@@ -23,6 +23,7 @@ class JsonToProject2 : public boost::static_visitor<VariableType> {
public:
VariableType operator()(const json::Object &) const;
VariableType operator()(const json::Array &) const;
+ VariableType operator()(const json::Null &) const;
template <class Copyable>
VariableType operator()(const Copyable & i) const {
return i;
diff --git a/project2/json/couchSession.cpp b/project2/json/couchSession.cpp
index 01e23ba..ee7bad2 100644
--- a/project2/json/couchSession.cpp
+++ b/project2/json/couchSession.cpp
@@ -11,7 +11,7 @@
#include <boost/lexical_cast.hpp>
#include <boost/uuid/uuid_io.hpp>
#include <boost/uuid/uuid_generators.hpp>
-#include "json.h"
+#include "jsonpp.h"
#include "safeMapFind.h"
#include "conversion.h"
#include "options.h"
diff --git a/project2/json/json.h b/project2/json/json.h
deleted file mode 100644
index fc9808f..0000000
--- a/project2/json/json.h
+++ /dev/null
@@ -1,44 +0,0 @@
-#ifndef JSON_H
-#define JSON_H
-
-#include <glibmm/ustring.h>
-#include <boost/shared_ptr.hpp>
-#include <variables.h>
-#include <list>
-
-namespace json {
- typedef Glib::ustring String;
- typedef double Number;
- typedef bool Boolean;
- class Value;
- typedef boost::shared_ptr<Value> ValuePtr;
- typedef std::map<std::string, ValuePtr> Object;
- typedef std::list<ValuePtr> Array;
- typedef boost::variant<Null, String, Number, Object, Array, Boolean> VT;
- class Value : public VT {
- public:
- template <class X>
- Value(const X & x) : VT(x) { }
- };
-
- Object parseObject(Glib::ustring::const_iterator &);
- Object parseObject(const Glib::ustring &);
- String parseString(Glib::ustring::const_iterator & s);
- Number parseNumber(Glib::ustring::const_iterator & s);
- Boolean parseBoolean(Glib::ustring::const_iterator & s);
- Null parseNull(Glib::ustring::const_iterator & s);
- Value parseValue(Glib::ustring::const_iterator & s);
- Array parseArray(Glib::ustring::const_iterator &);
-
- void serializeObject(const Object &, std::ostream & s, const std::string & encoding);
- void serializeValue(const Value &, std::ostream & s, const std::string & encoding);
- void serializeArray(const Array &, std::ostream & s, const std::string & encoding);
- void serializeString(const String &, std::ostream & s, const std::string & encoding);
- void serializeNumber(const Number &, std::ostream & s, const std::string & encoding);
- void serializeBoolean(const Boolean &, std::ostream & s, const std::string & encoding);
- void serializeNull(const Null &, std::ostream & s, const std::string & encoding);
- Glib::ustring serializeObject(const Object &, const std::string & encoding);
-}
-
-#endif
-
diff --git a/project2/json/parse.cpp b/project2/json/parse.cpp
deleted file mode 100644
index cb41dd2..0000000
--- a/project2/json/parse.cpp
+++ /dev/null
@@ -1,224 +0,0 @@
-#include <pch.hpp>
-#include "json.h"
-#include <stdio.h>
-
-namespace json {
- class ParseError { };
- String parseString(Glib::ustring::const_iterator & s) {
- while (Glib::Unicode::isspace(*s)) s++;
- if (*s++ != '"') throw ParseError();
- String str;
- while (*s != '"') {
- if (*s == '\\') {
- switch (*s) {
- case '"':
- str += '"';
- break;
- case '\\':
- str += '\\';
- break;
- case '/':
- str += '/';
- break;
- case 'b':
- str += gunichar(8);
- break;
- case 'f':
- str += gunichar(12);
- break;
- case 'n':
- str += gunichar(10);
- break;
- case 'r':
- str += gunichar(13);
- break;
- case 't':
- str += gunichar(9);
- break;
- case 'u':
- {
- unsigned int c = 0;
- for (int n = 0; n < 4; n += 1) {
- c *= 16;
- if (*s >= '0' && *s <= '9') {
- c += (*s - '0');
- }
- else if (*s >= 'a' && *s <= 'f') {
- c += (*s - 'a');
- }
- else if (*s >= 'A' && *s <= 'F') {
- c += (*s - 'A');
- }
- else {
- throw ParseError();
- }
- s++;
- }
- str += gunichar(c);
- s--;
- }
- break;
- default:
- throw ParseError();
- }
- }
- else {
- str += *s;
- }
- s++;
- }
- if (*s++ != '"') throw ParseError();
- return str;
- }
- Number parseNumber(Glib::ustring::const_iterator & s) {
- while (Glib::Unicode::isspace(*s)) s++;
- bool neg = false;
- double v = 0;
- if (*s == '-') {
- neg = true;
- s++;
- }
- bool dot = false, e = false;
- double frac = 1;
- unsigned int digits = 0;
- while (true) {
- if (Glib::Unicode::isdigit(*s)) {
- if (dot) {
- frac /= 10;
- v += (frac * (*s - '0'));
- }
- else {
- v *= 10;
- v += (*s - '0');
- digits += 1;
- }
- }
- else if (*s == '.') {
- if (dot || e) throw ParseError();
- dot = true;
- }
- else if (*s == 'e' || *s == 'E') {
- e = true;
- s++;
- bool eneg = false;
- if (*s == '+') {
- }
- else if (*s == '-') {
- eneg = true;
- s++;
- }
- int ev = 0;
- while (Glib::Unicode::isdigit(*s)) {
- ev *= 10;
- ev += (*s - '0');
- s++;
- }
- while (ev--) {
- if (eneg) {
- v /= 10;
- }
- else {
- v *= 10;
- }
- }
- break;
- }
- else {
- break;
- }
- s++;
- }
- if (digits < 1) throw ParseError();
- return neg ? -v : v;
- }
- Value parseValue(Glib::ustring::const_iterator & s) {
- while (Glib::Unicode::isspace(*s)) s++;
- switch (*s) {
- case '"':
- return parseString(s);
- case '{':
- return parseObject(s);
- case '[':
- return parseArray(s);
- case 'n':
- return parseNull(s);
- case 't':
- case 'f':
- return parseBoolean(s);
- default:
- return parseNumber(s);
- }
- }
- Object parseObject(const Glib::ustring & s) {
- Glib::ustring::const_iterator i = s.begin();
- Object o = parseObject(i);
- if (i != s.end()) throw ParseError();
- return o;
- }
- Object parseObject(Glib::ustring::const_iterator & s) {
- Object o;
- while (Glib::Unicode::isspace(*s)) s++;
- if (*s != '{') throw ParseError();
- do {
- s++;
- while (Glib::Unicode::isspace(*s)) s++;
- if (*s == '}') return o;
- String key = parseString(s);
- while (Glib::Unicode::isspace(*s)) s++;
- if (*s++ != ':') throw ParseError();
- if (!o.insert(Object::value_type(key, ValuePtr(new Value(parseValue(s))))).second) throw ParseError();
- while (Glib::Unicode::isspace(*s)) s++;
- } while (*s == ',');
- if (*s == '}') {
- s++;
- while (Glib::Unicode::isspace(*s)) s++;
- return o;
- }
- throw ParseError();
- }
- Array parseArray(Glib::ustring::const_iterator & s) {
- Array a;
- while (Glib::Unicode::isspace(*s)) s++;
- if (*s != '[') throw ParseError();
- do {
- s++;
- while (Glib::Unicode::isspace(*s)) s++;
- if (*s == ']') {
- s++;
- return a;
- }
- a.push_back(ValuePtr(new Value(parseValue(s))));
- while (Glib::Unicode::isspace(*s)) s++;
- } while (*s == ',');
- if (*s == ']') {
- s++;
- return a;
- }
- throw ParseError();
- }
- Null parseNull(Glib::ustring::const_iterator & s) {
- if (*s++ != 'n') throw ParseError();
- if (*s++ != 'u') throw ParseError();
- if (*s++ != 'l') throw ParseError();
- if (*s++ != 'l') throw ParseError();
- return Null();
- }
- Boolean parseBoolean(Glib::ustring::const_iterator & s) {
- if (*s == 't') {
- s++;
- if (*s++ != 'r') throw ParseError();
- if (*s++ != 'u') throw ParseError();
- if (*s++ != 'e') throw ParseError();
- return true;
- }
- else if (*s == 'f') {
- s++;
- if (*s++ != 'a') throw ParseError();
- if (*s++ != 'l') throw ParseError();
- if (*s++ != 's') throw ParseError();
- if (*s++ != 'e') throw ParseError();
- return false;
- }
- throw ParseError();
- }
-}
diff --git a/project2/json/presenter.cpp b/project2/json/presenter.cpp
index c07c71e..8db182c 100644
--- a/project2/json/presenter.cpp
+++ b/project2/json/presenter.cpp
@@ -1,6 +1,6 @@
#include <pch.hpp>
#include "../common/presenter.h"
-#include "json.h"
+#include "jsonpp.h"
#include "conversion.h"
#include "transform.h"
#include "presenter.h"
diff --git a/project2/json/presenter.h b/project2/json/presenter.h
index dbb2b7a..981953c 100644
--- a/project2/json/presenter.h
+++ b/project2/json/presenter.h
@@ -2,7 +2,7 @@
#define JSON_PRESENTER_H
#include "../common/presenter.h"
-#include "json.h"
+#include "jsonpp.h"
#include "conversion.h"
#include "transform.h"
#include <stack>
diff --git a/project2/json/serialize.cpp b/project2/json/serialize.cpp
deleted file mode 100644
index 151075b..0000000
--- a/project2/json/serialize.cpp
+++ /dev/null
@@ -1,150 +0,0 @@
-#include <pch.hpp>
-#include "json.h"
-#include <stdio.h>
-#include <boost/foreach.hpp>
-#include <glibmm/convert.h>
-
-namespace json {
- class JsonSerialize : public boost::static_visitor<> {
- public:
- JsonSerialize(std::ostream & out, const std::string & encoding) :
- o(out),
- e(encoding) {
- }
- void operator()(const String & s) const {
- serializeString(s, o, e);
- }
- void operator()(const Number & s) const {
- serializeNumber(s, o, e);
- }
- void operator()(const Array & s) const {
- serializeArray(s, o, e);
- }
- void operator()(const Object & s) const {
- serializeObject(s, o, e);
- }
- void operator()(const Null & s) const {
- serializeNull(s, o, e);
- }
- void operator()(const Boolean & s) const {
- serializeBoolean(s, o, e);
- }
- private:
- std::ostream & o;
- std::string e;
- };
-
- void serializeObject(const Object & o, std::ostream & s, const std::string & renc) {
- std::string enc(renc == "utf-8" ? std::string() : renc);
- s << std::boolalpha;
- s << std::fixed;
- s << '{';
- BOOST_FOREACH(const Object::value_type & v, o) {
- if (&v != &*o.begin()) {
- s << ',';
- }
- serializeString(v.first, s, enc);
- s << ':';
- serializeValue(*v.second, s, enc);
- }
- s << '}';
- }
-
- void serializeValue(const Value & v, std::ostream & s, const std::string & enc) {
- boost::apply_visitor(JsonSerialize(s, enc), v);
- }
-
- void serializeArray(const Array & a, std::ostream & s, const std::string & enc) {
- s << '[';
- BOOST_FOREACH(const Array::value_type & v, a) {
- if (&v != &*a.begin()) {
- s << ',';
- }
- serializeValue(*v, s, enc);
- }
- s << ']';
- }
-
- void serializeString(const String & str, std::ostream & s) {
- s << '"';
- for (auto i = str.begin(); i != str.end(); ) {
- auto start = i;
- while (i != str.end() && *i >= 32 && *i != '/' && *i != '"' && *i != '\\') {
- i++;
- }
- if (start == str.begin() && i == str.end()) {
- s << str.raw();
- break;
- }
- else if (start != i) {
- s << Glib::ustring(start, i).raw();
- }
- while (i != str.end() && (*i < 32 || *i == '/' || *i == '"' || *i == '\\')) {
- gunichar c = *i;
- switch (c) {
- case '\f':
- s << "\\f";
- break;
- case '\t':
- s << "\\t";
- break;
- case '\n':
- s << "\\n";
- break;
- case '\b':
- s << "\\b";
- break;
- case '\r':
- s << "\\r";
- break;
- case '/':
- s << "\\/";
- break;
- case '\\':
- s << "\\\\";
- break;
- case '"':
- s << "\\\"";
- break;
- default:
- char buf[7];
- snprintf(buf, sizeof(buf), "\\u%04x", c);
- s << buf;
- break;
- }
- i++;
- }
- }
- s << '"';
- }
-
- void serializeString(const String & str, std::ostream & o, const std::string & encoding) {
- if (!encoding.empty()) {
- std::stringstream s;
- serializeString(str, s);
- o << Glib::convert(s.str(), encoding, "utf-8");
- }
- else {
- serializeString(str, o);
- }
- }
-
- void serializeNumber(const Number & n, std::ostream & s, const std::string & ) {
- s << n;
- }
-
- void serializeBoolean(const Boolean & b, std::ostream & s, const std::string & ) {
- s << b;
- }
-
- void serializeNull(const Null &, std::ostream & s, const std::string & ) {
- s << "null";
- }
-
- Glib::ustring serializeObject(const Object & o, const std::string & enc) {
- std::stringstream out;
- serializeObject(o, out, enc);
- return out.str();
- }
-}
-