home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / drdobbs / 1991 / 08 / dflat5 / decomp.c < prev    next >
Text File  |  1991-06-25  |  3KB  |  130 lines

  1. /* ------------------- decomp.c -------------------- */
  2.  
  3. /*
  4.  * Decompress the application.HLP file
  5.  * or load the application.TXT file if the .HLP file
  6.  * does not exist
  7.  */
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include "dflat.h"
  13. #include "htree.h"
  14.  
  15. #ifdef INCLUDE_COMPRESS_HELPFILE
  16.  
  17. static int in8;
  18. static int ct8 = 8;
  19.  
  20. static FILE *fi;
  21. static BYTECOUNTER bytectr;
  22.  
  23. static int LoadingASCII;
  24.  
  25. FILE *OpenHelpFile(void)
  26. {
  27.     unsigned char c;
  28.     char *cp;
  29.     int freqctr;
  30.     extern char **Argv;
  31.     char helpname[65];
  32.  
  33.     strcpy(helpname, Argv[0]);
  34.     cp = strrchr(helpname, '\\');
  35.     if (cp == NULL)
  36.         cp = helpname;
  37.     else 
  38.         cp++;
  39.     strcpy(cp, DFLAT_APPLICATION ".HLP");
  40.  
  41.     if ((fi = fopen(helpname, "rb")) == NULL)    {
  42.         strcpy(cp, DFLAT_APPLICATION ".TXT");
  43.         if ((fi = fopen(helpname, "rt")) == NULL)
  44.             return NULL;
  45.         LoadingASCII = TRUE;
  46.     }
  47.  
  48.     if (!LoadingASCII && ht == NULL)    {
  49.         if ((ht = calloc(256, sizeof(struct htree))) != NULL)    {
  50.             /* ----- read the byte count ------ */
  51.             fread(&bytectr, sizeof bytectr, 1, fi);
  52.             /* ----- read the frequency count ------ */
  53.             fread(&freqctr, sizeof freqctr, 1, fi);
  54.             /* -------- read the characters ---------- */
  55.             while (freqctr--)   {
  56.                 fread(&c, sizeof(char), 1, fi);
  57.                 ht[c].ch = c;
  58.                 fread(&ht[c].cnt, sizeof(BYTECOUNTER), 1, fi);
  59.             }
  60.             /* ---- build the huffman tree ----- */
  61.             buildtree();
  62.         }
  63.     }
  64.     return fi;
  65. }
  66.  
  67. void *GetHelpLine(char *line)
  68. {
  69.     int h;
  70.     if (LoadingASCII)
  71.         return fgets(line, 160, fi);
  72.     *line = '\0';
  73.     while (TRUE)    {
  74.         /* ----- decompress a line from the file ------ */
  75.         h = root;
  76.         /* ----- first get a character ----- */
  77.         while (ht[h].right != -1)    {
  78.             if (ct8 == 8)   {
  79.                 if ((in8 = fgetc(fi)) == EOF)    {
  80.                     *line = '\0';
  81.                     return NULL;
  82.                 }
  83.                 ct8 = 0;
  84.             }
  85.             if (in8 & 0x80)
  86.                 h = ht[h].left;
  87.             else
  88.                 h = ht[h].right;
  89.             in8 <<= 1;
  90.             ct8++;
  91.         }
  92.         if ((*line = ht[h].ch) == '\r')
  93.             continue;
  94.         if (*line == '\n')
  95.             break;
  96.         line++;
  97.     }
  98.     *++line = '\0';
  99.     return line;
  100. }
  101.  
  102. void HelpFilePosition(long *offset, int *bit)
  103. {
  104.     *offset = ftell(fi);
  105.     if (LoadingASCII)
  106.         *bit = 0;
  107.     else    {
  108.         if (ct8 < 8)
  109.             --*offset;
  110.         *bit = ct8;
  111.     }
  112. }
  113.  
  114. void SeekHelpLine(long offset, int bit)
  115. {
  116.     int i;
  117.     fseek(fi, offset, 0);
  118.     if (!LoadingASCII)    {
  119.         ct8 = bit;
  120.         if (ct8 < 8)    {
  121.             in8 = fgetc(fi);
  122.             for (i = 0; i < bit; i++)
  123.                 in8 <<= 1;
  124.         }
  125.     }
  126. }
  127.  
  128. #endif
  129.  
  130.