home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 20 / AACD20.BIN / AACD / Programming / AmiSlate-Source / AmiSource-c / byterun.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-07-31  |  1.8 KB  |  110 lines

  1. /* packer.c -- by Jerry Morrison and Steve Shaw, Electronic Arts. */
  2.  
  3. #include <exec/types.h>
  4.  
  5. #define DUMP 0
  6. #define RUN  1
  7.  
  8. #define MinRun 3
  9. #define MaxRun 128
  10. #define MaxDat 128
  11.  
  12. /* When used on global definitions, static means private. */
  13. static LONG putSize;
  14. static char buf[256];
  15.  
  16. #define GetByte()    (*source++)
  17. #define PutByte(c)    { *dest++ = (c); ++putSize; }
  18.  
  19. static BYTE * PutDump(BYTE * dest, int nn)
  20. {
  21.     int i;
  22.     
  23.     PutByte(nn-1);
  24.     for (i=0; i<nn; i++) PutByte(buf[i]);
  25.     return(dest);
  26. }
  27.  
  28. static BYTE * PutRun (BYTE * dest, int nn, int cc)
  29. {
  30.     PutByte(-(nn-1));
  31.     PutByte(cc);
  32.     return(dest);
  33. }
  34.  
  35.  
  36. #define OutDump(nn)    dest = PutDump(dest, nn)
  37. #define OutRun(nn,cc)    dest = PutRun(dest, nn, cc)
  38.  
  39. /* PackRow */
  40.  
  41. LONG PackRow (BYTE **pSource, BYTE ** pDest, LONG rowSize)
  42. {
  43.     BYTE * source, * dest;
  44.     char c, lastc = '\0';
  45.     BOOL mode = DUMP;
  46.     short nbuf = 0;
  47.     short rstart = 0;
  48.     
  49.     source = *pSource;
  50.     dest = *pDest;
  51.     putSize = 0;
  52.     buf[0] = lastc = c = GetByte();
  53.     nbuf = 1; rowSize--;
  54.     
  55.     for (; rowSize; --rowSize)
  56.     {
  57.         buf[nbuf++] = c = GetByte();
  58.         switch(mode)
  59.         {
  60.             case DUMP:
  61.                 /* If the buffer is full, write the length byte, then the data */
  62.                 if (nbuf > MaxDat)
  63.                 {
  64.                     OutDump(nbuf-1);
  65.                     buf[0] = c;
  66.                     nbuf = 1; rstart = 0;
  67.                     break;
  68.                 }
  69.                 
  70.                 if (c == lastc)
  71.                 {
  72.                     if (nbuf-rstart >= MinRun)
  73.                     {
  74.                         if (rstart > 0) OutDump(rstart);
  75.                         mode = RUN;
  76.                     }
  77.                     else if (rstart == 0)
  78.                     {
  79.                         mode = RUN;
  80.                     }
  81.                 }
  82.                 else
  83.                 {
  84.                     rstart = nbuf - 1;
  85.                 }
  86.                 break;
  87.                 
  88.             case RUN:
  89.                 if ((c != lastc)||(nbuf - rstart > MaxRun))
  90.                 {
  91.                     OutRun(nbuf-1-rstart,lastc);
  92.                     buf[0] = c;
  93.                     nbuf = 1; rstart = 0;
  94.                     mode = DUMP;
  95.                 }
  96.                 break;
  97.         }
  98.         lastc = c;
  99.     }
  100.     
  101.     switch(mode)
  102.     {
  103.         case DUMP:    OutDump(nbuf); break;
  104.         case RUN:    OutRun(nbuf-rstart, lastc); break;
  105.     }
  106.     
  107.     *pSource = source;
  108.     *pDest = dest;
  109.     return(putSize);
  110. }