Rev 14 | Rev 39 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
#include "String.h"#include <sstream>#include <stdarg.h>namespace Utils {String operator+(const char *str1, const String &str2){return String(str1) + str2;}String::String(void) { this->assign(""); }String::String(const char *str) { this->assign(str); }String::String(const unsigned char *str) { this->assign((const char *)str); }String::String(const std::string &str) { this->assign(str);}String::String(const unsigned char c) { this->assign(1, c); }String::String(const char c) { this->assign(1, c); }String::String(const String &str) { this->assign(str); }String::String(long l) { this->fromLong(l); }String::String(unsigned long l) { this->fromLong((long)l); }String::String(float f) { this->fromFloat(f); }String::String(double f) { this->fromDouble(f); }String::~String(void){}/////////////////////////////////////////////////////////////////// Conversion functionsvoid String::fromLong(long l){std::stringstream strstream;strstream << l;*this = strstream.str();}void String::fromFloat(float f, int dp){std::stringstream strstream;strstream.precision(dp);strstream << std::fixed << f;*this = strstream.str();}void String::fromFloat(float f){std::stringstream strstream;strstream << f;*this = strstream.str();}void String::fromDouble(double f){std::stringstream strstream;strstream << f;*this = strstream.str();}const String &String::format(const char *sFormat, ...){char buffer[1024];va_list args;va_start (args, sFormat);vsprintf (buffer, sFormat, args);va_end (args);this->assign(buffer);return (*this);}String String::fromFormat(const char *sFormat, ...){char buffer[1024];va_list args;va_start (args, sFormat);vsprintf (buffer, sFormat, args);va_end (args);return String(buffer);}long String::toLong() const{return atoi(this->c_str());}double String::toDouble() const{return atof(this->c_str());}float String::toFloat() const{return (float)atof(this->c_str());}const String &String::operator= ( const char *str ) { this->assign(str); return (*this); }const String &String::operator= ( const unsigned char *str ) { this->assign((const char *)str); return (*this); }const String &String::operator= ( const String &str ) { this->assign((std::string &)str); return (*this); }const String &String::operator= ( const std::string &str ) { this->assign(str); return (*this); }const String &String::operator= ( unsigned char c ) { this->assign(1, c); return (*this); }const String &String::operator= ( char c ) { this->assign(1, c); return (*this); }const String &String::operator= ( long l ) { this->fromLong(l); return (*this); }const String &String::operator= ( unsigned long l ) { this->fromLong(l); return (*this); }const String &String::operator= ( float f ) { this->fromFloat(f); return (*this); }const String &String::operator= ( double f ) { this->fromDouble(f); return (*this); }const unsigned char String::operator[] ( int num ) const { return this->at(num); }unsigned char &String::operator[] ( int num ) { return (unsigned char &)this->at(num); }const String &String::operator+= ( const char *str ) { this->append(str); return (*this); }const String &String::operator+= ( const unsigned char *str ) { this->append((const char *)str); return (*this); }const String &String::operator+= ( const std::string &str ) { this->append(str); return (*this); }const String &String::operator+= ( const String &str ) { this->append(str); return (*this); }const String &String::operator+= ( const char c ) { this->append(1, c); return (*this); }const String &String::operator+= ( const unsigned char c ) { this->append(1, c); return (*this); }const String &String::operator+= ( const unsigned long l ){std::stringstream strm;strm << (*this) << l;strm >> (*this);return (*this);}const String &String::operator+= ( const long l ){std::stringstream strm;strm << (*this) << l;*this = strm.str();return (*this);}const String &String::operator+= ( const float f ){std::stringstream strm;strm << (*this) << f;*this = strm.str();return (*this);}const String &String::operator+= ( const double f ){std::stringstream strm;strm << (*this) << f;*this = strm.str();return (*this);}String String::operator+ ( const char *str ) const { return String(*this) += str; }String String::operator+ ( const unsigned char *str ) const { return String(*this) += str; }String String::operator+ ( const std::string &str ) const { return String(*this) += str; }String String::operator+ ( const String &str ) const { return String(*this) += str; }String String::operator+ ( const char c ) const { return String(*this) += c; }String String::operator+ ( const unsigned char c ) const { return String(*this) += c; }String String::operator+ ( const long l ) const { return String(*this) += l; }String String::operator+ ( const unsigned long l ) const { return String(*this) += l; }String String::operator+ ( const float f ) const { return String(*this) += f; }String String::operator+ ( const double f ) const { return String(*this) += f; }bool String::operator== ( const char *str ) const { return (this->compare(str)) ? false : true; }bool String::operator== ( const unsigned char *str ) const { return (this->compare((const char *)str)) ? false : true; }bool String::operator== ( const std::string &str ) const { return (this->compare(str)) ? false : true; }bool String::operator== ( const String &str ) const { return (this->compare(str)) ? false : true; }bool String::operator!= ( const char *str ) const { return (this->compare(str)) ? true : false; }bool String::operator!= ( const unsigned char *str ) const { return (this->compare((const char *)str)) ? true : false; }bool String::operator!= ( const std::string &str ) const { return (this->compare(str)) ? true : false; }bool String::operator!= ( const String &str ) const { return (this->compare(str)) ? true : false; }bool String::Compare(const String &str, bool bCaseSensative) const{if ( bCaseSensative ) {return (this->compare(str) == 0) ? true : false;}if ( str.length() != this->length() ) return false;for ( unsigned int i = 0; i < str.length(); i++ ) {if ( tolower(this->at(i)) != tolower(str[i]) ) {return false;}}return true;}bool String::Compare(const unsigned char *str, bool bCaseSensative) const{return this->Compare((const char *)str, bCaseSensative);}bool String::Compare(const char *str, bool bCaseSensative) const{if ( bCaseSensative ) {return (this->compare(str) == 0) ? true : false;}if ( strlen(str) != this->length() ) return false;for ( unsigned int i = 0; i < this->length(); i++ ) {if ( tolower(this->at(i)) != tolower(*(str + i)) ) {return false;}}return true;}String String::token(const char *token, int tok) const{return this->tokens(token, tok, tok);}String String::tokens(const char *token, int from, int to) const{if ( this->empty() ) return "";int max = this->countToken(token);std::string newstr;int whichtok = 1;std::string::size_type lastPos = 0;std::string::size_type pos = _token_nextPos(token, 0);if ( from < 0 )from = max + (from + 1);if ( to < 0 )to = max + (to + 1);while (std::string::npos != pos || std::string::npos != lastPos){if ( to == 0 ){if ( whichtok >= from ){if ( newstr != "" ) newstr = newstr + token;newstr = newstr + this->substr(lastPos, pos - lastPos);}}else{if ( (whichtok >= from) && (whichtok <= to) ){if ( newstr != "" ) newstr = newstr + token;newstr = newstr + this->substr(lastPos, pos - lastPos);}if ( whichtok > to )break;}// Found a token, add it to the vector.whichtok++;if ( pos >= this->length() )break;// skip past tokensize_t i = 0;size_t max = strlen(token);lastPos = pos;while ( (i < max) && (token[i] == this->at(lastPos)) ){++i;++lastPos;}// get the next tokenpos = _token_nextPos(token, lastPos);}return newstr;}int String::countToken(const char *token) const{if ( this->empty() )return 0;// finds the number of tokens in a stringint found = 1;std::string tmpstr = *this;// ignore the initial spacesstd::string::size_type pos = this->find_first_not_of(token, 0);// remove end spacessize_t i = tmpstr.size() - 1;while ( tmpstr[i] == ' ' && i > 0 )i--;if ( i <= 0 ) return 0;tmpstr.erase ( i + 1, tmpstr.size() - i );// count tokenspos = tmpstr.find (token,pos + 1);while ( pos < std::string::npos ){while (tmpstr[pos] == ' ')pos++;found++;pos = tmpstr.find (token,pos + 1);}// return number of tokensreturn found;}std::string::size_type String::_token_nextPos(const char *token, std::string::size_type curPos) const{bool found = false;std::string::size_type startPos = 0;size_t max = strlen(token);while ( !found ) {found = true;startPos = this->find_first_of(token[0], curPos);if ( startPos == std::string::npos ) {startPos = this->length();break;}std::string::size_type pos = startPos;size_t i = 1;while ( i < max ){++pos;if ( this->at(pos) != token[i] ){found = false;break;}++i;}curPos = pos;}return startPos;}String String::findReplace(const String &find, const String &replace ) const{std::string newstr = *this;std::string::size_type pos = newstr.find(find, 0);while ( pos < std::string::npos ) {newstr.replace(pos, find.length(), replace);pos = newstr.find(find, pos + replace.length());}return newstr;}bool String::isin(const String &str, bool bCaseSensative) const{unsigned int check = 0;for ( unsigned int i = 0; i < this->length(); i++ ){bool bCheck = (bCaseSensative) ? (this->at(i) == str[check]) : (tolower(this->at(i)) == tolower(str[check]));if ( bCheck )++check;elsecheck = 0;if ( check >= str.length() )return true;}return false;}bool String::isin(char c, bool bCaseSensative) const{bool f = false;for ( unsigned int i = 0; i < this->length(); i++ ){bool bCheck = (bCaseSensative) ? (this->at(i) == c) : (tolower(this->at(i)) == tolower(c));if ( bCheck ) {f = true;break;}}return f;}String String::left(long num) const{if ( num < 0 )num = (long)this->length() + num;if ( num > (long)this->length() )num = (long)this->length();return this->substr(0, num);}String String::right(int num) const{if ( num > 0 ) num -= (int)this->length();if ( num < -(int)this->length() ) num = -(int)this->length();return this->substr(-num);}char *String::readToEndOfLine(char *data){return (char *)this->readToEndOfLine((unsigned char *)data);}unsigned char *String::readToEndOfLine(unsigned char *data){int pos = 0;// do until we get a line breakwhile ( (data[pos] != 13) && (data[pos] != 0) && (data[pos] != '\n') ) {++pos;}if ( !pos ) {this->clear();}else {if ( pos > 2000 ) {char *d = new char[pos + 1];memcpy(d, data, pos);d[pos] = 0;*this = d;delete d;}else {char d[2000];memcpy(d, data, pos);d[pos] = 0;*this = d;}}if ( data[pos] == 0 ) return NULL;return data + (pos + 1);}String String::replaceToken(const char *token, int from, const String &replace) const{std::string newstr;int whichtok = 1;std::string::size_type lastPos = 0;std::string::size_type pos = _token_nextPos(token, 0);while (std::string::npos != pos || std::string::npos != lastPos){if ( whichtok == from ){if ( newstr != "" ) newstr = newstr + token;newstr = newstr + replace;}else{if ( newstr != "" ) newstr = newstr + token;newstr = newstr + this->substr(lastPos, pos - lastPos);}// Found a token, add it to the vector.whichtok++;if ( pos >= this->length() )break;// skip past tokensize_t i = 0;size_t max = strlen(token);lastPos = pos;while ( (i < max) && (token[i] == this->at(lastPos)) ){++i;++lastPos;}// get the next tokenpos = _token_nextPos(token, lastPos);}return newstr;}String *String::tokenise(const char *token, int *max) const{if ( empty() ) {*max = 0;return NULL;}*max = this->countToken(token);if ( (*max) <= 0 ) {*max = 0;return NULL;}String *newstr = (*max == 1) ? new String : new String[*max];int whichtok = 0;// get first tokenstd::string::size_type lastPos = 0;std::string::size_type pos = this->_token_nextPos(token, 0);while (std::string::npos != pos || std::string::npos != lastPos){// set tokenif ( *max == 1 ) *newstr = this->substr(lastPos, pos - lastPos);else newstr[whichtok] = this->substr(lastPos, pos - lastPos);// move to next tokenwhichtok++;if ( whichtok >= *max )break;if ( pos >= this->length() )break;// skip past tokensize_t i = 0;size_t max = strlen(token);lastPos = pos;while ( (i < max) && (token[i] == this->at(lastPos)) ) {++i;++lastPos;}// get the next tokenpos = _token_nextPos(token, lastPos);}return newstr;}const String &String::remove(char c){std::string::size_type pos = this->find_first_of(c, 0);while(pos != std::string::npos) {this->erase(pos, 1);pos = this->find_first_of(c, 0);}return (*this);}String String::removeChar(char c) const{String newStr = *this;std::string::size_type pos = newStr.find_first_of(c, 0);while(pos != std::string::npos) {newStr.erase(pos, 1);pos = newStr.find_first_of(c, 0);}return newStr;}bool String::_isCharNumber(char c) const{return (c >= '0' && c <= '9') ? true : false;}bool String::isCharNumber(int c) const{return _isCharNumber(this->at(c));}bool String::isNumber(bool integer) const{bool foundpoint = integer;for ( int i = 0; i < (int)this->length(); i++ ){// check for a decimal point (floating point value)// only allow 1 decimal point, or none if just checking for an integerif ( this->at(i) == '.' && !foundpoint ) foundpoint = true;// check if it is a number, 0-9else if ( !this->isCharNumber(i) ) return false;}return true;}const String &String::removeFirstSpace(){std::string::size_type pos = this->find_first_not_of(" ", 0);if ( pos != std::string::npos ) {this->erase(0, pos);}return (*this);}const String &String::truncate(int iNum){size_t pos = iNum;if ( iNum < 0 ) pos = this->length() + iNum;this->erase(pos, this->length() - pos);return (*this);}}//NAMESPACE