X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=win32%2Frunperl.c;h=3947f9ef377299c322f34302611eec034dcfddd4;hb=4651cd973dc1927af3b5d1c108970bc03fc01bb1;hp=76f9ea0b93b65e6252395068852e0e57563924ee;hpb=76e3520e1f6b7df33cd381a2cf4f1fce3d69c8a4;p=p5sagit%2Fp5-mst-13.2.git diff --git a/win32/runperl.c b/win32/runperl.c index 76f9ea0..3947f9e 100644 --- a/win32/runperl.c +++ b/win32/runperl.c @@ -4,171 +4,55 @@ #include "EXTERN.h" #include "perl.h" +#define NO_XSLOCKS #include "XSUB.H" +#include "win32iop.h" -#include -#include -#include -#include -#include -#include - -#include "ipstdiowin.h" -#include "ipdir.c" -#include "ipenv.c" -#include "ipsock.c" -#include "iplio.c" -#include "ipmem.c" -#include "ipproc.c" -#include "ipstdio.c" - -static void xs_init _((CPERLarg)); -#define stderr (&_iob[2]) -#undef fprintf -#undef environ - -class CPerlHost -{ -public: - CPerlHost() { pPerl = NULL; }; - inline BOOL PerlCreate(void) - { - try - { - pPerl = perl_alloc(&perlMem, - &perlEnv, - &perlStdIO, - &perlLIO, - &perlDir, - &perlSock, - &perlProc); - if(pPerl != NULL) - { - perlDir.SetPerlObj(pPerl); - perlEnv.SetPerlObj(pPerl); - perlLIO.SetPerlObj(pPerl); - perlLIO.SetSockCtl(&perlSock); - perlLIO.SetStdObj(&perlStdIO); - perlMem.SetPerlObj(pPerl); - perlProc.SetPerlObj(pPerl); - perlSock.SetPerlObj(pPerl); - perlSock.SetStdObj(&perlStdIO); - perlStdIO.SetPerlObj(pPerl); - perlStdIO.SetSockCtl(&perlSock); - try - { - pPerl->perl_construct(); - } - catch(...) - { - fprintf(stderr, "%s\n", "Error: Unable to construct data structures"); - pPerl->perl_free(); - pPerl = NULL; - } - } - } - catch(...) - { - fprintf(stderr, "%s\n", "Error: Unable to allocate memory"); - pPerl = NULL; - } - return (pPerl != NULL); - }; - inline int PerlParse(int argc, char** argv, char** env) - { - char* environ = NULL; - int retVal; - try - { - retVal = pPerl->perl_parse(xs_init, argc, argv, (env == NULL || *env == NULL ? &environ : env)); - } - catch(int x) - { - // this is where exit() should arrive - retVal = x; - } - catch(...) - { - fprintf(stderr, "Error: Parse exception\n"); - retVal = -1; - } - return retVal; - }; - inline int PerlRun(void) - { - int retVal; - try - { - retVal = pPerl->perl_run(); - } - catch(int x) - { - // this is where exit() should arrive - retVal = x; - } - catch(...) - { - fprintf(stderr, "Error: Runtime exception\n"); - retVal = -1; - } - return retVal; - }; - inline void PerlDestroy(void) - { - try - { - pPerl->perl_destruct(); - pPerl->perl_free(); - } - catch(...) - { - } - }; - -protected: - CPerlObj *pPerl; - CPerlDir perlDir; - CPerlEnv perlEnv; - CPerlLIO perlLIO; - CPerlMem perlMem; - CPerlProc perlProc; - CPerlSock perlSock; - CPerlStdIO perlStdIO; +#include +#include "perlhost.h" + + +char *staticlinkmodules[] = { + "DynaLoader", + NULL, }; +EXTERN_C void boot_DynaLoader _((CV* cv _CPERLarg)); + +static void +xs_init(CPERLarg) +{ + char *file = __FILE__; + dXSUB_SYS; + newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file); +} + +CPerlObj *pPerl; + #undef PERL_SYS_INIT #define PERL_SYS_INIT(a, c) int main(int argc, char **argv, char **env) { - CPerlHost host; - int exitstatus = 1; - - if(!host.PerlCreate()) - exit(exitstatus); + CPerlHost host; + int exitstatus = 1; + if(!host.PerlCreate()) + exit(exitstatus); - exitstatus = host.PerlParse(argc, argv, env); + exitstatus = host.PerlParse(xs_init, argc, argv, NULL); - if (!exitstatus) - { - exitstatus = host.PerlRun(); - } + if (!exitstatus) + exitstatus = host.PerlRun(); - host.PerlDestroy(); + host.PerlDestroy(); return exitstatus; } - -static void xs_init(CPERLarg) -{ -} - #else /* PERL_OBJECT */ -/* Say NO to CPP! Hallelujah! */ #ifdef __GNUC__ /* * GNU C does not do __declspec()