#include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "cruncher.h" MODULE = Archive::ByteBoozer PACKAGE = Archive::ByteBoozer PROTOTYPES: ENABLE # my $source = bb_source($data, $size); File* bb_source(data, size) unsigned char *data size_t size CODE: File *source; Newxz(source, 1, File); if (source == NULL) XSRETURN_UNDEF; source->size = size; source->data = (byte *)data; RETVAL = source; OUTPUT: RETVAL # my $target = bb_crunch($source, $start_address); File* bb_crunch(source, start_address) File *source unsigned int start_address CODE: File *target; Newxz(target, 1, File); decruncherType theDecrType = noDecr; if (start_address > 0) theDecrType = normalDecr; _bool isRelocated = _false; if (target == NULL) XSRETURN_UNDEF; if (!crunch(source, target, start_address, theDecrType, isRelocated)) XSRETURN_UNDEF; RETVAL = target; OUTPUT: RETVAL # my $data = bb_data($file); SV* bb_data(file) File *file PPCODE: # Push string (PV) with data on the stack and mortalize it: SV *fileData = sv_2mortal(newSVpv(file->data, file->size)); XPUSHs(fileData); # my $size = bb_size($file); unsigned int bb_size(file) File *file PPCODE: # Push unsigned integer (UV) with size on the stack and mortalize it: SV *fileSize = sv_2mortal(newSVuv(file->size)); XPUSHs(fileSize); # bb_free($source, $target); SV* bb_free(source, target) File *source File *target CODE: Safefree(source); Safefree(target); XSRETURN_UNDEF;