Move stdarg.h to util.h
[novacoin.git] / src / util.h
1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2012 The Bitcoin developers
3 // Distributed under the MIT/X11 software license, see the accompanying
4 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
5 #ifndef BITCOIN_UTIL_H
6 #define BITCOIN_UTIL_H
7
8 #include "uint256.h"
9
10 #ifndef WIN32
11 #include <sys/types.h>
12 #include <sys/time.h>
13 #include <sys/resource.h>
14 #endif
15
16 #include <map>
17 #include <vector>
18 #include <string>
19
20 #include <boost/thread.hpp>
21 #include <boost/filesystem.hpp>
22 #include <boost/filesystem/path.hpp>
23 #include <boost/date_time/gregorian/gregorian_types.hpp>
24 #include <boost/date_time/posix_time/posix_time_types.hpp>
25 #include <stdarg.h>
26
27 #include "netbase.h" // for AddTimeData
28
29 typedef long long  int64;
30 typedef unsigned long long  uint64;
31
32 static const int64 COIN = 1000000;
33 static const int64 CENT = 10000;
34
35 #define BEGIN(a)            ((char*)&(a))
36 #define END(a)              ((char*)&((&(a))[1]))
37 #define UBEGIN(a)           ((unsigned char*)&(a))
38 #define UEND(a)             ((unsigned char*)&((&(a))[1]))
39 #define ARRAYLEN(array)     (sizeof(array)/sizeof((array)[0]))
40
41 #define UVOIDBEGIN(a)        ((void*)&(a))
42 #define CVOIDBEGIN(a)        ((const void*)&(a))
43 #define UINTBEGIN(a)        ((uint32_t*)&(a))
44 #define CUINTBEGIN(a)        ((const uint32_t*)&(a))
45
46 #ifndef PRI64d
47 #if defined(_MSC_VER) || defined(__MSVCRT__)
48 #define PRI64d  "I64d"
49 #define PRI64u  "I64u"
50 #define PRI64x  "I64x"
51 #else
52 #define PRI64d  "lld"
53 #define PRI64u  "llu"
54 #define PRI64x  "llx"
55 #endif
56 #endif
57
58 #ifndef THROW_WITH_STACKTRACE
59 #define THROW_WITH_STACKTRACE(exception)  \
60 {                                         \
61     LogStackTrace();                      \
62     throw (exception);                    \
63 }
64 void LogStackTrace();
65 #endif
66
67
68 /* Format characters for (s)size_t and ptrdiff_t */
69 #if defined(_MSC_VER) || defined(__MSVCRT__)
70   /* (s)size_t and ptrdiff_t have the same size specifier in MSVC:
71      http://msdn.microsoft.com/en-us/library/tcxf1dw6%28v=vs.100%29.aspx
72    */
73   #define PRIszx    "Ix"
74   #define PRIszu    "Iu"
75   #define PRIszd    "Id"
76   #define PRIpdx    "Ix"
77   #define PRIpdu    "Iu"
78   #define PRIpdd    "Id"
79 #else /* C99 standard */
80   #define PRIszx    "zx"
81   #define PRIszu    "zu"
82   #define PRIszd    "zd"
83   #define PRIpdx    "tx"
84   #define PRIpdu    "tu"
85   #define PRIpdd    "td"
86 #endif
87
88 // This is needed because the foreach macro can't get over the comma in pair<t1, t2>
89 #define PAIRTYPE(t1, t2)    std::pair<t1, t2>
90
91 // Align by increasing pointer, must have extra space at end of buffer
92 template <size_t nBytes, typename T>
93 T* alignup(T* p)
94 {
95     union
96     {
97         T* ptr;
98         size_t n;
99     } u;
100     u.ptr = p;
101     u.n = (u.n + (nBytes-1)) & ~(nBytes-1);
102     return u.ptr;
103 }
104
105 #ifdef WIN32
106 #define MSG_NOSIGNAL        0
107 #define MSG_DONTWAIT        0
108
109 #ifndef S_IRUSR
110 #define S_IRUSR             0400
111 #define S_IWUSR             0200
112 #endif
113 #else
114 #define MAX_PATH            1024
115 inline void Sleep(int64 n)
116 {
117     /*Boost has a year 2038 problem— if the request sleep time is past epoch+2^31 seconds the sleep returns instantly.
118       So we clamp our sleeps here to 10 years and hope that boost is fixed by 2028.*/
119     boost::thread::sleep(boost::get_system_time() + boost::posix_time::milliseconds(n>315576000000LL?315576000000LL:n));
120 }
121 #endif
122
123 /* This GNU C extension enables the compiler to check the format string against the parameters provided.
124  * X is the number of the "format string" parameter, and Y is the number of the first variadic parameter.
125  * Parameters count from 1.
126  */
127 #ifdef __GNUC__
128 #define ATTR_WARN_PRINTF(X,Y) __attribute__((format(printf,X,Y)))
129 #else
130 #define ATTR_WARN_PRINTF(X,Y)
131 #endif
132
133
134
135
136
137
138
139
140 extern std::map<std::string, std::string> mapArgs;
141 extern std::map<std::string, std::vector<std::string> > mapMultiArgs;
142 extern bool fDebug;
143 extern bool fDebugNet;
144 extern bool fPrintToConsole;
145 extern bool fPrintToDebugger;
146 extern bool fRequestShutdown;
147 extern bool fShutdown;
148 extern bool fDaemon;
149 extern bool fServer;
150 extern bool fCommandLine;
151 extern std::string strMiscWarning;
152 extern bool fTestNet;
153 extern bool fNoListen;
154 extern bool fLogTimestamps;
155 extern bool fReopenDebugLog;
156
157 void RandAddSeed();
158 void RandAddSeedPerfmon();
159 int ATTR_WARN_PRINTF(1,2) OutputDebugStringF(const char* pszFormat, ...);
160
161 /*
162   Rationale for the real_strprintf / strprintf construction:
163     It is not allowed to use va_start with a pass-by-reference argument.
164     (C++ standard, 18.7, paragraph 3). Use a dummy argument to work around this, and use a
165     macro to keep similar semantics.
166 */
167
168 /** Overload strprintf for char*, so that GCC format type warnings can be given */
169 std::string ATTR_WARN_PRINTF(1,3) real_strprintf(const char *format, int dummy, ...);
170 /** Overload strprintf for std::string, to be able to use it with _ (translation).
171  * This will not support GCC format type warnings (-Wformat) so be careful.
172  */
173 std::string real_strprintf(const std::string &format, int dummy, ...);
174 #define strprintf(format, ...) real_strprintf(format, 0, __VA_ARGS__)
175 std::string vstrprintf(const char *format, va_list ap);
176
177 bool ATTR_WARN_PRINTF(1,2) error(const char *format, ...);
178
179 /* Redefine printf so that it directs output to debug.log
180  *
181  * Do this *after* defining the other printf-like functions, because otherwise the
182  * __attribute__((format(printf,X,Y))) gets expanded to __attribute__((format(OutputDebugStringF,X,Y)))
183  * which confuses gcc.
184  */
185 #define printf OutputDebugStringF
186
187 void LogException(std::exception* pex, const char* pszThread);
188 void PrintException(std::exception* pex, const char* pszThread);
189 void PrintExceptionContinue(std::exception* pex, const char* pszThread);
190 void ParseString(const std::string& str, char c, std::vector<std::string>& v);
191 std::string FormatMoney(int64 n, bool fPlus=false);
192 bool ParseMoney(const std::string& str, int64& nRet);
193 bool ParseMoney(const char* pszIn, int64& nRet);
194 std::vector<unsigned char> ParseHex(const char* psz);
195 std::vector<unsigned char> ParseHex(const std::string& str);
196 bool IsHex(const std::string& str);
197 std::vector<unsigned char> DecodeBase64(const char* p, bool* pfInvalid = NULL);
198 std::string DecodeBase64(const std::string& str);
199 std::string EncodeBase64(const unsigned char* pch, size_t len);
200 std::string EncodeBase64(const std::string& str);
201 std::vector<unsigned char> DecodeBase32(const char* p, bool* pfInvalid = NULL);
202 std::string DecodeBase32(const std::string& str);
203 std::string EncodeBase32(const unsigned char* pch, size_t len);
204 std::string EncodeBase32(const std::string& str);
205 std::string EncodeDumpTime(int64 nTime);
206 int64 DecodeDumpTime(const std::string& s);
207 std::string EncodeDumpString(const std::string &str);
208 std::string DecodeDumpString(const std::string &str);
209 void ParseParameters(int argc, const char*const argv[]);
210 bool WildcardMatch(const char* psz, const char* mask);
211 bool WildcardMatch(const std::string& str, const std::string& mask);
212 void FileCommit(FILE *fileout);
213 int GetFilesize(FILE* file);
214 bool RenameOver(boost::filesystem::path src, boost::filesystem::path dest);
215 boost::filesystem::path GetDefaultDataDir();
216 const boost::filesystem::path &GetDataDir(bool fNetSpecific = true);
217 boost::filesystem::path GetConfigFile();
218 boost::filesystem::path GetPidFile();
219 #ifndef WIN32
220 void CreatePidFile(const boost::filesystem::path &path, pid_t pid);
221 #endif
222 void ReadConfigFile(std::map<std::string, std::string>& mapSettingsRet, std::map<std::string, std::vector<std::string> >& mapMultiSettingsRet);
223 #ifdef WIN32
224 boost::filesystem::path GetSpecialFolderPath(int nFolder, bool fCreate = true);
225 #endif
226 void ShrinkDebugFile();
227 int GetRandInt(int nMax);
228 uint64 GetRand(uint64 nMax);
229 uint256 GetRandHash();
230 int64 GetTime();
231 void SetMockTime(int64 nMockTimeIn);
232 int64 GetAdjustedTime();
233 int64 GetTimeOffset();
234 std::string FormatFullVersion();
235 std::string FormatSubVersion(const std::string& name, int nClientVersion, const std::vector<std::string>& comments);
236 void AddTimeData(const CNetAddr& ip, int64 nTime);
237 void runCommand(std::string strCommand);
238
239
240
241
242
243
244
245
246
247 inline std::string i64tostr(int64 n)
248 {
249     return strprintf("%"PRI64d, n);
250 }
251
252 inline std::string itostr(int n)
253 {
254     return strprintf("%d", n);
255 }
256
257 inline int64 atoi64(const char* psz)
258 {
259 #ifdef _MSC_VER
260     return _atoi64(psz);
261 #else
262     return strtoll(psz, NULL, 10);
263 #endif
264 }
265
266 inline int64 atoi64(const std::string& str)
267 {
268 #ifdef _MSC_VER
269     return _atoi64(str.c_str());
270 #else
271     return strtoll(str.c_str(), NULL, 10);
272 #endif
273 }
274
275 inline int atoi(const std::string& str)
276 {
277     return atoi(str.c_str());
278 }
279
280 inline int roundint(double d)
281 {
282     return (int)(d > 0 ? d + 0.5 : d - 0.5);
283 }
284
285 inline int64 roundint64(double d)
286 {
287     return (int64)(d > 0 ? d + 0.5 : d - 0.5);
288 }
289
290 inline int64 abs64(int64 n)
291 {
292     return (n >= 0 ? n : -n);
293 }
294
295 inline std::string leftTrim(std::string src, char chr)
296 {
297     std::string::size_type pos = src.find_first_not_of(chr, 0);
298
299     if(pos > 0)
300         src.erase(0, pos);
301
302     return src;
303 }
304
305 template<typename T>
306 std::string HexStr(const T itbegin, const T itend, bool fSpaces=false)
307 {
308     std::string rv;
309     static const char hexmap[16] = { '0', '1', '2', '3', '4', '5', '6', '7',
310                                      '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
311     rv.reserve((itend-itbegin)*3);
312     for(T it = itbegin; it < itend; ++it)
313     {
314         unsigned char val = (unsigned char)(*it);
315         if(fSpaces && it != itbegin)
316             rv.push_back(' ');
317         rv.push_back(hexmap[val>>4]);
318         rv.push_back(hexmap[val&15]);
319     }
320
321     return rv;
322 }
323
324 inline std::string HexStr(const std::vector<unsigned char>& vch, bool fSpaces=false)
325 {
326     return HexStr(vch.begin(), vch.end(), fSpaces);
327 }
328
329 template<typename T>
330 void PrintHex(const T pbegin, const T pend, const char* pszFormat="%s", bool fSpaces=true)
331 {
332     printf(pszFormat, HexStr(pbegin, pend, fSpaces).c_str());
333 }
334
335 inline void PrintHex(const std::vector<unsigned char>& vch, const char* pszFormat="%s", bool fSpaces=true)
336 {
337     printf(pszFormat, HexStr(vch, fSpaces).c_str());
338 }
339
340 inline int64 GetPerformanceCounter()
341 {
342     int64 nCounter = 0;
343 #ifdef WIN32
344     QueryPerformanceCounter((LARGE_INTEGER*)&nCounter);
345 #else
346     timeval t;
347     gettimeofday(&t, NULL);
348     nCounter = (int64) t.tv_sec * 1000000 + t.tv_usec;
349 #endif
350     return nCounter;
351 }
352
353 inline int64 GetTimeMillis()
354 {
355     return (boost::posix_time::ptime(boost::posix_time::microsec_clock::universal_time()) -
356             boost::posix_time::ptime(boost::gregorian::date(1970,1,1))).total_milliseconds();
357 }
358
359 inline std::string DateTimeStrFormat(const char* pszFormat, int64 nTime)
360 {
361     time_t n = nTime;
362     struct tm* ptmTime = gmtime(&n);
363     char pszTime[200];
364     strftime(pszTime, sizeof(pszTime), pszFormat, ptmTime);
365     return pszTime;
366 }
367
368 static const std::string strTimestampFormat = "%Y-%m-%d %H:%M:%S UTC";
369 inline std::string DateTimeStrFormat(int64 nTime)
370 {
371     return DateTimeStrFormat(strTimestampFormat.c_str(), nTime);
372 }
373
374
375 template<typename T>
376 void skipspaces(T& it)
377 {
378     while (isspace(*it))
379         ++it;
380 }
381
382 inline bool IsSwitchChar(char c)
383 {
384 #ifdef WIN32
385     return c == '-' || c == '/';
386 #else
387     return c == '-';
388 #endif
389 }
390
391 /**
392  * Return string argument or default value
393  *
394  * @param strArg Argument to get (e.g. "-foo")
395  * @param default (e.g. "1")
396  * @return command-line argument or default value
397  */
398 std::string GetArg(const std::string& strArg, const std::string& strDefault);
399
400 /**
401  * Return integer argument or default value
402  *
403  * @param strArg Argument to get (e.g. "-foo")
404  * @param default (e.g. 1)
405  * @return command-line argument (0 if invalid number) or default value
406  */
407 int64 GetArg(const std::string& strArg, int64 nDefault);
408
409 /**
410  * Return boolean argument or default value
411  *
412  * @param strArg Argument to get (e.g. "-foo")
413  * @param default (true or false)
414  * @return command-line argument or default value
415  */
416 bool GetBoolArg(const std::string& strArg, bool fDefault=false);
417
418 /**
419  * Set an argument if it doesn't already have a value
420  *
421  * @param strArg Argument to set (e.g. "-foo")
422  * @param strValue Value (e.g. "1")
423  * @return true if argument gets set, false if it already had a value
424  */
425 bool SoftSetArg(const std::string& strArg, const std::string& strValue);
426
427 /**
428  * Set a boolean argument if it doesn't already have a value
429  *
430  * @param strArg Argument to set (e.g. "-foo")
431  * @param fValue Value (e.g. false)
432  * @return true if argument gets set, false if it already had a value
433  */
434 bool SoftSetBoolArg(const std::string& strArg, bool fValue);
435
436 /**
437  * Timing-attack-resistant comparison.
438  * Takes time proportional to length
439  * of first argument.
440  */
441 template <typename T>
442 bool TimingResistantEqual(const T& a, const T& b)
443 {
444     if (b.size() == 0) return a.size() == 0;
445     size_t accumulator = a.size() ^ b.size();
446     for (size_t i = 0; i < a.size(); i++)
447         accumulator |= a[i] ^ b[i%b.size()];
448     return accumulator == 0;
449 }
450
451 /** Median filter over a stream of values.
452  * Returns the median of the last N numbers
453  */
454 template <typename T> class CMedianFilter
455 {
456 private:
457     std::vector<T> vValues;
458     std::vector<T> vSorted;
459     unsigned int nSize;
460 public:
461     CMedianFilter(unsigned int size, T initial_value):
462         nSize(size)
463     {
464         vValues.reserve(size);
465         vValues.push_back(initial_value);
466         vSorted = vValues;
467     }
468
469     void input(T value)
470     {
471         if(vValues.size() == nSize)
472         {
473             vValues.erase(vValues.begin());
474         }
475         vValues.push_back(value);
476
477         vSorted.resize(vValues.size());
478         std::copy(vValues.begin(), vValues.end(), vSorted.begin());
479         std::sort(vSorted.begin(), vSorted.end());
480     }
481
482     T median() const
483     {
484         int size = vSorted.size();
485         assert(size>0);
486         if(size & 1) // Odd number of elements
487         {
488             return vSorted[size/2];
489         }
490         else // Even number of elements
491         {
492             return (vSorted[size/2-1] + vSorted[size/2]) / 2;
493         }
494     }
495
496     int size() const
497     {
498         return vValues.size();
499     }
500
501     std::vector<T> sorted () const
502     {
503         return vSorted;
504     }
505 };
506
507 bool NewThread(void(*pfn)(void*), void* parg);
508
509 #ifdef WIN32
510 inline void SetThreadPriority(int nPriority)
511 {
512     SetThreadPriority(GetCurrentThread(), nPriority);
513 }
514 #else
515
516 #define THREAD_PRIORITY_LOWEST          PRIO_MAX
517 #define THREAD_PRIORITY_BELOW_NORMAL    2
518 #define THREAD_PRIORITY_NORMAL          0
519 #define THREAD_PRIORITY_ABOVE_NORMAL    0
520
521 inline void SetThreadPriority(int nPriority)
522 {
523     // It's unclear if it's even possible to change thread priorities on Linux,
524     // but we really and truly need it for the generation threads.
525 #ifdef PRIO_THREAD
526     setpriority(PRIO_THREAD, 0, nPriority);
527 #else
528     setpriority(PRIO_PROCESS, 0, nPriority);
529 #endif
530 }
531
532 inline void ExitThread(size_t nExitCode)
533 {
534     pthread_exit((void*)nExitCode);
535 }
536 #endif
537
538 void RenameThread(const char* name);
539
540 inline uint32_t ByteReverse(uint32_t value)
541 {
542     value = ((value & 0xFF00FF00) >> 8) | ((value & 0x00FF00FF) << 8);
543     return (value<<16) | (value>>16);
544 }
545
546 #endif
547