#include #include #include #include #include #include #include #include #include "string_util.h" using std::cout; using std::endl; using std::find; using std::find_if; using std::invalid_argument; using std::runtime_error; using std::isspace; using std::string; using std::vector; typedef vector StrVec; typedef vector::const_iterator StrVecIter; static bool my_isnotdigit(char c){ return !isdigit(c); } static bool my_isnotfloatdigit(char c){ if(c=='.') return false; else return my_isnotdigit(c); } static bool has_non_zero(const string &str){ string::size_type size=str.size(); if(str.find("1")str1.size()) return false; // if they are the same then just return true if(str1==str2) return true; // do the actual comparison string cmp_str=str1.substr(0,str2.size()); return (cmp_str==str2); } /* * strip leading and trailing spaces from the string. */ extern string string_util::trim (const string &str) { typedef string::size_type string_size; string new_str=""; string_size i=0; while(ii && isspace(str[j-1])) { j--; } //copy the non-whitespace into the new string if (i!=j){ new_str+=str.substr(i,j-i); i=j; } } return new_str; } extern long string_util::str_to_int(const string &str){ if(str.substr(0,1)=="-") return -1*str_to_int(str.substr(1,str.size())); string::const_iterator it=str.begin(); it=find_if(it,str.end(),my_isnotdigit); if(it!=str.end()) throw invalid_argument("str_to_int(string) argument is not an integer"); return atol(str.c_str()); } extern long long string_util::str_to_int64(const string &str){ if(str.substr(0,1)=="-") return -1*str_to_int64(str.substr(1,str.size())); string::const_iterator it=str.begin(); it=find_if(it,str.end(),my_isnotdigit); if(it!=str.end()) throw invalid_argument("str_to_int(string) argument is not an integer"); #ifdef _WIN32 return _atoi64(str.c_str()); #else return atoll(str.c_str()); #endif } extern unsigned long string_util::str_to_uint(const string &str){ long num=str_to_int(str); if(num<0) throw invalid_argument("str_to_uint(string) argument is not an integer"); return num; } extern unsigned long long string_util::str_to_uint64(const string &str){ long long num=str_to_int64(str); if(num<0) throw invalid_argument("str_to_uint(string) argument is not an integer"); return num; } extern double string_util::str_to_float(const string &str){ double num=atof(str.c_str()); // check if the return is bad if((num==0.0) || (!num)){ string::const_iterator it=str.begin(); it=find_if(it,str.end(),my_isnotfloatdigit); if(it!=str.end() || has_non_zero(str)){ throw invalid_argument("str_to_float(string) argument is not a float"); } } return num; } static bool is_bracket(char c){ static const string BRACKETS="[]"; return find(BRACKETS.begin(),BRACKETS.end(),c)!=BRACKETS.end(); } extern bool string_util::is_comma(char c){ static const string COMMA=","; return find(COMMA.begin(),COMMA.end(),c)!=COMMA.end(); } extern StrVec string_util::split(const string &source,const string &split) { string::size_type number=count_occur(source,split); if(number==0) { StrVec result; result.push_back(source); return result; } vector result; string::size_type start=0; string::size_type stop=0; string inner; while(true) { stop=source.find(split,start); if(stop==string::npos) { result.push_back(source.substr(start)); break; } else { result.push_back(source.substr(start,stop-start)); start=stop+split.size(); } } return result; } /* * split a string up using commas as the delimiter */ extern StrVec string_util::split(const string &str){ static const string COMMA=","; return split(str,COMMA); } static bool is_slash(char c){ static const string SLASH="/"; return find(SLASH.begin(),SLASH.end(),c)!=SLASH.end(); } static bool is_colon(char c){ static const string COLON=":"; return find(COLON.begin(),COLON.end(),c)!=COLON.end(); } extern vector string_util::string_to_path(const string &str){ vector result; typedef string::size_type string_size; string_size i=0; while(i string_util::str_to_intVec(string &str){ // break it up into a string vector StrVec splitted=shrink_and_split(str); // turn each string into an integer vector result; for( StrVec::const_iterator str=splitted.begin() ; str!=splitted.end() ; str++ ) result.push_back(str_to_int(*str)); // return the vector return result; } extern void string_util::str_to_longArray(std::string & str,long *array, const unsigned int len){ // break it up into a string vector StrVec splitted=shrink_and_split(str); if(splitted.size()!=len) throw runtime_error("array and string not same size"); // turn each string into a short StrVecIter strIt=splitted.begin(); for( unsigned int i=0 ; i string_util::int_list_str_to_intVect(std::string &intListStr){ vector intListVect; intListStr_to_intVec(intListStr,intListVect); return intListVect; } extern string string_util::int_to_str(const int num){ char temp[20]; sprintf(temp,"%d",num); return string(temp); } extern string string_util::intVec_to_str(const vector &vec){ string result("["); for( vector::const_iterator it=vec.begin() ; it!=vec.end() ; it++ ){ result+=int_to_str(*it); if(it+1!=vec.end()) result+=","; } result+="]"; return result; } extern std::string string_util::erase(const std::string &in_str,const std::string &match_str){ string result=in_str; string::size_type match_size=match_str.size(); string::size_type index=0; while(true) { index=result.find(match_str,index); if(index==string::npos) { break; } result.erase(index,match_size); } return result; } extern string::size_type string_util::count_occur(const string &str, const string &ch) { string::size_type count=0; string::size_type index=0; // infinite loop to make sure that the entire string is parsed. while(true) { index=str.find(ch,index+1); if(index==string::npos) { break; } count++; } return count; } // these were previously in string_util_ext.cpp from test_collist and FRM2 /* * split a line of numeric entrys using whitespace, commas, semicolons, ... as delimiter */ extern std::vector string_util::split_values(const string &str){ std::vector result; typedef std::string::size_type string_size; string_size i=0; while(i::iterator itt=result.begin(); itt!=result.end(); itt++) { std::cout << "resulting vector: " << *itt << std::endl; }*/ return result; } /* * split a line of numeric entrys using whitespace, commas, semicolons, ... as delimiter */ extern std::vector string_util::split_ints(const std::string &str){ std::vector result; typedef std::string::size_type string_size; string_size i=0; while(i string_util::split_uints(const std::string &str){ std::vector result; typedef std::string::size_type string_size; string_size i=0; while(i string_util::split_doubles(const string &str){ std::vector result; typedef std::string::size_type string_size; std::string tempstr; string_size i=0; while(i string_util::split_colons(const string &str){ std::vector result; typedef std::string::size_type string_size; string_size i=0; while(i string_util::split_whitespace(const string &str){ std::vector result; typedef std::string::size_type string_size; string_size i=0; while(i string_util::strip_punct(std::vector &strvec){ std::vector result; typedef std::string::size_type string_size; for (std::vector::iterator it = strvec.begin(); it!=strvec.end(); it++) { string_size i=0; std::string str = *it; // skip punctuation characters in front of word while (ispunct(str[i])){ str = str.substr(1); } // skip punctuation characters at end of word while (ispunct(str[str.size()-1])){ str = str.substr(0, str.size()-1); } if ((str.size()>0) && (isalpha(str[0]) || isdigit(str[0]))) { result.push_back(str); } } return result; } /* * strip punctuation characters in front of at end of strings */ extern bool string_util::contains (std::string &str, std::string substr) { unsigned int loc = str.find(substr, 0 ); if( loc != string::npos ) return true; else return false; } extern std::string string_util::lower_str(std::string str) { for(unsigned int i=0; i