summaryrefslogtreecommitdiff
path: root/stdafx.h
blob: 8c24ea05309ffab87f529dae43ae5b39caacac42 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//

/**
*    Copyright (C) 2008 10gen Inc.
*  
*    This program is free software: you can redistribute it and/or  modify
*    it under the terms of the GNU Affero General Public License, version 3,
*    as published by the Free Software Foundation.
*  
*    This program is distributed in the hope that it will be useful,
*    but WITHOUT ANY WARRANTY; without even the implied warranty of
*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*    GNU Affero General Public License for more details.
*  
*    You should have received a copy of the GNU Affero General Public License
*    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#pragma once

#if defined(_WIN32)
const bool debug=true;
#else
const bool debug=false;
#endif

#include <memory>
#include "stdlib.h"
#include "string.h"
#include "limits.h"

extern void dbexit(int returnCode, const char *whyMsg = "");

inline void * ourmalloc(size_t size) { 
	void *x = malloc(size);
	if( x == 0 ) dbexit(42, "malloc fails");
	return x;
}

inline void * ourrealloc(void *ptr, size_t size) { 
	void *x = realloc(ptr, size);
	if( x == 0 ) dbexit(43, "realloc fails");
	return x;
}

#define malloc ourmalloc
#define realloc ourrealloc

#include "targetver.h"

#include <string>
#include "time.h"

using namespace std;

/* these are manipulated outside of mutexes, so be careful */
struct Assertion { 
    Assertion() { 
        msg[0] = msg[127] = 0;
        context[0] = context[127] = 0;
        file = "";
        line = 0;
        when = 0;
    }
    char msg[128];
    char context[128];
    const char *file;
    unsigned line;
    time_t when;
    void set(const char *m, const char *ctxt, const char *f, unsigned l) { 
        strncpy(msg, m, 127);
        strncpy(context, ctxt, 127);
        file = f; line = l;
        when = time(0);
    }
    string toString();
    bool isSet() { return when != 0; }
};

enum { 
    AssertRegular = 0, 
    AssertW = 1,
    AssertMsg = 2,
    AssertUser = 3
};

/* last assert of diff types: regular, wassert, msgassert, uassert: */
extern Assertion lastAssert[4];

// you can catch these
class AssertionException { 
public:
    string msg; 
	AssertionException() { }
    virtual bool severe() { return true; }
	virtual bool isUserAssertion() { return false; }
    virtual string toString() { return msg; }
};

/* we use the same mechanism for bad things the user does -- which are really just errors */
class UserAssertionException : public AssertionException { 
public:
	UserAssertionException(const char *_msg) { msg = _msg; }
	UserAssertionException(string _msg) { msg = _msg; }
    virtual bool severe() { return false; }
	virtual bool isUserAssertion() { return true; }
    virtual string toString() { return "userassert:" + msg; }
};

class MsgAssertionException : public AssertionException { 
public:
	MsgAssertionException(const char *_msg) { msg = _msg; }
    virtual bool severe() { return false; }
    virtual string toString() { return "massert:" + msg; }
};

void asserted(const char *msg, const char *file, unsigned line);
void wasserted(const char *msg, const char *file, unsigned line);
void uasserted(const char *msg);
void msgasserted(const char *msg); 

#ifdef assert
#undef assert
#endif

#define assert(_Expression) (void)( (!!(_Expression)) || (asserted(#_Expression, __FILE__, __LINE__), 0) )

/* "user assert".  if asserts, user did something wrong, not our code */
//#define uassert(_Expression) (void)( (!!(_Expression)) || (uasserted(#_Expression, __FILE__, __LINE__), 0) )
#define uassert(msg,_Expression) (void)( (!!(_Expression)) || (uasserted(msg), 0) )

#define xassert(_Expression) (void)( (!!(_Expression)) || (asserted(#_Expression, __FILE__, __LINE__), 0) )

#define yassert 1

/* warning only - keeps going */
#define wassert(_Expression) (void)( (!!(_Expression)) || (wasserted(#_Expression, __FILE__, __LINE__), 0) )

/* display a message, no context, and throw assertionexception

   easy way to throw an exception and log something without our stack trace 
   display happening.
*/
#define massert(msg,_Expression) (void)( (!!(_Expression)) || (msgasserted(msg), 0) )

/* dassert is 'debug assert' -- might want to turn off for production as these 
   could be slow.
*/
#define dassert assert

#include <stdio.h>
#include <sstream>
#include <signal.h>

typedef char _TCHAR;

#include <iostream>
#include <fstream>
#include <map>
#include <vector>
#include <set>
//using namespace std;

#if !defined(_WIN32)
typedef int HANDLE;
inline void strcpy_s(char *dst, unsigned len, const char *src) { strcpy(dst, src); }
#else
typedef void *HANDLE;
#endif

//#if defined(CHAR)
//#error CHAR already defined?
//#endif

//#if defined(_WIN32_WINNT)
//typedef wchar_t CHAR;
//#else
// more to be done...linux unicode is 32 bit.
//typedef unsigned short CHAR; // 16 bit unicode
//#endif

#define null (0)

#include <vector>

// for debugging
typedef struct _Ints { int i[100]; } *Ints;
typedef struct _Chars { char c[200]; } *Chars;

typedef char CHARS[400];

typedef struct _OWS {
	int size;
	char type;
	char string[400];
} *OWS;

class Database;
extern Database *database;
extern const char *curNs;

/* for now, running on win32 means development not production -- 
   use this to log things just there.
*/
#if defined(_WIN32)
#define DEV if( 0 ) 
#define WIN if( 1 ) 
#else
#define DEV if( 0 ) 
#define WIN if( 0 ) 
#endif

#define DEBUGGING if( 0 ) 

extern unsigned occasion; 
extern unsigned once;

#define OCCASIONALLY if( ++occasion % 16 == 0 ) 
#define RARELY if( ++occasion % 128 == 0 ) 
#define ONCE if( ++once == 1 ) 

#if defined(_WIN32)
inline void our_debug_free(void *p) {
	unsigned *u = (unsigned *) p;
	u[0] = 0xEEEEEEEE;
	u[1] = 0xEEEEEEEE;
	free(p);
}
#define free our_debug_free
#endif

#define exit dbexit

#undef yassert
#include <boost/filesystem/convenience.hpp>
#include <boost/filesystem/operations.hpp>
#undef assert
#define assert xassert
#define yassert 1
using namespace boost::filesystem;          

#include "util/goodies.h"
#include "util/log.h"