windows-nt/Source/XPSP1/NT/inetsrv/query/web/dll/xtow.cxx
2020-09-26 16:20:57 +08:00

129 lines
3.2 KiB
C++

//+---------------------------------------------------------------------------
//
// Copyright (C) 1996, Microsoft Corporation.
//
// File: xtow.cxx
//
// Contents: formats numbers into wide strings
//
// History: 96/Jan/3 DwightKr Created
// 96/Apr/3 dlee optimized and cleaned up
//
//----------------------------------------------------------------------------
#include <pch.cxx>
#pragma hdrstop
//+---------------------------------------------------------------------------
//
// Note - added to C run-times; remove when new run-times are available.
// On second thought, just use this one -- it saves an ascii=>wide and
// radix checking.
// This routine isn't for real formatting -- it's just for input to
// Win32's real number formatting routine
//
//----------------------------------------------------------------------------
//+---------------------------------------------------------------------------
//
// Function: IDQ_ulltow_format
//
// Synopsis: formats an _int64 in a wide string.
//
// Arguments: [val] - value to format
// [buf] - buffer for the result
// [fIsNegative] - true if val is negative, false otherwise
//
// History: 96/Apr/05 dlee Created.
//
//----------------------------------------------------------------------------
void IDQ_ulltow_format(
ULONGLONG val,
WCHAR * buf,
int fIsNegative )
{
WCHAR *p = buf;
if ( fIsNegative )
{
// negative, so output '-' and negate
*p++ = L'-';
val = (ULONGLONG) (-(LONGLONG)val);
}
WCHAR *firstdig = p; // save pointer to first digit
do
{
unsigned digval = (unsigned) (val % 10);
val /= 10; // get next digit
Win4Assert( digval <= 9 );
// convert to unicode and store
*p++ = (WCHAR) (digval + L'0');
} while ( val > 0 );
// We now have the digit of the number in the buffer, but in reverse
// order. Thus we reverse them now.
*p-- = 0;
do
{
WCHAR temp = *p;
*p = *firstdig;
*firstdig = temp; // swap *p and *firstdig
--p;
++firstdig; // advance to next two digits
} while ( firstdig < p ); // repeat until halfway
}
void IDQ_ultow_format(
ULONG val,
WCHAR * buf,
int fIsNegative )
{
WCHAR *p = buf;
if ( fIsNegative )
{
// negative, so output '-' and negate
*p++ = L'-';
val = (ULONG) (-(LONG)val);
}
WCHAR *firstdig = p; // save pointer to first digit
do
{
unsigned digval = (unsigned) (val % 10);
val /= 10; // get next digit
Win4Assert( digval <= 9 );
// convert to unicode and store
*p++ = (WCHAR) (digval + L'0');
} while ( val > 0 );
// We now have the digit of the number in the buffer, but in reverse
// order. Thus we reverse them now.
*p-- = 0;
do
{
WCHAR temp = *p;
*p = *firstdig;
*firstdig = temp; // swap *p and *firstdig
--p;
++firstdig; // advance to next two digits
} while ( firstdig < p ); // repeat until halfway
}