9#include "lldb/Host/Config.h"
15#pragma mark-- XMLDocument
22#if LLDB_ENABLE_LIBXML2
36 va_start(args, format);
43#if LLDB_ENABLE_LIBXML2
47 xmlSetGenericErrorFunc(
nullptr,
nullptr);
54#if LLDB_ENABLE_LIBXML2
57 m_document = xmlReadMemory(xml, (
int)xml_length, url,
nullptr, 0);
58 xmlSetGenericErrorFunc(
nullptr,
nullptr);
64#if LLDB_ENABLE_LIBXML2
68 llvm::StringRef actual_name = root_node.
GetName();
69 if (actual_name == required_name)
82#if LLDB_ENABLE_LIBXML2
100#if LLDB_ENABLE_LIBXML2
111#if LLDB_ENABLE_LIBXML2
122#if LLDB_ENABLE_LIBXML2
134 const char *fail_value)
const {
135 std::string attr_value;
136#if LLDB_ENABLE_LIBXML2
138 xmlChar *value = xmlGetProp(
m_node, (
const xmlChar *)name);
140 attr_value = (
const char *)value;
145 attr_value = fail_value;
149 attr_value = fail_value;
155 uint64_t fail_value,
int base)
const {
161#if LLDB_ENABLE_LIBXML2
168#if LLDB_ENABLE_LIBXML2
177#if LLDB_ENABLE_LIBXML2
185#if LLDB_ENABLE_LIBXML2
188 for (xmlAttrPtr attr =
m_node->properties; attr !=
nullptr;
193 xmlNodePtr child = attr->children;
194 if (child->type == XML_TEXT_NODE) {
195 llvm::StringRef attr_value;
197 attr_value = llvm::StringRef((
const char *)child->content);
198 if (!callback(llvm::StringRef((
const char *)attr->name), attr_value))
208#if LLDB_ENABLE_LIBXML2
212 for (xmlNodePtr node =
m_node; node; node = node->next) {
221#if LLDB_ENABLE_LIBXML2
225 for (xmlNodePtr node =
m_node; node; node = node->next) {
227 if (node->type != XML_ELEMENT_NODE)
239#if LLDB_ENABLE_LIBXML2
243 for (xmlNodePtr node =
m_node; node; node = node->next) {
245 if (node->type != XML_ELEMENT_NODE)
251 if (strcmp((
const char *)node->name, name) != 0)
267#if LLDB_ENABLE_LIBXML2
270 return llvm::StringRef((
const char *)
m_node->name);
273 return llvm::StringRef();
278#if LLDB_ENABLE_LIBXML2
280 bool success =
false;
281 if (
m_node->type == XML_ELEMENT_NODE) {
283 for (xmlNodePtr node =
m_node->children; node !=
nullptr;
285 if (node->type == XML_TEXT_NODE) {
286 text.append((
const char *)node->content);
302 return GetElementText(text) && llvm::to_integer(text, value, base);
313#if LLDB_ENABLE_LIBXML2
317 if (
m_node->name == (
const xmlChar *)name)
320 return strcmp((
const char *)
m_node->name, name) == 0;
329#if LLDB_ENABLE_LIBXML2
331 name, [&result_node](
const XMLNode &node) ->
bool {
344#if LLDB_ENABLE_LIBXML2
346 return m_node->type == XML_ELEMENT_NODE;
352#if LLDB_ENABLE_LIBXML2
359 const size_t n = path.size();
360 for (
size_t i = 1; node && i < n; ++i)
370#pragma mark-- ApplePropertyList
375 : m_xml_doc(), m_dict_node() {
390 [
this](
const XMLNode &dict) ->
bool {
403 std::string &value)
const {
412#if LLDB_ENABLE_LIBXML2
416 "key", [key, &value_node](
const XMLNode &key_node) ->
bool {
417 std::string key_name;
419 if (key_name == key) {
420 value_node = key_node.GetSibling();
421 while (value_node && !value_node.IsElement())
422 value_node = value_node.GetSibling();
434 std::string &value) {
436#if LLDB_ENABLE_LIBXML2
438 llvm::StringRef element_name = node.
GetName();
439 if (element_name ==
"true" || element_name ==
"false") {
441 value = element_name.str();
443 }
else if (element_name ==
"dict" || element_name ==
"array")
452#if LLDB_ENABLE_LIBXML2
455 llvm::StringRef element_name = node.
GetName();
456 if (element_name ==
"array") {
457 std::shared_ptr<StructuredData::Array> array_sp(
460 array_sp->AddItem(CreatePlistValue(node));
464 }
else if (element_name ==
"dict") {
466 std::shared_ptr<StructuredData::Dictionary> dict_sp(
469 [&key_node, &dict_sp](
const XMLNode &node) ->
bool {
476 std::string key_name;
477 key_node.GetElementText(key_name);
478 dict_sp->AddItem(key_name, CreatePlistValue(node));
486 }
else if (element_name ==
"real") {
490 }
else if (element_name ==
"integer") {
494 }
else if ((element_name ==
"string") || (element_name ==
"data") ||
495 (element_name ==
"date")) {
500 }
else if (element_name ==
"true") {
502 }
else if (element_name ==
"false") {
511#if LLDB_ENABLE_LIBXML2
static bool ExtractStringFromValueNode(const XMLNode &node, std::string &value)
XMLNode GetValueNode(const char *key) const
bool GetValueAsString(const char *key, std::string &value) const
bool ParseFile(const char *path)
StructuredData::ObjectSP GetStructuredData()
llvm::StringRef GetErrors() const
llvm::StringRef GetString() const
size_t size_t PrintfVarArg(const char *format, va_list args)
size_t EOL()
Output and End of Line character to the stream.
std::shared_ptr< Object > ObjectSP
bool ParseFile(const char *path)
llvm::StringRef GetErrors() const
XMLNode GetRootElement(const char *required_name=nullptr)
bool ParseMemory(const char *xml, size_t xml_length, const char *url="untitled.xml")
static void ErrorCallback(void *ctx, const char *format,...)
XMLDocumentImpl m_document
void ForEachChildElement(NodeCallback const &callback) const
llvm::StringRef GetName() const
void ForEachChildNode(NodeCallback const &callback) const
XMLNode GetParent() const
XMLNode GetSibling() const
bool GetElementText(std::string &text) const
std::string GetAttributeValue(const char *name, const char *fail_value=nullptr) const
void ForEachSiblingNode(NodeCallback const &callback) const
XMLNode GetElementForPath(const NamePath &path)
void ForEachSiblingElement(NodeCallback const &callback) const
bool GetElementTextAsUnsigned(uint64_t &value, uint64_t fail_value=0, int base=0) const
bool GetAttributeValueAsUnsigned(const char *name, uint64_t &value, uint64_t fail_value=0, int base=0) const
bool NameIs(const char *name) const
void ForEachChildElementWithName(const char *name, NodeCallback const &callback) const
void ForEachSiblingElementWithName(const char *name, NodeCallback const &callback) const
XMLNode FindFirstChildElementWithName(const char *name) const
bool GetElementTextAsFloat(double &value, double fail_value=0.0) const
void ForEachAttribute(AttributeCallback const &callback) const
A class that represents a running process on the host machine.
std::function< bool(const XMLNode &node)> NodeCallback
std::vector< std::string > NamePath
std::function< bool(const llvm::StringRef &name, const llvm::StringRef &value)> AttributeCallback