I'm trying to write a C program that uses an embedded perl interpeter to handle multiple AI scripts written in perl. The AI scripts need to have distinct namespaces. Since most versions of Perl are not compiled -DMULTIPLICITY and multiple interpreters consume a lot of resources, I'm trying to do this with one perl interpreter rather than simply loading handling each script with its own perl interpreter and dodging the namespace issue that way.
The problem I have is that I can't figure out how to expand the embedded perl examples from perlembed to handle multiple script files. When I try to perl_parse TWO files I always get an error trying to call a subroutine in the second file--claiming "Undefined subroutine &package::subroutine called" Here's the C program that handles ONE script file and the perl script it calls. How do I get it to handle additional script files, that, for argument's sake, look exactly like the one I've got except for a different package name? I know I shouldn't call perl_parse more than once (although it "works", producing the error mentioned above). I've tried putting both script names in the my_argv array and upping argc to 3, which also compiles and runs but can't find subroutines in the second file parsed. thanks David #include <EXTERN.h> #include <perl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> char playerinfo[256]; char visioninfo[256]; char ai_command[256]; static PerlInterpreter *my_perl; static void CallAI(char * subname, char * a, char * b) { char * c; dSP; /* initialize stack pointer */ ENTER; /* everything created after here */ SAVETMPS; /* ...is a temporary variable. */ PUSHMARK(SP); /* remember the stack pointer */ XPUSHs(sv_2mortal(newSVpv(a,0))); /* push the base onto the stack */ XPUSHs(sv_2mortal(newSVpv(b,0))); /* push the exponent onto stack */ PUTBACK; /* make local stack pointer global */ call_pv(subname, G_SCALAR); /* call the function */ SPAGAIN; /* refresh stack pointer */ c = POPp; /* pop the return value from the stack, as a pointer */ strcpy (ai_command, c); /* transfer this string to a globally scoped variable... */ PUTBACK; FREETMPS; /* free that return value */ LEAVE; /* ...and the XPUSHed "mortal" args.*/ } int main (int argc, char **argv, char **env) { char *my_argv[] = { "", "BotAI.pl" }; char ai_1_name[256]; int argc = 2; strcpy (ai_1_name, "bot1::get_ai_action"); my_perl = perl_alloc(); perl_construct( my_perl ); perl_parse(my_perl, NULL, argc, my_argv, (char **)NULL); perl_run(my_perl); sprintf (playerinfo, "%s", "This is playerinfo"); sprintf (visioninfo, "%s", "Tree:Frog:Lemming"); CallAI(ai_1_name, playerinfo, visioninfo); /* call function that calls perl subroutine */ //at this point ai_command has been set by the script perl_destruct(my_perl); perl_free(my_perl); } and here is the perl script "BotAI.pl" it calls: package bot1; sub get_ai_action { my $playerinfo = shift; my $visioninfo = shift; my $ai_command = ""; @seethings = split (/:/, $visioninfo); $num_things = @seethings; $ai_command = "I see $num_things things: "; for ($i=0;$i<$num_things;$i++) { $ai_command = $ai_command."$seethings[$i] "; } return $ai_command; }