Warning, /include/Geant4/tools/path is written in an unsupported language. File is not indexed.
0001 // Copyright (C) 2010, Guy Barrand. All rights reserved.
0002 // See the file tools.license for terms.
0003
0004 #ifndef tools_path
0005 #define tools_path
0006
0007 #include <string>
0008
0009 namespace tools {
0010
0011 inline void suffix(const std::string& a_string,std::string& a_value,bool a_back = true) {
0012 // If a_string = dir0/dir1/dir2/dir3/name.xxx
0013 // a_value = xxx
0014 std::string::size_type pos = a_back?a_string.rfind('.'):a_string.find('.');
0015 if(pos==std::string::npos) {a_value.clear();return;}
0016 pos++;
0017 a_value = a_string.substr(pos,a_string.size()-pos);
0018 }
0019
0020 inline void nosuffix(const std::string& a_string,std::string& a_value,bool a_back = true){
0021 // If a_string = dir0/dir1/dir2/dir3/name.xxx
0022 // a_value = name
0023 // Start searching after the last / (or last \ for Windows).
0024 std::string::size_type pos = a_string.rfind('/');
0025 if(pos==std::string::npos) pos = a_string.rfind('\\');
0026 if(pos==std::string::npos) pos = 0;
0027 else pos++;
0028 std::string _s = a_string.substr(pos,a_string.size()-pos);
0029 std::string::size_type dot_pos = a_back?_s.rfind('.'):_s.find('.');
0030 if(dot_pos==std::string::npos) {
0031 a_value = _s;
0032 } else {
0033 a_value = _s.substr(0,dot_pos);
0034 }
0035 }
0036
0037 inline void path_no_suffix(const std::string& a_string,std::string& a_value){
0038 // If a_string = dir0/dir1/dir2/dir3/name.xxx
0039 // a_value = dir0/dir1/dir2/dir3/name
0040 std::string::size_type dot_pos = a_string.rfind('.');
0041 if(dot_pos==std::string::npos) {
0042 a_value = a_string;
0043 } else {
0044 a_value = a_string.substr(0,dot_pos);
0045 }
0046 }
0047
0048 inline bool has_dir(const std::string& a_string){
0049 if(a_string.rfind('/')!=std::string::npos) return true;
0050 if(a_string.rfind('\\')!=std::string::npos) return true;
0051 return false;
0052 }
0053
0054 inline void base_name(const std::string& a_path,std::string& a_value) {
0055 std::string::size_type pos_slash = a_path.rfind('/');
0056 std::string::size_type pos_bslash = a_path.rfind('\\');
0057 std::string::size_type pos = 0;
0058 if(pos_slash==std::string::npos) {
0059 if(pos_bslash==std::string::npos) {
0060 pos = std::string::npos;
0061 } else {
0062 pos = pos_bslash;
0063 }
0064 } else {
0065 if(pos_bslash==std::string::npos) {
0066 pos = pos_slash;
0067 } else {
0068 if(pos_slash<=pos_bslash) {
0069 pos = pos_bslash;
0070 } else {
0071 pos = pos_slash;
0072 }
0073 }
0074 }
0075 if(pos==std::string::npos) {a_value = a_path;return;}
0076 pos++;
0077 a_value = a_path.substr(pos,a_path.size()-pos);
0078 }
0079
0080 //inline bool first_word(const std::string& a_string,std::string& a_value) {
0081 // if(a_string.empty()) {a_value.clear();return false;}
0082 // std::string::size_type pos = a_string.find(' ');
0083 // if(pos==std::string::npos) {a_value = a_string;return true;}
0084 // a_value = a_string.substr(0,pos);
0085 // return true;
0086 //}
0087
0088 inline std::string suffix(const std::string& a_string,bool a_back = true) {
0089 std::string value;
0090 suffix(a_string,value,a_back);
0091 return value;
0092 }
0093
0094 inline std::string nosuffix(const std::string& a_string,bool a_back = true){
0095 std::string value;
0096 nosuffix(a_string,value,a_back);
0097 return value;
0098 }
0099
0100 inline std::string base_name(const std::string& a_path) { //deprecated.
0101 std::string value;
0102 base_name(a_path,value);
0103 return value;
0104 }
0105
0106 inline bool is_absolute_path(const std::string& a_path) {
0107 if(a_path.find('\\')!=std::string::npos) { //Windows path.
0108 if(a_path.find(':')!=std::string::npos) return true;
0109 return (a_path.size()&&(a_path[0]=='\\')?true:false);
0110 } else { //UNIX path
0111 return (a_path.size()&&(a_path[0]=='/')?true:false);
0112 }
0113 }
0114
0115 inline bool path_name_suffix(const std::string& a_string,std::string& a_path,std::string& a_name,std::string& a_suffix){
0116 // If a_string = dir0/dir1/dir2/dir3/name.xxx
0117 // a_path = dir0/dir1/dir2/dir3
0118 // a_name = name.xxx
0119 // a_suffix = xxx
0120 // If a_string = dir0/name.xxx
0121 // a_path = dir0
0122 // a_name = name.xxx
0123 // a_suffix = xxx
0124 // If a_string = name.xxx
0125 // a_path.clear()
0126 // a_name = name.xxx
0127 // a_suffix = xxx
0128 // If a_string = /name.xxx
0129 // a_path = "/"
0130 // a_name = name.xxx
0131 // a_suffix = xxx
0132 // If a_string = .
0133 // a_path = "."
0134 // a_name.clear()
0135 // a_suffix.clear()
0136 // If a_string = ..
0137 // a_path = ".."
0138 // a_name.clear()
0139 // a_suffix.clear()
0140 // If a_string = dir0/dir1/dir2/dir3/
0141 // a_path = dir0/dir1/dir2/dir3
0142 // a_name.clear()
0143 // a_suffix.clear()
0144 // If a_string = dir0/dir1/dir2/dir3/.
0145 // a_path = dir0/dir1/dir2/dir3
0146 // a_name = "."
0147 // a_suffix.clear()
0148 // If a_string = dir0/dir1/dir2/dir3/..
0149 // a_path = dir0/dir1/dir2/dir3
0150 // a_name = ".."
0151 // a_suffix.clear()
0152 if(a_string==".") {
0153 a_path = ".";
0154 a_name.clear();
0155 a_suffix.clear();
0156 return true;
0157 } else if(a_string=="..") {
0158 a_path = "..";
0159 a_name.clear();
0160 a_suffix.clear();
0161 return true;
0162 }
0163
0164 std::string::size_type pos_slash = a_string.rfind('/');
0165 std::string::size_type pos_bslash = a_string.rfind('\\');
0166 std::string::size_type pos = 0;
0167 if(pos_slash==std::string::npos) {
0168 if(pos_bslash==std::string::npos) {
0169 pos = std::string::npos;
0170 } else {
0171 pos = pos_bslash;
0172 }
0173 } else {
0174 if(pos_bslash==std::string::npos) {
0175 pos = pos_slash;
0176 } else {
0177 if(pos_slash<=pos_bslash) {
0178 pos = pos_bslash;
0179 } else {
0180 pos = pos_slash;
0181 }
0182 }
0183 }
0184
0185 if(pos==std::string::npos) {
0186 a_path.clear();
0187 pos = 0;
0188 } else if(pos==0) {
0189 a_path = "/";
0190 pos++;
0191 } else {
0192 a_path = a_string.substr(0,pos);
0193 pos++;
0194 }
0195 std::string _s = a_string.substr(pos,a_string.size()-pos);
0196 pos = _s.rfind('.');
0197 if(pos==std::string::npos) {
0198 a_name = _s;
0199 a_suffix.clear();
0200 } else {
0201 a_name = _s;
0202 pos++;
0203 a_suffix = _s.substr(pos,_s.size()-pos);
0204 }
0205 return true;
0206 }
0207
0208 inline std::string dir_name(const std::string& a_path,unsigned int a_num = 1){
0209 std::string path = a_path;
0210 for(unsigned int index=0;index<a_num;index++) {
0211 std::string p,n,_s;
0212 path_name_suffix(path,p,n,_s);
0213 path = p;
0214 }
0215 return path;
0216 }
0217
0218 inline void quote(std::string& a_path) {
0219 if(a_path.find(' ')==std::string::npos) return;
0220 // path with spaces :
0221 if(a_path[0]=='"') return; //Already in double quote.
0222 a_path = std::string("\"")+a_path+"\"";
0223 }
0224
0225 //used in OpenPAW, BatchLab.
0226 inline bool is_f77(const std::string& a_path){
0227 std::string sfx = suffix(a_path);
0228
0229 //tolowercase(sfx);
0230 for(std::string::iterator it=sfx.begin();it!=sfx.end();++it) {
0231 char c = *it;
0232 *it = ((c) >= 'A' && (c) <= 'Z' ? c - 'A' + 'a' : c);
0233 }
0234
0235 if(sfx=="f") return true; //the standard.
0236 if(sfx=="for") return true; //for opaw. Known by g77.
0237 if(sfx=="ftn") return true; //for opaw.
0238 if(sfx=="fortran") return true; //for opaw.
0239 if(sfx=="f77") return true;
0240 return false;
0241 }
0242
0243 //used in OpenPAW, BatchLab.
0244 inline bool is_cpp(const std::string& a_path){
0245 std::string sfx = suffix(a_path);
0246
0247 //tolowercase(sfx);
0248 for(std::string::iterator it=sfx.begin();it!=sfx.end();++it) {
0249 char c = *it;
0250 *it = ((c) >= 'A' && (c) <= 'Z' ? c - 'A' + 'a' : c);
0251 }
0252
0253 if(sfx=="c") return true;
0254 if(sfx=="cxx") return true;
0255 if(sfx=="cpp") return true;
0256 if(sfx=="C") return true;
0257 return false;
0258 }
0259
0260 //used in OpenPAW, BatchLab.
0261 inline bool is_python(const std::string& a_path){
0262 std::string sfx = suffix(a_path);
0263
0264 //tolowercase(sfx);
0265 for(std::string::iterator it=sfx.begin();it!=sfx.end();++it) {
0266 char c = *it;
0267 *it = ((c) >= 'A' && (c) <= 'Z' ? c - 'A' + 'a' : c);
0268 }
0269
0270 if(sfx=="py") return true;
0271 return false;
0272 }
0273
0274 }
0275
0276 #include <sstream>
0277
0278 namespace tools {
0279
0280 inline bool url_parse(const std::string& a_url,std::string& a_host,unsigned int& a_port,std::string& a_path) {
0281 std::string _s;
0282 if((a_url.size()>=7)&&(a_url.substr(0,7)=="http://")) {
0283 _s = a_url.substr(7,a_url.size()-7);
0284 } else if((a_url.size()>=8)&&(a_url.substr(0,8)=="https://")) {
0285 _s = a_url.substr(8,a_url.size()-8);
0286 } else {
0287 a_host.clear();
0288 a_port = 0;
0289 a_path.clear();
0290 return false;
0291 }
0292
0293 {std::string::size_type pos = _s.find('/');
0294 if(pos==std::string::npos) {
0295 a_host = _s;
0296 a_path = "/";
0297 } else {
0298 a_host = _s.substr(0,pos);
0299 a_path = _s.substr(pos,_s.size()-pos);
0300 }}
0301
0302 {std::string::size_type pos = a_host.find(':');
0303 if(pos==std::string::npos) {
0304 a_port = 0;
0305 } else {
0306 std::string sport = a_host.substr(pos+1,a_host.size()-(pos+1));
0307 std::istringstream strm(sport.c_str());
0308 strm >> a_port;
0309 if(strm.fail()) {
0310 a_host.clear();
0311 a_port = 0;
0312 a_path.clear();
0313 return false;
0314 }
0315 a_host = a_host.substr(0,pos);
0316 }}
0317
0318 return true;
0319 }
0320
0321 }
0322
0323 #endif