V_RemoveDotSlashes
0x0004a970 · 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_0004a9aa;
}
pcVar5 = pcVar5 + 1;
cVar3 = *pcVar5;
}
LAB_0004a9aa:
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_0004a9e5;
}
memmove(param_1 + iVar6,param_1 + iVar7,local_24 - iVar6);
local_24 = local_20;
}
LAB_0004a9e5:
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_0004aa38;
}
}
LAB_0004aa38:
iVar6 = 0;
local_20 = local_24 - 1;
LAB_0004aa49:
if (iVar6 < (int)local_20) {
do {
if (iVar6 == 0) {
iVar7 = 1;
if ((*param_1 == '.') && (param_1[1] == param_2)) goto code_r0x0004abb9;
}
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_0004ac60:
if ((int)local_24 < 2) {
cVar3 = *param_1;
goto LAB_0004aaa3;
}
}
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_0004ac60;
}
}
cVar3 = *param_1;
if ((cVar3 == '.') && (param_1[1] == param_2)) {
memmove(param_1,param_1 + 2,local_24 - 1);
cVar3 = *param_1;
}
LAB_0004aaa3:
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_0004ab17;
} while (*__dest != param_2);
}
else if (param_1 == __dest) {
LAB_0004ab17:
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_r0x0004abb9:
memmove(param_1,param_1 + 2,local_20);
local_20 = local_24 - 3;
local_24 = local_24 - 2;
goto LAB_0004aa49;
}
SourceMod gamedata
paste intoaddons/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.
Signatures + Functions block. The plugin uses
DHookCreateFromConf - DHooks reads return type, this-type,
calling convention, and argument types straight from the gamedata. Less
boilerplate in the plugin, types travel with the gamedata.
Gamedata KeyValues
DHooks plugin example
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.