home *** CD-ROM | disk | FTP | other *** search
/ Gold Fish 2 / goldfish_vol2_cd1.bin / files / comm / misc / elcheapofax / rcs / packer.c,v < prev    next >
Text File  |  1993-12-21  |  3KB  |  164 lines

  1. head    1.2;
  2. access;
  3. symbols
  4.     OCT93:1.2;
  5. locks;
  6. comment    @ * @;
  7.  
  8.  
  9. 1.2
  10. date    93.06.11.16.33.37;    author Rhialto;    state Exp;
  11. branches;
  12. next    1.1;
  13.  
  14. 1.1
  15. date    93.06.11.14.53.53;    author Rhialto;    state Exp;
  16. branches;
  17. next    ;
  18.  
  19.  
  20. desc
  21. @ILBM CmpByteRun1 packer
  22. @
  23.  
  24.  
  25. 1.2
  26. log
  27. @First real RCS checkin
  28. @
  29. text
  30. @/* $Id$
  31.  * $Log$
  32.  */
  33. /*----------------------------------------------------------------------*
  34.  * packer.c Convert data to "cmpByteRun1" run compression.     11/15/85
  35.  *
  36.  * By Jerry Morrison and Steve Shaw, Electronic Arts.
  37.  * This software is in the public domain.
  38.  *
  39.  *    control bytes:
  40.  *     [0..127]   : followed by n+1 bytes of data.
  41.  *     [-1..-127] : followed by byte to be repeated (-n)+1 times.
  42.  *     -128        : NOOP.
  43.  *
  44.  * This version for the Commodore-Amiga computer.
  45.  *----------------------------------------------------------------------*/
  46. #include "iffp/packer.h"
  47.  
  48. static BYTE *PutDump(BYTE *, int);
  49. static BYTE *PutRun(BYTE *,int,int);
  50.  
  51. #define DUMP    0
  52. #define RUN    1
  53.  
  54. #define MinRun 3
  55. #define MaxRun 128
  56. #define MaxDat 128
  57.  
  58. /* When used on global definitions, static means private.
  59.  * This keeps these names, which are only referenced in this
  60.  * module, from conficting with same-named objects in your program.
  61.  */
  62. static LONG putSize;
  63. static char buf[256];    /* [TBD] should be 128?  on stack?*/
  64.  
  65. #define GetByte()       (*source++)
  66. #define PutByte(c)      { *dest++ = (c);   ++putSize; }
  67.  
  68.  
  69. static BYTE *PutDump(BYTE *dest, int nn)
  70.     {
  71.     int i;
  72.  
  73.     PutByte(nn-1);
  74.     for(i = 0;  i < nn;  i++)   PutByte(buf[i]);
  75.     return(dest);
  76.     }
  77.  
  78. static BYTE *PutRun(BYTE *dest, int nn, int cc)
  79.     {
  80.     PutByte(-(nn-1));
  81.     PutByte(cc);
  82.     return(dest);
  83.     }
  84.  
  85. #define OutDump(nn)   dest = PutDump(dest, nn)
  86. #define OutRun(nn,cc) dest = PutRun(dest, nn, cc)
  87.  
  88. /*----------- packrow --------------------------------------------------*/
  89. /* Given POINTERS TO POINTERS, packs one row, updating the source and
  90.  * destination pointers.  RETURNs count of packed bytes.
  91.  */
  92. LONG PackRow(BYTE **pSource, BYTE **pDest, LONG rowSize)
  93.     {
  94.     BYTE *source, *dest;
  95.     char c,lastc = '\0';
  96.     BOOL mode = DUMP;
  97.     short nbuf = 0;        /* number of chars in buffer */
  98.     short rstart = 0;        /* buffer index current run starts */
  99.  
  100.     source = *pSource;
  101.     dest = *pDest;
  102.     putSize = 0;
  103.     buf[0] = lastc = c = GetByte();  /* so have valid lastc */
  104.     nbuf = 1;    rowSize--;    /* since one byte eaten.*/
  105.  
  106.  
  107.     for (;  rowSize;  --rowSize) {
  108.     buf[nbuf++] = c = GetByte();
  109.     switch (mode) {
  110.         case DUMP:
  111.             /* If the buffer is full, write the length byte,
  112.                then the data */
  113.             if (nbuf>MaxDat) {
  114.                 OutDump(nbuf-1);
  115.                 buf[0] = c;
  116.                 nbuf = 1;   rstart = 0;
  117.                 break;
  118.                 }
  119.  
  120.             if (c == lastc) {
  121.                 if (nbuf-rstart >= MinRun) {
  122.                 if (rstart > 0) OutDump(rstart);
  123.                 mode = RUN;
  124.                 }
  125.                 else if (rstart == 0)
  126.                 mode = RUN;    /* no dump in progress,
  127.                 so can't lose by making these 2 a run.*/
  128.                 }
  129.             else  rstart = nbuf-1;        /* first of run */
  130.             break;
  131.  
  132.         case RUN: if ( (c != lastc)|| ( nbuf-rstart > MaxRun)) {
  133.             /* output run */
  134.             OutRun(nbuf-1-rstart,lastc);
  135.             buf[0] = c;
  136.             nbuf = 1; rstart = 0;
  137.             mode = DUMP;
  138.             }
  139.             break;
  140.         }
  141.  
  142.     lastc = c;
  143.     }
  144.  
  145.     switch (mode) {
  146.     case DUMP: OutDump(nbuf); break;
  147.     case RUN: OutRun(nbuf-rstart,lastc); break;
  148.     }
  149.     *pSource = source;
  150.     *pDest = dest;
  151.     return(putSize);
  152.     }
  153.  
  154. @
  155.  
  156.  
  157. 1.1
  158. log
  159. @Initial revision
  160. @
  161. text
  162. @d1 3
  163. @
  164.