FACT++  1.0
tools.cc
Go to the documentation of this file.
1 // **************************************************************************
9 // **************************************************************************
10 #include "tools.h"
11 
12 #include <stdarg.h>
13 #include <iomanip>
14 #include <sstream>
15 
16 #include <boost/tokenizer.hpp>
17 #include <boost/algorithm/string.hpp>
18 
19 using namespace std;
20 
21 string Tools::Format(const char *fmt, va_list &ap)
22 {
23  int n=256;
24 
25  char *ret=0;
26  while (1)
27  {
28  ret = new char[n+1];
29 
30  const int sz = vsnprintf(ret, n, fmt, ap);
31  if (sz<=n)
32  break;
33 
34  n *= 2;
35  delete [] ret;
36  };
37 
38  string str(ret);
39 
40  delete [] ret;
41 
42  return str;
43 }
44 
45 string Tools::Form(const char *fmt, ...)
46 {
47  va_list ap;
48  va_start(ap, fmt);
49 
50  string str = Format(fmt, ap);
51 
52  va_end(ap);
53 
54  return str;
55 }
56 
57 // --------------------------------------------------------------------------
58 //
67 //
68 string Tools::Trim(const string &str)
69 {
70  // Trim Both leading and trailing spaces
71  const size_t start = str.find_first_not_of(' '); // Find the first character position after excluding leading blank spaces
72  const size_t end = str.find_last_not_of(' '); // Find the first character position from reverse af
73 
74  // if all spaces or empty return an empty string
75  if (string::npos==start || string::npos==end)
76  return string();
77 
78  return str.substr(start, end-start+1);
79 }
80 
81 // --------------------------------------------------------------------------
82 //
91 //
92 string Tools::TrimQuotes(const string &str)
93 {
94  string rc = Trim(str);
95  if (rc.length()<2)
96  return rc;
97 
98  const char b = rc[0];
99  const char e = rc[rc.length()-1];
100 
101  if ((b=='\"' && e=='\"') || (b=='\'' && e=='\''))
102  return rc.substr(1, rc.length()-2);
103 
104  return rc;
105 }
106 
107 // --------------------------------------------------------------------------
108 //
128 string Tools::Wrap(string &str, size_t width)
129 {
130  const size_t pos = str.length()<width ? string::npos : str.find_last_of(' ', width);
131  if (pos==string::npos)
132  {
133  const string rc = str;
134  str = "";
135  return rc;
136  }
137 
138  const size_t indent = str.find_first_not_of(' ');
139 
140  const string rc = str.substr(0, pos);
141  const size_t p2 = str.find_first_not_of(' ', pos+1);
142 
143  str = str.substr(0, indent) + str.substr(p2==string::npos ? pos+1 : p2);
144 
145  return rc;
146 }
147 
148 string Tools::Scientific(uint64_t val)
149 {
150  ostringstream rc;
151  rc << setprecision(1) << fixed;
152 
153  if (val<1000)
154  {
155  rc << val << " ";
156  return rc.str();
157  }
158 
159  if (val<3000)
160  {
161  rc << val/1000. << " k";
162  return rc.str();
163  }
164 
165  if (val<1000000)
166  {
167  rc << val/1000 << " k";
168  return rc.str();
169  }
170 
171  if (val<3000000)
172  {
173  rc << val/1000000. << " M";
174  return rc.str();
175  }
176 
177  if (val<1000000000)
178  {
179  rc << val/1000000 << " M";
180  return rc.str();
181  }
182 
183  if (val<3000000000)
184  {
185  rc << val/1000000000. << " G";
186  return rc.str();
187  }
188 
189  if (val<1000000000000)
190  {
191  rc << val/1000000000 << " G";
192  return rc.str();
193  }
194 
195  if (val<3000000000000)
196  {
197  rc << val/1000000000000. << " T";
198  return rc.str();
199  }
200 
201  if (val<1000000000000000)
202  {
203  rc << val/1000000000000 << " T";
204  return rc.str();
205  }
206 
207  if (val<3000000000000000)
208  {
209  rc << val/1000000000000000. << " P";
210  return rc.str();
211  }
212 
213  rc << val/1000000000000000. << " P";
214  return rc.str();
215 }
216 
217 // --------------------------------------------------------------------------
218 //
230 map<string,string> Tools::Split(string &opt, bool allow)
231 {
232  using namespace boost;
233  typedef escaped_list_separator<char> separator;
234 
235  const string data(opt);
236 
237  const tokenizer<separator> tok(data, separator("\\", " ", "\"'"));
238 
239  auto it=tok.begin();
240  if (it==tok.end())
241  {
242  opt = "";
243  return map<string,string>();
244  }
245 
246  opt = string(*it).find_first_of('=')==string::npos ? *it++ : "";
247 
248  map<string,string> rc;
249 
250  int i=-1;
251 
252  for (; it!=tok.end(); it++)
253  {
254  if (it->empty())
255  continue;
256 
257  i++;
258 
259  const size_t pos = it->find_first_of('=');
260  if (pos==string::npos)
261  {
262  if (allow)
263  {
264  rc[to_string(i)] = *it;
265  continue;
266  }
267 
268  opt = "";
269  rc.clear();
270  rc[*it] = "";
271  return rc;
272  }
273 
274  rc[it->substr(0, pos)] = it->substr(pos+1);
275  }
276 
277  return rc;
278 }
279 
280 vector<string> Tools::Split(const string &str, const string &delim)
281 {
282  vector<string> rc;
283  boost::split(rc, str, boost::is_any_of(delim));
284  return rc;
285 }
286 
287 // --------------------------------------------------------------------------
288 //
292 string Tools::Uncomment(const string &opt)
293 {
294  using namespace boost;
295  typedef escaped_list_separator<char> separator;
296 
297  const auto it = tokenizer<separator>(opt, separator("\\", "#", "\"'")).begin();
298 
299  const int charPos = it.base() - opt.begin();
300 
301  return charPos<1 ? "" : opt.substr(0, opt[charPos-1]=='#' ? charPos-1 : charPos);
302 }
int start(int initState)
Definition: feeserver.c:1740
int i
Definition: db_dim_client.c:21
char str[80]
Definition: test_client.c:7
STL namespace.
double begin
std::string Format(const char *fmt, va_list &ap)
Definition: tools.cc:21
std::string TrimQuotes(const std::string &str)
Definition: tools.cc:92
std::map< std::string, std::string > Split(std::string &, bool=false)
Definition: tools.cc:230
double end
std::string Form(const char *fmt,...)
Definition: tools.cc:45
std::string Scientific(uint64_t val)
Definition: tools.cc:148
float data[4 *1440]
std::string Wrap(std::string &str, size_t width=78)
Definition: tools.cc:128
std::string Uncomment(const std::string &opt)
Definition: tools.cc:292
std::string Trim(const std::string &str)
Definition: tools.cc:68