uppercase_dup() was copying SRC to DST and converting DST to uppercase. Now it converts to uppercase while copying.
find_enumeration() was calling strlen() on the whole string before checking for the '.' character in a loop. Now it uses strchr(). --- src/scanner.c | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/src/scanner.c b/src/scanner.c index c512d23..1c67a4e 100644 --- a/src/scanner.c +++ b/src/scanner.c @@ -289,13 +289,10 @@ xstrdup(const char *s) static char * uppercase_dup(const char *src) { - char *u; - int i; + char *u, *dst; - u = xstrdup(src); - for (i = 0; u[i]; i++) - u[i] = toupper(u[i]); - u[i] = '\0'; + dst = u = fail_on_null(malloc(strlen(src) + 1)); + while ((*dst++ = toupper(*src++))); return u; } @@ -915,13 +912,11 @@ find_enumeration(struct protocol *protocol, struct interface *i; struct enumeration *e; char *enum_name; - uint32_t idx = 0, j; + uintptr_t idx; - for (j = 0; j + 1 < strlen(enum_attribute); j++) { - if (enum_attribute[j] == '.') { - idx = j; - } - } + idx = (uintptr_t)strchr(enum_attribute, '.'); + if (idx && *((char *)idx + 1) != '\0') { + idx = idx - (uintptr_t)enum_attribute; - - if (idx > 0) { enum_name = enum_attribute + idx + 1; -- 2.43.0