Re: freepascal lz4 library?
José Mejuto via fpc-pascal <[email protected]>
| Newsgroups | gmane.comp.compilers.free-pascal.general |
|---|---|
| Message-ID | <[email protected]> |
El 02/12/2024 a las 13:16, wkitty42--- via fpc-pascal escribió: > > i can do this in python3 but i would rather do it in Pascal because i > have an idea for a project that i think i want to write in Pascal... > Freepascal and possibly Lazarus are my weapons and the only thing i > cannot find is the lz4 ammo library i can use... once i figure this > out, the next goal is figuring out how to read and write the contained > JSON data... > > Hello, If you lz4 blocks does not use dictionary you can try this code to decompress each block: *** (TOTALLY UNTESTED CODE) *** Converted from https://github.com/jart/cosmopolitan/blob/467504308a103865c058f9a0ac858cc22e72240e/libc/nexgen32e/lz4cpy.c With this notes: /** * Decompresses LZ4 block. * * This is a 103 byte implementation of the LZ4 algorithm. Please note * LZ4 files are comprised of multiple frames, which may be decoded * together using the wrapper function lz4decode(). * * @see rldecode() for a 16-byte decompressor */ ***--------------------------------------------------*** function Lz4Cpy(dest: Pointer; const blockdata: Pointer; blocksize: SizeUInt): Pointer; var op, ip, ipe, match: PByte; token, length, fifteen, offset, matchlen: Byte; begin op := dest; ip := blockdata; ipe := ip + blocksize; fifteen := 15; // Equivalente a pushpop(15) en este caso. while True do begin token := ip^; Inc(ip); length := token shr 4; if length = fifteen then begin repeat Inc(length, ip^); Inc(ip); until ip^ <> 255; end; Move(ip^, op^, length); Inc(op, length); Inc(ip, length); if NativeUInt(ip) >= NativeUInt(ipe) then Break; offset := PWord(ip)^; Inc(ip, 2); matchlen := token and fifteen; if matchlen = fifteen then begin repeat Inc(matchlen, ip^); Inc(ip); until ip^ <> 255; end; match := op - offset; Inc(matchlen, 4); Move(match^, op^, matchlen); Inc(op, matchlen); end; Result := op; end; _______________________________________________ fpc-pascal maillist - [email protected] https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal