diff options
author | Junio C Hamano <gitster@pobox.com> | 2023-07-17 20:30:42 +0200 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2023-07-17 20:30:42 +0200 |
commit | ce481ac8b31c9061eeecd1ba0d7174b621f96632 (patch) | |
tree | 21d54bf0d30f970db5c98a2298a0ae6a45057ec6 /git-compat-util.h | |
parent | Merge branch 'vd/adjust-mfow-doc-to-updated-headers' (diff) | |
parent | git-compat-util: move alloc macros to git-compat-util.h (diff) | |
download | git-ce481ac8b31c9061eeecd1ba0d7174b621f96632.tar.xz git-ce481ac8b31c9061eeecd1ba0d7174b621f96632.zip |
Merge branch 'cw/compat-util-header-cleanup'
Further shuffling of declarations across header files to streamline
file dependencies.
* cw/compat-util-header-cleanup:
git-compat-util: move alloc macros to git-compat-util.h
treewide: remove unnecessary includes for wrapper.h
kwset: move translation table from ctype
sane-ctype.h: create header for sane-ctype macros
git-compat-util: move wrapper.c funcs to its header
git-compat-util: move strbuf.c funcs to its header
Diffstat (limited to 'git-compat-util.h')
-rw-r--r-- | git-compat-util.h | 284 |
1 files changed, 77 insertions, 207 deletions
diff --git a/git-compat-util.h b/git-compat-util.h index ae88291976..d32aa754ae 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -627,7 +627,7 @@ static inline int git_has_dir_sep(const char *path) #include "compat/bswap.h" -struct strbuf; +#include "wrapper.h" /* General helper functions */ NORETURN void usage(const char *err); @@ -679,9 +679,6 @@ void set_warn_routine(report_fn routine); report_fn get_warn_routine(void); void set_die_is_recursing_routine(int (*routine)(void)); -int starts_with(const char *str, const char *prefix); -int istarts_with(const char *str, const char *prefix); - /* * If the string "str" begins with the string found in "prefix", return 1. * The "out" parameter is set to "str + strlen(prefix)" (i.e., to the point in @@ -711,29 +708,6 @@ static inline int skip_prefix(const char *str, const char *prefix, } /* - * If the string "str" is the same as the string in "prefix", then the "arg" - * parameter is set to the "def" parameter and 1 is returned. - * If the string "str" begins with the string found in "prefix" and then a - * "=" sign, then the "arg" parameter is set to "str + strlen(prefix) + 1" - * (i.e., to the point in the string right after the prefix and the "=" sign), - * and 1 is returned. - * - * Otherwise, return 0 and leave "arg" untouched. - * - * When we accept both a "--key" and a "--key=<val>" option, this function - * can be used instead of !strcmp(arg, "--key") and then - * skip_prefix(arg, "--key=", &arg) to parse such an option. - */ -int skip_to_optional_arg_default(const char *str, const char *prefix, - const char **arg, const char *def); - -static inline int skip_to_optional_arg(const char *str, const char *prefix, - const char **arg) -{ - return skip_to_optional_arg_default(str, prefix, arg, ""); -} - -/* * Like skip_prefix, but promises never to read past "len" bytes of the input * buffer, and returns the remaining number of bytes in "out" via "outlen". */ @@ -777,12 +751,6 @@ static inline int strip_suffix(const char *str, const char *suffix, size_t *len) return strip_suffix_mem(str, len, suffix); } -static inline int ends_with(const char *str, const char *suffix) -{ - size_t len; - return strip_suffix(str, suffix, &len); -} - #define SWAP(a, b) do { \ void *_swap_a_ptr = &(a); \ void *_swap_b_ptr = &(b); \ @@ -1079,36 +1047,6 @@ static inline int cast_size_t_to_int(size_t a) # define xalloca(size) (xmalloc(size)) # define xalloca_free(p) (free(p)) #endif -char *xstrdup(const char *str); -void *xmalloc(size_t size); -void *xmallocz(size_t size); -void *xmallocz_gently(size_t size); -void *xmemdupz(const void *data, size_t len); -char *xstrndup(const char *str, size_t len); -void *xrealloc(void *ptr, size_t size); -void *xcalloc(size_t nmemb, size_t size); -void xsetenv(const char *name, const char *value, int overwrite); -void *xmmap(void *start, size_t length, int prot, int flags, int fd, off_t offset); -const char *mmap_os_err(void); -void *xmmap_gently(void *start, size_t length, int prot, int flags, int fd, off_t offset); -int xopen(const char *path, int flags, ...); -ssize_t xread(int fd, void *buf, size_t len); -ssize_t xwrite(int fd, const void *buf, size_t len); -ssize_t xpread(int fd, void *buf, size_t len, off_t offset); -int xdup(int fd); -FILE *xfopen(const char *path, const char *mode); -FILE *xfdopen(int fd, const char *mode); -int xmkstemp(char *temp_filename); -int xmkstemp_mode(char *temp_filename, int mode); -char *xgetcwd(void); -FILE *fopen_for_writing(const char *path); -FILE *fopen_or_warn(const char *path, const char *mode); - -/* - * Like strncmp, but only return zero if s is NUL-terminated and exactly len - * characters long. If it is not, consider it greater than t. - */ -int xstrncmpz(const char *s, const char *t, size_t len); /* * FREE_AND_NULL(ptr) is like free(ptr) followed by ptr = NULL. Note @@ -1198,6 +1136,81 @@ static inline void move_array(void *dst, const void *src, size_t n, size_t size) #define FLEXPTR_ALLOC_STR(x, ptrname, str) \ FLEXPTR_ALLOC_MEM((x), ptrname, (str), strlen(str)) +#define alloc_nr(x) (((x)+16)*3/2) + +/** + * Dynamically growing an array using realloc() is error prone and boring. + * + * Define your array with: + * + * - a pointer (`item`) that points at the array, initialized to `NULL` + * (although please name the variable based on its contents, not on its + * type); + * + * - an integer variable (`alloc`) that keeps track of how big the current + * allocation is, initialized to `0`; + * + * - another integer variable (`nr`) to keep track of how many elements the + * array currently has, initialized to `0`. + * + * Then before adding `n`th element to the item, call `ALLOC_GROW(item, n, + * alloc)`. This ensures that the array can hold at least `n` elements by + * calling `realloc(3)` and adjusting `alloc` variable. + * + * ------------ + * sometype *item; + * size_t nr; + * size_t alloc + * + * for (i = 0; i < nr; i++) + * if (we like item[i] already) + * return; + * + * // we did not like any existing one, so add one + * ALLOC_GROW(item, nr + 1, alloc); + * item[nr++] = value you like; + * ------------ + * + * You are responsible for updating the `nr` variable. + * + * If you need to specify the number of elements to allocate explicitly + * then use the macro `REALLOC_ARRAY(item, alloc)` instead of `ALLOC_GROW`. + * + * Consider using ALLOC_GROW_BY instead of ALLOC_GROW as it has some + * added niceties. + * + * DO NOT USE any expression with side-effect for 'x', 'nr', or 'alloc'. + */ +#define ALLOC_GROW(x, nr, alloc) \ + do { \ + if ((nr) > alloc) { \ + if (alloc_nr(alloc) < (nr)) \ + alloc = (nr); \ + else \ + alloc = alloc_nr(alloc); \ + REALLOC_ARRAY(x, alloc); \ + } \ + } while (0) + +/* + * Similar to ALLOC_GROW but handles updating of the nr value and + * zeroing the bytes of the newly-grown array elements. + * + * DO NOT USE any expression with side-effect for any of the + * arguments. + */ +#define ALLOC_GROW_BY(x, nr, increase, alloc) \ + do { \ + if (increase) { \ + size_t new_nr = nr + (increase); \ + if (new_nr < nr) \ + BUG("negative growth in ALLOC_GROW_BY"); \ + ALLOC_GROW(x, new_nr, alloc); \ + memset((x) + nr, 0, sizeof(*(x)) * (increase)); \ + nr = new_nr; \ + } \ + } while (0) + static inline char *xstrdup_or_null(const char *str) { return str ? xstrdup(str) : NULL; @@ -1210,79 +1223,11 @@ static inline size_t xsize_t(off_t len) return (size_t) len; } -__attribute__((format (printf, 3, 4))) -int xsnprintf(char *dst, size_t max, const char *fmt, ...); - #ifndef HOST_NAME_MAX #define HOST_NAME_MAX 256 #endif -int xgethostname(char *buf, size_t len); - -/* in ctype.c, for kwset users */ -extern const unsigned char tolower_trans_tbl[256]; - -/* Sane ctype - no locale, and works with signed chars */ -#undef isascii -#undef isspace -#undef isdigit -#undef isalpha -#undef isalnum -#undef isprint -#undef islower -#undef isupper -#undef tolower -#undef toupper -#undef iscntrl -#undef ispunct -#undef isxdigit - -extern const unsigned char sane_ctype[256]; -extern const signed char hexval_table[256]; -#define GIT_SPACE 0x01 -#define GIT_DIGIT 0x02 -#define GIT_ALPHA 0x04 -#define GIT_GLOB_SPECIAL 0x08 -#define GIT_REGEX_SPECIAL 0x10 -#define GIT_PATHSPEC_MAGIC 0x20 -#define GIT_CNTRL 0x40 -#define GIT_PUNCT 0x80 -#define sane_istest(x,mask) ((sane_ctype[(unsigned char)(x)] & (mask)) != 0) -#define isascii(x) (((x) & ~0x7f) == 0) -#define isspace(x) sane_istest(x,GIT_SPACE) -#define isdigit(x) sane_istest(x,GIT_DIGIT) -#define isalpha(x) sane_istest(x,GIT_ALPHA) -#define isalnum(x) sane_istest(x,GIT_ALPHA | GIT_DIGIT) -#define isprint(x) ((x) >= 0x20 && (x) <= 0x7e) -#define islower(x) sane_iscase(x, 1) -#define isupper(x) sane_iscase(x, 0) -#define is_glob_special(x) sane_istest(x,GIT_GLOB_SPECIAL) -#define is_regex_special(x) sane_istest(x,GIT_GLOB_SPECIAL | GIT_REGEX_SPECIAL) -#define iscntrl(x) (sane_istest(x,GIT_CNTRL)) -#define ispunct(x) sane_istest(x, GIT_PUNCT | GIT_REGEX_SPECIAL | \ - GIT_GLOB_SPECIAL | GIT_PATHSPEC_MAGIC) -#define isxdigit(x) (hexval_table[(unsigned char)(x)] != -1) -#define tolower(x) sane_case((unsigned char)(x), 0x20) -#define toupper(x) sane_case((unsigned char)(x), 0) -#define is_pathspec_magic(x) sane_istest(x,GIT_PATHSPEC_MAGIC) - -static inline int sane_case(int x, int high) -{ - if (sane_istest(x, GIT_ALPHA)) - x = (x & ~0x20) | high; - return x; -} - -static inline int sane_iscase(int x, int is_lower) -{ - if (!sane_istest(x, GIT_ALPHA)) - return 0; - - if (is_lower) - return (x & 0x20) != 0; - else - return (x & 0x20) == 0; -} +#include "sane-ctype.h" /* * Like skip_prefix, but compare case-insensitively. Note that the comparison @@ -1459,72 +1404,6 @@ void bug_fl(const char *file, int line, const char *fmt, ...); #endif #endif -enum fsync_action { - FSYNC_WRITEOUT_ONLY, - FSYNC_HARDWARE_FLUSH -}; - -/* - * Issues an fsync against the specified file according to the specified mode. - * - * FSYNC_WRITEOUT_ONLY attempts to use interfaces available on some operating - * systems to flush the OS cache without issuing a flush command to the storage - * controller. If those interfaces are unavailable, the function fails with - * ENOSYS. - * - * FSYNC_HARDWARE_FLUSH does an OS writeout and hardware flush to ensure that - * changes are durable. It is not expected to fail. - */ -int git_fsync(int fd, enum fsync_action action); - -/* - * Writes out trace statistics for fsync using the trace2 API. - */ -void trace_git_fsync_stats(void); - -/* - * Preserves errno, prints a message, but gives no warning for ENOENT. - * Returns 0 on success, which includes trying to unlink an object that does - * not exist. - */ -int unlink_or_warn(const char *path); - /* - * Tries to unlink file. Returns 0 if unlink succeeded - * or the file already didn't exist. Returns -1 and - * appends a message to err suitable for - * 'error("%s", err->buf)' on error. - */ -int unlink_or_msg(const char *file, struct strbuf *err); -/* - * Preserves errno, prints a message, but gives no warning for ENOENT. - * Returns 0 on success, which includes trying to remove a directory that does - * not exist. - */ -int rmdir_or_warn(const char *path); -/* - * Calls the correct function out of {unlink,rmdir}_or_warn based on - * the supplied file mode. - */ -int remove_or_warn(unsigned int mode, const char *path); - -/* - * Call access(2), but warn for any error except "missing file" - * (ENOENT or ENOTDIR). - */ -#define ACCESS_EACCES_OK (1U << 0) -int access_or_warn(const char *path, int mode, unsigned flag); -int access_or_die(const char *path, int mode, unsigned flag); - -/* Warn on an inaccessible file if errno indicates this is an error */ -int warn_on_fopen_errors(const char *path); - -/* - * Open with O_NOFOLLOW, or equivalent. Note that the fallback equivalent - * may be racy. Do not use this as protection against an attacker who can - * simultaneously create paths. - */ -int open_nofollow(const char *path, int flags); - #ifndef SHELL_PATH # define SHELL_PATH "/bin/sh" #endif @@ -1664,13 +1543,4 @@ static inline void *container_of_or_null_offset(void *ptr, size_t offset) ((uintptr_t)&(ptr)->member - (uintptr_t)(ptr)) #endif /* !__GNUC__ */ -void sleep_millisec(int millisec); - -/* - * Generate len bytes from the system cryptographically secure PRNG. - * Returns 0 on success and -1 on error, setting errno. The inability to - * satisfy the full request is an error. - */ -int csprng_bytes(void *buf, size_t len); - #endif |