mirror of
https://git.hardenedbsd.org/hardenedbsd/HardenedBSD.git
synced 2024-11-19 01:11:05 +01:00
78 lines
2.0 KiB
C
78 lines
2.0 KiB
C
/* $RCSfile: usersub.c,v $$Revision: 1.1 $$Date: 1995/03/24 04:33:54 $
|
|
*
|
|
* $Log: usersub.c,v $
|
|
* Revision 1.1 1995/03/24 04:33:54 jkh
|
|
* Bring back perl/usub as usub/, this time containing an updated curseperl
|
|
* which is also installed by default (the reason for which should also be
|
|
* plain shortly).
|
|
*
|
|
* Revision 4.0.1.1 91/11/05 19:07:24 lwall
|
|
* patch11: there are now subroutines for calling back from C into Perl
|
|
*
|
|
* Revision 4.0 91/03/20 01:56:34 lwall
|
|
* 4.0 baseline.
|
|
*
|
|
* Revision 3.0.1.1 90/08/09 04:06:10 lwall
|
|
* patch19: Initial revision
|
|
*
|
|
*/
|
|
|
|
#include "EXTERN.h"
|
|
#include "perl.h"
|
|
|
|
int
|
|
userinit()
|
|
{
|
|
init_curses();
|
|
}
|
|
|
|
/* Be sure to refetch the stack pointer after calling these routines. */
|
|
|
|
int
|
|
callback(subname, sp, gimme, hasargs, numargs)
|
|
char *subname;
|
|
int sp; /* stack pointer after args are pushed */
|
|
int gimme; /* called in array or scalar context */
|
|
int hasargs; /* whether to create a @_ array for routine */
|
|
int numargs; /* how many args are pushed on the stack */
|
|
{
|
|
static ARG myarg[3]; /* fake syntax tree node */
|
|
int arglast[3];
|
|
|
|
arglast[2] = sp;
|
|
sp -= numargs;
|
|
arglast[1] = sp--;
|
|
arglast[0] = sp;
|
|
|
|
if (!myarg[0].arg_ptr.arg_str)
|
|
myarg[0].arg_ptr.arg_str = str_make("",0);
|
|
|
|
myarg[1].arg_type = A_WORD;
|
|
myarg[1].arg_ptr.arg_stab = stabent(subname, FALSE);
|
|
|
|
myarg[2].arg_type = hasargs ? A_EXPR : A_NULL;
|
|
|
|
return do_subr(myarg, gimme, arglast);
|
|
}
|
|
|
|
int
|
|
callv(subname, sp, gimme, argv)
|
|
char *subname;
|
|
register int sp; /* current stack pointer */
|
|
int gimme; /* called in array or scalar context */
|
|
register char **argv; /* null terminated arg list, NULL for no arglist */
|
|
{
|
|
register int items = 0;
|
|
int hasargs = (argv != 0);
|
|
|
|
astore(stack, ++sp, Nullstr); /* reserve spot for 1st return arg */
|
|
if (hasargs) {
|
|
while (*argv) {
|
|
astore(stack, ++sp, str_2mortal(str_make(*argv,0)));
|
|
items++;
|
|
argv++;
|
|
}
|
|
}
|
|
return callback(subname, sp, gimme, hasargs, items);
|
|
}
|