home *** CD-ROM | disk | FTP | other *** search
/ Fish 'n' More 2 / fishmore-publicdomainlibraryvol.ii1991xetec.iso / fish / applications / xlispstat / src / src1.lzh / Amiga / packer.c < prev    next >
C/C++ Source or Header  |  1990-10-05  |  2KB  |  74 lines

  1. #define FDwAT
  2. #include <iff/packer.h>
  3. #define DUMP    0
  4. #define RUN    1
  5. #define MinRun 3    
  6. #define MaxRun 128
  7. #define MaxDat 128
  8. LONG putSize;
  9. #define GetByte()    (*source++)
  10. #define PutByte(c)    { *dest++ = (c);   ++putSize; }
  11. char buf[256];
  12. BYTE *PutDump(dest, nn)  BYTE *dest;  int nn; {
  13.     int i;
  14.     PutByte(nn-1);
  15.     for(i = 0;  i < nn;  i++)   PutByte(buf[i]);
  16.     return(dest);
  17.     }
  18. BYTE *PutRun(dest, nn, cc)   BYTE *dest;  int nn, cc; {
  19.     PutByte(-(nn-1));
  20.     PutByte(cc);
  21.     return(dest);
  22.     }
  23. #define OutDump(nn)   dest = PutDump(dest, nn)
  24. #define OutRun(nn,cc) dest = PutRun(dest, nn, cc)
  25. LONG PackRow(pSource, pDest, rowSize)
  26.     BYTE **pSource, **pDest;   LONG rowSize; {
  27.     BYTE *source, *dest;
  28.     char c,lastc = '\0';
  29.     BOOL mode = DUMP;
  30.     short nbuf = 0;
  31.     short rstart = 0;
  32.     source = *pSource;
  33.     dest = *pDest;
  34.     putSize = 0;
  35.     buf[0] = lastc = c = GetByte();
  36.     nbuf = 1;   rowSize--;
  37.     for (;  rowSize;  --rowSize) {
  38.     buf[nbuf++] = c = GetByte();
  39.     switch (mode) {
  40.         case DUMP: 
  41.             if (nbuf>MaxDat) {
  42.                 OutDump(nbuf-1);  
  43.                 buf[0] = c; 
  44.                 nbuf = 1;   rstart = 0; 
  45.                 break;
  46.                 }
  47.             if (c == lastc) {
  48.                 if (nbuf-rstart >= MinRun) {
  49.                 if (rstart > 0) OutDump(rstart);
  50.                 mode = RUN;
  51.                 }
  52.                 else if (rstart == 0)
  53.                 mode = RUN;
  54.                 }
  55.             else  rstart = nbuf-1;
  56.             break;
  57.         case RUN: if ( (c != lastc)|| ( nbuf-rstart > MaxRun)) {
  58.                OutRun(nbuf-1-rstart,lastc);
  59.                 buf[0] = c;
  60.                 nbuf = 1; rstart = 0;
  61.                 mode = DUMP;
  62.                 }
  63.             break;
  64.         }
  65.     lastc = c;
  66.     }
  67.     switch (mode) {
  68.     case DUMP: OutDump(nbuf); break;
  69.     case RUN: OutRun(nbuf-rstart,lastc); break;
  70.     }
  71.     *pSource = source;
  72.     *pDest = dest;
  73.     return(putSize);
  74.     }