File-LibMagic
view release on metacpan or search on metacpan
LibMagic.xs view on Meta::CPAN
OUTPUT:
RETVAL
IV magic_version()
CODE:
#ifdef HAVE_MAGIC_VERSION
RETVAL = magic_version();
#else
RETVAL = 0;
#endif
OUTPUT:
RETVAL
#define MAGIC_SETFLAGS_OR_CROAK(magic, flags) \
if ( magic_setflags(magic, flags) == -1 ) { \
croak( "error setting flags to %d", flags ); \
} \
#define MAYBE_CROAK_ERROR(retval, magic, magic_func) \
if ( NULL == retval ) { \
const char *err = magic_error(magic); \
croak("error calling %s: %s", #magic_func, err != NULL ? err : "magic_error() returned NULL"); \
}
#define RETURN_INFO(self, magic_func, ...) \
magic = (magic_t)SvIV(*( hv_fetchs((HV *)SvRV(self), "magic", 0))); \
flags = (int)SvIV(*( hv_fetchs((HV *)SvRV(self), "flags", 0))); \
MAGIC_SETFLAGS_OR_CROAK(magic, flags) \
description = magic_func(magic, __VA_ARGS__); \
MAYBE_CROAK_ERROR(description, magic, magic_func) \
d = newSVpvn(description, strlen(description)); \
MAGIC_SETFLAGS_OR_CROAK(magic, flags|MAGIC_MIME_TYPE) \
magic_setflags(magic, flags|MAGIC_MIME_TYPE); \
mime = magic_func(magic, __VA_ARGS__); \
MAYBE_CROAK_ERROR(mime, magic, magic_func) \
m = newSVpvn(mime, strlen(mime)); \
MAGIC_SETFLAGS_OR_CROAK(magic, flags|MAGIC_MIME_ENCODING) \
encoding = magic_func(magic, __VA_ARGS__); \
MAYBE_CROAK_ERROR(encoding, magic, magic_func) \
e = newSVpvn(encoding, strlen(encoding)); \
EXTEND(SP, 3); \
mPUSHs(d); \
mPUSHs(m); \
mPUSHs(e);
void _info_from_string(self, buffer)
SV *self
SV *buffer
PREINIT:
magic_t magic;
int flags;
SV *content;
STRLEN len;
char *string;
const char *description;
const char *mime;
const char *encoding;
SV *d;
SV *m;
SV *e;
PPCODE:
if (SvROK(buffer)) {
content = SvRV(buffer);
}
else {
content = buffer;
}
if ( ! SvPOK(content) ) {
croak("info_from_string requires a scalar or reference to a scalar as its argument");
}
string = SvPV(content, len);
RETURN_INFO(self, magic_buffer, string, len);
void _info_from_filename(self, filename)
SV *self
SV *filename
PREINIT:
magic_t magic;
int flags;
char *file;
const char *description;
const char *mime;
const char *encoding;
SV *d;
SV *m;
SV *e;
PPCODE:
if ( ! SvPOK(filename) ) {
croak("info_from_filename requires a scalar as its argument");
}
file = SvPV_nolen(filename);
RETURN_INFO(self, magic_file, file);
void _info_from_handle(self, handle)
SV *self
SV *handle
PREINIT:
magic_t magic;
int flags;
PerlIO *io;
char buf[BUFSIZE];
Off_t pos;
SSize_t read;
const char *description;
const char *mime;
const char *encoding;
SV *d;
SV *m;
SV *e;
PPCODE:
if ( ! SvOK(handle) ) {
croak("info_from_handle requires a scalar filehandle as its argument");
}
io = IoIFP(sv_2io(handle));
if ( ! io ) {
croak("info_from_handle requires a scalar filehandle as its argument");
}
pos = PerlIO_tell(io);
if ( pos < 0 ) {
croak("info_from_handle could not call tell() on the filehandle provided: %s", strerror(errno));
}
read = PerlIO_read(io, buf, BUFSIZE);
if ( read < 0 ) {
croak("info_from_handle could not read data from the filehandle provided: %s", strerror(errno));
}
else if ( 0 == read ) {
croak("info_from_handle could not read data from the filehandle provided - is the file empty?");
}
PerlIO_seek(io, pos, SEEK_SET);
RETURN_INFO(self, magic_buffer, buf, read);
( run in 2.372 seconds using v1.01-cache-2.11-cpan-5511b514fd6 )