141 lines
3.3 KiB
C++
141 lines
3.3 KiB
C++
|
//+----------------------------------------------------------------------------
|
||
|
//
|
||
|
// File: atol.cpp (from libc atox.c)
|
||
|
//
|
||
|
// Module: CMUTIL.DLL
|
||
|
//
|
||
|
// Synopsis: Conversion routines
|
||
|
//
|
||
|
// Copyright (c) 1997-1999 Microsoft Corporation
|
||
|
//
|
||
|
// Author: henryt Created 03/01/98
|
||
|
//
|
||
|
//+----------------------------------------------------------------------------
|
||
|
|
||
|
#include "cmmaster.h"
|
||
|
|
||
|
//+----------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: WINAPI CmAtolW
|
||
|
//
|
||
|
// Synopsis: This function converts a Unicode string to a long
|
||
|
//
|
||
|
// Arguments: *nptr - Unicode string to convert
|
||
|
//
|
||
|
// Returns: LONG - long representation of the string passed in
|
||
|
//
|
||
|
// History: quintinb Rewrote for Unicode conversion 4/8/99
|
||
|
//
|
||
|
//+----------------------------------------------------------------------------
|
||
|
CMUTILAPI LONG WINAPI CmAtolW(const WCHAR *nptr)
|
||
|
{
|
||
|
WCHAR* pszCurrent = (WCHAR*)nptr;
|
||
|
WCHAR sign = L'\0'; // if '-', then negative, otherwise positive
|
||
|
long total = 0; // current total
|
||
|
|
||
|
MYDBGASSERT(nptr);
|
||
|
|
||
|
if (nptr)
|
||
|
{
|
||
|
//
|
||
|
// skip whitespace
|
||
|
//
|
||
|
while (CmIsSpaceW(pszCurrent))
|
||
|
{
|
||
|
pszCurrent = CharNextU(pszCurrent);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Save the sign if necessary
|
||
|
//
|
||
|
sign = *pszCurrent;
|
||
|
if ((L'-' == sign) || (L'+' == sign))
|
||
|
{
|
||
|
pszCurrent = CharNextU(pszCurrent);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Construct the number
|
||
|
//
|
||
|
total = 0;
|
||
|
|
||
|
while (CmIsDigitW(pszCurrent))
|
||
|
{
|
||
|
total = (10 * total) + (*pszCurrent - L'0'); // accumulate digit
|
||
|
pszCurrent = CharNextU(pszCurrent); // get next char
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (sign == L'-')
|
||
|
{
|
||
|
return -total;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return total; // return result, negated if necessary
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//+----------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: WINAPI CmAtolA
|
||
|
//
|
||
|
// Synopsis: This function converts an ANSI string to a long value
|
||
|
//
|
||
|
// Arguments: *nptr - string to convert
|
||
|
//
|
||
|
// Returns: LONG - long representation of the string passed in
|
||
|
//
|
||
|
// History: quintinb Rewrote for Unicode conversion 4/8/99
|
||
|
//
|
||
|
//+----------------------------------------------------------------------------
|
||
|
CMUTILAPI LONG WINAPI CmAtolA(const CHAR *nptr)
|
||
|
{
|
||
|
CHAR* pszCurrent = (CHAR*)nptr;
|
||
|
CHAR sign = '\0'; // if '-', then negative, otherwise positive
|
||
|
long total = 0; // current total
|
||
|
|
||
|
MYDBGASSERT(nptr);
|
||
|
|
||
|
if (nptr)
|
||
|
{
|
||
|
//
|
||
|
// skip whitespace
|
||
|
//
|
||
|
while (CmIsSpaceA(pszCurrent))
|
||
|
{
|
||
|
pszCurrent = CharNextA(pszCurrent);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Save the sign if necessary
|
||
|
//
|
||
|
sign = *pszCurrent;
|
||
|
if (('-' == sign) || ('+' == sign))
|
||
|
{
|
||
|
pszCurrent = CharNextA(pszCurrent);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Construct the number
|
||
|
//
|
||
|
total = 0;
|
||
|
|
||
|
while (CmIsDigitA(pszCurrent))
|
||
|
{
|
||
|
total = (10 * total) + (*pszCurrent - '0'); // accumulate digit
|
||
|
pszCurrent = CharNextA(pszCurrent); // get next char
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (sign == '-')
|
||
|
{
|
||
|
return -total;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return total; // return result, negated if necessary
|
||
|
}
|
||
|
}
|
||
|
|