mirror of
https://github.com/intel/llvm.git
synced 2026-01-18 16:35:17 +08:00
Add a JSON producer to LLDB - this is a set of classes that encapsulate JSON objects and allow you to write them to a Stream for subsequent processing
Using this JSON producer, write a little tool that expands its own command-line arguments and dumps them to stdout as a JSON array llvm-svn: 228636
This commit is contained in:
217
lldb/source/Utility/JSON.cpp
Normal file
217
lldb/source/Utility/JSON.cpp
Normal file
@@ -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();
|
||||
}
|
||||
Reference in New Issue
Block a user