[PATCH] scanner.c: prefer strchr() over for loop and toupper() in place

Thiago Macieira thiago at kde.org
Tue Jan 9 18:14:07 UTC 2024

On Wednesday, 3 January 2024 02:48:26 -03 James Tirta Halim wrote:
> -       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));

This does have the advantage of not writing to every byte twice, just once.

However, the big elephant in the room is that:

> +       while ((*dst++ = toupper(*src++)));

You're violating the rule of use of toupper/tolower: NEVER. Those functions 
have a design flaw that they operate on bytes, not on full strings. Uppercasing 
and lowercasing need to see more than one byte to be accomplished correctly.

Moreover, those two functions are locale-dependent, so the output of this 
function is also locale-dependent, something that the scanner probably 
shouldn't be. Try testing the tool with an 8-bit Turkish locale to see what 

I suggest you ditch toupper() in the first place and just do the ASCII 
uppercasing manually.

PS: I suggest either moving the ; to the next line or using brackets to make 
it evidently clear that you intended an empty while loop.

Thiago Macieira - thiago (AT) macieira.info - thiago (AT) kde.org
   Software Architect - Intel DCAI Cloud Engineering

More information about the wayland-devel mailing list