Files
Tools_CPP/lib/stdTools.~cpp
2024-11-01 12:23:13 +05:00

1041 lines
30 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//---------------------------------------------------------------------------
#pragma hdrstop
//---------------------------------------------------------------------------
#include "stdTools.h"
#include "mathTools.h"
//#include <Math.h>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <fstream>
#include <locale>
#include <vector>
//---------------------------------------------------------------------------
//#include <atlbase.h> //Çëî :-)
#if defined( _VC )
#include < ctime >
#endif
#if defined( _BORLAND )
#include <vcl.h>
#endif
#include <Windows.h> //Äëÿ Windows
#include <time.h> //Ôóíêöèÿ âðåìåíè
#include "tcDebug.h"
//---------------------------------------------------------------------------
//260 was taken from windef.h
#ifndef MAX_PATH
#define MAX_PATH 260
#endif
//---------------------------------------------------------------------------
/*template <typename T>
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<str.length();i++)
{
switch(str[i])
{
case L'À': rez+=(char)0x80; break;
case L'Á': rez+=(char)0x81; break;
case L'Â': rez+=(char)0x82; break;
case L'Ã': rez+=(char)0x83; break;
case L'Ä': rez+=(char)0x84; break;
case L'Å': rez+=(char)0x85; break;
case L'¨': rez+=(char)0x85; break; //case L'¨': rez+=(char)0xF0; break;
case L'Æ': rez+=(char)0x86; break;
case L'Ç': rez+=(char)0x87; break;
case L'È': rez+=(char)0x88; break;
case L'É': rez+=(char)0x89; break;
case L'Ê': rez+=(char)0x8A; break;
case L'Ë': rez+=(char)0x8B; break;
case L'Ì': rez+=(char)0x8C; break;
case L'Í': rez+=(char)0x8D; break;
case L'Î': rez+=(char)0x8E; break;
case L'Ï': rez+=(char)0x8F; break;
case L'Ð': rez+=(char)0x90; break;
case L'Ñ': rez+=(char)0x91; break;
case L'Ò': rez+=(char)0x92; break;
case L'Ó': rez+=(char)0x93; break;
case L'Ô': rez+=(char)0x94; break;
case L'Õ': rez+=(char)0x95; break;
case L'Ö': rez+=(char)0x96; break;
case L'×': rez+=(char)0x97; break;
case L'Ø': rez+=(char)0x98; break;
case L'Ù': rez+=(char)0x99; break;
case L'Ú': rez+=(char)0x9A; break;
case L'Û': rez+=(char)0x9B; break;
case L'Ü': rez+=(char)0x9C; break;
case L'Ý': rez+=(char)0x9D; break;
case L'Þ': rez+=(char)0x9E; break;
case L'ß': rez+=(char)0x9F; break;
case L'à': rez+=(char)0xA0; break;
case L'á': rez+=(char)0xA1; break;
case L'â': rez+=(char)0xA2; break;
case L'ã': rez+=(char)0xA3; break;
case L'ä': rez+=(char)0xA4; break;
case L'å': rez+=(char)0xA5; break;
case L'¸': rez+=(char)0xA5; break; //case L'¸': rez+=(char)0xF1; break;
case L'æ': rez+=(char)0xA6; break;
case L'ç': rez+=(char)0xA7; break;
case L'è': rez+=(char)0xA8; break;
case L'é': rez+=(char)0xA9; break;
case L'ê': rez+=(char)0xAA; break;
case L'ë': rez+=(char)0xAB; break;
case L'ì': rez+=(char)0xAC; break;
case L'í': rez+=(char)0xAD; break;
case L'î': rez+=(char)0xAE; break;
case L'ï': rez+=(char)0xAF; break;
case L'ð': rez+=(char)0xE0; break;
case L'ñ': rez+=(char)0xE1; break;
case L'ò': rez+=(char)0xE2; break;
case L'ó': rez+=(char)0xE3; break;
case L'ô': rez+=(char)0xE4; break;
case L'õ': rez+=(char)0xE5; break;
case L'ö': rez+=(char)0xE6; break;
case L'÷': rez+=(char)0xE7; break;
case L'ø': rez+=(char)0xE8; break;
case L'ù': rez+=(char)0xE9; break;
case L'ú': rez+=(char)0xEA; break;
case L'û': rez+=(char)0xEB; break;
case L'ü': rez+=(char)0xEC; break;
case L'ý': rez+=(char)0xED; break;
case L'þ': rez+=(char)0xEE; break;
case L'ÿ': rez+=(char)0xEF; break;
//Êàç-ÿç
/* case L'?': rez+=(char)0xDB; break;
case L'?': rez+=(char)0xDC; break;
case L'?': rez+=(char)0xDE; break;
case L'?': rez+=(char)0xDF; break;
case L'?': rez+=(char)0xF0; break;
case L'?': rez+=(char)0xF1; break;
case L'?': rez+=(char)0xF3; break;
case L'?': rez+=(char)0xF4; break;
case L'?': rez+=(char)0xF5; break;
case L'?': rez+=(char)0xF6; break;
case L'?': rez+=(char)0xF7; break;
case L'?': rez+=(char)0xF8; break;
case L'?': rez+=(char)0xFD; break;
case L'?': rez+=(char)0xFE; break;
*/
default: rez+=(char)str[i]; break;
}
}
return rez;
}
//---------------------------------------------------------------------------
//Îáðàòíàÿ êîíâåðòàöèÿ èç DOS886 â Unicode
std::wstring DOS886ToUnicode(std::string str)
{
std::wstring rez;
rez.reserve(str.length()); //Êîëè÷åñòâî ñèìâîëîâ íå äîëæíî èçìåíèòüñÿ
for(uint4 i=0;i<str.length();i++)
{
switch(str[i])
{
case (char)0x80: rez+=L'À'; break;
case (char)0x81: rez+=L'Á'; break;
case (char)0x82: rez+=L'Â'; break;
case (char)0x83: rez+=L'Ã'; break;
case (char)0x84: rez+=L'Ä'; break;
case (char)0x85: rez+=L'Å'; break;
//case (char)0xF0: rez+=L'¨'; break; //Â ìåñòî "¨" â ïðèíòåðå "?"
case (char)0x86: rez+=L'Æ'; break;
case (char)0x87: rez+=L'Ç'; break;
case (char)0x88: rez+=L'È'; break;
case (char)0x89: rez+=L'É'; break;
case (char)0x8A: rez+=L'Ê'; break;
case (char)0x8B: rez+=L'Ë'; break;
case (char)0x8C: rez+=L'Ì'; break;
case (char)0x8D: rez+=L'Í'; break;
case (char)0x8E: rez+=L'Î'; break;
case (char)0x8F: rez+=L'Ï'; break;
case (char)0x90: rez+=L'Ð'; break;
case (char)0x91: rez+=L'Ñ'; break;
case (char)0x92: rez+=L'Ò'; break;
case (char)0x93: rez+=L'Ó'; break;
case (char)0x94: rez+=L'Ô'; break;
case (char)0x95: rez+=L'Õ'; break;
case (char)0x96: rez+=L'Ö'; break;
case (char)0x97: rez+=L'×'; break;
case (char)0x98: rez+=L'Ø'; break;
case (char)0x99: rez+=L'Ù'; break;
case (char)0x9A: rez+=L'Ú'; break;
case (char)0x9B: rez+=L'Û'; break;
case (char)0x9C: rez+=L'Ü'; break;
case (char)0x9D: rez+=L'Ý'; break;
case (char)0x9E: rez+=L'Þ'; break;
case (char)0x9F: rez+=L'ß'; break;
case (char)0xA0: rez+=L'à'; break;
case (char)0xA1: rez+=L'á'; break;
case (char)0xA2: rez+=L'â'; break;
case (char)0xA3: rez+=L'ã'; break;
case (char)0xA4: rez+=L'ä'; break;
case (char)0xA5: rez+=L'å'; break;
//case (char)0xF1: rez+=L'¸'; break; //Â ìåñòî "¸" â ïðèíòåðå "?"
case (char)0xA6: rez+=L'æ'; break;
case (char)0xA7: rez+=L'ç'; break;
case (char)0xA8: rez+=L'è'; break;
case (char)0xA9: rez+=L'é'; break;
case (char)0xAA: rez+=L'ê'; break;
case (char)0xAB: rez+=L'ë'; break;
case (char)0xAC: rez+=L'ì'; break;
case (char)0xAD: rez+=L'í'; break;
case (char)0xAE: rez+=L'î'; break;
case (char)0xAF: rez+=L'ï'; break;
case (char)0xE0: rez+=L'ð'; break;
case (char)0xE1: rez+=L'ñ'; break;
case (char)0xE2: rez+=L'ò'; break;
case (char)0xE3: rez+=L'ó'; break;
case (char)0xE4: rez+=L'ô'; break;
case (char)0xE5: rez+=L'õ'; break;
case (char)0xE6: rez+=L'ö'; break;
case (char)0xE7: rez+=L'÷'; break;
case (char)0xE8: rez+=L'ø'; break;
case (char)0xE9: rez+=L'ù'; break;
case (char)0xEA: rez+=L'ú'; break;
case (char)0xEB: rez+=L'û'; break;
case (char)0xEC: rez+=L'ü'; break;
case (char)0xED: rez+=L'ý'; break;
case (char)0xEE: rez+=L'þ'; break;
case (char)0xEF: rez+=L'ÿ'; break;
//Êàç-ÿç
case (char)0xDB: rez+=L'?'; break;
case (char)0xDC: rez+=L'?'; break;
case (char)0xDE: rez+=L'?'; break;
case (char)0xDF: rez+=L'?'; break;
case (char)0xF0: rez+=L'?'; break;
case (char)0xF1: rez+=L'?'; break;
case (char)0xF3: rez+=L'?'; break;
case (char)0xF4: rez+=L'?'; break;
case (char)0xF5: rez+=L'?'; break;
case (char)0xF6: rez+=L'?'; break;
case (char)0xF7: rez+=L'?'; break;
case (char)0xF8: rez+=L'?'; break;
case (char)0xFD: rez+=L'?'; break;
case (char)0xFE: rez+=L'?'; break;
default: rez+=(char)str[i]; break;
}
}
return rez;
}
//---------------------------------------------------------------------------
//Float â ñòðîêó
std::string FloatToStdStr(float val)
{
std::ostringstream oss;
oss << val;
return oss.str();
}
//---------------------------------------------------------------------------
std::string IntToStdStr(int val)
{
std::ostringstream oss;
oss << val;
return oss.str();
}
//---------------------------------------------------------------------------
template <typename T>
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 <typename T>
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<len;i++)
{
std::string ch;
ch+=str[i*2];
ch+=str[i*2+1];
unsigned char hch = fromStringHex<int>(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<len;i++) //Ìåäëåííî
str=(char)0x00+str;
return str;
}
//---------------------------------------------------------------------------
//Äâîè÷íî äåñÿòè÷íûé ñèìâîë â int
int BSDToInt(char chr)
{
//return StdStrToInt(DecodeBSD(chr)); //TODO èñïðàâèòü äëÿ áèëäåðà
return 0;
}
//---------------------------------------------------------------------------
//Äâîè÷íî äåñÿòè÷íóþ ñòðîêó â int
int BSDToInt(std::string str, size_t start, size_t len)
{
//return StdStrToInt(DecodeBSD(str,start,len)); //TODO èñïðàâèòü äëÿ áèëäåðà
return 0;
}
//---------------------------------------------------------------------------
//Ðàñêîäèðîâàòü äâîè÷íî äåñÿòè÷íîå ÷èñëî 2 áàéòà [12h,34h] ïðåîáðàçóþòñÿ â ñòðîêó "1234"
std::string DecodeBSD(char chr)
{
std::string rez;
unsigned char ch;
ch=(chr >> 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<len;i++)
{
rez+=DecodeBSD(str[i]);
}
return rez;
}
//---------------------------------------------------------------------------
//std::wstring StringToWString( const std::string& in, std::locale loc )
std::wstring StringToWString(const std::string& in, const std::locale &loc)
{
std::wstring out;
std::string::const_iterator i( in.begin() ), ie( in.end() );
for( ; i!=ie; ++i )
out += std::use_facet<std::ctype<wchar_t> > ( 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 <typename T>
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<typename T>
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<str.length();i++)
{
if((str[i]=='-' && (val.length()==0 || val[0]!='-')) || str[i]=='0' || str[i]=='1' || str[i]=='2' || str[i]=='3' || str[i]=='4' || str[i]=='5' || str[i]=='6' || str[i]=='7' || str[i]=='8' || str[i]=='9')
val+=str[i];
}
if(val=="") return 0;
return fromString<int>(val);
}
if(str=="") return 0;
return fromString<int>(str);
}
//---------------------------------------------------------------------------
//Ïðåîáðàçîâàòü ñòðîêó â ÷èñëî
//str - Èñõîäíàÿ ñòðîêà ñ ÷èñëîì
//cutInt - âûðåçàòü èç ñòðîêè òîëüêî öèôðû
int StdStrToUInt(std::string& str, bool cutInt)
{
if(cutInt)
{
std::string val="";
for(unsigned int i=0;i<str.length();i++)
{
if(str[i]=='0' || str[i]=='1' || str[i]=='2' || str[i]=='3' || str[i]=='4' || str[i]=='5' || str[i]=='6' || str[i]=='7' || str[i]=='8' || str[i]=='9')
val+=str[i];
}
if(val=="") return 0;
return fromString<int>(val);
}
if(str=="") return 0;
return fromString<int>(str);
}
//---------------------------------------------------------------------------
float StdStrToFloat(std::string& str)
{
if(str=="") return 0;
return fromString<float>(str);
}
//---------------------------------------------------------------------------
double StdStrToDouble(std::string& str)
{
if(str=="") return 0;
return fromString<double>(str);
}
//---------------------------------------------------------------------------
template<typename T>
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<int>(s);
}
//---------------------------------------------------------------------------
///Ê âåðõíåìó ðåãèñòðó ñòðîêó
std::wstring UpperCase(const std::wstring& str)
{
std::wstring res=L""; //TODO Íàäî âûäåëèòü ïàìÿòü
for(unsigned int i=0;i<str.length();i++)
{
switch( str[i] )
{
case L'a': res+=L'A'; break;
case L'b': res+=L'B'; break;
case L'c': res+=L'C'; break;
case L'd': res+=L'D'; break;
case L'e': res+=L'E'; break;
case L'f': res+=L'F'; break;
case L'g': res+=L'G'; break;
case L'h': res+=L'H'; break;
case L'i': res+=L'I'; break;
case L'j': res+=L'J'; break;
case L'k': res+=L'K'; break;
case L'l': res+=L'L'; break;
case L'm': res+=L'M'; break;
case L'n': res+=L'N'; break;
case L'o': res+=L'O'; break;
case L'p': res+=L'P'; break;
case L'q': res+=L'Q'; break;
case L'r': res+=L'R'; break;
case L's': res+=L'S'; break;
case L't': res+=L'T'; break;
case L'u': res+=L'U'; break;
case L'v': res+=L'V'; break;
case L'w': res+=L'W'; break;
case L'x': res+=L'X'; break;
case L'y': res+=L'Y'; break;
case L'z': res+=L'Z'; break;
case L'à': res+=L'À'; break;
case L'á': res+=L'Á'; break;
case L'â': res+=L'Â'; break;
case L'ã': res+=L'Ã'; break;
case L'ä': res+=L'Ä'; break;
case L'å': res+=L'Å'; break;
case L'¸': res+=L'¨'; break;
case L'æ': res+=L'Æ'; break;
case L'ç': res+=L'Ç'; break;
case L'è': res+=L'È'; break;
case L'ê': res+=L'Ê'; break;
case L'ë': res+=L'Ë'; break;
case L'ì': res+=L'Ì'; break;
case L'í': res+=L'Í'; break;
case L'î': res+=L'Î'; break;
case L'ï': res+=L'Ï'; break;
case L'ð': res+=L'Ð'; break;
case L'ñ': res+=L'Ñ'; break;
case L'ò': res+=L'Ò'; break;
case L'ó': res+=L'Ó'; break;
case L'ô': res+=L'Ô'; break;
case L'õ': res+=L'Õ'; break;
case L'ö': res+=L'Ö'; break;
case L'÷': res+=L'×'; break;
case L'ø': res+=L'Ø'; break;
case L'ù': res+=L'Ù'; break;
case L'ú': res+=L'Ú'; break;
case L'û': res+=L'Û'; break;
case L'ü': res+=L'Ü'; break;
case L'ý': res+=L'Ý'; break;
case L'þ': res+=L'Þ'; break;
case L'ÿ': res+=L'ß'; break;
default:
res+=str[i];
}
}
return res;
}
//---------------------------------------------------------------------------
///Ïîëó÷èòü ñòðîêó äî óêàçàííîãî ñèìâîëà åñëè ñèìâîëà íåò òî âåðí¸ò âñþ ñòðîêó.
std::string BeforeLast(std::string str,char ch)
{
int pos=0;
for(uint4 i=0;i<str.length();i++)
{
if(str[i]==ch) pos=i;
}
if(pos==0) pos=str.length();
std::string result="";
result.append(str,0,pos);
return result;
}
//---------------------------------------------------------------------------
///Ïîëó÷èòü ñòðîêó äî óêàçàííîãî ñèìâîëà åñëè ñèìâîëà íåò òî âåðí¸ò âñþ ñòðîêó.
std::wstring BeforeWLast(std::wstring str,wchar_t ch)
{
int pos=0;
for(uint4 i=0;i<str.length();i++)
{
if(str[i]==ch) pos=i;
}
if(pos==0) pos=str.length();
std::wstring result=L"";
result.append(str,0,pos);
return result;
}
//---------------------------------------------------------------------------
std::string BeforeFirst(std::string str,const char ch)
{
unsigned int pos=str.find(ch);
std::string result="";
result.append(str,0,pos);
return result;
}
//---------------------------------------------------------------------------
std::wstring BeforeWFirst(std::wstring str,const wchar_t ch)
{
unsigned int pos=str.find(ch);
std::wstring result=L"";
result.append(str,0,pos);
return result;
}
//---------------------------------------------------------------------------
//Îòðåçàòü îò ñòðîêè äî óêàçàííîãî ñèìâîëà åñëè íå íàéäåí ñèìâîë îòðåçàåòñÿ âñÿ ñòðîêà
std::string CutBeforeFirst(std::string& str,const char ch)
{
int pos=str.find(ch);
std::string result="";
result.append(str,0,pos);
str.erase(0,pos+1);
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(std::wstring const &wstr, std::locale const &loc, char default_char)
{
if (wstr.empty())
return std::string();
std::string ret;
ret.resize(wstr.length());
std::use_facet<std::ctype<wchar_t> >(loc).narrow(&wstr[0], &wstr[0] + wstr.length(), '?', &ret[0]);
return ret;
/*
if (wstr.empty())
return std::string();
std::ctype<wchar_t> const &facet = std::use_facet<std::ctype<wchar_t> >(loc);
wchar_t const *first = wstr.c_str();
wchar_t const *last = first + wstr.size();
std::vector<char> 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<len16;i++) //Ïîäñ÷èòûâàåì ðàçìåð áóôåðà
{
if(p16[i]<=0x7f) len8++; else
if(p16[i]<=0x7ff) len8+=2; else
if(p16[i]<=0xffff) len8+=3; else
if(p16[i]<=0x10ffff) len8+=4;
}
unsigned char * p8=new unsigned char[len8];
unsigned int pos=0;
for(unsigned int i=0;i<len16;i++)
{
if(p16[i]<=0x7f)
{
p8[pos]=(unsigned char)p16[i];
pos++;
}else
if(p16[i]<=0x7ff) //110xxxxx, 10xxxxxx
{
p8[pos]=(p16[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<len8) //Ïîäñ÷èòûâàåì ñêîëüêî ñèìâîëîâ â ñòðîêå
{
if((p8[i] & 0x80)==0) i++; else //0 â íà÷àëå çíà÷ 1 ñèìâîë
if((p8[i] & 0xF0)==0xF0) i+=4; else //11110xxx
if((p8[i] & 0xE0)==0xE0) i+=3; else //1110xxxx
if((p8[i] & 0xC0)==0xC0) i+=2; //110xxxxx
len16++;
}
wchar_t* p16=new wchar_t[len16];
unsigned int pos=0;
i=0;
while(i<len8)
{
if((p8[i] & 0x80)==0) //0xxxxxxx (0 â íà÷àëå çíà÷ 1 ñèìâîë)
{
p16[pos]=p8[i];
pos++; i++;
}else
if((p8[i] & 0xF0)==0xF0) //11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
{
p16[pos]=((p8[i] & 0x7) << 18) | ((p8[i] & 0x3F) << 12) | ((p8[i] & 0x3F) << 6) | (p8[i] & 0x3F);
pos++; i+=4;
}else
if((p8[i] & 0xE0)==0xE0) //1110xxxx 10xxxxxx 10xxxxxx
{
p16[pos]=((p8[i] & 0xf) << 12) | ((p8[i] & 0x3F) << 6) | (p8[i] & 0x3F);
pos++; i+=3;
} else
if((p8[i] & 0xC0)==0xC0) //110xxxxx 10xxxxxx
{
p16[pos]=((p8[i] & 0x1F) << 6) | (p8[i+1] & 0x3F);
pos++; i+=2;
}else i++; //åñëè äîøëî äî ñþäà òî îøèáêà
}
std::wstring wstr;
wstr.append(p16,len16);
delete[] p16;
return wstr;
}
//******************************************************************************
/*TIniFileSTD::TIniFileSTD(std::wstring path)
{
this->path=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)
{
}*/