XpressBuildHuffmanEncodings

UINT64 __stdcall XpressBuildHuffmanEncodings(_HUFFMAN_WORKSPACE *Workspace){
  UINT64 *v2; 
  _HUFFMAN_WORKSPACE *v3; 
  _HUFFMAN_WORKSPACE *v4; 
  unsigned __int64 i; 
  unsigned __int64 v6; 
  _HUFFMAN_WORKSPACE *v7; 
  _WORD *v8; 
  __int64 v9; 
  _HUFFMAN_WORKSPACE *v10; 
  _HUFFMAN_WORKSPACE v11; 
  __int64 v12; 
  _HUFFMAN_WORKSPACE *v13; 
  __int64 v14; 
  unsigned __int64 v15; 
  char *v16; 
  __int64 v17; 
  _HUFFMAN_WORKSPACE *v18; 
  _HUFFMAN_WORKSPACE *v19; 
  _HUFFMAN_WORKSPACE *v20; 
  __int64 v21; 
  __int64 v22; 
  __int64 v23; 
  __int64 v24; 
  __int64 v25; 
  unsigned __int64 v26; 
  unsigned __int64 v27; 
  __int64 v28; 
  UINT64 j; 
  __int64 v30; 
  _HUFFMAN_WORKSPACE *v31; 
  unsigned __int64 v32; 
  _HUFFMAN_WORKSPACE *v33; 
  unsigned __int64 v34; 
  __int64 v36; 
  __int64 v37; 
  char v38; 
  _HUFFMAN_WORKSPACE *v39; 
  unsigned __int64 v40; 

  memset(Workspace + 6662, 0i64, 0x404u);
  v2 = (UINT64 *)(Workspace + 512);
  v3 = Workspace + 512;
  memset(Workspace + 7176, 0i64, 0x200u);
  v4 = Workspace + 7304;
  for( i = 0i64; i < 0x200; ++i )
  {
    v6 = (unsigned int)*v4;
    if( *v4 )
    {
      *(_QWORD *)v3 = v6;
      ++*((_WORD *)Workspace + (unsigned __int8)v6 + 13325);
      ++*((_WORD *)Workspace + (v6 >> 8) + 13582);
      *((_QWORD *)v3 + 1) = 0i64;
      *((_QWORD *)v3 + 2) = i;
      v3 += 6;
    }
    ++v4;
  }
  memset(Workspace + 7816, 0i64, 0x100u);
  v7 = Workspace + 518;
  if( v3 <= Workspace + 518 )
  {
    if( v3 == (_HUFFMAN_WORKSPACE *)v2 )
      return 0i64;
    v37 = *((_QWORD *)Workspace + 258);
    v38 = 16;
    if( (v37 & 1) == 0 )
      v38 = 1;
    *((_BYTE *)Workspace + (*((_QWORD *)Workspace + 258) >> 1) + 31264) = v38;
    Workspace[v37] = 1;
    return *v2;
  }
  v8 = (_WORD *)Workspace + 13325;
  v9 = 255i64;
  do
  {
    *v8 += *(v8 - 1);
    v8[257] += v8[256];
    ++v8;
    --v9;
  }
  while( v9 );
  v10 = Workspace + 512;
  if( v2 < (UINT64 *)v3 )
  {
    do
    {
      *((_WORD *)Workspace + *((unsigned __int16 *)Workspace + (unsigned __int8)*v10 + 13324) + 13838) = *((_WORD *)v10 + 8);
      v11 = *v10;
      v10 += 6;
      ++*((_WORD *)Workspace + (unsigned __int8)v11 + 13324);
    }
    while( v10 < v3 );
  }
  v12 = ((char *)v3 - (char *)Workspace - 2048) / 24;
  if( v12 )
  {
    v13 = Workspace + 6919;
    do
    {
      v14 = *(unsigned __int16 *)v13;
      v13 = (_HUFFMAN_WORKSPACE *)((char *)v13 + 2);
      v15 = (unsigned int)Workspace[v14 + 7304];
      v16 = (char *)Workspace + 2 * (v15 >> 8);
      v17 = *((unsigned __int16 *)v16 + 13581);
      *((_WORD *)v16 + 13581) = v17 + 1;
      *(_QWORD *)&Workspace[6 * v17 + 516] = v14;
      *(_QWORD *)&Workspace[6 * v17 + 512] = v15;
      --v12;
    }
    while( v12 );
  }
  while( 2 )
  {
    *((_QWORD *)v3 + 1) = v2;
    v18 = Workspace + 524;
    *((_QWORD *)v3 + 2) = v7;
    v19 = v3;
    v20 = v3;
    *(_QWORD *)v3 = *v2 + *(_QWORD *)v7;
    while( v18 != v3 || v20 != v19 )
    {
      v19 += 6;
      if( v18 == v3 || v20 < v19 && *(_QWORD *)v20 < *(_QWORD *)v18 )
      {
        *((_QWORD *)v19 + 1) = v20;
        v21 = *(_QWORD *)v20;
        v20 += 6;
      }
      else
      {
        *((_QWORD *)v19 + 1) = v18;
        v21 = *(_QWORD *)v18;
        v18 += 6;
      }
      *(_QWORD *)v19 = v21;
      if( v18 == v3 || v20 < v19 && *(_QWORD *)v20 < *(_QWORD *)v18 )
      {
        *((_QWORD *)v19 + 2) = v20;
        *(_QWORD *)v19 += *(_QWORD *)v20;
        v20 += 6;
      }
      else
      {
        *((_QWORD *)v19 + 2) = v18;
        *(_QWORD *)v19 += *(_QWORD *)v18;
        v18 += 6;
      }
    }
    v22 = 0i64;
    v23 = 0i64;
    while( *((_QWORD *)v19 + 1) )
    {
      *(_QWORD *)&Workspace[4 * v23 + 6664] = ++v22;
      *(_QWORD *)&Workspace[4 * v23 + 6662] = *((_QWORD *)v19 + 1);
      v25 = 1i64;
      v19 = (_HUFFMAN_WORKSPACE *)*((_QWORD *)v19 + 2);
LABEL_30:
      v23 += v25;
    }
    v24 = *((_QWORD *)v19 + 2);
    *((_QWORD *)v19 + 1) = v22;
    *((_BYTE *)Workspace + v24 + 28704) = v22;
    if( v23 )
    {
      v19 = *(_HUFFMAN_WORKSPACE **)&Workspace[4 * v23 + 6658];
      v22 = *(_QWORD *)&Workspace[4 * v23 + 6660];
      v25 = -1i64;
      goto LABEL_30;
    }
    v26 = *((_QWORD *)Workspace + 257);
    if( v26 > 0xF )
    {
      v39 = Workspace + 512;
      if( v2 < (UINT64 *)v3 )
      {
        do
        {
          v40 = *(_QWORD *)v39 + 1i64;
          *((_QWORD *)v39 + 1) = 0i64;
          *(_QWORD *)v39 = v40 >> 1;
          v39 += 6;
        }
        while( v39 < v3 );
      }
      continue;
    }
    break;
  }
  v27 = *((_QWORD *)v3 - 2);
  v28 = 0i64;
  for( j = 0i64; v27 <= v26; j += v34 )
  {
    v30 = 0i64;
    v31 = Workspace + 7816;
    v32 = 0i64;
    v33 = Workspace + 7304;
    do
    {
      if( *((unsigned __int8 *)Workspace + v32 + 28704) == v27 )
      {
        v36 = (unsigned int)*v33;
        *(_BYTE *)v31 |= v27;
        v30 += v36;
        HIWORD(Workspace[v32]) = v28++;
        LOWORD(Workspace[v32]) = v27;
      }
      if( *((unsigned __int8 *)Workspace + v32 + 28705) == v27 )
      {
        v30 += (unsigned int)v33[1];
        *(_BYTE *)v31 |= 16 * (_BYTE)v27;
        HIWORD(Workspace[v32 + 1]) = v28++;
        LOWORD(Workspace[v32 + 1]) = v27;
      }
      v31 = (_HUFFMAN_WORKSPACE *)((char *)v31 + 1);
      v32 += 2i64;
      v33 += 2;
    }
    while( v32 < 0x200 );
    v34 = v27 * v30;
    v28 *= 2i64;
    ++v27;
  }
  return j;
}

Referenced by:

RtlCompressBufferXpressHuffMax
RtlCompressBufferXpressHuffStandard