RtlIpv6StringToAddressW

NTSTATUS __stdcall RtlIpv6StringToAddressW(WCHAR *S, WCHAR **Terminator, in6_addr *Addr){
  wint_t v3; 
  WCHAR *v4; 
  int v5; 
  WCHAR *v7; 
  int v8; 
  char v9; 
  unsigned int v10; 
  unsigned int v11; 
  unsigned int v12; 
  unsigned int v13; 
  int v15; 
  __int16 v16; 
  unsigned int v17; 
  unsigned int v18; 
  WCHAR *v19; 
  char v20; 
  int v22; 

  v3 = *S;
  v20 = 0;
  v4 = 0i64;
  v19 = 0i64;
  v5 = 0;
  v22 = 0;
  v7 = S;
  v8 = 0;
  v9 = 0;
  v10 = 0;
  v11 = 0;
  v12 = 0;
  v13 = 0;
  while( *v7 )
  {
    if( v8 && v8 == 1 )
    {
      if( v3 < 0x80u )
      {
        if( iswctype(v3, 4u) )
        {
          ++v12;
          goto LABEL_54;
        }
        if( iswctype(v3, 0x80u) )
        {
          v4 = v19;
          ++v12;
          if( v11 )
            break;
          v9 = 1;
          v20 = 1;
          goto LABEL_24;
        }
        v9 = v20;
      }
      if( v3 != 58 )
      {
        if( v3 != 46 || v9 || v11 > 2 )
          goto LABEL_8;
        v4 = v19;
        if( v10 > 6 )
          break;
        ++v11;
        v8 = 0;
        goto LABEL_42;
      }
      if( v11 || v10 > 6 )
      {
LABEL_8:
        v4 = v19;
        break;
      }
      if( v7[1] == 58 )
      {
        if( v13 )
          goto LABEL_8;
        v15 = 2;
        ++v7;
        v8 = 2;
        v13 = v10 + 1;
      }
      else
      {
        v8 = 0;
        v15 = 1;
      }
      v10 += v15;
      v4 = v19;
    }
    else
    {
      if( v3 == 58 )
      {
        if( v11 || v10 || v7[1] != 58 )
          goto LABEL_8;
        v10 = 2;
        v13 = 1;
        v22 = v5 + 1;
        ++v7;
        v8 = 2;
        Addr->u.Word[v5] = 0;
        v4 = v19;
        goto LABEL_42;
      }
      if( v10 > 7 || v3 >= 0x80u )
        goto LABEL_8;
      if( iswctype(v3, 4u) )
      {
        v4 = v7;
        v20 = 0;
        v8 = 1;
        v19 = v7;
        v12 = 1;
        v9 = 0;
        goto LABEL_24;
      }
      if( !iswctype(v3, 0x80u) || v11 )
        goto LABEL_8;
      v9 = 1;
      v8 = 1;
      v4 = v7;
      v20 = 1;
      v19 = v7;
      v12 = 1;
    }
    if( v8 == 1 )
      goto LABEL_24;
LABEL_42:
    if( !v4 )
      goto LABEL_24;
    if( v11 )
    {
      if( v12 > 3 )
        return -1073741811;
      v17 = wcstol(v4, 0i64, 10i64);
      if( v17 > 0xFF )
        return -1073741811;
      Addr->u.Byte[2 * v22 - 1 + v11] = v17;
LABEL_54:
      v9 = v20;
      v4 = v19;
LABEL_24:
      v5 = v22;
      goto LABEL_25;
    }
    if( v12 > 4 )
      return -1073741811;
    v16 = wcstol(v4, 0i64, 16i64);
    v9 = v20;
    Addr->u.Word[v22] = __ROR2__(v16, 8);
    v5 = v22 + 1;
    v4 = v19;
    ++v22;
LABEL_25:
    v3 = *++v7;
  }
  *Terminator = v7;
  if( v11 )
  {
    if( v11 != 3 )
      return -1073741811;
    ++v10;
  }
  if( !v13 && v10 != 7 )
    return -1073741811;
  if( v8 != 1 )
  {
    if( v8 == 2 )
    {
      Addr->u.Word[v22] = 0;
      goto LABEL_66;
    }
    return -1073741811;
  }
  if( v11 )
  {
    if( v12 <= 3 )
    {
      v18 = wcstol(v4, 0i64, 10i64);
      if( v18 <= 0xFF )
      {
        Addr->u.Byte[2 * v22 + v11] = v18;
        goto LABEL_66;
      }
    }
    return -1073741811;
  }
  if( v12 > 4 )
    return -1073741811;
  Addr->u.Word[v22] = __ROR2__(wcstol(v4, 0i64, 16i64), 8);
LABEL_66:
  if( v13 )
  {
    memmove((char *)&Addr[1] + 2 * (v13 - v10), (char *)Addr + 2 * v13, 2 * (v10 - v13));
    memset((char *)Addr + 2 * v13, 0i64, 2 * (8 - v10));
  }
  return 0;
}

Referenced by:

RtlIpv6StringToAddressExW