L L4D2node

longest_match

0x000ec450 · 615 bytes · __cdecl

_Z13longest_matchR6TStatej

Decompiled

undefined (2 params)

/* longest_match(TState&, unsigned int) */

TState * longest_match(TState *param_1,uint param_2)

{
  TState *pTVar1;
  TState *pTVar2;
  TState *pTVar3;
  TState TVar4;
  TState TVar5;
  uint uVar6;
  uint uVar7;
  TState *pTVar8;
  TState *pTVar9;
  TState *pTVar10;
  TState *pTVar11;
  uint local_28;
  TState *local_24;
  TState local_17;
  TState local_15;
  
  uVar6 = *(uint *)(param_1 + 0x6af84);
  local_24 = param_1 + uVar6 + 0x1af70;
  uVar7 = uVar6 - 0x7efa;
  if (uVar6 < 0x7efb) {
    uVar7 = 0;
  }
  pTVar11 = *(TState **)(param_1 + 0x6af80);
  pTVar3 = param_1 + uVar6 + 0x1b072;
  local_17 = local_24[(int)(pTVar11 + -1)];
  local_15 = local_24[(int)pTVar11];
  local_28 = *(uint *)(param_1 + 0x6af94) >> 2;
  if (pTVar11 < *(TState **)(param_1 + 0x6af9c)) {
    local_28 = *(uint *)(param_1 + 0x6af94);
  }
  if (*(int *)(param_1 + 0x6af70) - 0x106U < uVar6) {
    *(char **)(param_1 + 0x6afa4) = "insufficient lookahead";
  }
  do {
    if (uVar6 <= param_2) {
      *(char **)(param_1 + 0x6afa4) = "no future";
    }
    TVar4 = param_1[(int)(pTVar11 + param_2 + 0x1af70)];
    if ((((TVar4 == local_15) &&
         (TVar5 = param_1[(int)(pTVar11 + param_2 + 0x1af6f)], TVar5 == local_17)) &&
        (param_1[param_2 + 0x1af70] == *local_24)) && (param_1[param_2 + 0x1af71] == local_24[1])) {
      pTVar10 = param_1 + param_2 + 0x1af72;
      pTVar8 = local_24 + 2;
      pTVar9 = pTVar8;
      if (local_24[3] == param_1[param_2 + 0x1af73]) {
        do {
          if (pTVar9[2] != pTVar10[2]) {
            pTVar8 = pTVar9 + 2;
            goto LAB_000ec5e6;
          }
          if (pTVar9[3] != pTVar10[3]) {
            pTVar8 = pTVar9 + 3;
            goto LAB_000ec5e6;
          }
          if (pTVar9[4] != pTVar10[4]) {
            pTVar8 = pTVar9 + 4;
            goto LAB_000ec5e6;
          }
          if (pTVar9[5] != pTVar10[5]) {
            pTVar8 = pTVar9 + 5;
            goto LAB_000ec5e6;
          }
          if (pTVar9[6] != pTVar10[6]) {
            pTVar8 = pTVar9 + 6;
            goto LAB_000ec5e6;
          }
          if (pTVar9[7] != pTVar10[7]) {
            pTVar8 = pTVar9 + 7;
            goto LAB_000ec5e6;
          }
          pTVar8 = pTVar9 + 8;
          if ((*pTVar8 != pTVar10[8]) || (pTVar3 <= pTVar8)) goto LAB_000ec5e6;
          pTVar1 = pTVar10 + 9;
          pTVar2 = pTVar9 + 9;
          pTVar9 = pTVar8;
          pTVar10 = pTVar10 + 8;
        } while (*pTVar2 == *pTVar1);
      }
      pTVar8 = pTVar8 + 1;
LAB_000ec5e6:
      if (param_1 + *(int *)(param_1 + 0x6af70) + 0x1af6f < pTVar8) {
        *(char **)(param_1 + 0x6afa4) = "wild scan";
      }
      pTVar8 = pTVar8 + (0x102 - (int)pTVar3);
      local_24 = pTVar3 + -0x102;
      local_17 = TVar5;
      local_15 = TVar4;
      if ((int)pTVar11 < (int)pTVar8) {
        *(uint *)(param_1 + 0x6af88) = param_2;
        if (*(int *)(param_1 + 0x6afa0) <= (int)pTVar8) {
          return pTVar8;
        }
        pTVar11 = pTVar8;
        local_17 = pTVar3[(int)(pTVar8 + -0x103)];
        local_15 = pTVar3[(int)(pTVar8 + -0x102)];
      }
    }
    param_2 = *(uint *)(param_1 + (param_2 & 0x7fff) * 4 + 0x2af70);
    if (param_2 <= uVar7) {
      return pTVar11;
    }
    local_28 = local_28 - 1;
    if (local_28 == 0) {
      return pTVar11;
    }
  } 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)