Geant4 Cross Reference |
1 // Copyright (C) 2010, Guy Barrand. All rights 1 // Copyright (C) 2010, Guy Barrand. All rights reserved. 2 // See the file tools.license for terms. 2 // See the file tools.license for terms. 3 3 4 #ifndef tools_tokenize 4 #ifndef tools_tokenize 5 #define tools_tokenize 5 #define tools_tokenize 6 6 7 #include <string> 7 #include <string> 8 #include <vector> 8 #include <vector> 9 9 10 namespace tools { 10 namespace tools { 11 11 12 inline bool double_quotes_get_token(const std: 12 inline bool double_quotes_get_token(const std::string& a_cmd,std::string::size_type a_begIdx, 13 std::strin 13 std::string::size_type& a_endIdx,std::string& a_token) { 14 while ( a_cmd[a_begIdx] == ' ') ++a_begIdx; 14 while ( a_cmd[a_begIdx] == ' ') ++a_begIdx; // Loop checking, 23.06.2015, I. Hrivnacova 15 if ( a_cmd[a_begIdx] == '"' ) { 15 if ( a_cmd[a_begIdx] == '"' ) { 16 a_endIdx = a_cmd.find('"', a_begIdx+1); 16 a_endIdx = a_cmd.find('"', a_begIdx+1); 17 if ( a_endIdx == std::string::npos ) a_end 17 if ( a_endIdx == std::string::npos ) a_endIdx = a_cmd.length(); 18 a_token = a_cmd.substr(a_begIdx+1, (a_endI 18 a_token = a_cmd.substr(a_begIdx+1, (a_endIdx-1)-a_begIdx); 19 ++a_endIdx; 19 ++a_endIdx; 20 } 20 } 21 else { 21 else { 22 a_endIdx = a_cmd.find(' ', a_begIdx); 22 a_endIdx = a_cmd.find(' ', a_begIdx); 23 if ( a_endIdx == std::string::npos ) a_end 23 if ( a_endIdx == std::string::npos ) a_endIdx = a_cmd.length(); 24 a_token = a_cmd.substr(a_begIdx, a_endIdx- 24 a_token = a_cmd.substr(a_begIdx, a_endIdx-a_begIdx); 25 } 25 } 26 return ( a_token.length() > 0 ); 26 return ( a_token.length() > 0 ); 27 } 27 } 28 28 29 // From a string, double_quotes_tokenize perm 29 // From a string, double_quotes_tokenize permits to get arguments 30 // by taking into account strings enclosed by 30 // by taking into account strings enclosed by double quotes and potentially 31 // containing spaces (for example to specify a 31 // containing spaces (for example to specify a file path containing spaces). 32 // Example: 32 // Example: 33 // if a_cmd is the string: aa bbb "ccc ddd" 33 // if a_cmd is the string: aa bbb "ccc ddd" ee "fff gg" 34 // Returned a_args string list will be: 34 // Returned a_args string list will be: 35 // "aa", "bb", "ccc ddd", "ee", "fff gg" 35 // "aa", "bb", "ccc ddd", "ee", "fff gg" 36 // Algorithm from Geant4/G4AnalysisUtilities. 36 // Algorithm from Geant4/G4AnalysisUtilities.cc/Tokenize() done by Ivana Hrivnacova. 37 37 38 inline void double_quotes_tokenize(const std:: 38 inline void double_quotes_tokenize(const std::string& a_cmd, std::vector<std::string>& a_args) { 39 std::string::size_type begIdx = 0; 39 std::string::size_type begIdx = 0; 40 std::string::size_type endIdx = 0; 40 std::string::size_type endIdx = 0; 41 std::string token; 41 std::string token; 42 do { 42 do { 43 if ( double_quotes_get_token(a_cmd, begIdx 43 if ( double_quotes_get_token(a_cmd, begIdx, endIdx, token) ) { 44 a_args.push_back(token); 44 a_args.push_back(token); 45 } 45 } 46 begIdx = endIdx + 1; 46 begIdx = endIdx + 1; 47 } 47 } 48 while ( endIdx < a_cmd.length() ); // Loop c 48 while ( endIdx < a_cmd.length() ); // Loop checking, 23.06.2015, I. Hrivnacova 49 } 49 } 50 50 51 } 51 } 52 52 53 #endif 53 #endif