BZ2_hbMakeCodeLengths
0x00298d70 · 1281 bytes · __cdecl
_Z21BZ2_hbMakeCodeLengthsPhPiii
Decompiled
undefined (4 params)
/* BZ2_hbMakeCodeLengths(unsigned char*, int*, int, int) */
void BZ2_hbMakeCodeLengths(uchar *param_1,int *param_2,int param_3,int param_4)
{
int iVar1;
bool bVar2;
int iVar3;
int iVar4;
int iVar5;
uint *puVar6;
uint *puVar7;
uint uVar8;
int iVar9;
uint uVar10;
int iVar11;
int iVar12;
int iVar13;
uint uVar14;
int local_1470;
int local_1464;
int *local_1460;
int local_145c;
int local_1450 [261];
uint local_103c [516];
int local_82c [519];
if (0 < param_3) {
iVar11 = 0;
do {
iVar3 = iVar11 + 1;
uVar8 = param_2[iVar11] << 8;
if (param_2[iVar11] == 0) {
uVar8 = 0x100;
}
local_103c[iVar3] = uVar8;
iVar11 = iVar3;
} while (iVar3 != param_3);
}
do {
local_1450[1] = 0;
local_103c[0] = 0;
local_82c[0] = -2;
iVar11 = param_3;
if (0 < param_3) {
iVar3 = 1;
do {
local_1450[iVar3 + 1] = iVar3;
local_82c[iVar3] = -1;
uVar14 = local_103c[iVar3];
iVar4 = local_1450[(iVar3 >> 1) + 1];
uVar8 = local_103c[iVar4];
iVar9 = iVar3 >> 1;
iVar5 = iVar3;
while (iVar12 = iVar9, (int)uVar14 < (int)uVar8) {
local_1450[iVar5 + 1] = iVar4;
iVar9 = iVar12 >> 1;
iVar4 = local_1450[iVar9 + 1];
iVar5 = iVar12;
uVar8 = local_103c[iVar4];
}
local_1450[iVar5 + 1] = iVar3;
iVar3 = iVar3 + 1;
} while (iVar3 != param_3 + 1);
if (param_3 != 1) {
local_1460 = local_1450 + param_3;
local_1470 = param_3 + -2;
local_145c = param_3;
local_1464 = param_3;
do {
iVar3 = local_1450[2];
local_145c = local_145c + -1;
iVar11 = local_1460[1];
local_1450[2] = iVar11;
if (local_145c < 2) {
iVar5 = 1;
}
else {
uVar8 = local_103c[iVar11];
iVar4 = 2;
iVar5 = 1;
do {
if (iVar4 < local_145c) {
iVar9 = iVar4 + 1;
iVar12 = local_1450[iVar4 + 1];
iVar13 = local_1450[iVar4 + 2];
uVar14 = local_103c[iVar13];
uVar10 = local_103c[iVar12];
if ((int)uVar10 <= (int)uVar14) goto LAB_00298f36;
}
else {
iVar12 = local_1450[iVar4 + 1];
uVar10 = local_103c[iVar12];
LAB_00298f36:
iVar9 = iVar4;
iVar13 = iVar12;
uVar14 = uVar10;
}
if ((int)uVar8 < (int)uVar14) break;
local_1450[iVar5 + 1] = iVar13;
iVar4 = iVar9 * 2;
iVar5 = iVar9;
} while (iVar4 <= local_145c);
}
local_1450[iVar5 + 1] = iVar11;
iVar4 = local_1450[2];
iVar11 = *local_1460;
local_1450[2] = iVar11;
if (local_1470 < 2) {
iVar9 = 1;
}
else {
uVar8 = local_103c[iVar11];
iVar5 = 2;
iVar9 = 1;
do {
if (iVar5 < local_1470) {
iVar12 = iVar5 + 1;
iVar13 = local_1450[iVar5 + 1];
iVar1 = local_1450[iVar5 + 2];
uVar14 = local_103c[iVar1];
uVar10 = local_103c[iVar13];
if ((int)uVar10 <= (int)uVar14) goto LAB_0029900e;
}
else {
iVar13 = local_1450[iVar5 + 1];
uVar10 = local_103c[iVar13];
LAB_0029900e:
iVar12 = iVar5;
iVar1 = iVar13;
uVar14 = uVar10;
}
if ((int)uVar8 < (int)uVar14) break;
local_1450[iVar9 + 1] = iVar1;
iVar5 = iVar12 * 2;
iVar9 = iVar12;
} while (iVar5 <= local_1470);
}
local_1464 = local_1464 + 1;
local_1450[iVar9 + 1] = iVar11;
uVar8 = local_103c[iVar4];
local_82c[iVar4] = local_1464;
local_82c[iVar3] = local_1464;
uVar10 = uVar8 & 0xff;
uVar14 = local_103c[iVar3] & 0xff;
if (uVar14 < uVar10) {
uVar14 = uVar10;
}
uVar14 = uVar14 + 1 | (uVar8 & 0xffffff00) + (local_103c[iVar3] & 0xffffff00);
local_103c[local_1464] = uVar14;
local_82c[local_1464] = -1;
*local_1460 = local_1464;
iVar11 = local_1450[(local_145c >> 1) + 1];
uVar8 = local_103c[iVar11];
iVar3 = local_145c;
iVar4 = local_145c >> 1;
while ((int)uVar14 < (int)uVar8) {
local_1450[iVar3 + 1] = iVar11;
iVar11 = local_1450[(iVar4 >> 1) + 1];
iVar3 = iVar4;
iVar4 = iVar4 >> 1;
uVar8 = local_103c[iVar11];
}
local_1460 = local_1460 + -1;
local_1470 = local_1470 + -1;
local_1450[iVar3 + 1] = local_1464;
} while (local_145c != 1);
iVar11 = param_3 * 2 + -1;
}
}
if (0x203 < iVar11) {
BZ2_bz__AssertH__fail(0x7d2);
}
if (param_3 < 1) {
return;
}
bVar2 = false;
iVar11 = 1;
do {
iVar3 = local_82c[iVar11];
if (iVar3 < 0) {
iVar4 = 0;
}
else {
iVar4 = 0;
do {
iVar3 = local_82c[iVar3];
iVar4 = iVar4 + 1;
} while (-1 < iVar3);
}
param_1[iVar11 + -1] = (uchar)iVar4;
if (param_4 < iVar4) {
bVar2 = true;
}
iVar11 = iVar11 + 1;
} while (iVar11 != param_3 + 1);
if (!bVar2) {
return;
}
if (param_3 != 1) {
puVar6 = local_103c + 1;
do {
puVar7 = puVar6 + 1;
*puVar6 = ((((int)*puVar6 >> 8) - ((int)*puVar6 >> 0x1f) >> 1) + 1) * 0x100;
puVar6 = puVar7;
} while (puVar7 != local_103c + param_3);
}
} while( true );
}
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.