git-compat-util: convert skip_{prefix,suffix}{,_mem} to bool
Use the data type bool and its values true and false to document the
binary return value of skip_prefix() and friends more explicitly.
This first use of stdbool.h, introduced with C99, is meant to check
whether there are platforms that claim support for C99, as tested by
7bc341e21b
(git-compat-util: add a test balloon for C99 support,
2021-12-01), but still lack that header for some reason.
A fallback based on a wider type, e.g. int, would have to deal with
comparisons somehow to emulate that any non-zero value is true:
bool b1 = 1;
bool b2 = 2;
if (b1 == b2) puts("This is true.");
int i1 = 1;
int i2 = 2;
if (i1 == i2) puts("Not printed.");
#define BOOLEQ(a, b) (!(a) == !(b))
if (BOOLEQ(i1, i2)) puts("This is true.");
So we'd be better off using bool everywhere without a fallback, if
possible. That's why this patch doesn't include any.
Signed-off-by: René Scharfe <l.s.r@web.de>
Acked-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
parent
564d0252ca
commit
8277dbe987
|
@ -225,6 +225,7 @@ struct strbuf;
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
#include <stdbool.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#ifdef HAVE_STRINGS_H
|
#ifdef HAVE_STRINGS_H
|
||||||
#include <strings.h> /* for strcasecmp() */
|
#include <strings.h> /* for strcasecmp() */
|
||||||
|
@ -684,11 +685,11 @@ report_fn get_warn_routine(void);
|
||||||
void set_die_is_recursing_routine(int (*routine)(void));
|
void set_die_is_recursing_routine(int (*routine)(void));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the string "str" begins with the string found in "prefix", return 1.
|
* If the string "str" begins with the string found in "prefix", return true.
|
||||||
* The "out" parameter is set to "str + strlen(prefix)" (i.e., to the point in
|
* The "out" parameter is set to "str + strlen(prefix)" (i.e., to the point in
|
||||||
* the string right after the prefix).
|
* the string right after the prefix).
|
||||||
*
|
*
|
||||||
* Otherwise, return 0 and leave "out" untouched.
|
* Otherwise, return false and leave "out" untouched.
|
||||||
*
|
*
|
||||||
* Examples:
|
* Examples:
|
||||||
*
|
*
|
||||||
|
@ -699,57 +700,58 @@ void set_die_is_recursing_routine(int (*routine)(void));
|
||||||
* [skip prefix if present, otherwise use whole string]
|
* [skip prefix if present, otherwise use whole string]
|
||||||
* skip_prefix(name, "refs/heads/", &name);
|
* skip_prefix(name, "refs/heads/", &name);
|
||||||
*/
|
*/
|
||||||
static inline int skip_prefix(const char *str, const char *prefix,
|
static inline bool skip_prefix(const char *str, const char *prefix,
|
||||||
const char **out)
|
const char **out)
|
||||||
{
|
{
|
||||||
do {
|
do {
|
||||||
if (!*prefix) {
|
if (!*prefix) {
|
||||||
*out = str;
|
*out = str;
|
||||||
return 1;
|
return true;
|
||||||
}
|
}
|
||||||
} while (*str++ == *prefix++);
|
} while (*str++ == *prefix++);
|
||||||
return 0;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Like skip_prefix, but promises never to read past "len" bytes of the input
|
* 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".
|
* buffer, and returns the remaining number of bytes in "out" via "outlen".
|
||||||
*/
|
*/
|
||||||
static inline int skip_prefix_mem(const char *buf, size_t len,
|
static inline bool skip_prefix_mem(const char *buf, size_t len,
|
||||||
const char *prefix,
|
const char *prefix,
|
||||||
const char **out, size_t *outlen)
|
const char **out, size_t *outlen)
|
||||||
{
|
{
|
||||||
size_t prefix_len = strlen(prefix);
|
size_t prefix_len = strlen(prefix);
|
||||||
if (prefix_len <= len && !memcmp(buf, prefix, prefix_len)) {
|
if (prefix_len <= len && !memcmp(buf, prefix, prefix_len)) {
|
||||||
*out = buf + prefix_len;
|
*out = buf + prefix_len;
|
||||||
*outlen = len - prefix_len;
|
*outlen = len - prefix_len;
|
||||||
return 1;
|
return true;
|
||||||
}
|
}
|
||||||
return 0;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If buf ends with suffix, return 1 and subtract the length of the suffix
|
* If buf ends with suffix, return true and subtract the length of the suffix
|
||||||
* from *len. Otherwise, return 0 and leave *len untouched.
|
* from *len. Otherwise, return false and leave *len untouched.
|
||||||
*/
|
*/
|
||||||
static inline int strip_suffix_mem(const char *buf, size_t *len,
|
static inline bool strip_suffix_mem(const char *buf, size_t *len,
|
||||||
const char *suffix)
|
const char *suffix)
|
||||||
{
|
{
|
||||||
size_t suflen = strlen(suffix);
|
size_t suflen = strlen(suffix);
|
||||||
if (*len < suflen || memcmp(buf + (*len - suflen), suffix, suflen))
|
if (*len < suflen || memcmp(buf + (*len - suflen), suffix, suflen))
|
||||||
return 0;
|
return false;
|
||||||
*len -= suflen;
|
*len -= suflen;
|
||||||
return 1;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If str ends with suffix, return 1 and set *len to the size of the string
|
* If str ends with suffix, return true and set *len to the size of the string
|
||||||
* without the suffix. Otherwise, return 0 and set *len to the size of the
|
* without the suffix. Otherwise, return false and set *len to the size of the
|
||||||
* string.
|
* string.
|
||||||
*
|
*
|
||||||
* Note that we do _not_ NUL-terminate str to the new length.
|
* Note that we do _not_ NUL-terminate str to the new length.
|
||||||
*/
|
*/
|
||||||
static inline int strip_suffix(const char *str, const char *suffix, size_t *len)
|
static inline bool strip_suffix(const char *str, const char *suffix,
|
||||||
|
size_t *len)
|
||||||
{
|
{
|
||||||
*len = strlen(str);
|
*len = strlen(str);
|
||||||
return strip_suffix_mem(str, len, suffix);
|
return strip_suffix_mem(str, len, suffix);
|
||||||
|
|
Loading…
Reference in New Issue