/* * perl.c -- The perl interfacing routines. * * Copyright 2001, 2006 EPIC Software Labs. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notices, the above paragraph (the one permitting redistribution), * this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. The names of the author(s) may not be used to endorse or promote * products derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include #include #include #define __no_timeval_stuff__ #include "irc.h" #include "extlang.h" #include "ircaux.h" #include "array.h" #include "alias.h" #include "commands.h" #include "functions.h" #include "output.h" #include "ifcmd.h" #include "extlang.h" int isperlrunning=0, perlcalldepth=0; PerlInterpreter *my_perl; EXTERN_C void xs_init _((pTHX)); EXTERN_C void boot_DynaLoader _((pTHX_ CV* cv)); #define SV2STR(x,y) (y)=(void*)malloc_strdup((char*)SvPV_nolen(x)) #ifndef SvPV_nolen STRLEN trash; #define SvPV_nolen(x) SvPV((x),trash) #endif static XS (XS_cmd) { int foo; dXSARGS; for (foo=0; foosize; foo++) { XPUSHs(sv_2mortal(newSVpv(array->item[foo], 0))); } } PUTBACK ; if (out && *out) { long size; upper(out); size=(array=get_array(out))?array->size:0; if (0>item) item=size-~item; if (item>size) item=-1; } else { item=-1; } if (0<=item) { I32 ax; count = perl_call_pv(sub, G_EVAL|G_ARRAY); SPAGAIN ; SP -= count ; ax = (SP - PL_stack_base) + 1 ; for (foo=0; foo