diff options
Diffstat (limited to 'source/Utility/JSON.cpp')
-rw-r--r-- | source/Utility/JSON.cpp | 217 |
1 files changed, 217 insertions, 0 deletions
diff --git a/source/Utility/JSON.cpp b/source/Utility/JSON.cpp new file mode 100644 index 0000000..0ba8cf4 --- /dev/null +++ b/source/Utility/JSON.cpp @@ -0,0 +1,217 @@ +//===--------------------- JSON.cpp -----------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "lldb/Utility/JSON.h" + +using namespace lldb_private; + +std::string +JSONString::json_string_quote_metachars (const std::string &s) +{ + if (s.find('"') == std::string::npos) + return s; + + std::string output; + const size_t s_size = s.size(); + const char *s_chars = s.c_str(); + for (size_t i = 0; i < s_size; i++) + { + unsigned char ch = *(s_chars + i); + if (ch == '"') + { + output.push_back ('\\'); + } + output.push_back (ch); + } + return output; +} + +JSONString::JSONString () : +JSONValue(JSONValue::Kind::String), +m_data() +{ +} + +JSONString::JSONString (const char* s) : +JSONValue(JSONValue::Kind::String), +m_data(s ? s : "") +{ +} + +JSONString::JSONString (const std::string& s) : +JSONValue(JSONValue::Kind::String), +m_data(s) +{ +} + +void +JSONString::Write (Stream& s) +{ + s.Printf("\"%s\"", json_string_quote_metachars(m_data).c_str()); +} + +JSONNumber::JSONNumber () : +JSONValue(JSONValue::Kind::Number), +m_data(0) +{ +} + +JSONNumber::JSONNumber (int64_t i) : +JSONValue(JSONValue::Kind::Number), +m_data(i) +{ +} + +void +JSONNumber::Write (Stream& s) +{ + s.Printf("%" PRId64, m_data); +} + +JSONTrue::JSONTrue () : +JSONValue(JSONValue::Kind::True) +{ +} + +void +JSONTrue::Write(Stream& s) +{ + s.Printf("true"); +} + +JSONFalse::JSONFalse () : +JSONValue(JSONValue::Kind::False) +{ +} + +void +JSONFalse::Write(Stream& s) +{ + s.Printf("false"); +} + +JSONNull::JSONNull () : +JSONValue(JSONValue::Kind::Null) +{ +} + +void +JSONNull::Write(Stream& s) +{ + s.Printf("null"); +} + +JSONObject::JSONObject () : +JSONValue(JSONValue::Kind::Object) +{ +} + +void +JSONObject::Write (Stream& s) +{ + bool first = true; + s.PutChar('{'); + auto iter = m_elements.begin(), end = m_elements.end(); + for (;iter != end; iter++) + { + if (first) + first = false; + else + s.PutChar(','); + JSONString key(iter->first); + JSONValue::SP value(iter->second); + key.Write(s); + s.PutChar(':'); + value->Write(s); + } + s.PutChar('}'); +} + +bool +JSONObject::SetObject (const std::string& key, + JSONValue::SP value) +{ + if (key.empty() || nullptr == value.get()) + return false; + m_elements[key] = value; + return true; +} + +JSONValue::SP +JSONObject::GetObject (const std::string& key) +{ + auto iter = m_elements.find(key), end = m_elements.end(); + if (iter == end) + return JSONValue::SP(); + return iter->second; +} + +JSONArray::JSONArray () : +JSONValue(JSONValue::Kind::Array) +{ +} + +void +JSONArray::Write (Stream& s) +{ + bool first = true; + s.PutChar('['); + auto iter = m_elements.begin(), end = m_elements.end(); + for (;iter != end; iter++) + { + if (first) + first = false; + else + s.PutChar(','); + (*iter)->Write(s); + } + s.PutChar(']'); +} + +bool +JSONArray::SetObject (Index i, + JSONValue::SP value) +{ + if (value.get() == nullptr) + return false; + if (i < m_elements.size()) + { + m_elements[i] = value; + return true; + } + if (i == m_elements.size()) + { + m_elements.push_back(value); + return true; + } + return false; +} + +bool +JSONArray::AppendObject (JSONValue::SP value) +{ + if (value.get() == nullptr) + return false; + m_elements.push_back(value); + return true; +} + +JSONValue::SP +JSONArray::GetObject (Index i) +{ + if (i < m_elements.size()) + return m_elements[i]; + return JSONValue::SP(); +} + +JSONArray::Size +JSONArray::GetNumElements () +{ + return m_elements.size(); +} |