$Author: faust $
*/
-#include <sys/select.h>
-
// For old and dub systems
// Like FreeBSD4
#include <sys/types.h>
#include <sys/time.h>
#include <unistd.h>
+#include <sys/select.h>
+
#ifdef WIN32
#include <winsock2.h>
#else
# define INET_ADDRSTRLEN 16
#endif
-using namespace std;
+namespace
+{
+//---------------------------------------------------------------------------
+unsigned char koi2win[] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+ 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
+ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
+ 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
+ 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
+ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+ 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
+ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+ 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
+ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+ 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
+ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+ 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+ 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+ 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
+ 0xA0, 0xA1, 0xA2, 0xB8, 0xBA, 0xA5, 0xB3, 0xBF,
+ 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xB4, 0xAE, 0xAF,
+ 0xB0, 0xB1, 0xB2, 0xA8, 0xAA, 0xB5, 0xB2, 0xAF,
+ 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xA5, 0xBE, 0xBF,
+ 0xFE, 0xE0, 0xE1, 0xF6, 0xE4, 0xE5, 0xF4, 0xE3,
+ 0xF5, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE,
+ 0xEF, 0xFF, 0xF0, 0xF1, 0xF2, 0xF3, 0xE6, 0xE2,
+ 0xFC, 0xFB, 0xE7, 0xF8, 0xFD, 0xF9, 0xF7, 0xFA,
+ 0xDE, 0xC0, 0xC1, 0xD6, 0xC4, 0xC5, 0xD4, 0xC3,
+ 0xD5, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE,
+ 0xCF, 0xDF, 0xD0, 0xD1, 0xD2, 0xD3, 0xC6, 0xC2,
+ 0xDC, 0xDB, 0xC7, 0xD8, 0xDD, 0xD9, 0xD7, 0xDA};
+
+
+unsigned char win2koi[] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+ 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
+ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
+ 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
+ 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
+ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+ 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
+ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+ 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
+ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+ 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
+ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+ 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+ 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+ 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
+ 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xBD, 0xA6, 0xA7,
+ 0xB3, 0xA9, 0xB4, 0xAB, 0xAC, 0xAD, 0xAE, 0xB7,
+ 0xB0, 0xB1, 0xB6, 0xA6, 0xAD, 0xB5, 0xB6, 0xB7,
+ 0xA3, 0xB9, 0xA4, 0xBB, 0xBC, 0xBD, 0xBE, 0xA7,
+ 0xE1, 0xE2, 0xF7, 0xE7, 0xE4, 0xE5, 0xF6, 0xFA,
+ 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0,
+ 0xF2, 0xF3, 0xF4, 0xF5, 0xE6, 0xE8, 0xE3, 0xFE,
+ 0xFB, 0xFD, 0xFF, 0xF9, 0xF8, 0xFC, 0xE0, 0xF1,
+ 0xC1, 0xC2, 0xD7, 0xC7, 0xC4, 0xC5, 0xD6, 0xDA,
+ 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0,
+ 0xD2, 0xD3, 0xD4, 0xD5, 0xC6, 0xC8, 0xC3, 0xDE,
+ 0xDB, 0xDD, 0xDF, 0xD9, 0xD8, 0xDC, 0xC0, 0xD1};
+}
#ifdef WIN32
//-----------------------------------------------------------------------------
return 0;
}
//-----------------------------------------------------------------------------
-int strprintf(string * str, const char * fmt, ...)
+int strprintf(std::string * str, const char * fmt, ...)
{
char buff[1024];
return n;
}
//-----------------------------------------------------------------------------
-const char *IntToKMG(long long a, int stat)
+const char *IntToKMG(int64_t a, int stat)
{
-static int64_t M = 1024*1024;
-static int64_t G = 1024*1024*1024;
+static const double K = 1024;
+static const double M = 1024 * 1024;
+static const double G = 1024 * 1024 * 1024;
static char str[30];
+double value = a;
switch (stat)
{
#endif
break;
case ST_KB:
- sprintf(str, "%.2f kb", double(a)/1024.0);
+ sprintf(str, "%.2f kb", value / K);
break;
case ST_MB:
- sprintf(str, "%.2f Mb", double(a)/(1024.0*1024.0));
+ sprintf(str, "%.2f Mb", value / M);
break;
default:
if (a > G)
{
- sprintf(str, "%.2f Gb", double(a)/double(G));
+ sprintf(str, "%.2f Gb", value / G);
return &str[0];
}
if (a < -G)
{
- sprintf(str, "%.2f Gb", double(a)/double(G));
+ sprintf(str, "%.2f Gb", value / G);
return &str[0];
}
if (a > M)
{
- sprintf(str, "%.2f Mb", double(a)/double(M));
+ sprintf(str, "%.2f Mb", value / M);
return &str[0];
}
if (a < -M)
{
- sprintf(str, "%.2f Mb", double(a)/double(M));
+ sprintf(str, "%.2f Mb", value / M);
return &str[0];
}
- sprintf(str, "%.2f kb", double(a)/1024.0);
+ sprintf(str, "%.2f kb", value / K);
break;
}
return str;
}
//---------------------------------------------------------------------------
-unsigned char koi2win[] = {
- 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
- 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
- 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
- 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
- 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
- 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
- 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
- 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
- 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
- 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
- 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
- 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
- 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
- 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
- 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
- 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
- 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
- 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
- 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
- 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
- 0xA0, 0xA1, 0xA2, 0xB8, 0xBA, 0xA5, 0xB3, 0xBF,
- 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xB4, 0xAE, 0xAF,
- 0xB0, 0xB1, 0xB2, 0xA8, 0xAA, 0xB5, 0xB2, 0xAF,
- 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xA5, 0xBE, 0xBF,
- 0xFE, 0xE0, 0xE1, 0xF6, 0xE4, 0xE5, 0xF4, 0xE3,
- 0xF5, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE,
- 0xEF, 0xFF, 0xF0, 0xF1, 0xF2, 0xF3, 0xE6, 0xE2,
- 0xFC, 0xFB, 0xE7, 0xF8, 0xFD, 0xF9, 0xF7, 0xFA,
- 0xDE, 0xC0, 0xC1, 0xD6, 0xC4, 0xC5, 0xD4, 0xC3,
- 0xD5, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE,
- 0xCF, 0xDF, 0xD0, 0xD1, 0xD2, 0xD3, 0xC6, 0xC2,
- 0xDC, 0xDB, 0xC7, 0xD8, 0xDD, 0xD9, 0xD7, 0xDA};
-
-
-unsigned char win2koi[] = {
- 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
- 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
- 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
- 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
- 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
- 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
- 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
- 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
- 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
- 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
- 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
- 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
- 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
- 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
- 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
- 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
- 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
- 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
- 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
- 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
- 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xBD, 0xA6, 0xA7,
- 0xB3, 0xA9, 0xB4, 0xAB, 0xAC, 0xAD, 0xAE, 0xB7,
- 0xB0, 0xB1, 0xB6, 0xA6, 0xAD, 0xB5, 0xB6, 0xB7,
- 0xA3, 0xB9, 0xA4, 0xBB, 0xBC, 0xBD, 0xBE, 0xA7,
- 0xE1, 0xE2, 0xF7, 0xE7, 0xE4, 0xE5, 0xF6, 0xFA,
- 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0,
- 0xF2, 0xF3, 0xF4, 0xF5, 0xE6, 0xE8, 0xE3, 0xFE,
- 0xFB, 0xFD, 0xFF, 0xF9, 0xF8, 0xFC, 0xE0, 0xF1,
- 0xC1, 0xC2, 0xD7, 0xC7, 0xC4, 0xC5, 0xD6, 0xDA,
- 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0,
- 0xD2, 0xD3, 0xD4, 0xD5, 0xC6, 0xC8, 0xC3, 0xDE,
- 0xDB, 0xDD, 0xDF, 0xD9, 0xD8, 0xDC, 0xC0, 0xD1};
-//---------------------------------------------------------------------------
void KOIToWin(const char * s1, char * s2, int l)
{
unsigned char t;
}
}
//---------------------------------------------------------------------------
-void KOIToWin(const string & s1, string * s2)
+void KOIToWin(const std::string & s1, std::string * s2)
{
s2->erase(s2->begin(), s2->end());
unsigned char t;
}
}
//---------------------------------------------------------------------------
-void WinToKOI(const string & s1, string * s2)
+void WinToKOI(const std::string & s1, std::string * s2)
{
s2->erase(s2->begin(), s2->end());
unsigned char t;
}
}
//---------------------------------------------------------------------------
-void Encode12str(string & dst, const string & src)
+void Encode12str(std::string & dst, const std::string & src)
{
dst.erase(dst.begin(), dst.end());
for (size_t i = 0; i < src.length(); i++)
c1 -= 'a';
c2 -= 'a';
- dst.push_back(c1 + (c2 << 4));
+ dst.push_back(static_cast<char>(c1 + (c2 << 4)));
}
}
//---------------------------------------------------------------------------
+std::string Encode12str(const std::string & src)
+{
+std::string res;
+Encode12str(res, src);
+return res;
+}
+//---------------------------------------------------------------------------
+std::string Decode21str(const std::string & src)
+{
+std::string res;
+Decode21str(res, src);
+return res;
+}
+//---------------------------------------------------------------------------
void Encode12(char * dst, const char * src, size_t srcLen)
{
for (size_t i = 0; i <= srcLen; i++)
c1 -= 'a';
c2 -= 'a';
- dst[i] = c1 + (c2 << 4);
+ dst[i] = static_cast<char>(c1 + (c2 << 4));
}
dst[strlen(src) / 2] = 0;
}
return htonl(0xFFffFFff << (32 - msk));
}
//---------------------------------------------------------------------------
-void TouchFile(const string & fileName)
+void TouchFile(const std::string & fileName)
{
FILE * f = fopen(fileName.c_str(), "w");
if (f)
#endif //WIN32
void SwapBytes(uint16_t & value)
{
- value = (value >> 8) |
- (value << 8);
+ value = static_cast<uint16_t>((value >> 8) |
+ (value << 8));
}
//---------------------------------------------------------------------------
void SwapBytes(uint32_t & value)
{
- value = (value >> 24) |
- ((value << 8) & 0x00FF0000L)|
- ((value >> 8) & 0x0000FF00L)|
- (value << 24);
+ value = static_cast<uint32_t>((value >> 24) |
+ ((value << 8) & 0x00FF0000L) |
+ ((value >> 8) & 0x0000FF00L) |
+ (value << 24));
}
//---------------------------------------------------------------------------
void SwapBytes(uint64_t & value)
{
- value = (value >> 56) |
- ((value << 40) & 0x00FF000000000000LL) |
- ((value << 24) & 0x0000FF0000000000LL) |
- ((value << 8) & 0x000000FF00000000LL) |
- ((value >> 8) & 0x00000000FF000000LL) |
- ((value >> 24) & 0x0000000000FF0000LL) |
- ((value >> 40) & 0x000000000000FF00LL) |
- (value << 56);
+ value = static_cast<uint64_t>((value >> 56) |
+ ((value << 40) & 0x00FF000000000000LL) |
+ ((value << 24) & 0x0000FF0000000000LL) |
+ ((value << 8) & 0x000000FF00000000LL) |
+ ((value >> 8) & 0x00000000FF000000LL) |
+ ((value >> 24) & 0x0000000000FF0000LL) |
+ ((value >> 40) & 0x000000000000FF00LL) |
+ (value << 56));
}
//---------------------------------------------------------------------------
void SwapBytes(int16_t & value)
value = temp;
}
//---------------------------------------------------------------------------
-int str2x(const std::string & str, int & x)
-{
-x = strtol(str.c_str(), NULL, 10);
-
-if (errno == ERANGE)
- return -1;
-
-return 0;
-}
-//---------------------------------------------------------------------------
-int str2x(const std::string & str, unsigned & x)
-{
-x = strtoul(str.c_str(), NULL, 10);
-
-if (errno == ERANGE)
- return -1;
-
-return 0;
-}
-//---------------------------------------------------------------------------
-int str2x(const std::string & str, long & x)
+int str2x(const std::string & str, int32_t & x)
{
-x = strtol(str.c_str(), NULL, 10);
+x = static_cast<int32_t>(strtol(str.c_str(), NULL, 10));
if (errno == ERANGE)
return -1;
return 0;
}
//---------------------------------------------------------------------------
-int str2x(const std::string & str, unsigned long & x)
+int str2x(const std::string & str, uint32_t & x)
{
-x = strtoul(str.c_str(), NULL, 10);
+x = static_cast<uint32_t>(strtoul(str.c_str(), NULL, 10));
if (errno == ERANGE)
return -1;
}
#ifndef WIN32
//---------------------------------------------------------------------------
-int str2x(const std::string & str, long long & x)
+int str2x(const std::string & str, int64_t & x)
{
x = strtoll(str.c_str(), NULL, 10);
return 0;
}
//---------------------------------------------------------------------------
-int str2x(const std::string & str, unsigned long long & x)
+int str2x(const std::string & str, uint64_t & x)
{
x = strtoull(str.c_str(), NULL, 10);
}
#endif
//---------------------------------------------------------------------------
-const std::string & x2str(unsigned x, std::string & s)
+const std::string & x2str(uint32_t x, std::string & s)
{
return unsigned2str(x, s);
}
//---------------------------------------------------------------------------
-const std::string & x2str(unsigned long x, std::string & s)
+const std::string & x2str(uint64_t x, std::string & s)
{
return unsigned2str(x, s);
}
//---------------------------------------------------------------------------
-const std::string & x2str(unsigned long long x, std::string & s)
+const std::string & x2str(double x, std::string & s)
{
-return unsigned2str(x, s);
+char buf[256];
+s = snprintf(buf, sizeof(buf), "%f", x);
+return s;
}
//---------------------------------------------------------------------------
std::string & TrimL(std::string & val)
return TrimR(TrimL(val));
}
//---------------------------------------------------------------------------
+std::string ToLower(const std::string & value)
+{
+ std::string res;
+ for (std::string::size_type pos = 0; pos < value.length(); ++pos)
+ res += tolower(value[pos]);
+ return res;
+}
+//---------------------------------------------------------------------------
+std::string ToUpper(const std::string & value)
+{
+ std::string res;
+ for (std::string::size_type pos = 0; pos < value.length(); ++pos)
+ res += toupper(value[pos]);
+ return res;
+}
+//---------------------------------------------------------------------------
#ifdef WIN32
static int is_leap(unsigned y)
{
return 0;
}
-int ParseUnsigned(const string & str, unsigned * val)
+int ParseUnsigned(const std::string & str, unsigned * val)
{
if (str2x<unsigned>(str, *val))
return -1;
return 0;
}
-int ParseIntInRange(const string & str, int min, int max, int * val)
+int ParseIntInRange(const std::string & str, int min, int max, int * val)
{
if (ParseInt(str, val) != 0)
return -1;
return 0;
}
-int ParseUnsignedInRange(const string & str, unsigned min,
+int ParseUnsignedInRange(const std::string & str, unsigned min,
unsigned max, unsigned * val)
{
if (ParseUnsigned(str, val) != 0)