]> git.donarmstrong.com Git - mothur.git/blob - myutils.h
61220546b81894283bb6350f5c2c51ecc8800cb2
[mothur.git] / myutils.h
1 //uchime by Robert C. Edgar http://drive5.com/uchime This code is donated to the public domain.\r
2 \r
3 #ifndef myutils_h\r
4 #define myutils_h\r
5 \r
6 #define RCE_MALLOC      0\r
7 \r
8 #include <stdio.h>\r
9 #include <sys/types.h>\r
10 #include <string>\r
11 #include <string.h>\r
12 #include <memory.h>\r
13 #include <vector>\r
14 #include <math.h>\r
15 #include <stdarg.h>\r
16 #include <cstdlib>\r
17 #include <climits>\r
18 \r
19 #ifndef _MSC_VER\r
20 #include <inttypes.h>\r
21 #endif\r
22 \r
23 using namespace std;\r
24 \r
25 #ifdef _MSC_VER\r
26 #include <crtdbg.h>\r
27 #pragma warning(disable: 4996)  // deprecated functions\r
28 #define _CRT_SECURE_NO_DEPRECATE        1\r
29 #endif\r
30 \r
31 #if defined(_DEBUG) && !defined(DEBUG)\r
32 #define DEBUG   1\r
33 #endif\r
34 \r
35 #if defined(DEBUG) && !defined(_DEBUG)\r
36 #define _DEBUG  1\r
37 #endif\r
38 \r
39 #ifndef NDEBUG\r
40 #define DEBUG   1\r
41 #define _DEBUG  1\r
42 #endif\r
43 \r
44 typedef unsigned char byte;\r
45 typedef unsigned short uint16;\r
46 typedef unsigned uint32;\r
47 typedef int int32;\r
48 typedef double float32;\r
49 typedef signed char int8;\r
50 typedef unsigned char uint8;\r
51 \r
52 #ifdef _MSC_VER\r
53 \r
54 typedef __int64 int64;\r
55 typedef unsigned __int64 uint64;\r
56 \r
57 #define INT64_PRINTF            "lld"\r
58 #define UINT64_PRINTF           "llu"\r
59 \r
60 #define SIZE_T_PRINTF           "u"\r
61 #define OFF64_T_PRINTF          "lld"\r
62 \r
63 #define INT64_PRINTFX           "llx"\r
64 #define UINT64_PRINTFX          "llx"\r
65 \r
66 #define SIZE_T_PRINTFX          "x"\r
67 #define OFF64_T_PRINTFX         "llx"\r
68 \r
69 #elif defined(__x86_64__)\r
70 \r
71 typedef long int64;\r
72 typedef unsigned long uint64;\r
73 \r
74 #define INT64_PRINTF            "ld"\r
75 #define UINT64_PRINTF           "lu"\r
76 \r
77 #define SIZE_T_PRINTF           "lu"\r
78 #define OFF64_T_PRINTF          "ld"\r
79 \r
80 #define INT64_PRINTFX           "lx"\r
81 #define UINT64_PRINTFX          "lx"\r
82 \r
83 #define SIZE_T_PRINTFX          "lx"\r
84 #define OFF64_T_PRINTFX         "lx"\r
85 \r
86 #else\r
87 \r
88 typedef long long int64;\r
89 typedef unsigned long long uint64;\r
90 \r
91 #define INT64_PRINTF            "lld"\r
92 #define UINT64_PRINTF           "llu"\r
93 \r
94 #define SIZE_T_PRINTF           "u"\r
95 #define OFF64_T_PRINTF          "lld"\r
96 \r
97 #define INT64_PRINTFX           "llx"\r
98 #define UINT64_PRINTFX          "llx"\r
99 \r
100 #define SIZE_T_PRINTFX          "x"\r
101 #define OFF64_T_PRINTFX         "llx"\r
102 #endif\r
103 \r
104 #define d64             INT64_PRINTF\r
105 #define u64             UINT64_PRINTF\r
106 #define x64             UINT64_PRINTFX\r
107 \r
108 // const uint64 UINT64_MAX                      = (~((uint64) 0));\r
109 \r
110 void myassertfail(const char *Exp, const char *File, unsigned Line);\r
111 #undef  assert\r
112 #ifdef  NDEBUG\r
113 #define assert(exp)     ((void)0)\r
114 #define myassert(exp)     ((void)0)\r
115 #else\r
116 #define assert(exp) (void)( (exp) || (myassertfail(#exp, __FILE__, __LINE__), 0) )\r
117 #define myassert(exp) (void)( (exp) || (myassertfail(#exp, __FILE__, __LINE__), 0) )\r
118 #endif\r
119 #define asserta(exp) (void)( (exp) || (myassertfail(#exp, __FILE__, __LINE__), 0) )\r
120 \r
121 #define ureturn(x)      return (x)\r
122 \r
123 #define NotUsed(v)      ((void *) &v)\r
124 \r
125 // pom=plus or minus, tof=true or false\r
126 static inline char pom(bool Plus)       { return Plus ? '+' : '-'; }\r
127 static inline char tof(bool x)          { return x ? 'T' : 'F'; }\r
128 static inline char yon(bool x)          { return x ? 'Y' : 'N'; }\r
129 unsigned GetElapsedSecs();\r
130 \r
131 #if     RCE_MALLOC\r
132 \r
133 void *rce_malloc(unsigned bytes, const char *FileName, int Line);\r
134 void rce_free(void *p, const char *FileName, int LineNr);\r
135 void rce_chkmem();\r
136 \r
137 void rce_dumpmem_(const char *FileName, int LineNr);\r
138 #define rce_dumpmem()           rce_dumpmem_(__FILE__, __LINE__)\r
139 \r
140 void rce_assertvalidptr_(void *p, const char *FileName, int LineNr);\r
141 #define rce_assertvalidptr(p)   rce_assertvalidptr_(p, __FILE__, __LINE__)\r
142 \r
143 void rce_dumpptr_(void *p, const char *FileName, int LineNr);\r
144 #define rce_dumpptr(p)  rce_dumpptr_(p, __FILE__, __LINE__)\r
145 \r
146 #define mymalloc(n)             rce_malloc((n), __FILE__, __LINE__)\r
147 #define myfree(p)               rce_free(p, __FILE__, __LINE__)\r
148 #define myfree2(p,n)    rce_free(p, __FILE__, __LINE__)\r
149 #define myalloc(t, n)   (t *) rce_malloc((n)*sizeof(t), __FILE__, __LINE__)\r
150 \r
151 #else // RCE_MALLOC\r
152 void *mymalloc(unsigned bytes);\r
153 void myfree2(void *p, unsigned Bytes);\r
154 void myfree(void *p);\r
155 #define rce_chkmem()    /* empty */\r
156 #define myalloc(t, n)   (t *) mymalloc((n)*sizeof(t))\r
157 #endif // RCE_MALLOC\r
158 \r
159 #define SIZE(c) unsigned((c).size())\r
160 \r
161 bool myisatty(int fd);\r
162 \r
163 #ifdef _MSC_VER\r
164 #define off_t   __int64\r
165 #endif\r
166 \r
167 FILE *OpenStdioFile(const string &FileName);\r
168 FILE *CreateStdioFile(const string &FileName);\r
169 bool CanSetStdioFilePos(FILE *f);\r
170 void CloseStdioFile(FILE *f);\r
171 void SetStdioFilePos(FILE *f, off_t Pos);\r
172 void ReadStdioFile(FILE *f, off_t Pos, void *Buffer, unsigned Bytes);\r
173 void ReadStdioFile(FILE *f, void *Buffer, unsigned Bytes);\r
174 void WriteStdioFile(FILE *f, off_t Pos, const void *Buffer, unsigned Bytes);\r
175 void WriteStdioFile(FILE *f, const void *Buffer, unsigned Bytes);\r
176 bool ReadLineStdioFile(FILE *f, char *Line, unsigned Bytes);\r
177 bool ReadLineStdioFile(FILE *f, string &Line);\r
178 byte *ReadAllStdioFile(FILE *f, off_t &FileSize);\r
179 byte *ReadAllStdioFile(const string &FileName, off_t &FileSize);\r
180 void AppendStdioFileToFile(FILE *fFrom, FILE *fTo);\r
181 void FlushStdioFile(FILE *f);\r
182 bool StdioFileExists(const string &FileName);\r
183 off_t GetStdioFilePos(FILE *f);\r
184 off_t GetStdioFileSize(FILE *f);\r
185 void LogStdioFileState(FILE *f);\r
186 void RenameStdioFile(const string &FileNameFrom, const string &FileNameTo);\r
187 void DeleteStdioFile(const string &FileName);\r
188 \r
189 void myvstrprintf(string &Str, const char *szFormat, va_list ArgList);\r
190 void myvstrprintf(string &Str, const char *szFormat, ...);\r
191 \r
192 void SetLogFileName(const string &FileName);\r
193 void Log(const char *szFormat, ...);\r
194 \r
195 void Die(const char *szFormat, ...);\r
196 void Warning(const char *szFormat, ...);\r
197 \r
198 void ProgressStep(unsigned i, unsigned N, const char *Format, ...);\r
199 void Progress(const char *szFormat, ...);\r
200 void Progress(const string &Str);\r
201 void ProgressLog(const char *szFormat, ...);\r
202 void ProgressExit();\r
203 \r
204 char *mystrsave(const char *s);\r
205 \r
206 double GetPeakMemUseBytes();\r
207 \r
208 // Are two floats equal to within epsilon?\r
209 const double epsilon = 0.01;\r
210 inline bool feq(double x, double y, double epsilon)\r
211         {\r
212         if (fabs(x) > 10000)\r
213                 epsilon = fabs(x)/10000;\r
214         if (fabs(x - y) > epsilon)\r
215                 return false;\r
216         return true;\r
217         }\r
218 \r
219 inline bool feq(double x, double y)\r
220         {\r
221         if (x < -1e6 && y < -1e6)\r
222                 return true;\r
223         double e = epsilon;\r
224         if (fabs(x) > 10000)\r
225                 e = fabs(x)/10000;\r
226         if (fabs(x - y) > e)\r
227                 return false;\r
228         return true;\r
229         }\r
230 \r
231 #define asserteq(x, y)  assert(feq(x, y))\r
232 #define assertaeq(x, y) asserta(feq(x, y))\r
233 \r
234 #define zero(a, n)      memset(a, 0, n*sizeof(a[0]))\r
235 \r
236 void InitRand();\r
237 unsigned randu32();\r
238 void Split(const string &Str, vector<string> &Fields, char Sep = 0);\r
239 double Pct(double x, double y);\r
240 double GetMemUseBytes();\r
241 const char *MemBytesToStr(double Bytes);\r
242 const char *IntToStr(unsigned i);\r
243 const char *FloatToStr(double d);\r
244 const char *SecsToStr(double Secs);\r
245 void Logu(unsigned u, unsigned w, unsigned prefixspaces = 2);\r
246 void Logf(float x, unsigned w, unsigned prefixspaces = 2);\r
247 const char *SecsToHHMMSS(int Secs);\r
248 \r
249 void MyCmdLine(int argc, char **argv);\r
250 void CmdLineErr(const char *Format, ...);\r
251 void Help();\r
252 void GetCmdLine(string &s);\r
253 \r
254 #define FLAG_OPT(LongName)                                              extern bool opt_##LongName; extern bool optset_##LongName;\r
255 #define TOG_OPT(LongName, Default)                              extern bool opt_##LongName; extern bool optset_##LongName;\r
256 #define INT_OPT(LongName, Default, Min, Max)    extern int opt_##LongName; extern bool optset_##LongName;\r
257 #define UNS_OPT(LongName, Default, Min, Max)    extern unsigned opt_##LongName; extern bool optset_##LongName;\r
258 #define FLT_OPT(LongName, Default, Min, Max)    extern double opt_##LongName; extern bool optset_##LongName;\r
259 #define STR_OPT(LongName, Default)                              extern string opt_##LongName; extern bool optset_##LongName;\r
260 #define ENUM_OPT(LongName, Default, Values)             extern int opt_##LongName; extern bool optset_##LongName;\r
261 #include "myopts.h"\r
262 #undef FLAG_OPT\r
263 #undef TOG_OPT\r
264 #undef INT_OPT\r
265 #undef UNS_OPT\r
266 #undef FLT_OPT\r
267 #undef STR_OPT\r
268 #undef ENUM_OPT\r
269 \r
270 extern const char *SVN_VERSION;\r
271 extern const char *SVN_MODS;\r
272 extern bool opt_quiet;\r
273 extern bool opt_version;\r
274 extern FILE *g_fLog;\r
275 \r
276 #endif  // myutils_h\r