From cbd551e8a326c56472f1423b298cd032711578a4 Mon Sep 17 00:00:00 2001 From: Xavier Del Campo Romero Date: Sun, 24 Oct 2021 02:50:44 +0200 Subject: [PATCH] Provide implementations for strtoul(3) and strtoull(3) --- libpsx/include/stdlib.h | 2 ++ libpsx/src/libc/string.c | 61 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/libpsx/include/stdlib.h b/libpsx/include/stdlib.h index 099abbd..661495a 100644 --- a/libpsx/include/stdlib.h +++ b/libpsx/include/stdlib.h @@ -52,6 +52,8 @@ void *realloc(void *buf , size_t n); int abs(int x); long long strtoll(const char *nptr, char **endptr, int base); +unsigned long long strtoull(const char *nptr, char **endptr, int base); +unsigned long strtoul(const char *nptr, char **endptr, int base); long strtol(const char *nptr, char **endptr, int base); double strtod(const char *nptr, char **endptr); long double strtold(const char *nptr, char **endptr); diff --git a/libpsx/src/libc/string.c b/libpsx/src/libc/string.c index ab85a42..9b9fbb1 100644 --- a/libpsx/src/libc/string.c +++ b/libpsx/src/libc/string.c @@ -330,11 +330,72 @@ long long strtoll(const char *nptr, char **endptr, int base) return n?-r:r; } +unsigned long long strtoull(const char *nptr, char **endptr, int base) +{ + int r = 0; + int t = 0; + int n = 0; + + while(*nptr && isspace(*nptr)) + nptr++; + + if(base == 0) + { + if(*nptr == '0') + base = 8; + else + base = 10; + } + + if(!(base >= 2 && base <= 36)) + return 0; + + if(base == 16 && *nptr == '0') + { + if(*(nptr+1) == 'x' || *(nptr+1) == 'X') + nptr+=2; + } + + while(*nptr) + { + switch(*nptr) + { + case '0'...'9': + t = *nptr - '0'; + break; + case 'a' ... 'z': + t = (*nptr - 'a') + 10; + break; + case 'A' ... 'Z': + t = (*nptr - 'A') + 10; + break; + default: + t = 1000; + break; + } + + if(t>=base) + break; + + r*=base; + r+=t; + nptr++; + } + + if(endptr)*endptr = (char*)nptr; + return n?-r:r; +} + long strtol(const char *nptr, char **endptr, int base) { return (long)strtoll(nptr, endptr, base); } +unsigned long strtoul(const char *nptr, char **endptr, int base) +{ + return strtoull(nptr, endptr, base); +} + double strtod(const char *nptr, char **endptr) { char strbuf[64];