Sigrid Solveig Haflínudóttiradd argcount_{least,most} for better errors messagesf739ebf2 months agoHistory
72 lines · 1.6 KB · C
RawDownload
#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");}

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t