Author: cwittich Date: Mon Dec 27 12:45:03 2010 New Revision: 50159
URL: http://svn.reactos.org/svn/reactos?rev=50159&view=rev Log: [CRT] import strtoi64 from wine 1.3.10
Modified: trunk/reactos/lib/sdk/crt/string/strtoi64.c
Modified: trunk/reactos/lib/sdk/crt/string/strtoi64.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/sdk/crt/string/strtoi64... ============================================================================== --- trunk/reactos/lib/sdk/crt/string/strtoi64.c [iso-8859-1] (original) +++ trunk/reactos/lib/sdk/crt/string/strtoi64.c [iso-8859-1] Mon Dec 27 12:45:03 2010 @@ -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; }