Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions toolsrc/include/vcpkg/base/xmlserializer.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#pragma once

#include <vcpkg/base/stringliteral.h>
#include <vcpkg/base/stringview.h>

#include <string>

namespace vcpkg
{
struct XmlSerializer
{
XmlSerializer& emit_declaration();
XmlSerializer& open_tag(StringLiteral sl);
XmlSerializer& start_complex_open_tag(StringLiteral sl);
XmlSerializer& text_attr(StringLiteral name, StringView content);
XmlSerializer& finish_complex_open_tag();
XmlSerializer& finish_self_closing_complex_tag();
XmlSerializer& close_tag(StringLiteral sl);
XmlSerializer& text(StringView sv);
XmlSerializer& simple_tag(StringLiteral tag, StringView content);
XmlSerializer& line_break();

std::string buf;

private:
XmlSerializer& emit_pending_indent();

int m_indent = 0;
bool m_pending_indent = false;
};
}
23 changes: 0 additions & 23 deletions toolsrc/include/vcpkg/binarycaching.private.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,27 +48,4 @@ namespace vcpkg
const Dependencies::InstallPlanAction& action,
const NugetReference& ref,
details::NuGetRepoInfo rinfo = details::get_nuget_repo_info_from_env());

struct XmlSerializer
{
XmlSerializer& emit_declaration();
XmlSerializer& open_tag(StringLiteral sl);
XmlSerializer& start_complex_open_tag(StringLiteral sl);
XmlSerializer& text_attr(StringLiteral name, StringView content);
XmlSerializer& finish_complex_open_tag();
XmlSerializer& finish_self_closing_complex_tag();
XmlSerializer& close_tag(StringLiteral sl);
XmlSerializer& text(StringView sv);
XmlSerializer& simple_tag(StringLiteral tag, StringView content);
XmlSerializer& line_break();

std::string buf;

private:
XmlSerializer& emit_pending_indent();

int m_indent = 0;
bool m_pending_indent = false;
};

}
1 change: 1 addition & 0 deletions toolsrc/src/vcpkg-test/binarycaching.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include <catch2/catch.hpp>

#include <vcpkg/base/files.h>
#include <vcpkg/base/xmlserializer.h>

#include <vcpkg/binarycaching.h>
#include <vcpkg/binarycaching.private.h>
Expand Down
113 changes: 113 additions & 0 deletions toolsrc/src/vcpkg/base/xmlserializer.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
#include <vcpkg/base/strings.h>
#include <vcpkg/base/xmlserializer.h>

namespace vcpkg
{
XmlSerializer& XmlSerializer::emit_declaration()
{
buf.append(R"(<?xml version="1.0" encoding="utf-8"?>)");
return *this;
}
XmlSerializer& XmlSerializer::open_tag(StringLiteral sl)
{
emit_pending_indent();
Strings::append(buf, '<', sl, '>');
m_indent += 2;
return *this;
}
XmlSerializer& XmlSerializer::start_complex_open_tag(StringLiteral sl)
{
emit_pending_indent();
Strings::append(buf, '<', sl);
m_indent += 2;
return *this;
}
XmlSerializer& XmlSerializer::text_attr(StringLiteral name, StringView content)
{
if (m_pending_indent)
{
m_pending_indent = false;
buf.append(m_indent, ' ');
}
else
{
buf.push_back(' ');
}
Strings::append(buf, name, "=\"");
text(content);
Strings::append(buf, '"');
return *this;
}
XmlSerializer& XmlSerializer::finish_complex_open_tag()
{
emit_pending_indent();
Strings::append(buf, '>');
return *this;
}
XmlSerializer& XmlSerializer::finish_self_closing_complex_tag()
{
emit_pending_indent();
Strings::append(buf, "/>");
m_indent -= 2;
return *this;
}
XmlSerializer& XmlSerializer::close_tag(StringLiteral sl)
{
m_indent -= 2;
emit_pending_indent();
Strings::append(buf, "</", sl, '>');
return *this;
}
XmlSerializer& XmlSerializer::text(StringView sv)
{
emit_pending_indent();
for (auto ch : sv)
{
if (ch == '&')
{
buf.append("&amp;");
}
else if (ch == '<')
{
buf.append("&lt;");
}
else if (ch == '>')
{
buf.append("&gt;");
}
else if (ch == '"')
{
buf.append("&quot;");
}
else if (ch == '\'')
{
buf.append("&apos;");
}
else
{
buf.push_back(ch);
}
}
return *this;
}
XmlSerializer& XmlSerializer::simple_tag(StringLiteral tag, StringView content)
{
return emit_pending_indent().open_tag(tag).text(content).close_tag(tag);
}
XmlSerializer& XmlSerializer::line_break()
{
buf.push_back('\n');
m_pending_indent = true;
return *this;
}
XmlSerializer& XmlSerializer::emit_pending_indent()
{
if (m_pending_indent)
{
m_pending_indent = false;
buf.append(m_indent, ' ');
}
return *this;
}

}
108 changes: 1 addition & 107 deletions toolsrc/src/vcpkg/binarycaching.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include <vcpkg/base/system.debug.h>
#include <vcpkg/base/system.print.h>
#include <vcpkg/base/system.process.h>
#include <vcpkg/base/xmlserializer.h>

#include <vcpkg/binarycaching.h>
#include <vcpkg/binarycaching.private.h>
Expand Down Expand Up @@ -699,113 +700,6 @@ namespace vcpkg
};
}

XmlSerializer& XmlSerializer::emit_declaration()
{
buf.append(R"(<?xml version="1.0" encoding="utf-8"?>)");
return *this;
}
XmlSerializer& XmlSerializer::open_tag(StringLiteral sl)
{
emit_pending_indent();
Strings::append(buf, '<', sl, '>');
m_indent += 2;
return *this;
}
XmlSerializer& XmlSerializer::start_complex_open_tag(StringLiteral sl)
{
emit_pending_indent();
Strings::append(buf, '<', sl);
m_indent += 2;
return *this;
}
XmlSerializer& XmlSerializer::text_attr(StringLiteral name, StringView content)
{
if (m_pending_indent)
{
m_pending_indent = false;
buf.append(m_indent, ' ');
}
else
{
buf.push_back(' ');
}
Strings::append(buf, name, "=\"");
text(content);
Strings::append(buf, '"');
return *this;
}
XmlSerializer& XmlSerializer::finish_complex_open_tag()
{
emit_pending_indent();
Strings::append(buf, '>');
return *this;
}
XmlSerializer& XmlSerializer::finish_self_closing_complex_tag()
{
emit_pending_indent();
Strings::append(buf, "/>");
m_indent -= 2;
return *this;
}
XmlSerializer& XmlSerializer::close_tag(StringLiteral sl)
{
m_indent -= 2;
emit_pending_indent();
Strings::append(buf, "</", sl, '>');
return *this;
}
XmlSerializer& XmlSerializer::text(StringView sv)
{
emit_pending_indent();
for (auto ch : sv)
{
if (ch == '&')
{
buf.append("&amp;");
}
else if (ch == '<')
{
buf.append("&lt;");
}
else if (ch == '>')
{
buf.append("&gt;");
}
else if (ch == '"')
{
buf.append("&quot;");
}
else if (ch == '\'')
{
buf.append("&apos;");
}
else
{
buf.push_back(ch);
}
}
return *this;
}
XmlSerializer& XmlSerializer::simple_tag(StringLiteral tag, StringView content)
{
return emit_pending_indent().open_tag(tag).text(content).close_tag(tag);
}
XmlSerializer& XmlSerializer::line_break()
{
buf.push_back('\n');
m_pending_indent = true;
return *this;
}
XmlSerializer& XmlSerializer::emit_pending_indent()
{
if (m_pending_indent)
{
m_pending_indent = false;
buf.append(m_indent, ' ');
}
return *this;
}

IBinaryProvider& vcpkg::null_binary_provider()
{
static NullBinaryProvider p;
Expand Down
Loading