diff options
Diffstat (limited to 'LibC/string.cpp')
-rw-r--r-- | LibC/string.cpp | 67 |
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]; + } } |