L L4D2node

handle_compress

0x0028e000 · 944 bytes · __regparm3

_ZL15handle_compressP9bz_stream.isra.2

Decompiled

undefined (1 param)

/* handle_compress(bz_stream*) [clone .isra.2] */

bool __regparm3 handle_compress(bz_stream *param_1)

{
  uint uVar1;
  bool bVar2;
  byte bVar3;
  bool bVar4;
  bool bVar5;
  int iVar6;
  int iVar7;
  int *piVar8;
  uint uVar9;
  
  bVar2 = false;
  iVar6 = *(int *)(param_1 + 8);
  bVar5 = false;
  do {
    while (iVar6 != 1) {
      if (iVar6 == 2) {
        iVar7 = *(int *)(param_1 + 4);
        iVar6 = *(int *)(param_1 + 0x44);
        goto LAB_0028e0ea;
      }
    }
    bVar3 = 0;
    bVar4 = bVar2;
LAB_0028e030:
    iVar6 = *(int *)param_1;
    while (*(int *)(iVar6 + 0x14) != 0) {
      if (*(int *)(param_1 + 0x4c) <= *(int *)(param_1 + 0x50)) {
        iVar7 = *(int *)(param_1 + 4);
        goto joined_r0x0028e25f;
      }
      **(undefined1 **)(iVar6 + 0x10) =
           *(undefined1 *)(*(int *)(param_1 + 0x2c) + *(int *)(param_1 + 0x50));
      *(int *)(param_1 + 0x50) = *(int *)(param_1 + 0x50) + 1;
      *(int *)(*(int *)param_1 + 0x14) = *(int *)(*(int *)param_1 + 0x14) + -1;
      *(int *)(*(int *)param_1 + 0x10) = *(int *)(*(int *)param_1 + 0x10) + 1;
      *(int *)(*(int *)param_1 + 0x18) = *(int *)(*(int *)param_1 + 0x18) + 1;
      iVar6 = *(int *)param_1;
      if (*(int *)(iVar6 + 0x18) == 0) {
        *(int *)(iVar6 + 0x1c) = *(int *)(iVar6 + 0x1c) + 1;
        bVar3 = 1;
        goto LAB_0028e030;
      }
      bVar3 = 1;
    }
    bVar2 = (bool)(bVar4 | bVar3);
    if (*(int *)(param_1 + 0x50) < *(int *)(param_1 + 0x4c)) goto LAB_0028e284;
    iVar7 = *(int *)(param_1 + 4);
joined_r0x0028e25f:
    if (((iVar7 == 4) && (bVar2 = (bool)(bVar4 | bVar3), *(int *)(param_1 + 0xc) == 0)) &&
       ((0xff < *(uint *)(param_1 + 0x34) || (*(int *)(param_1 + 0x38) < 1)))) goto LAB_0028e284;
    bVar2 = (bool)(bVar4 | bVar3);
    *(undefined4 *)(param_1 + 0x44) = 0;
    iVar6 = 0;
    *(undefined4 *)(param_1 + 0x4c) = 0;
    *(undefined4 *)(param_1 + 0x50) = 0;
    *(undefined4 *)(param_1 + 0x260) = 0xffffffff;
    do {
      param_1[iVar6 + 0x58] = (bz_stream)0x0;
      iVar6 = iVar6 + 1;
    } while (iVar6 != 0x100);
    *(int *)(param_1 + 0x26c) = *(int *)(param_1 + 0x26c) + 1;
    iVar6 = 0;
    *(undefined4 *)(param_1 + 8) = 2;
    if (iVar7 == 3) {
      if ((*(int *)(param_1 + 0xc) == 0) &&
         ((0xff < *(uint *)(param_1 + 0x34) || (*(int *)(param_1 + 0x38) < 1)))) goto LAB_0028e284;
LAB_0028e0f3:
      if ((*(int *)(param_1 + 0x48) <= iVar6) || (piVar8 = *(int **)param_1, piVar8[1] == 0))
      goto LAB_0028e1f4;
      if (*(int *)(param_1 + 0xc) != 0) {
        do {
          uVar9 = (uint)*(byte *)*piVar8;
          uVar1 = *(uint *)(param_1 + 0x34);
          if (uVar9 == uVar1) {
            if (*(int *)(param_1 + 0x38) == 0xff) {
LAB_0028e1d8:
              add_pair_to_block((EState *)param_1);
              piVar8 = *(int **)param_1;
LAB_0028e131:
              *(uint *)(param_1 + 0x34) = uVar9;
              *(undefined4 *)(param_1 + 0x38) = 1;
            }
            else {
              *(int *)(param_1 + 0x38) = *(int *)(param_1 + 0x38) + 1;
            }
          }
          else {
            if (*(int *)(param_1 + 0x38) != 1) {
              if (uVar1 < 0x100) goto LAB_0028e1d8;
              goto LAB_0028e131;
            }
            *(uint *)(param_1 + 0x260) =
                 *(int *)(param_1 + 0x260) << 8 ^
                 *(uint *)(BZ2_crc32Table + (uVar1 & 0xff ^ *(uint *)(param_1 + 0x260) >> 0x18) * 4)
            ;
            param_1[uVar1 + 0x58] = (bz_stream)0x1;
            *(char *)(*(int *)(param_1 + 0x24) + iVar6) = (char)uVar1;
            *(int *)(param_1 + 0x44) = *(int *)(param_1 + 0x44) + 1;
            *(uint *)(param_1 + 0x34) = uVar9;
            piVar8 = *(int **)param_1;
          }
          *piVar8 = *piVar8 + 1;
          *(int *)(*(int *)param_1 + 4) = *(int *)(*(int *)param_1 + 4) + -1;
          *(int *)(*(int *)param_1 + 8) = *(int *)(*(int *)param_1 + 8) + 1;
          if (*(int *)(*(int *)param_1 + 8) == 0) {
            piVar8 = (int *)(*(int *)param_1 + 0xc);
            *piVar8 = *piVar8 + 1;
          }
          iVar7 = *(int *)(param_1 + 0xc);
          iVar6 = *(int *)(param_1 + 0x44);
          *(int *)(param_1 + 0xc) = iVar7 + -1;
        } while (((iVar6 < *(int *)(param_1 + 0x48)) && (piVar8 = *(int **)param_1, piVar8[1] != 0))
                && (iVar7 + -1 != 0));
        bVar3 = 1;
        goto LAB_0028e1eb;
      }
LAB_0028e1fb:
      if (*(uint *)(param_1 + 0x34) < 0x100) {
        add_pair_to_block((EState *)param_1);
      }
      *(undefined4 *)(param_1 + 0x34) = 0x100;
      *(undefined4 *)(param_1 + 0x38) = 0;
      BZ2_compressBlock((EState *)param_1,*(int *)(param_1 + 4) == 4);
      *(undefined4 *)(param_1 + 8) = 1;
      bVar3 = 0;
      bVar4 = bVar2;
      goto LAB_0028e030;
    }
LAB_0028e0ea:
    if (iVar7 != 2) goto LAB_0028e0f3;
    bVar3 = 0;
    while ((iVar6 < *(int *)(param_1 + 0x48) && (piVar8 = *(int **)param_1, piVar8[1] != 0))) {
      uVar9 = (uint)*(byte *)*piVar8;
      uVar1 = *(uint *)(param_1 + 0x34);
      if (uVar9 == uVar1) {
        if (*(int *)(param_1 + 0x38) == 0xff) {
LAB_0028e360:
          add_pair_to_block((EState *)param_1);
          piVar8 = *(int **)param_1;
LAB_0028e2c1:
          *(uint *)(param_1 + 0x34) = uVar9;
          *(undefined4 *)(param_1 + 0x38) = 1;
        }
        else {
          *(int *)(param_1 + 0x38) = *(int *)(param_1 + 0x38) + 1;
        }
      }
      else {
        if (*(int *)(param_1 + 0x38) != 1) {
          if (uVar1 < 0x100) goto LAB_0028e360;
          goto LAB_0028e2c1;
        }
        *(uint *)(param_1 + 0x260) =
             *(int *)(param_1 + 0x260) << 8 ^
             *(uint *)(BZ2_crc32Table + (uVar1 & 0xff ^ *(uint *)(param_1 + 0x260) >> 0x18) * 4);
        param_1[uVar1 + 0x58] = (bz_stream)0x1;
        *(char *)(*(int *)(param_1 + 0x24) + iVar6) = (char)uVar1;
        *(int *)(param_1 + 0x44) = *(int *)(param_1 + 0x44) + 1;
        *(uint *)(param_1 + 0x34) = uVar9;
        piVar8 = *(int **)param_1;
      }
      *piVar8 = *piVar8 + 1;
      *(int *)(*(int *)param_1 + 4) = *(int *)(*(int *)param_1 + 4) + -1;
      *(int *)(*(int *)param_1 + 8) = *(int *)(*(int *)param_1 + 8) + 1;
      if (*(int *)(*(int *)param_1 + 8) == 0) {
        piVar8 = (int *)(*(int *)param_1 + 0xc);
        *piVar8 = *piVar8 + 1;
      }
      iVar6 = *(int *)(param_1 + 0x44);
      bVar3 = 1;
    }
LAB_0028e1eb:
    bVar5 = (bool)(bVar5 | bVar3);
    if (*(int *)(param_1 + 4) != 2) {
LAB_0028e1f4:
      if (*(int *)(param_1 + 0xc) == 0) goto LAB_0028e1fb;
    }
    if (*(int *)(param_1 + 0x48) <= *(int *)(param_1 + 0x44)) {
      BZ2_compressBlock((EState *)param_1,'\0');
      *(undefined4 *)(param_1 + 8) = 1;
      bVar3 = 0;
      bVar4 = bVar2;
      goto LAB_0028e030;
    }
    if (*(int *)(*(int *)param_1 + 4) == 0) {
LAB_0028e284:
      return bVar2 || bVar5;
    }
    iVar6 = *(int *)(param_1 + 8);
  } while( true );
}

SourceMod gamedata

paste into addons/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.



        

        

          

Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.

Return-type handling cheatsheet (DHookReturn)