KeyValues::GetSymbolForStringGrowable
0x00b73500 · 730 bytes · __cdecl
_ZN9KeyValues26GetSymbolForStringGrowableEPKcb
Decompiled
undefined (2 params)
/* KeyValues::GetSymbolForStringGrowable(char const*, bool) */
undefined8 KeyValues::GetSymbolForStringGrowable(char *param_1,bool param_2)
{
int *piVar1;
undefined4 *puVar2;
uint *puVar3;
uint uVar4;
char *pcVar5;
undefined4 uVar6;
int iVar7;
char *pcVar8;
int iVar9;
uint uVar10;
uint uVar11;
CUtlVector<int,CUtlMemory<int,int>> *this;
uint local_24;
puVar3 = s_pGrowableStringTable;
uVar4 = ThreadGetCurrentId();
if (uVar4 == *puVar3) {
LAB_00b7352b:
puVar3[1] = puVar3[1] + 1;
}
else {
LOCK();
uVar11 = *puVar3;
if (uVar11 == 0) {
*puVar3 = uVar4;
}
UNLOCK();
if (uVar11 == 0) goto LAB_00b7352b;
CThreadFastMutex::Lock((uint)puVar3,uVar4);
}
puVar3[2] = (uint)param_1;
puVar3[3] = puVar3[0xd];
if (!param_2) {
local_24 = HashStringCaseless(*(char **)puVar3[10]);
if ((char)puVar3[0xb] == '\0') {
local_24 = local_24 % puVar3[7];
}
else {
local_24 = local_24 & puVar3[0xc];
}
uVar11 = 0;
piVar1 = (int *)(puVar3[4] + local_24 * 0x14);
uVar4 = piVar1[3];
if ((int)uVar4 < 1) {
LAB_00b736c8:
if (uVar4 == uVar11) goto LAB_00b73798;
uVar4 = uVar11 & 0xffff;
uVar11 = (local_24 << 0x10 | uVar11) >> 0x10;
}
else {
do {
puVar2 = (undefined4 *)puVar3[9];
iVar9 = *(int *)(*piVar1 + uVar11 * 4);
if (iVar9 < 1) {
pcVar5 = (char *)*puVar2;
pcVar8 = pcVar5;
}
else {
pcVar5 = (char *)(iVar9 + puVar2[1]);
pcVar8 = (char *)*puVar2;
}
iVar9 = _V_stricmp(pcVar5,pcVar8);
if (iVar9 == 0) goto LAB_00b736c8;
uVar11 = uVar11 + 1;
} while (uVar11 != uVar4);
LAB_00b73798:
uVar4 = 0xffff;
uVar11 = 0xffff;
}
uVar6 = 0xffffffff;
if (((int)uVar11 < (int)puVar3[7]) &&
(piVar1 = (int *)(puVar3[4] + uVar11 * 0x14), (int)uVar4 < piVar1[3])) {
uVar6 = *(undefined4 *)(*piVar1 + uVar4 * 4);
}
goto LAB_00b736ab;
}
/* try { // try from 00b73550 to 00b73618 has its CatchHandler @ 00b7380c */
local_24 = HashStringCaseless(*(char **)puVar3[10]);
if ((char)puVar3[0xb] == '\0') {
local_24 = local_24 % puVar3[7];
}
else {
local_24 = local_24 & puVar3[0xc];
}
uVar11 = puVar3[4];
uVar10 = 0;
piVar1 = (int *)(uVar11 + local_24 * 0x14);
uVar4 = piVar1[3];
if ((int)uVar4 < 1) {
LAB_00b73683:
if (uVar4 == uVar10) goto LAB_00b7370b;
iVar9 = (uVar10 & 0xffff) << 2;
iVar7 = ((local_24 << 0x10 | uVar10) >> 0x10) * 0x14;
}
else {
do {
puVar2 = (undefined4 *)puVar3[9];
iVar9 = *(int *)(*piVar1 + uVar10 * 4);
if (iVar9 < 1) {
pcVar5 = (char *)*puVar2;
pcVar8 = pcVar5;
}
else {
pcVar5 = (char *)(iVar9 + puVar2[1]);
pcVar8 = (char *)*puVar2;
}
iVar9 = _V_stricmp(pcVar5,pcVar8);
if (iVar9 == 0) {
uVar11 = puVar3[4];
goto LAB_00b73683;
}
uVar10 = uVar10 + 1;
} while (uVar10 != uVar4);
uVar11 = puVar3[4];
LAB_00b7370b:
this = (CUtlVector<int,CUtlMemory<int,int>> *)(local_24 * 0x14 + uVar11);
uVar4 = *(uint *)(this + 0xc);
CUtlVector<int,CUtlMemory<int,int>>::GrowVector(this,1);
/* try { // try from 00b73737 to 00b737d4 has its CatchHandler @ 00b7380c */
CUtlVector<int,CUtlMemory<int,int>>::ShiftElementsRight(this,uVar4,1);
puVar2 = (undefined4 *)(*(int *)this + uVar4 * 4);
if (puVar2 != (undefined4 *)0x0) {
*puVar2 = 0xffffffff;
}
iVar9 = _V_strlen(param_1);
iVar9 = iVar9 + 1;
uVar11 = puVar3[0x10];
if (iVar9 != 0) {
CUtlVector<char,CUtlMemory<char,int>>::GrowVector
((CUtlVector<char,CUtlMemory<char,int>> *)(puVar3 + 0xd),iVar9);
CUtlVector<char,CUtlMemory<char,int>>::ShiftElementsRight
((CUtlVector<char,CUtlMemory<char,int>> *)(puVar3 + 0xd),uVar11,iVar9);
if ((param_1 != (char *)0x0) && (0 < iVar9)) {
iVar7 = 0;
do {
*(char *)(uVar11 + puVar3[0xd] + iVar7) = param_1[iVar7];
iVar7 = iVar7 + 1;
} while (iVar7 != iVar9);
}
}
iVar9 = (uVar4 & 0xffff) * 4;
iVar7 = ((local_24 << 0x10 | uVar4) >> 0x10) * 0x14;
*(uint *)(*(int *)(puVar3[4] + iVar7) + (uVar4 & 0xffff) * 4) = uVar11;
uVar11 = puVar3[4];
}
uVar6 = *(undefined4 *)(*(int *)(uVar11 + iVar7) + iVar9);
LAB_00b736ab:
puVar3[1] = puVar3[1] - 1;
uVar4 = puVar3[1];
if (uVar4 == 0) {
LOCK();
uVar4 = *puVar3;
*puVar3 = 0;
UNLOCK();
}
return CONCAT44(uVar4,uVar6);
}
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.