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  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to