On Tue, Jun 22, 2021 at 2:19 AM Herbert Xu <herbert@xxxxxxxxxxxxxxxxxxx> wrote: > On Mon, Jun 21, 2021 at 04:21:40PM +0200, Denys Vlasenko wrote: > > > - } while (!subtype && is_digit(c)); > > > + } while ((subtype <= 0 || subtype >= VSLENGTH) && > > > + is_digit(c)); > > > > ... you use (subtype == 0 || subtype == VSLENGTH) here. > > Also, (subtype == 0 || subtype == VSLENGTH) is less confusing: > > it says "loop if ${VAR} or ${#VAR} syntax", whereas <= >= > > are a bit misleading. > > Yes it looks a bit confusing, but it turns into a single branch > instead of two. Yes, I know that. Compiler turns it into "(unsigned)(x-1) >= VSLENGTH-1" expression. But is it worth the obfuscation? Especially that it also has another downside (it requires an additional free CPU register to hold (x-1) result, which can force compiler to spill other values to stack).