summaryrefslogtreecommitdiff
path: root/LibC/string.cpp
diff options
context:
space:
mode:
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];
+
}
}