1e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#ifndef GIT_COMPAT_UTIL_H
2e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define GIT_COMPAT_UTIL_H
3e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
4e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* ANDROID_CHANGE_BEGIN */
5e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#ifndef __BIONIC__
6e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define _FILE_OFFSET_BITS 64
7e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif
8e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* ANDROID_CHANGE_END */
9e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
10e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#ifndef FLEX_ARRAY
11e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/*
12e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * See if our compiler is known to support flexible array members.
13e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */
14e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
15e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# define FLEX_ARRAY /* empty */
16e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#elif defined(__GNUC__)
17e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# if (__GNUC__ >= 3)
18e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#  define FLEX_ARRAY /* empty */
19e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# else
20e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#  define FLEX_ARRAY 0 /* older GNU extension */
21e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# endif
22e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif
23e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
24e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/*
25e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Otherwise, default to safer but a bit wasteful traditional style
26e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */
27e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#ifndef FLEX_ARRAY
28e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# define FLEX_ARRAY 1
29e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif
30e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif
31e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
32e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
33e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
34e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#ifdef __GNUC__
35e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define TYPEOF(x) (__typeof__(x))
36e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#else
37e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define TYPEOF(x)
38e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif
39e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
40e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define MSB(x, bits) ((x) & TYPEOF(x)(~0ULL << (sizeof(x) * 8 - (bits))))
41e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define HAS_MULTI_BITS(i)  ((i) & ((i) - 1))  /* checks if an integer has more than 1 bit set */
42e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
43e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* Approximation of the length of the decimal representation of this type. */
44e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define decimal_length(x)	((int)(sizeof(x) * 2.56 + 0.5) + 1)
45e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
46e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define _ALL_SOURCE 1
47e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define _GNU_SOURCE 1
48e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define _BSD_SOURCE 1
49e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define HAS_BOOL
50e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
51e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <unistd.h>
52e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <stdio.h>
53e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <sys/stat.h>
547d82a4640abdcc3ffbd89c7971a11e4ac7953b7fBen Cheng/* ANDROID_CHANGE_BEGIN */
557d82a4640abdcc3ffbd89c7971a11e4ac7953b7fBen Cheng#ifndef __APPLE__
56e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <sys/statfs.h>
577d82a4640abdcc3ffbd89c7971a11e4ac7953b7fBen Cheng#endif
587d82a4640abdcc3ffbd89c7971a11e4ac7953b7fBen Cheng/* ANDROID_CHANGE_END */
59e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <fcntl.h>
60e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <stdbool.h>
61e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <stddef.h>
62e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <stdlib.h>
63e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <stdarg.h>
64e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <string.h>
65e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <errno.h>
66e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <limits.h>
67e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <sys/param.h>
68e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <sys/types.h>
69e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* ANDROID_CHANGE_BEGIN */
70e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#ifdef __BIONIC__
71e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <pthread.h>
72e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif
73e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* ANDROID_CHANGE_END */
74e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <dirent.h>
75e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <sys/time.h>
76e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <time.h>
77e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <signal.h>
78e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <fnmatch.h>
79e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <assert.h>
80e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <regex.h>
81e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <utime.h>
82e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <sys/wait.h>
83e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <sys/poll.h>
84e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <sys/socket.h>
85e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <sys/ioctl.h>
86e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <sys/select.h>
87e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <netinet/in.h>
88e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <netinet/tcp.h>
89e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <arpa/inet.h>
90e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <netdb.h>
91e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <pwd.h>
92e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <inttypes.h>
93e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
94e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* ANDROID_CHANGE_BEGIN */
957d82a4640abdcc3ffbd89c7971a11e4ac7953b7fBen Cheng#ifndef __APPLE__
96e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <linux/magic.h>
97e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif
98e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* ANDROID_CHANGE_END */
99e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
100e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include "types.h"
101e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
102e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* ANDROID_CHANGE_BEGIN */
103e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#ifndef __BIONIC__
104e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <sys/ttydefaults.h>
105e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif
106e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* ANDROID_CHANGE_END */
107e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
108e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
109e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern const char *graph_line;
110e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern const char *graph_dotted_line;
111e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern char buildid_dir[];
112e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
113e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* On most systems <limits.h> would have given us this, but
114e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * not on some systems (e.g. GNU/Hurd).
115e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */
116e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#ifndef PATH_MAX
117e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define PATH_MAX 4096
118e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif
119e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
120e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#ifndef PRIuMAX
121e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define PRIuMAX "llu"
122e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif
123e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
124e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#ifndef PRIu32
125e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define PRIu32 "u"
126e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif
127e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
128e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#ifndef PRIx32
129e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define PRIx32 "x"
130e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif
131e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
132e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#ifndef PATH_SEP
133e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define PATH_SEP ':'
134e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif
135e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
136e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#ifndef STRIP_EXTENSION
137e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define STRIP_EXTENSION ""
138e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif
139e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
140e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#ifndef has_dos_drive_prefix
141e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define has_dos_drive_prefix(path) 0
142e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif
143e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
144e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#ifndef is_dir_sep
145e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define is_dir_sep(c) ((c) == '/')
146e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif
147e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
148e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#ifdef __GNUC__
149e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define NORETURN __attribute__((__noreturn__))
150e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#else
151e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define NORETURN
152e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#ifndef __attribute__
153e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define __attribute__(x)
154e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif
155e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif
156e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
157e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* General helper functions */
158e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern void usage(const char *err) NORETURN;
159e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern void die(const char *err, ...) NORETURN __attribute__((format (printf, 1, 2)));
160e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern int error(const char *err, ...) __attribute__((format (printf, 1, 2)));
161e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern void warning(const char *err, ...) __attribute__((format (printf, 1, 2)));
162e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
163e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* ANDROID_CHANGE_BEGIN */
164e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#if 0
165e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include "../../../include/linux/stringify.h"
166e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#else
167e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include "util/include/linux/added/stringify.h"
168e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif
169e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* ANDROID_CHANGE_END */
170e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
171e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define DIE_IF(cnd)	\
172e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	do { if (cnd)	\
173e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		die(" at (" __FILE__ ":" __stringify(__LINE__) "): "	\
174e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		    __stringify(cnd) "\n");				\
175e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	} while (0)
176e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
177e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
178e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern void set_die_routine(void (*routine)(const char *err, va_list params) NORETURN);
179e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
180e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern int prefixcmp(const char *str, const char *prefix);
181e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern void set_buildid_dir(void);
182e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern void disable_buildid_cache(void);
183e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
184e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline const char *skip_prefix(const char *str, const char *prefix)
185e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{
186e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	size_t len = strlen(prefix);
187e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	return strncmp(str, prefix, len) ? NULL : str + len;
188e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}
189e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
190e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#ifdef __GLIBC_PREREQ
191e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#if __GLIBC_PREREQ(2, 1)
192e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define HAVE_STRCHRNUL
193e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif
194e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif
195e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
196e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#ifndef HAVE_STRCHRNUL
197e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define strchrnul gitstrchrnul
198e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline char *gitstrchrnul(const char *s, int c)
199e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{
200e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	while (*s && *s != c)
201e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		s++;
202e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	return (char *)s;
203e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}
204e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif
205e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
206e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/*
207e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Wrappers:
208e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */
209e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern char *xstrdup(const char *str);
210e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern void *xrealloc(void *ptr, size_t size) __attribute__((weak));
211e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
212e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
213e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline void *zalloc(size_t size)
214e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{
215e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	return calloc(1, size);
216e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}
217e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
218e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline int has_extension(const char *filename, const char *ext)
219e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{
220e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	size_t len = strlen(filename);
221e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	size_t extlen = strlen(ext);
222e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
223e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	return len > extlen && !memcmp(filename + len - extlen, ext, extlen);
224e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}
225e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
226e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* Sane ctype - no locale, and works with signed chars */
227e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#undef isascii
228e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#undef isspace
229e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#undef isdigit
230e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#undef isxdigit
231e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#undef isalpha
232e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#undef isprint
233e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#undef isalnum
234e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#undef tolower
235e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#undef toupper
236e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
237e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengextern unsigned char sane_ctype[256];
238e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define GIT_SPACE		0x01
239e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define GIT_DIGIT		0x02
240e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define GIT_ALPHA		0x04
241e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define GIT_GLOB_SPECIAL	0x08
242e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define GIT_REGEX_SPECIAL	0x10
243e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define GIT_PRINT_EXTRA		0x20
244e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define GIT_PRINT		0x3E
245e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define sane_istest(x,mask) ((sane_ctype[(unsigned char)(x)] & (mask)) != 0)
246e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define isascii(x) (((x) & ~0x7f) == 0)
247e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define isspace(x) sane_istest(x,GIT_SPACE)
248e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define isdigit(x) sane_istest(x,GIT_DIGIT)
249e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define isxdigit(x)	\
250e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	(sane_istest(toupper(x), GIT_ALPHA | GIT_DIGIT) && toupper(x) < 'G')
251e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define isalpha(x) sane_istest(x,GIT_ALPHA)
252e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define isalnum(x) sane_istest(x,GIT_ALPHA | GIT_DIGIT)
253e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define isprint(x) sane_istest(x,GIT_PRINT)
254e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define tolower(x) sane_case((unsigned char)(x), 0x20)
255e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define toupper(x) sane_case((unsigned char)(x), 0)
256e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
257e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline int sane_case(int x, int high)
258e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{
259e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	if (sane_istest(x, GIT_ALPHA))
260e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		x = (x & ~0x20) | high;
261e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	return x;
262e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}
263e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
264e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengint mkdir_p(char *path, mode_t mode);
265e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengint copyfile(const char *from, const char *to);
266e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
267e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengs64 perf_atoll(const char *str);
268e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengchar **argv_split(const char *str, int *argcp);
269e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengvoid argv_free(char **argv);
270e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengbool strglobmatch(const char *str, const char *pat);
271e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengbool strlazymatch(const char *str, const char *pat);
272e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengunsigned long convert_unit(unsigned long value, char *unit);
273e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengint readn(int fd, void *buf, size_t size);
274e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
275e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define _STR(x) #x
276e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define STR(x) _STR(x)
277e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
278e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif
279