#include #include #include #include #include #include #include "strops.h" //#include "builtin.h" using namespace std; const string WHITESPACE = " \t\f"; //const string WHITESPACE = " \n\r\t\f\v"; bool isNumber(const string& str) { for (char const& c : str) { if (isdigit(c) == 0 && c != '.') return false; } return true; } bool stob(const string& str) { bool b = trim(str) == "true"; return b; } string unescape(const string& s) { string res; string::const_iterator it = s.begin(); while (it != s.end()) { char c = *it++; if (c == '\\' && it != s.end()) { switch (*it++) { case '\\': c = '\\'; break; case 'n': c = '\n'; break; case 't': c = '\t'; break; // all other escapes default: // invalid escape sequence - skip it. alternatively you can copy it as is, throw an exception... continue; } } res += c; } return res; } std::string escaped(const std::string& input) { std::string output; output.reserve(input.size()); for (const char c : input) { switch (c) { case '\a': output += "\\a"; break; case '\b': output += "\\b"; break; case '\f': output += "\\f"; break; case '\n': output += "\\n"; break; case '\r': output += "\\r"; break; case '\t': output += "\\t"; break; case '\v': output += "\\v"; break; default: output += c; break; } } return output; } string StringRaw(const string& s) { string str = trim(s); if (str.size() < 3) return str; string withoutQuotes; if (str[0] != '\"') withoutQuotes += str[0]; withoutQuotes += str.substr(1, str.size() - 2); if (str[str.size() - 1] != '\"') withoutQuotes += str[str.size() - 1]; return unescape(withoutQuotes); } string Quoted(const string& s) { string str = trim(s); string withQuotes; if (str[0] != '\"') withQuotes += '\"'; withQuotes += str; if (str[str.size() - 1] != '\"') withQuotes += '\"'; return withQuotes; } string RMParenthesis(const string& s) { string str = trim(s); string withoutParenthesis; if (str[0] != '(') withoutParenthesis += str[0]; withoutParenthesis += str.substr(1, str.size() - 2); if (str[str.size() - 1] != ')') withoutParenthesis += str[str.size() - 1]; return withoutParenthesis; } string ltrim(const string& s) { size_t start = s.find_first_not_of(WHITESPACE); return (start == string::npos) ? "" : s.substr(start); } string rtrim(const string& s) { size_t end = s.find_last_not_of(WHITESPACE); return (end == string::npos) ? "" : s.substr(0, end + 1); } string trim(const string& s) { return rtrim(ltrim(s)); } vector split(const string& str, const char& del) { if (count(str, del) == 0) return vector{str}; // declaring temp string to store the curr "word" upto del string temp = ""; vector splitWords; for (int i = 0; i < (int)str.size(); i++) { // If cur char is not del, then append it to the cur "word", otherwise // you have completed the word, print it, and start a new word. if (str[i] != del) { temp += str[i]; } else { splitWords.push_back(temp); temp = ""; } } splitWords.push_back(temp); return splitWords; } int count(const string& str, const char& ch) { int cnt = 0; for (int i = 0; i < (int)str.size(); i++) if (str[i] == ch) cnt++; return cnt; } int countNoOverlap(const string& str, const char& searchFor, const char& ch1, const char& ch2) { int cnt = 0; bool waitingForClose = false; for (int i = 0; i < (int)str.size(); i++) { if (str[i] == ch1) waitingForClose = true; else if (str[i] == ch2 && waitingForClose == true) waitingForClose = false; else if (str[i] == searchFor && waitingForClose == true) cnt++; } return cnt; } vector splitNoOverlap(const string& str, const char& splitBy, const char& openChar, const char& closeChar) { vector newStr; int openCount = 0; string tmpStr = ""; for (int i = 0; i < (int)str.size(); i++) { if (i == (int)str.size() - 1) { newStr.push_back(trim(tmpStr + str[i])); break; } if (str[i] == splitBy && openCount == 0) { newStr.push_back(trim(tmpStr)); tmpStr = ""; continue; } else if (str[i] == openChar) { tmpStr += str[i]; openCount += 1; } else if (str[i] == closeChar) { tmpStr += str[i]; openCount -= 1; } else tmpStr += str[i]; } return newStr; } string betweenChars(const string& str, const char& openChar, const char& closeChar) { string content = ""; int startPos = 0; int endPos = (int)str.size(); for (int i = 0; i < (int)str.size(); i++) { if (str[i] == openChar){ startPos = i+1; break; } } for (int i = (int)str.size()-1; i >=0; i--) { if (str[i] == closeChar){ endPos = i-(startPos); // or startPos-1 idk I cant do math right now break; } } return str.substr(startPos, endPos); } bool startsWith(const string& str, const string& lookFor) { if (str.empty() || lookFor.size() > str.size()) return false; for (int i = 0; i < (int)lookFor.size(); i++) { if (str[i] != lookFor[i]) return false; } return true; } int countOutsideParenthesis(const string& str, const char& searchFor) { int cnt = 0; bool waitingForClose = false; for (int i = 0; i < (int)str.size(); i++) { if (str[i] == '(') waitingForClose = true; else if (str[i] == ')' && waitingForClose == true) waitingForClose = false; else if (str[i] == searchFor && waitingForClose == false) cnt++; } return cnt; } int indexInStr(const string& str, const char& ch) { for (int i = 0; i < (int)str.size(); i++) if (str[i] == ch) return i; return -1; } int charIndexInVec(const vector& str, const char& ch) { for (int i = 0; i < (int)str.size(); i++) for (int w = 0; w < (int)str[i].size(); w++) if (str[i][w] == ch) return i; return -1; } int countInVector(const vector& str, const string& ch) { int cnt = 0; for (int i = 0; i < (int)str.size(); i++) if (str[i] == ch) cnt++; return cnt; } string Vec2Str(const vector& str) { string outStr; for (int i = 0; i < (int)str.size(); i++) outStr += str[i] + "\n"; return outStr; } vector removeTabs(const vector& str, const int& amnt) { vector newStr; for (int i = 0; i < (int)str.size(); i++) { newStr.push_back(""); for (int c = 0; c < (int)str[i].size(); c++) { if (str[i][c] != '\t' || c >= amnt) newStr[i] += str[i][c]; } } return newStr; } vector> removeTabsWdArry(const vector>& str, const int& amnt) { vector> newWds; for (int i = 0; i < (int)str.size(); i++) { //newWds.push_back(rangeInVec(str[i], amnt, -1)); newWds.push_back(vector()); for (int c = 0; c < (int)str[i].size(); c++) { if (str[i][c][0] != '\t' || c >= amnt) newWds[i].push_back(str[i][c]); else newWds[i].push_back(str[i][c].substr(1, -1)); } } return newWds; } vector rangeInVec(const vector& str, const int& min, int max) { if (max == -1) max = (int)str.size(); vector newStr; for (int i = min; i < (int)str.size() && i < max; i++) newStr.push_back(str[i]); return newStr; } vector slice(vector const& v, int min, int max) { if (max == -1) max = (int)v.size() - 1; auto first = v.cbegin() + min; auto last = v.cbegin() + max + 1; vector vec(first, last); return vec; } string rangeInStr(const string& str, const int& min, int max) { if (max == -1) max = (int)str.size(); string newStr; for (int i = min; i < (int)str.size() && i < max; i++) newStr += str[i]; return newStr; } string unWrapVec(const vector& vec) { string newStr; for (int i = 0; i < (int)vec.size(); i++) { newStr += vec[i]; if (i != (int)vec.size() - 1) newStr += " "; } return newStr; } float floatval(const string& s) { float outfloat; if (s == "inf") outfloat = numeric_limits::max(); else if (s == "-inf") outfloat = -numeric_limits::max(); else if (s == "") outfloat = 0; else outfloat = stof(s); return outfloat; } string replace(const string& str, const string& strToReplace, const string& replaceWith) { string newStr; string savedLetters; int sameLetters = 0; int startReplaceIndex = 0; for (int i = 0; i < (int)str.size(); i++) { if (str[i] == strToReplace[sameLetters]) { savedLetters += str[i]; if (sameLetters == 0) startReplaceIndex = i; sameLetters++; if ((int)strToReplace.size() == sameLetters) { //cout << "replaced " << "\"" << strToReplace << "\"" << startReplaceIndex << endl; newStr += replaceWith; sameLetters = 0; savedLetters = ""; } } else { newStr += savedLetters + str[i]; sameLetters = 0; savedLetters = ""; } } return newStr; } bool isEscaped(const string& str, int curChar) { if (curChar > 0) if (str[curChar - 1] == '\\') return true; return false; }