/* DBCServer_Release_x64.exe sha256 d9e4fccdf3482e50247686d4452c0b13c75a53efc4bd7320668eece8d1ce828c * Ghidra 12.1.2 decompiler output for 0x14020f4b0 FUN_14020f4b0 * Pseudocode, not original source. */ int FUN_14020f4b0(int *param_1,uint param_2,void *param_3,uint *param_4) { byte bVar1; int *piVar2; int iVar3; void *_Src; void *_Base; uint uVar4; uint *puVar5; ulonglong _Count; ulonglong uVar6; uint uVar7; byte *pbVar8; uint uVar9; uVar9 = 1; _Count = (ulonglong)param_2; piVar2 = param_1; if (1 < param_2) { do { if (piVar2[0xe] != *piVar2) { return 0x10; } uVar9 = uVar9 + 1; piVar2 = piVar2 + 0xe; } while (uVar9 < param_2); } _Src = calloc(1,(ulonglong)*param_4); if (_Src != (void *)0x0) { iVar3 = FUN_14020e470(param_1,_Count,_Src,param_4,0xf); if (iVar3 == 0) { _Base = calloc(_Count,0x10); if (_Base == (void *)0x0) { free(_Src); iVar3 = 0xd; } else { uVar6 = (longlong)_Src + 2; if (0x7f < *(byte *)((longlong)_Src + 1)) { uVar6 = uVar6 + (*(byte *)((longlong)_Src + 1) & 0x7f); } uVar9 = (int)uVar6 - (int)_Src; if (uVar6 < (ulonglong)*param_4 + (longlong)_Src) { puVar5 = (uint *)((longlong)_Base + 8); do { *(ulonglong *)(puVar5 + -2) = uVar6; bVar1 = *(byte *)(uVar6 + 1); iVar3 = 2; if (bVar1 < 0x80) { *puVar5 = (uint)bVar1; } else { uVar4 = bVar1 & 0x7f; *puVar5 = 0; if ((bVar1 & 0x7f) != 0) { uVar7 = 0; pbVar8 = (byte *)(uVar6 + 2); iVar3 = uVar4 + 2; do { bVar1 = *pbVar8; pbVar8 = pbVar8 + 1; uVar7 = uVar7 << 8 | (uint)bVar1; uVar4 = uVar4 - 1; *puVar5 = uVar7; } while (uVar4 != 0); } } *puVar5 = *puVar5 + iVar3; uVar4 = *puVar5; puVar5 = puVar5 + 4; uVar6 = uVar6 + uVar4; } while (uVar6 < (ulonglong)*param_4 + (longlong)_Src); } qsort(_Base,_Count,0x10,FUN_14020f420); memcpy(param_3,_Src,(ulonglong)uVar9); if (param_2 != 0) { puVar5 = (uint *)((longlong)_Base + 8); do { memcpy((void *)((ulonglong)uVar9 + (longlong)param_3),*(void **)(puVar5 + -2), (ulonglong)*puVar5); uVar9 = uVar9 + *puVar5; puVar5 = puVar5 + 4; _Count = _Count - 1; } while (_Count != 0); } free(_Base); free(_Src); iVar3 = 0; } return iVar3; } free(_Src); return iVar3; } return 0xd; }