From fdea91b64cdc963bf857f5e5943d4eb8a917e7ee Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Mon, 27 Dec 2010 12:45:03 +0000 Subject: [PATCH] [CRT] import strtoi64 from wine 1.3.10 svn path=/trunk/; revision=50159 --- reactos/lib/sdk/crt/string/strtoi64.c | 58 ++++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 2 deletions(-) diff --git a/reactos/lib/sdk/crt/string/strtoi64.c b/reactos/lib/sdk/crt/string/strtoi64.c index 96260b6efbb..59e8c29a45c 100644 --- a/reactos/lib/sdk/crt/string/strtoi64.c +++ b/reactos/lib/sdk/crt/string/strtoi64.c @@ -4,8 +4,62 @@ __int64 _strtoi64(const char *nptr, char **endptr, int base) { - TRACE("_strtoi64 is UNIMPLEMENTED\n"); - return 0; + BOOL negative = FALSE; + __int64 ret = 0; + + while(isspace(*nptr)) nptr++; + + if(*nptr == '-') { + negative = TRUE; + nptr++; + } else if(*nptr == '+') + nptr++; + + if((base==0 || base==16) && *nptr=='0' && tolower(*(nptr+1))=='x') { + base = 16; + nptr += 2; + } + + if(base == 0) { + if(*nptr=='0') + base = 8; + else + base = 10; + } + + while(*nptr) { + char cur = tolower(*nptr); + int v; + + if(isdigit(cur)) { + if(cur >= '0'+base) + break; + v = cur-'0'; + } else { + if(cur<'a' || cur>='a'+base-10) + break; + v = cur-'a'+10; + } + + if(negative) + v = -v; + + nptr++; + + if(!negative && (ret>_I64_MAX/base || ret*base>_I64_MAX-v)) { + ret = _I64_MAX; + *_errno() = ERANGE; + } else if(negative && (ret<_I64_MIN/base || ret*base<_I64_MIN-v)) { + ret = _I64_MIN; + *_errno() = ERANGE; + } else + ret = ret*base + v; + } + + if(endptr) + *endptr = (char*)nptr; + + return ret; }