Normalization__NormalizeCharacter

NTSTATUS __stdcall Normalization__NormalizeCharacter(
        _RTL_NORMALIZATION *pNormalization,
        INT64 cTest,
        UINT8 bPage,
        _RTL_NORM_BUFFER *pNormBuffer){
  UINT8 v5; 
  unsigned int v6; 
  int v8; 
  UINT8 v9; 
  UINT8 v10; 
  unsigned int v11; 
  unsigned int v12; 
  char v13; 
  unsigned __int16 *v14; 
  int v15; 
  UINT64 v16; 
  unsigned __int8 v17; 
  UINT8 v18; 
  unsigned __int8 v19; 
  UINT8 v20; 
  NTSTATUS CanCombinableCharactersCombine; 
  __int64 v22; 
  __int64 v23; 
  __int64 v24; 
  char v25; 
  bool v26; 
  unsigned int StartBasePair; 
  NTSTATUS v28; 
  unsigned int StartBase; 
  NTSTATUS v30; 
  WCHAR *v31; 
  _RTL_NORM_BUFFER *v32; 
  INT64 v33; 
  __int64 v34; 
  __int64 v35; 
  __int64 v36; 
  unsigned int v38; 
  char v39; 
  UINT8 v40; 
  UINT8 v41; 
  UINT8 v42; 
  unsigned int v43; 
  char v44; 
  UINT8 v45; 
  __int64 v46; 
  __int64 v47; 
  unsigned __int64 v48; 
  char v49; 
  unsigned __int16 *v50; 
  INT64 v51; 
  signed int v52; 
  unsigned __int16 v53; 
  _RTL_NORM_BUFFER *v54; 
  unsigned __int16 v55; 
  unsigned int LastChar; 
  unsigned int v57; 
  NTSTATUS v58; 
  unsigned int v59; 
  unsigned __int16 *v60; 
  INT64 v61; 
  unsigned int v62; 
  __int64 v63; 
  unsigned __int16 *v64; 
  __int64 v65; 

  v5 = bPage;
  v6 = cTest;
  if( !bPage )
    goto LABEL_26;
  while( 1 )
  {
    while( 1 )
    {
      switch( v5 )
      {
        case 0u:
          goto LABEL_125;
        case 0xFBu:
          if( !*((_BYTE *)pNormalization + 113) )
            return -1073740009;
LABEL_125:
          v49 = NormBuffer__Append(pNormBuffer, v6);
          goto LABEL_96;
        case 0xFCu:
          return -1073740009;
        case 0xFDu:
          return Normalization__AppendDecomposedChar(pNormalization, v6, pNormBuffer);
      }
      if( v5 != 254 )
        break;
      v14 = (unsigned __int16 *)*((_QWORD *)pNormBuffer + 2);
      if( v14 == *((unsigned __int16 **)pNormBuffer + 1) )
        return -1073740009;
      v15 = *v14;
      *((_QWORD *)pNormBuffer + 2) = v14 + 1;
      if( (unsigned __int16)(v15 + 9216) > 0x3FFu )
        return -1073740009;
      v6 = v15 + ((v6 - 55287) << 10);
      v5 = *(_BYTE *)(((__int64)(int)v6 >> 7) + *((_QWORD *)pNormalization + 4));
LABEL_30:
      if( !v5 )
        goto LABEL_26;
    }
    if( v5 != 255 )
      break;
    if( (int)v6 < 44032 )
    {
      if( v6 - 4352 <= 0x12 )
      {
        v60 = (unsigned __int16 *)*((_QWORD *)pNormBuffer + 2);
        if( v60 != *((unsigned __int16 **)pNormBuffer + 1) )
        {
          v61 = *v60;
          *((_QWORD *)pNormBuffer + 2) = v60 + 1;
          v62 = ComposeHangulLV(v6, v61);
          if( !v62 )
          {
            *((_QWORD *)pNormBuffer + 2) = v63;
            goto LABEL_26;
          }
          v6 = v62;
          if( v50 != v64 )
          {
            *((_QWORD *)pNormBuffer + 2) = v50 + 1;
            v51 = v62;
            goto LABEL_119;
          }
        }
LABEL_26:
        v13 = NormBuffer__Append(pNormBuffer, v6);
LABEL_92:
        if( !v13 )
          return -1073741789;
        return 0;
      }
      if( v6 - 4449 <= 0x14 )
      {
        if( (unsigned int)(NormBuffer__GetLastChar((INT64)pNormBuffer) - 4352) > 0x12 )
          goto LABEL_26;
        NormBuffer__RewindOutputCharacter((INT64)pNormBuffer);
        v58 = ComposeHangulLV(v59, v6);
        goto LABEL_114;
      }
      if( v6 - 4520 <= 0x1A )
      {
        LastChar = NormBuffer__GetLastChar((INT64)pNormBuffer);
        if( IsHangulLV(LastChar) )
        {
          NormBuffer__RewindOutputCharacter((INT64)pNormBuffer);
          v58 = ComposeHangulLVT(v57, v6);
          goto LABEL_114;
        }
        goto LABEL_26;
      }
      if( ((*pNormalization - 13) & 0xFFFFFEFF) != 0 || v6 - 4447 > 1 )
        goto LABEL_26;
    }
    else
    {
      if( (int)v6 < 55204 )
      {
        if( *((_BYTE *)pNormalization + 112) != 1 )
        {
          if( !IsHangulLV(v6) )
            goto LABEL_26;
          v50 = (unsigned __int16 *)*((_QWORD *)pNormBuffer + 2);
          if( v50 == *((unsigned __int16 **)pNormBuffer + 1) )
            goto LABEL_26;
          v51 = v6;
          *((_QWORD *)pNormBuffer + 2) = v50 + 1;
LABEL_119:
          v58 = ComposeHangulLVT(v51, *v50);
          if( !v58 )
          {
            *((_QWORD *)pNormBuffer + 2) = v65;
            goto LABEL_26;
          }
LABEL_114:
          v6 = v58;
          goto LABEL_26;
        }
        v52 = v6 - 44032;
        if( !(unsigned __int8)NormBuffer__AppendEx(
                                 pNormBuffer,
                                 (unsigned __int16)((int)(v6 - 44032) / 588 + 4352),
                                 0,
                                 0) )
          return -1073741789;
        v53 = (int)(v6 - 44032) % 588 / 28 + 4449;
        if( !(unsigned __int8)NormBuffer__AppendEx(pNormBuffer, v53, 0, 0) )
          return -1073741789;
        v55 = (unsigned __int16)(v52 % 28) != 0 ? v52 % 28 + 4519 : 0;
        if( v55 )
        {
          if( !(unsigned __int8)NormBuffer__AppendEx(v54, v55, 0, 0) )
            return -1073741789;
          v53 = v55;
        }
        *((_QWORD *)pNormBuffer + 10) = *((_QWORD *)pNormBuffer + 5);
        pNormBuffer[22] = v53;
        goto LABEL_98;
      }
      if( v6 - 55216 <= 0x16 || v6 - 55243 <= 0x30 )
        goto LABEL_26;
    }
    v5 = -5;
  }
  v8 = *(unsigned __int8 *)((v6 & 0x7F) + ((unsigned __int64)v5 << 7) + *((_QWORD *)pNormalization + 5) - 128);
  if( !(_BYTE)v8 )
    goto LABEL_95;
  v9 = v8 & 0xC0;
  v10 = v8 & 0x3F;
  if( (v8 & 0x3F) != 0 && v10 != 63 )
  {
    if( (v8 & 0x80) == 0 )
    {
      if( !(unsigned __int8)NormBuffer__AppendEx(pNormBuffer, v6, v8 & 0x3F, v8 & 0xC0) )
        return -1073741789;
      *((_QWORD *)pNormBuffer + 10) = *((_QWORD *)pNormBuffer + 5);
      pNormBuffer[22] = v6;
      *((_BYTE *)pNormBuffer + 92) = v10;
      *((_BYTE *)pNormBuffer + 93) = v9;
      return 0;
    }
    NormBuffer__GetLastChar((INT64)pNormBuffer);
    v18 = *((_BYTE *)pNormBuffer + 72);
    if( !v18 || v18 == 63 || (v19 = *((_BYTE *)pNormBuffer + 73), (v19 & v17) == 0) )
    {
      v19 = *((_BYTE *)pNormBuffer + 73);
      *((_QWORD *)pNormBuffer + 10) = *((_QWORD *)pNormBuffer + 8) + 2i64;
      pNormBuffer[22] = pNormBuffer[14];
      *((_BYTE *)pNormBuffer + 92) = v18;
      *((_BYTE *)pNormBuffer + 93) = v19;
      *((_QWORD *)pNormBuffer + 12) = 0i64;
    }
    if( v9 == 0x80
      || ((unsigned __int8)((*((_BYTE *)pNormBuffer + 92) | *((_BYTE *)pNormBuffer + 93)) + 64) & v17) == 0 )
    {
      LOBYTE(v16) = v10;
      NormBuffer__IsBlocked(pNormBuffer, v16);
      goto LABEL_61;
    }
    if( !v18 || v18 == 63 )
    {
      if( Normalization__CanCombinableCharactersCombine(pNormalization, (unsigned int)pNormBuffer[22], v6) )
      {
        NormBuffer__RewindOutputCharacter((INT64)pNormBuffer);
        v6 = v46;
        v47 = *((_QWORD *)pNormalization + 5);
        v48 = (v46 & 0x7F) + ((unsigned __int64)*(unsigned __int8 *)((v46 >> 7) + *((_QWORD *)pNormalization + 4)) << 7);
        v9 = *(_BYTE *)(v48 + v47 - 128) & 0xC0;
        v10 = *(_BYTE *)(v48 + v47 - 128) & 0x3F;
      }
LABEL_90:
      v32 = pNormBuffer;
      v33 = v6;
LABEL_91:
      v13 = NormBuffer__AppendEx(v32, v33, v10, v9);
      goto LABEL_92;
    }
    if( v19 )
    {
      if( v19 != 64 )
      {
        LOBYTE(v16) = v10;
        if( NormBuffer__IsBlocked(pNormBuffer, v16) )
          goto LABEL_61;
        v20 = *((_BYTE *)pNormBuffer + 92);
        if( !v20 || v20 == 63 || *((_BYTE *)pNormBuffer + 93) == 64 )
        {
          CanCombinableCharactersCombine = Normalization__CanCombinableCharactersCombine(
                                             pNormalization,
                                             (unsigned int)pNormBuffer[22],
                                             v6);
          v22 = CanCombinableCharactersCombine;
          if( CanCombinableCharactersCombine )
          {
            v23 = *((_QWORD *)pNormalization + 4);
            v24 = *((_QWORD *)pNormBuffer + 10);
            pNormBuffer[22] = v22;
            v25 = *(_BYTE *)((v22 & 0x7F)
                           + ((unsigned __int64)*(unsigned __int8 *)((v22 >> 7) + v23) << 7)
                           + *((_QWORD *)pNormalization + 5)
                           - 128);
            *(_WORD *)(v24 - 2) = v22;
            *((_BYTE *)pNormBuffer + 93) = v25 & 0xC0;
            v26 = (v25 & 0xC0) == 64;
            *((_BYTE *)pNormBuffer + 92) = v25 & 0x3F;
LABEL_80:
            if( v26 )
              NormBuffer__RecheckStartCombinations(pNormBuffer);
            return 0;
          }
          if( !v20 || v20 == 63 )
            goto LABEL_61;
        }
        if( v20 <= v10 )
          goto LABEL_61;
        if( v20 == *((_BYTE *)pNormalization + 116) )
        {
          if( v10 >= *((_BYTE *)pNormalization + 114) )
          {
            if( v10 == *((_BYTE *)pNormalization + 115) )
              goto LABEL_58;
LABEL_61:
            v31 = (WCHAR *)*((_QWORD *)pNormBuffer + 13);
            v32 = pNormBuffer;
            v33 = v6;
            if( v31 != *((WCHAR **)pNormBuffer + 5) )
            {
              v13 = NormBuffer__Insert(pNormBuffer, v6, v31);
              goto LABEL_92;
            }
            goto LABEL_91;
          }
        }
        else if( v20 == *((_BYTE *)pNormalization + 118) && v10 == *((_BYTE *)pNormalization + 117) )
        {
LABEL_58:
          StartBasePair = NormBuffer__LastStartBasePair(pNormBuffer);
          v28 = Normalization__CanCombinableCharactersCombine(pNormalization, StartBasePair, v6);
          if( v28 )
          {
LABEL_75:
            v39 = *(_BYTE *)((v28 & 0x7F)
                           + ((unsigned __int64)*(unsigned __int8 *)(((__int64)v28 >> 7)
                                                                   + *((_QWORD *)pNormalization + 4)) << 7)
                           + *((_QWORD *)pNormalization + 5)
                           - 128);
            v40 = v39 & 0x3F;
            v41 = v39 & 0xC0;
            v42 = NormBuffer__ReplaceLastStartBasePair(pNormBuffer, (unsigned int)v28, v40, v41);
LABEL_78:
            if( !v42 )
              return -1073741789;
            v26 = v41 == 64;
            goto LABEL_80;
          }
          goto LABEL_61;
        }
        StartBase = NormBuffer__LastStartBase(pNormBuffer);
        v30 = Normalization__CanCombinableCharactersCombine(pNormalization, StartBase, v6);
        if( !v30 )
          goto LABEL_61;
LABEL_77:
        v44 = *(_BYTE *)((v30 & 0x7F)
                       + ((unsigned __int64)*(unsigned __int8 *)(((__int64)v30 >> 7) + *((_QWORD *)pNormalization + 4)) << 7)
                       + *((_QWORD *)pNormalization + 5)
                       - 128);
        v45 = v44 & 0x3F;
        v41 = v44 & 0xC0;
        v42 = NormBuffer__ReplaceLastStartBase(pNormBuffer, (unsigned int)v30, v45, v41);
        goto LABEL_78;
      }
      if( Normalization__CanCombinableCharactersCombine(pNormalization, (unsigned int)pNormBuffer[22], v6) )
      {
        NormBuffer__RewindOutputCharacter((INT64)pNormBuffer);
        v35 = *(unsigned __int8 *)((v34 & 0x7F)
                                 + ((unsigned __int64)*(unsigned __int8 *)((v34 >> 7) + *((_QWORD *)pNormalization + 4)) << 7)
                                 + *((_QWORD *)pNormalization + 5)
                                 - 128);
        if( !(unsigned __int8)NormBuffer__AppendEx(pNormBuffer, (unsigned int)v34, v35 & 0x3F, v35 & 0xC0) )
          return -1073741789;
        v36 = *((_QWORD *)pNormBuffer + 8);
        *((_QWORD *)pNormBuffer + 12) = 0i64;
        *((_QWORD *)pNormBuffer + 10) = v36 + 2;
        pNormBuffer[22] = pNormBuffer[14];
        *((_BYTE *)pNormBuffer + 92) = *((_BYTE *)pNormBuffer + 72);
        *((_BYTE *)pNormBuffer + 93) = *((_BYTE *)pNormBuffer + 73);
        return 0;
      }
    }
    if( v18 <= v10 )
      goto LABEL_90;
    if( v18 == *((_BYTE *)pNormalization + 116) )
    {
      if( v10 >= *((_BYTE *)pNormalization + 114) )
      {
        if( v10 != *((_BYTE *)pNormalization + 115) )
          goto LABEL_90;
LABEL_74:
        v38 = NormBuffer__LastStartBasePair(pNormBuffer);
        v28 = Normalization__CanCombinableCharactersCombine(pNormalization, v38, v6);
        if( !v28 )
          goto LABEL_90;
        goto LABEL_75;
      }
    }
    else if( v18 == *((_BYTE *)pNormalization + 118) && v10 == *((_BYTE *)pNormalization + 117) )
    {
      goto LABEL_74;
    }
    v43 = NormBuffer__LastStartBase(pNormBuffer);
    v30 = Normalization__CanCombinableCharactersCombine(pNormalization, v43, v6);
    if( !v30 )
      goto LABEL_90;
    goto LABEL_77;
  }
  switch( v8 )
  {
    case 127:
      if( !*((_BYTE *)pNormalization + 113) )
        return -1073740009;
LABEL_95:
      v49 = NormBuffer__AppendEx(pNormBuffer, v6, 0, 0);
LABEL_96:
      if( !v49 )
        return -1073741789;
      *((_QWORD *)pNormBuffer + 10) = *((_QWORD *)pNormBuffer + 5);
      pNormBuffer[22] = v6;
LABEL_98:
      *((_WORD *)pNormBuffer + 46) = 0;
      return 0;
    case 191:
      return Normalization__AppendDecomposedChar(pNormalization, v6, pNormBuffer);
    case 192:
      v11 = NormBuffer__GetLastChar((INT64)pNormBuffer);
      if( !Normalization__CanCombinableCharactersCombine(pNormalization, v11, v6) )
        goto LABEL_90;
      NormBuffer__RewindOutputCharacter((INT64)pNormBuffer);
      v6 = v12;
      goto LABEL_30;
  }
  if( v8 != 255 || !v6 && *((_QWORD *)pNormBuffer + 2) == *((_QWORD *)pNormBuffer + 1) )
    goto LABEL_90;
  return -1073740009;
}

Referenced by:

Normalization__AppendDecomposedChar
Normalization__Normalize