windows-nt/Source/XPSP1/NT/base/crts/crtw32/convert/atox.c

180 lines
4.7 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/***
*atox.c - atoi and atol conversion
*
* Copyright (c) 1989-2001, Microsoft Corporation. All rights reserved.
*
*Purpose:
* Converts a character string into an int or long.
*
*Revision History:
* 06-05-89 PHG Module created, based on asm version
* 03-05-90 GJF Fixed calling type, added #include <cruntime.h> and
* cleaned up the formatting a bit. Also, fixed the
* copyright.
* 09-27-90 GJF New-style function declarators.
* 10-21-92 GJF Fixed conversions of char to int.
* 04-06-93 SKS Replace _CRTAPI* with _cdecl
* 01-19-96 BWT Add __int64 version.
* 08-27-98 GJF Revised multithread support based on threadlocinfo
* struct.
* 05-23-00 GB Added Unicode function.
* 08-16-00 GB Added multilingual support to unicode wtox fundtions.
* 11-01-00 PML Fix _NTSUBSET_ build.
* 05-11-01 BWT A NULL string returns 0, not AV.
*
*******************************************************************************/
#include <cruntime.h>
#include <stdlib.h>
#include <ctype.h>
#include <mtdll.h>
#ifdef _MBCS
#undef _MBCS
#endif
#include <tchar.h>
#ifndef _UNICODE
#define _tchartodigit(c) ((c) >= '0' && (c) <= '9' ? (c) - '0' : -1)
#else
int _wchartodigit(wchar_t);
#define _tchartodigit(c) _wchartodigit((wchar_t)(c))
#endif
/***
*long atol(char *nptr) - Convert string to long
*
*Purpose:
* Converts ASCII string pointed to by nptr to binary.
* Overflow is not detected.
*
*Entry:
* nptr = ptr to string to convert
*
*Exit:
* return long int value of the string
*
*Exceptions:
* None - overflow is not detected.
*
*******************************************************************************/
long __cdecl _tstol(
const _TCHAR *nptr
)
{
int c; /* current char */
long total; /* current total */
int sign; /* if '-', then negative, otherwise positive */
#if defined( _MT) && !defined(_UNICODE)
pthreadlocinfo ptloci;
#endif
if (!nptr)
return 0;
#if defined( _MT) && !defined(_UNICODE)
ptloci = _getptd()->ptlocinfo;
if ( ptloci != __ptlocinfo )
ptloci = __updatetlocinfo();
/* skip whitespace */
while ( __isspace_mt(ptloci, (int)(_TUCHAR)*nptr) )
#else
while ( _istspace((int)(_TUCHAR)*nptr) )
#endif
++nptr;
c = (int)(_TUCHAR)*nptr++;
sign = c; /* save sign indication */
if (c == _T('-') || c == _T('+'))
c = (int)(_TUCHAR)*nptr++; /* skip sign */
total = 0;
while ( (c = _tchartodigit(c)) != -1 ) {
total = 10 * total + c; /* accumulate digit */
c = (_TUCHAR)*nptr++; /* get next char */
}
if (sign == '-')
return -total;
else
return total; /* return result, negated if necessary */
}
/***
*int atoi(char *nptr) - Convert string to long
*
*Purpose:
* Converts ASCII string pointed to by nptr to binary.
* Overflow is not detected. Because of this, we can just use
* atol().
*
*Entry:
* nptr = ptr to string to convert
*
*Exit:
* return int value of the string
*
*Exceptions:
* None - overflow is not detected.
*
*******************************************************************************/
int __cdecl _tstoi(
const _TCHAR *nptr
)
{
return (int)_tstol(nptr);
}
#ifndef _NO_INT64
__int64 __cdecl _tstoi64(
const _TCHAR *nptr
)
{
int c; /* current char */
__int64 total; /* current total */
int sign; /* if '-', then negative, otherwise positive */
#if defined(_MT) && !defined(_UNICODE)
pthreadlocinfo ptloci;
#endif
if (!nptr)
return 0i64;
#if defined(_MT) && !defined(_UNICODE)
ptloci = _getptd()->ptlocinfo;
if ( ptloci != __ptlocinfo )
ptloci = __updatetlocinfo();
/* skip whitespace */
while ( __isspace_mt(ptloci, (int)(_TUCHAR)*nptr) )
#else
while ( _istspace((int)(_TUCHAR)*nptr) )
#endif
++nptr;
c = (int)(_TUCHAR)*nptr++;
sign = c; /* save sign indication */
if (c == _T('-') || c == _T('+'))
c = (int)(_TUCHAR)*nptr++; /* skip sign */
total = 0;
while ( (c = _tchartodigit(c)) != -1 ) {
total = 10 * total + c; /* accumulate digit */
c = (_TUCHAR)*nptr++; /* get next char */
}
if (sign == _T('-'))
return -total;
else
return total; /* return result, negated if necessary */
}
#endif /* _NO_INT64 */