Skip to content

Commit

Permalink
Clean-up: modernize pretty_xml.cpp
Browse files Browse the repository at this point in the history
Since pretty_xml was converted to C++, clang-tidy had a number of
grievances such as the use of NULL (instead of nullptr).

Since the file is very small, it is modernized to address those issues:
  - Wrap libxml2 resources in RAII wrappers
  - Use C++ IO APIs in lieu of fprintf

Signed-off-by: Jérémie Galarneau <[email protected]>
Change-Id: Ie90e3e05130f7916f411e0de36e8aac72a0f790c
  • Loading branch information
jgalar committed May 1, 2024
1 parent 0e9cf25 commit f59edc7
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 23 deletions.
31 changes: 30 additions & 1 deletion tests/utils/xml-utils/common.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,37 @@
#include <libxml/parser.h>
#include <memory>

using xml_parser_ctx_uptr = std::unique_ptr<
namespace lttng {
namespace libxml {

using parser_ctx_uptr = std::unique_ptr<
xmlParserCtxt,
lttng::memory::create_deleter_class<xmlParserCtxt, xmlFreeParserCtxt>::deleter>;
using doc_uptr =
std::unique_ptr<xmlDoc, lttng::memory::create_deleter_class<xmlDoc, xmlFreeDoc>::deleter>;

/*
* Manage the global parser context of libxml2.
* There should only be one instance of this class per process.
*/
class global_parser_context {
public:
global_parser_context()
{
xmlInitParser();
}

~global_parser_context()
{
xmlCleanupParser();
}

/* Deactivate copy and assignment. */
global_parser_context(const global_parser_context&) = delete;
global_parser_context(global_parser_context&&) = delete;
global_parser_context& operator=(const global_parser_context&) = delete;
global_parser_context& operator=(global_parser_context&&) = delete;
};
} /* namespace libxml */
} /* namespace lttng */
#endif /* TESTS_UTILS_XML_UTILS_COMMON_HPP */
4 changes: 3 additions & 1 deletion tests/utils/xml-utils/extract_xml.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@
#include <string.h>
#include <unistd.h>

namespace ll = lttng::libxml;

#if defined(LIBXML_XPATH_ENABLED)

static int opt_verbose;
Expand Down Expand Up @@ -178,7 +180,7 @@ static int extract_xpath(const char *xml_path, const xmlChar *xpath)
LTTNG_ASSERT(xml_path);
LTTNG_ASSERT(xpath);

xml_parser_ctx_uptr parserCtx{ xmlNewParserCtxt() };
ll::parser_ctx_uptr parserCtx{ xmlNewParserCtxt() };

if (!parserCtx) {
fprintf(stderr, "ERR: could not allocate an XML parser context\n");
Expand Down
36 changes: 15 additions & 21 deletions tests/utils/xml-utils/pretty_xml.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,34 +12,28 @@

#include "common.hpp"

#include <common/scope-exit.hpp>

#include <iostream>
#include <libxml/parser.h>
#include <unistd.h>

namespace ll = lttng::libxml;

int main()
{
xmlDocPtr doc = NULL;

/* Init libxml. */
xmlInitParser();

{
xml_parser_ctx_uptr parserCtx{ xmlNewParserCtxt() };

/* Parse the XML document from stdin. */
doc = xmlCtxtReadFd(
parserCtx.get(), STDIN_FILENO, nullptr, nullptr, XML_PARSE_NOBLANKS);
if (!doc) {
fprintf(stderr, "ERR parsing: xml input invalid");
return -1;
}

xmlDocFormatDump(stdout, doc, 1);

xmlFreeDoc(doc);
const ll::global_parser_context global_parser_context;
const ll::parser_ctx_uptr parserCtx{ xmlNewParserCtxt() };

/* Parse the XML document from stdin. */
const ll::doc_uptr doc{ xmlCtxtReadFd(
parserCtx.get(), STDIN_FILENO, nullptr, nullptr, XML_PARSE_NOBLANKS) };
if (!doc) {
std::cerr << "Error: invalid XML input on stdin\n";
return -1;
}

/* Shutdown libxml. */
xmlCleanupParser();
xmlDocFormatDump(stdout, doc.get(), 1);

return 0;
}

0 comments on commit f59edc7

Please sign in to comment.