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