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