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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.