Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100644 567 lines (482 sloc) 14.095 kb
4050c0d Clean up compatibility definitions.
Junio C Hamano authored
1 #ifndef GIT_COMPAT_UTIL_H
2 #define GIT_COMPAT_UTIL_H
3
b97e911 @tali Support for large files on 32bit systems.
tali authored
4 #define _FILE_OFFSET_BITS 64
5
8f1d2e6 [PATCH] Compilation: zero-length array declaration.
Junio C Hamano authored
6 #ifndef FLEX_ARRAY
8e97399 @gitster git-compat-util.h: auto-adjust to compiler support of FLEX_ARRAY a bi…
gitster authored
7 /*
8 * See if our compiler is known to support flexible array members.
9 */
203ee91 @drafnel git-compat-util.h: avoid using c99 flex array feature with Sun compil…
drafnel authored
10 #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && (!defined(__SUNPRO_C) || (__SUNPRO_C > 0x580))
8e97399 @gitster git-compat-util.h: auto-adjust to compiler support of FLEX_ARRAY a bi…
gitster authored
11 # define FLEX_ARRAY /* empty */
12 #elif defined(__GNUC__)
13 # if (__GNUC__ >= 3)
14 # define FLEX_ARRAY /* empty */
15 # else
16 # define FLEX_ARRAY 0 /* older GNU extension */
17 # endif
18 #endif
19
20 /*
21 * Otherwise, default to safer but a bit wasteful traditional style
22 */
23 #ifndef FLEX_ARRAY
24 # define FLEX_ARRAY 1
8f1d2e6 [PATCH] Compilation: zero-length array declaration.
Junio C Hamano authored
25 #endif
26 #endif
27
b4f2a6a Use #define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
Junio C Hamano authored
28 #define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
f630cfd @MadCoder refactor: use bitsizeof() instead of 8 * sizeof()
MadCoder authored
29 #define bitsizeof(x) (CHAR_BIT * sizeof(x))
b4f2a6a Use #define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
Junio C Hamano authored
30
c03c831 @kusma do not depend on signed integer overflow
kusma authored
31 #define maximum_signed_value_of_type(a) \
32 (INTMAX_MAX >> (bitsizeof(intmax_t) - bitsizeof(a)))
33
1368f65 @jrn compat: helper for detecting unsigned overflow
jrn authored
34 #define maximum_unsigned_value_of_type(a) \
35 (UINTMAX_MAX >> (bitsizeof(uintmax_t) - bitsizeof(a)))
36
c03c831 @kusma do not depend on signed integer overflow
kusma authored
37 /*
38 * Signed integer overflow is undefined in C, so here's a helper macro
39 * to detect if the sum of two integers will overflow.
40 *
41 * Requires: a >= 0, typeof(a) equals typeof(b)
42 */
43 #define signed_add_overflows(a, b) \
44 ((b) > maximum_signed_value_of_type(a) - (a))
45
1368f65 @jrn compat: helper for detecting unsigned overflow
jrn authored
46 #define unsigned_add_overflows(a, b) \
47 ((b) > maximum_unsigned_value_of_type(a) - (a))
48
8723f21 make overflow test on delta base offset work regardless of variable size
Nicolas Pitre authored
49 #ifdef __GNUC__
50 #define TYPEOF(x) (__typeof__(x))
51 #else
52 #define TYPEOF(x)
53 #endif
54
f630cfd @MadCoder refactor: use bitsizeof() instead of 8 * sizeof()
MadCoder authored
55 #define MSB(x, bits) ((x) & TYPEOF(x)(~0ULL << (bitsizeof(x) - (bits))))
db7244b @MadCoder parse-options new features.
MadCoder authored
56 #define HAS_MULTI_BITS(i) ((i) & ((i) - 1)) /* checks if an integer has more than 1 bit set */
8723f21 make overflow test on delta base offset work regardless of variable size
Nicolas Pitre authored
57
98cb6f3 @MadCoder janitor: add DIV_ROUND_UP and use it.
MadCoder authored
58 #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
59
cf606e3 @awhitcroft git name-rev writes beyond the end of malloc() with large generations
awhitcroft authored
60 /* Approximation of the length of the decimal representation of this type. */
61 #define decimal_length(x) ((int)(sizeof(x) * 2.56 + 0.5) + 1)
62
4cb18a4 @drafnel git-compat-util.h: tweak the way _XOPEN_SOURCE is set on Solaris
drafnel authored
63 #if defined(__sun__)
64 /*
65 * On Solaris, when _XOPEN_EXTENDED is set, its header file
66 * forces the programs to be XPG4v2, defeating any _XOPEN_SOURCE
67 * setting to say we are XPG5 or XPG6. Also on Solaris,
68 * XPG6 programs must be compiled with a c99 compiler, while
69 * non XPG6 programs must be compiled with a pre-c99 compiler.
70 */
71 # if __STDC_VERSION__ - 0 >= 199901L
72 # define _XOPEN_SOURCE 600
73 # else
74 # define _XOPEN_SOURCE 500
75 # endif
6555b19 Fix _XOPEN_SOURCE problem on DragonFly
YONETANI Tomokazu authored
76 #elif !defined(__APPLE__) && !defined(__FreeBSD__) && !defined(__USLC__) && \
761a889 git-compat-util.h: use apparently more common __sgi macro to detect S…
Gary V. Vaughan authored
77 !defined(_M_UNIX) && !defined(__sgi) && !defined(__DragonFly__)
8502357 simplify inclusion of system header files.
Junio C Hamano authored
78 #define _XOPEN_SOURCE 600 /* glibc2 and AIX 5.3L need 500, OpenBSD needs 600 for S_ISLNK() */
79 #define _XOPEN_SOURCE_EXTENDED 1 /* AIX 5.3L needs this */
c902c9a Fix system header problems on Mac OS X
Terje Sten Bjerkseth authored
80 #endif
fb95220 Set _ALL_SOURCE for AIX, but avoid its struct list.
Jason Riedy authored
81 #define _ALL_SOURCE 1
82 #define _GNU_SOURCE 1
83 #define _BSD_SOURCE 1
9a695fb @prlw1 NetBSD compilation fix
prlw1 authored
84 #define _NETBSD_SOURCE 1
9398b85 git-compat-util.h: adjust for SGI IRIX 6.5
Brandon Casey authored
85 #define _SGI_SOURCE 1
8502357 simplify inclusion of system header files.
Junio C Hamano authored
86
435bdf8 @mstormo Make usage of windows.h lean and mean
mstormo authored
87 #ifdef WIN32 /* Both MinGW and MSVC */
88 #define WIN32_LEAN_AND_MEAN /* stops windows.h including winsock.h */
89 #include <winsock2.h>
90 #include <windows.h>
91 #endif
92
4050c0d Clean up compatibility definitions.
Junio C Hamano authored
93 #include <unistd.h>
94 #include <stdio.h>
95 #include <sys/stat.h>
96 #include <fcntl.h>
97 #include <stddef.h>
98 #include <stdlib.h>
99 #include <stdarg.h>
100 #include <string.h>
101 #include <errno.h>
102 #include <limits.h>
103 #include <sys/param.h>
104 #include <sys/types.h>
105 #include <dirent.h>
8502357 simplify inclusion of system header files.
Junio C Hamano authored
106 #include <sys/time.h>
107 #include <time.h>
108 #include <signal.h>
109 #include <fnmatch.h>
f4626df Add target architecture MinGW.
Johannes Sixt authored
110 #include <assert.h>
111 #include <regex.h>
112 #include <utime.h>
088d880 @dotzen mingw: implement syslog
dotzen authored
113 #include <syslog.h>
2844923 add support for the SUA layer (interix; windows)
Markus Duft authored
114 #ifndef NO_SYS_POLL_H
fdc1211 @kusma mingw: use poll-emulation from gnulib
kusma authored
115 #include <sys/poll.h>
2844923 add support for the SUA layer (interix; windows)
Markus Duft authored
116 #else
117 #include <poll.h>
118 #endif
f4626df Add target architecture MinGW.
Johannes Sixt authored
119 #ifndef __MINGW32__
120 #include <sys/wait.h>
8502357 simplify inclusion of system header files.
Junio C Hamano authored
121 #include <sys/socket.h>
80bbe72 Move #include <sys/select.h> and <sys/ioctl.h> to git-compat-util.h.
Johannes Sixt authored
122 #include <sys/ioctl.h>
eb80042 @pclouds Add missing #include to support TIOCGWINSZ on Solaris
pclouds authored
123 #include <termios.h>
2600973 @schiele pre-POSIX.1-2001 systems do not have <sys/select.h>
schiele authored
124 #ifndef NO_SYS_SELECT_H
80bbe72 Move #include <sys/select.h> and <sys/ioctl.h> to git-compat-util.h.
Johannes Sixt authored
125 #include <sys/select.h>
2600973 @schiele pre-POSIX.1-2001 systems do not have <sys/select.h>
schiele authored
126 #endif
8502357 simplify inclusion of system header files.
Junio C Hamano authored
127 #include <netinet/in.h>
128 #include <netinet/tcp.h>
129 #include <arpa/inet.h>
130 #include <netdb.h>
131 #include <pwd.h>
2844923 add support for the SUA layer (interix; windows)
Markus Duft authored
132 #ifndef NO_INTTYPES_H
007e2ba Use inttypes.h rather than stdint.h.
Jason Riedy authored
133 #include <inttypes.h>
2844923 add support for the SUA layer (interix; windows)
Markus Duft authored
134 #else
135 #include <stdint.h>
136 #endif
41b2001 Fix an "implicit function definition" warning.
Ramsay Jones authored
137 #if defined(__CYGWIN__)
138 #undef _XOPEN_SOURCE
139 #include <grp.h>
140 #define _XOPEN_SOURCE 600
adbc0b6 @dmpot cygwin: Use native Win32 API for stat
dmpot authored
141 #include "compat/cygwin.h"
41b2001 Fix an "implicit function definition" warning.
Ramsay Jones authored
142 #else
fb95220 Set _ALL_SOURCE for AIX, but avoid its struct list.
Jason Riedy authored
143 #undef _ALL_SOURCE /* AIX 5.3L defines a struct list with _ALL_SOURCE. */
8502357 simplify inclusion of system header files.
Junio C Hamano authored
144 #include <grp.h>
fb95220 Set _ALL_SOURCE for AIX, but avoid its struct list.
Jason Riedy authored
145 #define _ALL_SOURCE 1
41b2001 Fix an "implicit function definition" warning.
Ramsay Jones authored
146 #endif
f4626df Add target architecture MinGW.
Johannes Sixt authored
147 #else /* __MINGW32__ */
148 /* pull in Windows compatibility stuff */
149 #include "compat/mingw.h"
150 #endif /* __MINGW32__ */
d75f8e6 @lznuaa Add platform files for porting to MSVC
lznuaa authored
151 #ifdef _MSC_VER
152 #include "compat/msvc.h"
153 #endif
8502357 simplify inclusion of system header files.
Junio C Hamano authored
154
e1c0688 @davvid compat: add a basename() compatibility function
davvid authored
155 #ifndef NO_LIBGEN_H
156 #include <libgen.h>
157 #else
158 #define basename gitbasename
159 extern char *gitbasename(char *);
160 #endif
161
8502357 simplify inclusion of system header files.
Junio C Hamano authored
162 #ifndef NO_ICONV
163 #include <iconv.h>
164 #endif
4050c0d Clean up compatibility definitions.
Junio C Hamano authored
165
684ec6c git-imap-send: Support SSL
Robert Shearman authored
166 #ifndef NO_OPENSSL
167 #include <openssl/ssl.h>
168 #include <openssl/err.h>
169 #endif
170
d0c2449 Define fallback PATH_MAX on systems that do not define one in <limits.h>
Junio C Hamano authored
171 /* On most systems <limits.h> would have given us this, but
172 * not on some systems (e.g. GNU/Hurd).
173 */
174 #ifndef PATH_MAX
175 #define PATH_MAX 4096
176 #endif
177
c4001d9 @spearce Use off_t when we really mean a file offset.
spearce authored
178 #ifndef PRIuMAX
179 #define PRIuMAX "llu"
180 #endif
181
607bb3f Provide fallback definitions of PRIu32 and PRIx32
Johannes Sixt authored
182 #ifndef PRIu32
183 #define PRIu32 "u"
184 #endif
185
186 #ifndef PRIx32
187 #define PRIx32 "x"
188 #endif
189
5418d96 vcs-svn: Fix some printf format compiler warnings
Ramsay Jones authored
190 #ifndef PRIo32
191 #define PRIo32 "o"
192 #endif
193
80ba074 Windows: Use the Windows style PATH separator ';'.
Johannes Sixt authored
194 #ifndef PATH_SEP
195 #define PATH_SEP ':'
196 #endif
197
cb6a22c @arachsys exec_cmd.c: replace hard-coded path list with one from <paths.h>
arachsys authored
198 #ifdef HAVE_PATHS_H
199 #include <paths.h>
200 #endif
201 #ifndef _PATH_DEFPATH
202 #define _PATH_DEFPATH "/usr/local/bin:/usr/bin:/bin"
203 #endif
204
23326d1 Windows: Strip ".exe" from the program name.
Johannes Sixt authored
205 #ifndef STRIP_EXTENSION
206 #define STRIP_EXTENSION ""
207 #endif
208
25fe217 Windows: Treat Windows style path names.
Johannes Sixt authored
209 #ifndef has_dos_drive_prefix
210 #define has_dos_drive_prefix(path) 0
211 #endif
212
213 #ifndef is_dir_sep
214 #define is_dir_sep(c) ((c) == '/')
215 #endif
216
4050c0d Clean up compatibility definitions.
Junio C Hamano authored
217 #ifdef __GNUC__
218 #define NORETURN __attribute__((__noreturn__))
18660bc @kusma add NORETURN_PTR for function pointers
kusma authored
219 #define NORETURN_PTR __attribute__((__noreturn__))
aba7dea msvc: Add a definition of NORETURN compatible with msvc compiler
Ramsay Jones authored
220 #elif defined(_MSC_VER)
221 #define NORETURN __declspec(noreturn)
222 #define NORETURN_PTR
4050c0d Clean up compatibility definitions.
Junio C Hamano authored
223 #else
224 #define NORETURN
18660bc @kusma add NORETURN_PTR for function pointers
kusma authored
225 #define NORETURN_PTR
4050c0d Clean up compatibility definitions.
Junio C Hamano authored
226 #ifndef __attribute__
227 #define __attribute__(x)
228 #endif
229 #endif
230
51ea551 make sure byte swapping is optimal for git
Nicolas Pitre authored
231 #include "compat/bswap.h"
232
4050c0d Clean up compatibility definitions.
Junio C Hamano authored
233 /* General helper functions */
ebaa79f Make report() from usage.c public as vreportf() and use it.
Johannes Sixt authored
234 extern void vreportf(const char *prefix, const char *err, va_list params);
a4f3131 @kusma increase portability of NORETURN declarations
kusma authored
235 extern NORETURN void usage(const char *err);
64b1cb7 @jrn Introduce usagef() that takes a printf-style format
jrn authored
236 extern NORETURN void usagef(const char *err, ...) __attribute__((format (printf, 1, 2)));
a4f3131 @kusma increase portability of NORETURN declarations
kusma authored
237 extern NORETURN void die(const char *err, ...) __attribute__((format (printf, 1, 2)));
238 extern NORETURN void die_errno(const char *err, ...) __attribute__((format (printf, 1, 2)));
4050c0d Clean up compatibility definitions.
Junio C Hamano authored
239 extern int error(const char *err, ...) __attribute__((format (printf, 1, 2)));
46efd2d @tytso Rename warn() to warning() to fix symbol conflicts on BSD and Mac OS
tytso authored
240 extern void warning(const char *err, ...) __attribute__((format (printf, 1, 2)));
4050c0d Clean up compatibility definitions.
Junio C Hamano authored
241
18660bc @kusma add NORETURN_PTR for function pointers
kusma authored
242 extern void set_die_routine(NORETURN_PTR void (*routine)(const char *err, va_list params));
39a3f5e Customizable error handlers
Petr Baudis authored
243
698a68b @gitster Uninline prefixcmp()
gitster authored
244 extern int prefixcmp(const char *str, const char *prefix);
8cc5b29 @apenwarr git merge -X<option>
apenwarr authored
245 extern int suffixcmp(const char *str, const char *suffix);
698a68b @gitster Uninline prefixcmp()
gitster authored
246
fbca583 Move parse-options's skip_prefix() to git-compat-util.h
Miklos Vajna authored
247 static inline const char *skip_prefix(const char *str, const char *prefix)
248 {
249 size_t len = strlen(prefix);
250 return strncmp(str, prefix, len) ? NULL : str + len;
251 }
252
b130a72 @sothis MinGW: implement mmap
sothis authored
253 #if defined(NO_MMAP) || defined(USE_WIN32_MMAP)
4050c0d Clean up compatibility definitions.
Junio C Hamano authored
254
255 #ifndef PROT_READ
256 #define PROT_READ 1
257 #define PROT_WRITE 2
258 #define MAP_PRIVATE 1
259 #endif
260
d677912 @spearce Rename gitfakemmap to git_mmap.
spearce authored
261 #define mmap git_mmap
262 #define munmap git_munmap
263 extern void *git_mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);
264 extern int git_munmap(void *start, size_t length);
4050c0d Clean up compatibility definitions.
Junio C Hamano authored
265
b130a72 @sothis MinGW: implement mmap
sothis authored
266 #else /* NO_MMAP || USE_WIN32_MMAP */
267
268 #include <sys/mman.h>
269
270 #endif /* NO_MMAP || USE_WIN32_MMAP */
271
272 #ifdef NO_MMAP
273
5faaf24 Make sure packedgitwindowsize is multiple of (pagesize * 2)
Junio C Hamano authored
274 /* This value must be multiple of (pagesize * 2) */
8c82534 @spearce Default core.packdGitWindowSize to 1 MiB if NO_MMAP.
spearce authored
275 #define DEFAULT_PACKED_GIT_WINDOW_SIZE (1 * 1024 * 1024)
276
4050c0d Clean up compatibility definitions.
Junio C Hamano authored
277 #else /* NO_MMAP */
278
5faaf24 Make sure packedgitwindowsize is multiple of (pagesize * 2)
Junio C Hamano authored
279 /* This value must be multiple of (pagesize * 2) */
22bac0e @spearce Increase packedGit{Limit,WindowSize} on 64 bit systems.
spearce authored
280 #define DEFAULT_PACKED_GIT_WINDOW_SIZE \
281 (sizeof(void*) >= 8 \
282 ? 1 * 1024 * 1024 * 1024 \
283 : 32 * 1024 * 1024)
4050c0d Clean up compatibility definitions.
Junio C Hamano authored
284
285 #endif /* NO_MMAP */
286
fcf3a21 git-compat-util.h: some platforms with mmap() lack MAP_FAILED definition
Gary V. Vaughan authored
287 #ifndef MAP_FAILED
288 #define MAP_FAILED ((void *)-1)
289 #endif
290
fdb2a2a @gitster compat: introduce on_disk_bytes()
gitster authored
291 #ifdef NO_ST_BLOCKS_IN_STRUCT_STAT
292 #define on_disk_bytes(st) ((st).st_size)
293 #else
294 #define on_disk_bytes(st) ((st).st_blocks * 512)
295 #endif
296
22bac0e @spearce Increase packedGit{Limit,WindowSize} on 64 bit systems.
spearce authored
297 #define DEFAULT_PACKED_GIT_LIMIT \
ecaebf4 Spell default packedgitlimit slightly differently
Junio C Hamano authored
298 ((1024L * 1024L) * (sizeof(void*) >= 8 ? 8192 : 256))
8c82534 @spearce Default core.packdGitWindowSize to 1 MiB if NO_MMAP.
spearce authored
299
6900679 Replacing the system call pread() with lseek()/xread()/lseek() sequence.
Stefan-W. Hahn authored
300 #ifdef NO_PREAD
301 #define pread git_pread
302 extern ssize_t git_pread(int fd, void *buf, size_t count, off_t offset);
303 #endif
14086b0 @sprohaska compat/pread.c: Add a forward declaration to fix a warning
sprohaska authored
304 /*
305 * Forward decl that will remind us if its twin in cache.h changes.
306 * This function is used in compat/pread.c. But we can't include
307 * cache.h there.
308 */
309 extern ssize_t read_in_full(int fd, void *buf, size_t count);
6900679 Replacing the system call pread() with lseek()/xread()/lseek() sequence.
Stefan-W. Hahn authored
310
4050c0d Clean up compatibility definitions.
Junio C Hamano authored
311 #ifdef NO_SETENV
312 #define setenv gitsetenv
313 extern int gitsetenv(const char *, const char *, int);
314 #endif
315
ca5bb5d @spearce Define compat version of mkdtemp for systems lacking it
spearce authored
316 #ifdef NO_MKDTEMP
317 #define mkdtemp gitmkdtemp
318 extern char *gitmkdtemp(char *);
319 #endif
320
0620b39 @davvid compat: add a mkstemps() compatibility function
davvid authored
321 #ifdef NO_MKSTEMPS
322 #define mkstemps gitmkstemps
323 extern int gitmkstemps(char *, int);
324 #endif
325
731043f Add compat/unsetenv.c .
Jason Riedy authored
326 #ifdef NO_UNSETENV
327 #define unsetenv gitunsetenv
328 extern void gitunsetenv(const char *);
329 #endif
330
4050c0d Clean up compatibility definitions.
Junio C Hamano authored
331 #ifdef NO_STRCASESTR
332 #define strcasestr gitstrcasestr
333 extern char *gitstrcasestr(const char *haystack, const char *needle);
334 #endif
335
817151e Rename safe_strncpy() to strlcpy().
Peter Eriksen authored
336 #ifdef NO_STRLCPY
337 #define strlcpy gitstrlcpy
338 extern size_t gitstrlcpy(char *, const char *, size_t);
339 #endif
340
bc6b4f5 Add a compat/strtoumax.c for Solaris 8.
Jason Riedy authored
341 #ifdef NO_STRTOUMAX
342 #define strtoumax gitstrtoumax
343 extern uintmax_t gitstrtoumax(const char *, char **, int);
344 #endif
345
78457bc @jrn compat: add strtok_r()
jrn authored
346 #ifdef NO_STRTOK_R
347 #define strtok_r gitstrtok_r
348 extern char *gitstrtok_r(char *s, const char *delim, char **save_ptr);
349 #endif
350
fa0c87c @raalkml Add a local implementation of hstrerror for the system which do not h…
raalkml authored
351 #ifdef NO_HSTRERROR
352 #define hstrerror githstrerror
353 extern const char *githstrerror(int herror);
354 #endif
355
b21b9f1 add memmem()
René Scharfe authored
356 #ifdef NO_MEMMEM
357 #define memmem gitmemmem
358 void *gitmemmem(const void *haystack, size_t haystacklen,
359 const void *needle, size_t needlelen);
360 #endif
361
cba2252 Add compat/fopen.c which returns NULL on attempt to open directory
Brandon Casey authored
362 #ifdef FREAD_READS_DIRECTORIES
c5445fe compat-util: avoid macro redefinition warning
Johannes Sixt authored
363 #ifdef fopen
364 #undef fopen
365 #endif
cba2252 Add compat/fopen.c which returns NULL on attempt to open directory
Brandon Casey authored
366 #define fopen(a,b) git_fopen(a,b)
367 extern FILE *git_fopen(const char*, const char*);
368 #endif
369
c4582f9 Add compat/snprintf.c for systems that return bogus
Michal Rokos authored
370 #ifdef SNPRINTF_RETURNS_BOGUS
371 #define snprintf git_snprintf
372 extern int git_snprintf(char *str, size_t maxsize,
373 const char *format, ...);
374 #define vsnprintf git_vsnprintf
375 extern int git_vsnprintf(char *str, size_t maxsize,
376 const char *format, va_list ap);
377 #endif
378
726c8ef Fix preprocessor logic that determines the availablity of strchrnul().
Johannes Sixt authored
379 #ifdef __GLIBC_PREREQ
380 #if __GLIBC_PREREQ(2, 1)
381 #define HAVE_STRCHRNUL
137c6ea @jrn compat: add mempcpy()
jrn authored
382 #define HAVE_MEMPCPY
726c8ef Fix preprocessor logic that determines the availablity of strchrnul().
Johannes Sixt authored
383 #endif
384 #endif
385
386 #ifndef HAVE_STRCHRNUL
659c69c Add strchrnul()
René Scharfe authored
387 #define strchrnul gitstrchrnul
9e79f00 @ageric Simplify strchrnul() compat code
ageric authored
388 static inline char *gitstrchrnul(const char *s, int c)
389 {
390 while (*s && *s != c)
391 s++;
392 return (char *)s;
393 }
659c69c Add strchrnul()
René Scharfe authored
394 #endif
395
137c6ea @jrn compat: add mempcpy()
jrn authored
396 #ifndef HAVE_MEMPCPY
397 #define mempcpy gitmempcpy
398 static inline void *gitmempcpy(void *dest, const void *src, size_t n)
399 {
400 return (char *)memcpy(dest, src, n) + n;
401 }
402 #endif
403
da523cc @dotzen compat: add inet_pton and inet_ntop prototypes
dotzen authored
404 #ifdef NO_INET_PTON
405 int inet_pton(int af, const char *src, void *dst);
406 #endif
407
408 #ifdef NO_INET_NTOP
409 const char *inet_ntop(int af, const void *src, char *dst, size_t size);
410 #endif
411
d1efefa @spearce Actually handle some-low memory conditions
spearce authored
412 extern void release_pack_memory(size_t, int);
97bfeb3 @spearce Release pack windows before reporting out of memory.
spearce authored
413
851c34b Have set_try_to_free_routine return the previous routine
Johannes Sixt authored
414 typedef void (*try_to_free_t)(size_t);
415 extern try_to_free_t set_try_to_free_routine(try_to_free_t);
a9a7463 @npitre Make xmalloc and xrealloc thread-safe
npitre authored
416
112db55 @torvalds Shrink the git binary a bit by avoiding unnecessary inline functions
torvalds authored
417 extern char *xstrdup(const char *str);
418 extern void *xmalloc(size_t size);
5bf9219 Add xmallocz()
Ilari Liusvaara authored
419 extern void *xmallocz(size_t size);
112db55 @torvalds Shrink the git binary a bit by avoiding unnecessary inline functions
torvalds authored
420 extern void *xmemdupz(const void *data, size_t len);
421 extern char *xstrndup(const char *str, size_t len);
422 extern void *xrealloc(void *ptr, size_t size);
423 extern void *xcalloc(size_t nmemb, size_t size);
424 extern void *xmmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);
425 extern ssize_t xread(int fd, void *buf, size_t len);
426 extern ssize_t xwrite(int fd, const void *buf, size_t len);
427 extern int xdup(int fd);
428 extern FILE *xfdopen(int fd, const char *mode);
429 extern int xmkstemp(char *template);
463db9b @jrn wrapper: move odb_* to environment.c
jrn authored
430 extern int xmkstemp_mode(char *template, int mode);
6e180cd @gitster Make sure objects/pack exists before creating a new pack
gitster authored
431 extern int odb_mkstemp(char *template, size_t limit, const char *pattern);
432 extern int odb_pack_keep(char *name, size_t namesz, unsigned char *sha1);
f21a47b Introduces xmkstemp()
Luiz Fernando N. Capitulino authored
433
dc49cd7 @spearce Cast 64 bit off_t to 32 bit size_t
spearce authored
434 static inline size_t xsize_t(off_t len)
435 {
46be82d @trast xsize_t: check whether we lose bits
trast authored
436 if (len > (size_t) len)
437 die("Cannot handle files this big");
dc49cd7 @spearce Cast 64 bit off_t to 32 bit size_t
spearce authored
438 return (size_t)len;
439 }
440
5bb1cda drop length argument of has_extension
Rene Scharfe authored
441 static inline int has_extension(const char *filename, const char *ext)
83a2b84 Add has_extension()
Rene Scharfe authored
442 {
5bb1cda drop length argument of has_extension
Rene Scharfe authored
443 size_t len = strlen(filename);
444 size_t extlen = strlen(ext);
83a2b84 Add has_extension()
Rene Scharfe authored
445 return len > extlen && !memcmp(filename + len - extlen, ext, extlen);
446 }
447
4050c0d Clean up compatibility definitions.
Junio C Hamano authored
448 /* Sane ctype - no locale, and works with signed chars */
c2e9364 cleanup: add isascii()
René Scharfe authored
449 #undef isascii
4050c0d Clean up compatibility definitions.
Junio C Hamano authored
450 #undef isspace
451 #undef isdigit
452 #undef isalpha
453 #undef isalnum
454 #undef tolower
455 #undef toupper
456 extern unsigned char sane_ctype[256];
457 #define GIT_SPACE 0x01
458 #define GIT_DIGIT 0x02
459 #define GIT_ALPHA 0x04
8cc3299 Change NUL char handling of isspecial()
René Scharfe authored
460 #define GIT_GLOB_SPECIAL 0x08
f9b7cce Add is_regex_special()
René Scharfe authored
461 #define GIT_REGEX_SPECIAL 0x10
4050c0d Clean up compatibility definitions.
Junio C Hamano authored
462 #define sane_istest(x,mask) ((sane_ctype[(unsigned char)(x)] & (mask)) != 0)
c2e9364 cleanup: add isascii()
René Scharfe authored
463 #define isascii(x) (((x) & ~0x7f) == 0)
4050c0d Clean up compatibility definitions.
Junio C Hamano authored
464 #define isspace(x) sane_istest(x,GIT_SPACE)
465 #define isdigit(x) sane_istest(x,GIT_DIGIT)
466 #define isalpha(x) sane_istest(x,GIT_ALPHA)
467 #define isalnum(x) sane_istest(x,GIT_ALPHA | GIT_DIGIT)
8cc3299 Change NUL char handling of isspecial()
René Scharfe authored
468 #define is_glob_special(x) sane_istest(x,GIT_GLOB_SPECIAL)
f9b7cce Add is_regex_special()
René Scharfe authored
469 #define is_regex_special(x) sane_istest(x,GIT_GLOB_SPECIAL | GIT_REGEX_SPECIAL)
4050c0d Clean up compatibility definitions.
Junio C Hamano authored
470 #define tolower(x) sane_case((unsigned char)(x), 0x20)
471 #define toupper(x) sane_case((unsigned char)(x), 0)
472
473 static inline int sane_case(int x, int high)
474 {
475 if (sane_istest(x, GIT_ALPHA))
476 x = (x & ~0x20) | high;
477 return x;
478 }
479
6aead43 @meyering sscanf/strtoul: parse integers robustly
meyering authored
480 static inline int strtoul_ui(char const *s, int base, unsigned int *result)
481 {
482 unsigned long ul;
483 char *p;
484
485 errno = 0;
486 ul = strtoul(s, &p, base);
487 if (errno || *p || p == s || (unsigned int) ul != ul)
488 return -1;
489 *result = ul;
490 return 0;
491 }
492
7791ecb @gitster revert/cherry-pick: work on merge commits as well
gitster authored
493 static inline int strtol_i(char const *s, int base, int *result)
494 {
495 long ul;
496 char *p;
497
498 errno = 0;
499 ul = strtol(s, &p, base);
500 if (errno || *p || p == s || (int) ul != ul)
501 return -1;
502 *result = ul;
503 return 0;
504 }
505
43fe901 @bdowning compat: Add simplified merge sort implementation from glibc
bdowning authored
506 #ifdef INTERNAL_QSORT
507 void git_qsort(void *base, size_t nmemb, size_t size,
508 int(*compar)(const void *, const void *));
509 #define qsort git_qsort
510 #endif
511
81a24b5 @raalkml Do not use GUID on dir in git init --shared=all on FreeBSD
raalkml authored
512 #ifndef DIR_HAS_BSD_GROUP_SEMANTICS
513 # define FORCE_DIR_SET_GID S_ISGID
514 #else
515 # define FORCE_DIR_SET_GID 0
516 #endif
517
c06ff49 Record ns-timestamps if possible, but do not use it without USE_NSEC
Kjetil Barvik authored
518 #ifdef NO_NSEC
519 #undef USE_NSEC
520 #define ST_CTIME_NSEC(st) 0
521 #define ST_MTIME_NSEC(st) 0
522 #else
c567383 @Benabik Create USE_ST_TIMESPEC and turn it on for Darwin
Benabik authored
523 #ifdef USE_ST_TIMESPEC
524 #define ST_CTIME_NSEC(st) ((unsigned int)((st).st_ctimespec.tv_nsec))
525 #define ST_MTIME_NSEC(st) ((unsigned int)((st).st_mtimespec.tv_nsec))
526 #else
c06ff49 Record ns-timestamps if possible, but do not use it without USE_NSEC
Kjetil Barvik authored
527 #define ST_CTIME_NSEC(st) ((unsigned int)((st).st_ctim.tv_nsec))
528 #define ST_MTIME_NSEC(st) ((unsigned int)((st).st_mtim.tv_nsec))
529 #endif
c567383 @Benabik Create USE_ST_TIMESPEC and turn it on for Darwin
Benabik authored
530 #endif
c06ff49 Record ns-timestamps if possible, but do not use it without USE_NSEC
Kjetil Barvik authored
531
34779c5 Windows: Skip fstat/lstat optimization in write_entry()
Johannes Sixt authored
532 #ifdef UNRELIABLE_FSTAT
533 #define fstat_is_reliable() 0
534 #else
535 #define fstat_is_reliable() 1
536 #endif
537
ab8632a @peff compat: provide a fallback va_copy definition
peff authored
538 #ifndef va_copy
26db0f2 @jrn compat: fall back on __va_copy if available
jrn authored
539 /*
540 * Since an obvious implementation of va_list would be to make it a
541 * pointer into the stack frame, a simple assignment will work on
542 * many systems. But let's try to be more portable.
543 */
544 #ifdef __va_copy
545 #define va_copy(dst, src) __va_copy(dst, src)
546 #else
547 #define va_copy(dst, src) ((dst) = (src))
548 #endif
ab8632a @peff compat: provide a fallback va_copy definition
peff authored
549 #endif
550
fc71db3 @raalkml Introduce an unlink(2) wrapper which gives warning if unlink failed
raalkml authored
551 /*
552 * Preserves errno, prints a message, but gives no warning for ENOENT.
553 * Always returns the return value of unlink(2).
554 */
555 int unlink_or_warn(const char *path);
d172329 @pcc Implement the rmdir_or_warn function
pcc authored
556 /*
557 * Likewise for rmdir(2).
558 */
559 int rmdir_or_warn(const char *path);
80d706a @pcc Introduce remove_or_warn function
pcc authored
560 /*
561 * Calls the correct function out of {unlink,rmdir}_or_warn based on
562 * the supplied file mode.
563 */
564 int remove_or_warn(unsigned int mode, const char *path);
fc71db3 @raalkml Introduce an unlink(2) wrapper which gives warning if unlink failed
raalkml authored
565
4050c0d Clean up compatibility definitions.
Junio C Hamano authored
566 #endif
Something went wrong with that request. Please try again.