mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 10:04:49 +00:00
fixed RtlUnicodeStringToInteger
svn path=/trunk/; revision=5973
This commit is contained in:
parent
908c5df187
commit
02ee3e3600
1 changed files with 64 additions and 82 deletions
|
@ -1,10 +1,11 @@
|
||||||
/* $Id: unicode.c,v 1.31 2003/08/20 04:18:31 royce Exp $
|
/* $Id: unicode.c,v 1.32 2003/09/04 06:41:35 vizzini Exp $
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
* FILE: ntoskrnl/rtl/unicode.c
|
* FILE: ntoskrnl/rtl/unicode.c
|
||||||
* PURPOSE: String functions
|
* PURPOSE: String functions
|
||||||
* PROGRAMMER: Jason Filby (jasonfilby@yahoo.com)
|
* PROGRAMMERS: Jason Filby (jasonfilby@yahoo.com)
|
||||||
|
* Vizzini (vizzini@plasmic.com)
|
||||||
* UPDATE HISTORY:
|
* UPDATE HISTORY:
|
||||||
* Created 10/08/98
|
* Created 10/08/98
|
||||||
*/
|
*/
|
||||||
|
@ -1196,96 +1197,77 @@ RtlUnicodeStringToCountedOemString(IN OUT POEM_STRING DestinationString,
|
||||||
*/
|
*/
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
STDCALL
|
STDCALL
|
||||||
RtlUnicodeStringToInteger(IN PUNICODE_STRING String,
|
RtlUnicodeStringToInteger(IN PUNICODE_STRING InString,
|
||||||
IN ULONG Base,
|
IN ULONG Base,
|
||||||
OUT PULONG Value)
|
OUT PULONG Value)
|
||||||
{
|
{
|
||||||
PWCHAR Str;
|
BOOLEAN Negative = 0;
|
||||||
ULONG lenmin = 0;
|
PWCHAR String = InString->Buffer;
|
||||||
ULONG i;
|
ULONG MaxLen = InString->Length / sizeof(WCHAR);
|
||||||
ULONG Val;
|
|
||||||
BOOLEAN addneg = FALSE;
|
|
||||||
|
|
||||||
*Value = 0;
|
*Value = 0;
|
||||||
Str = String->Buffer;
|
|
||||||
|
|
||||||
for (i = 0; i < String->Length / sizeof(WCHAR); i++)
|
if(*String == L'-')
|
||||||
{
|
{
|
||||||
if (*Str == L'b')
|
Negative++;
|
||||||
{
|
String++;
|
||||||
Base = 2;
|
}
|
||||||
lenmin++;
|
else if(*String == L'+')
|
||||||
}
|
{
|
||||||
else if (*Str == L'o')
|
Negative = 0;
|
||||||
{
|
String++;
|
||||||
Base = 8;
|
}
|
||||||
lenmin++;
|
|
||||||
}
|
|
||||||
else if (*Str == L'd')
|
|
||||||
{
|
|
||||||
Base = 10;
|
|
||||||
lenmin++;
|
|
||||||
}
|
|
||||||
else if (*Str == L'x')
|
|
||||||
{
|
|
||||||
Base = 16;
|
|
||||||
lenmin++;
|
|
||||||
}
|
|
||||||
else if (*Str == L'+')
|
|
||||||
{
|
|
||||||
lenmin++;
|
|
||||||
}
|
|
||||||
else if (*Str == L'-')
|
|
||||||
{
|
|
||||||
addneg = TRUE;
|
|
||||||
lenmin++;
|
|
||||||
}
|
|
||||||
else if ((*Str > L'1') && (Base == 2))
|
|
||||||
{
|
|
||||||
return STATUS_INVALID_PARAMETER;
|
|
||||||
}
|
|
||||||
else if (((*Str > L'7') || (*Str < L'0')) && (Base == 8))
|
|
||||||
{
|
|
||||||
return STATUS_INVALID_PARAMETER;
|
|
||||||
}
|
|
||||||
else if (((*Str > L'9') || (*Str < L'0')) && (Base == 10))
|
|
||||||
{
|
|
||||||
return STATUS_INVALID_PARAMETER;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
else if ((((*Str > L'9') || (*Str < L'0')) ||
|
|
||||||
((towupper (*Str) > L'F') ||
|
|
||||||
(towupper (*Str) < L'A'))) && (Base == 16))
|
|
||||||
*/
|
|
||||||
else if ((*Str < '0' ||
|
|
||||||
(*Str > '9' && *Str < 'A') ||
|
|
||||||
(*Str > 'F' && *Str < 'a') ||
|
|
||||||
*Str > 'f') &&
|
|
||||||
(Base == 16))
|
|
||||||
{
|
|
||||||
return STATUS_INVALID_PARAMETER;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
Str++;
|
|
||||||
}
|
|
||||||
|
|
||||||
Str = String->Buffer + lenmin;
|
if(!Base)
|
||||||
|
{
|
||||||
|
if(*String == L'b')
|
||||||
|
{
|
||||||
|
Base = 2;
|
||||||
|
String++;
|
||||||
|
}
|
||||||
|
else if(*String == L'o')
|
||||||
|
{
|
||||||
|
Base = 8;
|
||||||
|
String++;
|
||||||
|
}
|
||||||
|
else if(*String == L'x')
|
||||||
|
{
|
||||||
|
Base = 16;
|
||||||
|
String++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Base = 10;
|
||||||
|
}
|
||||||
|
|
||||||
if (Base == 0)
|
while(*String && MaxLen)
|
||||||
Base = 10;
|
{
|
||||||
|
short c = *String;;
|
||||||
|
String++;
|
||||||
|
MaxLen--;
|
||||||
|
|
||||||
while (iswxdigit (*Str) &&
|
if(c >= 'a' && c <= 'f')
|
||||||
(Val = iswdigit (*Str) ? *Str - L'0' : (iswlower (*Str)
|
c -= 'a' - 'A';
|
||||||
? toupper (*Str) : *Str) - L'A' + 10) < Base)
|
|
||||||
{
|
|
||||||
*Value = *Value * Base + Val;
|
|
||||||
Str++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (addneg == TRUE)
|
/* validate chars for bases <= 10 */
|
||||||
*Value *= -1;
|
if( Base <= 10 && (c < '0' || c > '9') )
|
||||||
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
/* validate chars for base 16 */
|
||||||
|
else if( (c < '0' || c > '9') && (c < 'A' || c > 'F') )
|
||||||
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
/* perhaps someday we'll validate additional bases */
|
||||||
|
|
||||||
|
if(c >= 'A' && c <= 'F')
|
||||||
|
*Value = *Value * Base + c - 'A' + 10;
|
||||||
|
else
|
||||||
|
*Value = *Value * Base + c - '0';
|
||||||
|
}
|
||||||
|
|
||||||
|
if(Negative)
|
||||||
|
*Value *= -1;
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue