summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Kaivo <jkk@ung.org>2020-04-09 09:40:35 -0400
committerJakob Kaivo <jkk@ung.org>2020-04-09 09:40:35 -0400
commit683249bd8b7cb762dc848456e3145252ba5cf6fc (patch)
tree7f5622893c8edda3ce307d70af9621702552f190
parentfada1a67c40ea39a1f6ebec382070b4f2cdd6b7b (diff)
allow specifying errors by symbolic name
-rw-r--r--strerror.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/strerror.c b/strerror.c
index 0e0359b..820d78c 100644
--- a/strerror.c
+++ b/strerror.c
@@ -1,6 +1,8 @@
#define _XOPEN_SOURCE 700
+#include <ctype.h>
#include <string.h>
#include <stdio.h>
+#include <strings.h>
#include <stdlib.h>
#include "strerror.h"
@@ -13,6 +15,16 @@ const char *errname(int err)
return "-";
}
+int errnum(const char *name)
+{
+ for (int i = 0; i < sizeof(errlist) / sizeof(errlist[0]); i++) {
+ if (errlist[i] && !strcasecmp(name, errlist[i])) {
+ return i;
+ }
+ }
+ return -1;
+}
+
int main(int argc, char *argv[])
{
int n = 1;
@@ -23,8 +35,18 @@ int main(int argc, char *argv[])
}
do {
- int err = atoi(argv[n]);
- printf("%d: %s [%s]\n", err, strerror(err), errname(err));
+ int err = -1;
+ if (toupper(argv[n][0]) == 'E') {
+ err = errnum(argv[n]);
+ } else {
+ err = atoi(argv[n]);
+ }
+
+ if (err == -1) {
+ fprintf(stderr, "%s: %s: unknown error code\n", argv[0], argv[n]);
+ } else {
+ printf("%d: %s [%s]\n", err, strerror(err), errname(err));
+ }
} while (argv[++n]);
return 0;