/* $Id: deHTMLxs.xs,v 1.6 2006/02/16 19:16:00 rsoderberg Exp $ */ #include "EXTERN.h" #include "perl.h" #include "XSUB.h" /* try to be compatible with older perls */ /* SvPV_nolen() macro first defined in 5.005_55 */ /* this is slow, not threadsafe, but works */ #include "patchlevel.h" #if (PATCHLEVEL == 4) || ((PATCHLEVEL == 5) && (SUBVERSION < 55)) static STRLEN nolen_na; # define SvPV_nolen(sv) SvPV ((sv), nolen_na) #endif #include "deHTMLxs.h" typedef struct mystate { int is_xs; } *Razor2__Preproc__deHTMLxs; MODULE = Razor2::Preproc::deHTMLxs PACKAGE = Razor2::Preproc::deHTMLxs PROTOTYPES: ENABLE Razor2::Preproc::deHTMLxs new(class) SV * class CODE: { Newz(0, RETVAL, 1, struct mystate); RETVAL->is_xs = 1; /* placeholder, not used now */ } OUTPUT: RETVAL int is_xs(self) Razor2::Preproc::deHTMLxs self; CODE: RETVAL = 1; OUTPUT: RETVAL char * testxs(self, str) Razor2::Preproc::deHTMLxs self; char * str; CODE: RETVAL = str + 1; OUTPUT: RETVAL SV * isit(self, scalarref) Razor2::Preproc::deHTMLxs self; SV * scalarref; CODE: { /* 2002/11/21 Anne Bennett: use the right type def: */ STRLEN size; char * raw; SV * text; const char mynull = 0; if (SvROK(scalarref)) { text = SvRV(scalarref); /* normally perl has '\0' on end, but not guaranteed */ sv_catpv(text,&mynull); raw = SvPV(text,size); /* bool CM_PREPROC_is_html(const char *); */ if (CM_PREPROC_is_html(raw)) { RETVAL = newSVpv ("1", 0); } else { RETVAL = newSVpv ("", 0); } } else { RETVAL = newSVpv ("", 0); } } OUTPUT: RETVAL SV * doit(self, scalarref) Razor2::Preproc::deHTMLxs self; SV * scalarref CODE: { char * cleaned, * raw, * res; /* 2002/11/21 Anne Bennett: use the right type def: */ STRLEN size; SV * text; SV * newtext; SV * newref; if (SvROK(scalarref)) { text = SvRV(scalarref); raw = SvPV(text,size); *(raw + size - 1) = '\0'; if ( (cleaned = malloc(size+1)) && (res = CM_PREPROC_html_strip(raw, cleaned)) /* html_strip will memset cleaned to 0 */ ) { /* * hook it up so scalarref will dereference to new scalar */ newtext = newSVpv (res, 0); /* newtext is new scalar containing cleaned html. * we want scalarref to point to that instead of its old dude, text. */ /* sv_setsv (SV* dest, SV* src) */ sv_setsv(text, newtext); SvREFCNT_inc(scalarref); RETVAL = scalarref; free(cleaned); } else { if (cleaned) { free(cleaned); } RETVAL = newSVpv ("", 0); } } else { RETVAL = newSVpv ("", 0); } } OUTPUT: RETVAL