mirror of
https://github.com/systemd/systemd.git
synced 2025-01-10 05:18:17 +03:00
conf-parser: several cleanups for DEFINE_CONFIG_PARSE_ENUMV() macro
- use GREEDY_REALLOC() and FOREACH_ARRAY(), - do not set an array with only terminating 'invalid' value. Note, this macro is only used by parsing NamePolicy= and AlternativeNamesPolicy= in .link files. and udevd correctly handles both an empty array and an array with only 'invalid'. Hence, this does not change any behavior.
This commit is contained in:
parent
42efe5be1d
commit
3c8dc3a3e0
@ -384,22 +384,14 @@ typedef enum ConfigParseStringFlags {
|
|||||||
CONFIG_PARSER_PROTOTYPE(function) { \
|
CONFIG_PARSER_PROTOTYPE(function) { \
|
||||||
type **enums = ASSERT_PTR(data); \
|
type **enums = ASSERT_PTR(data); \
|
||||||
_cleanup_free_ type *xs = NULL; \
|
_cleanup_free_ type *xs = NULL; \
|
||||||
size_t i = 0; \
|
size_t n = 0; \
|
||||||
int r; \
|
int r; \
|
||||||
\
|
\
|
||||||
assert(filename); \
|
|
||||||
assert(lvalue); \
|
assert(lvalue); \
|
||||||
assert(rvalue); \
|
|
||||||
\
|
|
||||||
xs = new0(type, 1); \
|
|
||||||
if (!xs) \
|
|
||||||
return -ENOMEM; \
|
|
||||||
\
|
|
||||||
*xs = invalid; \
|
|
||||||
\
|
\
|
||||||
for (const char *p = rvalue;;) { \
|
for (const char *p = rvalue;;) { \
|
||||||
_cleanup_free_ char *en = NULL; \
|
_cleanup_free_ char *en = NULL; \
|
||||||
type x, *new_xs; \
|
type x; \
|
||||||
\
|
\
|
||||||
r = extract_first_word(&p, &en, NULL, 0); \
|
r = extract_first_word(&p, &en, NULL, 0); \
|
||||||
if (r < 0) \
|
if (r < 0) \
|
||||||
@ -415,27 +407,33 @@ typedef enum ConfigParseStringFlags {
|
|||||||
continue; \
|
continue; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
for (type *ys = xs; x != invalid && *ys != invalid; ys++) \
|
FOREACH_ARRAY(i, xs, n) \
|
||||||
if (*ys == x) { \
|
if (*i == x) { \
|
||||||
log_syntax(unit, LOG_NOTICE, filename, line, 0, \
|
log_syntax(unit, LOG_NOTICE, filename, line, 0, \
|
||||||
"Duplicate entry %s in %s=, ignoring.", \
|
"Duplicate entry %s in %s=, ignoring.", \
|
||||||
en, lvalue); \
|
en, lvalue); \
|
||||||
x = invalid; \
|
x = invalid; \
|
||||||
|
break; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
if (x == invalid) \
|
if (x == invalid) \
|
||||||
continue; \
|
continue; \
|
||||||
\
|
\
|
||||||
*(xs + i) = x; \
|
/* Allocate one more for the trailing 'invalid'. */ \
|
||||||
new_xs = realloc(xs, (++i + 1) * sizeof(type)); \
|
if (!GREEDY_REALLOC(xs, n + 2)) \
|
||||||
if (new_xs) \
|
|
||||||
xs = new_xs; \
|
|
||||||
else \
|
|
||||||
return log_oom(); \
|
return log_oom(); \
|
||||||
\
|
\
|
||||||
*(xs + i) = invalid; \
|
xs[n++] = x; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
|
if (n <= 0) { \
|
||||||
|
/* An empty string, or invalid values only. */ \
|
||||||
|
*enums = mfree(*enums); \
|
||||||
|
return 1; \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
/* Terminate with 'invalid' */ \
|
||||||
|
xs[n] = invalid; \
|
||||||
free_and_replace(*enums, xs); \
|
free_and_replace(*enums, xs); \
|
||||||
return 1; \
|
return 1; \
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user