g4tools  5.4.0
path
Go to the documentation of this file.
1 // Copyright (C) 2010, Guy Barrand. All rights reserved.
2 // See the file tools.license for terms.
3 
4 #ifndef tools_path
5 #define tools_path
6 
7 #include <string>
8 
9 namespace tools {
10 
11 inline void suffix(const std::string& a_string,std::string& a_value,bool a_back = true) {
12  // If a_string = dir0/dir1/dir2/dir3/name.xxx
13  // a_value = xxx
14  std::string::size_type pos = a_back?a_string.rfind('.'):a_string.find('.');
15  if(pos==std::string::npos) {a_value.clear();return;}
16  pos++;
17  a_value = a_string.substr(pos,a_string.size()-pos);
18 }
19 
20 inline void nosuffix(const std::string& a_string,std::string& a_value,bool a_back = true){
21  // If a_string = dir0/dir1/dir2/dir3/name.xxx
22  // a_value = name
23  // Start searching after the last / (or last \ for Windows).
24  std::string::size_type pos = a_string.rfind('/');
25  if(pos==std::string::npos) pos = a_string.rfind('\\');
26  if(pos==std::string::npos) pos = 0;
27  else pos++;
28  std::string s = a_string.substr(pos,a_string.size()-pos);
29  std::string::size_type dot_pos = a_back?s.rfind('.'):s.find('.');
30  if(dot_pos==std::string::npos) {
31  a_value = s;
32  } else {
33  a_value = s.substr(0,dot_pos);
34  }
35 }
36 
37 inline void path_no_suffix(const std::string& a_string,std::string& a_value){
38  // If a_string = dir0/dir1/dir2/dir3/name.xxx
39  // a_value = dir0/dir1/dir2/dir3/name
40  std::string::size_type dot_pos = a_string.rfind('.');
41  if(dot_pos==std::string::npos) {
42  a_value = a_string;
43  } else {
44  a_value = a_string.substr(0,dot_pos);
45  }
46 }
47 
48 inline bool has_dir(const std::string& a_string){
49  if(a_string.rfind('/')!=std::string::npos) return true;
50  if(a_string.rfind('\\')!=std::string::npos) return true;
51  return false;
52 }
53 
54 inline void base_name(const std::string& a_path,std::string& a_value) {
55  std::string::size_type pos_slash = a_path.rfind('/');
56  std::string::size_type pos_bslash = a_path.rfind('\\');
57  std::string::size_type pos = 0;
58  if(pos_slash==std::string::npos) {
59  if(pos_bslash==std::string::npos) {
60  pos = std::string::npos;
61  } else {
62  pos = pos_bslash;
63  }
64  } else {
65  if(pos_bslash==std::string::npos) {
66  pos = pos_slash;
67  } else {
68  if(pos_slash<=pos_bslash) {
69  pos = pos_bslash;
70  } else {
71  pos = pos_slash;
72  }
73  }
74  }
75  if(pos==std::string::npos) {a_value = a_path;return;}
76  pos++;
77  a_value = a_path.substr(pos,a_path.size()-pos);
78 }
79 
80 //inline bool first_word(const std::string& a_string,std::string& a_value) {
81 // if(a_string.empty()) {a_value.clear();return false;}
82 // std::string::size_type pos = a_string.find(' ');
83 // if(pos==std::string::npos) {a_value = a_string;return true;}
84 // a_value = a_string.substr(0,pos);
85 // return true;
86 //}
87 
88 inline std::string suffix(const std::string& a_string,bool a_back = true) {
89  std::string value;
90  suffix(a_string,value,a_back);
91  return value;
92 }
93 
94 inline std::string nosuffix(const std::string& a_string,bool a_back = true){
95  std::string value;
96  nosuffix(a_string,value,a_back);
97  return value;
98 }
99 
100 inline std::string base_name(const std::string& a_path) { //deprecated.
101  std::string value;
102  base_name(a_path,value);
103  return value;
104 }
105 
106 inline bool is_absolute_path(const std::string& a_path) {
107  if(a_path.find('\\')!=std::string::npos) { //Windows path.
108  if(a_path.find(':')!=std::string::npos) return true;
109  return (a_path.size()&&(a_path[0]=='\\')?true:false);
110  } else { //UNIX path
111  return (a_path.size()&&(a_path[0]=='/')?true:false);
112  }
113 }
114 
115 inline bool path_name_suffix(const std::string& a_string,std::string& a_path,std::string& a_name,std::string& a_suffix){
116  // If a_string = dir0/dir1/dir2/dir3/name.xxx
117  // a_path = dir0/dir1/dir2/dir3
118  // a_name = name.xxx
119  // a_suffix = xxx
120  // If a_string = dir0/name.xxx
121  // a_path = dir0
122  // a_name = name.xxx
123  // a_suffix = xxx
124  // If a_string = name.xxx
125  // a_path.clear()
126  // a_name = name.xxx
127  // a_suffix = xxx
128  // If a_string = /name.xxx
129  // a_path = "/"
130  // a_name = name.xxx
131  // a_suffix = xxx
132  // If a_string = .
133  // a_path = "."
134  // a_name.clear()
135  // a_suffix.clear()
136  // If a_string = ..
137  // a_path = ".."
138  // a_name.clear()
139  // a_suffix.clear()
140  // If a_string = dir0/dir1/dir2/dir3/
141  // a_path = dir0/dir1/dir2/dir3
142  // a_name.clear()
143  // a_suffix.clear()
144  // If a_string = dir0/dir1/dir2/dir3/.
145  // a_path = dir0/dir1/dir2/dir3
146  // a_name = "."
147  // a_suffix.clear()
148  // If a_string = dir0/dir1/dir2/dir3/..
149  // a_path = dir0/dir1/dir2/dir3
150  // a_name = ".."
151  // a_suffix.clear()
152  if(a_string==".") {
153  a_path = ".";
154  a_name.clear();
155  a_suffix.clear();
156  return true;
157  } else if(a_string=="..") {
158  a_path = "..";
159  a_name.clear();
160  a_suffix.clear();
161  return true;
162  }
163 
164  std::string::size_type pos_slash = a_string.rfind('/');
165  std::string::size_type pos_bslash = a_string.rfind('\\');
166  std::string::size_type pos = 0;
167  if(pos_slash==std::string::npos) {
168  if(pos_bslash==std::string::npos) {
169  pos = std::string::npos;
170  } else {
171  pos = pos_bslash;
172  }
173  } else {
174  if(pos_bslash==std::string::npos) {
175  pos = pos_slash;
176  } else {
177  if(pos_slash<=pos_bslash) {
178  pos = pos_bslash;
179  } else {
180  pos = pos_slash;
181  }
182  }
183  }
184 
185  if(pos==std::string::npos) {
186  a_path.clear();
187  pos = 0;
188  } else if(pos==0) {
189  a_path = "/";
190  pos++;
191  } else {
192  a_path = a_string.substr(0,pos);
193  pos++;
194  }
195  std::string s = a_string.substr(pos,a_string.size()-pos);
196  pos = s.rfind('.');
197  if(pos==std::string::npos) {
198  a_name = s;
199  a_suffix.clear();
200  } else {
201  a_name = s;
202  pos++;
203  a_suffix = s.substr(pos,s.size()-pos);
204  }
205  return true;
206 }
207 
208 inline std::string dir_name(const std::string& a_path,unsigned int a_num = 1){
209  std::string path = a_path;
210  for(unsigned int index=0;index<a_num;index++) {
211  std::string p,n,s;
212  path_name_suffix(path,p,n,s);
213  path = p;
214  }
215  return path;
216 }
217 
218 inline void quote(std::string& a_path) {
219  if(a_path.find(' ')==std::string::npos) return;
220  // path with spaces :
221  if(a_path[0]=='"') return; //Already in double quote.
222  a_path = std::string("\"")+a_path+"\"";
223 }
224 
225 //used in OpenPAW, BatchLab.
226 inline bool is_f77(const std::string& a_path){
227  std::string sfx = suffix(a_path);
228 
229  //tolowercase(sfx);
230  for(std::string::iterator it=sfx.begin();it!=sfx.end();++it) {
231  char c = *it;
232  *it = ((c) >= 'A' && (c) <= 'Z' ? c - 'A' + 'a' : c);
233  }
234 
235  if(sfx=="f") return true; //the standard.
236  if(sfx=="for") return true; //for opaw. Known by g77.
237  if(sfx=="ftn") return true; //for opaw.
238  if(sfx=="fortran") return true; //for opaw.
239  if(sfx=="f77") return true;
240  return false;
241 }
242 
243 //used in OpenPAW, BatchLab.
244 inline bool is_cpp(const std::string& a_path){
245  std::string sfx = suffix(a_path);
246 
247  //tolowercase(sfx);
248  for(std::string::iterator it=sfx.begin();it!=sfx.end();++it) {
249  char c = *it;
250  *it = ((c) >= 'A' && (c) <= 'Z' ? c - 'A' + 'a' : c);
251  }
252 
253  if(sfx=="c") return true;
254  if(sfx=="cxx") return true;
255  if(sfx=="cpp") return true;
256  if(sfx=="C") return true;
257  return false;
258 }
259 
260 //used in OpenPAW, BatchLab.
261 inline bool is_python(const std::string& a_path){
262  std::string sfx = suffix(a_path);
263 
264  //tolowercase(sfx);
265  for(std::string::iterator it=sfx.begin();it!=sfx.end();++it) {
266  char c = *it;
267  *it = ((c) >= 'A' && (c) <= 'Z' ? c - 'A' + 'a' : c);
268  }
269 
270  if(sfx=="py") return true;
271  return false;
272 }
273 
274 }
275 
276 #include <sstream>
277 
278 namespace tools {
279 
280 inline bool url_parse(const std::string& a_url,std::string& a_host,unsigned int& a_port,std::string& a_path) {
281  std::string s;
282  if((a_url.size()>=7)&&(a_url.substr(0,7)=="http://")) {
283  s = a_url.substr(7,a_url.size()-7);
284  } else if((a_url.size()>=8)&&(a_url.substr(0,8)=="https://")) {
285  s = a_url.substr(8,a_url.size()-8);
286  } else {
287  a_host.clear();
288  a_port = 0;
289  a_path.clear();
290  return false;
291  }
292 
293  {std::string::size_type pos = s.find('/');
294  if(pos==std::string::npos) {
295  a_host = s;
296  a_path = "/";
297  } else {
298  a_host = s.substr(0,pos);
299  a_path = s.substr(pos,s.size()-pos);
300  }}
301 
302  {std::string::size_type pos = a_host.find(':');
303  if(pos==std::string::npos) {
304  a_port = 0;
305  } else {
306  std::string sport = a_host.substr(pos+1,a_host.size()-(pos+1));
307  std::istringstream strm(sport.c_str());
308  strm >> a_port;
309  if(strm.fail()) {
310  a_host.clear();
311  a_port = 0;
312  a_path.clear();
313  return false;
314  }
315  a_host = a_host.substr(0,pos);
316  }}
317 
318  return true;
319 }
320 
321 }
322 
323 #endif
tools::path_no_suffix
void path_no_suffix(const std::string &a_string, std::string &a_value)
Definition: path:37
tools::value
Definition: value:18
tools::dir_name
std::string dir_name(const std::string &a_path, unsigned int a_num=1)
Definition: path:208
tools::suffix
void suffix(const std::string &a_string, std::string &a_value, bool a_back=true)
Definition: path:11
tools::has_dir
bool has_dir(const std::string &a_string)
Definition: path:48
tools::path_name_suffix
bool path_name_suffix(const std::string &a_string, std::string &a_path, std::string &a_name, std::string &a_suffix)
Definition: path:115
tools::quote
void quote(std::string &a_path)
Definition: path:218
tools::is_cpp
bool is_cpp(const std::string &a_path)
Definition: path:244
tools::is_f77
bool is_f77(const std::string &a_path)
Definition: path:226
tools
inlined C code : ///////////////////////////////////
Definition: aida_ntuple:26
tools::nosuffix
void nosuffix(const std::string &a_string, std::string &a_value, bool a_back=true)
Definition: path:20
tools::base_name
void base_name(const std::string &a_path, std::string &a_value)
Definition: path:54
tools::is_python
bool is_python(const std::string &a_path)
Definition: path:261
tools::is_absolute_path
bool is_absolute_path(const std::string &a_path)
Definition: path:106
tools::url_parse
bool url_parse(const std::string &a_url, std::string &a_host, unsigned int &a_port, std::string &a_path)
Definition: path:280