ref: 2eed756404460f860f19234cec4c052350ef2a65
dir: /compress.c/
#include "flisp.h"
#include "cvalues.h"
#include "types.h"
#include "brieflz.h"
BUILTIN("lz-pack", lz_pack)
{
if(nargs < 1)
argcount(nargs, 1);
if(nargs > 2)
argcount(nargs, 2);
if(!isarray(args[0]))
type_error("array", args[0]);
uint8_t *in;
size_t insz;
to_sized_ptr(args[0], &in, &insz);
int level = nargs > 1 ? tofixnum(args[1]) : 0;
if(level < 0)
level = 0;
else if(level > 10)
level = 10;
value_t v = cvalue(cv_class(ptr(args[0])), blz_max_packed_size(insz));
uint8_t *out = cvalue_data(v);
size_t worksz = level > 0
? blz_workmem_size_level(insz, level)
: blz_workmem_size(insz);
uint8_t *work = MEM_ALLOC(worksz);
unsigned long n = level > 0
? blz_pack_level(in, out, insz, work, level)
: blz_pack(in, out, insz, work);
MEM_FREE(work);
if(n == BLZ_ERROR)
lerrorf(FL(ArgError), "blz error");
cvalue_len(v) = n;
return v;
}
BUILTIN("lz-unpack", lz_unpack)
{
argcount(nargs, 2);
uint8_t *in;
size_t insz;
to_sized_ptr(args[0], &in, &insz);
if(!isarray(args[0]))
type_error("array", args[0]);
size_t outsz = tosize(args[1]);
value_t v = cvalue(cv_class(ptr(args[0])), outsz);
uint8_t *out = cvalue_data(v);
unsigned long n = blz_depack_safe(in, insz, out, outsz);
if(n == BLZ_ERROR)
lerrorf(FL(ArgError), "blz error");
cvalue_len(v) = n;
return v;
}