L L4D2node

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 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)