Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Decompress a LZF-compressed block of sz bytes when decompressed, reading
- * data from src and writing it to dst.
- */
- void lzf_decompress(uint8_t restrict *dst, const uint8_t restrict *src, size_t sz) {
- int l;
- const uint8_t restrict *back;
- while (sz > 0) {
- uint8_t head = *src++;
- // Get size and source for literal data
- if (head >> 5 == 0) { // Literal
- l = 1 + (head & 0x1F);
- back = src;
- } else {
- uint8_t a, b;
- back = src - 1;
- if (head >> 5 == 7) // Long backref
- l = *src++ + 9;
- else // Short backref
- l = (head >> 5) + 3;
- a = head & 0x1f;
- b = *src++;
- back -= (a << 8) | b;
- }
- sz -= l;
- do {
- *dst++ = *back++;
- } while (--l >= 0);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement