//--------------------------------------------------------------------------- #pragma hdrstop //--------------------------------------------------------------------------- #include "stdTools.h" #include "mathTools.h" //#include #include #include #include #include #include #include //--------------------------------------------------------------------------- //#include //Зло :-) #if defined( _VC ) #include < ctime > #endif #if defined( _BORLAND ) #include #endif #include //Для Windows #include //Функция времени #include "tcDebug.h" //--------------------------------------------------------------------------- //260 was taken from windef.h #ifndef MAX_PATH #define MAX_PATH 260 #endif //--------------------------------------------------------------------------- /*template std::string toStdStr(T val) { std::ostringstream oss; oss << val; return oss.str(); }*/ //--------------------------------------------------------------------------- std::wstring s2ws(const std::string& s) { int len; int slength = (int)s.length();// + 1; if(slength==0) return L""; len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0); std::wstring r(len, L'\0'); MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, &r[0], len); return r; } //--------------------------------------------------------------------------- std::string ws2s(const std::wstring& s) { int len; int slength = (int)s.length();// + 1; if(slength==0) return ""; len = WideCharToMultiByte(CP_ACP, 0, s.c_str(), slength, 0, 0, 0, 0); std::string r(len, '\0'); WideCharToMultiByte(CP_ACP, 0, s.c_str(), slength, &r[0], len, 0, 0); return r; } //--------------------------------------------------------------------------- //Конвертим из Unicode в DOS 866 кодировку std::string UnicodeToDOS886(std::wstring str) { std::string rez; rez.reserve(str.length()); //Количество символов не должно измениться for(uint4 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; return oss.str(); } //--------------------------------------------------------------------------- //Преобразовать HEX строку в число template T fromStringHex(std::string val) { T value; std::istringstream iss(val); iss >> std::hex >> value; return value; } //---------------------------------------------------------------------------- //Закодировать двоично десятичное число //Преобразовать строку цифр в строку байт пример "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(size_t 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; } //--------------------------------------------------------------------------- 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; }*/ //--------------------------------------------------------------------------- /*std::string getExePath() { //если EXE то //return ExtractFilePath(ParamStr(0)).c_str(); //Если DLL то return ""; }*/ //------------------------------------------------------------------------------ //Заменить все вхождения строки 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; } //--------------------------------------------------------------------------- //Получить дату в виде Unicode строки в формате ddmmyyyy std::wstring getWStrDate() { return StringToWString(getStrDate(),std::locale("rus")); } //--------------------------------------------------------------------------- //Дата и время в виде строки 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; } //--------------------------------------------------------------------------- //Преобразовать в строку (Разделитель всегда точка) //digits - Сколько цифр после запятой оставлять если -1 то по полной std::string FloatToStdStr(double val, int digits) { std::ostringstream oss; if(digits >= 0) oss << std::fixed << std::setprecision( digits ) << val; else oss << std::fixed << val; std::string str=oss.str(); int pos=MaxI4(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; } //--------------------------------------------------------------------------- template std::wstring toStdWStr(T val) { std::ostringstream oss; oss << val; std::string str=oss.str(); return StringToWString( str, std::locale("rus")); } //--------------------------------------------------------------------------- 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; } //int StdStrToInt(std::string& str); //--------------------------------------------------------------------------- //Преобразовать строку в число //str - Исходная строка с числом //cutInt - вырезать из строки только цифры int StdStrToInt(std::string& str, bool cutInt) { if(cutInt) { std::string val=""; for(unsigned int i=0;i(val); } if(str=="") return 0; return fromString(str); } //--------------------------------------------------------------------------- //Преобразовать строку в число //str - Исходная строка с числом //cutInt - вырезать из строки только цифры int StdStrToUInt(std::string& str, bool cutInt) { if(cutInt) { std::string val=""; for(unsigned int i=0;i(val); } if(str=="") return 0; return fromString(str); } //--------------------------------------------------------------------------- float StdStrToFloat(std::string& str) { if(str=="") return 0; return fromString(str); } //--------------------------------------------------------------------------- double StdStrToDouble(std::string& str) { if(str=="") return 0; return fromString(str); } //--------------------------------------------------------------------------- template T fromWString(const std::wstring& s) { std::string str=WStringToString(s, std::locale("rus")); std::istringstream iss(str); T res; iss >> res; return res; } //--------------------------------------------------------------------------- int StdWStrToInt(const std::wstring& s) { return fromWString(s); } //--------------------------------------------------------------------------- ///К верхнему регистру строку std::wstring UpperCase(const std::wstring& str) { std::wstring res=L""; //TODO Надо выделить память for(unsigned int i=0;i >(loc).narrow(&wstr[0], &wstr[0] + wstr.length(), '?', &ret[0]); return ret; /* if (wstr.empty()) return std::string(); 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()); */ } //--------------------------------------------------------------------------- //Путь к DLL специально для dll берётся её хэндл std::wstring getAppPathW() { std::wstring str; #if defined( _VC ) 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; str=BeforeWLast(str,L'\\')+L'\\'; #endif return str; } //--------------------------------------------------------------------------- //Получить путь к приложению (не путать с верхней функцией) std::string getAppPathA() { /* #if defined( _VC ) return WStringToString(getAppPathW(), std::locale("rus")); #endif #if defined( _BORLAND ) return ExtractFilePath(ParamStr(0)).c_str(); #endif #if defined( _WX ) return ""; #endif */ std::string str; char pathBuf[MAX_PATH] = {0}; GetModuleFileNameA(NULL,pathBuf,MAX_PATH); str=pathBuf; str=BeforeLast(str,'\\')+'\\'; return str; } //--------------------------------------------------------------------------- //Добавить 0 в начало строоки если 1 символ для даты нужно std::string add0(std::string str) { if(str.length()==1) return "0"+str; else return str; } //--------------------------------------------------------------------------- //Убрать начальные и конечные пробелы std::string trim(const std::string & s) { size_t startPos = s.find_first_not_of(" \t"); if ( startPos == std::string::npos ) return ""; size_t endPos = s.find_last_not_of(" \t"); return s.substr(startPos, endPos - startPos + 1); } //--------------------------------------------------------------------------- //Конвертация из 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(ipath=path; first=NULL; std::wifstream myfile(path.c_str()); //std::wifstream myfile(path.c_str()); if (myfile.is_open()) { std::wstring str; std::wstring section; while ( myfile.good() ) { std::getline(myfile,str); if (str.find('[')!=std::wstring::npos) { section=BeforeWLast(AfterWFirst(str,'['),']'); } if (str.find('=')!=std::wstring::npos) { TIniStructSTD* inistr= new TIniStructSTD; inistr->next=NULL; inistr->section=section; inistr->ident=BeforeWFirst(str,L'='); inistr->value=AfterWFirst(str,L'='); if (first==NULL) { first=inistr; last=inistr; }else { last->next=inistr; last=inistr; } } } myfile.close(); } } TIniFileSTD::~TIniFileSTD() { } std::string TIniFileSTD::ReadString(std::string Section,std::string Ident,std::string Default) { return NULL; } void TIniFileSTD::WriteString(std::string Section,std::string Ident,std::string Value) { }*/