L L4D2node

BZ2_bzDecompress

0x0028ea50 · 3583 bytes · unknown

Decompiled

undefined (0 params)

/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */

int BZ2_bzDecompress(int param_1)

{
  ushort uVar1;
  ushort uVar2;
  DState *pDVar3;
  int iVar4;
  DState DVar5;
  int iVar6;
  uint uVar7;
  int iVar8;
  uint uVar9;
  uint uVar10;
  int iVar11;
  DState *pDVar12;
  uint uVar13;
  uint uVar14;
  DState *pDVar15;
  int iVar16;
  int iVar17;
  int local_2c;
  uint local_28;
  uint local_24;
  int local_20;
  
  if (((param_1 == 0) || (pDVar3 = *(DState **)(param_1 + 0x20), pDVar3 == (DState *)0x0)) ||
     (*(int *)pDVar3 != param_1)) {
    return -2;
  }
  iVar6 = *(int *)(pDVar3 + 4);
  do {
    if (iVar6 == 1) {
      return -1;
    }
    if (iVar6 == 2) goto LAB_0028ec48;
  } while (iVar6 < 10);
  while (iVar6 = BZ2_decompress(pDVar3), iVar6 != 4) {
    if (*(int *)(pDVar3 + 4) != 2) {
      return iVar6;
    }
LAB_0028ec48:
    if (pDVar3[0x28] == (DState)0x0) {
      if (pDVar3[0x10] == (DState)0x0) {
        uVar9 = *(uint *)(pDVar3 + 0xc60);
        iVar6 = *(int *)(pDVar3 + 0xc);
        iVar4 = *(int *)(pDVar3 + 0xc4c);
        local_28 = *(uint *)(pDVar3 + 0x38);
        iVar16 = *(int *)(*(int *)pDVar3 + 0x14);
        iVar8 = *(int *)(pDVar3 + 0xfa40) + 1;
        pDVar12 = *(DState **)(*(int *)pDVar3 + 0x10);
        iVar17 = iVar16;
        iVar11 = *(int *)(pDVar3 + 0x440);
        uVar14 = *(uint *)(pDVar3 + 0x3c);
        DVar5 = pDVar3[8];
        while( true ) {
          local_24 = uVar14;
          local_2c = iVar11;
          pDVar15 = pDVar12;
          if (iVar6 < 1) goto LAB_0028f425;
          uVar14 = local_24;
          if (iVar17 == 0) break;
          uVar13 = (uint)(byte)DVar5;
          iVar11 = iVar17;
          while (iVar17 = iVar11, iVar6 != 1) {
            iVar6 = iVar6 + -1;
            pDVar12 = pDVar15 + 1;
            *pDVar15 = DVar5;
            uVar9 = uVar9 << 8 ^ *(uint *)(BZ2_crc32Table + (uVar9 >> 0x18 ^ uVar13) * 4);
            iVar11 = iVar17 + -1;
            iVar17 = 0;
            pDVar15 = pDVar12;
            if (iVar11 == 0) goto LAB_0028eb41;
          }
          while( true ) {
            local_24 = uVar14;
            iVar17 = iVar17 + -1;
            *pDVar15 = DVar5;
            uVar9 = uVar9 << 8 ^ *(uint *)(BZ2_crc32Table + (uVar9 >> 0x18 ^ uVar13) * 4);
            pDVar15 = pDVar15 + 1;
LAB_0028f425:
            pDVar12 = pDVar15;
            if (iVar8 == local_2c) {
              iVar6 = 0;
              uVar14 = local_24;
              goto LAB_0028eb41;
            }
            local_28 = *(uint *)(iVar4 + local_28 * 4);
            uVar14 = local_28 & 0xff;
            local_28 = local_28 >> 8;
            iVar6 = local_2c + 1;
            DVar5 = local_24._0_1_;
            if ((local_24 == uVar14) && (uVar14 = local_24, iVar8 != iVar6)) break;
            local_2c = iVar6;
            if (iVar17 == 0) {
              iVar6 = 1;
              goto LAB_0028eb41;
            }
            uVar13 = local_24 & 0xff;
          }
          uVar14 = *(uint *)(iVar4 + local_28 * 4);
          local_28 = uVar14 >> 8;
          iVar11 = local_2c + 2;
          if (iVar8 == iVar11) {
            iVar6 = 2;
            uVar14 = local_24;
          }
          else {
            uVar14 = uVar14 & 0xff;
            iVar6 = 2;
            if (local_24 == uVar14) {
              uVar13 = *(uint *)(iVar4 + local_28 * 4);
              local_28 = uVar13 >> 8;
              iVar11 = local_2c + 3;
              iVar6 = 3;
              if ((iVar8 != iVar11) && (uVar14 = uVar13 & 0xff, local_24 == uVar14)) {
                uVar14 = *(uint *)(iVar4 + local_28 * 4);
                uVar13 = *(uint *)(iVar4 + (uVar14 >> 8) * 4);
                iVar6 = (uVar14 & 0xff) + 4;
                local_28 = uVar13 >> 8;
                iVar11 = local_2c + 5;
                uVar14 = uVar13 & 0xff;
              }
            }
          }
        }
LAB_0028eb41:
        local_24 = uVar14;
        uVar14 = *(uint *)(*(int *)pDVar3 + 0x18);
        *(uint *)(*(int *)pDVar3 + 0x18) = (iVar16 + uVar14) - iVar17;
        iVar16 = *(int *)pDVar3;
        if (*(uint *)(iVar16 + 0x18) < uVar14) {
          *(int *)(iVar16 + 0x1c) = *(int *)(iVar16 + 0x1c) + 1;
          iVar16 = *(int *)pDVar3;
        }
        *(int *)(pDVar3 + 0xc) = iVar6;
        *(uint *)(pDVar3 + 0xc60) = uVar9;
        *(int *)(pDVar3 + 0x440) = local_2c;
        pDVar3[8] = DVar5;
        *(uint *)(pDVar3 + 0x3c) = local_24;
        *(int *)(pDVar3 + 0xc4c) = iVar4;
        *(uint *)(pDVar3 + 0x38) = local_28;
        *(DState **)(iVar16 + 0x10) = pDVar12;
        *(int *)(*(int *)pDVar3 + 0x14) = iVar17;
      }
      else {
        iVar6 = *(int *)pDVar3;
LAB_0028efa8:
        if (*(int *)(iVar6 + 0x14) != 0) {
          iVar4 = *(int *)(pDVar3 + 0xc);
          while (iVar4 != 0) {
            **(DState **)(iVar6 + 0x10) = pDVar3[8];
            uVar9 = *(uint *)(BZ2_crc32Table +
                             ((uint)(byte)pDVar3[8] ^ *(uint *)(pDVar3 + 0xc60) >> 0x18) * 4);
            *(int *)(pDVar3 + 0xc) = *(int *)(pDVar3 + 0xc) + -1;
            *(uint *)(pDVar3 + 0xc60) = *(uint *)(pDVar3 + 0xc60) << 8 ^ uVar9;
            *(int *)(*(int *)pDVar3 + 0x10) = *(int *)(*(int *)pDVar3 + 0x10) + 1;
            *(int *)(*(int *)pDVar3 + 0x14) = *(int *)(*(int *)pDVar3 + 0x14) + -1;
            *(int *)(*(int *)pDVar3 + 0x18) = *(int *)(*(int *)pDVar3 + 0x18) + 1;
            iVar6 = *(int *)pDVar3;
            if (*(int *)(iVar6 + 0x18) != 0) goto LAB_0028efa8;
            *(int *)(iVar6 + 0x1c) = *(int *)(iVar6 + 0x1c) + 1;
            iVar6 = *(int *)pDVar3;
            if (*(int *)(iVar6 + 0x14) == 0) goto LAB_0028eba8;
            iVar4 = *(int *)(pDVar3 + 0xc);
          }
          iVar4 = *(int *)(pDVar3 + 0x440);
          iVar16 = *(int *)(pDVar3 + 0xfa40) + 1;
          if (iVar4 == iVar16) goto LAB_0028ebc8;
          uVar9 = *(uint *)(pDVar3 + 0x3c);
          *(undefined4 *)(pDVar3 + 0xc) = 1;
          pDVar3[8] = SUB41(uVar9,0);
          iVar17 = *(int *)(pDVar3 + 0xc4c);
          uVar14 = *(uint *)(iVar17 + *(int *)(pDVar3 + 0x38) * 4);
          iVar11 = *(int *)(pDVar3 + 0x14);
          uVar13 = uVar14 >> 8;
          *(uint *)(pDVar3 + 0x38) = uVar13;
          if (iVar11 == 0) {
            iVar11 = (&BZ2_rNums)[*(int *)(pDVar3 + 0x18)];
            iVar8 = *(int *)(pDVar3 + 0x18) + 1;
            *(int *)(pDVar3 + 0x14) = iVar11;
            if (iVar8 == 0x200) {
              *(undefined4 *)(pDVar3 + 0x18) = 0;
            }
            else {
              *(int *)(pDVar3 + 0x18) = iVar8;
            }
          }
          iVar11 = iVar11 + -1;
          *(int *)(pDVar3 + 0x14) = iVar11;
          *(int *)(pDVar3 + 0x440) = iVar4 + 1;
          if (iVar16 != iVar4 + 1) {
            uVar14 = (iVar11 == 1 ^ uVar14) & 0xff;
            if (uVar9 == uVar14) {
              *(undefined4 *)(pDVar3 + 0xc) = 2;
              uVar14 = *(uint *)(iVar17 + uVar13 * 4);
              uVar13 = uVar14 >> 8;
              *(uint *)(pDVar3 + 0x38) = uVar13;
              if (iVar11 == 0) {
                iVar11 = (&BZ2_rNums)[*(int *)(pDVar3 + 0x18)];
                iVar8 = *(int *)(pDVar3 + 0x18) + 1;
                *(int *)(pDVar3 + 0x14) = iVar11;
                if (iVar8 == 0x200) {
                  *(undefined4 *)(pDVar3 + 0x18) = 0;
                }
                else {
                  *(int *)(pDVar3 + 0x18) = iVar8;
                }
              }
              iVar11 = iVar11 + -1;
              *(int *)(pDVar3 + 0x14) = iVar11;
              *(int *)(pDVar3 + 0x440) = iVar4 + 2;
              if (iVar16 == iVar4 + 2) goto LAB_0028efa8;
              uVar14 = (iVar11 == 1 ^ uVar14) & 0xff;
              if (uVar9 == uVar14) {
                *(undefined4 *)(pDVar3 + 0xc) = 3;
                uVar14 = *(uint *)(iVar17 + uVar13 * 4);
                uVar13 = uVar14 >> 8;
                *(uint *)(pDVar3 + 0x38) = uVar13;
                if (iVar11 == 0) {
                  iVar11 = (&BZ2_rNums)[*(int *)(pDVar3 + 0x18)];
                  iVar8 = *(int *)(pDVar3 + 0x18) + 1;
                  *(int *)(pDVar3 + 0x14) = iVar11;
                  if (iVar8 == 0x200) {
                    *(undefined4 *)(pDVar3 + 0x18) = 0;
                  }
                  else {
                    *(int *)(pDVar3 + 0x18) = iVar8;
                  }
                }
                iVar11 = iVar11 + -1;
                *(int *)(pDVar3 + 0x14) = iVar11;
                *(int *)(pDVar3 + 0x440) = iVar4 + 3;
                if (iVar16 == iVar4 + 3) goto LAB_0028efa8;
                uVar14 = (iVar11 == 1 ^ uVar14) & 0xff;
                if (uVar9 == uVar14) {
                  uVar9 = *(uint *)(iVar17 + uVar13 * 4);
                  uVar14 = uVar9 >> 8;
                  *(uint *)(pDVar3 + 0x38) = uVar14;
                  if (iVar11 == 0) {
                    iVar11 = (&BZ2_rNums)[*(int *)(pDVar3 + 0x18)];
                    iVar16 = *(int *)(pDVar3 + 0x18) + 1;
                    *(int *)(pDVar3 + 0x14) = iVar11;
                    if (iVar16 == 0x200) {
                      *(undefined4 *)(pDVar3 + 0x18) = 0;
                    }
                    else {
                      *(int *)(pDVar3 + 0x18) = iVar16;
                    }
                  }
                  iVar11 = iVar11 + -1;
                  *(int *)(pDVar3 + 0x440) = iVar4 + 4;
                  *(int *)(pDVar3 + 0x14) = iVar11;
                  local_20._0_1_ = (byte)uVar9;
                  *(uint *)(pDVar3 + 0xc) = (iVar11 == 1 ^ (byte)local_20) + 4;
                  uVar9 = *(uint *)(iVar17 + uVar14 * 4);
                  uVar14 = uVar9 & 0xff;
                  *(uint *)(pDVar3 + 0x3c) = uVar14;
                  *(uint *)(pDVar3 + 0x38) = uVar9 >> 8;
                  if (iVar11 == 0) {
                    iVar11 = (&BZ2_rNums)[*(int *)(pDVar3 + 0x18)];
                    iVar16 = *(int *)(pDVar3 + 0x18) + 1;
                    *(int *)(pDVar3 + 0x14) = iVar11;
                    if (iVar16 == 0x200) {
                      *(undefined4 *)(pDVar3 + 0x18) = 0;
                    }
                    else {
                      *(int *)(pDVar3 + 0x18) = iVar16;
                    }
                  }
                  *(int *)(pDVar3 + 0x14) = iVar11 + -1;
                  *(uint *)(pDVar3 + 0x3c) = iVar11 + -1 == 1 ^ uVar14;
                  *(int *)(pDVar3 + 0x440) = iVar4 + 5;
                  goto LAB_0028efa8;
                }
              }
            }
            *(uint *)(pDVar3 + 0x3c) = uVar14;
          }
          goto LAB_0028efa8;
        }
      }
    }
    else {
      local_20 = *(int *)pDVar3;
      if (pDVar3[0x10] == (DState)0x0) {
LAB_0028ee58:
        if (*(int *)(local_20 + 0x14) != 0) {
          iVar6 = *(int *)(pDVar3 + 0xc);
          while (iVar6 != 0) {
            **(DState **)(local_20 + 0x10) = pDVar3[8];
            uVar9 = *(uint *)(BZ2_crc32Table +
                             ((uint)(byte)pDVar3[8] ^ *(uint *)(pDVar3 + 0xc60) >> 0x18) * 4);
            *(int *)(pDVar3 + 0xc) = *(int *)(pDVar3 + 0xc) + -1;
            *(uint *)(pDVar3 + 0xc60) = *(uint *)(pDVar3 + 0xc60) << 8 ^ uVar9;
            *(int *)(*(int *)pDVar3 + 0x10) = *(int *)(*(int *)pDVar3 + 0x10) + 1;
            *(int *)(*(int *)pDVar3 + 0x14) = *(int *)(*(int *)pDVar3 + 0x14) + -1;
            *(int *)(*(int *)pDVar3 + 0x18) = *(int *)(*(int *)pDVar3 + 0x18) + 1;
            local_20 = *(int *)pDVar3;
            if (*(int *)(local_20 + 0x18) != 0) goto LAB_0028ee58;
            *(int *)(local_20 + 0x1c) = *(int *)(local_20 + 0x1c) + 1;
            local_20 = *(int *)pDVar3;
            if (*(int *)(local_20 + 0x14) == 0) goto LAB_0028eba8;
            iVar6 = *(int *)(pDVar3 + 0xc);
          }
          iVar4 = *(int *)(pDVar3 + 0x440);
          iVar6 = *(int *)(pDVar3 + 0xfa40) + 1;
          if (iVar4 == iVar6) goto LAB_0028ebc8;
          uVar9 = *(uint *)(pDVar3 + 0x3c);
          *(undefined4 *)(pDVar3 + 0xc) = 1;
          uVar14 = *(uint *)(pDVar3 + 0x38);
          uVar13 = 0x100;
          uVar10 = 0;
          pDVar3[8] = SUB41(uVar9,0);
          do {
            uVar7 = (int)(uVar10 + uVar13) >> 1;
            if (*(int *)(pDVar3 + uVar7 * 4 + 0x444) <= (int)uVar14) {
              uVar10 = uVar7;
              uVar7 = uVar13;
            }
            uVar13 = uVar7;
          } while (uVar13 - uVar10 != 1);
          iVar16 = *(int *)(pDVar3 + 0xc50);
          iVar17 = *(int *)(pDVar3 + 0xc54);
          uVar1 = *(ushort *)(iVar16 + uVar14 * 2);
          uVar14 = (*(byte *)(iVar17 + (uVar14 >> 1)) >> ((char)uVar14 * '\x04' & 4U) & 0xf) << 0x10
                   | (uint)uVar1;
          *(uint *)(pDVar3 + 0x38) = uVar14;
          *(int *)(pDVar3 + 0x440) = iVar4 + 1;
          if (iVar6 != iVar4 + 1) {
            if (uVar9 == (uVar10 & 0xff)) {
              *(undefined4 *)(pDVar3 + 0xc) = 2;
              uVar13 = 0x100;
              uVar10 = 0;
              do {
                uVar7 = (int)(uVar10 + uVar13) >> 1;
                if (*(int *)(pDVar3 + uVar7 * 4 + 0x444) <= (int)uVar14) {
                  uVar10 = uVar7;
                  uVar7 = uVar13;
                }
                uVar13 = uVar7;
              } while (uVar13 - uVar10 != 1);
              uVar2 = *(ushort *)(iVar16 + uVar14 * 2);
              uVar14 = (*(byte *)(iVar17 + (uVar14 >> 1)) >> ((char)uVar1 * '\x04' & 4U) & 0xf) <<
                       0x10 | (uint)uVar2;
              *(uint *)(pDVar3 + 0x38) = uVar14;
              *(int *)(pDVar3 + 0x440) = iVar4 + 2;
              if (iVar6 != iVar4 + 2) {
                uVar10 = uVar10 & 0xff;
                if (uVar9 == uVar10) {
                  *(undefined4 *)(pDVar3 + 0xc) = 3;
                  uVar13 = 0x100;
                  uVar10 = 0;
                  do {
                    uVar7 = (int)(uVar10 + uVar13) >> 1;
                    if (*(int *)(pDVar3 + uVar7 * 4 + 0x444) <= (int)uVar14) {
                      uVar10 = uVar7;
                      uVar7 = uVar13;
                    }
                    uVar13 = uVar7;
                  } while (uVar13 - uVar10 != 1);
                  uVar1 = *(ushort *)(iVar16 + uVar14 * 2);
                  uVar14 = (*(byte *)(iVar17 + (uVar14 >> 1)) >> ((char)uVar2 * '\x04' & 4U) & 0xf)
                           << 0x10 | (uint)uVar1;
                  *(uint *)(pDVar3 + 0x38) = uVar14;
                  *(int *)(pDVar3 + 0x440) = iVar4 + 3;
                  if (iVar6 == iVar4 + 3) goto LAB_0028ee58;
                  uVar10 = uVar10 & 0xff;
                  if (uVar9 == uVar10) {
                    uVar9 = 0x100;
                    uVar13 = 0;
                    do {
                      uVar10 = (int)(uVar13 + uVar9) >> 1;
                      if (*(int *)(pDVar3 + uVar10 * 4 + 0x444) <= (int)uVar14) {
                        uVar13 = uVar10;
                        uVar10 = uVar9;
                      }
                      uVar9 = uVar10;
                    } while (uVar9 - uVar13 != 1);
                    iVar6 = 0x100;
                    uVar2 = *(ushort *)(iVar16 + uVar14 * 2);
                    uVar9 = (*(byte *)(iVar17 + (uVar14 >> 1)) >> ((char)uVar1 * '\x04' & 4U) & 0xf)
                            << 0x10 | (uint)uVar2;
                    *(uint *)(pDVar3 + 0x38) = uVar9;
                    iVar11 = 0;
                    *(int *)(pDVar3 + 0x440) = iVar4 + 4;
                    *(uint *)(pDVar3 + 0xc) = (uVar13 & 0xff) + 4;
                    do {
                      iVar8 = iVar11 + iVar6 >> 1;
                      if (*(int *)(pDVar3 + iVar8 * 4 + 0x444) <= (int)uVar9) {
                        iVar11 = iVar8;
                        iVar8 = iVar6;
                      }
                      iVar6 = iVar8;
                    } while (iVar6 - iVar11 != 1);
                    *(int *)(pDVar3 + 0x3c) = iVar11;
                    *(uint *)(pDVar3 + 0x38) =
                         (*(byte *)(iVar17 + (uVar9 >> 1)) >> ((char)uVar2 * '\x04' & 4U) & 0xf) <<
                         0x10 | (uint)*(ushort *)(iVar16 + uVar9 * 2);
                    *(int *)(pDVar3 + 0x440) = iVar4 + 5;
                    goto LAB_0028ee58;
                  }
                }
                *(uint *)(pDVar3 + 0x3c) = uVar10;
              }
            }
            else {
              *(uint *)(pDVar3 + 0x3c) = uVar10 & 0xff;
            }
          }
          goto LAB_0028ee58;
        }
      }
      else {
LAB_0028ec68:
        if (*(int *)(local_20 + 0x14) != 0) {
          iVar6 = *(int *)(pDVar3 + 0xc);
          while (iVar6 != 0) {
            **(DState **)(local_20 + 0x10) = pDVar3[8];
            uVar9 = *(uint *)(BZ2_crc32Table +
                             ((uint)(byte)pDVar3[8] ^ *(uint *)(pDVar3 + 0xc60) >> 0x18) * 4);
            *(int *)(pDVar3 + 0xc) = *(int *)(pDVar3 + 0xc) + -1;
            *(uint *)(pDVar3 + 0xc60) = *(uint *)(pDVar3 + 0xc60) << 8 ^ uVar9;
            *(int *)(*(int *)pDVar3 + 0x10) = *(int *)(*(int *)pDVar3 + 0x10) + 1;
            *(int *)(*(int *)pDVar3 + 0x14) = *(int *)(*(int *)pDVar3 + 0x14) + -1;
            *(int *)(*(int *)pDVar3 + 0x18) = *(int *)(*(int *)pDVar3 + 0x18) + 1;
            local_20 = *(int *)pDVar3;
            if (*(int *)(local_20 + 0x18) != 0) goto LAB_0028ec68;
            *(int *)(local_20 + 0x1c) = *(int *)(local_20 + 0x1c) + 1;
            local_20 = *(int *)pDVar3;
            if (*(int *)(local_20 + 0x14) == 0) goto LAB_0028eba8;
            iVar6 = *(int *)(pDVar3 + 0xc);
          }
          iVar4 = *(int *)(pDVar3 + 0x440);
          iVar6 = *(int *)(pDVar3 + 0xfa40) + 1;
          if (iVar4 == iVar6) goto LAB_0028ebc8;
          uVar9 = *(uint *)(pDVar3 + 0x3c);
          *(undefined4 *)(pDVar3 + 0xc) = 1;
          uVar13 = 0x100;
          uVar14 = *(uint *)(pDVar3 + 0x38);
          uVar10 = 0;
          pDVar3[8] = SUB41(uVar9,0);
          do {
            uVar7 = (int)(uVar10 + uVar13) >> 1;
            if (*(int *)(pDVar3 + uVar7 * 4 + 0x444) <= (int)uVar14) {
              uVar10 = uVar7;
              uVar7 = uVar13;
            }
            uVar13 = uVar7;
          } while (uVar13 - uVar10 != 1);
          iVar17 = *(int *)(pDVar3 + 0xc50);
          iVar11 = *(int *)(pDVar3 + 0xc54);
          uVar1 = *(ushort *)(iVar17 + uVar14 * 2);
          iVar16 = *(int *)(pDVar3 + 0x14);
          uVar14 = (*(byte *)(iVar11 + (uVar14 >> 1)) >> ((char)uVar14 * '\x04' & 4U) & 0xf) << 0x10
                   | (uint)uVar1;
          *(uint *)(pDVar3 + 0x38) = uVar14;
          if (iVar16 == 0) {
            iVar16 = (&BZ2_rNums)[*(int *)(pDVar3 + 0x18)];
            iVar8 = *(int *)(pDVar3 + 0x18) + 1;
            *(int *)(pDVar3 + 0x14) = iVar16;
            if (iVar8 == 0x200) {
              *(undefined4 *)(pDVar3 + 0x18) = 0;
            }
            else {
              *(int *)(pDVar3 + 0x18) = iVar8;
            }
          }
          iVar16 = iVar16 + -1;
          *(int *)(pDVar3 + 0x14) = iVar16;
          *(int *)(pDVar3 + 0x440) = iVar4 + 1;
          if (iVar6 != iVar4 + 1) {
            uVar13 = (iVar16 == 1 ^ uVar10) & 0xff;
            if (uVar9 == uVar13) {
              *(undefined4 *)(pDVar3 + 0xc) = 2;
              uVar13 = 0x100;
              uVar10 = 0;
              do {
                uVar7 = (int)(uVar10 + uVar13) >> 1;
                if (*(int *)(pDVar3 + uVar7 * 4 + 0x444) <= (int)uVar14) {
                  uVar10 = uVar7;
                  uVar7 = uVar13;
                }
                uVar13 = uVar7;
              } while (uVar13 - uVar10 != 1);
              uVar2 = *(ushort *)(iVar17 + uVar14 * 2);
              uVar14 = (*(byte *)(iVar11 + (uVar14 >> 1)) >> ((char)uVar1 * '\x04' & 4U) & 0xf) <<
                       0x10 | (uint)uVar2;
              *(uint *)(pDVar3 + 0x38) = uVar14;
              if (iVar16 == 0) {
                iVar16 = (&BZ2_rNums)[*(int *)(pDVar3 + 0x18)];
                iVar8 = *(int *)(pDVar3 + 0x18) + 1;
                *(int *)(pDVar3 + 0x14) = iVar16;
                if (iVar8 == 0x200) {
                  *(undefined4 *)(pDVar3 + 0x18) = 0;
                }
                else {
                  *(int *)(pDVar3 + 0x18) = iVar8;
                }
              }
              iVar16 = iVar16 + -1;
              *(int *)(pDVar3 + 0x14) = iVar16;
              *(int *)(pDVar3 + 0x440) = iVar4 + 2;
              if (iVar6 == iVar4 + 2) goto LAB_0028ec68;
              uVar13 = (iVar16 == 1 ^ uVar10) & 0xff;
              if (uVar9 == uVar13) {
                *(undefined4 *)(pDVar3 + 0xc) = 3;
                uVar10 = 0;
                uVar13 = 0x100;
                do {
                  uVar7 = (int)(uVar10 + uVar13) >> 1;
                  if (*(int *)(pDVar3 + uVar7 * 4 + 0x444) <= (int)uVar14) {
                    uVar10 = uVar7;
                    uVar7 = uVar13;
                  }
                  uVar13 = uVar7;
                } while (uVar13 - uVar10 != 1);
                uVar1 = *(ushort *)(iVar17 + uVar14 * 2);
                uVar14 = (*(byte *)(iVar11 + (uVar14 >> 1)) >> ((char)uVar2 * '\x04' & 4U) & 0xf) <<
                         0x10 | (uint)uVar1;
                *(uint *)(pDVar3 + 0x38) = uVar14;
                if (iVar16 == 0) {
                  iVar16 = (&BZ2_rNums)[*(int *)(pDVar3 + 0x18)];
                  iVar8 = *(int *)(pDVar3 + 0x18) + 1;
                  *(int *)(pDVar3 + 0x14) = iVar16;
                  if (iVar8 == 0x200) {
                    *(undefined4 *)(pDVar3 + 0x18) = 0;
                  }
                  else {
                    *(int *)(pDVar3 + 0x18) = iVar8;
                  }
                }
                iVar16 = iVar16 + -1;
                *(int *)(pDVar3 + 0x14) = iVar16;
                *(int *)(pDVar3 + 0x440) = iVar4 + 3;
                if (iVar6 != iVar4 + 3) {
                  uVar13 = (iVar16 == 1 ^ uVar10) & 0xff;
                  if (uVar9 == uVar13) {
                    uVar9 = 0x100;
                    uVar13 = 0;
                    do {
                      uVar10 = (int)(uVar13 + uVar9) >> 1;
                      if (*(int *)(pDVar3 + uVar10 * 4 + 0x444) <= (int)uVar14) {
                        uVar13 = uVar10;
                        uVar10 = uVar9;
                      }
                      uVar9 = uVar10;
                    } while (uVar9 - uVar13 != 1);
                    uVar2 = *(ushort *)(iVar17 + uVar14 * 2);
                    uVar9 = (*(byte *)(iVar11 + (uVar14 >> 1)) >> ((char)uVar1 * '\x04' & 4U) & 0xf)
                            << 0x10 | (uint)uVar2;
                    *(uint *)(pDVar3 + 0x38) = uVar9;
                    if (iVar16 == 0) {
                      iVar16 = (&BZ2_rNums)[*(int *)(pDVar3 + 0x18)];
                      iVar6 = *(int *)(pDVar3 + 0x18) + 1;
                      *(int *)(pDVar3 + 0x14) = iVar16;
                      if (iVar6 == 0x200) {
                        *(undefined4 *)(pDVar3 + 0x18) = 0;
                      }
                      else {
                        *(int *)(pDVar3 + 0x18) = iVar6;
                      }
                    }
                    iVar16 = iVar16 + -1;
                    *(int *)(pDVar3 + 0x14) = iVar16;
                    uVar14 = 0x100;
                    *(int *)(pDVar3 + 0x440) = iVar4 + 4;
                    uVar10 = 0;
                    *(uint *)(pDVar3 + 0xc) = ((iVar16 == 1 ^ uVar13) & 0xff) + 4;
                    do {
                      uVar13 = (int)(uVar10 + uVar14) >> 1;
                      if (*(int *)(pDVar3 + uVar13 * 4 + 0x444) <= (int)uVar9) {
                        uVar10 = uVar13;
                        uVar13 = uVar14;
                      }
                      uVar14 = uVar13;
                    } while (uVar14 - uVar10 != 1);
                    *(uint *)(pDVar3 + 0x3c) = uVar10;
                    *(uint *)(pDVar3 + 0x38) =
                         (*(byte *)(iVar11 + (uVar9 >> 1)) >> ((char)uVar2 * '\x04' & 4U) & 0xf) <<
                         0x10 | (uint)*(ushort *)(iVar17 + uVar9 * 2);
                    if (iVar16 == 0) {
                      iVar16 = (&BZ2_rNums)[*(int *)(pDVar3 + 0x18)];
                      iVar6 = *(int *)(pDVar3 + 0x18) + 1;
                      *(int *)(pDVar3 + 0x14) = iVar16;
                      if (iVar6 == 0x200) {
                        *(undefined4 *)(pDVar3 + 0x18) = 0;
                      }
                      else {
                        *(int *)(pDVar3 + 0x18) = iVar6;
                      }
                    }
                    *(int *)(pDVar3 + 0x14) = iVar16 + -1;
                    *(uint *)(pDVar3 + 0x3c) = iVar16 + -1 == 1 ^ uVar10;
                    *(int *)(pDVar3 + 0x440) = iVar4 + 5;
                  }
                  else {
                    *(uint *)(pDVar3 + 0x3c) = uVar13;
                  }
                }
                goto LAB_0028ec68;
              }
            }
            *(uint *)(pDVar3 + 0x3c) = uVar13;
          }
          goto LAB_0028ec68;
        }
      }
    }
LAB_0028eba8:
    if ((*(int *)(pDVar3 + 0x440) != *(int *)(pDVar3 + 0xfa40) + 1) || (*(int *)(pDVar3 + 0xc) != 0)
       ) {
      return 0;
    }
LAB_0028ebc8:
    uVar9 = *(uint *)(pDVar3 + 0xc60);
    iVar6 = *(int *)(pDVar3 + 0x30);
    *(uint *)(pDVar3 + 0xc60) = ~uVar9;
    if (2 < iVar6) {
      fprintf(_stderr," {0x%x, 0x%x}",*(undefined4 *)(pDVar3 + 0xc58),~uVar9);
      iVar6 = *(int *)(pDVar3 + 0x30);
    }
    if (1 < iVar6) {
      fputc(0x5d,_stderr);
    }
    if (*(uint *)(pDVar3 + 0xc60) != *(uint *)(pDVar3 + 0xc58)) goto LAB_0028f62f;
    *(undefined4 *)(pDVar3 + 4) = 0xe;
    *(uint *)(pDVar3 + 0xc64) =
         (*(uint *)(pDVar3 + 0xc64) >> 0x1f | *(uint *)(pDVar3 + 0xc64) << 1) ^
         *(uint *)(pDVar3 + 0xc60);
  }
  if (2 < *(int *)(pDVar3 + 0x30)) {
    fprintf(_stderr,"\n    combined CRCs: stored = 0x%x, computed = 0x%x",
            *(undefined4 *)(pDVar3 + 0xc5c),*(undefined4 *)(pDVar3 + 0xc64));
  }
  if (*(int *)(pDVar3 + 0xc64) == *(int *)(pDVar3 + 0xc5c)) {
    iVar6 = 4;
  }
  else {
LAB_0028f62f:
    iVar6 = -4;
  }
  return iVar6;
}

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.



        
        

⚠ This function has no mangled symbol — it may be internal/static. The Linux gamedata field uses @-prefix symbol resolution which requires an exported mangled name. You'll need a Linux byte signature for this one (extract via extract_signature.java).


          

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

Return-type handling cheatsheet (DHookReturn)