NormBuffer__RecheckStartCombinations

VOID __fastcall NormBuffer__RecheckStartCombinations(_RTL_NORM_BUFFER *pNormBuffer){
  bool v1; 
  _RTL_NORM_BUFFER *v2; 
  __int64 v3; 
  _RTL_NORM_BUFFER *v4; 
  UINT8 v5; 
  _RTL_NORMALIZATION *v6; 
  unsigned int CurrentOutputChar; 
  unsigned int CanCombinableCharactersCombine; 
  unsigned int v9; 
  UINT8 v10; 
  unsigned __int64 v11; 
  _RTL_NORM_BUFFER *v12; 
  _RTL_NORM_BUFFER *v13; 
  char *v14; 
  __int64 v15; 
  UINT8 pbClass; 
  UINT8 pbFlags; 
  __int64 v18; 

  v1 = *((_BYTE *)pNormBuffer + 93) == 64;
  v2 = pNormBuffer;
  v3 = *((_QWORD *)pNormBuffer + 10);
  v18 = v3;
  if( v1 )
  {
    v4 = (_RTL_NORM_BUFFER *)*((_QWORD *)pNormBuffer + 5);
    v5 = 0;
    if( (_RTL_NORM_BUFFER *)v3 != v4 )
    {
      v6 = (_RTL_NORMALIZATION *)*((_QWORD *)pNormBuffer + 14);
      while( 1 )
      {
        pbClass = 0;
        pbFlags = 0;
        CurrentOutputChar = NormBuffer__GetCurrentOutputChar((WCHAR **)pNormBuffer);
        Normalization__GetCharacterInfo(v6, CurrentOutputChar, &pbClass, &pbFlags);
        if( pbClass == v5 )
          goto LABEL_17;
        if( pbFlags != 0xC0 )
          break;
        CanCombinableCharactersCombine = Normalization__CanCombinableCharactersCombine(
                                           v6,
                                           (unsigned int)v2[22],
                                           CurrentOutputChar);
        v9 = CanCombinableCharactersCombine;
        if( !CanCombinableCharactersCombine )
          break;
        Normalization__GetCharacterInfo(v6, CanCombinableCharactersCombine, &pbClass, &pbFlags);
        v10 = pbFlags;
        v4 = (_RTL_NORM_BUFFER *)(*((_QWORD *)v2 + 5) - 2i64);
        v11 = v18;
        *((_BYTE *)v2 + 92) = pbClass;
        v12 = (_RTL_NORM_BUFFER *)v11;
        v13 = (_RTL_NORM_BUFFER *)*((_QWORD *)v2 + 8);
        *(_WORD *)(v3 - 2) = v9;
        v2[22] = v9;
        *((_BYTE *)v2 + 93) = v10;
        *((_QWORD *)v2 + 5) = v4;
        if( v13 == v4 )
        {
          if( v11 >= (unsigned __int64)v13 )
          {
            v15 = *((_QWORD *)v2 + 3);
            v2[14] = 0;
            v14 = (char *)(v15 - 2);
            *((_WORD *)v2 + 36) = 0;
          }
          else
          {
            v14 = (char *)v13 - 2;
          }
          *((_QWORD *)v2 + 8) = v14;
        }
        if( (_RTL_NORM_BUFFER *)v11 != v4 )
        {
          do
          {
            pNormBuffer = (_RTL_NORM_BUFFER *)((char *)v12 + 2);
            *(_WORD *)v12 = *((_WORD *)v12 + 1);
            v12 = pNormBuffer;
          }
          while( pNormBuffer != v4 );
        }
        if( v10 != 64 )
          return;
LABEL_18:
        if( (_RTL_NORM_BUFFER *)v11 == v4 )
          return;
      }
      v5 = pbClass;
LABEL_17:
      v11 = v18 + 2;
      v18 += 2i64;
      goto LABEL_18;
    }
  }
}

Referenced by:

Normalization__NormalizeCharacter