X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FLibraries%2Flibc.so_src%2Fstdlib.c;h=e15f49b420a7f32f68c9bdd61b05ca5090d86038;hb=05c45f4a7cf476f6e5d76df2307710d15cd18eb9;hp=c91106c4070c72bf1008599ce0dc980338ce7902;hpb=158abc6bf2479b03c9de96813df216109a8a7bc7;p=tpg%2Facess2.git diff --git a/Usermode/Libraries/libc.so_src/stdlib.c b/Usermode/Libraries/libc.so_src/stdlib.c index c91106c4..e15f49b4 100644 --- a/Usermode/Libraries/libc.so_src/stdlib.c +++ b/Usermode/Libraries/libc.so_src/stdlib.c @@ -48,7 +48,7 @@ EXPORT void exit(int status) */ EXPORT void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *)) { - int i, j, min; + size_t i, j, min; // With 0 items, there's nothing to do and with 1 its already sorted if(nmemb == 0 || nmemb == 1) return; @@ -71,9 +71,8 @@ EXPORT void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void } } -EXPORT long long strtoll(const char *str, char **end, int base) +EXPORT unsigned long long strtoull(const char *str, char **end, int base) { - int neg = 0; long long ret = 0; if( !str || base < 0 || base > 36 || base == 1 ) { @@ -86,12 +85,6 @@ EXPORT long long strtoll(const char *str, char **end, int base) while( isspace(*str) ) str++; - // Check for negative (or positive) sign - if(*str == '-' || *str == '+') { - neg = (*str == '-'); - str++; - } - if( base == 0 || base == 16 ) { if( *str == '0' && str[1] == 'x' ) { str += 2; @@ -129,14 +122,50 @@ EXPORT long long strtoll(const char *str, char **end, int base) str ++; } - if( neg ) - ret = -ret; - if(end) *end = (char*)str; return ret; } +EXPORT unsigned long strtoul(const char *ptr, char **end, int base) +{ + unsigned long long tmp = strtoull(ptr, end, base); + + if( tmp > ULONG_MAX ) { + errno = ERANGE; + return ULONG_MAX; + } + + return tmp; +} + +EXPORT long long strtoll(const char *str, char **end, int base) +{ + int neg = 0; + unsigned long long ret; + + if( !str ) { + errno = EINVAL; + return 0; + } + + while( isspace(*str) ) + str++; + + // Check for negative (or positive) sign + if(*str == '-' || *str == '+') { + neg = (*str == '-'); + str++; + } + + ret = strtoull(str, end, base); + + if( neg ) + return -ret; + else + return ret; +} + EXPORT long strtol(const char *str, char **end, int base) { long long tmp = strtoll(str, end, base);