/* * Copyright © 2001 Novell, Inc. All Rights Reserved. * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. * */ /* * FILENAME : interface.c * DESCRIPTION : Calling Perl APIs. * Author : SGP * Date Created : January 2001. * Date Modified: July 2nd 2001. */ #include "interface.h" #include "nwtinfo.h" static void xs_init(pTHX); EXTERN_C int RunPerl(int argc, char **argv, char **env); EXTERN_C void Perl_nw5_init(int *argcp, char ***argvp); EXTERN_C void boot_DynaLoader (pTHX_ CV* cv); EXTERN_C BOOL Remove_Thread_Ctx(void); ClsPerlHost::ClsPerlHost() { } ClsPerlHost::~ClsPerlHost() { } ClsPerlHost::VersionNumber() { return 0; } bool ClsPerlHost::RegisterWithThreadTable() { return(fnRegisterWithThreadTable()); } bool ClsPerlHost::UnregisterWithThreadTable() { return(fnUnregisterWithThreadTable()); } int ClsPerlHost::PerlCreate(PerlInterpreter *my_perl) { /* if (!(my_perl = perl_alloc())) // Allocate memory for Perl. return (1);*/ perl_construct(my_perl); return 1; } int ClsPerlHost::PerlParse(PerlInterpreter *my_perl, int argc, char** argv, char** env) { return(perl_parse(my_perl, xs_init, argc, argv, env)); // Parse the command line. } int ClsPerlHost::PerlRun(PerlInterpreter *my_perl) { return(perl_run(my_perl)); // Run Perl. } void ClsPerlHost::PerlDestroy(PerlInterpreter *my_perl) { perl_destruct(my_perl); // Destructor for Perl. } void ClsPerlHost::PerlFree(PerlInterpreter *my_perl) { perl_free(my_perl); // Free the memory allocated for Perl. // Remove the thread context set during Perl_set_context // This is added here since for web script there is no other place this gets executed // and it cannot be included into cgi2perl.xs unless this symbol is exported. Remove_Thread_Ctx(); } /*============================================================================================ Function : xs_init Description : Parameters : pTHX (IN) - Returns : Nothing. ==============================================================================================*/ static void xs_init(pTHX) { char *file = __FILE__; dXSUB_SYS; newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file); } EXTERN_C int RunPerl(int argc, char **argv, char **env) { int exitstatus = 0; ClsPerlHost nlm; PerlInterpreter *my_perl = NULL; // defined in Perl.h PerlInterpreter *new_perl = NULL; // defined in Perl.h #ifdef PERL_GLOBAL_STRUCT #define PERLVAR(var,type) #define PERLVARA(var,type) #define PERLVARI(var,type,init) PL_Vars.var = init; #define PERLVARIC(var,type,init) PL_Vars.var = init; #include "perlvars.h" #undef PERLVAR #undef PERLVARA #undef PERLVARI #undef PERLVARIC #endif PERL_SYS_INIT(&argc, &argv); if (!(my_perl = perl_alloc())) // Allocate memory for Perl. return (1); if(nlm.PerlCreate(my_perl)) { PL_perl_destruct_level = 0; exitstatus = nlm.PerlParse(my_perl, argc, argv, env); if(exitstatus == 0) { #if defined(TOP_CLONE) && defined(USE_ITHREADS) // XXXXXX testing new_perl = perl_clone(my_perl, 1); exitstatus = perl_run(new_perl); // Run Perl. PERL_SET_THX(my_perl); #else exitstatus = nlm.PerlRun(my_perl); #endif } nlm.PerlDestroy(my_perl); } if(my_perl) nlm.PerlFree(my_perl); #ifdef USE_ITHREADS if (new_perl) { PERL_SET_THX(new_perl); nlm.PerlDestroy(new_perl); nlm.PerlFree(my_perl); } #endif PERL_SYS_TERM(); return exitstatus; } // FUNCTION: AllocStdPerl // // DESCRIPTION: // Allocates a standard perl handler that other perl handlers // may delegate to. You should call FreeStdPerl to free this // instance when you are done with it. // IPerlHost* AllocStdPerl() { return (IPerlHost*) new ClsPerlHost(); } // FUNCTION: FreeStdPerl // // DESCRIPTION: // Frees an instance of a standard perl handler allocated by // AllocStdPerl. // void FreeStdPerl(IPerlHost* pPerlHost) { if (pPerlHost) delete (ClsPerlHost*) pPerlHost; }