home *** CD-ROM | disk | FTP | other *** search
/ Gold Fish 2 / goldfish_vol2_cd1.bin / files / comm / misc / elcheapofax / rcs / unpacker.c,v < prev   
Text File  |  1993-12-21  |  2KB  |  112 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 unpacker
  22. @
  23.  
  24.  
  25. 1.2
  26. log
  27. @First real RCS checkin
  28. @
  29. text
  30. @/* $Id$
  31.  * $Log$
  32.  */
  33.  
  34. #include "iffp/ilbm.h"
  35. #include "iffp/packer.h"
  36.  
  37. /*----------------------------------------------------------------------*
  38.  * unpacker.c Convert data from "cmpByteRun1" run compression. 11/15/85
  39.  *
  40.  * Based on code by Jerry Morrison and Steve Shaw, Electronic Arts.
  41.  * This software is in the public domain.
  42.  *
  43.  *    control bytes:
  44.  *     [0..127]   : followed by n+1 bytes of data.
  45.  *     [-1..-127] : followed by byte to be repeated (-n)+1 times.
  46.  *     -128        : NOOP.
  47.  *
  48.  * This version for the Commodore-Amiga computer.
  49.  *----------------------------------------------------------------------*/
  50.  
  51. /*----------- UnPackRow ------------------------------------------------*/
  52.  
  53. #define UGetByte()      (*source++)
  54. #define UPutByte(c)     (*dest++ = (c))
  55.  
  56. /* Given POINTERS to POINTER variables, unpacks one row, updating the source
  57.  * and destination pointers until it produces dstBytes bytes.
  58.  */
  59.  
  60. BOOL UnPackRow(BYTE **pSource, BYTE **pDest, WORD srcBytes0, WORD dstBytes0)
  61.     {
  62.     register BYTE *source = *pSource;
  63.     register BYTE *dest   = *pDest;
  64.     register WORD n;
  65.     register WORD srcBytes = srcBytes0;
  66.     register WORD dstBytes = dstBytes0;
  67.     BOOL error = TRUE;    /* assume error until we make it through the loop */
  68.     WORD minus128 = -128;  /* get the compiler to generate a CMP.W */
  69.     BYTE c;
  70.  
  71.     D(bug("unpackrow: srcBytes0=%ld dstBytes0=%ld\n",srcBytes0, dstBytes0));
  72.  
  73.     while( dstBytes > 0 )  {
  74.     if ( (srcBytes -= 1) < 0 )  goto ErrorExit;
  75.     n = UGetByte();
  76.  
  77.     if (n >= 0) {
  78.         n += 1;
  79.         if ( (srcBytes -= n) < 0 )  goto ErrorExit;
  80.         if ( (dstBytes -= n) < 0 )  goto ErrorExit;
  81.         do {  UPutByte(UGetByte());  } while (--n > 0);
  82.         }
  83.  
  84.     else if (n != minus128) {
  85.         n = -n + 1;
  86.         if ( (srcBytes -= 1) < 0 )  goto ErrorExit;
  87.         if ( (dstBytes -= n) < 0 )  goto ErrorExit;
  88.         c = UGetByte();
  89.         do {  UPutByte(c);  } while (--n > 0);
  90.         }
  91.     }
  92.     error = FALSE;    /* success! */
  93.  
  94.   ErrorExit:
  95.     *pSource = source;    *pDest = dest;
  96.     D(bug("unpackrow exit: srcBytes=%ld dstBytes=%ld n=%ld\n",srcBytes, dstBytes, n));
  97.     return(error);
  98.     }
  99.  
  100.  
  101. /* end */
  102. @
  103.  
  104.  
  105. 1.1
  106. log
  107. @Initial revision
  108. @
  109. text
  110. @d1 3
  111. @
  112.