r18031: Merge my replace fixes:
[samba.git] / source4 / lib / replace / replace.h
1 /* 
2    Unix SMB/CIFS implementation.
3
4    macros to go along with the lib/replace/ portability layer code
5
6    Copyright (C) Andrew Tridgell 2005
7    Copyright (C) Jelmer Vernooij 2006
8
9      ** NOTE! The following LGPL license applies to the replace
10      ** library. This does NOT imply that all of Samba is released
11      ** under the LGPL
12    
13    This library is free software; you can redistribute it and/or
14    modify it under the terms of the GNU Lesser General Public
15    License as published by the Free Software Foundation; either
16    version 2 of the License, or (at your option) any later version.
17
18    This library is distributed in the hope that it will be useful,
19    but WITHOUT ANY WARRANTY; without even the implied warranty of
20    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21    Lesser General Public License for more details.
22
23    You should have received a copy of the GNU Lesser General Public
24    License along with this library; if not, write to the Free Software
25    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
26 */
27
28 #ifndef _replace_h
29 #define _replace_h
30
31 #ifdef _SAMBA_BUILD_
32 #include "config.h"
33 #else
34 #include "replace_config.h"
35 #endif /* _SAMBA_BUILD_ */
36
37 #include <stdlib.h>
38 #include <stdarg.h>
39
40 #if defined(_MSC_VER) || defined(__MINGW32__)
41 #include "lib/replace/win32/replace.h"
42 #endif
43
44 #ifdef __COMPAR_FN_T
45 #define QSORT_CAST (__compar_fn_t)
46 #endif
47
48 #ifndef QSORT_CAST
49 #define QSORT_CAST (int (*)(const void *, const void *))
50 #endif
51
52 #ifdef HAVE_STDINT_H
53 #include <stdint.h>
54 #endif
55
56 #ifdef HAVE_INTTYPES_H
57 #include <inttypes.h>
58 #endif
59
60 #ifndef HAVE_STRERROR
61 extern char *sys_errlist[];
62 #define strerror(i) sys_errlist[i]
63 #endif
64
65 #ifndef HAVE_ERRNO_DECL
66 extern int errno;
67 #endif
68
69 #ifndef HAVE_STRDUP
70 #define strdup rep_strdup
71 char *rep_strdup(const char *s);
72 #endif
73
74 #ifndef HAVE_MEMMOVE
75 #define memmove rep_memmove
76 void *rep_memmove(void *dest,const void *src,int size);
77 #endif
78
79 #ifndef HAVE_MKTIME
80 #define mktime rep_mktime
81 time_t rep_mktime(struct tm *t);
82 #endif
83
84 #ifndef HAVE_STRLCPY
85 #define strlcpy rep_strlcpy
86 size_t rep_strlcpy(char *d, const char *s, size_t bufsize);
87 #endif
88
89 #ifndef HAVE_STRLCAT
90 #define strlcat rep_strlcat
91 size_t rep_strlcat(char *d, const char *s, size_t bufsize);
92 #endif
93
94 #ifndef HAVE_STRNDUP
95 #define strndup rep_strndup
96 char *rep_strndup(const char *s, size_t n);
97 #endif
98
99 #ifndef HAVE_STRNLEN
100 #define strnlen rep_strnlen
101 size_t rep_strnlen(const char *s, size_t n);
102 #endif
103
104 #ifndef HAVE_SETENV
105 #define setenv rep_setenv
106 int rep_setenv(const char *name, const char *value, int overwrite); 
107 #endif
108
109 #ifndef HAVE_RENAME
110 #define rename rep_rename
111 int rep_rename(const char *zfrom, const char *zto);
112 #endif
113
114 #ifndef HAVE_STRCASESTR
115 #define strcasestr rep_strcasestr
116 char *rep_strcasestr(const char *haystack, const char *needle);
117 #endif
118
119 #ifndef HAVE_STRTOK_R
120 #define strtok_r rep_strtok_r 
121 char *rep_strtok_r(char *s, const char *delim, char **save_ptr);
122 #endif
123
124 #ifndef HAVE_STRTOLL
125 #define strtoll rep_strtoll
126 long long int rep_strtoll(const char *str, char **endptr, int base);
127 #endif
128
129 #ifndef HAVE_STRTOULL
130 #define strtoull rep_strtoull
131 unsigned long long int rep_strtoull(const char *str, char **endptr, int base);
132 #endif
133
134 #ifndef HAVE_FTRUNCATE
135 #define ftruncate rep_ftruncate
136 int rep_ftruncate(int f,long l);
137 #endif
138
139 #ifndef HAVE_VASPRINTF_DECL
140 #define vasprintf rep_vasprintf
141 int rep_vasprintf(char **ptr, const char *format, va_list ap);
142 #endif
143
144 #if !defined(HAVE_BZERO) && defined(HAVE_MEMSET)
145 #define bzero(a,b) memset((a),'\0',(b))
146 #endif
147
148 #ifndef HAVE_TIMEGM
149 struct tm;
150 #define timegm rep_timegm
151 time_t rep_timegm(struct tm *tm);
152 #endif
153
154 #ifndef PRINTF_ATTRIBUTE
155 #if __GNUC__ >= 3
156 /** Use gcc attribute to check printf fns.  a1 is the 1-based index of
157  * the parameter containing the format, and a2 the index of the first
158  * argument. Note that some gcc 2.x versions don't handle this
159  * properly **/
160 #define PRINTF_ATTRIBUTE(a1, a2) __attribute__ ((format (__printf__, a1, a2)))
161 #else
162 #define PRINTF_ATTRIBUTE(a1, a2)
163 #endif
164 #endif
165
166 /* add varargs prototypes with printf checking */
167 #ifndef HAVE_SNPRINTF_DECL
168 #define snprintf rep_snprintf
169 int rep_snprintf(char *,size_t ,const char *, ...) PRINTF_ATTRIBUTE(3,4);
170 #endif
171 #ifndef HAVE_ASPRINTF_DECL
172 #define asprintf rep_asprintf
173 int rep_asprintf(char **,const char *, ...) PRINTF_ATTRIBUTE(2,3);
174 #endif
175
176
177 /* we used to use these fns, but now we have good replacements
178    for snprintf and vsnprintf */
179 #define slprintf snprintf
180
181
182 #ifndef HAVE_VA_COPY
183 #ifdef HAVE___VA_COPY
184 #define va_copy(dest, src) __va_copy(dest, src)
185 #else
186 #define va_copy(dest, src) (dest) = (src)
187 #endif
188 #endif
189
190 #ifndef HAVE_VOLATILE
191 #define volatile
192 #endif
193
194 #ifndef HAVE_COMPARISON_FN_T
195 typedef int (*comparison_fn_t)(const void *, const void *);
196 #endif
197
198 /* Load header file for dynamic linking stuff */
199 #ifdef HAVE_DLFCN_H
200 #include <dlfcn.h>
201 #endif
202
203 #ifndef RTLD_LAZY
204 #define RTLD_LAZY 0
205 #endif
206
207 #ifndef HAVE_SECURE_MKSTEMP
208 #define mkstemp(path) rep_mkstemp(path)
209 int rep_mkstemp(char *temp);
210 #endif
211
212 #ifndef HAVE_MKDTEMP
213 #define mkdtemp rep_mkdtemp
214 char *rep_mkdtemp(char *template);
215 #endif
216
217 #ifdef HAVE_LIMITS_H
218 #include <limits.h>
219 #endif
220
221 /* The extra casts work around common compiler bugs.  */
222 #define _TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
223 /* The outer cast is needed to work around a bug in Cray C 5.0.3.0.
224    It is necessary at least when t == time_t.  */
225 #define _TYPE_MINIMUM(t) ((t) (_TYPE_SIGNED (t) \
226                               ? ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1) : (t) 0))
227 #define _TYPE_MAXIMUM(t) ((t) (~ (t) 0 - _TYPE_MINIMUM (t)))
228
229 #ifndef HOST_NAME_MAX
230 #define HOST_NAME_MAX 64
231 #endif
232
233 #ifndef UINT16_MAX
234 #define UINT16_MAX 65535
235 #endif
236
237 #ifndef UINT32_MAX
238 #define UINT32_MAX (4294967295U)
239 #endif
240
241 #ifndef UINT64_MAX
242 #define UINT64_MAX ((uint64_t)-1)
243 #endif
244
245 #ifndef CHAR_BIT
246 #define CHAR_BIT 8
247 #endif
248
249 #ifndef INT32_MAX
250 #define INT32_MAX _TYPE_MAXIMUM(int32_t)
251 #endif
252
253 #ifdef HAVE_STDBOOL_H
254 #include <stdbool.h>
255 #endif
256
257 #ifndef HAVE_BOOL
258 #define __bool_true_false_are_defined
259 typedef int bool;
260 #define false (0)
261 #define true (1)
262 #endif
263
264 #ifndef HAVE_FUNCTION_MACRO
265 #ifdef HAVE_func_MACRO
266 #define __FUNCTION__ __func__
267 #else
268 #define __FUNCTION__ ("")
269 #endif
270 #endif
271
272 #ifdef HAVE_SYS_PARAM_H
273 #include <sys/param.h>
274 #endif
275
276 #ifndef MIN
277 #define MIN(a,b) ((a)<(b)?(a):(b))
278 #endif
279
280 #ifndef MAX
281 #define MAX(a,b) ((a)>(b)?(a):(b))
282 #endif
283
284 #ifndef __STRING
285 #define __STRING(x)    #x
286 #endif
287
288
289
290 #endif