util.h revision 7d82a4640abdcc3ffbd89c7971a11e4ac7953b7f
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