File-Raw-Archive

 view release on metacpan or  search on metacpan

Archive.xs  view on Meta::CPAN

        cp = SvPV(content_sv, clen);
        if (e.size == 0 && clen > 0) e.size = clen;
    }

    if (h->plugin->write_add(aTHX_ h->plugin, h->cursor, &e, cp, clen) < 0)
        croak("File::Raw::Archive::Writer::add: write failed (entry exceeds format limits?)");

    XSRETURN_YES;
}

void
close(self_sv)
    SV *self_sv
PREINIT:
    AV *self;
    SV **closed_ref, **handle_ref;
CODE:
    if (!SvROK(self_sv)) return;
    if (SvTYPE(SvRV(self_sv)) != SVt_PVAV) {
        maybe_free_handle(aTHX_ self_sv);
        return;
    }
    self = (AV *)SvRV(self_sv);
    closed_ref = av_fetch(self, W_CLOSED, 0);
    if (closed_ref && *closed_ref && SvTRUE(*closed_ref)) return;
    av_store(self, W_CLOSED, newSViv(1));
    handle_ref = av_fetch(self, W_HANDLE, 0);
    if (handle_ref && *handle_ref) maybe_free_handle(aTHX_ *handle_ref);
    av_store(self, W_HANDLE, &PL_sv_undef);

void
DESTROY(self_sv)
    SV *self_sv
PREINIT:
    AV *self;
    SV **closed_ref, **handle_ref;
CODE:
    if (!SvROK(self_sv)) return;
    if (SvTYPE(SvRV(self_sv)) != SVt_PVAV) {
        maybe_free_handle(aTHX_ self_sv);
        return;
    }
    self = (AV *)SvRV(self_sv);
    closed_ref = av_fetch(self, W_CLOSED, 0);
    if (closed_ref && *closed_ref && SvTRUE(*closed_ref)) return;
    handle_ref = av_fetch(self, W_HANDLE, 0);
    if (handle_ref && *handle_ref) maybe_free_handle(aTHX_ *handle_ref);

# ====================================================================
MODULE = File::Raw::Archive   PACKAGE = File::Raw::Archive::Entry
# ====================================================================
#
# Entry is a blessed hashref with:
#   reader  => Reader hashref (back-link, carries the C handle)
#   meta    => entry-metadata hashref (name, size, mode, ...)
#   slurped => undef OR the cached payload SV
#
# Accessors fetch from `meta`. slurp pulls payload via the reader's
# handle and caches it so a second slurp returns the same bytes.

# Macro-style helper: read a key from $self->{meta} and return it,
# or undef. Used by every accessor.

SV *
name(self_sv)
    SV *self_sv
ALIAS:
    File::Raw::Archive::Entry::name        = M_NAME
    File::Raw::Archive::Entry::size        = M_SIZE
    File::Raw::Archive::Entry::mode        = M_MODE
    File::Raw::Archive::Entry::mtime       = M_MTIME
    File::Raw::Archive::Entry::mtime_ns    = M_MTIME_NS
    File::Raw::Archive::Entry::uid         = M_UID
    File::Raw::Archive::Entry::gid         = M_GID
    File::Raw::Archive::Entry::type        = M_TYPE
    File::Raw::Archive::Entry::link_target = M_LINK_TARGET
    File::Raw::Archive::Entry::xattrs      = M_XATTRS
    File::Raw::Archive::Entry::is_sparse   = M_IS_SPARSE
PREINIT:
    AV *self, *meta;
    SV **meta_ref, **val;
CODE:
    if (!SvROK(self_sv) || SvTYPE(SvRV(self_sv)) != SVt_PVAV)
        XSRETURN_UNDEF;
    self = (AV *)SvRV(self_sv);
    meta_ref = av_fetch(self, E_META, 0);
    if (!meta_ref || !*meta_ref || !SvROK(*meta_ref)
            || SvTYPE(SvRV(*meta_ref)) != SVt_PVAV)
        XSRETURN_UNDEF;
    meta = (AV *)SvRV(*meta_ref);
    val = av_fetch(meta, ix, 0);
    if (!val || !*val || !SvOK(*val)) {
        /* Numeric defaults for the integer-shaped accessors. */
        switch (ix) {
        case M_SIZE: case M_MODE: case M_MTIME: case M_MTIME_NS:
        case M_UID:  case M_GID:  case M_TYPE:  case M_IS_SPARSE:
            RETVAL = newSViv(0);
            break;
        default:
            XSRETURN_UNDEF;
        }
    } else {
        RETVAL = SvREFCNT_inc(*val);
    }
OUTPUT:
    RETVAL

IV
is_file(self_sv)
    SV *self_sv
ALIAS:
    File::Raw::Archive::Entry::is_file    = 1
    File::Raw::Archive::Entry::is_dir     = 2
    File::Raw::Archive::Entry::is_symlink = 3
    File::Raw::Archive::Entry::is_link    = 4
PREINIT:
    AV *self, *meta;
    SV **meta_ref, **type_ref;
    IV t;
CODE:
    if (!SvROK(self_sv) || SvTYPE(SvRV(self_sv)) != SVt_PVAV)



( run in 0.890 second using v1.01-cache-2.11-cpan-5c0b1e786e0 )