fallbackSort
0x00299440 · 2778 bytes · __regparm3
_ZL12fallbackSortPjS_S_ii
Decompiled
undefined (5 params)
/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
/* fallbackSort(unsigned int*, unsigned int*, unsigned int*, int, int) */
void __regparm3 fallbackSort(uint *param_1,uint *param_2,uint *param_3,int param_4,int param_5)
{
uint uVar1;
uint uVar2;
uint uVar3;
int *piVar4;
uint uVar5;
uint uVar6;
uint uVar7;
uint uVar8;
uint uVar9;
uint *puVar10;
int iVar11;
int iVar12;
int local_b94;
int local_b88;
int local_b80;
uint local_b78;
int local_b74;
uint local_b70;
uint local_b68;
uint local_b64;
uint local_b60;
uint local_b58;
uint local_b50;
uint local_b40 [100];
uint local_9b0 [100];
int local_820 [256];
int local_420 [257];
int local_1c [3];
if (3 < param_5) {
fwrite(" bucket sorting ...\n",1,0x1b,_stderr);
}
piVar4 = local_420;
do {
*piVar4 = 0;
piVar4 = piVar4 + 1;
} while (piVar4 != local_1c);
if (0 < param_4) {
puVar10 = param_2;
do {
uVar3 = *puVar10;
puVar10 = (uint *)((int)puVar10 + 1);
local_420[(byte)uVar3] = local_420[(byte)uVar3] + 1;
} while (puVar10 != (uint *)(param_4 + (int)param_2));
}
iVar11 = 0;
do {
local_820[iVar11] = local_420[iVar11];
iVar11 = iVar11 + 1;
} while (iVar11 != 0x100);
piVar4 = local_420 + 1;
do {
*piVar4 = *piVar4 + piVar4[-1];
piVar4 = piVar4 + 1;
} while (piVar4 != local_1c);
uVar3 = 0;
if (0 < param_4) {
do {
iVar11 = local_420[*(byte *)((int)param_2 + uVar3)];
local_420[*(byte *)((int)param_2 + uVar3)] = iVar11 + -1;
param_1[iVar11 + -1] = uVar3;
uVar3 = uVar3 + 1;
} while (uVar3 != param_4);
}
iVar11 = param_4 + 0x1f;
if (-1 < param_4) {
iVar11 = param_4;
}
iVar12 = 0;
if (-2 < iVar11 >> 5) {
do {
param_3[iVar12] = 0;
iVar12 = iVar12 + 1;
} while (iVar12 != (iVar11 >> 5) + 2);
}
piVar4 = local_420;
do {
iVar11 = *piVar4;
piVar4 = piVar4 + 1;
param_3[iVar11 >> 5] = param_3[iVar11 >> 5] | 1 << ((byte)iVar11 & 0x1f);
} while (piVar4 != local_420 + 0x100);
iVar11 = 0;
do {
param_3[iVar11 + param_4 >> 5] =
param_3[iVar11 + param_4 >> 5] | 1 << ((byte)(iVar11 + param_4) & 0x1f);
iVar12 = param_4 + 1 + iVar11;
iVar11 = iVar11 + 2;
param_3[iVar12 >> 5] = param_3[iVar12 >> 5] & ~(1 << ((byte)iVar12 & 0x1f));
} while (iVar11 != 0x40);
local_b88 = 1;
LAB_00299603:
if (3 < param_5) {
fprintf(_stderr," depth %6d has ",local_b88);
}
uVar3 = 0;
uVar7 = 0;
if (0 < param_4) {
do {
if ((param_3[(int)uVar7 >> 5] & 1 << ((byte)uVar7 & 0x1f)) != 0) {
uVar3 = uVar7;
}
iVar11 = param_1[uVar7] - local_b88;
if (iVar11 < 0) {
iVar11 = iVar11 + param_4;
}
uVar7 = uVar7 + 1;
param_2[iVar11] = uVar3;
} while (uVar7 != param_4);
}
local_b94 = 0;
uVar3 = 0;
LAB_00299690:
uVar8 = uVar3 & 0x1f;
uVar7 = param_3[(int)uVar3 >> 5];
uVar5 = uVar7 & 1 << (sbyte)uVar8;
while (uVar5 != 0) {
if (uVar8 == 0) goto joined_r0x00299db4;
uVar3 = uVar3 + 1;
uVar8 = uVar3 & 0x1f;
uVar7 = param_3[(int)uVar3 >> 5];
uVar5 = uVar7 & 1 << (sbyte)uVar8;
}
goto LAB_002996e3;
joined_r0x00299db4:
while (uVar7 == 0xffffffff) {
uVar3 = uVar3 + 0x20;
uVar7 = param_3[(int)uVar3 >> 5];
}
uVar7 = 1 << ((byte)uVar3 & 0x1f) & uVar7;
while (uVar7 != 0) {
uVar3 = uVar3 + 1;
uVar7 = param_3[(int)uVar3 >> 5] & 1 << ((byte)uVar3 & 0x1f);
}
LAB_002996e3:
uVar7 = uVar3 - 1;
if (param_4 <= (int)uVar7) goto LAB_00299e3b;
uVar9 = uVar3 & 0x1f;
uVar5 = param_3[(int)uVar3 >> 5];
uVar8 = uVar7;
if ((uVar5 & 1 << (sbyte)uVar9) != 0) goto LAB_00299756;
do {
if (uVar9 == 0) goto joined_r0x00299d60;
uVar3 = uVar3 + 1;
uVar9 = uVar3 & 0x1f;
uVar5 = param_3[(int)uVar3 >> 5];
} while ((uVar5 & 1 << (sbyte)uVar9) == 0);
LAB_00299753:
uVar8 = uVar3 - 1;
LAB_00299756:
if (param_4 <= (int)uVar8) goto LAB_00299e3b;
uVar3 = uVar8 + 1;
if ((int)uVar7 < (int)uVar8) {
local_b80 = 1;
local_9b0[0] = uVar8;
local_b78 = 0;
local_b40[0] = uVar7;
local_b94 = local_b94 + 1 + (uVar8 - uVar7);
local_b70 = uVar7;
local_b60 = uVar8;
do {
local_b74 = local_b80 + -1;
if (9 < (int)(local_b60 - local_b70)) {
local_b78 = local_b78 * 0x1dc5 + 1 & 0x7fff;
if (local_b78 == (local_b78 / 3) * 3) {
local_b58 = param_2[param_1[local_b70]];
}
else if (local_b78 % 3 == 1) {
local_b58 = param_2[param_1[(int)(local_b70 + local_b60) >> 1]];
}
else {
local_b58 = param_2[param_1[local_b60]];
}
local_b68 = local_b70;
local_b50 = local_b60;
uVar3 = local_b60;
uVar5 = local_b70;
LAB_002998bb:
while (uVar9 = uVar5, local_b64 = uVar9 + 1, (int)uVar9 <= (int)uVar3) {
uVar6 = param_1[uVar9];
if (param_2[uVar6] == local_b58) {
param_1[uVar9] = param_1[local_b68];
param_1[local_b68] = uVar6;
local_b68 = local_b68 + 1;
uVar5 = local_b64;
}
else {
uVar5 = local_b64;
if (0 < (int)(param_2[uVar6] - local_b58)) {
puVar10 = param_1 + uVar3;
do {
uVar3 = uVar3 - 1;
uVar5 = *puVar10;
if (param_2[uVar5] == local_b58) {
*puVar10 = param_1[local_b50];
param_1[local_b50] = uVar5;
local_b50 = local_b50 - 1;
}
else if ((int)(param_2[uVar5] - local_b58) < 0) goto LAB_00299ad8;
puVar10 = puVar10 + -1;
if ((int)uVar3 < (int)uVar9) goto LAB_002998ce;
} while( true );
}
}
}
LAB_002998ce:
if ((int)local_b50 < (int)local_b68) goto LAB_00299b38;
iVar11 = uVar9 - local_b68;
if ((int)(local_b68 - local_b70) <= (int)(uVar9 - local_b68)) {
iVar11 = local_b68 - local_b70;
}
if (0 < iVar11) {
puVar10 = param_1 + local_b70;
iVar12 = (uVar9 - iVar11) - local_b70;
do {
uVar5 = *puVar10;
*puVar10 = puVar10[iVar12];
puVar10[iVar12] = uVar5;
puVar10 = puVar10 + 1;
} while (puVar10 != param_1 + iVar11 + local_b70);
}
iVar11 = local_b50 - uVar3;
if ((int)(local_b60 - local_b50) <= (int)(local_b50 - uVar3)) {
iVar11 = local_b60 - local_b50;
}
if (0 < iVar11) {
puVar10 = param_1 + uVar9;
iVar12 = (local_b60 - iVar11) - uVar9;
do {
uVar5 = *puVar10;
*puVar10 = puVar10[iVar12 + 1];
puVar10[iVar12 + 1] = uVar5;
puVar10 = puVar10 + 1;
} while (puVar10 != param_1 + iVar11 + uVar9);
}
uVar5 = ((uVar9 + local_b70) - local_b68) - 1;
uVar3 = local_b60 + 1 + (uVar3 - local_b50);
if ((int)(local_b60 - uVar3) < (int)(uVar5 - local_b70)) {
local_9b0[local_b74] = uVar5;
local_b40[local_b80] = uVar3;
local_9b0[local_b80] = local_b60;
local_b74 = local_b80 + 1;
}
else {
local_b40[local_b74] = uVar3;
local_9b0[local_b80] = uVar5;
local_b40[local_b80] = local_b70;
local_b74 = local_b80 + 1;
}
goto LAB_00299a32;
}
if (local_b70 != local_b60) {
if ((3 < (int)(local_b60 - local_b70)) && ((int)local_b70 <= (int)(local_b60 - 4))) {
local_b50 = local_b60;
do {
uVar3 = param_1[local_b50 - 4];
uVar5 = param_2[uVar3];
uVar9 = local_b50;
if ((int)local_b50 <= (int)local_b60) {
uVar1 = param_1[local_b50];
uVar6 = param_2[uVar1];
while (uVar6 < uVar5) {
uVar6 = uVar9 + 4;
param_1[uVar9 - 4] = uVar1;
uVar9 = uVar6;
if ((int)local_b60 < (int)uVar6) break;
uVar1 = param_1[uVar6];
uVar6 = param_2[uVar1];
}
}
local_b50 = local_b50 - 1;
param_1[uVar9 - 4] = uVar3;
} while (local_b50 != local_b70 + 3);
}
if ((int)local_b70 < (int)local_b60) {
local_b50 = local_b60;
do {
uVar3 = param_1[local_b50 - 1];
uVar5 = param_2[uVar3];
uVar9 = local_b50;
if ((int)local_b50 <= (int)local_b60) {
uVar1 = param_1[local_b50];
uVar6 = param_2[uVar1];
uVar2 = local_b50;
while (uVar9 = uVar2, uVar6 < uVar5) {
uVar9 = uVar2 + 1;
param_1[uVar2 - 1] = uVar1;
if ((int)local_b60 < (int)uVar9) break;
uVar1 = param_1[uVar9];
uVar2 = uVar9;
uVar6 = param_2[uVar1];
}
}
local_b50 = local_b50 - 1;
param_1[uVar9 - 1] = uVar3;
} while (local_b50 != local_b70);
}
}
LAB_00299b38:
if (local_b74 == 0) goto code_r0x00299b46;
LAB_00299a32:
if (99 < local_b74) {
BZ2_bz__AssertH__fail(0x3ec);
}
local_b80 = local_b74;
local_b70 = local_b40[local_b74 + -1];
local_b60 = local_9b0[local_b74 + -1];
} while( true );
}
goto LAB_00299690;
joined_r0x00299d60:
while (uVar5 == 0) {
uVar3 = uVar3 + 0x20;
uVar5 = param_3[(int)uVar3 >> 5];
}
uVar5 = 1 << ((byte)uVar3 & 0x1f) & uVar5;
while (uVar5 == 0) {
uVar3 = uVar3 + 1;
uVar5 = param_3[(int)uVar3 >> 5] & 1 << ((byte)uVar3 & 0x1f);
}
goto LAB_00299753;
LAB_00299e3b:
if (param_5 < 4) {
local_b88 = local_b88 << 1;
if ((local_b94 == 0) || (param_4 < local_b88)) goto LAB_00299e6a;
}
else {
fprintf(_stderr,"%6d unresolved strings\n",local_b94);
local_b88 = local_b88 << 1;
if ((local_b94 == 0) || (param_4 < local_b88)) {
fwrite(" reconstructing block ...\n",1,0x21,_stderr);
LAB_00299e6a:
if (0 < param_4) {
puVar10 = param_1 + param_4;
iVar12 = 0;
iVar11 = local_820[0];
do {
while (iVar11 == 0) {
iVar12 = iVar12 + 1;
iVar11 = local_820[iVar12];
}
uVar3 = *param_1;
param_1 = param_1 + 1;
iVar11 = iVar11 + -1;
local_820[iVar12] = iVar11;
*(char *)((int)param_2 + uVar3) = (char)iVar12;
} while (param_1 != puVar10);
if (0xff < iVar12) {
BZ2_bz__AssertH__fail(0x3ed);
return;
}
}
return;
}
}
goto LAB_00299603;
LAB_00299ad8:
uVar6 = param_1[uVar9];
param_1[uVar9] = uVar5;
*puVar10 = uVar6;
uVar5 = local_b64;
goto LAB_002998bb;
code_r0x00299b46:
uVar3 = uVar8 + 1;
uVar5 = 0xffffffff;
do {
uVar8 = param_2[param_1[uVar7]];
if (uVar5 != uVar8) {
param_3[(int)uVar7 >> 5] = param_3[(int)uVar7 >> 5] | 1 << ((byte)uVar7 & 0x1f);
}
uVar7 = uVar7 + 1;
uVar5 = uVar8;
} while (uVar7 != uVar3);
goto LAB_00299690;
}
SourceMod gamedata
paste intoaddons/sourcemod/gamedata/<your_plugin>.txt
used as the SourceMod key — change to fit your plugin's convention
SourceMod library name (server / engine / matchmaking)
Just a Signatures{} block, ready to drop into a gamedata
file. Wire it up in your plugin however you like - SDKCall, DHooks,
raw memory ops, or anything else.
Signatures + Functions block. The plugin uses
DHookCreateFromConf - DHooks reads return type, this-type,
calling convention, and argument types straight from the gamedata. Less
boilerplate in the plugin, types travel with the gamedata.
Gamedata KeyValues
DHooks plugin example
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.