EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
FairDbString.cxx
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file FairDbString.cxx
1 #include <sstream>
2 #include <cstring>
3 #include <cstdlib>
4 #include <iostream>
5 
6 using namespace std;
7 
8 #include "FairDbString.h"
9 
11 
13  : fString()
14 {
15 
16 }
17 FairDbString::FairDbString(const Char_t* str) :
18  fString(str)
19 {
20 
21 }
22 
23 FairDbString::FairDbString(const std::string& str) :
24  fString(str)
25 {
26 }
28 {
29 }
30 
31 #define OUT(t,v) \
32  ostringstream out; \
33  out << v; \
34  fString.append(out.str()); \
35  return *this;
36 
37 
39 FairDbString& FairDbString::operator<<(UInt_t data) { OUT(UInt_t,data) }
40 FairDbString& FairDbString::operator<<(Float_t data) { OUT(Float_t,data) }
42 {
43  fString.append(1,data);
44  return *this;
45 }
47 {
48  fString.append(data);
49  return *this;
50 }
52 {
53  fString.append(data);
54  return *this;
55 }
56 
57 
58 // namespace String Utility
59 
60 void FairUtilString::MakePrintable(const Char_t* in,
61  std::string& out)
62 {
63 
64  Bool_t hasSpecial = false;
65  Int_t index = 0;
66  while ( UChar_t c = in[index++] ) {
67  if ( c == '\\' || c == '\n' || c == '\t' || c == '\'' || c == '\"'
68  || c <= '\x08' || (c >= '\x0b' && c <= '\x1f' ) || c >= '\x7f' ) {
69  hasSpecial = true;
70  break;
71  }
72  }
73  if ( ! hasSpecial ) {
74  out += in;
75  return;
76  }
77  index = 0;
78  while ( UChar_t c = in[index++] ) {
79  // Skip really unprInt_table ones.
80  if ( c <= '\x08' || (c >= '\x0b' && c <= '\x1f' ) || c >= '\x7f' ) { continue; }
81  if ( c == '\\' || c == '\n' || c == '\t' || c == '\'' || c == '\"') {
82  switch ( c ) {
83  case '\\':
84  out += "\\\\";
85  break;
86  case '\n':
87  out += "\\n";
88  break;
89  case '\t':
90  out += "\\t";
91  break;
92  case '\'':
93  out += "\\\'";
94  break;
95  case '\"':
96  out += "\\\"";
97  break;
98  }
99  } else { out += c; }
100  }
101 }
102 
103 void FairUtilString::StringTok(std::vector<std::string>& ls,
104  const std::string& str,
105  const std::string& tok)
106 {
107  const string::size_type S = str.size();
108  const string::size_type toksz = tok.size();
109  string::size_type i = 0;
110 
111  while (i < S) {
112  // eat leading whitespace
113  while ( (i<S) && (tok.find(str[i])<=toksz) ) {
114  ++i;
115  }
116  if (i == S) { return; } // nothing left but WS
117 
118  // find end of word
119  string::size_type j = i+1;
120  while ( (j<S) && !(tok.find(str[j])<=toksz) ) {
121  ++j;
122  }
123 
124  // add word
125  ls.push_back(str.substr(i,j-i));
126 
127  // set up for next loop
128  i = j+1;
129  }
130 }
131 Bool_t FairUtilString::IsInt(const Char_t* s)
132 {
133  Char_t* endptr;
134  Double_t d = strtod(s, &endptr);
135  if (endptr==s && d==0.0) { return false; } // Conversion to Double_t failed...
136 
137  // Check if this number is Int_t or Float_t
138  if (strchr(s,'.')) { return false; }
139  if (strchr(s,'E')) { return false; }
140  if (strchr(s,'e')) { return false; }
141 
142  // All checks for "Int_tness" passed
143  return true;
144 }
145 Bool_t FairUtilString::IsFloat(const Char_t* s)
146 {
147  Char_t* endptr;
148  Double_t d = strtod(s, &endptr);
149  if (endptr==s && d==0.0) { return false; }
150 
151  // All checks for "Float_tness" passed
152  return true;
153 }
154 Bool_t FairUtilString::IsBool(const Char_t* s)
155 {
156  Bool_t isvalid;
157  atob(s,isvalid);
158  return isvalid;
159 }
160 Bool_t FairUtilString::atob(const Char_t* s)
161 {
162  Bool_t isvalid;
163  Bool_t value = atob(s,isvalid);
164  if (isvalid) { return value; }
165 
166  // Oops, what have we here?
167  cout << "-I- FairUtilString Attempt to convert string "
168  << value << " to Bool_t. Result is false \n";
169  return false;
170 
171 }
172 
173 Bool_t FairUtilString::atob(const Char_t* s, Bool_t& isvalid)
174 {
175  isvalid = true;
176 
177  std::string v(s);
178  if (v == "true") { return true; } // C++ style
179  if (v == "false") { return false; }
180  if (v == "kTRUE") { return true; } // ROOT style
181  if (v == "kFALSE") { return false; }
182  if (v == "TRUE") { return true; } // Some other reasonable variations...
183  if (v == "FALSE") { return false; }
184  if (v == "True") { return true; }
185  if (v == "False") { return false; }
186  if (v == "on") { return true; }
187  if (v == "off") { return false; }
188  if (v == "On") { return true; }
189  if (v == "Off") { return false; }
190  if (v == "ON") { return true; }
191  if (v == "OFF") { return false; }
192 
193  isvalid = false;
194  return false; // by default invalid strings are false
195 }
196 
197 
198 Int_t FairUtilString::cmp_nocase(const std::string& s1, const std::string& s2)
199 {
200  std::string::const_iterator p1=s1.begin();
201  std::string::const_iterator p2=s2.begin();
202  while (p1!=s1.end() && p2!=s2.end()) {
203  if (toupper(*p1) != toupper(*p2)) {
204  return (toupper(*p1)<toupper(*p2)) ? -1 : 1;
205  }
206  ++p1;
207  ++p2;
208  }
209  return (s2.size()==s1.size()) ? 0 : (s1.size()<s2.size()) ? -1:1;
210 }
211 
212 Int_t FairUtilString::cmp_wildcard(const std::string& s, const std::string& w)
213 {
214  std::string::size_type locStar = w.find('*');
215  if ( locStar == std::string::npos ) { return s.compare(w); }
216  return strncmp(s.c_str(),w.c_str(),locStar);
217 }
218 
219 
220 std::string FairUtilString::ToUpper(const std::string& str)
221 {
222  std::string out(str);
223  unsigned loc = str.size();
224  while ( loc ) {
225  --loc;
226  out[loc] = toupper(out[loc]);
227  }
228  return out;
229 }
230 
231 std::string FairUtilString::ToLower(const std::string& str)
232 {
233  std::string out(str);
234  unsigned loc = str.size();
235  while ( loc ) {
236  --loc;
237  out[loc] = tolower(out[loc]);
238  }
239  return out;
240 }
241