- Rearrange source files location, so that string/math/etc routines aren't spread throughout the CRT tree.

svn path=/trunk/; revision=30266
This commit is contained in:
Aleksey Bragin 2007-11-08 10:54:42 +00:00
parent 67713c6221
commit 6b0e42017a
42 changed files with 31 additions and 21 deletions

View file

@ -0,0 +1,76 @@
/* Copyright (C) 1996 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */
#include <precomp.h>
#if defined (_MSC_VER)
#define UINT64_MAX 0xffffffffffffffff
#endif
/*
* Convert a string to an unsigned long integer.
*
* Ignores `locale' stuff. Assumes that the upper and lower case
* alphabets and digits are each contiguous.
*/
UINT64
strtoull(const char *nptr, char **endptr, int base)
{
const char *s = nptr;
UINT64 acc;
int c;
UINT64 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 = UINT64_MAX / base;
cutlim = (int)(UINT64_MAX % 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 = UINT64_MAX;
__set_errno ( ERANGE );
}
else if (neg)
acc = -acc;
if (endptr != 0)
*endptr = any ? (char *)s - 1 : (char *)nptr;
return acc;
}