Skip to content

Commit

Permalink
sys/tiny_strerror: fix compilation on LLVM
Browse files Browse the repository at this point in the history
Mixing address spaces is something LLVM doesn't like (for good
reason). This re-organized the code a bit so that this does not
happen anymore, even on AVR.

Split out of RIOT-OS#16924
  • Loading branch information
maribu committed Mar 19, 2024
1 parent 1c036e0 commit 2208c83
Showing 1 changed file with 18 additions and 19 deletions.
37 changes: 18 additions & 19 deletions sys/tiny_strerror/tiny_strerror.c
Original file line number Diff line number Diff line change
Expand Up @@ -215,37 +215,36 @@ static FLASH_ATTR const char * FLASH_ATTR const lookup[] = {

const char *tiny_strerror(int errnum)
{
/* dark magic: All error strings start with a "-". For positive error codes
* an offset of 1 is added to the address of the string, jumping one char
* behind the "-". This way the strings do not have to be allocated twice
* (once with and once without minus char).
*/
const char *retval = "-unknown";
unsigned offset = 1;

if (IS_USED(MODULE_TINY_STRERROR_MINIMAL)) {
static char buf[4];
snprintf(buf, sizeof(buf), "%d", errnum);
return buf;
}

if (((unsigned)errnum >= ARRAY_SIZE(lookup))
|| (lookup[(unsigned)errnum] == NULL)) {
return "unknown";
}

/* dark magic: All error strings start with a "-". For positive error codes
* an offset of 1 is added to the address of the string, jumping one char
* behind the "-". This way the strings do not have to be allocated twice
* (once with and once without minus char).
*/
unsigned offset = 1;
if (errnum <= 0) {
offset = 0;
errnum = -errnum;
}

if (((unsigned)errnum < ARRAY_SIZE(lookup))
&& (lookup[(unsigned)errnum] != NULL)) {
retval = lookup[(unsigned)errnum];
}

if (IS_ACTIVE(HAS_FLASH_UTILS_ARCH)) {
static char buf[16];
flash_strncpy(buf, retval + offset, sizeof(buf));
return buf;
}

return retval + offset;
#if IS_ACTIVE(HAS_FLASH_UTILS_ARCH)
static char buf[16];
flash_strncpy(buf, lookup[(unsigned)errnum] + offset, sizeof(buf));
return buf;
#else
return lookup[(unsigned)errnum] + offset;
#endif
}

#if IS_USED(MODULE_TINY_STRERROR_AS_STRERROR)
Expand Down

0 comments on commit 2208c83

Please sign in to comment.