RtlIpv6StringToAddressA
NTSTATUS __stdcall RtlIpv6StringToAddressA(INT8 *S, INT8 **Terminator, in6_addr *Addr){
in6_addr *v4;
int v5;
INT8 *v6;
unsigned int v7;
unsigned int v8;
unsigned int v9;
unsigned int v10;
int v11;
int v12;
unsigned int v13;
INT8 v14;
unsigned int v15;
CHAR *Str;
char v18;
int v21;
v4 = Addr;
v5 = 0;
Str = 0i64;
v6 = 0i64;
v18 = 0;
v7 = 0;
v21 = 0;
v8 = 0;
v9 = 0;
v10 = 0;
v11 = 0;
while( 1 )
{
v14 = *S;
if( !*S )
break;
if( !v5 || v5 != 1 )
{
if( v14 == 58 )
{
if( v8 || v7 || S[1] != 58 )
goto LABEL_54;
v7 = 2;
v10 = 1;
v5 = 2;
v21 = v11 + 1;
++S;
v4->u.Word[v11] = 0;
v6 = Str;
goto LABEL_39;
}
if( v7 > 7 )
goto LABEL_54;
if( !_isascii(v14) || !isdigit((unsigned int)v14) )
{
if( !_isascii(v14) || !isxdigit((unsigned int)v14) || v8 )
goto LABEL_53;
v6 = S;
v18 = 1;
v5 = 1;
Str = S;
v9 = 1;
goto LABEL_38;
}
v6 = S;
v18 = 0;
v5 = 1;
Str = S;
v9 = 1;
LABEL_48:
v11 = v21;
goto LABEL_49;
}
if( _isascii(v14) && isdigit((unsigned int)v14) )
{
v4 = Addr;
++v9;
goto LABEL_7;
}
if( !_isascii(v14) || !isxdigit((unsigned int)v14) )
{
if( v14 == 58 )
{
if( v8 || v7 > 6 )
goto LABEL_52;
if( S[1] == 58 )
{
if( v10 )
goto LABEL_52;
v12 = 2;
++S;
v5 = 2;
v10 = v7 + 1;
}
else
{
v5 = 0;
v12 = 1;
}
v4 = Addr;
v7 += v12;
v6 = Str;
LABEL_38:
v11 = v21;
if( v5 == 1 )
goto LABEL_49;
}
else
{
if( v14 != 46 || v18 || v8 > 2 )
{
LABEL_52:
v4 = Addr;
LABEL_53:
v11 = v21;
LABEL_54:
v6 = Str;
break;
}
v6 = Str;
if( v7 > 6 )
{
v4 = Addr;
v11 = v21;
break;
}
++v8;
v5 = 0;
}
LABEL_39:
if( v6 )
{
if( v8 )
{
if( v9 > 3 )
return -1073741811;
v13 = strtol(v6, 0i64, 10i64);
if( v13 > 0xFF )
return -1073741811;
v4 = Addr;
Addr->u.Byte[2 * v21 - 1 + v8] = v13;
LABEL_7:
v11 = v21;
}
else
{
if( v9 > 4 )
return -1073741811;
v4 = Addr;
Addr->u.Word[v21] = __ROR2__(strtol(v6, 0i64, 16i64), 8);
v11 = ++v21;
}
v6 = Str;
goto LABEL_49;
}
v4 = Addr;
goto LABEL_48;
}
v4 = Addr;
++v9;
v11 = v21;
v6 = Str;
if( v8 )
break;
v18 = 1;
LABEL_49:
++S;
}
*Terminator = S;
if( v8 )
{
if( v8 == 3 )
{
++v7;
goto LABEL_58;
}
return -1073741811;
}
LABEL_58:
if( !v10 && v7 != 7 )
return -1073741811;
if( v5 == 1 )
{
if( v8 )
{
if( v9 > 3 )
return -1073741811;
v15 = strtol(v6, 0i64, 10i64);
if( v15 > 0xFF )
return -1073741811;
v4->u.Byte[2 * v21 + v8] = v15;
}
else
{
if( v9 > 4 )
return -1073741811;
v4->u.Word[v21] = __ROR2__(strtol(v6, 0i64, 16i64), 8);
}
}
else
{
if( v5 != 2 )
return -1073741811;
v4->u.Word[v11] = 0;
}
if( v10 )
{
memmove((char *)&v4[1] + 2 * (v10 - v7), (char *)v4 + 2 * v10, 2 * (v7 - v10));
memset((char *)v4 + 2 * v10, 0i64, 2 * (8 - v7));
}
return 0;
}Referenced by:
RtlIpv6StringToAddressExA