Advertisement
tari

Untitled

Feb 9th, 2012
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 0.91 KB | None | 0 0
  1. /*
  2.  * Decompress a LZF-compressed block of sz bytes when decompressed, reading
  3.  * data from src and writing it to dst.
  4.  */
  5. void lzf_decompress(uint8_t restrict *dst, const uint8_t restrict *src, size_t sz) {
  6.     int l;
  7.     const uint8_t restrict *back;
  8.  
  9.     while (sz > 0) {
  10.         uint8_t head = *src++;
  11.         // Get size and source for literal data
  12.         if (head >> 5 == 0) {       // Literal
  13.             l = 1 + (head & 0x1F);
  14.             back = src;
  15.         } else {
  16.             uint8_t a, b;
  17.             back = src - 1;
  18.  
  19.             if (head >> 5 == 7)     // Long backref
  20.                 l = *src++ + 9;
  21.             else                    // Short backref
  22.                 l = (head >> 5) + 3;
  23.  
  24.             a = head & 0x1f;
  25.             b = *src++;
  26.             back -= (a << 8) | b;
  27.         }
  28.  
  29.         sz -= l;
  30.         do {
  31.             *dst++ = *back++;
  32.         } while (--l >= 0);
  33.     }
  34. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement