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/strtoi6…
==============================================================================
--- 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;
}