HTML-EmbeddedPerl
view release on metacpan or search on metacpan
EmbeddedPerl.xs view on Meta::CPAN
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"
#define __EMBEDDED_MODULE__
#include "twepl_xcore.c"
#undef __EMBEDDED_MODULE__
MODULE = HTML::EmbeddedPerl PACKAGE = HTML::EmbeddedPerl
BOOT:
/* Register Section */
twepl_register(aTHX_ file);
SV* ep(...)
INIT:
int idx = twepl_check_caller(aTHX_ ST(0), items, 1, "ep", "$code");
if(idx == -1){
ST(0) = Nullsv; XSRETURN(1);
}
char *epc = SvPV_nolen(ST(idx));
CODE:
enum TWEPL_STATE ret;
char *cnv = NULL;
SV *buf;
SV *opt;
/* Buffer */
buf = perl_get_sv(EPL_PM_NAME "::STOBUF", FALSE);
/* Options */
opt = perl_get_sv(EPL_PM_NAME "::EPLOPT", FALSE);
/* PerlIO_stdout -> PerlIO::Scalar */
if(! twepl_do_open(aTHX_ EPL_PM_NAME "::STOTMP", "STDOUT", EPL_FOM, EPL_PM_NAME "::STOBUF", EPL_FOF)){
Perl_croak(aTHX_ "ep: failed override stdhandle.");
}
/* Convert */
ret = twepl_code(epc, &cnv, SvIV(opt));
if(ret != TWEPL_OKEY_NOERR){
free(cnv);
twepl_do_close(aTHX_ "STDOUT");
Perl_croak(aTHX_ "ep: %s", twepl_strerr(ret));
}
/* Run */
eval_pv((const char *)cnv, G_EVAL|G_KEEPERR|G_DISCARD);
/* Clean-Ups */
free(cnv);
if(SvTRUE(ERRSV)){
twepl_do_close(aTHX_ "STDOUT");
Perl_croak(aTHX_ "%s", SvPV_nolen(ERRSV));
}
/* Return Value */
RETVAL = newSVpv(SvPV_nolen(buf), 0);
/* PerlIO_stdout <- PerlIO::Scalar */
twepl_do_close(aTHX_ "STDOUT");
( run in 0.902 second using v1.01-cache-2.11-cpan-71847e10f99 )