Archive-Peek-Libarchive
view release on metacpan or search on metacpan
Libarchive.xs view on Meta::CPAN
CODE:
struct archive *a;
struct archive_entry *entry;
int r;
const void *buffer;
size_t size;
off_t offset;
SV* filename;
SV* contents;
SV* callback;
if (!SvROK((SV*) callbackref)) {
Perl_croak(aTHX_ "YAJL: callbackref is not a reference");
} else {
DEBUG && printf(" callbackref is a reference\n");
}
callback = (SV*) SvRV((SV*) callbackref);
if (SvTYPE(callback) != SVt_PVCV) {
Perl_croak(aTHX_ "Callback is not a PVCV");
} else {
DEBUG && printf(" callback is a PVCV\n");
}
DEBUG && printf(" about to call callback\n");
a = _open_file(archivename);
for (;;) {
r = archive_read_next_header(a, &entry);
if (r == ARCHIVE_EOF)
break;
if (r != ARCHIVE_OK)
croak("%s", archive_error_string(a));
if (archive_entry_filetype(entry) == AE_IFREG) {
DEBUG && printf(" start\n");
contents = newSVpvs("");
filename = newSVpv(archive_entry_pathname(entry), 0);
for (;;) {
r = archive_read_data_block(a, &buffer, &size, &offset);
if (r == ARCHIVE_EOF) {
break;
}
if (r != ARCHIVE_OK) {
croak("%s", archive_error_string(a));
}
sv_catpvn(contents, buffer, size);
}
DEBUG && printf(" dSP\n");
dSP;
DEBUG && printf(" ENTER\n");
ENTER;
DEBUG && printf(" SAVETMPS\n");
SAVETMPS;
DEBUG && printf(" PUSHMARK\n");
PUSHMARK(SP);
DEBUG && printf(" mXPUSHs1\n");
mXPUSHs(filename);
DEBUG && printf(" mXPUSHs2\n");
mXPUSHs(contents);
DEBUG && printf(" PUTBACK\n");
PUTBACK;
DEBUG && printf(" call_sv\n");
call_sv(callback, G_DISCARD);
DEBUG && printf(" FREETMPS\n");
FREETMPS;
DEBUG && printf(" LEAVE\n");
LEAVE;
DEBUG && printf(" end\n");
}
}
_close_file(a);
( run in 0.893 second using v1.01-cache-2.11-cpan-5b529ec07f3 )