Changeset 994
- Timestamp:
- Apr 5, 2008, 5:54:24 PM (17 years ago)
- Location:
- code/branches/core2/src
- Files:
-
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/core2/src/orxonox/core/CommandExecutor.cc
r993 r994 46 46 47 47 ConsoleCommandShortcutExtern(exec, AccessLevel::None); 48 ConsoleCommandShortcutExtern(echo, AccessLevel::None); 49 50 ConsoleCommandShortcutExtern(read, AccessLevel::None); 51 ConsoleCommandShortcutExtern(append, AccessLevel::None); 52 ConsoleCommandShortcutExtern(write, AccessLevel::None); 48 53 49 54 void exec(const std::string& filename) … … 79 84 80 85 executingFiles.erase(filename); 86 file.close(); 87 } 88 89 std::string echo(const std::string& text) 90 { 91 return text; 92 } 93 94 void write(const std::string& filename, const std::string& text) 95 { 96 std::ofstream file; 97 file.open(filename.c_str(), std::fstream::out); 98 99 if (!file.is_open()) 100 { 101 COUT(1) << "Error: Couldn't write to file \"" << filename << "\"." << std::endl; 102 return; 103 } 104 105 file << text << std::endl; 106 file.close(); 107 } 108 109 void append(const std::string& filename, const std::string& text) 110 { 111 std::ofstream file; 112 file.open(filename.c_str(), std::fstream::app); 113 114 if (!file.is_open()) 115 { 116 COUT(1) << "Error: Couldn't append to file \"" << filename << "\"." << std::endl; 117 return; 118 } 119 120 file << text << std::endl; 121 file.close(); 122 } 123 124 std::string read(const std::string& filename) 125 { 126 std::ifstream file; 127 file.open(filename.c_str(), std::fstream::in); 128 129 if (!file.is_open()) 130 { 131 COUT(1) << "Error: Couldn't read from file \"" << filename << "\"." << std::endl; 132 return ""; 133 } 134 135 std::string output = ""; 136 char line[1024]; 137 while (file.good() && !file.eof()) 138 { 139 file.getline(line, 1024); 140 output += line; 141 output += "\n"; 142 } 143 144 file.close(); 145 146 return output; 81 147 } 82 148 … … 200 266 } 201 267 268 MultiTypeMath CommandEvaluation::getReturnvalue() const 269 { 270 if (this->state_ == CS_Shortcut_Params || this->state_ == CS_Shortcut_Finished) 271 { 272 if (this->shortcut_) 273 return this->shortcut_->getReturnvalue(); 274 } 275 else if (this->state_ == CS_Function_Params || this->state_ == CS_Function_Finished) 276 { 277 if (this->function_) 278 return this->function_->getReturnvalue(); 279 } 280 281 return MT_null; 282 } 283 202 284 203 285 ///////////////////// … … 252 334 bool CommandExecutor::execute(const std::string& command) 253 335 { 254 if ((CommandExecutor::getEvaluation().processedCommand_ != command) || (CommandExecutor::getEvaluation().state_ == CS_Uninitialized)) 255 CommandExecutor::parse(command); 336 std::string strippedCommand = getStrippedEnclosingQuotes(command); 337 338 SubString tokensIO(strippedCommand, " ", SubString::WhiteSpaces, false, '\\', false, '"', false, '(', ')', false, '\0'); 339 if (tokensIO.size() >= 2) 340 { 341 if (tokensIO[tokensIO.size() - 2] == ">") 342 { 343 bool success = CommandExecutor::execute(tokensIO.subSet(0, tokensIO.size() - 2).join()); 344 write(tokensIO[tokensIO.size() - 1], CommandExecutor::getEvaluation().getReturnvalue()); 345 return success; 346 } 347 else if (tokensIO[tokensIO.size() - 2] == "<") 348 { 349 std::string input = read(tokensIO[tokensIO.size() - 1]); 350 if (input == "" || input.size() == 0) 351 return CommandExecutor::execute(tokensIO.subSet(0, tokensIO.size() - 2).join()); 352 else 353 return CommandExecutor::execute(tokensIO.subSet(0, tokensIO.size() - 2).join() + " " + input); 354 } 355 } 356 357 358 SubString tokensPipeline(strippedCommand, "|", SubString::WhiteSpaces, false, '\\', false, '"', false, '(', ')', false, '\0'); 359 if (tokensPipeline.size() > 1) 360 { 361 bool success = true; 362 std::string returnValue = ""; 363 for (int i = tokensPipeline.size() - 1; i >= 0; i--) 364 { 365 if (returnValue == "" || returnValue.size() == 0) 366 { 367 //CommandEvaluation evaluation = CommandExecutor::evaluate(tokens[i]); 368 if (!CommandExecutor::execute(tokensPipeline[i])) 369 success = false; 370 } 371 else 372 { 373 //CommandEvaluation evaluation = CommandExecutor::evaluate(tokens[i] + " " + returnValue); 374 if (!CommandExecutor::execute(tokensPipeline[i] + " " + returnValue)) 375 success = false; 376 } 377 378 //CommandExecutor::execute(evaluation); 379 //returnValue = evaluation.getReturnvalue(); 380 returnValue = CommandExecutor::getEvaluation().getReturnvalue().toString(); 381 } 382 return success; 383 } 384 385 if ((CommandExecutor::getEvaluation().processedCommand_ != strippedCommand) || (CommandExecutor::getEvaluation().state_ == CS_Uninitialized)) 386 CommandExecutor::parse(strippedCommand); 256 387 257 388 return CommandExecutor::execute(CommandExecutor::getEvaluation()); … … 261 392 bool CommandExecutor::execute(const CommandEvaluation& evaluation) 262 393 { 263 SubString tokens(evaluation.processedCommand_, " ", SubString::WhiteSpaces, false, '\\', '"', '(', ')', '\0');394 SubString tokens(evaluation.processedCommand_, " ", SubString::WhiteSpaces, false, '\\', false, '"', false, '(', ')', false, '\0'); 264 395 265 396 if (evaluation.bEvaluatedParams_ && evaluation.evaluatedExecutor_) … … 353 484 std::string CommandExecutor::complete(const CommandEvaluation& evaluation) 354 485 { 355 SubString tokens(evaluation.processedCommand_, " ", SubString::WhiteSpaces, false, '\\', '"', '(', ')', '\0');486 SubString tokens(evaluation.processedCommand_, " ", SubString::WhiteSpaces, false, '\\', false, '"', false, '(', ')', false, '\0'); 356 487 357 488 std::list<std::pair<const std::string*, const std::string*> > temp; … … 444 575 std::string CommandExecutor::hint(const CommandEvaluation& evaluation) 445 576 { 446 SubString tokens(evaluation.processedCommand_, " ", SubString::WhiteSpaces, false, '\\', '"', '(', ')', '\0');577 SubString tokens(evaluation.processedCommand_, " ", SubString::WhiteSpaces, false, '\\', false, '"', false, '(', ')', false, '\0'); 447 578 448 579 switch (evaluation.state_) … … 516 647 void CommandExecutor::parse(const std::string& command, bool bInitialize) 517 648 { 518 CommandExecutor::getEvaluation().tokens_.split((command + COMMAND_EXECUTOR_CURSOR), " ", SubString::WhiteSpaces, false, '\\', '"', '(', ')', '\0');649 CommandExecutor::getEvaluation().tokens_.split((command + COMMAND_EXECUTOR_CURSOR), " ", SubString::WhiteSpaces, false, '\\', false, '"', false, '(', ')', false, '\0'); 519 650 CommandExecutor::getEvaluation().processedCommand_ = command; 520 651 -
code/branches/core2/src/orxonox/core/CommandExecutor.h
r993 r994 62 62 63 63 void exec(const std::string& filename); 64 std::string echo(const std::string& text); 65 66 void write(const std::string& filename, const std::string& text); 67 void append(const std::string& filename, const std::string& text); 68 std::string read(const std::string& filename); 64 69 65 70 enum KeybindMode {}; // temporary … … 87 92 88 93 void evaluateParams(); 94 95 MultiTypeMath getReturnvalue() const; 89 96 90 97 private: -
code/branches/core2/src/orxonox/core/Executor.cc
r967 r994 90 90 { 91 91 // more than one param 92 SubString tokens(params, delimiter, SubString::WhiteSpaces, false, '\\', '"', '(', ')', '\0');92 SubString tokens(params, delimiter, SubString::WhiteSpaces, false, '\\', true, '"', true, '(', ')', true, '\0'); 93 93 94 94 // if there are not enough params given, check if there are default values -
code/branches/core2/src/orxonox/core/Executor.h
r967 r994 76 76 else \ 77 77 { \ 78 SubString tokens(params, delimiter, SubString::WhiteSpaces, false, '\\', '"', '(', ')', '\0'); \79 \78 SubString tokens(params, delimiter, SubString::WhiteSpaces, false, '\\', true, '"', true, '(', ')', true, '\0'); \ 79 \ 80 80 for (unsigned int i = tokens.size(); i < this->functor_->getParamCount(); i++) \ 81 81 { \ … … 86 86 } \ 87 87 } \ 88 \89 MultiTypeMath param[ paramCount]; \88 \ 89 MultiTypeMath param[MAX_FUNCTOR_ARGUMENTS]; \ 90 90 COUT(5) << "Calling Executor " << this->name_ << " through parser with " << paramCount << " parameters, using " << tokens.size() << " tokens ("; \ 91 91 for (unsigned int i = 0; i < tokens.size() && i < MAX_FUNCTOR_ARGUMENTS; i++) \ … … 109 109 } \ 110 110 COUT(5) << ")." << std::endl; \ 111 \ 111 \ 112 if ((tokens.size() > paramCount) && (this->functor_->getTypenameParam(paramCount - 1) == "string")) \ 113 param[paramCount - 1] = tokens.subSet(paramCount - 1).join(); \ 114 \ 112 115 switch(paramCount) \ 113 116 { \ -
code/branches/core2/src/orxonox/core/InputBuffer.cc
r972 r994 36 36 { 37 37 this->bActivated_ = false; 38 this->allowedChars_ = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZäöüÄÖÜ0123456789 \"().:,;_-+*/=!? ";38 this->allowedChars_ = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZäöüÄÖÜ0123456789 \"().:,;_-+*/=!?<>[|]"; 39 39 this->keyboard_ = keyboard; 40 40 this->buffer_ = ""; -
code/branches/core2/src/orxonox/core/Namespace.cc
r902 r994 72 72 while ((pos = name.find('\t')) != std::string::npos) 73 73 name.replace(pos, 1, " "); 74 SubString tokens(name, " ", "", false, '\\', '"', '\0', '\0', '\0');74 SubString tokens(name, " ", "", false, '\\', true, '"', true, '\0', '\0', true, '\0'); 75 75 if (this->bRoot_) 76 76 { -
code/branches/core2/src/orxonox/core/OutputHandler.h
r955 r994 60 60 61 61 /** @brief Puts some text on the outstream. @param text The text */ 62 static inline voidlog(const std::string& text)63 { OutputHandler::getOutStream().setOutputLevel(0); OutputHandler::getOutStream().output(text + "\n"); }62 static inline std::string log(const std::string& text) 63 { OutputHandler::getOutStream().setOutputLevel(0); OutputHandler::getOutStream().output(text + "\n"); return text; } 64 64 65 65 /** @brief Returns a reference to the logfile. @return The logfile */ -
code/branches/core2/src/orxonox/core/XMLPort.h
r947 r994 32 32 #include "util/MultiTypeMath.h" 33 33 #include "util/tinyxml/ticpp.h" 34 #include "util/SubString.h"35 34 #include "Executor.h" 36 35 #include "Debug.h" -
code/branches/core2/src/util/Convert.h
r961 r994 407 407 if ((opening_parenthesis = input.find('(')) == std::string::npos) { opening_parenthesis = 0; } else { opening_parenthesis++; } 408 408 409 SubString tokens(input.substr(opening_parenthesis, closing_parenthesis - opening_parenthesis), ",", SubString::WhiteSpaces, false, '\\', '"', '\0', '\0', '\0');409 SubString tokens(input.substr(opening_parenthesis, closing_parenthesis - opening_parenthesis), ",", SubString::WhiteSpaces, false, '\\', true, '"', true, '\0', '\0', true, '\0'); 410 410 411 411 if (tokens.size() >= 2) … … 433 433 if ((opening_parenthesis = input.find('(')) == std::string::npos) { opening_parenthesis = 0; } else { opening_parenthesis++; } 434 434 435 SubString tokens(input.substr(opening_parenthesis, closing_parenthesis - opening_parenthesis), ",", SubString::WhiteSpaces, false, '\\', '"', '\0', '\0', '\0');435 SubString tokens(input.substr(opening_parenthesis, closing_parenthesis - opening_parenthesis), ",", SubString::WhiteSpaces, false, '\\', true, '"', true, '\0', '\0', true, '\0'); 436 436 437 437 if (tokens.size() >= 3) … … 461 461 if ((opening_parenthesis = input.find('(')) == std::string::npos) { opening_parenthesis = 0; } else { opening_parenthesis++; } 462 462 463 SubString tokens(input.substr(opening_parenthesis, closing_parenthesis - opening_parenthesis), ",", SubString::WhiteSpaces, false, '\\', '"', '\0', '\0', '\0');463 SubString tokens(input.substr(opening_parenthesis, closing_parenthesis - opening_parenthesis), ",", SubString::WhiteSpaces, false, '\\', true, '"', true, '\0', '\0', true, '\0'); 464 464 465 465 if (tokens.size() >= 4) … … 491 491 if ((opening_parenthesis = input.find('(')) == std::string::npos) { opening_parenthesis = 0; } else { opening_parenthesis++; } 492 492 493 SubString tokens(input.substr(opening_parenthesis, closing_parenthesis - opening_parenthesis), ",", SubString::WhiteSpaces, false, '\\', '"', '\0', '\0', '\0');493 SubString tokens(input.substr(opening_parenthesis, closing_parenthesis - opening_parenthesis), ",", SubString::WhiteSpaces, false, '\\', true, '"', true, '\0', '\0', true, '\0'); 494 494 495 495 if (tokens.size() >= 4) … … 521 521 if ((opening_parenthesis = input.find('(')) == std::string::npos) { opening_parenthesis = 0; } else { opening_parenthesis++; } 522 522 523 SubString tokens(input.substr(opening_parenthesis, closing_parenthesis - opening_parenthesis), ",", SubString::WhiteSpaces, false, '\\', '"', '\0', '\0', '\0');523 SubString tokens(input.substr(opening_parenthesis, closing_parenthesis - opening_parenthesis), ",", SubString::WhiteSpaces, false, '\\', true, '"', true, '\0', '\0', true, '\0'); 524 524 525 525 if (tokens.size() >= 4) -
code/branches/core2/src/util/String.cc
r957 r994 52 52 std::string output = std::string(str); 53 53 strip(&output); 54 return output; 55 } 56 57 /** 58 @brief Removes enclosing quotes if available. 59 @brief str The string to strip 60 */ 61 void stripEnclosingQuotes(std::string* str) 62 { 63 unsigned int start = std::string::npos; 64 unsigned int end = 0; 65 66 for (unsigned int pos = 0; (pos < (*str).size()) && (pos < std::string::npos); pos++) 67 { 68 if ((*str)[pos] == '"') 69 { 70 start = pos; 71 break; 72 } 73 74 if (((*str)[pos] != ' ') && ((*str)[pos] != '\t') && ((*str)[pos] != '\n')) 75 return; 76 } 77 78 for (unsigned int pos = (*str).size() - 1; pos < std::string::npos; pos--) 79 { 80 if ((*str)[pos] == '"') 81 { 82 end = pos; 83 break; 84 } 85 86 if (((*str)[pos] != ' ') && ((*str)[pos] != '\t') && ((*str)[pos] != '\n')) 87 return; 88 } 89 90 if ((start != std::string::npos) && (end != 0)) 91 (*str) = (*str).substr(start + 1, end - start - 1); 92 } 93 94 /** 95 @brief Returns a copy of the string with removed enclosing quotes (if available). 96 @brief str The string to strip 97 @return The striped copy of the string 98 */ 99 std::string getStrippedEnclosingQuotes(const std::string& str) 100 { 101 std::string output = std::string(str); 102 stripEnclosingQuotes(&output); 54 103 return output; 55 104 } -
code/branches/core2/src/util/String.h
r933 r994 36 36 _UtilExport void strip(std::string* str); 37 37 _UtilExport std::string getStripped(const std::string& str); 38 39 _UtilExport void stripEnclosingQuotes(std::string* str); 40 _UtilExport std::string getStrippedEnclosingQuotes(const std::string& str); 38 41 39 42 _UtilExport bool isEmpty(const std::string& str); -
code/branches/core2/src/util/SubString.cc
r871 r994 66 66 SubString::SubString(const std::string& string, 67 67 const std::string& delimiters, const std::string& delimiterNeighbours, bool emptyEntries, 68 char escapeChar, char safemode_char, char openparenthesis_char, char closeparenthesis_char, char comment_char) 69 { 70 SubString::splitLine(this->strings, string, delimiters, delimiterNeighbours, emptyEntries, escapeChar, safemode_char, openparenthesis_char, closeparenthesis_char, comment_char); 68 char escapeChar, bool removeExcapeChar, char safemode_char, bool removeSafemodeChar, 69 char openparenthesis_char, char closeparenthesis_char, bool removeParenthesisChars, char comment_char) 70 { 71 SubString::splitLine(this->strings, this->bInSafemode, string, delimiters, delimiterNeighbours, emptyEntries, escapeChar, removeExcapeChar, safemode_char, removeSafemodeChar, openparenthesis_char, closeparenthesis_char, removeParenthesisChars, comment_char); 71 72 } 72 73 … … 79 80 { 80 81 for (unsigned int i = subSetBegin; i < subString.size(); i++) 82 { 81 83 this->strings.push_back(subString[i]); 84 this->bInSafemode.push_back(subString.isInSafemode(i)); 85 } 82 86 } 83 87 … … 91 95 SubString::SubString(const SubString& subString, unsigned int subSetBegin, unsigned int subSetEnd) 92 96 { 93 for (unsigned int i = subSetBegin; i < subString.size() || i < subSetEnd; i++) 97 for (unsigned int i = subSetBegin; i < subString.size() && i < subSetEnd; i++) 98 { 94 99 this->strings.push_back(subString[i]); 100 this->bInSafemode.push_back(subString.isInSafemode(i)); 101 } 95 102 } 96 103 … … 103 110 { 104 111 for(unsigned int i = 0; i < argc; ++i) 112 { 105 113 this->strings.push_back(std::string(argv[i])); 114 this->bInSafemode.push_back(false); 115 } 106 116 } 107 117 … … 129 139 { 130 140 this->strings = subString.strings; 141 this->bInSafemode = subString.bInSafemode; 131 142 return *this; 132 143 } … … 140 151 bool SubString::operator==(const SubString& subString) const 141 152 { 142 return ( this->strings == subString.strings);153 return ((this->strings == subString.strings) && (this->bInSafemode == subString.bInSafemode)); 143 154 } 144 155 … … 165 176 166 177 for (unsigned int i = 0; i < length; i++) 167 if ( this->strings[i] != subString.strings[i])178 if ((this->strings[i] != subString.strings[i]) || (this->bInSafemode[i] != subString.bInSafemode[i])) 168 179 return false; 169 180 return true; … … 190 201 { 191 202 for (unsigned int i = 0; i < subString.size(); i++) 203 { 192 204 this->strings.push_back(subString[i]); 205 this->bInSafemode.push_back(subString.isInSafemode(i)); 206 } 193 207 return *this; 194 208 } … … 203 217 { 204 218 this->strings.clear(); 219 this->bInSafemode.clear(); 205 220 char split[2]; 206 221 split[0] = splitter; 207 222 split[1] = '\0'; 208 SubString::splitLine(this->strings, string, split);223 SubString::splitLine(this->strings, this->bInSafemode, string, split); 209 224 return strings.size(); 210 225 } … … 223 238 unsigned int SubString::split(const std::string& string, 224 239 const std::string& delimiters, const std::string& delimiterNeighbours, bool emptyEntries, 225 char escapeChar, char safemode_char, char openparenthesis_char, char closeparenthesis_char, char comment_char) 240 char escapeChar, bool removeExcapeChar, char safemode_char, bool removeSafemodeChar, 241 char openparenthesis_char, char closeparenthesis_char, bool removeParenthesisChars, char comment_char) 226 242 { 227 243 this->strings.clear(); 228 SubString::splitLine(this->strings, string, delimiters, delimiterNeighbours, emptyEntries, escapeChar, safemode_char, openparenthesis_char, closeparenthesis_char, comment_char); 244 this->bInSafemode.clear(); 245 SubString::splitLine(this->strings, this->bInSafemode, string, delimiters, delimiterNeighbours, emptyEntries, escapeChar, removeExcapeChar, safemode_char, removeSafemodeChar, openparenthesis_char, closeparenthesis_char, removeParenthesisChars, comment_char); 229 246 return this->strings.size(); 230 247 } … … 292 309 * @param escape_char: Escape carater (escapes splitters) 293 310 * @param safemode_char: the beginning of the safemode is marked with this 311 * @param removeSafemodeChar removes the safemode_char from the beginning and the ending of a token 312 * @param openparenthesis_char the beginning of a safemode is marked with this 313 * @param closeparenthesis_char the ending of a safemode is marked with this 314 * @param removeParenthesisChars removes the parenthesis from the beginning and the ending of a token 294 315 * @param comment_char: the beginning of a comment is marked with this: (until the end of a Line) 295 316 * @param start_state: the Initial state on how to parse the String. 296 * @return sSPLIT_LINE_STATE the parser was in when returning317 * @return SPLIT_LINE_STATE the parser was in when returning 297 318 * 298 319 * This is the Actual Splitting Algorithm from Clemens Wacha … … 302 323 SubString::SPLIT_LINE_STATE 303 324 SubString::splitLine(std::vector<std::string>& ret, 325 std::vector<bool>& bInSafemode, 304 326 const std::string& line, 305 327 const std::string& delimiters, … … 307 329 bool emptyEntries, 308 330 char escape_char, 331 bool removeExcapeChar, 309 332 char safemode_char, 333 bool removeSafemodeChar, 310 334 char openparenthesis_char, 311 335 char closeparenthesis_char, 336 bool removeParenthesisChars, 312 337 char comment_char, 313 338 SPLIT_LINE_STATE start_state) … … 318 343 319 344 std::string token; 345 bool inSafemode = false; 320 346 321 347 if(start_state != SL_NORMAL && ret.size() > 0) … … 323 349 token = ret[ret.size()-1]; 324 350 ret.pop_back(); 351 } 352 if(start_state != SL_NORMAL && bInSafemode.size() > 0) 353 { 354 inSafemode = bInSafemode[bInSafemode.size()-1]; 355 bInSafemode.pop_back(); 325 356 } 326 357 … … 333 364 { 334 365 state = SL_ESCAPE; 366 if (!removeExcapeChar) 367 token += line[i]; 335 368 } 336 369 else if(line[i] == safemode_char) 337 370 { 338 371 state = SL_SAFEMODE; 372 inSafemode = true; 373 if (!removeSafemodeChar) 374 token += line[i]; 339 375 } 340 376 else if(line[i] == openparenthesis_char) 341 377 { 342 378 state = SL_PARENTHESES; 379 inSafemode = true; 380 if (!removeParenthesisChars) 381 token += line[i]; 343 382 } 344 383 else if(line[i] == comment_char) … … 351 390 ret.push_back(token); 352 391 token.clear(); 392 bInSafemode.push_back(inSafemode); 393 inSafemode = false; 353 394 } 354 395 token += line[i]; // EAT … … 365 406 ret.push_back(token); 366 407 token.clear(); 408 bInSafemode.push_back(inSafemode); 409 inSafemode = false; 367 410 } 368 411 state = SL_NORMAL; … … 386 429 break; 387 430 case SL_ESCAPE: 388 if(line[i] == 'n') token += '\n'; 389 else if(line[i] == 't') token += '\t'; 390 else if(line[i] == 'v') token += '\v'; 391 else if(line[i] == 'b') token += '\b'; 392 else if(line[i] == 'r') token += '\r'; 393 else if(line[i] == 'f') token += '\f'; 394 else if(line[i] == 'a') token += '\a'; 395 else if(line[i] == '?') token += '\?'; 396 else token += line[i]; // EAT 431 if (!removeSafemodeChar) 432 token += line[i]; 433 else 434 { 435 if(line[i] == 'n') token += '\n'; 436 else if(line[i] == 't') token += '\t'; 437 else if(line[i] == 'v') token += '\v'; 438 else if(line[i] == 'b') token += '\b'; 439 else if(line[i] == 'r') token += '\r'; 440 else if(line[i] == 'f') token += '\f'; 441 else if(line[i] == 'a') token += '\a'; 442 else if(line[i] == '?') token += '\?'; 443 else token += line[i]; // EAT 444 } 397 445 state = SL_NORMAL; 398 446 break; … … 401 449 { 402 450 state = SL_NORMAL; 451 if (!removeSafemodeChar) 452 token += line[i]; 403 453 } 404 454 else if(line[i] == escape_char) … … 429 479 { 430 480 state = SL_NORMAL; 481 if (!removeParenthesisChars) 482 token += line[i]; 431 483 } 432 484 else if(line[i] == escape_char) … … 461 513 ret.push_back(token); 462 514 token.clear(); 515 bInSafemode.push_back(inSafemode); 516 inSafemode = false; 463 517 } 464 518 state = SL_NORMAL; … … 484 538 ret.push_back(token); 485 539 token.clear(); 540 bInSafemode.push_back(inSafemode); 541 inSafemode = false; 486 542 } 487 543 return(state); -
code/branches/core2/src/util/SubString.h
r871 r994 88 88 SubString(const std::string& string, 89 89 const std::string& delimiters, const std::string& delimiterNeighbours = "", bool emptyEntries=false, 90 char escapeChar ='\\', char safemode_char = '"', char openparenthesis_char = '(', char closeparenthesis_char = ')', char comment_char = '\0'); 90 char escapeChar ='\\', bool removeExcapeChar = true, char safemode_char = '"', bool removeSafemodeChar = true, 91 char openparenthesis_char = '(', char closeparenthesis_char = ')', bool removeParenthesisChars = true, char comment_char = '\0'); 91 92 SubString(unsigned int argc, const char** argv); 92 93 /** @brief create a Substring as a copy of another one. @param subString the SubString to copy. */ … … 111 112 unsigned int split(const std::string& string, 112 113 const std::string& delimiters, const std::string& delimiterNeighbours = "", bool emptyEntries = false, 113 char escapeChar ='\\', char safemode_char = '"', char openparenthesis_char = '(', char closeparenthesis_char = ')', char comment_char = '\0'); 114 char escapeChar ='\\', bool removeExcapeChar = true, char safemode_char = '"', bool removeSafemodeChar = true, 115 char openparenthesis_char = '(', char closeparenthesis_char = ')', bool removeParenthesisChars = true, char comment_char = '\0'); 114 116 std::string join(const std::string& delimiter = " ") const; 115 117 //////////////////////////////////////// … … 120 122 121 123 // retrieve Information from within 122 /** @ returns true if the SubString is empty */124 /** @brief Returns true if the SubString is empty */ 123 125 inline bool empty() const { return this->strings.empty(); }; 124 /** @ returns the count of Strings stored in this substring */126 /** @brief Returns the count of Strings stored in this substring */ 125 127 inline unsigned int size() const { return this->strings.size(); }; 126 /** @ param i the i'th String @returns the i'th string from the subset of Strings*/128 /** @brief Returns the i'th string from the subset of Strings @param i the i'th String */ 127 129 inline const std::string& operator[](unsigned int i) const { return this->strings[i]; }; 128 /** @ param i the i'th String @returns the i'th string from the subset of Strings*/130 /** @brief Returns the i'th string from the subset of Strings @param i the i'th String */ 129 131 inline const std::string& getString(unsigned int i) const { return (*this)[i]; }; 130 /** @returns the front of the StringList. */ 132 /** @brief Returns true if the token is in safemode. @param i the i'th token */ 133 inline bool isInSafemode(unsigned int i) const { return this->bInSafemode[i]; } 134 /** @brief Returns the front of the StringList. */ 131 135 inline const std::string& front() const { return this->strings.front(); }; 132 /** @ returns the back of the StringList. */136 /** @brief Returns the back of the StringList. */ 133 137 inline const std::string& back() const { return this->strings.back(); }; 134 138 /** @brief removes the back of the strings list. */ 135 inline void pop_back() { this->strings.pop_back(); };139 inline void pop_back() { this->strings.pop_back(); this->bInSafemode.pop_back(); }; 136 140 137 141 // the almighty algorithm. 138 142 static SPLIT_LINE_STATE splitLine(std::vector<std::string>& ret, 143 std::vector<bool>& bInSafemode, 139 144 const std::string& line, 140 145 const std::string& delimiters = SubString::WhiteSpaces, … … 142 147 bool emptyEntries = false, 143 148 char escape_char = '\\', 149 bool removeExcapeChar = true, 144 150 char safemode_char = '"', 151 bool removeSafemodeChar = true, 145 152 char openparenthesis_char = '(', 146 153 char closeparenthesis_char = ')', 154 bool removeParenthesisChars = true, 147 155 char comment_char = '\0', 148 156 SPLIT_LINE_STATE start_state = SL_NORMAL); … … 157 165 private: 158 166 std::vector<std::string> strings; //!< strings produced from a single string splitted in multiple strings 167 std::vector<bool> bInSafemode; 159 168 }; 160 169
Note: See TracChangeset
for help on using the changeset viewer.