//--------------------------------------------------------------------------- //#pragma hdrstop //--------------------------------------------------------------------------- #define _CRT_SECURE_NO_WARNINGS //--------------------------------------------------------------------------- #ifdef _WIN32 #define NOMINMAX #endif // _WIN32 //--------------------------------------------------------------------------- #include "stdTools.h" //#include "mathTools.h" #include //#include #include #include #include #include #include #include #include #include #include #include #include #include //min max #if defined(_WIN32) || defined(_WINDOWS) || defined(_BORLAND) || defined(__BORLANDC__) #include //#include #include //#include #include #else //#include #include #include #include #include #include #endif #include //mkdir #include #include #include #include namespace Utility { //--------------------------------------------------------------------------- std::string sp3() { #if defined _WIN32 || defined __CYGWIN__ return "\\"; #else return "/"; #endif } //------------------------------------------------------------------------------ //Разделитель для директорий char separator() { #ifdef _WIN32 return '\\'; #else return '/'; #endif } //--------------------------------------------------------------------------- std::string base64_encode(const std::string &in) { std::string out; #if defined(__BORLANDC__) #else int val = 0, valb = -6; for (unsigned char c : in) { val = (val << 8) + c; valb += 8; while (valb >= 0) { out.push_back("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(val >> valb) & 0x3F]); valb -= 6; } } if (valb>-6) out.push_back("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[((val << 8) >> (valb + 8)) & 0x3F]); while (out.size() % 4) out.push_back('='); #endif return out; } //--------------------------------------------------------------------------- std::string base64_decode(const std::string &in) { std::string out; #if defined(__BORLANDC__) #else std::vector T(256, -1); for (int i = 0; i<64; i++) T["ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[i]] = i; int val = 0, valb = -8; for (unsigned char c : in) { if (T[c] == -1) break; val = (val << 6) + T[c]; valb += 6; if (valb >= 0) { out.push_back(char((val >> valb) & 0xFF)); valb -= 8; } } #endif return out; } //------------------------------------------------------------------------------ //Преобразовать HEX символ в число (вынужденный повтор чтобы не инклюдить большой файл) int hexCharToIntTMP(char input) { if(input >= '0' && input <= '9') return input - '0'; if(input >= 'A' && input <= 'F') return input - 'A' + 10; if(input >= 'a' && input <= 'f') return input - 'a' + 10; throw std::invalid_argument("Invalid input string"); } //------------------------------------------------------------------------------ uint16_t hexString2ToUint(std::string &str, int pos,bool cut) { uint16_t result; ((uint8_t*)&result)[0] = hexCharToIntTMP(str[pos]) * 16 + hexCharToIntTMP(str[pos + 1]); ((uint8_t*)&result)[1] = hexCharToIntTMP(str[pos + 2]) * 16 + hexCharToIntTMP(str[pos + 3]); if (cut) { str = str.substr(0, pos) + str.substr(pos+4); } return result; } //--------------------------------------------------------------------------- uint32_t hexString4ToUint(std::string &str, int pos, bool cut) { uint32_t result=0; ((uint8_t*)&result)[0] = hexCharToIntTMP(str[pos]) * 16 + hexCharToIntTMP(str[pos + 1]); ((uint8_t*)&result)[1] = hexCharToIntTMP(str[pos + 2]) * 16 + hexCharToIntTMP(str[pos + 3]); ((uint8_t*)&result)[2] = hexCharToIntTMP(str[pos + 4]) * 16 + hexCharToIntTMP(str[pos + 5]); ((uint8_t*)&result)[3] = hexCharToIntTMP(str[pos + 6]) * 16 + hexCharToIntTMP(str[pos + 7]); if (cut) { str = str.substr(0, pos) + str.substr(pos + 8); } return result; } //--------------------------------------------------------------------------- uint64_t hexString6ToUint(std::string &str, int pos, bool cut) { uint64_t result=0; ((uint8_t*)&result)[0] = hexCharToIntTMP(str[pos]) * 16 + hexCharToIntTMP(str[pos+1]); ((uint8_t*)&result)[1] = hexCharToIntTMP(str[pos + 2]) * 16 + hexCharToIntTMP(str[pos + 3]); ((uint8_t*)&result)[2] = hexCharToIntTMP(str[pos + 4]) * 16 + hexCharToIntTMP(str[pos + 5]); ((uint8_t*)&result)[3] = hexCharToIntTMP(str[pos + 6]) * 16 + hexCharToIntTMP(str[pos + 7]); ((uint8_t*)&result)[4] = hexCharToIntTMP(str[pos + 8]) * 16 + hexCharToIntTMP(str[pos + 9]); ((uint8_t*)&result)[5] = hexCharToIntTMP(str[pos + 10]) * 16 + hexCharToIntTMP(str[pos + 11]); if (cut) { str = str.substr(0, pos) + str.substr(pos + 12); } return result; } //--------------------------------------------------------------------------- //Прочитать файл в строку std::string readFileToString(std::string fName){ std::ifstream t(fName); std::stringstream buffer; buffer << t.rdbuf(); return buffer.str(); } //------------------------------------------------------------------------------ bool deleteFile(std::string fileName) { bool result=false; #ifdef __linux__ if(unlink(fileName.c_str())==0) { result=true; } #elif _WIN32 if(remove(fileName.c_str())==0) { result=true; } #endif return result; } //--------------------------------------------------------------------------- //Получить дату последнего изменения файла long getFileDateModiff(std::string file) { #ifdef __linux__ struct stat fStat; int rc = stat(file.c_str(), &fStat); if(rc==0) { return fStat.st_mtim.tv_sec; } return 0; #elif _WIN32 return 0; #else #endif } //------------------------------------------------------------------------------ //удалить старые файлы которые были созданы больше заданного количества дней bool deleteOldFiles(std::string path,int days) { bool result=true; std::list fileList; Utility::getFiles(fileList,path); std::list::const_iterator iterator; for (iterator = fileList.begin(); iterator != fileList.end(); ++iterator) { std::string fName = *iterator; long timeS = getFileDateModiff(fName); int tNow=std::time(NULL); int tDiff = tNow-timeS; if(tDiff > days*24*60*60) { if(!deleteFile(fName)) { result=result & false; } } } return result; } //--------------------------------------------------------------------------- //Найти файлы в директории и под директории и добавить их в список void getFiles(std::list& fileList, std::string directory) { if(directory.length()>0 && directory[directory.length()-1]!=separator()) directory+=separator(); #ifdef __linux__ DIR *dir = opendir(directory.c_str()); if(dir) { struct dirent *ent; while((ent = readdir(dir)) != NULL) { if(ent->d_type==0x04) { if ((strncmp(".", ent->d_name, 1) != 0) && (strncmp("..", ent->d_name, 2) != 0)) { std::string newDir = directory + ent->d_name+"/"; Utility::getFiles(fileList, newDir); } } else if(ent->d_type==0x08) { std::string fWName = ent->d_name; fWName = directory + fWName; fileList.push_back(fWName); } } closedir(dir); } #elif _WIN32 HANDLE hFind; WIN32_FIND_DATAA FindFileData; if ((hFind = FindFirstFileA((std::string(directory+"*.*")).c_str(), &FindFileData)) != INVALID_HANDLE_VALUE) { do { if (FILE_ATTRIBUTE_DIRECTORY & FindFileData.dwFileAttributes) { if ((strncmp(".", FindFileData.cFileName, 1) != 0) && (strncmp("..", FindFileData.cFileName, 2) != 0)) { std::string newDir = directory + FindFileData.cFileName+"\\"; Utility::getFiles(fileList, newDir); } } else { std::string fWName = FindFileData.cFileName; fWName = directory + fWName; fileList.push_back(fWName); } } while (FindNextFileA(hFind, &FindFileData)); FindClose(hFind); } #else #endif } //--------------------------------------------------------------------------- //Читаем до символа перехода на новую строку std::wstring readUTF16LEString(FILE* fp) { std::wstring result=L""; wchar_t ch; while( !feof( fp) ) { size_t count = fread( &((char*)&ch)[0], 1, 1, fp); if(count==1) { count = fread( &((char*)&ch)[1], 1, 1, fp); if(count==1) { if(ch==10) break; //L'\n' if(ch!=13) //L'\r' result+=ch; } } } return result; } //--------------------------------------------------------------------------- //Прочитать первый попавшийся UTF-16 (LE) FF FE во всём файле bool seekToLEBOM(FILE* fp) { bool result = false; unsigned char ch; while( !feof( fp) ) { size_t count = fread( &ch, 1, 1, fp); if(count==1 && ch==0xFF) { count = fread( &ch, 1, 1, fp); if(count==1 && ch==0xFE) { result=true; break; } } } return result; } //--------------------------------------------------------------------------- //Читать в строку до первого попавшегося символа (в результате этого символа не будет) std::string readString(FILE* fp,char ch) { std::string result=""; char tmp; while( !feof( fp) ) { size_t count = fread( &tmp, 1, 1, fp); if(count==1) { if(tmp==ch) break; result+=tmp; } } return result; } //--------------------------------------------------------------------------- int readFile(FILE* fp,char* data,int len) { int result=0; while( !feof( fp) ) { size_t count = fread( &data[result], 1, 1, fp); if(count==1) { result++; if(result>=len) break; } } return result; } //--------------------------------------------------------------------------- std::string lowerCaseENG(std::string str) { std::string result; for(int i=0;i<(int)str.length();i++) { if(str[i]<='Z' && str[i]>='A') result += str[i]-('Z'-'z'); else result += str[i]; } return result; } //--------------------------------------------------------------------------- /*char easytolower(char in){ if(in<='Z' && in>='A') return in-('Z'-'z'); return in; }*/ //--------------------------------------------------------------------------- //#include //Зло :-) //#include "stdafx.h" #if defined(_WIN32) || defined(_WINDOWS) || defined(_BORLAND) || defined(__BORLANDC__) #if defined( _VC ) #include < ctime > #endif #if defined( _BORLAND ) #include #endif #include //Для Windows #include #include #else #include #endif //#include //Функция времени #include "tcDebug.h" //--------------------------------------------------------------------------- //260 was taken from windef.h #ifndef MAX_PATH #define MAX_PATH 260 #endif //--------------------------------------------------------------------------- #define MIN(a,b) (((a)<(b))?(a):(b)) #define MAX(a,b) (((a)>(b))?(a):(b)) //--------------------------------------------------------------------------- /*template std::string toStdStr(T val) { std::ostringstream oss; oss << val; return oss.str(); }*/ //--------------------------------------------------------------------------- //Большее из 2х /*int MaxI4(int v1,int v2) { if(v1>v2) return v1; else return v2; }*/ //--------------------------------------------------------------------------- /*std::wstring s2ws(const std::string& str) { #if defined(_WIN32) || defined(_WINDOWS) || defined(_BORLAND) int len; int slength = (int)str.length();// + 1; if(slength==0) return L""; len = MultiByteToWideChar(CP_ACP, 0, str.c_str(), slength, 0, 0); std::wstring rez(len, L'\0'); MultiByteToWideChar(CP_ACP, 0, str.c_str(), slength, &rez[0], len); //Каз. символы из ASCII в UTF16 в ручную переводим for(size_t i=0;i0) { length = mbtowc(&dest,pt,max); if (length<1) break; result+=dest; pt+=length; max-=length; } return result; #endif return L""; }*/ //--------------------------------------------------------------------------- //Размер файла в байтах long getFileSize(std::string filename) { //#if defined(_WIN32) || defined(_WINDOWS) || defined(_BORLAND) // unsigned long FileSize = 0; // HANDLE hF = CreateFile( // filename.c_str(), // file name // GENERIC_READ, // access mode // 0, // share mode // NULL, // SD // OPEN_EXISTING, // how to create // 0, // file attributes // NULL // handle to template file // ); // FileSize = GetFileSize(hF, NULL); // CloseHandle(hF); // return FileSize; //#else std::ifstream in(filename.c_str(), std::ifstream::ate | std::ifstream::binary); return (long)in.tellg(); //struct stat stat_buf; //int rc = stat(filename.c_str(), &stat_buf); //return rc == 0 ? stat_buf.st_size : -1; //#endif } //--------------------------------------------------------------------------- //Размер файла в байтах long GetWFileSize(std::wstring filename) { std::string str = WStringToString(filename,std::locale("")); std::wifstream in(str.c_str(), std::wifstream::ate | std::wifstream::binary); return (long)in.tellg(); } //--------------------------------------------------------------------------- //Сохранение лог файла по 10 мегабайт (в 2 файлика) bool logrotateW(std::wstring fileName, std::wstring data) { long fileSize = GetWFileSize(fileName); //Переименовываем файл если он привысил размер if(fileSize>1024*1024*10) { #if defined(_WIN32) || defined(_WINDOWS) || defined(_BORLAND) //_wrename(fileName.c_str(),std::wstring(fileName+L".1").c_str()); std::string str = WStringToString(fileName,std::locale(""),'?'); std::rename(str.c_str(),std::string(str+".1").c_str()); #else std::string str = WStringToString(fileName,std::locale("")); rename(str.c_str(),std::string(str+".1").c_str()); #endif } //Записываем лог std::string str = WStringToString(fileName,std::locale("")); std::ofstream myfile(str.c_str(),std::fstream::app | std::fstream::out); if (myfile.is_open()) { myfile << data.c_str(); myfile.flush(); myfile.close(); return true; } return false; } //--------------------------------------------------------------------------- bool logrotateUTF8(std::wstring fileName, std::wstring data) { long fileSize = GetWFileSize(fileName); //Переименовываем файл если он привысил размер if (fileSize>1024 * 1024 * 10) { #if defined(_WIN32) || defined(_WINDOWS) || defined(_BORLAND) //_wrename(fileName.c_str(),std::wstring(fileName+L".1").c_str()); std::string str = WStringToString(fileName, std::locale("")); rename(str.c_str(), std::string(str + ".1").c_str()); #else std::string str = WStringToString(fileName,std::locale("")); rename(str.c_str(),std::string(str+".1").c_str()); #endif } else if (fileSize == 0 || fileSize == -1) //Записываю сигнатуру то что это UTF8 { std::string str = WStringToString(fileName,std::locale("")); std::ofstream myfile(str.c_str(), std::fstream::app | std::fstream::out); if (myfile.is_open()) { myfile << (char)0xEF << (char)0xBB << (char)0xBF; myfile.flush(); myfile.close(); } } //Записываем лог std::string str = WStringToString(fileName,std::locale("")); std::ofstream myfile(str.c_str(), std::fstream::app | std::fstream::out); if (myfile.is_open()) { std::time_t result = std::time(0); std::string time = std::asctime(std::localtime(&result)); time = time.substr(0, time.length() - 1); myfile << "[" << time << "] " << convUTF16ToUTF8(data).c_str() << std::endl; myfile.flush(); myfile.close(); return true; } return false; } //--------------------------------------------------------------------------- std::string escape_json(const std::string& input) { std::ostringstream oss; for (char c : input) { switch (c) { case '"': oss << "\\\""; break; case '\\': oss << "\\\\"; break; case '\b': oss << "\\b"; break; case '\f': oss << "\\f"; break; case '\n': oss << "\\n"; break; case '\r': oss << "\\r"; break; case '\t': oss << "\\t"; break; default: if (static_cast(c) < 0x20 || c == 0x7F) { oss << "\\u" << std::hex << std::setw(4) << std::setfill('0') << static_cast(c); } else { oss << c; } break; } } return oss.str(); } //--------------------------------------------------------------------------- //Сохранение лог файла по 10 мегабайт (в 2 файлика) Функция отрабатывает за 4 миллисекунды /*bool logrotate(std::string fileName, std::string data, bool cout, int size) { long fileSize = GetFileSize(fileName); //Переименовываем файл если он привысил размер if(fileSize>1024*1024* size) { remove(std::string(fileName + ".1").c_str()); //Пытаюсь удалить старый файл rename(fileName.c_str(),std::string(fileName+".1").c_str()); } //Записываем лог std::ofstream myfile(fileName.c_str(), std::ofstream::binary | std::fstream::app); if (myfile.is_open()) { std::stringstream str(std::stringstream::out | std::stringstream::binary); #if defined(_WIN32) || defined(_WINDOWS) || defined(_BORLAND) SYSTEMTIME st; GetLocalTime(&st); //LONG time_ms = (st.wSecond * 1000) + st.wMilliseconds; //для конвертиции в строку: https://www.technical-recipes.com/2014/converting-a-systemtime-to-a-stdstring-in-c/ char buffer[256]; memset(buffer, 0, sizeof(buffer)); sprintf(buffer, "%d.%02d.%02d %02d:%02d:%02d.%03d", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds); str << "[" << buffer << "] " << data << std::endl; #else timeval curTime; gettimeofday(&curTime, NULL); int milli = curTime.tv_usec / 1000; std::time_t utime = curTime.tv_sec; char buffer[80]; memset(buffer, 0, sizeof(buffer)); std::strftime(buffer, sizeof(buffer), "%Y.%m.%d %H:%M:%S", std::localtime(&utime)); str << "[" << buffer << ":" << milli << "] " << data << std::endl; #endif if (cout) std::cout << "[" << buffer << "] " << data << std::endl; //Повтор лога в консоль myfile.write(str.str().c_str(), str.str().length()); myfile.flush(); myfile.close(); return true; }else { std::cerr << "Error: " << strerror(errno) << " " << fileName << std::endl; } return true; }*/ bool logrotate(std::string fileName, std::string thread, std::string level, std::string data, bool cout, int size) { long fileSize = getFileSize(fileName); //Переименовываем файл если он привысил размер if(fileSize>1024*1024* size) { remove(std::string(fileName + ".1").c_str()); //Пытаюсь удалить старый файл rename(fileName.c_str(),std::string(fileName+".1").c_str()); } if(fileSize==-1){ createFolder(BeforeFirst(fileName,separator())); } //Записываем лог std::ofstream myfile(fileName.c_str(), std::ofstream::binary | std::fstream::app); if (myfile.is_open()) { std::stringstream str(std::stringstream::out | std::stringstream::binary); #if defined(_WIN32) || defined(_WINDOWS) || defined(_BORLAND) SYSTEMTIME st; GetLocalTime(&st); char buffer[256]; memset(buffer, 0, sizeof(buffer)); sprintf(buffer, "%d-%02d-%02d %02d:%02d:%02d.%03d", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds); str << "[" << buffer << "] " << data << std::endl; #else timeval curTime; gettimeofday(&curTime, NULL); int milli = curTime.tv_usec / 1000; std::time_t utime = curTime.tv_sec; char buffer[80]; memset(buffer, 0, sizeof(buffer)); std::strftime(buffer, sizeof(buffer), "%Y-%m-%dT%H:%M:%S", std::localtime(&utime)); str << "{\"timestamp\":\"" << buffer << "." << std::setw(3) << std::setfill('0') << milli << "Z\", \"thread\":\"" < 0) { outPtr = out_buf; out_size = BUF_SIZE; rSize = iconv(cd, &inPrt, &in_size, &outPtr, &out_size ); if(rSize == (size_t)-1 && errno) { switch (errno) { case EILSEQ: throw std::runtime_error("invalid multibyte chars"); case EINVAL: throw std::runtime_error("invalid multibyte chars"); default: throw std::runtime_error("unknown error"); } } outstr.append(out_buf,BUF_SIZE-out_size); } if(iconv_close(cd)!=0 ) std::runtime_error("Не удается закрыть дескриптор iconv"); delete[] out_buf; #endif return outstr; } //--------------------------------------------------------------------------- //Конвертим из Unicode в DOS 866 кодировку std::string UnicodeToDOS886(std::wstring str) { std::string rez; rez.reserve(str.length()); //Количество символов не должно измениться for(unsigned int i=0;i std::string toStringHex(T val) { std::ostringstream oss; oss << std::hex << val; return oss.str(); } //--------------------------------------------------------------------------- std::string toStringHex2(int val) { std::ostringstream oss; oss << std::hex << val; std::string result = oss.str(); if (result.length() % 2 != 0) result = "0" + result; return result; } //--------------------------------------------------------------------------- std::string toHexString(unsigned char* mas,int len) { std::string result=""; for(int i=0;i T fromStringHex(std::string val) { T value; std::istringstream iss(val); iss >> std::hex >> value; return value; } //---------------------------------------------------------------------------- //ord - менять порядок байт unsigned int hexStringToInt(std::string val, bool ord) { if (ord) { return (unsigned int)strtol(val.c_str(), NULL, 16); } else { std::string tmp; for (unsigned int i = 0; i < val.size() / 2; i++) { tmp = val[i * 2 + 1] + tmp; tmp = val[i * 2] + tmp; } return (unsigned int)strtol(tmp.c_str(), NULL, 16); } } //--------------------------------------------------------------------------- unsigned int hexStdStrToUInt(std::string& str) { unsigned int x; std::stringstream ss; ss << std::hex << str; ss >> x; return x; } //---------------------------------------------------------------------------- //Закодировать двоично десятичное число //Преобразовать строку цифр в строку байт пример "1234" в 2 байта [12h,34h] если нечётное то 0 в начале std::string CodeBSD(std::string str) { if(str.length()%2!=0) str="0"+str; //Преобразуем 2 символа в 1 байт std::string rez; size_t len=str.length()/2; for(size_t i=0;i(ch); rez+=hch; } return rez; } //--------------------------------------------------------------------------- //Закодировать двоично десятичное число //Преобразовать строку цифр в строку байт пример "1234" в 2 байта [12h,34h] если нечётное то 0 в начале //len - количество (байт)символов добавит нули в начале если получилось меньше std::string CodeBSD(int val,int len) { std::string str=CodeBSD(IntToStdStr(val)); for(int i=str.length();i> 4) & 0x0F; if(ch<10) rez+=(char)(48+ch); else rez+='0'; //такого не должно быть ch=chr & 0x0F; if(ch<10) rez+=(char)(48+ch); else rez+='0'; //такого не должно быть return rez; } //--------------------------------------------------------------------------- //Раскодировать двоично десятичное число 2 байта [12h,34h] преобразуются в строку "1234" std::string DecodeBSD(std::string str, size_t start, size_t len) { if(len==0) len=str.length(); len=start+len; if(len>str.length()) len=str.length(); std::string rez; for(size_t i=start;i > ( loc ).widen( *i ); return out; } //--------------------------------------------------------------------------- //Запись в строку line, align: 1 = лево, 2 = центр, 3 = право void printToPos(std::wstring& line, std::wstring data, char align) { switch (align) { case 1: { for (uint32_t i = 0; i < std::min(line.length(), data.length()); i++) //На min ругалось сделал std::min { line[i] = data[i]; } break; } case 2: { int p1 = line.length() / 2.0f; int p2 = data.length() / 2.0f; int st = p1 - p2; for (uint32_t i = st; i < st + data.length(); i++) { if (i > 0 && i < line.length()) { line[i] = data[i - st]; } } break; } case 3: { for (uint32_t i = 0; i < std::min(line.length(), data.length()); i++) { line[line.length()-i-1] = data[data.length()-i-1]; } break; } } } //--------------------------------------------------------------------------- void replaseChars(std::string& str, char oldCh, char newCh) { int indexCh = str.find(oldCh); while (indexCh != -1) { str.replace(indexCh,1,1,newCh); indexCh = str.find(oldCh,indexCh); } } //--------------------------------------------------------------------------- /*inline std::string replace(std::string text, std::string s, std::string d) { for(unsigned index=0; index=text.find(s, index), index!=std::string::npos;) { text.replace(index, s.length(), d); index+=d.length(); } return text; }*/ //--------------------------------------------------------------------------- //Заменить подстроку на другую void replaceAll(std::wstring& str, const std::wstring from, const std::wstring to) { if (from.empty()) return; size_t start_pos = 0; while ((start_pos = str.find(from, start_pos)) != std::string::npos) { str.replace(start_pos, from.length(), to); start_pos += to.length(); } } //------------------------------------------------------------------------------ //Заменить подстроку на другую void replaceAll(std::string& str, const std::string from, const std::string to) { if (from.empty()) return; size_t start_pos = 0; while ((start_pos = str.find(from, start_pos)) != std::string::npos) { str.replace(start_pos, from.length(), to); start_pos += to.length(); } } //------------------------------------------------------------------------------ //Заменить все вхождения строки find в sors на repl (wxString::Replace) std::string replaceStrings(std::string sors,std::string find,std::string repl) { if(find==repl) return sors; std::string rez=""; size_t p0=0; size_t p1 = sors.find(find,p0); while(p1!=std::string::npos) { rez.append(sors,p0,p1-p0); rez+=repl; p0=p1+find.length(); p1=sors.find(find,p0); } rez.append(sors,p0,sors.length()-p0); return rez; } //--------------------------------------------------------------------------- std::wstring replaceStrings(std::wstring sors,std::wstring find,std::wstring repl) { if(find==repl) return sors; std::wstring rez=L""; size_t p0=0; size_t p1 = sors.find(find,p0); while(p1!=std::wstring::npos) { rez.append(sors,p0,p1-p0); rez+=repl; p0=p1+find.length(); p1=sors.find(find,p0); } rez.append(sors,p0,sors.length()-p0); return rez; } //--------------------------------------------------------------------------- //Получить дату в виде ANSI строки в формате ddmmyyyy std::string getStrDate() { time_t t=time(NULL); tm* st=localtime(&t); std::string str1=IntToStdStr(st->tm_mday); if(str1.length()==1) str1="0"+str1; std::string str2=IntToStdStr(st->tm_mon+1); if(str2.length()==1) str2="0"+str2; std::string str3=IntToStdStr(st->tm_year+1900); if(str3.length()==1) str3="0"+str3; //delete st; Ошибка памяти будет если удалю return str1+str2+str3; } //--------------------------------------------------------------------------- //Преобразую строку вида 02-10-18 20:51:40 в unix time unsigned int getTime1(std::string date) { #if defined(_WIN32) || defined(_WINDOWS) || defined(_BORLAND) std::string tmp; //struct tm { //int tm_sec; // seconds //int tm_min; // minutes //int tm_hour; // hours //int tm_mday; // day of the month //int tm_mon; // month //int tm_year; // year //int tm_wday; // day of the week //int tm_yday; // day in the year //int tm_isdst; // daylight saving time //}; struct tm tmd; memset(&tmd, 0, sizeof(struct tm)); tmp=CutBeforeFirst(date, "-"); tmd.tm_mday = StdStrToInt(tmp); tmp=CutBeforeFirst(date, "-"); tmd.tm_mon = StdStrToInt(tmp); tmp=CutBeforeFirst(date, " "); tmd.tm_year = (2000 + StdStrToInt(tmp)) - 1900; tmp=CutBeforeFirst(date, ":"); tmd.tm_hour = StdStrToInt(tmp); tmp=CutBeforeFirst(date, ":"); tmd.tm_min = StdStrToInt(tmp); tmd.tm_sec = StdStrToInt(date); time_t time = mktime(&tmd); return (unsigned int)time; #else return 0; #endif } //--------------------------------------------------------------------------- //Получить дату в виде Unicode строки в формате ddmmyyyy std::wstring getWStrDate() { return StringToWString(getStrDate(),std::locale("")); } //--------------------------------------------------------------------------- //Дата и время в виде строки dd.mm.yyyy hh:mm:ss пример 24.05.2010 15:20:26 std::string getDateTime() { /* #if defined( _VC ) //Для проекта с ATL библиотекой std::string tmp,res=""; SYSTEMTIME st; GetLocalTime(&st); //Дата tmp=toStdStr(st.wDay); if(tmp.length()==1) res+="0"+tmp+"."; else res+=tmp+"."; tmp=toStdStr(st.wMonth); if(tmp.length()==1) res+="0"+tmp+"."; else res+=tmp+"."; res+=toStdStr(st.wYear)+" "; //Время tmp=toStdStr(st.wHour); if(tmp.length()==1) res+="0"+tmp+":"; else res+=tmp+":"; tmp=toStdStr(st.wMinute); if(tmp.length()==1) res+="0"+tmp+":"; else res+=tmp+":"; tmp=toStdStr(st.wSecond); if(tmp.length()==1) res+="0"+tmp; else res+=tmp; return res; #endif #if defined( _WX ) //Для кросплатформенного проекта wxWidgets return ""; #endif */ std::string tmp,res=""; time_t t=time(NULL); tm* st=localtime(&t); //Дата tmp=IntToStdStr(st->tm_mday); if(tmp.length()==1) res+="0"+tmp+"."; else res+=tmp+"."; tmp=IntToStdStr(st->tm_mon+1); if(tmp.length()==1) res+="0"+tmp+"."; else res+=tmp+"."; res+=IntToStdStr(st->tm_year+1900)+" "; //Время tmp=IntToStdStr(st->tm_hour); if(tmp.length()==1) res+="0"+tmp+":"; else res+=tmp+":"; tmp=IntToStdStr(st->tm_min); if(tmp.length()==1) res+="0"+tmp+":"; else res+=tmp+":"; tmp=IntToStdStr(st->tm_sec); if(tmp.length()==1) res+="0"+tmp; else res+=tmp; //delete st; //Ошибка памяти будет если удалю return res; } //--------------------------------------------------------------------------- //Float в строку /*std::string FloatToStdStr(float val) { std::ostringstream oss; oss << val; return oss.str(); }*/ //--------------------------------------------------------------------------- //Преобразовать в строку (Разделитель всегда точка) //digits - Сколько цифр после запятой оставлять если -1 то по полной std::string FloatToStdStr(double val, int digits,char sep) { std::ostringstream oss; if(digits >= 0) oss << std::fixed << std::setprecision( digits ) << val; else oss << std::fixed << val; std::string str=oss.str(); if(sep=='.') std::replace( str.begin(), str.end(), ',', '.'); if(sep==',') std::replace( str.begin(), str.end(), '.', ','); int pos=MAX(str.find('.'),str.find(',')); //Позиция запятой в строке (TODO взять разделитель из системных параметров) //Обрезаем строку if(digits>=0 && pos>=0) { if(digits==0) digits=-1; //Чтоб убрать запятую std::string result=""; result.append(str,0,pos+digits+1); return result; }else return str; } //--------------------------------------------------------------------------- std::wstring FloatToStdWStr(double val, int digits) { std::string str = FloatToStdStr(val,digits); std::wstring wsTmp(str.begin(), str.end()); return wsTmp; //return s2ws(str); } //--------------------------------------------------------------------------- template std::wstring toStdWStr(T val) { std::ostringstream oss; oss << val; std::string str=oss.str(); return StringToWString( str, std::locale("")); } //--------------------------------------------------------------------------- std::wstring IntToStdWStr(int val) { return toStdWStr(val); } //--------------------------------------------------------------------------- template T fromString(const std::string& s) { std::istringstream iss(s); T res; iss >> res; return res; } //--------------------------------------------------------------------------- //Преобразовать строку в число //str - Исходная строка с числом //cutInt - вырезать из строки только цифры int StdStrToInt(std::string& str, bool cutInt, int def) { if(cutInt) { std::string val=""; for(unsigned int i=0;i(val); } if(str=="") return def; return fromString(str); } //--------------------------------------------------------------------------- //Преобразовать строку в число //str - Исходная строка с числом //cutInt - вырезать из строки только цифры uint32_t StdStrToUInt(std::string& str, bool cutInt, uint32_t def) { if(cutInt) { std::string val=""; for(unsigned int i=0;i(val); } if(str=="") return def; return fromString(str); } //--------------------------------------------------------------------------- float StdStrToFloat(std::string& str) { if(str=="") return 0; return fromString(str); } //--------------------------------------------------------------------------- double StdStrToDouble(std::string& str,double defval) { if(str=="") return defval; return fromString(str); } //--------------------------------------------------------------------------- double StdWStrToDouble(std::wstring str, double defval) { if (str == L"") return defval; return fromWString(str); } //--------------------------------------------------------------------------- template T fromWString(const std::wstring& s) { std::string str=WStringToString(s, std::locale("")); std::istringstream iss(str); T res; iss >> res; return res; } //--------------------------------------------------------------------------- int StdWStrToInt(const std::wstring& str, bool cutInt) { if(cutInt) { std::wstring val=L""; for(unsigned int i=0;i(val); } if(str==L"") return 0; return fromWString(str); } //--------------------------------------------------------------------------- int StdWStrToUInt(const std::wstring& str, bool cutInt) { if(cutInt) { std::wstring val=L""; for(unsigned int i=0;i(val); } if(str==L"") return 0; return fromWString(str); } //--------------------------------------------------------------------------- ///К верхнему регистру строку std::wstring UpperCase(const std::wstring& str) { std::wstring res=L""; //TODO Надо выделить память for(unsigned int i=0;i0) result.append(str,0,pos); str.erase(0,pos+br.size()); } return result; } //--------------------------------------------------------------------------- //Отрезать от строки до указанного символа если не найден символ отрезается вся строка std::wstring CutBeforeWFirst(std::wstring& str,const wchar_t ch) { int pos=str.find(ch); std::wstring result=L""; if(pos==-1) { result.append(str); str.erase(); }else { result.append(str,0,pos); str.erase(0,pos+1); } return result; } //--------------------------------------------------------------------------- std::string AfterFirst(std::string str,const char ch) { unsigned int pos=str.find(ch); std::string result=""; result.append(str,pos+1,str.size()); return result; } //--------------------------------------------------------------------------- std::wstring AfterWFirst(std::wstring str,const wchar_t ch) { unsigned int pos=str.find(ch); std::wstring result=L""; result.append(str,pos+1,str.size()); return result; } //--------------------------------------------------------------------------- //Всё после заданного разделителя, если разделитель не найден то сначала строки std::string AfterLast(std::string str,const char ch) { int pos=str.find_last_of(ch)+1; int len=str.length()-pos; return str.substr(pos,len); } //--------------------------------------------------------------------------- std::string WStringToString(const std::wstring &wstr, const std::locale &loc, char default_char) { //std::wcout << L"wstr=" << wstr<< std::endl;; if (wstr.empty()) return std::string(); //закоментил потому что маленькую букву я не преобразует std::string ret; ret.resize(wstr.length()); std::use_facet >(loc).narrow(&wstr[0], &wstr[0] + wstr.length(), '?', &ret[0]); return ret; /* std::ctype const &facet = std::use_facet >(loc); wchar_t const *first = wstr.c_str(); wchar_t const *last = first + wstr.size(); std::vector result(wstr.size()); facet.narrow(first, last, default_char, &result[0]); return std::string(result.begin(), result.end()); */ /* //setup converter using convert_type = std::codecvt_utf8; std::wstring_convert converter; //use converter (.to_bytes: wstr->str, .from_bytes: str->wstr) std::string converted_str = converter.to_bytes( wstr ); return converted_str; */ /* using convert_typeX = std::codecvt_utf8; std::wstring_convert converterX; return converterX.to_bytes(wstr);*/ /* static std::wstring_convert< std::codecvt_utf8, wchar_t > converter ; return converter.to_bytes(wstr) ; */ } //--------------------------------------------------------------------------- //Получить полный путь к текущему EXE файлу std::wstring getExePathW(bool add) { #if defined(_WIN32) || defined(_WINDOWS) || defined(_BORLAND) std::wstring str; wchar_t pathBuf[MAX_PATH] = { 0 }; GetModuleFileNameW(NULL, pathBuf, MAX_PATH); str = pathBuf; str = BeforeWLast(str, L'\\'); if (add) str += L'\\'; return str; #else std::wstring str = L"."; if (add) str += L'\\'; return str; #endif return L""; /* это к DLL делал но не пригодилось (по хенделу) std::wstring str; #if defined(_WIN32) || defined(_WINDOWS) || defined(_BORLAND) wchar_t pathBuf[MAX_PATH] = {0}; HMODULE thisModule = 0; BOOL ret = GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCTSTR)&__FUNCTION__, &thisModule); DWORD nLen = GetModuleFileName(thisModule, pathBuf, MAX_PATH); str=pathBuf; if(!add) str=BeforeWLast(str,L'\\')+L'\\'; #endif return str; */ } //--------------------------------------------------------------------------- /*std::string getExePath() { //если EXE то //return ExtractFilePath(ParamStr(0)).c_str(); //Если DLL то return ""; }*/ //--------------------------------------------------------------------------- //Получить полный путь к текущему EXE файлу std::string getExePathA(bool add) { #if defined(_WIN32) || defined(_WINDOWS) || defined(_BORLAND) std::string str; char pathBuf[MAX_PATH] = {0}; GetModuleFileNameA(NULL,pathBuf,MAX_PATH); str=pathBuf; str=BeforeLast(str,'\\'); if (add) str += '\\'; return str; #else std::string str="."; if (add) str += '\\'; return str; #endif return ""; } //--------------------------------------------------------------------------- //Путь к дирректории приложений, для хранения настроек (если линукс то к томайней директории пользователя) без завершающего слеша std::string getAppPath() { #if defined(_WIN32) || defined(_WINDOWS) || defined(_BORLAND) std::string path; char szPath[MAX_PATH]; memset(szPath,0,MAX_PATH); if (SUCCEEDED(SHGetFolderPathA(NULL, CSIDL_COMMON_APPDATA, NULL, 0, szPath))) //if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, 0, szPath))) { path=szPath; } return path; #else struct passwd *pw = getpwuid(getuid()); return pw->pw_dir; #endif } //--------------------------------------------------------------------------- //Добавить 0 в начало строоки если 1 символ для даты нужно std::string add0(std::string str) { if(str.length()==1) return "0"+str; else return str; } //--------------------------------------------------------------------------- //Конвертация из UTF16LE в UTF8 std::string convUTF16ToUTF8(const std::wstring& widestring) { unsigned int len8=0; unsigned int len16=widestring.length(); const wchar_t* p16=widestring.data(); for(unsigned int i=0;i>6 | 192) & 223; pos++; p8[pos]=(p16[i] | 128) & 191; pos++; }else if(p16[i]<=0xffff) //1110xxxx 10xxxxxx 10xxxxxx { p8[pos]=(p16[i]>>12 | 224) & 239; pos++; p8[pos]=(p16[i]>>6 | 128) & 191; pos++; p8[pos]=(p16[i] | 128) & 191; pos++; }else if(p16[i]<=0x10ffff) //11110xxx 10xxxxxx 10xxxxxx 10xxxxxx { p8[pos]=(p16[i]>>18 | 240) & 247; pos++; p8[pos]=(p16[i]>>12 | 128) & 191; pos++; p8[pos]=(p16[i]>>6 | 128) & 191; pos++; p8[pos]=(p16[i] | 128) & 191; pos++; } } std::string str; str.append((char*)p8,len8); delete[] p8; return str; } //--------------------------------------------------------------------------- //Конвертация из UTF8 в UTF16LE std::wstring convUTF8ToUTF16(const std::string& str) { unsigned int len16=0; unsigned int len8=str.length(); const char* p8=str.data(); unsigned int i=0; while(i split(const std::wstring& str, wchar_t delimiter) { std::wstring temp; std::vector parts; std::wstringstream wss(str); while(std::getline(wss, temp, delimiter)) parts.push_back(temp); return parts; } //--------------------------------------------------------------------------- void killProcessByName(const wchar_t *filename) { #if defined(_WIN32) || defined(_WINDOWS) || defined(_BORLAND) /* HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL); PROCESSENTRY32 pEntry; pEntry.dwSize = sizeof(pEntry); BOOL hRes = Process32First(hSnapShot, &pEntry); while (hRes) { if (wcscmp(pEntry.szExeFile, filename) == 0) { HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, 0, (DWORD)pEntry.th32ProcessID); if (hProcess != NULL) { TerminateProcess(hProcess, 9); CloseHandle(hProcess); } } hRes = Process32Next(hSnapShot, &pEntry); } CloseHandle(hSnapShot);*/ #else #endif } //--------------------------------------------------------------------------- bool dirExists(std::string path) { struct stat info; if(stat( path.c_str(), &info ) != 0) return 0; else if(info.st_mode & S_IFDIR) return 1; else return 0; } //--------------------------------------------------------------------------- //Создать папку bool createFolder(std::string directory,int mode) { #if defined(_WIN32) || defined(_WINDOWS) || defined(_BORLAND) CreateDirectoryA(directory.c_str(), NULL); return true; #else mode_t tmp = mode; //На винде тен типа mode_t int rez=0; if(!dirExists(directory)){ rez=mkdir(directory.c_str(), mode); //Если папки нет то создать её } if(rez==0){ chmod(directory.c_str(), mode); //Бывало что при создании права не назначались } return rez==0; #endif } //--------------------------------------------------------------------------- std::string intToString(int val) { std::stringstream ss; ss << val; return ss.str(); } //--------------------------------------------------------------------------- std::string uintToString(unsigned int val) { std::stringstream ss; ss << val; return ss.str(); } //--------------------------------------------------------------------------- std::string ullintToString(unsigned long long int val) { std::stringstream ss; ss << val; return ss.str(); } }