L L4D2node

V_RemoveDotSlashes

0x00b7c9a0 · 824 bytes · __cdecl

_Z18V_RemoveDotSlashesPcc

Decompiled

undefined (2 params)

/* V_RemoveDotSlashes(char*, char) */

undefined4 V_RemoveDotSlashes(char *param_1,char param_2)

{
  char cVar1;
  size_t sVar2;
  char cVar3;
  size_t sVar4;
  char *pcVar5;
  int iVar6;
  char *__dest;
  int iVar7;
  char *__s;
  bool bVar8;
  size_t local_24;
  size_t local_20;
  
  cVar3 = *param_1;
  pcVar5 = param_1;
  while (cVar3 != '\0') {
    while ((cVar3 == '/' || (cVar3 == '\\'))) {
      *pcVar5 = param_2;
      pcVar5 = pcVar5 + 1;
      cVar3 = *pcVar5;
      if (cVar3 == '\0') goto LAB_00b7c9da;
    }
    pcVar5 = pcVar5 + 1;
    cVar3 = *pcVar5;
  }
LAB_00b7c9da:
  iVar6 = 1;
  local_24 = strlen(param_1);
  while (local_20 = local_24 - 1, iVar6 < (int)local_20) {
    while( true ) {
      iVar7 = iVar6 + 1;
      if ((param_1[iVar6] == param_2) && (param_1[iVar7] == param_2)) break;
      iVar6 = iVar7;
      if ((int)local_20 <= iVar7) goto LAB_00b7ca15;
    }
    memmove(param_1 + iVar6,param_1 + iVar7,local_24 - iVar6);
    local_24 = local_20;
  }
LAB_00b7ca15:
  sVar4 = local_24 - 2;
  for (iVar6 = 0; sVar2 = sVar4, iVar6 < (int)sVar4; iVar6 = iVar6 + 1) {
    while (((sVar4 = sVar2, param_1[iVar6] == param_2 && (param_1[iVar6 + 1] == '.')) &&
           (param_1[iVar6 + 2] == param_2))) {
      memmove(param_1 + iVar6,param_1 + iVar6 + 2,(local_24 - iVar6) - 1);
      sVar2 = sVar4 - 2;
      local_24 = sVar4;
      if ((int)(sVar4 - 2) <= iVar6) goto LAB_00b7ca68;
    }
  }
LAB_00b7ca68:
  iVar6 = 0;
  local_20 = local_24 - 1;
LAB_00b7ca79:
  if (iVar6 < (int)local_20) {
    do {
      if (iVar6 == 0) {
        iVar7 = 1;
        if ((*param_1 == '.') && (param_1[1] == param_2)) goto code_r0x00b7cbe9;
      }
      else {
        iVar7 = iVar6 + 1;
        if (((param_1[iVar6 + -1] != '.') && (param_1[iVar6] == '.')) && (param_1[iVar7] == param_2)
           ) {
          memmove(param_1 + iVar6,param_1 + iVar7,local_24 - iVar6);
          local_24 = local_20;
          local_20 = local_20 - 1;
        }
      }
      iVar6 = iVar7;
      if ((int)local_20 <= iVar7) break;
    } while( true );
  }
  pcVar5 = param_1;
  if ((int)local_24 < 3) {
LAB_00b7cc90:
    if ((int)local_24 < 2) {
      cVar3 = *param_1;
      goto LAB_00b7cad3;
    }
  }
  else if (param_1[local_24 - 1] == '.') {
    if (param_1[local_24 - 2] == param_2) {
      param_1[local_24 - 2] = '\0';
      local_24 = local_24 - 2;
      goto LAB_00b7cc90;
    }
  }
  cVar3 = *param_1;
  if ((cVar3 == '.') && (param_1[1] == param_2)) {
    memmove(param_1,param_1 + 2,local_24 - 1);
    cVar3 = *param_1;
  }
LAB_00b7cad3:
  do {
    if (cVar3 == '\0') {
      return 1;
    }
    while ((((bVar8 = cVar3 == '.', cVar3 = pcVar5[1], bVar8 && (cVar3 == '.')) &&
            ((pcVar5 == param_1 || (pcVar5[-1] == param_2)))) &&
           ((cVar1 = pcVar5[2], cVar1 == '\0' || (param_2 == cVar1))))) {
      if ((pcVar5 == param_1) || (param_1 == pcVar5 + -1)) {
        return 0;
      }
      __dest = pcVar5 + -2;
      __s = pcVar5 + 2;
      if ((param_1 < __dest) && (pcVar5[-2] != param_2)) {
        do {
          __dest = __dest + -1;
          if (__dest == param_1) goto LAB_00b7cb47;
        } while (*__dest != param_2);
      }
      else if (param_1 == __dest) {
LAB_00b7cb47:
        if (cVar1 != '\0') {
          __s = pcVar5 + 3;
        }
      }
      sVar4 = strlen(__s);
      memmove(__dest,__s,sVar4 + 1);
      cVar3 = *param_1;
      pcVar5 = param_1;
      if (cVar3 == '\0') {
        return 1;
      }
    }
    pcVar5 = pcVar5 + 1;
  } while( true );
code_r0x00b7cbe9:
  memmove(param_1,param_1 + 2,local_20);
  local_20 = local_24 - 3;
  local_24 = local_24 - 2;
  goto LAB_00b7ca79;
}

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)