strtoxlX
NTSTATUS __stdcall strtoxlX(
localeinfo_struct *plocinfo,
const INT8 *nptr,
const INT8 **endptr,
INT64 ibase,
INT64 flags,
INT64 AllowOverFlow){
unsigned int v6;
__int64 v9;
const INT8 *v10;
unsigned int v11;
__int64 v12;
int v13;
unsigned int v14;
__int64 v15;
int v16;
const INT8 *v17;
NTSTATUS result;
v6 = ibase;
if( endptr )
*endptr = nptr;
if( !nptr || (_DWORD)ibase && (unsigned int)(ibase - 2) > 0x22 )
{
xHalTimerWatchdogStop(0i64, 0i64);
return 0;
}
v9 = *(unsigned __int8 *)nptr;
v10 = nptr + 1;
v11 = 0;
if( (*(_BYTE *)(_pctype_func(plocinfo) + 2 * v9) & 8) != 0 )
{
do
v9 = *(unsigned __int8 *)v10++;
while( (*(_BYTE *)(_pctype_func(v12) + 2 * v9) & 8) != 0 );
}
v13 = flags;
if( (_BYTE)v9 == 45 )
{
v13 = flags | 2;
}
else if( (_BYTE)v9 != 43 )
{
goto LABEL_12;
}
LOBYTE(v9) = *v10++;
LABEL_12:
if( v6 )
{
if( v6 - 2 > 0x22 )
{
if( endptr )
*endptr = nptr;
return 0;
}
if( v6 == 16 && (_BYTE)v9 == 48 )
goto LABEL_24;
}
else if( (_BYTE)v9 == 48 )
{
if( ((*v10 - 88) & 0xDF) == 0 )
{
v6 = 16;
LABEL_24:
if( ((*v10 - 88) & 0xDF) == 0 )
{
LOBYTE(v9) = v10[1];
v10 += 2;
}
goto LABEL_26;
}
v6 = 8;
}
else
{
v6 = 10;
}
LABEL_26:
v14 = 0xFFFFFFFF / v6;
while( 1 )
{
if( (*(_BYTE *)(_pctype_func(v12) + 2i64 * (unsigned __int8)v9) & 4) != 0 )
{
v12 = (unsigned int)((char)v9 - 48);
}
else
{
if( (*(_WORD *)(_pctype_func(v15) + 2i64 * (unsigned __int8)v9) & 0x103) == 0 )
break;
v16 = (char)v9 - 32;
if( (unsigned __int8)(v9 - 97) > 0x19u )
v16 = (char)v9;
v12 = (unsigned int)(v16 - 55);
}
if( (unsigned int)v12 >= v6 )
break;
v13 |= 8u;
if( (_DWORD)AllowOverFlow || v11 < v14 || v11 == v14 && (unsigned int)v12 <= 0xFFFFFFFF % v6 )
{
v11 = v12 + v6 * v11;
}
else
{
v13 |= 4u;
if( !endptr )
break;
}
LOBYTE(v9) = *v10++;
}
v17 = v10 - 1;
if( (v13 & 8) == 0 )
{
if( endptr )
v17 = nptr;
v11 = 0;
goto LABEL_55;
}
if( (v13 & 4) != 0 )
goto LABEL_51;
if( (v13 & 1) == 0 )
{
if( (v13 & 2) != 0 )
{
if( v11 <= 0x80000000 )
goto LABEL_55;
LABEL_51:
if( !(_DWORD)AllowOverFlow )
{
gbl_errno = 34;
if( (v13 & 1) != 0 )
v11 = -1;
else
v11 = ((v13 & 2) != 0) + 0x7FFFFFFF;
}
goto LABEL_55;
}
if( v11 > 0x7FFFFFFF )
goto LABEL_51;
}
LABEL_55:
if( endptr )
*endptr = v17;
result = -v11;
if( (v13 & 2) == 0 )
return v11;
return result;
}Referenced by:
strtol
strtolX
strtoul