Feature #451 ยป 0048-shared.-ch-Replace-NULLs-with-nullptrs.patch
utility/shared.c | ||
---|---|---|
/* Both of these are stored in the local encoding. The grouping_sep must
|
||
* be converted to the internal encoding when it's used. */
|
||
static char *grouping = NULL;
|
||
static char *grouping_sep = NULL;
|
||
static char *grouping = nullptr;
|
||
static char *grouping_sep = nullptr;
|
||
/* As well as base64 functions, this string is used for checking for
|
||
* 'safe' filenames, so should not contain / \ . */
|
||
static const char base64url[] =
|
||
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
|
||
static struct strvec *data_dir_names = NULL;
|
||
static struct strvec *save_dir_names = NULL;
|
||
static struct strvec *scenario_dir_names = NULL;
|
||
static struct strvec *data_dir_names = nullptr;
|
||
static struct strvec *save_dir_names = nullptr;
|
||
static struct strvec *scenario_dir_names = nullptr;
|
||
static char *mc_group = NULL;
|
||
static char *home_dir_user = NULL;
|
||
static char *storage_dir_freeciv = NULL;
|
||
static char *mc_group = nullptr;
|
||
static char *home_dir_user = nullptr;
|
||
static char *storage_dir_freeciv = nullptr;
|
||
static struct astring realfile = ASTRING_INIT;
|
||
... | ... | |
seplen = strlen(sep);
|
||
#if 0 /* Not needed while the values are unsigned. */
|
||
fc_assert_ret_val(0 <= mantissa, NULL);
|
||
fc_assert_ret_val(0 <= exponent, NULL);
|
||
fc_assert_ret_val(0 <= mantissa, nullptr);
|
||
fc_assert_ret_val(0 <= exponent, nullptr);
|
||
#endif
|
||
if (mantissa == 0) {
|
||
... | ... | |
if (ptr <= buf + seplen) {
|
||
/* Avoid a buffer overflow. */
|
||
fc_assert_ret_val(ptr > buf + seplen, NULL);
|
||
fc_assert_ret_val(ptr > buf + seplen, nullptr);
|
||
return ptr;
|
||
}
|
||
... | ... | |
}
|
||
ptr -= seplen;
|
||
fc_assert_ret_val(ptr >= buf, NULL);
|
||
fc_assert_ret_val(ptr >= buf, nullptr);
|
||
memcpy(ptr, sep, seplen);
|
||
if (*(grp + 1) != 0) {
|
||
... | ... | |
{
|
||
int i = 0;
|
||
/* Must not be NULL or empty */
|
||
if (!name || *name == '\0') {
|
||
/* Must not be nullptr or empty */
|
||
if (name == nullptr || *name == '\0') {
|
||
return FALSE;
|
||
}
|
||
for (; '\0' != name[i]; i++) {
|
||
if ('.' != name[i] && NULL == strchr(base64url, name[i])) {
|
||
if ('.' != name[i] && strchr(base64url, name[i]) == nullptr) {
|
||
return FALSE;
|
||
}
|
||
}
|
||
... | ... | |
const char illegal_chars[] = {'|', '%', '"', ',', '*', '<', '>', '\0'};
|
||
int i, j;
|
||
/* Must not be NULL or empty */
|
||
if (!name || *name == '\0') {
|
||
/* Must not be nullptr or empty */
|
||
if (name == nullptr || *name == '\0') {
|
||
return FALSE;
|
||
}
|
||
... | ... | |
{
|
||
size_t i = 0;
|
||
/* Must not be NULL or empty */
|
||
if (NULL == s || '\0' == *s) {
|
||
/* Must not be nullptr or empty */
|
||
if (s == nullptr || '\0' == *s) {
|
||
return FALSE;
|
||
}
|
||
for (; '\0' != s[i]; i++) {
|
||
if (NULL == strchr(base64url, s[i])) {
|
||
if (strchr(base64url, s[i]) == nullptr) {
|
||
return FALSE;
|
||
}
|
||
}
|
||
return TRUE;
|
||
}
|
||
... | ... | |
{
|
||
size_t i = 0;
|
||
/* Must not be NULL or too short */
|
||
if (NULL == s || 1 > n) {
|
||
/* Must not be nullptr or too short */
|
||
if (s == nullptr || 1 > n) {
|
||
return;
|
||
}
|
||
... | ... | |
****************************************************************************/
|
||
char *skip_leading_spaces(char *s)
|
||
{
|
||
fc_assert_ret_val(NULL != s, NULL);
|
||
fc_assert_ret_val(s != nullptr, nullptr);
|
||
while (*s != '\0' && fc_isspace(*s)) {
|
||
s++;
|
||
... | ... | |
{
|
||
char *t;
|
||
fc_assert_ret(NULL != s);
|
||
fc_assert_ret(s != nullptr);
|
||
t = skip_leading_spaces(s);
|
||
if (t != s) {
|
||
while (*t != '\0') {
|
||
... | ... | |
char *t;
|
||
size_t len;
|
||
fc_assert_ret(NULL != s);
|
||
fc_assert_ret(s != nullptr);
|
||
len = strlen(s);
|
||
if (len > 0) {
|
||
t = s + len -1;
|
||
... | ... | |
{
|
||
char *t;
|
||
fc_assert_ret(NULL != s);
|
||
fc_assert_ret(s != nullptr);
|
||
t = s + strlen(s) -1;
|
||
while (t>=s && (*t) == trailing) {
|
||
... | ... | |
int len = strlen(str);
|
||
*nleft -= len;
|
||
fc_assert_ret_val(0 < (*nleft), NULL); /* Space for the terminating nul */
|
||
fc_assert_ret_val(0 < (*nleft), nullptr); /* Space for the terminating nul */
|
||
return str + len;
|
||
}
|
||
... | ... | |
}
|
||
/************************************************************************//**
|
||
Convert 'str' to its int representation if possible. 'pint' can be NULL,
|
||
Convert 'str' to its int representation if possible. 'pint' can be nullptr,
|
||
then it will only test 'str' only contains an integer number.
|
||
****************************************************************************/
|
||
bool str_to_int(const char *str, int *pint)
|
||
{
|
||
const char *start;
|
||
fc_assert_ret_val(NULL != str, FALSE);
|
||
fc_assert_ret_val(str != nullptr, FALSE);
|
||
while (fc_isspace(*str)) {
|
||
/* Skip leading spaces. */
|
||
... | ... | |
str++;
|
||
}
|
||
return ('\0' == *str && (NULL == pint || 1 == sscanf(start, "%d", pint)));
|
||
return ('\0' == *str && (pint == nullptr || 1 == sscanf(start, "%d", pint)));
|
||
}
|
||
/************************************************************************//**
|
||
Convert 'str' to its unsigned int representation if possible.
|
||
'pint' can be NULL, then it will only test 'str' only contains
|
||
'pint' can be nullptr, then it will only test 'str' only contains
|
||
an unsigned integer number.
|
||
****************************************************************************/
|
||
bool str_to_uint(const char *str, unsigned int *pint)
|
||
{
|
||
const char *start;
|
||
fc_assert_ret_val(NULL != str, FALSE);
|
||
fc_assert_ret_val(str != nullptr, FALSE);
|
||
while (fc_isspace(*str)) {
|
||
/* Skip leading spaces. */
|
||
... | ... | |
str++;
|
||
}
|
||
return ('\0' == *str && (NULL == pint || 1 == sscanf(start, "%u", pint)));
|
||
return ('\0' == *str && (pint == nullptr || 1 == sscanf(start, "%u", pint)));
|
||
}
|
||
/************************************************************************//**
|
||
Convert 'str' to its float representation if possible. 'pfloat' can be NULL,
|
||
then it will only test 'str' only contains a floating point number.
|
||
Convert 'str' to its float representation if possible. 'pfloat'
|
||
can be nullptr, then it will only test 'str' only contains
|
||
a floating point number.
|
||
****************************************************************************/
|
||
bool str_to_float(const char *str, float *pfloat)
|
||
{
|
||
bool dot;
|
||
const char *start;
|
||
fc_assert_ret_val(NULL != str, FALSE);
|
||
fc_assert_ret_val(str != nullptr, FALSE);
|
||
while (fc_isspace(*str)) {
|
||
/* Skip leading spaces. */
|
||
... | ... | |
}
|
||
return ('\0' == *str && dot
|
||
&& (NULL == pfloat || 1 == sscanf(start, "%f", pfloat)));
|
||
&& (nullptr == pfloat || 1 == sscanf(start, "%f", pfloat)));
|
||
}
|
||
/************************************************************************//**
|
||
Returns string which gives users home dir, as specified by $HOME.
|
||
Gets value once, and then caches result.
|
||
If $HOME is not set, give a log message and returns NULL.
|
||
If $HOME is not set, give a log message and returns nullptr.
|
||
Note the caller should not mess with the returned string.
|
||
****************************************************************************/
|
||
char *user_home_dir(void)
|
||
... | ... | |
#define HOMEVAR "HOME"
|
||
#endif
|
||
if (home_dir_user == NULL) {
|
||
if (home_dir_user == nullptr) {
|
||
char *env = getenv(HOMEVAR);
|
||
if (env) {
|
||
... | ... | |
log_verbose(HOMEVAR " is %s", home_dir_user);
|
||
} else {
|
||
log_error("Could not find home directory (" HOMEVAR " is not set).");
|
||
home_dir_user = NULL;
|
||
home_dir_user = nullptr;
|
||
}
|
||
}
|
||
... | ... | |
****************************************************************************/
|
||
void free_user_home_dir(void)
|
||
{
|
||
if (home_dir_user != NULL) {
|
||
if (home_dir_user != nullptr) {
|
||
free(home_dir_user);
|
||
home_dir_user = NULL;
|
||
home_dir_user = nullptr;
|
||
}
|
||
}
|
||
... | ... | |
****************************************************************************/
|
||
char *freeciv_storage_dir(void)
|
||
{
|
||
if (storage_dir_freeciv == NULL) {
|
||
if (storage_dir_freeciv == nullptr) {
|
||
storage_dir_freeciv = fc_malloc(strlen(FREECIV_STORAGE_DIR) + 1);
|
||
strcpy(storage_dir_freeciv, FREECIV_STORAGE_DIR);
|
||
... | ... | |
****************************************************************************/
|
||
void free_freeciv_storage_dir(void)
|
||
{
|
||
if (storage_dir_freeciv != NULL) {
|
||
if (storage_dir_freeciv != nullptr) {
|
||
free(storage_dir_freeciv);
|
||
storage_dir_freeciv = NULL;
|
||
storage_dir_freeciv = nullptr;
|
||
}
|
||
}
|
||
... | ... | |
* is readable etc? Don't currently. */
|
||
if (i == -1 && ok_to_free) {
|
||
free(tok);
|
||
tok = NULL;
|
||
tok = nullptr;
|
||
}
|
||
}
|
||
... | ... | |
do {
|
||
char *dir = expand_dir(tok, FALSE);
|
||
if (dir != NULL) {
|
||
if (dir != nullptr) {
|
||
strvec_append(dirs, dir);
|
||
if (dir != tok) {
|
||
free(dir);
|
||
}
|
||
}
|
||
tok = strtok(NULL, PATH_SEPARATOR);
|
||
tok = strtok(nullptr, PATH_SEPARATOR);
|
||
} while (tok);
|
||
free(path);
|
||
... | ... | |
****************************************************************************/
|
||
void free_data_dir_names(void)
|
||
{
|
||
if (data_dir_names != NULL) {
|
||
if (data_dir_names != nullptr) {
|
||
strvec_destroy(data_dir_names);
|
||
data_dir_names = NULL;
|
||
data_dir_names = nullptr;
|
||
}
|
||
if (save_dir_names != NULL) {
|
||
if (save_dir_names != nullptr) {
|
||
strvec_destroy(save_dir_names);
|
||
save_dir_names = NULL;
|
||
save_dir_names = nullptr;
|
||
}
|
||
if (scenario_dir_names != NULL) {
|
||
if (scenario_dir_names != nullptr) {
|
||
strvec_destroy(scenario_dir_names);
|
||
scenario_dir_names = NULL;
|
||
scenario_dir_names = nullptr;
|
||
}
|
||
}
|
||
... | ... | |
/* The first time this function is called it will search and
|
||
* allocate the directory listing. Subsequently we will already
|
||
* know the list and can just return it. */
|
||
if (NULL == data_dir_names) {
|
||
if (data_dir_names == nullptr) {
|
||
const char *path;
|
||
#ifdef FREECIV_APPIMAGE
|
||
... | ... | |
log_error(_("\"%s\" is set but empty; using default \"%s\" "
|
||
"data directories instead."),
|
||
FREECIV_DATA_PATH, default_data_path);
|
||
path = NULL;
|
||
path = nullptr;
|
||
}
|
||
data_dir_names = base_get_dirs(NULL != path ? path : default_data_path);
|
||
data_dir_names = base_get_dirs(path != nullptr ? path : default_data_path);
|
||
strvec_remove_duplicate(data_dir_names, strcmp); /* Don't set a path both. */
|
||
strvec_iterate(data_dir_names, dirname) {
|
||
log_verbose("Data path component: %s", dirname);
|
||
... | ... | |
/* The first time this function is called it will search and
|
||
* allocate the directory listing. Subsequently we will already
|
||
* know the list and can just return it. */
|
||
if (NULL == save_dir_names) {
|
||
if (save_dir_names == nullptr) {
|
||
const char *path;
|
||
if ((path = getenv(FREECIV_SAVE_PATH)) && '\0' == path[0]) {
|
||
... | ... | |
log_error(_("\"%s\" is set but empty; using default \"%s\" "
|
||
"save directories instead."),
|
||
FREECIV_SAVE_PATH, DEFAULT_SAVE_PATH);
|
||
path = NULL;
|
||
path = nullptr;
|
||
}
|
||
save_dir_names = base_get_dirs(NULL != path ? path : DEFAULT_SAVE_PATH);
|
||
save_dir_names = base_get_dirs(path != nullptr ? path : DEFAULT_SAVE_PATH);
|
||
strvec_remove_duplicate(save_dir_names, strcmp); /* Don't set a path both. */
|
||
strvec_iterate(save_dir_names, dirname) {
|
||
log_verbose("Save path component: %s", dirname);
|
||
... | ... | |
/* The first time this function is called it will search and
|
||
* allocate the directory listing. Subsequently we will already
|
||
* know the list and can just return it. */
|
||
if (NULL == scenario_dir_names) {
|
||
if (scenario_dir_names == nullptr) {
|
||
const char *path;
|
||
#ifdef FREECIV_APPIMAGE
|
||
... | ... | |
log_error( _("\"%s\" is set but empty; using default \"%s\" "
|
||
"scenario directories instead."),
|
||
FREECIV_SCENARIO_PATH, default_scenario_path);
|
||
path = NULL;
|
||
path = nullptr;
|
||
}
|
||
scenario_dir_names = base_get_dirs(NULL != path ? path : default_scenario_path);
|
||
scenario_dir_names = base_get_dirs(path != nullptr ? path : default_scenario_path);
|
||
strvec_remove_duplicate(scenario_dir_names, strcmp); /* Don't set a path both. */
|
||
strvec_iterate(scenario_dir_names, dirname) {
|
||
log_verbose("Scenario path component: %s", dirname);
|
||
... | ... | |
struct strvec *files = strvec_new();
|
||
size_t suffix_len = strlen(suffix);
|
||
fc_assert_ret_val(!strchr(suffix, DIR_SEPARATOR_CHAR), NULL);
|
||
fc_assert_ret_val(!strchr(suffix, DIR_SEPARATOR_CHAR), nullptr);
|
||
if (NULL == dirs) {
|
||
if (dirs == nullptr) {
|
||
return files;
|
||
}
|
||
... | ... | |
Returns a filename to access the specified file from a
|
||
directory by searching all specified directories for the file.
|
||
If the specified 'filename' is NULL, the returned string contains
|
||
If the specified 'filename' is nullptr, the returned string contains
|
||
the effective path. (But this should probably only be used for
|
||
debug output.)
|
||
Returns NULL if the specified filename cannot be found in any of the
|
||
Returns nullptr if the specified filename cannot be found in any of the
|
||
data directories. (A file is considered "found" if it can be
|
||
read-opened.) The returned pointer points to static memory, so this
|
||
function can only supply one filename at a time. Don't free that
|
||
... | ... | |
const char *fileinfoname(const struct strvec *dirs, const char *filename)
|
||
{
|
||
#ifndef DIR_SEPARATOR_IS_DEFAULT
|
||
char fnbuf[filename != NULL ? strlen(filename) + 1 : 1];
|
||
char fnbuf[filename != nullptr ? strlen(filename) + 1 : 1];
|
||
int i;
|
||
#else /* DIR_SEPARATOR_IS_DEFAULT */
|
||
const char *fnbuf = filename;
|
||
#endif /* DIR_SEPARATOR_IS_DEFAULT */
|
||
if (NULL == dirs) {
|
||
return NULL;
|
||
if (dirs == nullptr) {
|
||
return nullptr;
|
||
}
|
||
if (!filename) {
|
||
... | ... | |
log_verbose("Could not find readable file \"%s\" in data path.", filename);
|
||
return NULL;
|
||
return nullptr;
|
||
}
|
||
/************************************************************************//**
|
||
... | ... | |
{
|
||
struct fileinfo_list *res;
|
||
if (NULL == dirs) {
|
||
return NULL;
|
||
if (dirs == nullptr) {
|
||
return nullptr;
|
||
}
|
||
res = fileinfo_list_new_full(fileinfo_destroy);
|
||
... | ... | |
****************************************************************************/
|
||
const char *setup_langname(void)
|
||
{
|
||
const char *langname = NULL;
|
||
const char *langname = nullptr;
|
||
#ifdef ENABLE_NLS
|
||
langname = getenv("LANG");
|
||
... | ... | |
break;
|
||
}
|
||
if (langname != NULL) {
|
||
if (langname != nullptr) {
|
||
static char envstr[40];
|
||
fc_snprintf(envstr, sizeof(envstr), "LANG=%s", langname);
|
||
... | ... | |
****************************************************************************/
|
||
static void autocap_update(void)
|
||
{
|
||
char *autocap_opt_in[] = { "fi", NULL };
|
||
char *autocap_opt_in[] = { "fi", nullptr };
|
||
int i;
|
||
bool ac_enabled = FALSE;
|
||
char *lang = getenv("LANG");
|
||
if (lang != NULL && lang[0] != '\0' && lang[1] != '\0') {
|
||
for (i = 0; autocap_opt_in[i] != NULL && !ac_enabled; i++) {
|
||
if (lang != nullptr && lang[0] != '\0' && lang[1] != '\0') {
|
||
for (i = 0; autocap_opt_in[i] != nullptr && !ac_enabled; i++) {
|
||
if (lang[0] == autocap_opt_in[i][0]
|
||
&& lang[1] == autocap_opt_in[i][1]) {
|
||
ac_enabled = TRUE;
|
||
... | ... | |
#ifdef HAVE_SETENV
|
||
setenv("LANG", lang, TRUE);
|
||
#else /* HAVE_SETENV */
|
||
if (lang != NULL) {
|
||
if (lang != nullptr) {
|
||
static char envstr[40];
|
||
fc_snprintf(envstr, sizeof(envstr), "LANG=%s", lang);
|
||
... | ... | |
This would result in the "C" locale being used, with grouping ""
|
||
and thousands_sep "", where we really want "\3" and ",". */
|
||
if (strcmp(setlocale(LC_NUMERIC, NULL), "C") != 0) {
|
||
if (strcmp(setlocale(LC_NUMERIC, nullptr), "C") != 0) {
|
||
struct lconv *lc = localeconv();
|
||
if (lc->grouping[0] == '\0') {
|
||
... | ... | |
void free_nls(void)
|
||
{
|
||
free(grouping);
|
||
grouping = NULL;
|
||
grouping = nullptr;
|
||
free(grouping_sep);
|
||
grouping_sep = NULL;
|
||
grouping_sep = nullptr;
|
||
}
|
||
/************************************************************************//**
|
||
If we have root privileges, die with an error.
|
||
(Eg, for security reasons.)
|
||
Param argv0 should be argv[0] or similar; fallback is
|
||
used instead if argv0 is NULL.
|
||
used instead if argv0 is nullptr.
|
||
But don't die on systems where the user is always root...
|
||
(a general test for this would be better).
|
||
Doesn't use log_*() because gets called before logging is setup.
|
||
... | ... | |
N_("non-match")
|
||
};
|
||
fc_assert_ret_val(result >= 0 && result < ARRAY_SIZE(descriptions), NULL);
|
||
fc_assert_ret_val(result >= 0 && result < ARRAY_SIZE(descriptions), nullptr);
|
||
return descriptions[result];
|
||
}
|
||
... | ... | |
int *ind_result)
|
||
{
|
||
return match_prefix_full(accessor_fn, n_names, max_len_name, cmp_fn,
|
||
len_fn, prefix, ind_result, NULL, 0, NULL);
|
||
len_fn, prefix, ind_result, nullptr, 0, nullptr);
|
||
}
|
||
/************************************************************************//**
|
||
... | ... | |
Returns type of match or fail, and for return <= M_PRE_AMBIGUOUS
|
||
sets *ind_result with matching index (or for ambiguous, first match).
|
||
If max_len_name == 0, treat as no maximum.
|
||
If the int array 'matches' is non-NULL, up to 'max_matches' ambiguous
|
||
If the int array 'matches' is not nullptr, up to 'max_matches' ambiguous
|
||
matching names indices will be inserted into it. If 'pnum_matches' is
|
||
non-NULL, it will be set to the number of indices inserted into 'matches'.
|
||
not nullptr, it will be set to the number of indices inserted into 'matches'.
|
||
****************************************************************************/
|
||
enum m_pre_result match_prefix_full(m_pre_accessor_fn_t accessor_fn,
|
||
size_t n_names,
|
||
... | ... | |
{
|
||
int i, len, nmatches;
|
||
if (len_fn == NULL) {
|
||
if (len_fn == nullptr) {
|
||
len = strlen(prefix);
|
||
} else {
|
||
len = len_fn(prefix);
|
||
... | ... | |
if (nmatches == 0) {
|
||
*ind_result = i; /* First match */
|
||
}
|
||
if (matches != NULL && nmatches < max_matches) {
|
||
if (matches != nullptr && nmatches < max_matches) {
|
||
matches[nmatches] = i;
|
||
}
|
||
nmatches++;
|
||
... | ... | |
if (nmatches == 1) {
|
||
return M_PRE_ONLY;
|
||
} else if (nmatches > 1) {
|
||
if (pnum_matches != NULL) {
|
||
if (pnum_matches != nullptr) {
|
||
*pnum_matches = MIN(max_matches, nmatches);
|
||
}
|
||
return M_PRE_AMBIGUOUS;
|
||
... | ... | |
static char *default_multicast_group_ipv6 = "FF31::8000:15B4";
|
||
#endif /* IPv6 support */
|
||
if (mc_group == NULL) {
|
||
if (mc_group == nullptr) {
|
||
char *env = getenv("FREECIV_MULTICAST_GROUP");
|
||
if (env) {
|
||
... | ... | |
****************************************************************************/
|
||
void free_multicast_group(void)
|
||
{
|
||
if (mc_group != NULL) {
|
||
if (mc_group != nullptr) {
|
||
free(mc_group);
|
||
mc_group = NULL;
|
||
mc_group = nullptr;
|
||
}
|
||
}
|
||
... | ... | |
{
|
||
int j;
|
||
fc_assert_ret_val(NULL != filepath, NULL);
|
||
fc_assert_ret_val(filepath != nullptr, nullptr);
|
||
for (j = strlen(filepath); j >= 0; j--) {
|
||
if (filepath[j] == DIR_SEPARATOR_CHAR) {
|
||
... | ... | |
bool make_dir(const char *pathname, int mode)
|
||
{
|
||
char *dir;
|
||
char *path = NULL;
|
||
char *path = nullptr;
|
||
if (pathname[0] == '\0') {
|
||
return FALSE;
|
||
... | ... | |
/************************************************************************//**
|
||
Scan in a word or set of words from start to but not including
|
||
any of the given delimiters. The buf pointer will point past delimiter,
|
||
or be set to NULL if there is nothing there. Removes excess white
|
||
or be set to nullptr if there is nothing there. Removes excess white
|
||
space.
|
||
This function should be safe, and dest will contain "\0" and
|
||
*buf == NULL on failure. We always fail gently.
|
||
*buf == nullptr on failure. We always fail gently.
|
||
Due to the way the scanning is performed, looking for a space
|
||
will give you the first word even if it comes before multiple
|
||
... | ... | |
Returns delimiter found.
|
||
Pass in NULL for dest and -1 for size to just skip ahead. Note that if
|
||
Pass in nullptr for dest and -1 for size to just skip ahead. Note that if
|
||
nothing is found, dest will contain the whole string, minus leading and
|
||
trailing whitespace. You can scan for "" to conveniently grab the
|
||
remainder of a string.
|
||
... | ... | |
{
|
||
char *ptr, found = '?';
|
||
if (*buf == NULL || strlen(*buf) == 0 || size == 0) {
|
||
if (*buf == nullptr || strlen(*buf) == 0 || size == 0) {
|
||
if (dest) {
|
||
dest[0] = '\0';
|
||
}
|
||
*buf = NULL;
|
||
*buf = nullptr;
|
||
return '\0';
|
||
}
|
||
... | ... | |
/* Just skip ahead. */
|
||
ptr = strpbrk(*buf, delimiters);
|
||
}
|
||
if (ptr != NULL) {
|
||
if (ptr != nullptr) {
|
||
found = *ptr;
|
||
if (dest) {
|
||
*ptr = '\0';
|
||
... | ... | |
remove_leading_trailing_spaces(dest);
|
||
}
|
||
*buf = strpbrk(*buf, delimiters);
|
||
if (*buf != NULL) {
|
||
if (*buf != nullptr) {
|
||
(*buf)++; /* Skip delimiter */
|
||
} else {
|
||
}
|
||
} else {
|
||
*buf = NULL;
|
||
*buf = nullptr;
|
||
}
|
||
return found;
|
||
... | ... | |
****************************************************************************/
|
||
void array_shuffle(int *array, int n)
|
||
{
|
||
if (n > 1 && array != NULL) {
|
||
if (n > 1 && array != nullptr) {
|
||
int i, j, t;
|
||
for (i = 0; i < n - 1; i++) {
|
||
... | ... | |
if ('\0' != jump_to) {
|
||
/* Jump to next matching charather. */
|
||
test = strchr(test, jump_to);
|
||
if (NULL == test) {
|
||
if (test == nullptr) {
|
||
/* No match. */
|
||
return FALSE;
|
||
}
|
||
... | ... | |
/* Find the end of the pattern. */
|
||
while (TRUE) {
|
||
*pattern = strchr(*pattern, ']');
|
||
if (NULL == *pattern) {
|
||
if (*pattern == nullptr) {
|
||
/* Wildcard format error. */
|
||
return FALSE;
|
||
} else if (*(*pattern - 1) != '\\') {
|
||
... | ... | |
memset(escapes, 0, max_escapes);
|
||
format = strchr(format, '%');
|
||
while (NULL != format) {
|
||
while (format != nullptr) {
|
||
format++;
|
||
if ('%' == *format) {
|
||
/* Double, not a sequence. */
|
||
... | ... | |
}
|
||
while ('\0' != *format
|
||
&& NULL == strchr(format_escapes, *format)) {
|
||
&& strchr(format_escapes, *format) == nullptr) {
|
||
format++;
|
||
}
|
||
escapes[idx] = *format;
|
utility/shared.h | ||
---|---|---|
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
|
||
#define ADD_TO_POINTER(p, n) ((void *)((char *)(p)+(n)))
|
||
#define FC_MEMBER(type, member) (((type *) NULL)->member)
|
||
#define FC_MEMBER(type, member) (((type *) nullptr)->member)
|
||
#define FC_MEMBER_OFFSETOF(type, member) ((size_t) &FC_MEMBER(type, member))
|
||
#define FC_MEMBER_SIZEOF(type, member) sizeof(FC_MEMBER(type, member))
|
||
#define FC_MEMBER_ARRAY_SIZE(type, member) \
|