L L4D2node

Host_CleanupConVarStringValue

0x001762c0 · 415 bytes · __cdecl

_Z29Host_CleanupConVarStringValuePKc

Decompiled

undefined (1 param)

/* Host_CleanupConVarStringValue(char const*) */

undefined4 * Host_CleanupConVarStringValue(char *param_1)

{
  int iVar1;
  uint uVar2;
  uint uVar3;
  char cVar4;
  char *pcVar5;
  uint *puVar6;
  uint *puVar7;
  int local_28;
  int local_24;
  int local_20;
  
  V_snprintf((char *)&Host_CleanupConVarStringValue(char_const*)::clean,0x100,"%s",param_1);
  iVar1 = _V_strlen((char *)&Host_CleanupConVarStringValue(char_const*)::clean);
  if (0 < iVar1) {
    _V_memset(&local_28,0,0xc);
    if ((char)Host_CleanupConVarStringValue(char_const*)::clean != '\0') {
      pcVar5 = (char *)&Host_CleanupConVarStringValue(char_const*)::clean;
      cVar4 = (char)Host_CleanupConVarStringValue(char_const*)::clean;
      do {
        while (cVar4 == '-') {
          pcVar5 = pcVar5 + 1;
          cVar4 = *pcVar5;
          local_28 = local_28 + 1;
          if (cVar4 == '\0') goto LAB_0017637f;
        }
        if (cVar4 == '+') {
          local_24 = local_24 + 1;
        }
        else if (9 < (byte)(cVar4 - 0x30U)) {
          if (cVar4 != '.') goto LAB_00176430;
          local_20 = local_20 + 1;
        }
        pcVar5 = pcVar5 + 1;
        cVar4 = *pcVar5;
      } while (cVar4 != '\0');
    }
LAB_0017637f:
    if ((((local_28 < 2) && (local_24 < 2)) && (local_20 < 2)) &&
       (((local_28 == 0 || (local_24 == 0)) &&
        (iVar1 = _V_strstr((char *)&Host_CleanupConVarStringValue(char_const*)::clean,"."),
        iVar1 != 0)))) {
      puVar7 = &Host_CleanupConVarStringValue(char_const*)::clean;
      do {
        puVar6 = puVar7;
        uVar2 = *puVar6 + 0xfefefeff & ~*puVar6;
        uVar3 = uVar2 & 0x80808080;
        puVar7 = puVar6 + 1;
      } while (uVar3 == 0);
      if ((uVar2 & 0x8080) == 0) {
        puVar7 = (uint *)((int)puVar6 + 6);
        uVar3 = uVar3 >> 0x10;
      }
      iVar1 = -(uint)CARRY1((byte)uVar3,(byte)uVar3);
      cVar4 = *(char *)((int)puVar7 + iVar1 + -4);
      pcVar5 = (char *)((int)puVar7 + iVar1 + -4);
      if (cVar4 != '\0') {
        while (&Host_CleanupConVarStringValue(char_const*)::clean <= pcVar5) {
          if (cVar4 != '0') {
            if (cVar4 == '.') {
              if (pcVar5 == (char *)&Host_CleanupConVarStringValue(char_const*)::clean) {
                Host_CleanupConVarStringValue(char_const*)::clean._0_1_ = '0';
              }
              else {
                *pcVar5 = '\0';
              }
            }
            break;
          }
          cVar4 = pcVar5[-1];
          *pcVar5 = '\0';
          pcVar5 = pcVar5 + -1;
          if (cVar4 == '\0') break;
        }
      }
    }
  }
LAB_00176430:
  return &Host_CleanupConVarStringValue(char_const*)::clean;
}

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)