Coverage Report

Created: 2026-02-09 06:05

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/CMake/Source/cmXMLWriter.h
Line
Count
Source
1
/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
2
   file LICENSE.rst or https://cmake.org/licensing for details.  */
3
#pragma once
4
5
#include "cmConfigure.h" // IWYU pragma: keep
6
7
#include <chrono>
8
#include <cstddef> // IWYU pragma: keep
9
#include <ctime>
10
#include <ostream>
11
#include <stack>
12
#include <string>
13
#include <vector>
14
15
#include "cmXMLSafe.h"
16
17
class cmXMLWriter
18
{
19
public:
20
  cmXMLWriter(std::ostream& output, std::size_t level = 0);
21
  ~cmXMLWriter();
22
23
  cmXMLWriter(cmXMLWriter const&) = delete;
24
  cmXMLWriter& operator=(cmXMLWriter const&) = delete;
25
26
  void StartDocument(char const* encoding = "UTF-8");
27
  void EndDocument();
28
29
  void StartElement(std::string const& name);
30
  void EndElement();
31
32
  void BreakAttributes();
33
34
  template <typename T>
35
  void Attribute(char const* name, T const& value)
36
0
  {
37
0
    this->PreAttribute();
38
0
    this->Output << name << "=\"" << SafeAttribute(value) << '"';
39
0
  }
Unexecuted instantiation: void cmXMLWriter::Attribute<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(char const*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
Unexecuted instantiation: void cmXMLWriter::Attribute<char [13]>(char const*, char const (&) [13])
Unexecuted instantiation: void cmXMLWriter::Attribute<int>(char const*, int const&)
Unexecuted instantiation: void cmXMLWriter::Attribute<char [3]>(char const*, char const (&) [3])
Unexecuted instantiation: void cmXMLWriter::Attribute<char [4]>(char const*, char const (&) [4])
Unexecuted instantiation: void cmXMLWriter::Attribute<char [1]>(char const*, char const (&) [1])
Unexecuted instantiation: void cmXMLWriter::Attribute<char [8]>(char const*, char const (&) [8])
Unexecuted instantiation: void cmXMLWriter::Attribute<char [17]>(char const*, char const (&) [17])
Unexecuted instantiation: void cmXMLWriter::Attribute<char [7]>(char const*, char const (&) [7])
Unexecuted instantiation: void cmXMLWriter::Attribute<char [2]>(char const*, char const (&) [2])
Unexecuted instantiation: void cmXMLWriter::Attribute<char [40]>(char const*, char const (&) [40])
Unexecuted instantiation: void cmXMLWriter::Attribute<char [25]>(char const*, char const (&) [25])
Unexecuted instantiation: void cmXMLWriter::Attribute<char const*>(char const*, char const* const&)
Unexecuted instantiation: void cmXMLWriter::Attribute<char [5]>(char const*, char const (&) [5])
Unexecuted instantiation: void cmXMLWriter::Attribute<char [30]>(char const*, char const (&) [30])
Unexecuted instantiation: void cmXMLWriter::Attribute<char [38]>(char const*, char const (&) [38])
Unexecuted instantiation: void cmXMLWriter::Attribute<char [47]>(char const*, char const (&) [47])
Unexecuted instantiation: void cmXMLWriter::Attribute<char [14]>(char const*, char const (&) [14])
Unexecuted instantiation: void cmXMLWriter::Attribute<char [34]>(char const*, char const (&) [34])
Unexecuted instantiation: void cmXMLWriter::Attribute<char [29]>(char const*, char const (&) [29])
Unexecuted instantiation: void cmXMLWriter::Attribute<char [31]>(char const*, char const (&) [31])
Unexecuted instantiation: void cmXMLWriter::Attribute<char [24]>(char const*, char const (&) [24])
Unexecuted instantiation: void cmXMLWriter::Attribute<char [39]>(char const*, char const (&) [39])
Unexecuted instantiation: void cmXMLWriter::Attribute<char [15]>(char const*, char const (&) [15])
Unexecuted instantiation: void cmXMLWriter::Attribute<char [6]>(char const*, char const (&) [6])
Unexecuted instantiation: void cmXMLWriter::Attribute<char [21]>(char const*, char const (&) [21])
Unexecuted instantiation: void cmXMLWriter::Attribute<char [59]>(char const*, char const (&) [59])
40
41
  void Element(char const* name);
42
43
  template <typename T>
44
  void Element(std::string const& name, T const& value)
45
0
  {
46
0
    this->StartElement(name);
47
0
    this->Content(value);
48
0
    this->EndElement();
49
0
  }
Unexecuted instantiation: void cmXMLWriter::Element<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
Unexecuted instantiation: void cmXMLWriter::Element<char [17]>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char const (&) [17])
Unexecuted instantiation: void cmXMLWriter::Element<char [1]>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char const (&) [1])
Unexecuted instantiation: void cmXMLWriter::Element<char [38]>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char const (&) [38])
Unexecuted instantiation: void cmXMLWriter::Element<char [24]>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char const (&) [24])
Unexecuted instantiation: void cmXMLWriter::Element<char [4]>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char const (&) [4])
Unexecuted instantiation: void cmXMLWriter::Element<char [47]>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char const (&) [47])
Unexecuted instantiation: void cmXMLWriter::Element<char [37]>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char const (&) [37])
Unexecuted instantiation: void cmXMLWriter::Element<char [46]>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char const (&) [46])
Unexecuted instantiation: void cmXMLWriter::Element<char const*>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char const* const&)
Unexecuted instantiation: void cmXMLWriter::Element<char [5]>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char const (&) [5])
Unexecuted instantiation: void cmXMLWriter::Element<char [6]>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char const (&) [6])
Unexecuted instantiation: void cmXMLWriter::Element<int>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int const&)
50
51
  template <typename T>
52
  void Content(T const& content)
53
0
  {
54
0
    this->PreContent();
55
0
    this->Output << SafeContent(content);
56
0
  }
Unexecuted instantiation: void cmXMLWriter::Content<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
Unexecuted instantiation: void cmXMLWriter::Content<char [17]>(char const (&) [17])
Unexecuted instantiation: void cmXMLWriter::Content<char [1]>(char const (&) [1])
Unexecuted instantiation: void cmXMLWriter::Content<char [38]>(char const (&) [38])
Unexecuted instantiation: void cmXMLWriter::Content<char [24]>(char const (&) [24])
Unexecuted instantiation: void cmXMLWriter::Content<char [4]>(char const (&) [4])
Unexecuted instantiation: void cmXMLWriter::Content<char [47]>(char const (&) [47])
Unexecuted instantiation: void cmXMLWriter::Content<char [37]>(char const (&) [37])
Unexecuted instantiation: void cmXMLWriter::Content<char [46]>(char const (&) [46])
Unexecuted instantiation: void cmXMLWriter::Content<char const*>(char const* const&)
Unexecuted instantiation: void cmXMLWriter::Content<char [5]>(char const (&) [5])
Unexecuted instantiation: void cmXMLWriter::Content<char [6]>(char const (&) [6])
Unexecuted instantiation: void cmXMLWriter::Content<int>(int const&)
57
58
  void Comment(char const* comment);
59
60
  void CData(std::string const& data);
61
62
  void Doctype(char const* doctype);
63
64
  void ProcessingInstruction(char const* target, char const* data);
65
66
  void FragmentFile(char const* fname);
67
68
  void SetIndentationElement(std::string const& element);
69
70
private:
71
  void ConditionalLineBreak(bool condition);
72
73
  void PreAttribute();
74
  void PreContent();
75
76
  void CloseStartElement();
77
78
0
  static cmXMLSafe SafeAttribute(char const* value) { return { value }; }
79
80
  static cmXMLSafe SafeAttribute(std::string const& value)
81
0
  {
82
0
    return { value };
83
0
  }
84
85
  template <typename T>
86
  static T SafeAttribute(T value)
87
0
  {
88
0
    return value;
89
0
  }
90
91
  static cmXMLSafe SafeContent(char const* value)
92
0
  {
93
0
    return cmXMLSafe(value).Quotes(false);
94
0
  }
95
96
  static cmXMLSafe SafeContent(std::string const& value)
97
0
  {
98
0
    return cmXMLSafe(value).Quotes(false);
99
0
  }
100
101
  /*
102
   * Convert a std::chrono::system::time_point to the number of seconds since
103
   * the UN*X epoch.
104
   *
105
   * It would be tempting to convert a time_point to number of seconds by
106
   * using time_since_epoch(). Unfortunately the C++11 standard does not
107
   * specify what the epoch of the system_clock must be.
108
   * Therefore we must assume it is an arbitrary point in time. Instead of this
109
   * method, it is recommended to convert it by means of the to_time_t method.
110
   */
111
  static std::time_t SafeContent(std::chrono::system_clock::time_point value)
112
0
  {
113
0
    return std::chrono::system_clock::to_time_t(value);
114
0
  }
115
116
  template <typename T>
117
  static T SafeContent(T value)
118
0
  {
119
0
    return value;
120
0
  }
121
122
  std::ostream& Output;
123
  std::stack<std::string, std::vector<std::string>> Elements;
124
  std::string IndentationElement;
125
  std::size_t Level;
126
  std::size_t Indent = 0;
127
  bool ElementOpen = false;
128
  bool BreakAttrib = false;
129
  bool IsContent = false;
130
};
131
132
class cmXMLElement; // IWYU pragma: keep
133
134
class cmXMLDocument
135
{
136
public:
137
  cmXMLDocument(cmXMLWriter& xml)
138
    : xmlwr(xml)
139
0
  {
140
0
    this->xmlwr.StartDocument();
141
0
  }
142
0
  ~cmXMLDocument() { this->xmlwr.EndDocument(); }
143
  cmXMLDocument(cmXMLDocument const&) = delete;
144
  cmXMLDocument& operator=(cmXMLDocument const&) = delete;
145
146
private:
147
  friend class cmXMLElement;
148
  cmXMLWriter& xmlwr;
149
};
150
151
class cmXMLElement
152
{
153
public:
154
  cmXMLElement(cmXMLWriter& xml, char const* tag)
155
    : xmlwr(xml)
156
0
  {
157
0
    this->xmlwr.StartElement(tag);
158
0
  }
159
  cmXMLElement(cmXMLElement& par, char const* tag)
160
    : xmlwr(par.xmlwr)
161
0
  {
162
0
    this->xmlwr.StartElement(tag);
163
0
  }
164
  cmXMLElement(cmXMLDocument& doc, char const* tag)
165
    : xmlwr(doc.xmlwr)
166
0
  {
167
0
    this->xmlwr.StartElement(tag);
168
0
  }
169
0
  ~cmXMLElement() { this->xmlwr.EndElement(); }
170
171
  cmXMLElement(cmXMLElement const&) = delete;
172
  cmXMLElement& operator=(cmXMLElement const&) = delete;
173
174
  template <typename T>
175
  cmXMLElement& Attribute(char const* name, T const& value)
176
  {
177
    this->xmlwr.Attribute(name, value);
178
    return *this;
179
  }
180
  template <typename T>
181
  void Content(T const& content)
182
  {
183
    this->xmlwr.Content(content);
184
  }
185
  template <typename T>
186
  void Element(std::string const& name, T const& value)
187
  {
188
    this->xmlwr.Element(name, value);
189
  }
190
0
  void Comment(char const* comment) { this->xmlwr.Comment(comment); }
191
192
private:
193
  cmXMLWriter& xmlwr;
194
};