2 * This program is free software; you can redistribute it and/or modify
3 * it under the terms of the GNU General Public License as published by
4 * the Free Software Foundation; either version 2 of the License, or
5 * (at your option) any later version.
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
12 * You should have received a copy of the GNU General Public License
13 * along with this program; if not, write to the Free Software
14 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 * Author : Boris Mikhailenko <stg34@stargazer.dp.ua>
27 $Date: 2010/11/08 10:11:19 $
32 /*#include <sys/stat.h>
44 #include <sys/types.h>
48 #include <sysutils.hpp>
52 #include <netinet/in.h>
53 #include <arpa/inet.h>
54 #include <sys/socket.h>
58 #include <sys/types.h>
64 #include <sys/socket.h>
65 #include <netinet/in.h>
66 #include <arpa/inet.h>
80 #ifndef INET_ADDRSTRLEN
81 # define INET_ADDRSTRLEN 16
87 //-----------------------------------------------------------------------------
88 const char * inet_ntop(int af, const void * src, char * dst, unsigned long length)
90 struct sockaddr_in addr;
93 memcpy(&addr.sin_addr.s_addr, src, sizeof(addr.sin_addr.s_addr));
94 if (WSAAddressToStringA(reinterpret_cast<struct sockaddr *>(&addr), sizeof(addr), 0, dst, &length))
100 //-----------------------------------------------------------------------------
101 int inet_pton(int af, const char * src, void * dst)
103 // Fuck you Microsoft!
104 // Why the hell not to use const char *?
105 size_t slen = strlen(src);
106 char * buf = new char[slen + 1];
107 strncpy(buf, src, slen + 1);
109 struct sockaddr_in addr;
110 addr.sin_family = af;
112 addr.sin_addr.s_addr = 0;
113 int length = sizeof(addr);
114 if (WSAStringToAddressA(buf, af, 0, reinterpret_cast<struct sockaddr *>(&addr), &length))
119 memcpy(dst, &addr, sizeof(addr));
124 //-----------------------------------------------------------------------------
125 int strtodouble2(const char * s, double &a)
136 //-----------------------------------------------------------------------------
138 int printfd(const char * __file__, const char * fmt, ...)
140 int printfd(const char *, const char *, ...)
146 time_t t = time(NULL);
150 vsnprintf(buff, sizeof(buff), fmt, vl);
153 printf("%18s > %s > ", __file__, LogDate(t)+11);
159 //-----------------------------------------------------------------------------
160 int strprintf(string * str, const char * fmt, ...)
166 int n = vsnprintf(buff, sizeof(buff), fmt, vl);
173 //-----------------------------------------------------------------------------
174 const char *IntToKMG(long long a, int stat)
176 static int64_t M = 1024*1024;
177 static int64_t G = 1024*1024*1024;
184 sprintf(str, "%Ld", a);
186 sprintf(str, "%lld", a);
190 sprintf(str, "%.2f kb", double(a)/1024.0);
193 sprintf(str, "%.2f Mb", double(a)/(1024.0*1024.0));
198 sprintf(str, "%.2f Gb", double(a)/double(G));
203 sprintf(str, "%.2f Gb", double(a)/double(G));
208 sprintf(str, "%.2f Mb", double(a)/double(M));
213 sprintf(str, "%.2f Mb", double(a)/double(M));
217 sprintf(str, "%.2f kb", double(a)/1024.0);
222 //---------------------------------------------------------------------------
223 unsigned char koi2win[] = {
224 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
225 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
226 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
227 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
228 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
229 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
230 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
231 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
232 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
233 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
234 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
235 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
236 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
237 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
238 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
239 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
240 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
241 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
242 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
243 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
244 0xA0, 0xA1, 0xA2, 0xB8, 0xBA, 0xA5, 0xB3, 0xBF,
245 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xB4, 0xAE, 0xAF,
246 0xB0, 0xB1, 0xB2, 0xA8, 0xAA, 0xB5, 0xB2, 0xAF,
247 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xA5, 0xBE, 0xBF,
248 0xFE, 0xE0, 0xE1, 0xF6, 0xE4, 0xE5, 0xF4, 0xE3,
249 0xF5, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE,
250 0xEF, 0xFF, 0xF0, 0xF1, 0xF2, 0xF3, 0xE6, 0xE2,
251 0xFC, 0xFB, 0xE7, 0xF8, 0xFD, 0xF9, 0xF7, 0xFA,
252 0xDE, 0xC0, 0xC1, 0xD6, 0xC4, 0xC5, 0xD4, 0xC3,
253 0xD5, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE,
254 0xCF, 0xDF, 0xD0, 0xD1, 0xD2, 0xD3, 0xC6, 0xC2,
255 0xDC, 0xDB, 0xC7, 0xD8, 0xDD, 0xD9, 0xD7, 0xDA};
258 unsigned char win2koi[] = {
259 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
260 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
261 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
262 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
263 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
264 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
265 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
266 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
267 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
268 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
269 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
270 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
271 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
272 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
273 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
274 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
275 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
276 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
277 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
278 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
279 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xBD, 0xA6, 0xA7,
280 0xB3, 0xA9, 0xB4, 0xAB, 0xAC, 0xAD, 0xAE, 0xB7,
281 0xB0, 0xB1, 0xB6, 0xA6, 0xAD, 0xB5, 0xB6, 0xB7,
282 0xA3, 0xB9, 0xA4, 0xBB, 0xBC, 0xBD, 0xBE, 0xA7,
283 0xE1, 0xE2, 0xF7, 0xE7, 0xE4, 0xE5, 0xF6, 0xFA,
284 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0,
285 0xF2, 0xF3, 0xF4, 0xF5, 0xE6, 0xE8, 0xE3, 0xFE,
286 0xFB, 0xFD, 0xFF, 0xF9, 0xF8, 0xFC, 0xE0, 0xF1,
287 0xC1, 0xC2, 0xD7, 0xC7, 0xC4, 0xC5, 0xD6, 0xDA,
288 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0,
289 0xD2, 0xD3, 0xD4, 0xD5, 0xC6, 0xC8, 0xC3, 0xDE,
290 0xDB, 0xDD, 0xDF, 0xD9, 0xD8, 0xDC, 0xC0, 0xD1};
291 //---------------------------------------------------------------------------
292 void KOIToWin(const char * s1, char * s2, int l)
295 for (int j = 0; j < l; j++)
304 //---------------------------------------------------------------------------
305 void WinToKOI(const char * s1, char * s2, int l)
308 for (int j = 0; j < l; j++)
317 //---------------------------------------------------------------------------
318 void KOIToWin(const string & s1, string * s2)
320 s2->erase(s2->begin(), s2->end());
322 s2->reserve(s1.length());
323 for (int j = 0; j < (int)s1.length(); j++)
326 s2->push_back(koi2win[t]);
329 //---------------------------------------------------------------------------
330 void WinToKOI(const string & s1, string * s2)
332 s2->erase(s2->begin(), s2->end());
334 s2->reserve(s1.length());
335 for (int j = 0; j < (int)s1.length(); j++)
338 s2->push_back(win2koi[t]);
341 //---------------------------------------------------------------------------
342 void Encode12str(string & dst, const string & src)
344 dst.erase(dst.begin(), dst.end());
345 for (size_t i = 0; i < src.length(); i++)
347 dst.push_back('a' + (src[i] & 0x0f));
348 dst.push_back('a' + ((src[i] & 0xf0) >> 4));
351 //---------------------------------------------------------------------------
352 void Decode21str(std::string & dst, const std::string & src)
354 dst.erase(dst.begin(), dst.end());
355 for (size_t i = 0; i < src.length() / 2; i++)
357 char c1 = src[i * 2];
358 char c2 = src[i * 2 + 1];
363 dst.push_back(c1 + (c2 << 4));
366 //---------------------------------------------------------------------------
367 void Encode12(char * dst, const char * src, size_t srcLen)
369 for (size_t i = 0; i <= srcLen; i++)
371 char c1 = src[i] & 0x0f;
372 char c2 = (src[i] & 0xf0) >> 4;
382 //---------------------------------------------------------------------------
383 void Decode21(char * dst, const char * src)
385 for (size_t i = 0; ; i++)
390 char c1 = src[i * 2];
391 char c2 = src[i * 2 + 1];
396 dst[i] = c1 + (c2 << 4);
398 dst[strlen(src) / 2] = 0;
400 //---------------------------------------------------------------------------
401 int ParseIPString(const char * str, uint32_t * ips, int maxIP)
404 *Function Name:ParseIPString
407 ÓÔÒÏËÁ ÄÌÑ ÒÁÚÂÏÒÁ É ÍÁÓÓÉ× ËÕÄÁ ÚÁÎÏÓÉÔØ ÐÏÌÕÞÅÎÎÙÅ ÁÄÒÅÓÁ
410 îÁ ×ÈÏÄÅ ÄÏÌÖÎÁ ÂÙÔØ ÓÔÒÏËÁ ×ÉÄÁ "ip1,ip2,ip3" ÉÌÉ "*"
411 ÷ ÐÅÒ×ÏÍ ÓÌÕÞÁÅ × ÍÁÓÓÉ× ÚÁÎÏÓÑÔÓÑ ÒÁÚÏÂÒÁÎÎÙÅ ÁÄÒÅÓÁ.
412 åÓÌÉ ÉÈ ÍÅÎØÛÅ MAX_IP?, ÔÏ ÐÏÓÌÅÄÎÉÊ ÁÄÒÅÓ ÂÕÄÅÔ 255.255.255.255
413 åÓÌÉ ÓÔÒÏËÁ * , ÔÏ ÐÅÒ×ÁÙÊ ÁÄÒÅÓ ÂÕÄÅÔ 0.0.0.0, Ô.Å. ÌÀÂÏÊ
415 *Returns: 0 ÅÓÌÉ ×ÓÅ ïë
423 strncpy(p, str, 254);
426 memset(ips, 0xFF, sizeof(unsigned long) * maxIP);
428 if (str[0] == '*' && strlen(str) == 1)
434 for (int i = 0; i < maxIP; i++)
436 p1 = strtok(pp, ",\n ");
439 if (p1 == NULL && n == 0)// ÕËÁÚÁÔÅÌØ ÎÕÌØ É ÐÒÏÞÉÔÁÎÏ ÁÄÒÅÓÏ× ÔÏÖÅ ÎÏÌØ
450 if (inet_pton(AF_INET, p1, &in) != 1)
452 //printf("INADDR_NONE\n");
458 /*if (ips[n] == INADDR_NONE)
470 //-----------------------------------------------------------------------------
471 int DaysInCurrentMonth()
473 time_t t = time(NULL);
475 struct tm * lt = localtime(&t);
477 return DaysInMonth(lt->tm_year, lt->tm_mon);
479 //-----------------------------------------------------------------------------
480 int DaysInMonth(unsigned year, unsigned mon)
482 assert(mon < 12 && "Month number should be 0 - 11");
485 case 0: return 31; //jan
487 if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))
490 case 2: return 31; //mar
491 case 3: return 30; //apr
492 case 4: return 31; //may
493 case 5: return 30; //june
494 case 6: return 31; //jule
495 case 7: return 31; //aug
496 case 8: return 30; //sep
497 case 9: return 31; //oct
498 case 10: return 30; //nov
499 case 11: return 31; //dec
501 return -1; // We will never reach here
503 //-----------------------------------------------------------------------------
507 æÕÎËÃÉÑ ×ÏÚ×ÒÁÝÁÅÔ ÎÁÉÍÅÎØÛÅÅ ÞÉÓÌÏ ËÒÁÔÎÏÅ 8-ÍÉ ÂÏÌØÛÅÅ ÉÌÉ ÒÁ×ÎÏÅ ÚÁÄÁÎÎÏÍÕ
512 return a + (8 - a % 8);
514 //-----------------------------------------------------------------------------
515 /*char * inet_ntostr(unsigned long ip)
517 struct in_addr addr = {ip};
518 return inet_ntoa(addr);
520 //-----------------------------------------------------------------------------
521 std::string inet_ntostring(uint32_t ip)
523 char buf[INET_ADDRSTRLEN + 1];
524 return inet_ntop(AF_INET, &ip, buf, INET_ADDRSTRLEN);
526 //-----------------------------------------------------------------------------
527 uint32_t inet_strington(const std::string & value)
531 if (inet_pton(AF_INET, value.c_str(), &result) <= 0)
536 //-----------------------------------------------------------------------------
537 int ParseTariffTimeStr(const char * str, int &h1, int &m1, int &h2, int &m2)
539 char hs1[10], ms1[10], hs2[10], ms2[10];
544 strncpy(ss, str, 48);
546 p1 = strtok(ss, "-");
552 p2 = strtok(NULL, "-");
558 p1 = strtok(s1, ":");
564 p2 = strtok(NULL, ":");
570 p1 = strtok(s2, ":");
576 p2 = strtok(NULL, ":");
582 if (str2x(hs1, h1) != 0)
585 if (str2x(ms1, m1) != 0)
588 if (str2x(hs2, h2) != 0)
591 if (str2x(ms2, m2) != 0)
596 /*//---------------------------------------------------------------------------
599 if (c >= '0' && c <= '9')
603 //-----------------------------------------------------------------------------
606 if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))
610 //-----------------------------------------------------------------------------
611 const char * LogDate(time_t t)
614 struct tm * tt = localtime(&t);
616 snprintf(s, 20, "%d-%s%d-%s%d %s%d:%s%d:%s%d",
618 tt->tm_mon + 1 < 10 ? "0" : "", tt->tm_mon + 1,
619 tt->tm_mday < 10 ? "0" : "", tt->tm_mday,
620 tt->tm_hour < 10 ? "0" : "", tt->tm_hour,
621 tt->tm_min < 10 ? "0" : "", tt->tm_min,
622 tt->tm_sec < 10 ? "0" : "", tt->tm_sec);
626 //-----------------------------------------------------------------------------
627 uint32_t CalcMask(uint32_t msk)
629 if (msk >= 32) return 0xFFffFFff;
630 if (msk == 0) return 0;
631 return htonl(0xFFffFFff << (32 - msk));
633 //---------------------------------------------------------------------------
634 void TouchFile(const string & fileName)
636 FILE * f = fopen(fileName.c_str(), "w");
640 //---------------------------------------------------------------------------
642 void EncodeStr(char * str, unsigned long serial, int useHDD)
644 int len = strlen(str);
648 char serial_c[sizeof(serial)];
649 memcpy(serial_c, &serial, sizeof(serial));
651 for (i = 0; i < len; i++)
657 str[i] = str[i]^serial_c[j%sizeof(serial)];
662 for (i = 0; i < 2*len; i++)
666 c1 = (str[i/2] >> 4);
672 c2 = (str[i/2] & 0x0f);
680 //---------------------------------------------------------------------------
681 void DecodeStr(char * str, unsigned long serial, int useHDD)
683 int len = strlen(str);
687 char serial_c[sizeof(serial)];
688 memcpy(serial_c, &serial, sizeof(serial));
690 for (i = 0; i < len; i += 2)
693 c2 = (str[i+1] - 50)<<4;
696 for (i = 0; i < len/2; i++)
699 strdc[i] = strdc[i]^49;
702 strdc[i] = strdc[i]^serial_c[j%sizeof(serial)];
709 //---------------------------------------------------------------------------
711 void SwapBytes(uint16_t & value)
713 value = (value >> 8) |
716 //---------------------------------------------------------------------------
717 void SwapBytes(uint32_t & value)
719 value = (value >> 24) |
720 ((value << 8) & 0x00FF0000L)|
721 ((value >> 8) & 0x0000FF00L)|
724 //---------------------------------------------------------------------------
725 void SwapBytes(uint64_t & value)
727 value = (value >> 56) |
728 ((value << 40) & 0x00FF000000000000LL) |
729 ((value << 24) & 0x0000FF0000000000LL) |
730 ((value << 8) & 0x000000FF00000000LL) |
731 ((value >> 8) & 0x00000000FF000000LL) |
732 ((value >> 24) & 0x0000000000FF0000LL) |
733 ((value >> 40) & 0x000000000000FF00LL) |
736 //---------------------------------------------------------------------------
737 void SwapBytes(int16_t & value)
739 uint16_t temp = value;
743 //---------------------------------------------------------------------------
744 void SwapBytes(int32_t & value)
746 uint32_t temp = value;
750 //---------------------------------------------------------------------------
751 void SwapBytes(int64_t & value)
753 uint64_t temp = value;
757 //---------------------------------------------------------------------------
758 int str2x(const std::string & str, int & x)
760 x = strtol(str.c_str(), NULL, 10);
767 //---------------------------------------------------------------------------
768 int str2x(const std::string & str, unsigned & x)
770 x = strtoul(str.c_str(), NULL, 10);
777 //---------------------------------------------------------------------------
778 int str2x(const std::string & str, long & x)
780 x = strtol(str.c_str(), NULL, 10);
787 //---------------------------------------------------------------------------
788 int str2x(const std::string & str, unsigned long & x)
790 x = strtoul(str.c_str(), NULL, 10);
798 //---------------------------------------------------------------------------
799 int str2x(const std::string & str, long long & x)
801 x = strtoll(str.c_str(), NULL, 10);
808 //---------------------------------------------------------------------------
809 int str2x(const std::string & str, unsigned long long & x)
811 x = strtoull(str.c_str(), NULL, 10);
819 //---------------------------------------------------------------------------
820 const std::string & x2str(unsigned x, std::string & s)
822 return unsigned2str(x, s);
824 //---------------------------------------------------------------------------
825 const std::string & x2str(unsigned long x, std::string & s)
827 return unsigned2str(x, s);
829 //---------------------------------------------------------------------------
830 const std::string & x2str(unsigned long long x, std::string & s)
832 return unsigned2str(x, s);
834 //---------------------------------------------------------------------------
835 std::string & TrimL(std::string & val)
837 size_t pos = val.find_first_not_of(" \t");
838 if (pos == std::string::npos)
840 val.erase(val.begin(), val.end());
848 //---------------------------------------------------------------------------
849 std::string & TrimR(std::string & val)
851 size_t pos = val.find_last_not_of(" \t");
852 if (pos != std::string::npos)
858 //---------------------------------------------------------------------------
859 std::string & Trim(std::string & val)
861 return TrimR(TrimL(val));
863 //---------------------------------------------------------------------------
865 static int is_leap(unsigned y)
868 return (y % 4) == 0 && ((y % 100) != 0 || (y % 400) == 0);
871 //---------------------------------------------------------------------------
873 time_t stg_timegm(struct tm * brokenTime)
876 static const unsigned ndays[2][12] ={
877 {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
878 {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};
880 for (int i = 70; i < brokenTime->tm_year; ++i)
881 res += is_leap(i) ? 366 : 365;
882 for (int i = 0; i < brokenTime->tm_mon; ++i)
883 res += ndays[is_leap(brokenTime->tm_year)][i];
884 res += brokenTime->tm_mday - 1;
886 res += brokenTime->tm_hour;
888 res += brokenTime->tm_min;
890 res += brokenTime->tm_sec;
894 return timegm(brokenTime);
901 ret = mktime(brokenTime);
908 #endif // HAVE_TIMEGM
911 //---------------------------------------------------------------------------
912 std::string IconvString(const std::string & source,
913 const std::string & from,
914 const std::string & to)
917 return std::string();
919 size_t inBytesLeft = source.length() + 1;
920 size_t outBytesLeft = source.length() * 2 + 1;
922 char * inBuf = new char[inBytesLeft];
923 char * outBuf = new char[outBytesLeft];
925 strncpy(inBuf, source.c_str(), source.length());
927 inBuf[source.length()] = 0;
929 #if defined(FREE_BSD) || defined(FREE_BSD5) || defined(WIN32)
930 const char * srcPos = inBuf;
932 char * srcPos = inBuf;
934 char * dstPos = outBuf;
936 iconv_t handle = iconv_open(to.c_str(),
939 if (handle == iconv_t(-1))
943 printfd(__FILE__, "IconvString(): iconv from %s to %s failed\n", from.c_str(), to.c_str());
949 printfd(__FILE__, "IconvString(): iconv_open error\n");
956 size_t res = iconv(handle,
957 &srcPos, &inBytesLeft,
958 &dstPos, &outBytesLeft);
960 if (res == size_t(-1))
962 printfd(__FILE__, "IconvString(): '%s'\n", strerror(errno));
972 std::string dst(outBuf);
982 int ParseYesNo(const std::string & str, bool * val)
984 if (0 == strncasecmp(str.c_str(), "yes", 3))
990 if (0 == strncasecmp(str.c_str(), "no", 2))
1000 int ParseInt(const std::string & str, int * val)
1002 if (str2x<int>(str, *val))
1008 int ParseUnsigned(const string & str, unsigned * val)
1010 if (str2x<unsigned>(str, *val))
1015 int ParseIntInRange(const string & str, int min, int max, int * val)
1017 if (ParseInt(str, val) != 0)
1020 if (*val < min || *val > max)
1026 int ParseUnsignedInRange(const string & str, unsigned min,
1027 unsigned max, unsigned * val)
1029 if (ParseUnsigned(str, val) != 0)
1032 if (*val < min || *val > max)