forked from OSchip/llvm-project
218 lines
3.8 KiB
C++
218 lines
3.8 KiB
C++
//===--------------------- 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();
|
|
}
|