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::string
79 formatDuration(time::nanoseconds d)
80 {
81  std::ostringstream str;
82 
83  if (d < 0_ns) {
84  str << "-";
85  }
86 
87  str << "PT";
88 
89  time::seconds seconds(time::duration_cast<time::seconds>(time::abs(d)));
90  time::milliseconds ms(time::duration_cast<time::milliseconds>(time::abs(d) - seconds));
91 
92  str << seconds.count();
93 
94  if (ms >= 1_ms) {
95  str << "." << std::setfill('0') << std::setw(3) << ms.count();
96  }
97 
98  str << "S";
99 
100  return str.str();
101 }
102 
103 std::string
104 formatTimestamp(time::system_clock::TimePoint t)
105 {
106  return time::toString(t, "%Y-%m-%dT%H:%M:%S%F");
107 }
108 
109 } // namespace xml
110 
111 namespace text {
112 
113 std::ostream&
114 operator<<(std::ostream& os, const Spaces& spaces)
115 {
116  for (int i = 0; i < spaces.nSpaces; ++i) {
117  os << ' ';
118  }
119  return os;
120 }
121 
122 Separator::Separator(const std::string& first, const std::string& subsequent)
123  : m_first(first)
124  , m_subsequent(subsequent)
125  , m_count(0)
126 {
127 }
128 
129 Separator::Separator(const std::string& subsequent)
130  : Separator("", subsequent)
131 {
132 }
133 
134 std::ostream&
135 operator<<(std::ostream& os, Separator& sep)
136 {
137  if (++sep.m_count == 1) {
138  return os << sep.m_first;
139  }
140  return os << sep.m_subsequent;
141 }
142 
143 ItemAttributes::ItemAttributes(bool wantMultiLine, int maxAttributeWidth)
144  : m_wantMultiLine(wantMultiLine)
145  , m_maxAttributeWidth(maxAttributeWidth)
146  , m_count(0)
147 {
148 }
149 
151 ItemAttributes::operator()(const std::string& attribute)
152 {
153  return {*this, attribute};
154 }
155 
156 std::string
158 {
159  return m_wantMultiLine ? "\n" : "";
160 }
161 
162 std::ostream&
163 operator<<(std::ostream& os, const ItemAttributes::Attribute& attr)
164 {
165  ++attr.ia.m_count;
166  if (attr.ia.m_wantMultiLine) {
167  if (attr.ia.m_count > 1) {
168  os << '\n';
169  }
170  os << Spaces{attr.ia.m_maxAttributeWidth - static_cast<int>(attr.attribute.size())};
171  }
172  else {
173  if (attr.ia.m_count > 1) {
174  os << ' ';
175  }
176  }
177  return os << attr.attribute << '=';
178 }
179 
180 std::string
181 formatTimestamp(time::system_clock::TimePoint t)
182 {
183  return time::toIsoString(t);
184 }
185 
186 } // namespace text
187 
188 } // namespace nfdc
189 } // namespace tools
190 } // 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)
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 different string on first and subsequent usage
print a number of whitespaces
void printFooter(std::ostream &os)