Загрузка данных



/* CImp::expand_lz(unsigned char*, int, int, int) */

void __thiscall CImp::expand_lz(CImp *this,uchar *param_1,int param_2,int param_3,int param_4)

{
  byte bVar1;
  byte bVar2;
  byte bVar3;
  undefined1 uVar4;
  char cVar5;
  uint uVar6;
  uchar *puVar7;
  uint uVar8;
  char cVar9;
  int iVar10;
  uchar *puVar11;
  char cVar12;
  uint uVar13;
  uint uVar14;
  undefined1 *puVar15;
  char *pcVar16;
  int *piVar17;
  uint *puVar18;
  uchar *puVar19;
  uchar *puVar20;
  int iVar21;
  int iVar22;
  CImp *pCVar23;
  uchar *puVar24;
  char cVar25;
  int iVar26;
  int iVar27;
  uint local_e64;
  uint local_e3c;
  uint local_e38;
  int aiStack_e2c [512];
  uint auStack_62c [288];
  uint local_1ac [14];
  byte abStack_172 [20];
  byte abStack_15e [20];
  byte abStack_14a [46];
  int local_11c [34];
  byte abStack_92 [6];
  undefined4 local_8c;
  undefined1 local_68 [20];
  char local_54 [20];
  undefined4 local_40;
  int local_2c [2];
  
  local_2c[0] = __stack_chk_guard;
  if (param_4 != 0) {
    *(undefined4 *)(this + 0x742c) = 0;
  }
  uVar6 = getbits(this,2);
  uVar6 = uVar6 & 3;
  *(uint *)(this + 0x7858) = *(uint *)(this + 0x7858) >> 2;
  *(int *)(this + 0x7428) = *(int *)(this + 0x7428) + -2;
  if (uVar6 == 0) {
    iVar22 = -3;
  }
  else {
    local_e64 = getbits(this,6);
    if (2 < uVar6) {
      iVar26 = 0x174;
    }
    else {
      iVar26 = 0x158;
    }
    local_e64 = local_e64 & 0x3f;
    *(uint *)(this + 0x7858) = *(uint *)(this + 0x7858) >> 6;
    if (local_e64 == 0) {
      iVar22 = 0x158;
    }
    else {
      iVar22 = iVar26 * local_e64;
    }
    *(int *)(this + 0x7428) = *(int *)(this + 0x7428) + -6;
    puVar7 = (uchar *)__allocCustomHeap(iVar22);
    if (puVar7 == (uchar *)0x0) {
      iVar22 = -10;
    }
    else {
      iVar22 = load_hcodes(this,puVar7,iVar26,local_e64,param_3 + param_2);
      if (iVar22 < 0) {
        __freeCustomHeap(puVar7);
      }
      else {
        piVar17 = (int *)(local_54 + 0x14);
        cVar9 = '\v';
        cVar12 = '\x02';
        do {
          cVar25 = cVar12 + cVar9 + cVar12;
          cVar5 = cVar25 + cVar12;
          *(char *)piVar17 = cVar9;
          *(char *)((int)piVar17 + 1) = cVar12 + cVar9;
          *(char *)((int)piVar17 + 2) = cVar25;
          *(char *)((int)piVar17 + 3) = cVar5;
          piVar17 = piVar17 + 1;
          cVar9 = cVar5 + cVar12;
          cVar12 = cVar12 << 1;
        } while (piVar17 != local_2c);
        puVar15 = local_68;
        iVar22 = 1;
        do {
          uVar4 = (undefined1)iVar22;
          iVar22 = iVar22 + 1;
          puVar15[3] = uVar4;
          *puVar15 = uVar4;
          puVar15[1] = uVar4;
          puVar15[2] = uVar4;
          puVar15 = puVar15 + 4;
        } while (iVar22 != 6);
        pcVar16 = local_54;
        cVar12 = '\x01';
        do {
          pcVar16[3] = cVar12;
          *pcVar16 = cVar12;
          pcVar16[1] = cVar12;
          pcVar16[2] = cVar12;
          pcVar16 = pcVar16 + 4;
          cVar12 = cVar12 * '\x02' + '\x01';
        } while (pcVar16 != local_54 + 0x14);
        piVar17 = local_11c;
        iVar10 = 5;
        iVar22 = 2;
        do {
          *piVar17 = iVar10;
          piVar17[1] = iVar10 + iVar22;
          piVar17 = piVar17 + 2;
          iVar10 = iVar10 + iVar22 + iVar22;
          iVar22 = iVar22 << 1;
        } while (piVar17 != &local_8c);
        puVar15 = (undefined1 *)((int)&local_8c + 1);
        iVar22 = 1;
        do {
          uVar4 = (undefined1)iVar22;
          iVar22 = iVar22 + 1;
          puVar15[-1] = uVar4;
          *puVar15 = uVar4;
          puVar15 = puVar15 + 2;
        } while (iVar22 != 0x13);
        uVar13 = 1;
        puVar18 = local_1ac + 1;
        do {
          *puVar18 = uVar13;
          puVar18[-1] = uVar13;
          puVar18 = puVar18 + 2;
          uVar13 = uVar13 * 2 + 1;
        } while (puVar18 != (uint *)(local_11c + 1));
        puVar11 = param_1 + param_2;
        puVar19 = puVar11 + param_3;
        if (puVar11 < puVar19) {
          if (local_e64 == 0) {
            local_e64 = 1;
          }
          local_e38 = 0;
          iVar10 = (int)puVar7 + -iVar26;
          local_e3c = 0;
          iVar22 = 0x100;
          do {
            uVar14 = local_e38;
            uVar13 = local_e3c;
            puVar24 = puVar11;
            if (iVar22 == 0x100) {
              if (local_e64 == 0) break;
              puVar20 = (uchar *)(iVar10 + iVar26);
              make_codes(this,auStack_62c,puVar20,0x120);
              make_decode_tables(this,aiStack_e2c,(int *)this,auStack_62c,puVar20,9,0x120);
              puVar20 = puVar20 + 0x120;
              local_e64 = local_e64 - 1;
              iVar22 = 0;
              pCVar23 = this + 0x52f0;
              do {
                make_codes(this,auStack_62c,puVar20,*(int *)pCVar23);
                make_decode_tables(this,(int *)(this + iVar22 * 0x200 + 0xcf0),
                                   (int *)(this + iVar22 * 0x150 + 0x900),auStack_62c,puVar20,7,
                                   *(int *)pCVar23);
                iVar22 = iVar22 + 1;
                puVar20 = puVar20 + *(int *)pCVar23;
                pCVar23 = pCVar23 + 4;
              } while (iVar22 < (int)uVar6);
              iVar10 = (int)puVar20 + -iVar26;
            }
            uVar8 = getbits(this,9);
            iVar22 = aiStack_e2c[uVar8 & 0x1ff];
            if (iVar22 < 0) {
              if (iVar22 == -0x120) {
LAB_0003d0f4:
                uVar13 = (int)puVar11 - (int)param_1;
              }
              else {
                uVar8 = getbits(this,0x10);
                iVar22 = -iVar22;
                uVar8 = uVar8 >> 9;
                do {
                  iVar22 = *(int *)(this + ((uVar8 & 1) + iVar22 * 2) * 4);
                  uVar8 = uVar8 >> 1;
                } while (0 < iVar22);
                if (iVar22 != -0x120) {
                  iVar22 = -iVar22;
                  goto LAB_0003cd34;
                }
LAB_0003d10c:
                uVar13 = (int)puVar11 - (int)param_1;
              }
              goto LAB_0003ce18;
            }
LAB_0003cd34:
            *(uint *)(this + 0x7428) = *(int *)(this + 0x7428) - (uint)*(byte *)(iVar10 + iVar22);
            *(uint *)(this + 0x7858) = *(uint *)(this + 0x7858) >> *(sbyte *)(iVar10 + iVar22);
            if (iVar22 < 0x100) {
              *puVar11 = (uchar)iVar22;
              puVar24 = puVar11 + 1;
            }
            else if (iVar22 != 0x100) {
              if (iVar22 < 0x10a) {
                iVar21 = iVar22 + -0xff;
              }
              else if (iVar22 < 0x11e) {
                uVar8 = getbits(this,5);
                bVar3 = abStack_172[iVar22];
                bVar1 = abStack_15e[iVar22];
                bVar2 = abStack_14a[iVar22];
                *(uint *)(this + 0x7858) = *(uint *)(this + 0x7858) >> (uint)bVar3;
                *(uint *)(this + 0x7428) = *(int *)(this + 0x7428) - (uint)bVar3;
                iVar21 = (uVar8 & bVar1) + (uint)bVar2;
              }
              else {
                if (iVar22 != 0x11e) {
                  uVar13 = getbits(this,3);
                  iVar21 = *(int *)(this + 0x742c);
                  iVar27 = *(int *)(this + 0x7428);
                  *(uint *)(this + 0x7858) = *(uint *)(this + 0x7858) >> 3;
                  *(uint *)(this + (iVar21 + 0x1e18) * 4) =
                       (int)puVar11 - (int)param_1 | (uVar13 & 7) << 0x18;
                  *(int *)(this + 0x742c) = iVar21 + 1;
                  *(int *)(this + 0x7428) = iVar27 + -3;
                  goto LAB_0003cdf8;
                }
                uVar8 = getbits(this,0xf);
                *(uint *)(this + 0x7858) = *(uint *)(this + 0x7858) >> 0xf;
                *(int *)(this + 0x7428) = *(int *)(this + 0x7428) + -0xf;
                iVar21 = (uVar8 & 0x7fff) + 0x103;
              }
              if (iVar21 == 3) {
                uVar8 = (uint)(2 < uVar6);
              }
              else {
                uVar8 = 0;
              }
              iVar27 = (uint)(iVar21 == 2) + uVar8 * 2;
              uVar8 = getbits(this,7);
              iVar22 = *(int *)(this + ((uVar8 & 0x7f) + iVar27 * 0x80 + 0x33c) * 4);
              if (iVar22 < 0) {
                if (iVar22 == -0x120) goto LAB_0003d0f4;
                uVar8 = getbits(this,0x10);
                uVar8 = uVar8 >> 7;
                iVar22 = -iVar22;
                do {
                  iVar22 = *(int *)(this + ((uVar8 & 1) + (iVar27 * 0x2a + iVar22) * 2 + 0x240) * 4)
                  ;
                  uVar8 = uVar8 >> 1;
                } while (0 < iVar22);
                if (iVar22 == -0x120) goto LAB_0003d10c;
                iVar22 = -iVar22;
              }
              iVar27 = *(int *)(this + (iVar27 + 0x1480) * 4 + 0xfc);
              *(uint *)(this + 0x7428) =
                   *(int *)(this + 0x7428) - (uint)*(byte *)(iVar10 + iVar22 + iVar27);
              *(uint *)(this + 0x7858) =
                   *(uint *)(this + 0x7858) >> *(sbyte *)(iVar10 + iVar22 + iVar27);
              uVar8 = local_e3c;
              if (iVar22 != 0) {
                if (iVar22 == 1) {
                  local_e3c = local_e38;
                  local_e38 = uVar13;
                  uVar8 = uVar14;
                }
                else if (iVar22 < 6) {
                  uVar8 = iVar22 - 1;
                }
                else {
                  uVar13 = getbits(this,0x12);
                  bVar3 = abStack_92[iVar22];
                  uVar14 = local_1ac[iVar22 + -6];
                  iVar27 = local_11c[iVar22 + -6];
                  *(uint *)(this + 0x7858) = *(uint *)(this + 0x7858) >> (uint)bVar3;
                  uVar8 = (uVar13 & uVar14) + iVar27;
                  local_e38 = local_e3c;
                  *(uint *)(this + 0x7428) = *(int *)(this + 0x7428) - (uint)bVar3;
                  local_e3c = uVar8;
                }
              }
              uVar13 = (int)puVar11 - (int)param_1;
              if ((uVar8 <= uVar13) && (iVar21 != 0)) {
                if (puVar19 <= puVar11) goto LAB_0003ce18;
                iVar27 = 0;
                puVar20 = puVar11;
                while( true ) {
                  puVar24 = puVar20 + 1;
                  *puVar20 = puVar11[iVar27 - uVar8];
                  if (iVar27 == iVar21 + -1) break;
                  iVar27 = iVar27 + 1;
                  puVar20 = puVar24;
                  if (puVar24 == puVar19) {
                    uVar13 = (int)puVar24 - (int)param_1;
                    goto LAB_0003ce18;
                  }
                }
              }
            }
LAB_0003cdf8:
            puVar11 = puVar24;
          } while (puVar24 < puVar19);
          uVar13 = (int)puVar24 - (int)param_1;
        }
        else {
          uVar13 = (int)puVar11 - (int)param_1;
        }
LAB_0003ce18:
        __freeCustomHeap(puVar7);
        if (param_4 != 0) {
          reverse_mm(this,param_1,param_3 + param_2);
        }
        iVar22 = uVar13 - param_2;
      }
    }
  }
  if (local_2c[0] == __stack_chk_guard) {
    return;
  }
                    /* WARNING: Subroutine does not return */
  __stack_chk_fail(iVar22);
}