On Wed 2019-08-28 21:18:37, Uwe Kleine-König wrote: > Hello Petr, > > On 8/28/19 1:32 PM, Petr Mladek wrote: > > On Tue 2019-08-27 23:12:44, Uwe Kleine-König wrote: > >> Petr Mladek had some concerns: > >>> There are ideas to make the code even more tricky to reduce > >>> the size, keep it fast. > >> > >> I think Enrico Weigelt's suggestion to use a case is the best > >> performance-wise so that's what I picked up. Also I hope that > >> performance isn't that important because the need to print an error > >> should not be so common that it really hurts in production. This is contadicting. The "best" performance-wise solution was choosen in favor of space. The next sentence says that performance is not important. > > I personally do not like switch/case. It is a lot of code. > > I wonder if it even saved some space. > > I guess we have to die either way. Either it is quick or it is space > efficient. I am more concerned about the size. Well, array of strings will be both fast and size efficient. > With the big case I trust the compiler to pick something > sensible expecting that it adapts for example to -Osize. I am not sure what are the expectations here. I can't imagine another translation than: if (val == 1) str = "EPERM"; else if (val == 2) str = "ENOENT" else if (val == 3) str = "ESRCH" ... It means that all constans will be hardcoded in the code instead of in data section. Plus there will be instructions for each if/else part. > > If you want to safe space, I would use u16 to store the numbers. > > Or I would use array of strings. There will be only few holes. > > > > You might also consider handling only the most commonly > > used codes from errno.h and errno-base.h (1..133). There will > > be no holes and the codes are stable. > > I'd like to postpone the discussion about "how" until we agreed about > the "if at all". It seems that all people like this feature. BTW: I though more about generating or cut&pasting the arrary. I can't find any reasonable way how to generate it. But both, errno.h and errno-base.h, are super stable. Only comments were modified or new codes added. Most of them are defined by POSIX so they should remain stable. Therefore cut&pasted array of strings looks acceptable. We should only allow to easily check numbers for each code, e.g. by defining the array as const err_str * [] { "0" /* 0 Success */ "EPERM", /* 1 Operation not permitted */ "ENOENT", /* 2 No such file or directory */ "ESRCH", /* 3 No such process */ ... If there is a hole, we could use something like: "-41", /* 41 Skipped. EWOULDBLOCK is defined as EAGAIN. Operation would block */ Best Regards, Petr