// Copyright (C) 2001 Luc Lussier
#include <sstream>
#include "Tokenizer.h"
using namespace std;
namespace FD {
const static string FILE_NAME = __FILE__;
void string_to_token(Vector<string> &outputVector, const string &inputString, Vector<char> &keepToken, Vector<char> &discardToken)
{
//Clear the output
outputVector.resize(0);
Vector<char> tempVector(inputString.size());
//Place the string in a vector to manipulate it
for (int i = 0; i <inputString.size(); i++) {
tempVector[i] = inputString[i];
}
//Declare and initialize tempVector iterator
Vector<char>::iterator charVectorItBegin(tempVector.begin()), charVectorItEnd(tempVector.begin());
//Test that the keepToken and discardToken vector don't contain an identical element
for (Vector<char>::iterator tempTokenIt(keepToken.begin()); tempTokenIt < keepToken.end(); tempTokenIt++) {
if (discardToken.end() != find(discardToken.begin(), discardToken.end(), *tempTokenIt)) {
// cerr << "ERROR in string_to_token keepToken and discardToken contain an identical character" << endl << flush;
charVectorItBegin = tempVector.end();
charVectorItEnd = tempVector.end();
}
}
while ((charVectorItBegin < tempVector.end()) && (charVectorItEnd < tempVector.end())) {
//Remove initial white space
for (; ((0 != isspace(*charVectorItBegin)) && (charVectorItBegin < tempVector.end()));
charVectorItBegin++) {/* DO NOTHING */}
//Verify if we have reached the end of the string
if (charVectorItBegin >= tempVector.end()) {
break;
}
//Verify if the current character is a discardable character
if (discardToken.end() != find(discardToken.begin(), discardToken.end(), *charVectorItBegin)) {
//Token is to be discarded so increment the begin iterator and continue
charVectorItBegin++;
continue;
}
//Verify if the current character is single character token that we want to keep
if (keepToken.end() != find(keepToken.begin(), keepToken.end(), *charVectorItBegin)) {
//Put the single character token in the outputVector, increment the begin iterator and continue
outputVector.push_back(string(1,*charVectorItBegin));
charVectorItBegin++;
continue;
}
//Initialize the end iterator and
//Move the end iterator to the end of the token being formed.
//Check for the end of the vector
for (charVectorItEnd = charVectorItBegin + 1 ; charVectorItEnd < tempVector.end() ; charVectorItEnd++) {
//Check for a space character
if (0 != isspace(*charVectorItEnd)) {
break;
}
//Check for a discardable character
if (discardToken.end() != find(discardToken.begin(), discardToken.end(), *charVectorItEnd)) {
break;
}
//Check for a single character token
if (keepToken.end() != find(keepToken.begin(), keepToken.end(), *charVectorItEnd)) {
break;
}
}
//Check for iterator error
if (charVectorItBegin == charVectorItEnd) {
// cerr << "ERROR in string_to_token begin and end iterator are identical!" << endl << flush;
break;
}
if (charVectorItBegin == tempVector.end()) {
// cerr << "ERROR in string_to_token begin iterator out of bound!" << endl << flush;
break;
}
//Iterator is valid, place token in the output vector
outputVector.push_back(string(charVectorItBegin, charVectorItEnd));
//Reset the begin iterator
charVectorItBegin = charVectorItEnd;
}
return;
}
bool string_contain_nl_sys_command(Vector<string> &outputVector, string &inputString)
{
//Clear the output
outputVector.resize(0);
Vector<char> keepToken, discardToken;
keepToken.resize(0);
discardToken.resize(0);
string_to_token(outputVector, inputString, keepToken, discardToken);
if ("nl_sys_command" == *(outputVector.begin())) {
return true;
}
return false;
}
string vector_of_string_to_string(Vector<string>::iterator &startOfStringIt, Vector<string> &inputVector, string stringSeparator)
{
string returnString = "";
if (startOfStringIt < inputVector.end()) {
returnString = *startOfStringIt;
} else {
return returnString;
}
for (startOfStringIt++; startOfStringIt != inputVector.end(); startOfStringIt++) {
returnString += stringSeparator;
returnString += *startOfStringIt;
}
return returnString;
}
string int_to_string(int inputInteger)
{
string tempString;
//a complex way of transforming an int into a string...
ostringstream tempBuf;
tempBuf << inputInteger << ends; //you must append ends to the constructed string as the null character is not otherwise added to the string. ???
tempString = tempBuf.str();
return tempString;
}
}//namespace FD
syntax highlighted by Code2HTML, v. 0.9.1