diff options
| -rw-r--r-- | src/errno/__strerror.h | 13 | ||||
| -rw-r--r-- | src/errno/strerror.c | 41 | 
2 files changed, 32 insertions, 22 deletions
| diff --git a/src/errno/__strerror.h b/src/errno/__strerror.h index 2f04d400..2d992da5 100644 --- a/src/errno/__strerror.h +++ b/src/errno/__strerror.h @@ -1,8 +1,9 @@ -/* This file is sorted such that 'errors' which represent exceptional - * conditions under which a correct program may fail come first, followed - * by messages that indicate an incorrect program or system failure. The - * macro E() along with double-inclusion is used to ensure that ordering - * of the strings remains synchronized. */ +/* The first entry is a catch-all for codes not enumerated here. + * This file is included multiple times to declare and define a structure + * with these messages, and then to define a lookup table translating + * error codes to offsets of corresponding fields in the structure. */ + +E(0,            "No error information")  E(EILSEQ,       "Illegal byte sequence")  E(EDOM,         "Domain error") @@ -101,5 +102,3 @@ E(EDQUOT,       "Quota exceeded")  E(ENOMEDIUM,    "No medium found")  E(EMEDIUMTYPE,  "Wrong medium type")  E(EMULTIHOP,    "Multihop attempted") - -E(0,            "No error information") diff --git a/src/errno/strerror.c b/src/errno/strerror.c index e3ed771a..7f926432 100644 --- a/src/errno/strerror.c +++ b/src/errno/strerror.c @@ -1,30 +1,41 @@  #include <errno.h> +#include <stddef.h>  #include <string.h>  #include "locale_impl.h" -#define E(a,b) ((unsigned char)a), -static const unsigned char errid[] = { +/* mips has one error code outside of the 8-bit range due to a + * historical typo, so we just remap it. */ +#if EDQUOT==1133 +#define EDQUOT_ORIG 1133 +#undef  EDQUOT +#define EDQUOT 109 +#endif + +static const struct errmsgstr_t { +#define E(n, s) char str##n[sizeof(s)]; +#include "__strerror.h" +#undef E +} errmsgstr = { +#define E(n, s) s,  #include "__strerror.h" +#undef E  }; -#undef E -#define E(a,b) b "\0" -static const char errmsg[] = +static const unsigned short errmsgidx[] = { +#define E(n, s) [n] = offsetof(struct errmsgstr_t, str##n),  #include "__strerror.h" -; +#undef E +};  char *__strerror_l(int e, locale_t loc)  {  	const char *s; -	int i; -	/* mips has one error code outside of the 8-bit range due to a -	 * historical typo, so we just remap it. */ -	if (EDQUOT==1133) { -		if (e==109) e=-1; -		else if (e==EDQUOT) e=109; -	} -	for (i=0; errid[i] && errid[i] != e; i++); -	for (s=errmsg; i; s++, i--) for (; *s; s++); +#ifdef EDQUOT_ORIG +	if (e==EDQUOT) e=0; +	else if (e==EDQUOT_ORIG) e=EDQUOT; +#endif +	if (e >= sizeof errmsgidx / sizeof *errmsgidx) e = 0; +	s = (char *)&errmsgstr + errmsgidx[e];  	return (char *)LCTRANS(s, LC_MESSAGES, loc);  } | 
