Share more duplicated functions
Modified: trunk/reactos/include/ndk/rtlfuncs.h
Modified: trunk/reactos/lib/ntdll/ntdll.xml
Deleted: trunk/reactos/lib/ntdll/stdlib/
Added: trunk/reactos/lib/string/abs.c
Added: trunk/reactos/lib/string/atoi.c
Added: trunk/reactos/lib/string/atoi64.c
Added: trunk/reactos/lib/string/atol.c
Added: trunk/reactos/lib/string/bsearch.c
Added: trunk/reactos/lib/string/itoa.c
Added: trunk/reactos/lib/string/itow.c
Added: trunk/reactos/lib/string/labs.c
Added: trunk/reactos/lib/string/lfind.c
Added: trunk/reactos/lib/string/mbstowcs.c
Added: trunk/reactos/lib/string/rand.c
Added: trunk/reactos/lib/string/splitp.c
Modified: trunk/reactos/lib/string/string.xml
Added: trunk/reactos/lib/string/strtol.c
Added: trunk/reactos/lib/string/strtoul.c
Added: trunk/reactos/lib/string/wcstol.c
Added: trunk/reactos/lib/string/wcstombs.c
Added: trunk/reactos/lib/string/wcstoul.c
Added: trunk/reactos/lib/string/wtoi.c
Added: trunk/reactos/lib/string/wtoi64.c
Added: trunk/reactos/lib/string/wtol.c
Modified: trunk/reactos/ntoskrnl/ntoskrnl.xml
_____
Modified: trunk/reactos/include/ndk/rtlfuncs.h
--- trunk/reactos/include/ndk/rtlfuncs.h 2005-09-08 04:27:02 UTC
(rev 17733)
+++ trunk/reactos/include/ndk/rtlfuncs.h 2005-09-08 05:03:34 UTC
(rev 17734)
@@ -11,6 +11,8 @@
/* DEPENDENCIES
**************************************************************/
#include <ntnls.h>
+#include "extypes.h"
+#include "rtltypes.h"
/* PROTOTYPES
****************************************************************/
_____
Modified: trunk/reactos/lib/ntdll/ntdll.xml
--- trunk/reactos/lib/ntdll/ntdll.xml 2005-09-08 04:27:02 UTC (rev
17733)
+++ trunk/reactos/lib/ntdll/ntdll.xml 2005-09-08 05:03:34 UTC (rev
17734)
@@ -42,27 +42,6 @@
<file>sscanf.c</file>
<file>swprintf.c</file>
</directory>
- <directory name="stdlib">
- <file>abs.c</file>
- <file>atoi64.c</file>
- <file>atoi.c</file>
- <file>atol.c</file>
- <file>bsearch.c</file>
- <file>itoa.c</file>
- <file>itow.c</file>
- <file>labs.c</file>
- <file>lfind.c</file>
- <file>mbstowcs.c</file>
- <file>splitp.c</file>
- <file>strtol.c</file>
- <file>strtoul.c</file>
- <file>wcstol.c</file>
- <file>wcstombs.c</file>
- <file>wcstoul.c</file>
- <file>wtoi64.c</file>
- <file>wtoi.c</file>
- <file>wtol.c</file>
- </directory>
<directory name="def">
<file>ntdll.rc</file>
</directory>
_____
Added: trunk/reactos/lib/string/abs.c
--- trunk/reactos/lib/string/abs.c 2005-09-08 04:27:02 UTC (rev
17733)
+++ trunk/reactos/lib/string/abs.c 2005-09-08 05:03:34 UTC (rev
17734)
@@ -0,0 +1,10 @@
+#include <string.h>
+
+/*
+ * @implemented
+ */
+int
+abs(int j)
+{
+ return j<0 ? -j : j;
+}
_____
Added: trunk/reactos/lib/string/atoi.c
--- trunk/reactos/lib/string/atoi.c 2005-09-08 04:27:02 UTC (rev
17733)
+++ trunk/reactos/lib/string/atoi.c 2005-09-08 05:03:34 UTC (rev
17734)
@@ -0,0 +1,11 @@
+#include <string.h>
+#include <stdlib.h>
+
+/*
+ * @implemented
+ */
+int
+atoi(const char *str)
+{
+ return (int)strtol(str, 0, 10);
+}
_____
Added: trunk/reactos/lib/string/atoi64.c
--- trunk/reactos/lib/string/atoi64.c 2005-09-08 04:27:02 UTC (rev
17733)
+++ trunk/reactos/lib/string/atoi64.c 2005-09-08 05:03:34 UTC (rev
17734)
@@ -0,0 +1,36 @@
+#include <string.h>
+#include <ctype.h>
+
+/*
+ * @implemented
+ */
+__int64
+_atoi64 (const char *nptr)
+{
+ int c;
+ __int64 value;
+ int sign;
+
+ while (isspace((int)*nptr))
+ ++nptr;
+
+ c = (int)*nptr++;
+ sign = c;
+ if (c == '-' || c == '+')
+ c = (int)*nptr++;
+
+ value = 0;
+
+ while (isdigit(c))
+ {
+ value = 10 * value + (c - '0');
+ c = (int)*nptr++;
+ }
+
+ if (sign == '-')
+ return -value;
+ else
+ return value;
+}
+
+/* EOF */
_____
Added: trunk/reactos/lib/string/atol.c
--- trunk/reactos/lib/string/atol.c 2005-09-08 04:27:02 UTC (rev
17733)
+++ trunk/reactos/lib/string/atol.c 2005-09-08 05:03:34 UTC (rev
17734)
@@ -0,0 +1,11 @@
+#include <string.h>
+#include <stdlib.h>
+
+/*
+ * @implemented
+ */
+long
+atol(const char *str)
+{
+ return strtol(str, 0, 10);
+}
_____
Added: trunk/reactos/lib/string/bsearch.c
--- trunk/reactos/lib/string/bsearch.c 2005-09-08 04:27:02 UTC (rev
17733)
+++ trunk/reactos/lib/string/bsearch.c 2005-09-08 05:03:34 UTC (rev
17734)
@@ -0,0 +1,27 @@
+#include <string.h>
+
+/*
+ * @implemented
+ */
+void *
+bsearch(const void *key, const void *base0, size_t nelem,
+ size_t size, int (*cmp)(const void *ck, const void *ce))
+{
+ char *base = (char *)base0;
+ int lim, cmpval;
+ void *p;
+
+ for (lim = nelem; lim != 0; lim >>= 1)
+ {
+ p = base + (lim >> 1) * size;
+ cmpval = (*cmp)(key, p);
+ if (cmpval == 0)
+ return p;
+ if (cmpval > 0)
+ { /* key > p: move right */
+ base = (char *)p + size;
+ lim--;
+ } /* else move left */
+ }
+ return 0;
+}
_____
Added: trunk/reactos/lib/string/itoa.c
--- trunk/reactos/lib/string/itoa.c 2005-09-08 04:27:02 UTC (rev
17733)
+++ trunk/reactos/lib/string/itoa.c 2005-09-08 05:03:34 UTC (rev
17734)
@@ -0,0 +1,167 @@
+#include <string.h>
+#include <stdlib.h>
+
+/*
+ * @implemented
+ */
+char *
+_i64toa(__int64 value, char *string, int radix)
+{
+ char tmp[65];
+ char *tp = tmp;
+ __int64 i;
+ unsigned __int64 v;
+ __int64 sign;
+ char *sp;
+
+ if (radix > 36 || radix <= 1)
+ {
+ return 0;
+ }
+
+ sign = (radix == 10 && value < 0);
+ if (sign)
+ v = -value;
+ else
+ v = (unsigned __int64)value;
+ while (v || tp == tmp)
+ {
+ i = v % radix;
+ v = v / radix;
+ if (i < 10)
+ *tp++ = i+'0';
+ else
+ *tp++ = i + 'a' - 10;
+ }
+
+ sp = string;
+ if (sign)
+ *sp++ = '-';
+ while (tp > tmp)
+ *sp++ = *--tp;
+ *sp = 0;
+ return string;
+}
+
+
+/*
+ * @implemented
+ */
+char *
+_ui64toa(unsigned __int64 value, char *string, int radix)
+{
+ char tmp[65];
+ char *tp = tmp;
+ __int64 i;
+ unsigned __int64 v;
+ char *sp;
+
+ if (radix > 36 || radix <= 1)
+ {
+ return 0;
+ }
+
+ v = (unsigned __int64)value;
+ while (v || tp == tmp)
+ {
+ i = v % radix;
+ v = v / radix;
+ if (i < 10)
+ *tp++ = i+'0';
+ else
+ *tp++ = i + 'a' - 10;
+ }
+
+ sp = string;
+ while (tp > tmp)
+ *sp++ = *--tp;
+ *sp = 0;
+ return string;
+}
+
+
+/*
+ * @implemented
+ */
+char *
+_itoa(int value, char *string, int radix)
+{
+ return _ltoa(value, string, radix);
+}
+
+
+/*
+ * @implemented
+ */
+char *
+_ltoa(long value, char *string, int radix)
+{
+ unsigned long val;
+ int negative;
+ char buffer[33];
+ char *pos;
+ int digit;
+
+ if (value < 0 && radix == 10) {
+ negative = 1;
+ val = -value;
+ } else {
+ negative = 0;
+ val = value;
+ } /* if */
+
+ pos = &buffer[32];
+ *pos = '\0';
+
+ do {
+ digit = val % radix;
+ val = val / radix;
+ if (digit < 10) {
+ *--pos = '0' + digit;
+ } else {
+ *--pos = 'a' + digit - 10;
+ } /* if */
+ } while (val != 0L);
+
+ if (negative) {
+ *--pos = '-';
+ } /* if */
+
+ memcpy(string, pos, &buffer[32] - pos + 1);
+ return string;
+}
+
+
+/*
+ * @implemented
+ */
+char *
+_ultoa(unsigned long value, char *string, int radix)
+{
+ char tmp[33];
+ char *tp = tmp;
+ long i;
+ unsigned long v = value;
+ char *sp;
+
+ if (radix > 36 || radix <= 1)
+ {
+ return 0;
+ }
+
+ while (v || tp == tmp)
+ {
+ i = v % radix;
+ v = v / radix;
+ if (i < 10)
+ *tp++ = i+'0';
+ else
+ *tp++ = i + 'a' - 10;
+ }
+
+ sp = string;
+ while (tp > tmp)
+ *sp++ = *--tp;
+ *sp = 0;
+ return string;
+}
_____
Added: trunk/reactos/lib/string/itow.c
--- trunk/reactos/lib/string/itow.c 2005-09-08 04:27:02 UTC (rev
17733)
+++ trunk/reactos/lib/string/itow.c 2005-09-08 05:03:34 UTC (rev
17734)
@@ -0,0 +1,200 @@
+#include <string.h>
+
+/*
+ * @implemented
+ */
+wchar_t *
+_i64tow(__int64 value, wchar_t *string, int radix)
+{
+ wchar_t tmp[65];
+ wchar_t *tp = tmp;
+ __int64 i;
+ unsigned __int64 v;
+ __int64 sign;
+ wchar_t *sp;
+
+ if (radix > 36 || radix <= 1)
+ {
+ return 0;
+ }
+
+ sign = (radix == 10 && value < 0);
+ if (sign)
+ v = -value;
+ else
+ v = (unsigned __int64)value;
+ while (v || tp == tmp)
+ {
+ i = v % radix;
+ v = v / radix;
+ if (i < 10)
+ *tp++ = i+L'0';
+ else
+ *tp++ = i + L'a' - 10;
+ }
+
+ sp = string;
+ if (sign)
+ *sp++ = L'-';
+ while (tp > tmp)
+ *sp++ = *--tp;
+ *sp = 0;
+ return string;
+}
+
+
+/*
+ * @implemented
+ */
+wchar_t *
+_ui64tow(unsigned __int64 value, wchar_t *string, int radix)
+{
+ wchar_t tmp[65];
+ wchar_t *tp = tmp;
+ __int64 i;
+ unsigned __int64 v;
+ wchar_t *sp;
+
+ if (radix > 36 || radix <= 1)
+ {
+ return 0;
+ }
+
+ v = (unsigned __int64)value;
+ while (v || tp == tmp)
+ {
+ i = v % radix;
+ v = v / radix;
+ if (i < 10)
+ *tp++ = i+L'0';
+ else
+ *tp++ = i + L'a' - 10;
+ }
+
+ sp = string;
+ while (tp > tmp)
+ *sp++ = *--tp;
+ *sp = 0;
+ return string;
+}
+
+
+/*
+ * @implemented
+ */
+wchar_t *
+_itow(int value, wchar_t *string, int radix)
+{
+ wchar_t tmp[33];
+ wchar_t *tp = tmp;
+ int i;
+ unsigned v;
+ int sign;
+ wchar_t *sp;
+
+ if (radix > 36 || radix <= 1)
+ {
+ return 0;
+ }
+
+ sign = (radix == 10 && value < 0);
+ if (sign)
+ v = -value;
+ else
+ v = (unsigned)value;
+ while (v || tp == tmp)
+ {
+ i = v % radix;
+ v = v / radix;
+ if (i < 10)
+ *tp++ = i+L'0';
+ else
+ *tp++ = i + L'a' - 10;
+ }
+
+ sp = string;
+ if (sign)
+ *sp++ = L'-';
+ while (tp > tmp)
+ *sp++ = *--tp;
+ *sp = 0;
+ return string;
+}
+
+
+/*
+ * @implemented
+ */
+wchar_t *
+_ltow(long value, wchar_t *string, int radix)
+{
+ wchar_t tmp[33];
+ wchar_t *tp = tmp;
+ long i;
+ unsigned long v;
+ int sign;
+ wchar_t *sp;
+
+ if (radix > 36 || radix <= 1)
+ {
+ return 0;
+ }
+
+ sign = (radix == 10 && value < 0);
+ if (sign)
+ v = -value;
+ else
+ v = (unsigned long)value;
+ while (v || tp == tmp)
+ {
+ i = v % radix;
+ v = v / radix;
+ if (i < 10)
+ *tp++ = i+L'0';
+ else
+ *tp++ = i + L'a' - 10;
+ }
+
+ sp = string;
+ if (sign)
+ *sp++ = L'-';
+ while (tp > tmp)
+ *sp++ = *--tp;
+ *sp = 0;
+ return string;
+}
+
+
+/*
+ * @implemented
+ */
+wchar_t *
+_ultow(unsigned long value, wchar_t *string, int radix)
+{
+ wchar_t tmp[33];
+ wchar_t *tp = tmp;
+ long i;
+ unsigned long v = value;
+ wchar_t *sp;
+
+ if (radix > 36 || radix <= 1)
+ {
+ return 0;
+ }
+
+ while (v || tp == tmp)
+ {
+ i = v % radix;
+ v = v / radix;
+ if (i < 10)
+ *tp++ = i+L'0';
+ else
+ *tp++ = i + L'a' - 10;
+ }
+
+ sp = string;
+ while (tp > tmp)
+ *sp++ = *--tp;
+ *sp = 0;
+ return string;
+}
_____
Added: trunk/reactos/lib/string/labs.c
--- trunk/reactos/lib/string/labs.c 2005-09-08 04:27:02 UTC (rev
17733)
+++ trunk/reactos/lib/string/labs.c 2005-09-08 05:03:34 UTC (rev
17734)
@@ -0,0 +1,9 @@
+#include <string.h>
+/*
+ * @implemented
+ */
+long
+labs(long j)
+{
+ return j<0 ? -j : j;
+}
_____
Added: trunk/reactos/lib/string/lfind.c
--- trunk/reactos/lib/string/lfind.c 2005-09-08 04:27:02 UTC (rev
17733)
+++ trunk/reactos/lib/string/lfind.c 2005-09-08 05:03:34 UTC (rev
17734)
@@ -0,0 +1,20 @@
+#include <string.h>
+/*
+ * @implemented
+ */
+void *_lfind(const void *key, const void *base, size_t *nelp,
+ size_t width, int (*compar)(const void *, const void *))
+{
+ char* char_base = (char*)base;
+ size_t i;
+
+ for (i = 0; i < *nelp; i++)
+ {
+ if (compar(key, char_base) == 0)
+ return char_base;
+
+ char_base += width;
+ }
+
+ return NULL;
+}
_____
Added: trunk/reactos/lib/string/mbstowcs.c
--- trunk/reactos/lib/string/mbstowcs.c 2005-09-08 04:27:02 UTC (rev
17733)
+++ trunk/reactos/lib/string/mbstowcs.c 2005-09-08 05:03:34 UTC (rev
17734)
@@ -0,0 +1,61 @@
+#include <windows.h>
+#define NTOS_MODE_USER
+#define _NTSYSTEM_
+#include <ndk/umtypes.h>
+#include <ndk/rtlfuncs.h>
+#include <string.h>
+
+/*
+ * @implemented
+ */
+int mbtowc (wchar_t *wchar, const char *mbchar, size_t count)
+{
+ NTSTATUS Status;
+ ULONG Size;
+
+ if (wchar == NULL)
+ return 0;
+
+ Status = RtlMultiByteToUnicodeN (wchar,
+ sizeof(WCHAR),
+ &Size,
+ (char *)mbchar,
+ count);
+ if (!NT_SUCCESS(Status))
+ return -1;
+
+ return (int)Size;
+}
+
+/*
+ * @implemented
+ */
+size_t mbstowcs (wchar_t *wcstr, const char *mbstr, size_t count)
+{
+ NTSTATUS Status;
+ ULONG Size;
+ ULONG Length;
+
+ Length = strlen (mbstr);
+
+ if (wcstr == NULL)
+ {
+ RtlMultiByteToUnicodeSize (&Size,
+ (char *)mbstr,
+ Length);
+
+ return (size_t)Size;
+ }
+
+ Status = RtlMultiByteToUnicodeN (wcstr,
+ count,
+ &Size,
+ (char *)mbstr,
+ Length);
+ if (!NT_SUCCESS(Status))
+ return -1;
+
+ return (size_t)Size;
+}
+
+/* EOF */
_____
Added: trunk/reactos/lib/string/rand.c
--- trunk/reactos/lib/string/rand.c 2005-09-08 04:27:02 UTC (rev
17733)
+++ trunk/reactos/lib/string/rand.c 2005-09-08 05:03:34 UTC (rev
17734)
@@ -0,0 +1,29 @@
+#include <stdlib.h>
+
+#if defined(__GNUC__)
+static unsigned long long next = 0;
+#else
+static unsigned __int64 next = 0;
+#endif
+
+/*
+ * @implemented
+ */
+int rand(void)
+{
+#if defined(__GNUC__)
+ next = next * 0x5deece66dLL + 11;
+#else
+ next = next * 0x5deece66di64 + 11;
+#endif
+ return (int)((next >> 16) & RAND_MAX);
+}
+
+
+/*
+ * @implemented
+ */
+void srand(unsigned seed)
+{
+ next = seed;
+}
_____
Added: trunk/reactos/lib/string/splitp.c
--- trunk/reactos/lib/string/splitp.c 2005-09-08 04:27:02 UTC (rev
17733)
+++ trunk/reactos/lib/string/splitp.c 2005-09-08 05:03:34 UTC (rev
17734)
@@ -0,0 +1,50 @@
+#include <string.h>
+/*
+ * @implemented
+ */
+void _splitpath(const char* path, char* drive, char* dir, char* fname,
char* ext)
+{
+ char* tmp_drive;
+ char* tmp_dir;
+ char* tmp_ext;
+
+ tmp_drive = (char*)strchr(path,':');
+ if (drive) {
+ if (tmp_drive) {
+ strncpy(drive,tmp_drive-1,2);
+ *(drive+2) = 0;
+ } else {
+ *drive = 0;
+ }
+ }
+ if (!tmp_drive) {
+ tmp_drive = (char*)path - 1;
+ }
+
+ tmp_dir = (char*)strrchr(path,'\\');
+ if (dir) {
+ if (tmp_dir) {
+ strncpy(dir,tmp_drive+1,tmp_dir-tmp_drive);
+ *(dir+(tmp_dir-tmp_drive)) = 0;
+ } else {
+ *dir =0;
+ }
+ }
+
+ tmp_ext = (char*)strrchr(path,'.');
+ if (!tmp_ext) {
+ tmp_ext = (char*)path+strlen(path);
+ }
+ if (ext) {
+ strcpy(ext,tmp_ext);
+ }
+
+ if (tmp_dir) {
+ strncpy(fname,tmp_dir+1,tmp_ext-tmp_dir-1);
+ *(fname+(tmp_ext-tmp_dir-1)) = 0;
+ } else {
+ strncpy(fname,tmp_drive+1,tmp_ext-tmp_drive-1);
+ *(fname+(tmp_ext-path))=0;
+ }
+}
+
_____
Modified: trunk/reactos/lib/string/string.xml
--- trunk/reactos/lib/string/string.xml 2005-09-08 04:27:02 UTC (rev
17733)
+++ trunk/reactos/lib/string/string.xml 2005-09-08 05:03:34 UTC (rev
17734)
@@ -76,4 +76,24 @@
<file>wstring.c</file>
<file>wcsrev.c</file>
<file>wcsnset.c</file>
+ <file>abs.c</file>
+ <file>atoi64.c</file>
+ <file>atoi.c</file>
+ <file>atol.c</file>
+ <file>bsearch.c</file>
+ <file>itoa.c</file>
+ <file>itow.c</file>
+ <file>labs.c</file>
+ <file>lfind.c</file>
+ <file>mbstowcs.c</file>
+ <file>splitp.c</file>
+ <file>strtol.c</file>
+ <file>strtoul.c</file>
+ <file>wcstol.c</file>
+ <file>wcstombs.c</file>
+ <file>wcstoul.c</file>
+ <file>wtoi64.c</file>
+ <file>wtoi.c</file>
+ <file>wtol.c</file>
+ <file>rand.c</file>
</module>
_____
Added: trunk/reactos/lib/string/strtol.c
--- trunk/reactos/lib/string/strtol.c 2005-09-08 04:27:02 UTC (rev
17733)
+++ trunk/reactos/lib/string/strtol.c 2005-09-08 05:03:34 UTC (rev
17734)
@@ -0,0 +1,90 @@
+#include <string.h>
+#include <limits.h>
+#include <ctype.h>
+
+/*
+ * @implemented
+ */
+long
+strtol(const char *nptr, char **endptr, int base)
+{
+ const char *s = nptr;
+ unsigned long acc;
+ int c;
+ unsigned long cutoff;
+ int neg = 0, any, cutlim;
+
+ /*
+ * Skip white space and pick up leading +/- sign if any.
+ * If base is 0, allow 0x for hex and 0 for octal, else
+ * assume decimal; if base is already 16, allow 0x.
+ */
+ do {
+ c = *s++;
+ } while (isspace(c));
+ if (c == '-')
+ {
+ neg = 1;
+ c = *s++;
+ }
+ else if (c == '+')
+ c = *s++;
+ if ((base == 0 || base == 16) &&
+ c == '0' && (*s == 'x' || *s == 'X'))
+ {
+ c = s[1];
+ s += 2;
+ base = 16;
+ }
+ if (base == 0)
+ base = c == '0' ? 8 : 10;
+
+ /*
+ * Compute the cutoff value between legal numbers and illegal
+ * numbers. That is the largest legal value, divided by the
+ * base. An input number that is greater than this value, if
+ * followed by a legal input character, is too big. One that
+ * is equal to this value may be valid or not; the limit
+ * between valid and invalid numbers is then based on the last
+ * digit. For instance, if the range for longs is
+ * [-2147483648..2147483647] and the input base is 10,
+ * cutoff will be set to 214748364 and cutlim to either
+ * 7 (neg==0) or 8 (neg==1), meaning that if we have accumulated
+ * a value > 214748364, or equal but the next digit is > 7 (or 8),
+ * the number is too big, and we will return a range error.
+ *
+ * Set any if any `digits' consumed; make it negative to indicate
+ * overflow.
+ */
+ cutoff = neg ? -(unsigned long)LONG_MIN : LONG_MAX;
+ cutlim = cutoff % (unsigned long)base;
+ cutoff /= (unsigned long)base;
+ for (acc = 0, any = 0;; c = *s++)
+ {
+ if (isdigit(c))
+ c -= '0';
+ else if (isalpha(c))
+ c -= isupper(c) ? 'A' - 10 : 'a' - 10;
+ else
+ break;
+ if (c >= base)
+ break;
+ if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim))
+ any = -1;
+ else
+ {
+ any = 1;
+ acc *= base;
+ acc += c;
+ }
+ }
+ if (any < 0)
+ {
+ acc = neg ? LONG_MIN : LONG_MAX;
+ }
+ else if (neg)
+ acc = -acc;
+ if (endptr != 0)
+ *endptr = any ? (char *)s - 1 : (char *)nptr;
+ return acc;
+}
_____
Added: trunk/reactos/lib/string/strtoul.c
--- trunk/reactos/lib/string/strtoul.c 2005-09-08 04:27:02 UTC (rev
17733)
+++ trunk/reactos/lib/string/strtoul.c 2005-09-08 05:03:34 UTC (rev
17734)
@@ -0,0 +1,73 @@
+#include <string.h>
+#include <limits.h>
+#include <ctype.h>
+
+/*
+ * Convert a string to an unsigned long integer.
+ *
+ * Ignores `locale' stuff. Assumes that the upper and lower case
+ * alphabets and digits are each contiguous.
+ *
+ * @implemented
+ */
+unsigned long
+strtoul(const char *nptr, char **endptr, int base)
+{
+ const char *s = nptr;
+ unsigned long acc;
+ int c;
+ unsigned long cutoff;
+ int neg = 0, any, cutlim;
+
+ /*
+ * See strtol for comments as to the logic used.
+ */
+ do {
+ c = *s++;
+ } while (isspace(c));
+ if (c == '-')
+ {
+ neg = 1;
+ c = *s++;
+ }
+ else if (c == '+')
+ c = *s++;
+ if ((base == 0 || base == 16) &&
+ c == '0' && (*s == 'x' || *s == 'X'))
+ {
+ c = s[1];
+ s += 2;
+ base = 16;
+ }
+ if (base == 0)
+ base = c == '0' ? 8 : 10;
+ cutoff = (unsigned long)ULONG_MAX / (unsigned long)base;
+ cutlim = (unsigned long)ULONG_MAX % (unsigned long)base;
+ for (acc = 0, any = 0;; c = *s++)
+ {
+ if (isdigit(c))
+ c -= '0';
+ else if (isalpha(c))
+ c -= isupper(c) ? 'A' - 10 : 'a' - 10;
+ else
+ break;
+ if (c >= base)
+ break;
+ if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim))
+ any = -1;
+ else {
+ any = 1;
+ acc *= base;
+ acc += c;
+ }
+ }
+ if (any < 0)
+ {
+ acc = ULONG_MAX;
+ }
+ else if (neg)
+ acc = -acc;
+ if (endptr != 0)
+ *endptr = any ? (char *)s - 1 : (char *)nptr;
+ return acc;
+}
_____
Added: trunk/reactos/lib/string/wcstol.c
--- trunk/reactos/lib/string/wcstol.c 2005-09-08 04:27:02 UTC (rev
17733)
+++ trunk/reactos/lib/string/wcstol.c 2005-09-08 05:03:34 UTC (rev
17734)
@@ -0,0 +1,90 @@
+#include <string.h>
+#include <ctype.h>
+#include <limits.h>
+
+/*
+ * @implemented
+ */
+long
+wcstol(const wchar_t *nptr, wchar_t **endptr, int base)
+{
+ const wchar_t *s = nptr;
+ unsigned long acc;
+ int c;
+ unsigned long cutoff;
+ int neg = 0, any, cutlim;
+
+ /*
+ * Skip white space and pick up leading +/- sign if any.
+ * If base is 0, allow 0x for hex and 0 for octal, else
+ * assume decimal; if base is already 16, allow 0x.
+ */
+ do {
+ c = *s++;
+ } while (iswctype(c, _SPACE));
+ if (c == '-')
+ {
+ neg = 1;
+ c = *s++;
+ }
+ else if (c == L'+')
+ c = *s++;
+ if ((base == 0 || base == 16) &&
+ c == L'0' && (*s == L'x' || *s == L'X'))
+ {
+ c = s[1];
+ s += 2;
+ base = 16;
+ }
+ if (base == 0)
+ base = c == L'0' ? 8 : 10;
+
+ /*
+ * Compute the cutoff value between legal numbers and illegal
+ * numbers. That is the largest legal value, divided by the
+ * base. An input number that is greater than this value, if
+ * followed by a legal input character, is too big. One that
+ * is equal to this value may be valid or not; the limit
+ * between valid and invalid numbers is then based on the last
+ * digit. For instance, if the range for longs is
+ * [-2147483648..2147483647] and the input base is 10,
+ * cutoff will be set to 214748364 and cutlim to either
+ * 7 (neg==0) or 8 (neg==1), meaning that if we have accumulated
+ * a value > 214748364, or equal but the next digit is > 7 (or 8),
+ * the number is too big, and we will return a range error.
+ *
+ * Set any if any `digits' consumed; make it negative to indicate
+ * overflow.
[truncated at 1000 lines; 263 more skipped]