mirror of
https://github.com/Perl/perl5.git
synced 2026-01-27 18:05:32 +00:00
274 lines
6.2 KiB
C++
274 lines
6.2 KiB
C++
|
|
/*
|
|
* 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 <fcntl.h>
|
|
|
|
#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 */
|
|
|
|
|