summaryrefslogtreecommitdiff
path: root/LibC/string.cpp
diff options
context:
space:
mode:
authorAndreas Kling <awesomekling@gmail.com>2018-11-06 14:13:16 +0100
committerAndreas Kling <awesomekling@gmail.com>2018-11-06 14:42:28 +0100
commit8d1f8b2518d17e90ec8e28fff64c22361b0b0c1b (patch)
treeb60b2307559a1b7b82aebcc16e4f57687ad7639b /LibC/string.cpp
parentb2d23f83ab04ee1e7ca5d16ec32416939077bc4c (diff)
downloadserenity-8d1f8b2518d17e90ec8e28fff64c22361b0b0c1b.zip
Add sys_nerr and sys_errlist.
Also keep the canonical errno list in LibC for now. The kernel gets it from there. This makes building 3rd party code easier. ..also fix broken strchr().
Diffstat (limited to 'LibC/string.cpp')
-rw-r--r--LibC/string.cpp67
1 files changed, 20 insertions, 47 deletions
diff --git a/LibC/string.cpp b/LibC/string.cpp
index f66b0613c2..3f5fafb1bc 100644
--- a/LibC/string.cpp
+++ b/LibC/string.cpp
@@ -115,12 +115,13 @@ char* strncpy(char* dest, const char* src, size_t n)
char* strchr(const char* str, int c)
{
- if (!str)
- return nullptr;
- char* ptr = (char*)str;
- while (*ptr && *ptr != c)
- ++ptr;
- return ptr;
+ char ch = c;
+ for (;; ++str) {
+ if (*str == ch)
+ return (char*)str;
+ if (!*str)
+ return nullptr;
+ }
}
char* strrchr(const char* str, int ch)
@@ -154,50 +155,22 @@ char* strncat(char *dest, const char *src, size_t n)
return dest;
}
+const char* sys_errlist[] = {
+#undef __ERROR
+#define __ERROR(a, b) #b,
+ __ENUMERATE_ALL_ERRORS
+#undef __ERROR
+};
+int sys_nerr = __errno_count;
+
char* strerror(int errnum)
{
- switch (errnum) {
- case 0: return "No error";
- case EPERM: return "Operation not permitted";
- case ENOENT: return "No such file or directory";
- case ESRCH: return "No such process";
- case EINTR: return "Interrupted syscall";
- case EIO: return "I/O error";
- case ENXIO: return "No such device/address";
- case E2BIG: return "Argument list too long";
- case ENOEXEC: return "Exec format error";
- case EBADF: return "Bad fd number";
- case ECHILD: return "No child processes";
- case EAGAIN: return "Try again";
- case ENOMEM: return "Out of memory";
- case EACCES: return "Access denied";
- case EFAULT: return "Bad address";
- case ENOTBLK: return "Not a block device";
- case EBUSY: return "Resource busy";
- case EEXIST: return "File already exists";
- case EXDEV: return "Cross-device link";
- case ENODEV: return "No such device";
- case ENOTDIR: return "Not a directory";
- case EISDIR: return "Is a directory";
- case EINVAL: return "Invalid argument";
- case ENFILE: return "File table overflow";
- case EMFILE: return "Too many open files";
- case ENOTTY: return "Not a TTY";
- case ETXTBSY: return "Text file busy";
- case EFBIG: return "File too big";
- case ENOSPC: return "No space left";
- case ESPIPE: return "Illegal seek";
- case EROFS: return "File system is read-only";
- case EMLINK: return "Too many links";
- case EPIPE: return "Broken pipe";
- case EDOM: return "Math argument out of domain";
- case ERANGE: return "Math result not representable";
- case ENAMETOOLONG: return "Name too long";
- case EOVERFLOW: return "Value too large for data type";
- case ENOTIMPL: return "Not implemented";
+ if (errnum >= __errno_count) {
+ printf("strerror() missing string for errnum=%d\n", errnum);
+ return "Unknown error";
}
- printf("strerror() missing string for errnum=%d\n", errnum);
- return "Unknown error";
+ return (char*)sys_errlist[errnum];
+
}
}