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 / UTILS / SQUSQ / TR1.C < prev    next >
C/C++ Source or Header  |  2000-06-30  |  1KB  |  62 lines

  1. #include <bdscio.h>
  2. #include <dio.h>
  3. #include "sqcom.h"
  4. #include "sq.h"
  5.  
  6. /* First translation - encoding of repeated characters
  7.  * The code is byte for byte pass through except that
  8.  * DLE is encoded as DLE, zero and repeated byte values
  9.  * are encoded as value, DLE, count for count >= 3.
  10.  */
  11.  
  12. init_ncr()    /*initialize getcnr() */
  13. {
  14.     state = NOHIST;
  15. }
  16.  
  17. int
  18. getcnr(iob)
  19. struct _buf *iob;
  20. {
  21.     switch(state) {
  22.     case NOHIST:
  23.         /* No relevant history */
  24.         state = SENTCHAR;
  25.         return lastchar = getc_crc(iob);   
  26.     case SENTCHAR:
  27.         /* Lastchar is set, need lookahead */
  28.         switch(lastchar) {
  29.         case DLE:
  30.             state = NOHIST;
  31.             return 0;    /* indicates DLE was the data */
  32.         case EOF:
  33.             return EOF;
  34.         default:
  35.             for(likect = 1; (newchar = getc_crc(iob)) == lastchar && likect < 255; ++likect)
  36.                 ;
  37.             switch(likect) {
  38.             case 1:
  39.                 return lastchar = newchar;
  40.             case 2:
  41.                 /* just pass through */
  42.                 state = SENDNEWC;
  43.                 return lastchar;
  44.             default:
  45.                 state = SENDCNT;
  46.                 return DLE;
  47.             }
  48.         }
  49.     case SENDNEWC:
  50.         /* Previous sequence complete, newchar set */
  51.         state = SENTCHAR;
  52.         return lastchar = newchar;
  53.     case SENDCNT:
  54.         /* Sent DLE for repeat sequence, send count */
  55.         state = SENDNEWC;
  56.         return likect;
  57.     default:
  58.         puts("Bug - bad state\n");
  59.         exit(1);
  60.     }
  61. }
  62.