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