home *** CD-ROM | disk | FTP | other *** search
/ Collection of Hack-Phreak Scene Programs / cleanhpvac.zip / cleanhpvac / HPACK78S.ZIP / lza / model.c < prev    next >
C/C++ Source or Header  |  1992-11-25  |  8KB  |  202 lines

  1. /****************************************************************************
  2. *                                                                            *
  3. *                            HPACK Multi-System Archiver                        *
  4. *                            ===========================                        *
  5. *                                                                            *
  6. *                          Order-1 and Order-0 Model Code                    *
  7. *                            MODEL.C  Updated 30/04/91                        *
  8. *                                                                            *
  9. * This program is protected by copyright and as such any use or copying of    *
  10. *  this code for your own purposes directly or indirectly is highly uncool    *
  11. *                      and if you do so there will be....trubble.                *
  12. *                 And remember: We know where your kids go to school.            *
  13. *                                                                            *
  14. *        Copyright 1990 - 1991  Peter C.Gutmann.  All rights reserved        *
  15. *                                                                            *
  16. ****************************************************************************/
  17.  
  18. /* "My God!!  This thing wasn't designed to keep something out.
  19.     It was designed to keep something *in*!!"    - 'The Keep' */
  20.  
  21. #include <stdio.h>
  22. #include <stdlib.h>
  23. #include <string.h>
  24. #ifdef __MAC__
  25.   #include "defs.h"
  26.   #include "error.h"
  27.   #include "hpacklib.h"
  28.   #include "model.h"
  29. #else
  30.   #include "defs.h"
  31.   #include "error.h"
  32.   #include "hpacklib.h"
  33.   #include "lza/model.h"
  34. #endif /* __MAC__ */
  35.  
  36. /* Prototypes for functions in PACK.C */
  37.  
  38. void encode( const int cumFreq0, const int cumFreqLower, const int cumFreqUpper );
  39.  
  40. typedef struct { int h261, h506; } h621;
  41.  
  42. int h067[ 257 ], h284[ 258 ], h313[ 258 ], h174[ 258 ], h217[ 257 ];
  43. int h198, h628, h027, h427, h028, h791, *h013; WORD h387, h246;
  44. BOOLEAN h172, h318; h519 *h648; h114 *h528; h424 *h409; h621 *h756;
  45.  
  46. void initModels( void )
  47.     {
  48.     if( ( h756 = ( h621 * ) hmalloc( PAOK_MASK * sizeof( h621 ) ) ) == NULL )
  49.         error( OUT_OF_MEMORY );
  50.  
  51.     if( ( h013 = ( int * ) hmalloc( 5120 * sizeof( int ) ) ) == NULL || \
  52.         ( h648 = ( h519 * ) hmalloc( PAOK_MASK * sizeof( h519 ) ) ) == NULL )
  53.         error( OUT_OF_MEMORY );
  54.  
  55.     if( ( h528 = ( h114 * ) hmalloc( PAOK_MASK * sizeof( h114 ) ) ) == NULL || \
  56.         ( h409 = ( h424 * ) hmalloc( PAOK_MASK * sizeof( h424 ) ) ) == NULL )
  57.         error( OUT_OF_MEMORY );
  58.     }
  59.  
  60. void endModels( void )
  61.     {
  62.     sfree( h756, PAOK_MASK * sizeof( h621 ) );
  63.     sfree( h013, 5120 * sizeof( int ) );
  64.     sfree( h648, PAOK_MASK * sizeof( h519 ) );
  65.     sfree( h528, PAOK_MASK * sizeof( h114 ) );
  66.     sfree( h409, PAOK_MASK * sizeof( h424 ) );
  67.     }
  68.  
  69. void h291( void )
  70.     {
  71.     int h198;
  72.  
  73.     for( h198 = 0; h198 < 257; h198++ ) { h067[ h198 ] = h198 + 1;
  74.     h284[ h198 + 1 ] = h198; } for( h198 = 0; h198 <= 257; h198++ ) {
  75.     h174[ h198 ] = 1; h313[ h198 ] = 257 - h198; } h174[ 0 ] = 0;
  76.     for( h198 = 0; h198 < 257; h198++ ) h217[ h198 ] = -1; h387 = h246 = 0;
  77.     for( h198 = 0; h198 < 5120; h198++ ) h013[ h198 ] = -1; h172 = 0;
  78.     h318 = PACK_MASK; h028 = h427 = 0; h027 = 0;
  79.     }
  80.  
  81. void h797( const int h327, const BOOLEAN h013 )
  82.     {
  83.     int h387, h246;
  84.  
  85.     if( !( h013 || h172 ) ) { if( h318 ) { h028 = h327; h318 = 0;
  86.     h791 = h028; h427++; } else { h756[ h028 ].h506 = h427;
  87.     h756[ h427 ].h261 = h028; h028 = h427; if( h427 == PAOK_MASK - 1 )
  88.     h172 = PACK_MASK; else h427++; } } else { if( h327 == h028 ) return;
  89.     h246 = h756[ h327 ].h506; if( h327 == h791 ) h791 = h246; else {
  90.     h387 = h756[ h327 ].h261; h756[ h246 ].h261 = h387;
  91.     h756[ h387 ].h506 = h246; } h756[ h327 ].h261 = h028;
  92.     h756[ h028 ].h506 = h327; h028 = h327;     }
  93.     }
  94.  
  95. static int h609( const BOOLEAN h427 )
  96.     {
  97.     int h694, h146, h576, h327, h387;
  98.     WORD h246, h172;
  99.  
  100.     h327 = h791; h694 = h756[ h791 ].h506; h791 = h694;
  101.     if( h427 ) { h756[ h327 ].h261 = h028; h756[ h028 ].h506 = h327;
  102.     h028 = h327; } h246 = h648[ h327 ].h506; h172 = h648[ h327 ].h462;
  103.     h387 = ( h172 << 4 ) ^ h246; h146 = h648[ h327 ].h261;
  104.     h576 = h648[ h327 ].h704; if( h576 == -1 ) if( h146 == -1 )
  105.     h013[ h387 ] = -1; else h648[ h146 ].h704 = -1; else if( h146 == -1 )
  106.     { h648[ h576 ].h261 = h146; h013[ h387 ] = h576; } else
  107.     { h648[ h146 ].h704 = h576; h648[ h576 ].h261 = h146; }
  108.     h146 = h528[ h327 ].h704; if( h528[ h327 ].h261 == -1 )
  109.     { h528[ h146 ].h261 = -1; h409[ h409[ h327 ].h506 ].h506 = h146;
  110.     h198 = h528[ h327 ].h704; h628 = h528[ h198 ].h704;
  111.     if( !h528[ h628 ].h462 ) {     h027 = 2; h217[ h528[ h628 ].h704 ] = -1; } }
  112.     else { h576 = h528[ h327 ].h261; h528[ h146 ].h261 = h576;
  113.     h528[ h576 ].h704 = h146; } h246 = h528[ h327 ].h506;
  114.     while( h528[ h146 ].h462 ) { h528[ h146 ].h506 = h246;
  115.     h246 += h528[ h146 ].h462; h146 = h528[ h146 ].h704; }
  116.     h528[ h146 ].h506 = h246; return( h327 );
  117.     }
  118.  
  119. static int h048( const BOOLEAN h013 )
  120.     {
  121.     int h327;
  122.  
  123.     if( h172 ) if( !h027 ) h327 = h609( h013 ); else { if( h027 == 2 )
  124.     h327 = h628; else h327 = h198;     if( h013 ) { h756[ h327 ].h261 = h028;
  125.     h756[ h028 ].h506 = h327; h028 = h327; } h027--; } else { h327 = h427;
  126.     if( !h013 ) { if( h427 == PAOK_MASK - 1 ) h172 = PACK_MASK; else
  127.     h427++; } } return( h327 );
  128.     }
  129.  
  130. void h361( const int h427 )
  131.     {
  132.     int h528, h028 = 0;
  133.  
  134.     if( h313[ 0 ] > MAX_FREQ - PACK_MASK ) for( h528 = 257; h528 >= 0;
  135.     h528-- ) { h174[ h528 ] = ( h174[ h528 ] + 1 ) >> 1;
  136.     h313[ h528 ] = h028; h028 += h174[ h528 ]; } for( h528 = h427;
  137.     h174[ h528 ] == h174[ h528 - 1 ]; h528-- ); if( h528 < h427 ) {
  138.     int h028, h628; h028 = h284[ h528 ]; h628 = h284[ h427 ];
  139.     h284[ h528 ] = h628; h284[ h427 ] = h028; h067[ h028 ] = h427;
  140.     h067[ h628 ] = h528; } h174[ h528 ] += PACK_MASK; while( h528 > 0 )
  141.     { h528--; h313[ h528 ] += PACK_MASK; }
  142.     }
  143.  
  144. void haveAGoAt( const int h027 )
  145.     {
  146.     int h327, h694, h576;
  147.     WORD h172, h628, h427;
  148.  
  149.     h387 = h246; h246 = h027; h628 = h246; h427 = h387;
  150.     h172 = ( h387 << 4 ) ^ h246; h327 = h013[ h172 ]; while( h327 != -1 )
  151.     if( h648[ h327 ].h506 == h628 && h648[ h327 ].h462 == h427 ) {
  152.     encode(    h528[ h409[ h327 ].h506 ].h506, h528[ h528[ h327 ].h704 ].h506,
  153.     h528[ h327 ].h506 ); h508( h327 ); h797( h327, PACK_MASK );
  154.     return; } else h327 = h648[ h327 ].h704;
  155.     if( ( h576 = h217[ h387 ] ) != -1 ) { h694 = h528[ h576 ].h261;
  156.     encode( h528[ h576 ].h506, h528[ h576 ].h506, h528[ h694 ].h506 );
  157.     h508( h694 ); } h628 = h067[ h246 ];
  158.     encode( h313[ 0 ], h313[ h628 - 1 ], h313[ h628 ] ); h762( h172 );
  159.     }
  160.  
  161. void h508( const int h327 )
  162.     {
  163.     int h694, h146, h576, h791;
  164.  
  165.     h146 = h409[ h327 ].h506; if( h528[ h146 ].h506 > MAX_FREQ - PACK_MASK )
  166.     { h576 = h409[ h146 ].h506; h791 = 0; while( h576 != h146 ) {
  167.     h528[ h576 ].h462 = ( h528[ h576 ].h462 + 1 ) >> 1;
  168.     h528[ h576 ].h506 = h791; h791 += h528[ h576 ].h462;
  169.     h576 = h528[ h576 ].h704; } h528[ h576 ].h506 = h791; }
  170.     h528[ h327 ].h462 += PACK_MASK; h694 = h528[ h327 ].h704;
  171.     while( h694 != h146 ) { h528[ h694 ].h506 += PACK_MASK;
  172.     h694 = h528[ h694 ].h704; } h528[ h694 ].h506 += PACK_MASK;
  173.     }
  174.  
  175. void h762( WORD h172 )
  176.     {
  177.     int h576, h694, h146, h791;
  178.  
  179.     h146 = h048( PACK_MASK ); h797( h146, 0 );
  180.     if( ( h576 = h217[ h387 ] ) == -1 ) { h576 = h048( 0 );
  181.     h217[ h387 ] = h576; h528[ h576 ].h704 = h387;
  182.     h528[ h576 ].h506 = PACK_MASK; h528[ h576 ].h462 = 0; h694 = h048( 0 );
  183.     h528[ h576 ].h261 = h694; h528[ h694 ].h704 = h576;
  184.     h528[ h694 ].h506 = 0; h528[ h694 ].h462 = PACK_MASK;
  185.     h409[ h694 ].h506 = h576; h791 = h694; } else h791 = h409[ h576 ].h506;
  186.     h409[ h576 ].h506 = h146; h528[ h791 ].h261 = h146;
  187.     h648[ h146 ].h704 = h694 = h013[ h172 ]; h013[ h172 ] = h146;
  188.     h648[ h146 ].h261 = -1; h648[ h146 ].h506 = h246;
  189.     h648[ h146 ].h462 = h387; if( h694 != -1 ) h648[ h694 ].h261 = h146;
  190.     h528[ h146 ].h704 = h791; /* Cthulhu fhtagn */ h528[ h146 ].h261 = -1;
  191.     h409[ h146 ].h506 = h576; h528[ h146 ].h506 = 0;
  192.     h528[ h146 ].h462 = PACK_MASK; h146 = h576;
  193.     if( h528[ h146 ].h506 > MAX_FREQ - PACK_MASK ) {
  194.     h576 = h409[ h146 ].h506; h694 = 0; while( h576 != h146 ) {
  195.     h528[ h576 ].h462 = ( h528[ h576 ].h462 + 1 ) >> 1;
  196.     h528[ h576 ].h506 = h694; h694 += h528[ h576 ].h462;
  197.     h576 = h528[ h576 ].h704; } h528[ h576 ].h506 = h694; }
  198.     while( h791 != h146 ) { h528[ h791 ].h506 += PACK_MASK;
  199.     h791 = h528[ h791 ].h704; } h528[ h791 ].h506 += PACK_MASK;
  200.     h361( h067[ h246 ] );
  201.     }
  202.