home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 3 / 3600 / decode.c < prev    next >
C/C++ Source or Header  |  1991-07-10  |  2KB  |  88 lines

  1. /*$Source: /usr/home/dhesi/booz/RCS/decode.c,v $*/
  2. /*$Id: decode.c,v 1.8 91/07/08 12:06:52 dhesi Exp $*/
  3. /***********************************************************
  4. Adapted from "ar" archiver written by Haruhiko Okumura.
  5. ***********************************************************/
  6.  
  7. #include "booz.h"
  8. #include "zoo.h"
  9. #include "ar.h"
  10. #include "lzh.h"
  11.  
  12. extern int decoded;     /* from huf.c */
  13.  
  14. static int j;  /* remaining bytes to copy */
  15.  
  16. /* must call this before decoding each file */
  17. int decode_start()
  18. {
  19.    huf_decode_start();
  20.    j = 0;
  21.    decoded = 0;
  22. }
  23.  
  24. /* decodes up to 'count' chars (but no more than DICSIZ) into supplied
  25. buffer; returns actual count.  */
  26.  
  27. int decode(count, buffer)
  28. uint count;
  29. uchar buffer[];
  30. {
  31.    static uint i;
  32.    uint r, c;
  33.  
  34.    r = 0;
  35.    while (--j >= 0) {
  36.       buffer[r] = buffer[i];
  37.       i = (i + 1) & (DICSIZ - 1);
  38.       if (++r == count)
  39.          return r;
  40.    }
  41.    for ( ; ; ) {
  42.       c = decode_c();
  43.       if (decoded)
  44.          return r;
  45.       if (c <= UCHAR_MAX) {
  46.          buffer[r] = c;
  47.          if (++r == count)
  48.             return r;
  49.       } else {
  50.          j = c - (UCHAR_MAX + 1 - THRESHOLD);
  51.          i = (r - decode_p() - 1) & (DICSIZ - 1);
  52.          while (--j >= 0) {
  53.             buffer[r] = buffer[i];
  54.             i = (i + 1) & (DICSIZ - 1);
  55.             if (++r == count)
  56.                return r;
  57.          }
  58.       }
  59.    }
  60. }
  61.  
  62. FILE *arcfile;
  63.  
  64. extern char out_buf_adr[];       /* address of buffer */
  65.  
  66. /*
  67. lzh_decode decodes its input and sends it to output.
  68. Should return error status or byte count, but currently
  69. returns 0.
  70. */
  71.  
  72. int lzh_decode(infile, outfile)
  73. FILE *infile;
  74. FILE *outfile;
  75. {
  76.    int n;
  77.    extern int decoded;
  78.    arcfile = infile;             /* stream to be decoded */
  79.  
  80.    decode_start();
  81.    while (!decoded) {
  82.       n = decode((uint) DICSIZ, (uchar *)out_buf_adr); 
  83.       /* n = count of chars decoded */
  84.       fwrite_crc(out_buf_adr, n, outfile);
  85.    }
  86.    return 0;
  87. }
  88.