L L4D2node

CNetworkStringTable::ParseUpdate

0x001a5dc0 · 3558 bytes · __thiscall

_ZN19CNetworkStringTable11ParseUpdateER7bf_readi

Decompiled

undefined (3 params)

/* CNetworkStringTable::ParseUpdate(bf_read&, int) */

void __thiscall
CNetworkStringTable::ParseUpdate(CNetworkStringTable *this,bf_read *param_1,int param_2)

{
  bf_read *pbVar1;
  uint uVar2;
  undefined4 *puVar3;
  uint *puVar4;
  int iVar5;
  int iVar6;
  undefined4 uVar7;
  char *pcVar8;
  uint uVar9;
  uint uVar10;
  uint *puVar11;
  int iVar12;
  uint uVar13;
  uint *puVar14;
  int in_GS_OFFSET;
  bool bVar15;
  bool bVar16;
  byte local_4880;
  uint local_4878;
  CUtlMemory<StringHistoryEntry,int> *local_4874;
  undefined1 *local_486c;
  int local_4868;
  char *local_4864;
  uint local_4860;
  int local_4854 [5];
  StringHistoryEntry local_4840 [32];
  char local_4820 [1024];
  char local_4420 [1023];
  undefined1 auStack_4021 [16385];
  int local_20;
  
  iVar5 = DAT_003ab3a8;
  local_20 = *(int *)(in_GS_OFFSET + 0x14);
  uVar2 = *(uint *)(param_1 + 0x10);
  pbVar1 = param_1 + 0x14;
  *(int *)pbVar1 = *(int *)pbVar1 + -1;
  if (*(int *)pbVar1 == 0) {
    puVar3 = *(undefined4 **)(param_1 + 0x18);
    *(undefined4 *)(param_1 + 0x14) = 0x20;
    if (puVar3 == *(undefined4 **)(param_1 + 0x1c)) {
      *(undefined4 *)(param_1 + 0x14) = 1;
      *(undefined4 *)(param_1 + 0x10) = 0;
      *(undefined4 **)(param_1 + 0x18) = puVar3 + 1;
    }
    else if (*(undefined4 **)(param_1 + 0x1c) < puVar3) {
      param_1[4] = (bf_read)0x1;
      *(undefined4 *)(param_1 + 0x10) = 0;
    }
    else {
      *(undefined4 **)(param_1 + 0x18) = puVar3 + 1;
      *(undefined4 *)(param_1 + 0x10) = *puVar3;
    }
  }
  else {
    *(uint *)(param_1 + 0x10) = uVar2 >> 1;
  }
  local_4854[0] = 0;
  local_4854[1] = 0;
  local_4854[2] = 0;
  local_4854[3] = 0;
  local_4854[4] = 0;
  if (0 < param_2) {
    local_4868 = 0;
    local_4878 = 0xffffffff;
    local_4860 = 0xffffffff;
    do {
      uVar10 = *(uint *)(param_1 + 0x10) & 1;
      pbVar1 = param_1 + 0x14;
      *(int *)pbVar1 = *(int *)pbVar1 + -1;
      if (*(int *)pbVar1 == 0) {
        puVar3 = *(undefined4 **)(param_1 + 0x18);
        *(undefined4 *)(param_1 + 0x14) = 0x20;
        if (puVar3 == *(undefined4 **)(param_1 + 0x1c)) {
          *(undefined4 *)(param_1 + 0x14) = 1;
          *(undefined4 *)(param_1 + 0x10) = 0;
          *(undefined4 **)(param_1 + 0x18) = puVar3 + 1;
        }
        else if (*(undefined4 **)(param_1 + 0x1c) < puVar3) {
          param_1[4] = (bf_read)0x1;
          *(undefined4 *)(param_1 + 0x10) = 0;
        }
        else {
          *(undefined4 **)(param_1 + 0x18) = puVar3 + 1;
          *(undefined4 *)(param_1 + 0x10) = *puVar3;
        }
        if (uVar10 == 0) goto LAB_001a62b9;
LAB_001a5ecc:
        local_4860 = local_4860 + 1;
LAB_001a5ed3:
        if ((int)local_4860 < 0) goto LAB_001a6300;
LAB_001a5ee1:
                    /* try { // try from 001a5ee6 to 001a66d1 has its CatchHandler @ 001a6c82 */
        iVar12 = (**(code **)(*(int *)this + 0x14))(this);
        if (iVar12 <= (int)local_4860) goto LAB_001a6300;
      }
      else {
        *(uint *)(param_1 + 0x10) = *(uint *)(param_1 + 0x10) >> 1;
        if (uVar10 != 0) goto LAB_001a5ecc;
LAB_001a62b9:
        iVar6 = (**(code **)(*(int *)this + 0x18))(this);
        iVar12 = *(int *)(param_1 + 0x14);
        uVar10 = *(uint *)(param_1 + 0x10);
        if (iVar12 < iVar6) {
          puVar4 = *(uint **)(param_1 + 0x18);
          if (puVar4 == *(uint **)(param_1 + 0x1c)) {
            *(undefined4 *)(param_1 + 0x14) = 1;
            *(undefined4 *)(param_1 + 0x10) = 0;
            *(uint **)(param_1 + 0x18) = puVar4 + 1;
            param_1[4] = (bf_read)0x1;
          }
          else if (*(uint **)(param_1 + 0x1c) < puVar4) {
            param_1[4] = (bf_read)0x1;
            *(undefined4 *)(param_1 + 0x10) = 0;
          }
          else {
            *(uint **)(param_1 + 0x18) = puVar4 + 1;
            uVar9 = *puVar4;
            *(uint *)(param_1 + 0x10) = uVar9;
            if (param_1[4] == (bf_read)0x0) {
              iVar6 = iVar6 - iVar12;
              uVar13 = (&CBitBuffer::s_nMaskTable)[iVar6];
              *(int *)(param_1 + 0x14) = 0x20 - iVar6;
              *(uint *)(param_1 + 0x10) = uVar9 >> ((byte)iVar6 & 0x1f);
              local_4860 = (uVar13 & uVar9) << ((byte)iVar12 & 0x1f) | uVar10;
              goto LAB_001a5ed3;
            }
          }
          local_4860 = 0;
          goto LAB_001a5ee1;
        }
        local_4860 = (&CBitBuffer::s_nMaskTable)[iVar6];
        *(int *)(param_1 + 0x14) = iVar12 - iVar6;
        local_4860 = local_4860 & uVar10;
        if (iVar12 - iVar6 == 0) {
          puVar3 = *(undefined4 **)(param_1 + 0x18);
          *(undefined4 *)(param_1 + 0x14) = 0x20;
          if (puVar3 == *(undefined4 **)(param_1 + 0x1c)) {
            *(undefined4 *)(param_1 + 0x14) = 1;
            *(undefined4 *)(param_1 + 0x10) = 0;
            *(undefined4 **)(param_1 + 0x18) = puVar3 + 1;
          }
          else if (*(undefined4 **)(param_1 + 0x1c) < puVar3) {
            param_1[4] = (bf_read)0x1;
            *(undefined4 *)(param_1 + 0x10) = 0;
          }
          else {
            *(undefined4 **)(param_1 + 0x18) = puVar3 + 1;
            *(undefined4 *)(param_1 + 0x10) = *puVar3;
          }
          goto LAB_001a5ed3;
        }
        *(uint *)(param_1 + 0x10) = uVar10 >> ((byte)iVar6 & 0x1f);
        if (-1 < (int)local_4860) goto LAB_001a5ee1;
LAB_001a6300:
        uVar7 = (**(code **)(*(int *)this + 8))(this);
        Host_Error("Server sent bogus string index %i for table %s\n",local_4860,uVar7);
      }
      iVar6 = *(int *)(param_1 + 0x14);
      iVar12 = iVar6 + -1;
      *(int *)(param_1 + 0x14) = iVar12;
      uVar10 = *(uint *)(param_1 + 0x10) & 1;
      if (iVar12 == 0) {
        puVar4 = *(uint **)(param_1 + 0x18);
        *(undefined4 *)(param_1 + 0x14) = 0x20;
        uVar13 = 0;
        if (puVar4 == *(uint **)(param_1 + 0x1c)) {
          *(undefined4 *)(param_1 + 0x14) = 1;
          iVar6 = 0;
          *(uint **)(param_1 + 0x18) = puVar4 + 1;
          uVar9 = 0;
          *(undefined4 *)(param_1 + 0x10) = 0;
        }
        else if (*(uint **)(param_1 + 0x1c) < puVar4) {
          param_1[4] = (bf_read)0x1;
          iVar6 = 0x1f;
          uVar9 = 0;
          *(undefined4 *)(param_1 + 0x10) = 0;
        }
        else {
          iVar6 = 0x1f;
          *(uint **)(param_1 + 0x18) = puVar4 + 1;
          uVar9 = *puVar4;
          *(uint *)(param_1 + 0x10) = uVar9;
          uVar13 = uVar9 & 1;
        }
        if (uVar10 == 0) goto LAB_001a6345;
LAB_001a5f41:
        uVar10 = uVar13;
        if ((uVar2 & 1) == 0) {
LAB_001a5f8d:
          *(int *)(param_1 + 0x14) = iVar6;
          if (iVar6 == 0) {
            puVar3 = *(undefined4 **)(param_1 + 0x18);
            *(undefined4 *)(param_1 + 0x14) = 0x20;
            if (puVar3 == *(undefined4 **)(param_1 + 0x1c)) {
              *(undefined4 *)(param_1 + 0x14) = 1;
              *(undefined4 *)(param_1 + 0x10) = 0;
              *(undefined4 **)(param_1 + 0x18) = puVar3 + 1;
            }
            else if (*(undefined4 **)(param_1 + 0x1c) < puVar3) {
              param_1[4] = (bf_read)0x1;
              *(undefined4 *)(param_1 + 0x10) = 0;
            }
            else {
              *(undefined4 **)(param_1 + 0x18) = puVar3 + 1;
              *(undefined4 *)(param_1 + 0x10) = *puVar3;
            }
          }
          else {
            *(uint *)(param_1 + 0x10) = uVar9 >> 1;
          }
          if (uVar10 == 0) {
            CBitRead::ReadString((CBitRead *)param_1,local_4820,0x400,false,(int *)0x0);
          }
          else {
            iVar12 = *(int *)(param_1 + 0x14);
            uVar10 = *(uint *)(param_1 + 0x10);
            if (iVar12 < 5) {
              puVar4 = *(uint **)(param_1 + 0x18);
              puVar14 = *(uint **)(param_1 + 0x1c);
              if (puVar4 == puVar14) {
                puVar11 = puVar4 + 1;
                *(undefined4 *)(param_1 + 0x14) = 1;
                iVar12 = 1;
                *(undefined4 *)(param_1 + 0x10) = 0;
                *(uint **)(param_1 + 0x18) = puVar11;
                param_1[4] = (bf_read)0x1;
              }
              else {
                if (puVar4 <= puVar14) {
                  puVar11 = puVar4 + 1;
                  *(uint **)(param_1 + 0x18) = puVar11;
                  uVar9 = *puVar4;
                  *(uint *)(param_1 + 0x10) = uVar9;
                  if (param_1[4] != (bf_read)0x0) {
                    local_4864 = (char *)0x0;
                    goto LAB_001a6619;
                  }
                  uVar13 = (&CBitBuffer::s_nMaskTable)[5 - iVar12] & uVar9;
                  *(int *)(param_1 + 0x14) = iVar12 + 0x1b;
                  uVar9 = uVar9 >> ((byte)(5 - iVar12) & 0x1f);
                  *(uint *)(param_1 + 0x10) = uVar9;
                  local_4864 = (char *)(uVar13 << ((byte)iVar12 & 0x1f) | uVar10);
                  iVar12 = iVar12 + 0x1b;
                  goto joined_r0x001a6945;
                }
                param_1[4] = (bf_read)0x1;
                *(undefined4 *)(param_1 + 0x10) = 0;
                puVar11 = puVar4;
              }
              local_4864 = (char *)0x0;
              uVar9 = 0;
LAB_001a6619:
              bVar15 = puVar11 < puVar14;
              bVar16 = false;
              if (puVar11 == puVar14) {
LAB_001a6959:
                *(undefined4 *)(param_1 + 0x14) = 1;
                *(undefined4 *)(param_1 + 0x10) = 0;
                *(uint **)(param_1 + 0x18) = puVar11 + 1;
                param_1[4] = (bf_read)0x1;
              }
              else {
LAB_001a6621:
                if (bVar15 || bVar16) {
                  *(uint **)(param_1 + 0x18) = puVar11 + 1;
                  uVar13 = *puVar11;
                  *(uint *)(param_1 + 0x10) = uVar13;
                  if (param_1[4] == (bf_read)0x0) {
                    uVar10 = (&CBitBuffer::s_nMaskTable)[5 - iVar12];
                    uVar7 = *(undefined4 *)(param_1 + 0x14);
                    *(int *)(param_1 + 0x14) = iVar12 + 0x1b;
                    local_486c._0_1_ = (byte)(5 - iVar12);
                    uVar10 = (uVar13 & uVar10) << ((byte)uVar7 & 0x1f) | uVar9;
                    *(uint *)(param_1 + 0x10) = uVar13 >> ((byte)local_486c & 0x1f);
                    goto joined_r0x001a6640;
                  }
                }
                else {
                  param_1[4] = (bf_read)0x1;
                  *(undefined4 *)(param_1 + 0x10) = 0;
                }
              }
              uVar10 = 0;
            }
            else {
              iVar12 = iVar12 + -5;
              *(int *)(param_1 + 0x14) = iVar12;
              local_4864 = (char *)(uVar10 & 0x1f);
              if (iVar12 == 0) {
                puVar4 = *(uint **)(param_1 + 0x18);
                *(undefined4 *)(param_1 + 0x14) = 0x20;
                puVar14 = *(uint **)(param_1 + 0x1c);
                if (puVar4 == puVar14) {
                  puVar11 = puVar14 + 1;
                  *(undefined4 *)(param_1 + 0x14) = 1;
                  uVar9 = 0;
                  *(undefined4 *)(param_1 + 0x10) = 0;
                  iVar12 = 1;
                  *(uint **)(param_1 + 0x18) = puVar11;
                  goto LAB_001a6619;
                }
                if (puVar14 < puVar4) {
                  param_1[4] = (bf_read)0x1;
                  uVar9 = 0;
                }
                else {
                  *(uint **)(param_1 + 0x18) = puVar4 + 1;
                  uVar9 = *puVar4;
                }
                *(undefined4 *)(param_1 + 0x14) = 0x1b;
                uVar10 = uVar9 & 0x1f;
LAB_001a6820:
                *(uint *)(param_1 + 0x10) = uVar9 >> 5;
              }
              else {
                uVar9 = uVar10 >> 5;
                *(uint *)(param_1 + 0x10) = uVar9;
joined_r0x001a6945:
                if (iVar12 < 5) {
                  puVar11 = *(uint **)(param_1 + 0x18);
                  bVar15 = puVar11 < *(uint **)(param_1 + 0x1c);
                  bVar16 = puVar11 == *(uint **)(param_1 + 0x1c);
                  if (!bVar16) goto LAB_001a6621;
                  goto LAB_001a6959;
                }
                *(int *)(param_1 + 0x14) = iVar12 + -5;
                uVar10 = uVar9 & 0x1f;
                if (iVar12 + -5 != 0) goto LAB_001a6820;
                puVar3 = *(undefined4 **)(param_1 + 0x18);
                *(undefined4 *)(param_1 + 0x14) = 0x20;
                if (puVar3 == *(undefined4 **)(param_1 + 0x1c)) {
                  *(undefined4 *)(param_1 + 0x14) = 1;
                  *(undefined4 *)(param_1 + 0x10) = 0;
                  *(undefined4 **)(param_1 + 0x18) = puVar3 + 1;
                }
                else if (*(undefined4 **)(param_1 + 0x1c) < puVar3) {
                  param_1[4] = (bf_read)0x1;
                  *(undefined4 *)(param_1 + 0x10) = 0;
                }
                else {
                  *(undefined4 **)(param_1 + 0x18) = puVar3 + 1;
                  *(undefined4 *)(param_1 + 0x10) = *puVar3;
                }
              }
            }
joined_r0x001a6640:
            if ((uint)local_4854[3] <= local_4864) {
              uVar7 = (**(code **)(*(int *)this + 8))(this);
              Host_Error("Server sent bogus substring index %i for table %s\n",local_4860,uVar7);
            }
            uVar9 = 0x400;
            if (uVar10 + 1 < 0x401) {
              uVar9 = uVar10 + 1;
            }
            V_strncpy(local_4820,(char *)((int)local_4864 * 0x20 + local_4854[0]),uVar9);
            CBitRead::ReadString((CBitRead *)param_1,local_4420,0x400,false,(int *)0x0);
            V_strncat(local_4820,local_4420,0x400,-1);
          }
        }
        else {
          *(int *)(param_1 + 0x14) = iVar6;
          if (iVar6 == 0) {
            puVar4 = *(uint **)(param_1 + 0x18);
            *(undefined4 *)(param_1 + 0x14) = 0x20;
            if (puVar4 == *(uint **)(param_1 + 0x1c)) {
              *(undefined4 *)(param_1 + 0x14) = 1;
              uVar10 = 0;
              *(uint **)(param_1 + 0x18) = puVar4 + 1;
              uVar9 = 0;
              *(undefined4 *)(param_1 + 0x10) = 0;
            }
            else if (*(uint **)(param_1 + 0x1c) < puVar4) {
              param_1[4] = (bf_read)0x1;
              uVar10 = 0;
              iVar6 = 0x1f;
              *(undefined4 *)(param_1 + 0x10) = 0;
              uVar9 = 0;
            }
            else {
              iVar6 = 0x1f;
              *(uint **)(param_1 + 0x18) = puVar4 + 1;
              uVar9 = *puVar4;
              *(uint *)(param_1 + 0x10) = uVar9;
              uVar10 = uVar9 & 1;
            }
          }
          else {
            uVar9 = uVar9 >> 1;
            iVar6 = iVar6 + -1;
            *(uint *)(param_1 + 0x10) = uVar9;
            uVar10 = uVar9 & 1;
          }
          if (uVar13 == 0) goto LAB_001a5f8d;
          *(int *)(param_1 + 0x14) = iVar6;
          if (iVar6 == 0) {
            puVar3 = *(undefined4 **)(param_1 + 0x18);
            *(undefined4 *)(param_1 + 0x14) = 0x20;
            if (puVar3 == *(undefined4 **)(param_1 + 0x1c)) {
              *(undefined4 *)(param_1 + 0x14) = 1;
              *(undefined4 *)(param_1 + 0x10) = 0;
              *(undefined4 **)(param_1 + 0x18) = puVar3 + 1;
            }
            else if (*(undefined4 **)(param_1 + 0x1c) < puVar3) {
              param_1[4] = (bf_read)0x1;
              *(undefined4 *)(param_1 + 0x10) = 0;
            }
            else {
              *(undefined4 **)(param_1 + 0x18) = puVar3 + 1;
              *(undefined4 *)(param_1 + 0x10) = *puVar3;
            }
          }
          else {
            *(uint *)(param_1 + 0x10) = uVar9 >> 1;
          }
          if (uVar10 == 0) {
            iVar12 = *(int *)(param_1 + 0x14);
            uVar10 = *(uint *)(param_1 + 0x10);
            if (iVar12 < iVar5) {
              puVar4 = *(uint **)(param_1 + 0x18);
              if (puVar4 == *(uint **)(param_1 + 0x1c)) {
                *(undefined4 *)(param_1 + 0x14) = 1;
                *(undefined4 *)(param_1 + 0x10) = 0;
                *(uint **)(param_1 + 0x18) = puVar4 + 1;
                param_1[4] = (bf_read)0x1;
              }
              else if (*(uint **)(param_1 + 0x1c) < puVar4) {
                param_1[4] = (bf_read)0x1;
                *(undefined4 *)(param_1 + 0x10) = 0;
              }
              else {
                *(uint **)(param_1 + 0x18) = puVar4 + 1;
                uVar9 = *puVar4;
                *(uint *)(param_1 + 0x10) = uVar9;
                if (param_1[4] == (bf_read)0x0) {
                  iVar6 = iVar5 - iVar12;
                  uVar13 = (&CBitBuffer::s_nMaskTable)[iVar6];
                  *(int *)(param_1 + 0x14) = 0x20 - iVar6;
                  *(uint *)(param_1 + 0x10) = uVar9 >> ((byte)iVar6 & 0x1f);
                  local_4878 = (uVar13 & uVar9) << ((byte)iVar12 & 0x1f) | uVar10;
                  goto LAB_001a649a;
                }
              }
              local_4878 = 0;
            }
            else {
              local_4878 = (&CBitBuffer::s_nMaskTable)[iVar5];
              *(int *)(param_1 + 0x14) = iVar12 - iVar5;
              local_4878 = local_4878 & uVar10;
              if (iVar12 - iVar5 == 0) {
                puVar3 = *(undefined4 **)(param_1 + 0x18);
                *(undefined4 *)(param_1 + 0x14) = 0x20;
                if (puVar3 == *(undefined4 **)(param_1 + 0x1c)) {
                  *(undefined4 *)(param_1 + 0x14) = 1;
                  *(undefined4 *)(param_1 + 0x10) = 0;
                  *(undefined4 **)(param_1 + 0x18) = puVar3 + 1;
                }
                else if (*(undefined4 **)(param_1 + 0x1c) < puVar3) {
                  param_1[4] = (bf_read)0x1;
                  *(undefined4 *)(param_1 + 0x10) = 0;
                }
                else {
                  *(undefined4 **)(param_1 + 0x18) = puVar3 + 1;
                  *(undefined4 *)(param_1 + 0x10) = *puVar3;
                }
              }
              else {
                local_4880 = (byte)iVar5;
                *(uint *)(param_1 + 0x10) = uVar10 >> (local_4880 & 0x1f);
              }
            }
          }
          else {
            local_4878 = local_4878 + 1;
          }
LAB_001a649a:
          pcVar8 = (char *)CNetworkStringTableDictionaryManager::Lookup
                                     ((CNetworkStringTableDictionaryManager *)
                                      &g_StringTableDictionary,local_4878);
          V_strncpy(local_4820,pcVar8,0x400);
        }
        uVar9 = *(uint *)(param_1 + 0x10);
        iVar6 = *(int *)(param_1 + 0x14) + -1;
        local_4864 = local_4820;
        uVar13 = uVar9 & 1;
      }
      else {
        uVar9 = *(uint *)(param_1 + 0x10) >> 1;
        iVar6 = iVar6 + -2;
        *(uint *)(param_1 + 0x10) = uVar9;
        uVar13 = uVar9 & 1;
        if (uVar10 != 0) goto LAB_001a5f41;
LAB_001a6345:
        local_4864 = (char *)0x0;
      }
      memset(auStack_4021 + 1,0,0x4000);
      *(int *)(param_1 + 0x14) = iVar6;
      if (iVar6 == 0) {
        puVar3 = *(undefined4 **)(param_1 + 0x18);
        *(undefined4 *)(param_1 + 0x14) = 0x20;
        if (puVar3 == *(undefined4 **)(param_1 + 0x1c)) {
          *(undefined4 *)(param_1 + 0x14) = 1;
          *(undefined4 *)(param_1 + 0x10) = 0;
          *(undefined4 **)(param_1 + 0x18) = puVar3 + 1;
        }
        else if (*(undefined4 **)(param_1 + 0x1c) < puVar3) {
          param_1[4] = (bf_read)0x1;
          *(undefined4 *)(param_1 + 0x10) = 0;
        }
        else {
          *(undefined4 **)(param_1 + 0x18) = puVar3 + 1;
          *(undefined4 *)(param_1 + 0x10) = *puVar3;
        }
        if (uVar13 == 0) goto LAB_001a6365;
LAB_001a6161:
        if (((byte)this[0x1c] & 8) == 0) {
          iVar12 = *(int *)(param_1 + 0x14);
          uVar9 = *(uint *)(param_1 + 0x10);
          if (iVar12 < 0xe) {
            puVar4 = *(uint **)(param_1 + 0x18);
            if (puVar4 == *(uint **)(param_1 + 0x1c)) {
              *(undefined4 *)(param_1 + 0x14) = 1;
              uVar10 = 0;
              *(undefined4 *)(param_1 + 0x10) = 0;
              *(uint **)(param_1 + 0x18) = puVar4 + 1;
              param_1[4] = (bf_read)0x1;
            }
            else {
              if (*(uint **)(param_1 + 0x1c) < puVar4) {
                param_1[4] = (bf_read)0x1;
                *(undefined4 *)(param_1 + 0x10) = 0;
              }
              else {
                *(uint **)(param_1 + 0x18) = puVar4 + 1;
                uVar13 = *puVar4;
                *(uint *)(param_1 + 0x10) = uVar13;
                if (param_1[4] == (bf_read)0x0) {
                  uVar10 = (&CBitBuffer::s_nMaskTable)[0xe - iVar12];
                  *(int *)(param_1 + 0x14) = iVar12 + 0x12;
                  uVar10 = (uVar10 & uVar13) << ((byte)iVar12 & 0x1f) | uVar9;
                  *(uint *)(param_1 + 0x10) = uVar13 >> ((byte)(0xe - iVar12) & 0x1f);
                  goto LAB_001a6196;
                }
              }
              uVar10 = 0;
            }
          }
          else {
            *(int *)(param_1 + 0x14) = iVar12 + -0xe;
            uVar10 = uVar9 & 0x3fff;
            if (iVar12 + -0xe == 0) {
              puVar3 = *(undefined4 **)(param_1 + 0x18);
              *(undefined4 *)(param_1 + 0x14) = 0x20;
              if (puVar3 == *(undefined4 **)(param_1 + 0x1c)) {
                *(undefined4 *)(param_1 + 0x14) = 1;
                *(undefined4 *)(param_1 + 0x10) = 0;
                *(undefined4 **)(param_1 + 0x18) = puVar3 + 1;
              }
              else if (*(undefined4 **)(param_1 + 0x1c) < puVar3) {
                param_1[4] = (bf_read)0x1;
                *(undefined4 *)(param_1 + 0x10) = 0;
              }
              else {
                *(undefined4 **)(param_1 + 0x18) = puVar3 + 1;
                *(undefined4 *)(param_1 + 0x10) = *puVar3;
              }
            }
            else {
              *(uint *)(param_1 + 0x10) = uVar9 >> 0xe;
            }
LAB_001a6196:
            if (0x4000 < uVar10) {
              Error("CNetworkStringTableClient::ParseUpdate: message too large (%d bytes).",uVar10);
            }
          }
          CBitRead::ReadBytes((CBitRead *)param_1,auStack_4021 + 1,uVar10);
        }
        else {
          iVar12 = *(int *)(this + 0x28);
          uVar10 = *(uint *)(this + 0x24);
          auStack_4021[uVar10] = 0;
          CBitRead::ReadBits((CBitRead *)param_1,auStack_4021 + 1,iVar12);
        }
        local_486c = auStack_4021 + 1;
      }
      else {
        *(uint *)(param_1 + 0x10) = uVar9 >> 1;
        if (uVar13 != 0) goto LAB_001a6161;
LAB_001a6365:
        local_486c = (undefined1 *)0x0;
        uVar10 = 0;
      }
      iVar12 = (**(code **)(*(int *)this + 0x10))(this);
      if ((int)local_4860 < iVar12) {
        (**(code **)(*(int *)this + 0x2c))(this,local_4860,uVar10,local_486c);
        local_4864 = (char *)(**(code **)(*(int *)this + 0x28))(this,local_4860);
      }
      else {
        if (local_4864 == (char *)0x0) {
          uVar7 = (**(code **)(*(int *)this + 8))(this);
          Msg("CNetworkStringTable::ParseUpdate: NULL pEntry, table %s, index %i\n",uVar7,local_4860
             );
          local_4864 = "";
        }
        (**(code **)(*(int *)this + 0x24))(this,1,local_4864,uVar10,local_486c);
      }
      if (0x1f < local_4854[3]) {
        CUtlVector<StringHistoryEntry,CUtlMemory<StringHistoryEntry,int>>::ShiftElementsLeft
                  ((CUtlVector<StringHistoryEntry,CUtlMemory<StringHistoryEntry,int>> *)local_4854,0
                   ,1);
        local_4854[3] = local_4854[3] - 1;
      }
      V_strncpy((char *)local_4840,local_4864,0x20);
      CUtlVector<StringHistoryEntry,CUtlMemory<StringHistoryEntry,int>>::InsertBefore
                ((CUtlVector<StringHistoryEntry,CUtlMemory<StringHistoryEntry,int>> *)local_4854,
                 local_4854[3],local_4840);
      local_4868 = local_4868 + 1;
    } while (local_4868 != param_2);
  }
  local_4874 = (CUtlMemory<StringHistoryEntry,int> *)local_4854;
  local_4854[3] = 0;
  CUtlMemory<StringHistoryEntry,int>::Purge(local_4874);
  local_4854[4] = local_4854[0];
  CUtlMemory<StringHistoryEntry,int>::Purge(local_4874);
  if (local_20 != *(int *)(in_GS_OFFSET + 0x14)) {
                    /* WARNING: Subroutine does not return */
    __stack_chk_fail();
  }
  return;
}

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)