/* * 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 : perllib.c * DESCRIPTION : Library functions for parsing and running Perl. * This is based on the perllib.c file of Win32 port. * Author : SGP * Date : January 2001. * */ /* * "The Road goes ever on and on, down from the door where it began." */ #include "EXTERN.h" #include "perl.h" #ifdef PERL_OBJECT #define NO_XSLOCKS #endif //CHKSGP //Including this is giving premature end-of-file error during compilation //#include "XSUB.h" #ifdef PERL_IMPLICIT_SYS #include "nw5iop.h" #include #endif //PERL_IMPLICIT_SYS #ifdef PERL_IMPLICIT_SYS #include "nwperlhost.h" #define w32_internal_host (PL_sys_intern.internal_host) // (J) EXTERN_C void perl_get_host_info(struct IPerlMemInfo* perlMemInfo, struct IPerlMemInfo* perlMemSharedInfo, struct IPerlMemInfo* perlMemParseInfo, struct IPerlEnvInfo* perlEnvInfo, struct IPerlStdIOInfo* perlStdIOInfo, struct IPerlLIOInfo* perlLIOInfo, struct IPerlDirInfo* perlDirInfo, struct IPerlSockInfo* perlSockInfo, struct IPerlProcInfo* perlProcInfo) { if (perlMemInfo) { Copy(&perlMem, &perlMemInfo->perlMemList, perlMemInfo->nCount, void*); perlMemInfo->nCount = (sizeof(struct IPerlMem)/sizeof(void*)); } if (perlMemSharedInfo) { Copy(&perlMem, &perlMemSharedInfo->perlMemList, perlMemSharedInfo->nCount, void*); perlMemSharedInfo->nCount = (sizeof(struct IPerlMem)/sizeof(void*)); } if (perlMemParseInfo) { Copy(&perlMem, &perlMemParseInfo->perlMemList, perlMemParseInfo->nCount, void*); perlMemParseInfo->nCount = (sizeof(struct IPerlMem)/sizeof(void*)); } if (perlEnvInfo) { Copy(&perlEnv, &perlEnvInfo->perlEnvList, perlEnvInfo->nCount, void*); perlEnvInfo->nCount = (sizeof(struct IPerlEnv)/sizeof(void*)); } if (perlStdIOInfo) { Copy(&perlStdIO, &perlStdIOInfo->perlStdIOList, perlStdIOInfo->nCount, void*); perlStdIOInfo->nCount = (sizeof(struct IPerlStdIO)/sizeof(void*)); } if (perlLIOInfo) { Copy(&perlLIO, &perlLIOInfo->perlLIOList, perlLIOInfo->nCount, void*); perlLIOInfo->nCount = (sizeof(struct IPerlLIO)/sizeof(void*)); } if (perlDirInfo) { Copy(&perlDir, &perlDirInfo->perlDirList, perlDirInfo->nCount, void*); perlDirInfo->nCount = (sizeof(struct IPerlDir)/sizeof(void*)); } if (perlSockInfo) { Copy(&perlSock, &perlSockInfo->perlSockList, perlSockInfo->nCount, void*); perlSockInfo->nCount = (sizeof(struct IPerlSock)/sizeof(void*)); } if (perlProcInfo) { Copy(&perlProc, &perlProcInfo->perlProcList, perlProcInfo->nCount, void*); perlProcInfo->nCount = (sizeof(struct IPerlProc)/sizeof(void*)); } } EXTERN_C PerlInterpreter* perl_alloc_override(struct IPerlMem** ppMem, struct IPerlMem** ppMemShared, struct IPerlMem** ppMemParse, struct IPerlEnv** ppEnv, struct IPerlStdIO** ppStdIO, struct IPerlLIO** ppLIO, struct IPerlDir** ppDir, struct IPerlSock** ppSock, struct IPerlProc** ppProc) { PerlInterpreter *my_perl = NULL; CPerlHost* pHost = new CPerlHost(ppMem, ppMemShared, ppMemParse, ppEnv, ppStdIO, ppLIO, ppDir, ppSock, ppProc); if (pHost) { my_perl = perl_alloc_using(pHost->m_pHostperlMem, pHost->m_pHostperlMemShared, pHost->m_pHostperlMemParse, pHost->m_pHostperlEnv, pHost->m_pHostperlStdIO, pHost->m_pHostperlLIO, pHost->m_pHostperlDir, pHost->m_pHostperlSock, pHost->m_pHostperlProc); if (my_perl) { #ifdef PERL_OBJECT CPerlObj* pPerl = (CPerlObj*)my_perl; #endif w32_internal_host = pHost; } } return my_perl; } EXTERN_C PerlInterpreter* perl_alloc(void) { PerlInterpreter* my_perl = NULL; CPerlHost* pHost = new CPerlHost(); if (pHost) { my_perl = perl_alloc_using(pHost->m_pHostperlMem, pHost->m_pHostperlMemShared, pHost->m_pHostperlMemParse, pHost->m_pHostperlEnv, pHost->m_pHostperlStdIO, pHost->m_pHostperlLIO, pHost->m_pHostperlDir, pHost->m_pHostperlSock, pHost->m_pHostperlProc); if (my_perl) { #ifdef PERL_OBJECT CPerlObj* pPerl = (CPerlObj*)my_perl; #endif //The following Should be uncommented - CHKSGP w32_internal_host = pHost; } } return my_perl; } EXTERN_C void nw_delete_internal_host(void *h) { CPerlHost *host = (CPerlHost*)h; if(host && h) { delete host; host=NULL; h=NULL; } } #ifdef PERL_OBJECT EXTERN_C void perl_construct(PerlInterpreter* my_perl) { CPerlObj* pPerl = (CPerlObj*)my_perl; try { Perl_construct(); } catch(...) { win32_fprintf(stderr, "%s\n", "Error: Unable to construct data structures"); perl_free(my_perl); } } EXTERN_C void perl_destruct(PerlInterpreter* my_perl) { CPerlObj* pPerl = (CPerlObj*)my_perl; #ifdef DEBUGGING Perl_destruct(); #else try { Perl_destruct(); } catch(...) { } #endif } EXTERN_C void perl_free(PerlInterpreter* my_perl) { CPerlObj* pPerl = (CPerlObj*)my_perl; void *host = w32_internal_host; #ifdef DEBUGGING Perl_free(); #else try { Perl_free(); } catch(...) { } #endif win32_delete_internal_host(host); PERL_SET_THX(NULL); } EXTERN_C int perl_run(PerlInterpreter* my_perl) { CPerlObj* pPerl = (CPerlObj*)my_perl; int retVal; #ifdef DEBUGGING retVal = Perl_run(); #else try { retVal = Perl_run(); } catch(...) { win32_fprintf(stderr, "Error: Runtime exception\n"); retVal = -1; } #endif return retVal; } EXTERN_C int perl_parse(PerlInterpreter* my_perl, void (*xsinit)(CPerlObj*), int argc, char** argv, char** env) { int retVal; CPerlObj* pPerl = (CPerlObj*)my_perl; #ifdef DEBUGGING retVal = Perl_parse(xsinit, argc, argv, env); #else try { retVal = Perl_parse(xsinit, argc, argv, env); } catch(...) { win32_fprintf(stderr, "Error: Parse exception\n"); retVal = -1; } #endif *win32_errno() = 0; return retVal; } #undef PL_perl_destruct_level #define PL_perl_destruct_level int dummy #endif /* PERL_OBJECT */ #endif /* PERL_IMPLICIT_SYS */