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 )