jjj1shar.c
上传用户:xiaoan1112
上传日期:2013-04-11
资源大小:19621k
文件大小:7k
源码类别:

操作系统开发

开发平台:

Visual C++

  1. /*
  2. **  JJJ1SHAR.C --  Shared code, variables, and defines for
  3. **                 JJJ1 compression/decompression module.
  4. */
  5. /*  This code was written by modifying the Zeck compression code
  6. **  and adding a triple huffman compressor.  The results are much
  7. **  smaller.  This was done by Jeff Johnson, 10/15/90 to accomodate
  8. **  Microsoft Excel 3.0.
  9. */
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include <ctype.h>
  13. #include <io.h>
  14. #include <fcntl.h>
  15. #include <malloc.h>
  16. #include <dos.h>
  17. #include <stdio.h>
  18. #include "..sutkcomp.h"
  19. #include "jjj1.h"
  20. #ifdef WIN_VER
  21. HANDLE vhAnalysis = NULL;
  22. HANDLE vhCt4a = NULL;
  23. HANDLE vhHtArr = NULL;
  24. HANDLE vhLookup4a = NULL;
  25. #endif /* WIN_VER */
  26. USHORT iPowers[16] = { 0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,
  27.                        32767 };
  28. //Analysis globals
  29. long far *   fpbAnalysis     = NULL;
  30. long far *   fpbAnalysis4a   = NULL;
  31. long far *   fpbAnalysis4b   = NULL;
  32. long far *   fpbAnalysis5    = NULL;
  33. long far *   fpbAnalysis6    = NULL;
  34. long far *   fpbAnalysis8    = NULL;
  35. HTREE far *  fphtArr         = NULL;
  36. CODETABLE far *  fpct4a      = NULL;
  37. CODETABLE far *  fpct4b      = NULL;
  38. CODETABLE far *  fpct5       = NULL;
  39. CODETABLE far *  fpct6       = NULL;
  40. CODETABLE far *  fpct8       = NULL;
  41. //Decomp globals
  42. BYTE far *       fpbLookup4a = NULL;
  43. BYTE far *       fpbLookup4b = NULL;
  44. BYTE far *       fpbLookup5  = NULL;
  45. BYTE far *       fpbLookup6  = NULL;
  46. BYTE far *       fpbLookup8  = NULL;
  47. /*
  48. **  BOOL  FAllocateJJJGlobals(LONG lcbDestMax, fCompressing)
  49. **
  50. **  Global arrays take about 45K so I wanted to allocate and free them rather
  51. **  than leave them around when not needed.
  52. **
  53. **  rgRoot and rgND are only needed when compressing, so they are only allocated
  54. **  if fCompressing is TRUE.
  55. */
  56. BOOL  FAllocateJJJGlobals(LONG lcbDestMax, BOOL fCompressing)
  57. {
  58.     if (fCompressing)
  59.         {
  60.         // This chunk holds all the long arrays for analysis
  61. #ifndef WIN_VER
  62.         fpbAnalysis = (long far *)_fmalloc(((256+64+32+16+16)*sizeof(long)));
  63. #else  /* WIN_VER */
  64.         GlobalCompact((DWORD)((256+64+32+16+16)*sizeof(long)));
  65.         if ((vhAnalysis = GlobalAlloc(GHND,
  66.                 (DWORD)((256+64+32+16+16)*sizeof(long)))) != NULL)
  67.             fpbAnalysis = (long far *)GlobalLock(vhAnalysis);
  68.         else
  69.             fpbAnalysis = NULL;
  70. #endif /* WIN_VER */
  71.         if (fpbAnalysis == NULL)
  72.             {
  73.             FreeJJJGlobals();
  74.             return(FALSE);
  75.             }
  76.         fpbAnalysis8 = fpbAnalysis;
  77.         fpbAnalysis6 = &(fpbAnalysis8[256]);
  78.         fpbAnalysis5 = &(fpbAnalysis6[64]);
  79.         fpbAnalysis4a= &(fpbAnalysis5[32]);
  80.         fpbAnalysis4b= &(fpbAnalysis4a[16]);
  81.         }
  82.     else
  83.         {
  84.         fpbAnalysis = NULL;
  85. #ifdef WIN_VER
  86.         vhAnalysis = NULL;
  87. #endif /* WIN_VER */
  88.         }
  89.     // This chunk holds all the code tables
  90. #ifndef WIN_VER
  91.     fpct4a = (CODETABLE far *)_fmalloc(((256+64+32+16+16)*sizeof(CODETABLE)));
  92. #else  /* WIN_VER */
  93.     GlobalCompact((DWORD)((256+64+32+16+16)*sizeof(CODETABLE)));
  94.     if ((vhCt4a = GlobalAlloc(GHND,
  95.             (DWORD)((256+64+32+16+16)*sizeof(CODETABLE)))) != NULL)
  96.         fpct4a = (CODETABLE far *)GlobalLock(vhCt4a);
  97.     else
  98.         fpct4a = NULL;
  99. #endif /* WIN_VER */
  100.     if (fpct4a == NULL)
  101.         {
  102.         FreeJJJGlobals();
  103.         return(FALSE);
  104.         }
  105.     fpct4b = &(fpct4a[16]);
  106.     fpct5  = &(fpct4b[16]);
  107.     fpct6  = &(fpct5[32]);
  108.     fpct8  = &(fpct6[64]);
  109.     // Allocate a structure used to build huffman trees
  110. #ifndef WIN_VER
  111.     fphtArr = (HTREE far *)_fmalloc((512*sizeof(HTREE)));
  112. #else  /* WIN_VER */
  113.     GlobalCompact((DWORD)(512*sizeof(HTREE)));
  114.     if ((vhHtArr = GlobalAlloc(GHND, (DWORD)(512*sizeof(HTREE)))) != NULL)
  115.         fphtArr = (HTREE far *)GlobalLock(vhHtArr);
  116.     else
  117.         fphtArr = NULL;
  118. #endif /* WIN_VER */
  119.     if (fphtArr == NULL)
  120.         {
  121.         FreeJJJGlobals();
  122.         return(FALSE);
  123.         }
  124.     // This chunk holds all the decomp lookup tables
  125.     if (!fCompressing)
  126.         {
  127. #ifndef WIN_VER
  128.         fpbLookup4a = (BYTE far *)_fmalloc(((5*256)*sizeof(BYTE)));
  129. #else  /* WIN_VER */
  130.         GlobalCompact((DWORD)((5*256)*sizeof(BYTE)));
  131.         if ((vhLookup4a = GlobalAlloc(GHND,
  132.                 (DWORD)((5*256)*sizeof(BYTE)))) != NULL)
  133.             fpbLookup4a = (BYTE far *)GlobalLock(vhLookup4a);
  134.         else
  135.             fpbLookup4a = NULL;
  136. #endif /* WIN_VER */
  137.         if (fpbLookup4a == NULL)
  138.             {
  139.             FreeJJJGlobals();
  140.             return(FALSE);
  141.             }
  142.         fpbLookup4b = &(fpbLookup4a[256]);
  143.         fpbLookup5  = &(fpbLookup4b[256]);
  144.         fpbLookup6  = &(fpbLookup5[256]);
  145.         fpbLookup8  = &(fpbLookup6[256]);
  146.         }
  147.     else
  148.         {
  149.         fpbLookup4a = NULL;
  150. #ifdef WIN_VER
  151.         vhLookup4a = NULL;
  152. #endif /* WIN_VER */
  153.         }
  154.     cbStrMax = (15 + cbIndex);
  155.     if (!FAllocateLZGlobals(lcbDestMax, fCompressing))
  156.         {
  157.         FreeJJJGlobals();
  158.         return(FALSE);
  159.         }
  160.     return((BOOL)TRUE);
  161. }
  162. /*
  163. **  void  FreeJJJGlobals(void)
  164. */
  165. void FreeJJJGlobals(void)
  166. {
  167.     FreeLZGlobals();
  168. #ifndef WIN_VER
  169.     if (fpbAnalysis != NULL)
  170.         _ffree(fpbAnalysis);
  171.     if (fpct4a != NULL)
  172.         _ffree(fpct4a);
  173.     if (fpbLookup4a != NULL)
  174.         _ffree(fpbLookup4a);
  175.     if (fphtArr != NULL)
  176.         _ffree(fphtArr);
  177. #else  /* WIN_VER */
  178.     if (vhAnalysis != NULL)
  179.         {
  180.         GlobalUnlock(vhAnalysis);
  181.         GlobalFree(vhAnalysis);
  182.         vhAnalysis = NULL;
  183.         }
  184.     if (vhCt4a != NULL)
  185.         {
  186.         GlobalUnlock(vhCt4a);
  187.         GlobalFree(vhCt4a);
  188.         vhCt4a = NULL;
  189.         }
  190.     if (vhLookup4a != NULL)
  191.         {
  192.         GlobalUnlock(vhLookup4a);
  193.         GlobalFree(vhLookup4a);
  194.         vhLookup4a = NULL;
  195.         }
  196.     if (vhHtArr != NULL)
  197.         {
  198.         GlobalUnlock(vhHtArr);
  199.         GlobalFree(vhHtArr);
  200.         vhHtArr = NULL;
  201.         }
  202. #endif /* WIN_VER */
  203. }
  204. // Routine builds huffman codes given their lengths and the table size
  205. BOOL BuildCodeTable(CODETABLE far * fpct, int cbct)
  206. {
  207.     int           cnt, prev = -1;
  208.     BYTE          curlen = 0;
  209.     unsigned int  curcode = 0;
  210.     for (cnt = 0; cnt < cbct; cnt++)
  211.         {
  212.         fpct[cnt].usCode = 0;
  213.         }
  214.     while (++curlen < 16)
  215.         {
  216.         for (cnt = 0; cnt < cbct; cnt++)
  217.             {
  218.             if (fpct[cnt].cbCode == curlen)  // Assign it a code
  219.                 {
  220.                 fpct[cnt].usCode = curcode++;
  221.                 if (prev != -1)
  222.                     fpct[prev].nextCode = (BYTE) cnt;
  223.                 prev = cnt;
  224.                 }
  225.             }
  226.         curcode <<= 1;
  227.         }
  228.     for (cnt = 0; cnt < cbct; cnt++)
  229.         {
  230.         if (fpct[cnt].cbCode >= 16)
  231.             return(FALSE);
  232.         }
  233.     return((BOOL)TRUE);
  234. }