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