On Fri, Aug 02, 2024 at 05:48:13PM +0200, Thomas Weißschuh wrote: > > With all these libc functionality added, it isn't nolibc looks like :) > > Well :-) > > The main motivation is to provide kselftests compatibility. > Maybe Willy disagrees. No no I'm perfectly fine with adding the functions that developers use or need to write their test or init tools. I don't have any strong opinion on scanf(). Just like strtok(), I stopped using it 25 years ago when I noticed that it never survives code evolutions, lacks a lot of flexibility and is often strongly tied to your types (more than printf where you can cast). But I perfectly understand that others are used to it and would appreciate to have it, for example if it helps with command line arguments. > > > +static int test_scanf(void) > > > +{ > > > + unsigned long long ull; > > > + unsigned long ul; > > > + unsigned int u; > > > + long long ll; > > > + long l; > > > + void *p; > > > + int i; > > > + > > > + if (sscanf("", "foo") != EOF) > > > + return 1; > > > + > > > + if (sscanf("foo", "foo") != 0) > > > + return 2; > > > + > > > + if (sscanf("123", "%d", &i) != 1) > > > + return 3; > > > + > > > + if (i != 123) > > > + return 4; > > > + > > > + if (sscanf("a123b456c0x90", "a%db%uc%p", &i, &u, &p) != 3) > > > + return 5; > > > + > > > + if (i != 123) > > > + return 6; > > > + > > > + if (u != 456) > > > + return 7; > > > + > > > + if (p != (void *)0x90) > > > + return 8; > > > + > > > + if (sscanf("a b1", "a b%d", &i) != 1) > > > + return 9; > > > + > > > + if (i != 1) > > > + return 10; > > > + > > > + if (sscanf("a%1", "a%%%d", &i) != 1) > > > + return 11; > > > + > > > + if (i != 1) > > > + return 12; > > > + > > > + if (sscanf("1|2|3|4|5|6", > > > + "%d|%ld|%lld|%u|%lu|%llu", > > > + &i, &l, &ll, &u, &ul, &ull) != 6) > > > + return 13; > > > + > > > + if (i != 1 || l != 2 || ll != 3 || > > > + u != 4 || ul != 5 || ull != 6) > > > + return 14; > > > + > > > + return 0; > > > > Can we simplify this code? It is hard to read code with too > > many conditions. Maybe defining an array test conditions > > instead of a series ifs. > > I tried that and didn't find a way. > Any pointers are welcome. I think it would be difficult by nature of varargs. However, since you grouped some expressions, maybe a one-liner comment between each scanf() to explain the intent of the test would make it easier to follow. E.g: /* test multiple naked numbers */ ... /* test numbers delimited with a character */ ... /* test multiple integer types at once */ etc. This allows the reviewer to more easly re-focus on the test they were reading. Willy