#include #include #include /* mips has one error code outside of the 8-bit range due to a * historical typo, so we just remap it. */ #define MIPSACCIDENT 1133 #if EDQUOT==MIPSACCIDENT # define MIPSSPECIAL (MIPSACCIDENT&0xFF) # undef EDQUOT # define EDQUOT MIPSSPECIAL #else # define MIPSSPECIAL 0 #endif #define E(a,b) char _err ## a[sizeof b]; struct errstruct { #include "__strerror.h" }; #undef E #define E(a,b) ._err ## a = { b }, static const struct errstruct errmsg = { #include "__strerror.h" }; #undef E #define E(a,b) [a] = offsetof(struct errstruct, _err ## a), static const unsigned short erroffset[] = { #include "__strerror.h" }; enum { errmax = (sizeof erroffset)/(sizeof erroffset[0]), }; char *strerror(int e) { if (MIPSSPECIAL) { switch (e) { /* would be simpler if _err0 would be first field */ case MIPSSPECIAL: return (char*)errmsg._err0; case MIPSACCIDENT: e=MIPSSPECIAL; break; } } /* would be simpler if _err0 would be first field */ if (((unsigned)e >= (unsigned)errmax) || !erroffset[e]) e = 0; return erroffset[e] + (char*)&errmsg; }