diff options
Diffstat (limited to 'src/config.c')
-rw-r--r-- | src/config.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/src/config.c b/src/config.c index 3acdbdd..daf6474 100644 --- a/src/config.c +++ b/src/config.c @@ -885,16 +885,23 @@ bool parse_bool(const char *filename, size_t lineno, const char *str, bool *err) uint32_t parse_char(const char *filename, size_t lineno, const char *str, bool *err) { uint32_t ch = U'\0'; + if (*str == '\0') { + return ch; + } + if (!utf8_validate(str)) { + PARSE_ERROR(filename, lineno, "Invalid UTF-8 string \"%s\".\n", str); + if (err) { + *err = true; + } + return ch; + } char *tmp = utf8_compose(str); - if (tmp == NULL) { + ch = utf8_to_utf32_validate(tmp); + if (ch == (uint32_t)-2 || ch == (uint32_t)-1 || *utf8_next_char(tmp) != '\0') { PARSE_ERROR(filename, lineno, "Failed to parse \"%s\" as a character.\n", str); - } else { - ch = utf8_to_utf32_validate(tmp); - if (ch == (uint32_t)-2 || ch == (uint32_t)-1 || *utf8_next_char(tmp) != '\0') { - PARSE_ERROR(filename, lineno, "Failed to parse \"%s\" as a character.\n", str); - } - free(tmp); } + free(tmp); + return ch; } |