Back to home page

EIC code displayed by LXR

 
 

    


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