diff options
author | dzwdz | 2022-09-03 23:41:17 +0200 |
---|---|---|
committer | dzwdz | 2022-09-03 23:41:17 +0200 |
commit | d73c5ac9891ea3a88fa6a5ec1339df1f5cdf1a49 (patch) | |
tree | d7a6ea63772d9bcf2c27e9a6eaa4989f2ea1c175 /src/user/lib | |
parent | ecc54f4be44fa1fd1ce79b0458a04eef2667cba8 (diff) |
user/libc: generate strerror from camellia/errno.h
Diffstat (limited to 'src/user/lib')
-rw-r--r-- | src/user/lib/include/__errno.h | 16 | ||||
-rw-r--r-- | src/user/lib/include/__errno.h.awk | 20 | ||||
-rw-r--r-- | src/user/lib/stdio/misc.c | 2 | ||||
-rw-r--r-- | src/user/lib/string/strerror.c | 11 | ||||
-rw-r--r-- | src/user/lib/string/string.c (renamed from src/user/lib/string.c) | 6 |
5 files changed, 48 insertions, 7 deletions
diff --git a/src/user/lib/include/__errno.h b/src/user/lib/include/__errno.h new file mode 100644 index 0000000..d6d5e6a --- /dev/null +++ b/src/user/lib/include/__errno.h @@ -0,0 +1,16 @@ +/* generated by awk */ +#ifdef E +E( 1, "EGENERIC unknown error") +E( 2, "EFAULT") +E( 3, "EBADF bad file descriptor") +E( 4, "EINVAL") +E( 5, "ENOSYS unsupported") +E( 6, "ERANGE") +E( 7, "ENOMEM") +E( 8, "ENOENT") +E( 9, "ENOTEMPTY") +E( 10, "EACCES") +E( 11, "EMFILE all file descriptors taken") +E( 12, "ECONNRESET") +E(200, "EISDIR") +#endif diff --git a/src/user/lib/include/__errno.h.awk b/src/user/lib/include/__errno.h.awk new file mode 100644 index 0000000..6232835 --- /dev/null +++ b/src/user/lib/include/__errno.h.awk @@ -0,0 +1,20 @@ +BEGIN { + print "/* generated by awk */"; + print "#ifdef E"; +} + +END { + print "#endif"; +} + +/#define/ { + comment = $2; + num = $3; + # extract the comment, if present + if (index($0, "/*")) { + sub(/[^/]*\/\*/, ""); + sub(/ *\*\//, ""); + comment = comment $0; + } + printf "E(%3s, \"%s\")\n", num, comment; +} diff --git a/src/user/lib/stdio/misc.c b/src/user/lib/stdio/misc.c index a140ee4..45144f3 100644 --- a/src/user/lib/stdio/misc.c +++ b/src/user/lib/stdio/misc.c @@ -5,7 +5,7 @@ void perror(const char *s) { if (s) fprintf(stderr, "%s: ", s); - fprintf(stderr, "errno %d\n", errno); + fprintf(stderr, "%s\n", strerror(errno)); } int puts(const char *s) { diff --git a/src/user/lib/string/strerror.c b/src/user/lib/string/strerror.c new file mode 100644 index 0000000..1f5fc29 --- /dev/null +++ b/src/user/lib/string/strerror.c @@ -0,0 +1,11 @@ +#include <string.h> + +static const char *errstr[] = { +# define E(n, str) [n] = str, +# include <__errno.h> +# undef E +}; + +char *strerror(int n) { + return (char*)(errstr[n] ? errstr[n] : "unknown error"); +} diff --git a/src/user/lib/string.c b/src/user/lib/string/string.c index fa9c0ca..f141a3d 100644 --- a/src/user/lib/string.c +++ b/src/user/lib/string/string.c @@ -151,12 +151,6 @@ char *strdup(const char *s) { return buf; } -// TODO strerror mapping -char *strerror(int errnum) { - (void)errnum; - return "unknown error"; -} - /* strings.h */ int strcasecmp(const char *s1, const char *s2) { return strncasecmp(s1, s2, ~0); |