home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / CPM68K / 68000USQ.LBR / UTR.C < prev   
Text File  |  2000-06-30  |  2KB  |  90 lines

  1. static char    Sccs_Id[] = "@(#)utr.c    1.3    9/4/84 19:57:28";
  2.  
  3. #include <stdio.h>
  4. #include "sqcom.h"
  5. #include "usq.h"
  6.  
  7. /* initialize decoding functions */
  8.  
  9. init_cr()
  10. {
  11.     repct = 0;
  12. }
  13.  
  14. init_huff()
  15. {
  16.     bpos = 99;    /* force initial read */
  17. }
  18.  
  19. /* Get bytes with decoding - this decodes repetition,
  20.  * calls getuhuff to decode file stream into byte
  21.  * level code with only repetition encoding.
  22.  *
  23.  * The code is simple passing through of bytes except
  24.  * that DLE is encoded as DLE-zero and other values
  25.  * repeated more than twice are encoded as value-DLE-count.
  26.  */
  27.  
  28. int
  29. getcr(ib)
  30. FILE *ib;
  31. {
  32.     int c;
  33.  
  34.     if(repct > 0) {
  35.         /* Expanding a repeated char */
  36.         --repct;
  37.         return value;
  38.     } else {
  39.         /* Nothing unusual */
  40.         if((c = getuhuff(ib)) != DLE) {
  41.             /* It's not the special delimiter */
  42.             value = c;
  43.             if(value == EOF)
  44.                 repct = LARGE;
  45.             return value;
  46.         } else {
  47.             /* Special token */
  48.             if((repct = getuhuff(ib)) == 0)
  49.                 /* DLE, zero represents DLE */
  50.                 return DLE;
  51.             else {
  52.                 /* Begin expanding repetition */
  53.                 repct -= 2;    /* 2nd time */
  54.                 return value;
  55.             }
  56.         }
  57.     }
  58. }
  59.  
  60. /* Decode file stream into a byte level code with only
  61.  * repetition encoding remaining.
  62.  */
  63.  
  64. int
  65. getuhuff(ib)
  66. FILE *ib;
  67. {
  68.     int i;
  69.     int bitval;
  70.  
  71.     /* Follow bit stream in tree to a leaf*/
  72.     i = 0;    /* Start at root of tree */
  73.     do {
  74.         if(++bpos > 7) {
  75.             if((curin = getc(ib)) == ERROR)
  76.                 return ERROR;
  77.             bpos = 0;
  78.             /* move a level deeper in tree */
  79.             i = dnode[i].children[1 & curin];
  80.         } else
  81.             i = dnode[i].children[1 & (curin >>= 1)];
  82.     } while(i >= 0);
  83.  
  84.     /* Decode fake node index to original data value */
  85.     i = -(i + 1);
  86.     /* Decode special endfile token to normal EOF */
  87.     i = (i == SPEOF) ? EOF : i;
  88.     return i;
  89. }
  90.