#ifndef UTILS_H #define UTILS_H #include #include #include #include #include #include #include static size_t CurlWriteCallback(void *contents, size_t size, size_t nmemb, void *userp) { ((std::string*)userp)->append((char*)contents, size * nmemb); return size * nmemb; } template void split(const std::string &s, char delim, Out result) { std::istringstream iss(s); std::string item; while (std::getline(iss, item, delim)) { *result++ = item; } } std::vector split(const std::string &s, char delim) { std::vector elems; split(s, delim, std::back_inserter(elems)); return elems; } bool strcontains(std::string needle, std::string haystack); bool vfind(std::vector v, std::string i); int vstrcontains(std::string needle, std::vector haystack); std::string filter(std::vector filterlist, std::string input); std::string getValueOfIncludedName(std::map list, std::string input); std::string strcombine(std::vector args, int start, int end, char pad); static char* toLower(char* str); static std::string toLower(std::string str); static char* trim(char *str); bool strcontains(std::string needle, std::string haystack) { bool found = haystack.find(needle) != std::string::npos; return found; } bool vfind(std::vector v, std::string i) { return std::find(v.begin(), v.end(), i) != v.end(); } int vstrcontains(std::string needle, std::vector haystack) { for (std::string str : haystack) { if (needle.rfind(str, 0) == 0) return str.length(); } return 0; } std::string replaceAll(std::string input, std::string find, std::string replacement) { int pos; while ((pos = input.find(find)) != std::string::npos) { input = input.replace(pos, find.length(), replacement); } return input; } std::string filter(std::vector filterlist, std::string input) { for (std::string str : filterlist) { int pos; while ((pos = toLower(input).find(toLower(str))) != std::string::npos) { std::string replacement; for (int i = 0; i < str.length(); i++) replacement+="*"; input = input.replace(pos, str.length(), replacement); } } return input; } std::string decodeHTML(std::string in) { int pos; while ((pos = in.find("&#")) != std::string::npos) { try { char c = std::stoi(in.substr(pos+2, in.length())); int endpos = in.substr(pos, in.length()).find(";"); if (endpos == std::string::npos) continue; in = in.replace(pos, endpos+1, std::string(1, c)); } catch (...) { }; } // We should be good to try and parse named encodes. in = replaceAll(in, "&", "&"); in = replaceAll(in, "<", "<"); in = replaceAll(in, ">", ">"); return in; } std::string getValueOfIncludedName(std::map list, std::string input) { for (auto v : list) { if (strcontains(v.first, input)) return v.second; } return ""; } std::string strcombine(std::vector args, int start, int end, char pad) { std::string output = args[start]; for (int c = start+1; c < end; c++) { output+=(pad+args[c]); } return output; } static char* toLower(char* str) { for(int i = 0; str[i]; i++){ str[i] = std::tolower(str[i]); } return str; } static std::string toLower(std::string str) { std::transform(str.begin(), str.end(), str.begin(), [](unsigned char c){ return std::tolower(c); }); return str; } static char* trim(char *str) { char *end; while(isspace(*str)) str++; if(*str == 0) return str; end = str + strnlen(str, 128) - 1; while(end > str && isspace(*end)) end--; *(end+1) = '\0'; return str; } #endif