File-Raw-Archive
view release on metacpan or search on metacpan
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 )