format-helpers.cpp
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2014-2018, Regents of the University of California,
4  * Arizona Board of Regents,
5  * Colorado State University,
6  * University Pierre & Marie Curie, Sorbonne University,
7  * Washington University in St. Louis,
8  * Beijing Institute of Technology,
9  * The University of Memphis.
10  *
11  * This file is part of NFD (Named Data Networking Forwarding Daemon).
12  * See AUTHORS.md for complete list of NFD authors and contributors.
13  *
14  * NFD is free software: you can redistribute it and/or modify it under the terms
15  * of the GNU General Public License as published by the Free Software Foundation,
16  * either version 3 of the License, or (at your option) any later version.
17  *
18  * NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
19  * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
20  * PURPOSE. See the GNU General Public License for more details.
21  *
22  * You should have received a copy of the GNU General Public License along with
23  * NFD, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
24  */
25 
26 #include "format-helpers.hpp"
27 
28 #include <iomanip>
29 #include <sstream>
30 
31 namespace nfd {
32 namespace tools {
33 namespace nfdc {
34 
35 namespace xml {
36 
37 void
38 printHeader(std::ostream& os)
39 {
40  os << "<?xml version=\"1.0\"?>"
41  << "<nfdStatus xmlns=\"ndn:/localhost/nfd/status/1\">";
42 }
43 
44 void
45 printFooter(std::ostream& os)
46 {
47  os << "</nfdStatus>";
48 }
49 
50 std::ostream&
51 operator<<(std::ostream& os, const Text& text)
52 {
53  for (char ch : text.s) {
54  switch (ch) {
55  case '"':
56  os << "&quot;";
57  break;
58  case '&':
59  os << "&amp;";
60  break;
61  case '\'':
62  os << "&apos;";
63  break;
64  case '<':
65  os << "&lt;";
66  break;
67  case '>':
68  os << "&gt;";
69  break;
70  default:
71  os << ch;
72  break;
73  }
74  }
75  return os;
76 }
77 
78 std::ostream&
79 operator<<(std::ostream& os, Flag v)
80 {
81  if (!v.flag) {
82  return os;
83  }
84  return os << '<' << v.elementName << "/>";
85 }
86 
87 std::string
88 formatDuration(time::nanoseconds d)
89 {
90  std::ostringstream str;
91 
92  if (d < 0_ns) {
93  str << "-";
94  }
95 
96  str << "PT";
97 
98  time::seconds seconds(time::duration_cast<time::seconds>(time::abs(d)));
99  time::milliseconds ms(time::duration_cast<time::milliseconds>(time::abs(d) - seconds));
100 
101  str << seconds.count();
102 
103  if (ms >= 1_ms) {
104  str << "." << std::setfill('0') << std::setw(3) << ms.count();
105  }
106 
107  str << "S";
108 
109  return str.str();
110 }
111 
112 std::string
113 formatTimestamp(time::system_clock::TimePoint t)
114 {
115  return time::toString(t, "%Y-%m-%dT%H:%M:%S%F");
116 }
117 
118 } // namespace xml
119 
120 namespace text {
121 
122 std::ostream&
123 operator<<(std::ostream& os, const Spaces& spaces)
124 {
125  for (int i = 0; i < spaces.nSpaces; ++i) {
126  os << ' ';
127  }
128  return os;
129 }
130 
131 Separator::Separator(const std::string& first, const std::string& subsequent)
132  : m_first(first)
133  , m_subsequent(subsequent)
134  , m_count(0)
135 {
136 }
137 
138 Separator::Separator(const std::string& subsequent)
139  : Separator("", subsequent)
140 {
141 }
142 
143 std::ostream&
144 operator<<(std::ostream& os, Separator& sep)
145 {
146  if (++sep.m_count == 1) {
147  return os << sep.m_first;
148  }
149  return os << sep.m_subsequent;
150 }
151 
152 ItemAttributes::ItemAttributes(bool wantMultiLine, int maxAttributeWidth)
153  : m_wantMultiLine(wantMultiLine)
154  , m_maxAttributeWidth(maxAttributeWidth)
155  , m_count(0)
156 {
157 }
158 
160 ItemAttributes::operator()(const std::string& attribute)
161 {
162  return {*this, attribute};
163 }
164 
165 std::string
167 {
168  return m_wantMultiLine ? "\n" : "";
169 }
170 
171 std::ostream&
172 operator<<(std::ostream& os, const ItemAttributes::Attribute& attr)
173 {
174  ++attr.ia.m_count;
175  if (attr.ia.m_wantMultiLine) {
176  if (attr.ia.m_count > 1) {
177  os << '\n';
178  }
179  os << Spaces{attr.ia.m_maxAttributeWidth - static_cast<int>(attr.attribute.size())};
180  }
181  else {
182  if (attr.ia.m_count > 1) {
183  os << ' ';
184  }
185  }
186  return os << attr.attribute << '=';
187 }
188 
189 std::ostream&
190 operator<<(std::ostream& os, OnOff v)
191 {
192  return os << (v.flag ? "on" : "off");
193 }
194 
195 std::ostream&
196 operator<<(std::ostream& os, YesNo v)
197 {
198  return os << (v.flag ? "yes" : "no");
199 }
200 
201 std::string
202 formatTimestamp(time::system_clock::TimePoint t)
203 {
204  return time::toIsoString(t);
205 }
206 
207 } // namespace text
208 
209 } // namespace nfdc
210 } // namespace tools
211 } // namespace nfd
std::string formatDuration(time::nanoseconds d)
ItemAttributes(bool wantMultiLine=false, int maxAttributeWidth=0)
constructor
std::string formatTimestamp(time::system_clock::TimePoint t)
friend std::ostream & operator<<(std::ostream &os, Separator &sep)
print true as an empty element and false as nothing
void printHeader(std::ostream &os)
Copyright (c) 2014-2015, Regents of the University of California, Arizona Board of Regents...
Definition: algorithm.hpp:32
std::string formatTimestamp(time::system_clock::TimePoint t)
Attribute operator()(const std::string &attribute)
std::ostream & operator<<(std::ostream &os, const Text &text)
print XML text with special character represented as predefined entities
Separator(const std::string &first, const std::string &subsequent)
friend std::ostream & operator<<(std::ostream &os, const ItemAttributes::Attribute &attr)
int nSpaces
number of spaces; print nothing if negative
print boolean as &#39;yes&#39; or &#39;no&#39;
print different string on first and subsequent usage
print a number of whitespaces
print boolean as &#39;on&#39; or &#39;off&#39;
void printFooter(std::ostream &os)