#include "inc/priv.h"#include "inc/cvalues.h"#include "inc/types.h"#include "brieflz.h" static sl_v sl_sizesym, sl_tosym; BUILTIN("lz-pack", lz_pack){ argcount_least(1); argcount_most(2); u64int tmp; usize insz, esz; u8int *in = to_sized_ptr(args[0], &insz, &esz, &tmp); int level = nargs > 1 ? tofixnum(args[1]) : 0; if(level < 0) level = 0; else if(level > 10) level = 10; usize worksz = level > 0 ? blz_workmem_size_level(insz, level) : blz_workmem_size(insz); u8int *work = MEM_ALLOC(worksz); if(sl_unlikely(work == nil)) bthrow(error(sl_errmem, "no memory for a LZ buffer")); sl_v v = cvalue(get_arr_type(sl_u8sym), blz_max_packed_size(insz)); u8int *out = cvalue_data(v); 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) bthrow(error(sl_errarg, "blz error")); cvalue_len(v) = n; return v;} BUILTIN("lz-unpack", lz_unpack){ argcount(3); u64int tmp; usize insz, outsz, esz; u8int *out, *in = to_sized_ptr(args[0], &insz, &esz, &tmp); sl_v v; if(args[1] == sl_sizesym){ outsz = tosize(args[2]); v = cvalue(cvalue_class(args[0]), outsz); out = cvalue_data(v); }else if(args[1] == sl_tosym){ v = args[2]; out = to_sized_ptr(v, &outsz, &esz, &tmp); }else{ bthrow(error(sl_errarg, "either :size or :to must be specified")); } unsigned long n = blz_depack_safe(in, insz, out, outsz); if(n == BLZ_ERROR) bthrow(error(sl_errarg, "blz error")); cvalue_len(v) = n; return v;} voidcompress_init(void){ sl_sizesym = mk_csym(":size"); sl_tosym = mk_csym(":to");}
#include "inc/priv.h"
#include "inc/cvalues.h"
#include "inc/types.h"
#include "brieflz.h"
static sl_v sl_sizesym, sl_tosym;
BUILTIN("lz-pack", lz_pack)
{
argcount_least(1);
argcount_most(2);
u64int tmp;
usize insz, esz;
u8int *in = to_sized_ptr(args[0], &insz, &esz, &tmp);
int level = nargs > 1 ? tofixnum(args[1]) : 0;
if(level < 0)
level = 0;
else if(level > 10)
level = 10;
usize worksz = level > 0
? blz_workmem_size_level(insz, level)
: blz_workmem_size(insz);
u8int *work = MEM_ALLOC(worksz);
if(sl_unlikely(work == nil))
bthrow(error(sl_errmem, "no memory for a LZ buffer"));
sl_v v = cvalue(get_arr_type(sl_u8sym), blz_max_packed_size(insz));
u8int *out = cvalue_data(v);
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)
bthrow(error(sl_errarg, "blz error"));
cvalue_len(v) = n;
return v;
}
BUILTIN("lz-unpack", lz_unpack)
{
argcount(3);
u64int tmp;
usize insz, outsz, esz;
u8int *out, *in = to_sized_ptr(args[0], &insz, &esz, &tmp);
sl_v v;
if(args[1] == sl_sizesym){
outsz = tosize(args[2]);
v = cvalue(cvalue_class(args[0]), outsz);
out = cvalue_data(v);
}else if(args[1] == sl_tosym){
v = args[2];
out = to_sized_ptr(v, &outsz, &esz, &tmp);
}else{
bthrow(error(sl_errarg, "either :size or :to must be specified"));
}
unsigned long n = blz_depack_safe(in, insz, out, outsz);
if(n == BLZ_ERROR)
bthrow(error(sl_errarg, "blz error"));
cvalue_len(v) = n;
return v;
}
void
compress_init(void)
{
sl_sizesym = mk_csym(":size");
sl_tosym = mk_csym(":to");
}