[CRT]
authorChristoph von Wittich <christoph_vw@reactos.org>
Mon, 27 Dec 2010 12:45:03 +0000 (12:45 +0000)
committerChristoph von Wittich <christoph_vw@reactos.org>
Mon, 27 Dec 2010 12:45:03 +0000 (12:45 +0000)
import strtoi64 from wine 1.3.10

svn path=/trunk/; revision=50159

reactos/lib/sdk/crt/string/strtoi64.c

index 96260b6..59e8c29 100644 (file)
@@ -4,8 +4,62 @@
 __int64
 _strtoi64(const char *nptr, char **endptr, int base)
 {
 __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;
 }
 
 
 }