deflate_fast
0x000eca20 · 661 bytes · __cdecl
_Z12deflate_fastR6TState
Decompiled
undefined (1 param)
/* deflate_fast(TState&) */
void deflate_fast(TState *param_1)
{
uint uVar1;
TState *pTVar2;
uint uVar3;
uint uVar4;
uint uVar5;
int iVar7;
uint uVar8;
int local_24;
uint local_20;
uint uVar6;
local_20 = 0;
*(undefined4 *)(param_1 + 0x6af80) = 2;
uVar1 = *(uint *)(param_1 + 0x6af90);
uVar8 = 0;
while (uVar1 != 0) {
while( true ) {
uVar4 = *(uint *)(param_1 + 0x6af84);
if (2 < uVar1) {
uVar3 = ((uint)(byte)param_1[uVar4 + 0x1af72] ^ *(int *)(param_1 + 0x6af7c) << 5) & 0x7fff;
*(uint *)(param_1 + 0x6af7c) = uVar3;
uVar8 = *(uint *)(param_1 + uVar3 * 4 + 0x4af70);
*(uint *)(param_1 + (uVar4 & 0x7fff) * 4 + 0x2af70) = uVar8;
*(uint *)(param_1 + uVar3 * 4 + 0x4af70) = uVar4;
}
if ((uVar8 != 0) && (uVar4 - uVar8 < 0x7efb)) {
if (uVar1 < *(uint *)(param_1 + 0x6afa0)) {
*(uint *)(param_1 + 0x6afa0) = uVar1;
}
uVar1 = longest_match(param_1,uVar8);
local_20 = *(uint *)(param_1 + 0x6af90);
if (uVar1 <= *(uint *)(param_1 + 0x6af90)) {
local_20 = uVar1;
}
uVar4 = *(uint *)(param_1 + 0x6af84);
}
uVar1 = local_20;
if (local_20 < 3) {
local_24 = ct_tally(param_1,0,(uint)(byte)param_1[uVar4 + 0x1af70]);
*(int *)(param_1 + 0x6af90) = *(int *)(param_1 + 0x6af90) + -1;
*(int *)(param_1 + 0x6af84) = *(int *)(param_1 + 0x6af84) + 1;
}
else {
local_24 = ct_tally(param_1,uVar4 - *(int *)(param_1 + 0x6af88),local_20 - 3);
iVar7 = *(int *)(param_1 + 0x6af90);
*(uint *)(param_1 + 0x6af90) = iVar7 - local_20;
if ((*(uint *)(param_1 + 0x6af98) < local_20) || (iVar7 - local_20 < 3)) {
local_20 = 0;
iVar7 = uVar1 + *(int *)(param_1 + 0x6af84);
*(int *)(param_1 + 0x6af84) = iVar7;
*(uint *)(param_1 + 0x6af7c) =
(uint)(byte)param_1[iVar7 + 0x1af71] ^ (uint)(byte)param_1[iVar7 + 0x1af70] << 5;
}
else {
uVar4 = *(uint *)(param_1 + 0x6af84);
uVar3 = *(uint *)(param_1 + 0x6af7c);
uVar6 = uVar4;
do {
uVar5 = uVar6 + 1;
uVar3 = (uVar3 << 5 ^ (uint)(byte)param_1[uVar6 + 0x1af73]) & 0x7fff;
uVar8 = *(uint *)(param_1 + uVar3 * 4 + 0x4af70);
*(uint *)(param_1 + (uVar5 & 0x7fff) * 4 + 0x2af70) = uVar8;
*(uint *)(param_1 + uVar3 * 4 + 0x4af70) = uVar5;
uVar6 = uVar5;
} while (uVar5 != (local_20 - 1) + uVar4);
*(uint *)(param_1 + 0x6af7c) = uVar3;
local_20 = 0;
*(uint *)(param_1 + 0x6af84) = uVar1 + uVar4;
}
}
if (local_24 != 0) {
iVar7 = *(int *)(param_1 + 0x6af74);
pTVar2 = (TState *)0x0;
if (-1 < iVar7) {
pTVar2 = param_1 + iVar7 + 0x1af70;
}
flush_block(param_1,(char *)pTVar2,*(int *)(param_1 + 0x6af84) - iVar7,0);
*(undefined4 *)(param_1 + 0x6af74) = *(undefined4 *)(param_1 + 0x6af84);
}
uVar1 = *(uint *)(param_1 + 0x6af90);
if (0x105 < uVar1) break;
fill_window(param_1);
uVar1 = *(uint *)(param_1 + 0x6af90);
if (uVar1 == 0) goto LAB_000ecc0e;
}
}
LAB_000ecc0e:
iVar7 = *(int *)(param_1 + 0x6af74);
pTVar2 = (TState *)0x0;
if (-1 < iVar7) {
pTVar2 = param_1 + iVar7 + 0x1af70;
}
flush_block(param_1,(char *)pTVar2,*(int *)(param_1 + 0x6af84) - iVar7,1);
return;
}
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.