提交 8343334d 编写于 作者: T Timo Teräs 提交者: Rich Felker

improve strerror speed

change the current O(n) lookup to O(1) based on the machinery
described in "How To Write Shared Libraries" (Appendix B).
上级 2b2c8aaf
/* 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")
#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);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册