From: Douglas Lankshear Date: Fri, 19 Jun 1998 10:59:50 +0000 (-0700) Subject: applied patch, along with many changes: X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=0f4eea8fa1779e08575278392ed398ffeda6dcd2;p=p5sagit%2Fp5-mst-13.2.git applied patch, along with many changes: - ipfoo.h headers have been coalesced along with perlfoo.h into iperlsys.h - win32/cp*.h have been combined in perlhost.h - CPerlObj::PerlParse() takes an extra xsinit arg - tweaks to get dl_win32.xs compiling again w/ PERL_OBJECT Message-Id: <000001bd9b8c$0417fe90$a32fa8c0@tau.Active> Subject: RE: [PATCH 5.004_67] Fixes for broken MS compiler p4raw-id: //depot/perl@1172 --- diff --git a/MANIFEST b/MANIFEST index b1b9125..7443f5c 100644 --- a/MANIFEST +++ b/MANIFEST @@ -404,13 +404,7 @@ installman Perl script to install man pages for pods installperl Perl script to do "make install" dirty work interp.sym Interpreter specific symbols to hide in a struct intrpvar.h Variables held in each interpreter instance -ipdir.h Directory interface for Perl Object -ipenv.h Environment interface for Perl Object -iplio.h Low level IO interface for Perl Object -ipmem.h Memory interface for Perl Object -ipproc.h Process interface for Perl Object -ipsock.h Socket interface for Perl Object -ipstdio.h Stdio interface for Perl Object +iperlsys.h Perl's interface to the system keywords.h The keyword numbers keywords.pl Program to write keywords.h lib/AnyDBM_File.pm Perl module to emulate dbmopen @@ -632,18 +626,11 @@ patchlevel.h The current patch level of perl perl.c main() perl.h Global declarations perl_exp.SH Creates list of exported symbols for AIX -perldir.h Macros for directory abstraction -perlenv.h Macros for environment abstraction perlio.c C code for PerlIO abstraction -perlio.h Interface to PerlIO abstraction perlio.sym Symbols for PerlIO abstraction -perllio.h Macros for Low level IO abstraction -perlmem.h Macros for memory allocation abstraction -perlproc.h Macros for process abstraction perlsdio.h Fake stdio using perlio perlsfio.h Prototype sfio mapping for PerlIO perlsh A poor man's perl shell -perlsock.h Macros for socket abstraction perlvars.h Global variables perly.c A byacc'ed perly.y perly.c.diff Fixup perly.c to allow recursion @@ -1009,6 +996,7 @@ win32/makefile.mk Win32 makefile for DMAKE (BC++, VC++ builds) win32/makemain.pl Win32 port win32/makeperldef.pl Win32 port win32/perlglob.c Win32 port +win32/perlhost.h Perl host implementation win32/perllib.c Win32 port win32/pod.mak Win32 port win32/runperl.c Win32 port diff --git a/ipdir.h b/ipdir.h deleted file mode 100644 index f0dadc4..0000000 --- a/ipdir.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - - ipdir.h - Interface for perl directory functions - -*/ - - -/* - PerlXXX_YYY explained - DickH and DougL @ ActiveState.com - -XXX := functional group -YYY := stdlib/OS function name - -Continuing with the theme of PerlIO, all OS functionality was -encapsulated into one of several interfaces. - -PerlIO - stdio -PerlLIO - low level I/O -PerlMem - malloc, realloc, free -PerlDir - directory related -PerlEnv - process environment handling -PerlProc - process control -PerlSock - socket functions - - -The features of this are: -1. All OS dependant code is in the Perl Host and not the Perl Core. - (At least this is the holy grail goal of this work) -2. The Perl Host (see perl.h for description) can provide a new and - improved interface to OS functionality if required. -3. Developers can easily hook into the OS calls for instrumentation - or diagnostic purposes. - -What was changed to do this: -1. All calls to OS functions were replaced with PerlXXX_YYY - -*/ - - - -#ifndef __Inc__IPerlDir___ -#define __Inc__IPerlDir___ - -class IPerlDir -{ -public: - virtual int Makedir(const char *dirname, int mode, int &err) = 0; - virtual int Chdir(const char *dirname, int &err) = 0; - virtual int Rmdir(const char *dirname, int &err) = 0; - virtual int Close(DIR *dirp, int &err) = 0; - virtual DIR *Open(char *filename, int &err) = 0; - virtual struct direct *Read(DIR *dirp, int &err) = 0; - virtual void Rewind(DIR *dirp, int &err) = 0; - virtual void Seek(DIR *dirp, long loc, int &err) = 0; - virtual long Tell(DIR *dirp, int &err) = 0; -}; - -#endif /* __Inc__IPerlDir___ */ - diff --git a/ipenv.h b/ipenv.h deleted file mode 100644 index 30acffb..0000000 --- a/ipenv.h +++ /dev/null @@ -1,21 +0,0 @@ -/* - - ipenv.h - Interface for perl environment functions - -*/ - -#ifndef __Inc__IPerlEnv___ -#define __Inc__IPerlEnv___ - -class IPerlEnv -{ -public: - virtual char* Getenv(const char *varname, int &err) = 0; - virtual int Putenv(const char *envstring, int &err) = 0; - virtual char* LibPath(char *patchlevel) =0; - virtual char* SiteLibPath(char *patchlevel) =0; -}; - -#endif /* __Inc__IPerlEnv___ */ - diff --git a/iperlsys.h b/iperlsys.h new file mode 100644 index 0000000..2febe6e --- /dev/null +++ b/iperlsys.h @@ -0,0 +1,905 @@ +/* + * iperlsys.h - Perl's interface to the system + * + * This file defines the system level functionality that perl needs. + * + * When using C, this definition is in the form of a set of macros + * that can be #defined to the system-level function (or a wrapper + * provided elsewhere). + * + * When using C++ with -DPERL_OBJECT, this definition is in the + * form of a set of virtual base classes which must be subclassed to + * provide a real implementation. The Perl Object will use instances + * of this implementation to use the system-level functionality. + * + * GSAR 21-JUN-98 + */ + +#ifndef __Inc__IPerl___ +#define __Inc__IPerl___ + +/* + * PerlXXX_YYY explained - DickH and DougL @ ActiveState.com + * + * XXX := functional group + * YYY := stdlib/OS function name + * + * Continuing with the theme of PerlIO, all OS functionality was + * encapsulated into one of several interfaces. + * + * PerlIO - stdio + * PerlLIO - low level I/O + * PerlMem - malloc, realloc, free + * PerlDir - directory related + * PerlEnv - process environment handling + * PerlProc - process control + * PerlSock - socket functions + * + * + * The features of this are: + * 1. All OS dependant code is in the Perl Host and not the Perl Core. + * (At least this is the holy grail goal of this work) + * 2. The Perl Host (see perl.h for description) can provide a new and + * improved interface to OS functionality if required. + * 3. Developers can easily hook into the OS calls for instrumentation + * or diagnostic purposes. + * + * What was changed to do this: + * 1. All calls to OS functions were replaced with PerlXXX_YYY + * + */ + + +/* + Interface for perl stdio functions +*/ + + +/* Clean up (or at least document) the various possible #defines. + This section attempts to match the 5.003_03 Configure variables + onto the 5.003_02 header file values. + I can't figure out where USE_STDIO was supposed to be set. + --AD +*/ +#ifndef USE_PERLIO +# define PERLIO_IS_STDIO +#endif + +/* Below is the 5.003_02 stuff. */ +#ifdef USE_STDIO +# ifndef PERLIO_IS_STDIO +# define PERLIO_IS_STDIO +# endif +#else +extern void PerlIO_init _((void)); +#endif + +#ifdef PERL_OBJECT + +#ifndef PerlIO +typedef struct _PerlIO PerlIO; +#endif + +class IPerlStdIO +{ +public: + virtual PerlIO * Stdin(void) = 0; + virtual PerlIO * Stdout(void) = 0; + virtual PerlIO * Stderr(void) = 0; + virtual PerlIO * Open(const char *, const char *, int &err) = 0; + virtual int Close(PerlIO*, int &err) = 0; + virtual int Eof(PerlIO*, int &err) = 0; + virtual int Error(PerlIO*, int &err) = 0; + virtual void Clearerr(PerlIO*, int &err) = 0; + virtual int Getc(PerlIO*, int &err) = 0; + virtual char * GetBase(PerlIO *, int &err) = 0; + virtual int GetBufsiz(PerlIO *, int &err) = 0; + virtual int GetCnt(PerlIO *, int &err) = 0; + virtual char * GetPtr(PerlIO *, int &err) = 0; + virtual char * Gets(PerlIO*, char*, int, int& err) = 0; + virtual int Putc(PerlIO*, int, int &err) = 0; + virtual int Puts(PerlIO*, const char *, int &err) = 0; + virtual int Flush(PerlIO*, int &err) = 0; + virtual int Ungetc(PerlIO*,int, int &err) = 0; + virtual int Fileno(PerlIO*, int &err) = 0; + virtual PerlIO * Fdopen(int, const char *, int &err) = 0; + virtual PerlIO * Reopen(const char*, const char*, PerlIO*, int &err) = 0; + virtual SSize_t Read(PerlIO*,void *,Size_t, int &err) = 0; + virtual SSize_t Write(PerlIO*,const void *,Size_t, int &err) = 0; + virtual void SetBuf(PerlIO *, char*, int &err) = 0; + virtual int SetVBuf(PerlIO *, char*, int, Size_t, int &err) = 0; + virtual void SetCnt(PerlIO *, int, int &err) = 0; + virtual void SetPtrCnt(PerlIO *, char *, int, int& err) = 0; + virtual void Setlinebuf(PerlIO*, int &err) = 0; + virtual int Printf(PerlIO*, int &err, const char *,...) = 0; + virtual int Vprintf(PerlIO*, int &err, const char *, va_list) = 0; + virtual long Tell(PerlIO*, int &err) = 0; + virtual int Seek(PerlIO*, off_t, int, int &err) = 0; + virtual void Rewind(PerlIO*, int &err) = 0; + virtual PerlIO * Tmpfile(int &err) = 0; + virtual int Getpos(PerlIO*, Fpos_t *, int &err) = 0; + virtual int Setpos(PerlIO*, const Fpos_t *, int &err) = 0; + virtual void Init(int &err) = 0; + virtual void InitOSExtras(void* p) = 0; +#ifdef WIN32 + virtual int OpenOSfhandle(long osfhandle, int flags) = 0; + virtual int GetOSfhandle(int filenum) = 0; +#endif +}; + +#define PerlIO_canset_cnt(f) 1 +#define PerlIO_has_base(f) 1 +#define PerlIO_has_cntptr(f) 1 +#define PerlIO_fast_gets(f) 1 + +#define PerlIO_stdin() piStdIO->Stdin() +#define PerlIO_stdout() piStdIO->Stdout() +#define PerlIO_stderr() piStdIO->Stderr() +#define PerlIO_open(x,y) piStdIO->Open((x),(y), ErrorNo()) +#define PerlIO_close(f) piStdIO->Close((f), ErrorNo()) +#define PerlIO_eof(f) piStdIO->Eof((f), ErrorNo()) +#define PerlIO_error(f) piStdIO->Error((f), ErrorNo()) +#define PerlIO_clearerr(f) piStdIO->Clearerr((f), ErrorNo()) +#define PerlIO_getc(f) piStdIO->Getc((f), ErrorNo()) +#define PerlIO_get_base(f) piStdIO->GetBase((f), ErrorNo()) +#define PerlIO_get_bufsiz(f) piStdIO->GetBufsiz((f), ErrorNo()) +#define PerlIO_get_cnt(f) piStdIO->GetCnt((f), ErrorNo()) +#define PerlIO_get_ptr(f) piStdIO->GetPtr((f), ErrorNo()) +#define PerlIO_putc(f,c) piStdIO->Putc((f),(c), ErrorNo()) +#define PerlIO_puts(f,s) piStdIO->Puts((f),(s), ErrorNo()) +#define PerlIO_flush(f) piStdIO->Flush((f), ErrorNo()) +#define PerlIO_gets(s, n, fp) piStdIO->Gets((fp), s, n, ErrorNo()) +#define PerlIO_ungetc(f,c) piStdIO->Ungetc((f),(c), ErrorNo()) +#define PerlIO_fileno(f) piStdIO->Fileno((f), ErrorNo()) +#define PerlIO_fdopen(f, s) piStdIO->Fdopen((f),(s), ErrorNo()) +#define PerlIO_reopen(p, m, f) piStdIO->Reopen((p), (m), (f), ErrorNo()) +#define PerlIO_read(f,buf,count) \ + (SSize_t)piStdIO->Read((f), (buf), (count), ErrorNo()) +#define PerlIO_write(f,buf,count) \ + piStdIO->Write((f), (buf), (count), ErrorNo()) +#define PerlIO_setbuf(f,b) piStdIO->SetBuf((f), (b), ErrorNo()) +#define PerlIO_setvbuf(f,b,t,s) piStdIO->SetVBuf((f), (b), (t), (s), ErrorNo()) +#define PerlIO_set_cnt(f,c) piStdIO->SetCnt((f), (c), ErrorNo()) +#define PerlIO_set_ptrcnt(f,p,c) \ + piStdIO->SetPtrCnt((f), (p), (c), ErrorNo()) +#define PerlIO_setlinebuf(f) piStdIO->Setlinebuf((f), ErrorNo()) +#define PerlIO_printf fprintf +#define PerlIO_stdoutf piStdIO->Printf +#define PerlIO_vprintf(f,fmt,a) piStdIO->Vprintf((f), ErrorNo(), (fmt),a) +#define PerlIO_tell(f) piStdIO->Tell((f), ErrorNo()) +#define PerlIO_seek(f,o,w) piStdIO->Seek((f),(o),(w), ErrorNo()) +#define PerlIO_getpos(f,p) piStdIO->Getpos((f),(p), ErrorNo()) +#define PerlIO_setpos(f,p) piStdIO->Setpos((f),(p), ErrorNo()) +#define PerlIO_rewind(f) piStdIO->Rewind((f), ErrorNo()) +#define PerlIO_tmpfile() piStdIO->Tmpfile(ErrorNo()) +#define PerlIO_init() piStdIO->Init(ErrorNo()) +#undef init_os_extras +#define init_os_extras() piStdIO->InitOSExtras(this) + +#else /* PERL_OBJECT */ + +#include "perlsdio.h" + +#endif /* PERL_OBJECT */ + +#ifndef PERLIO_IS_STDIO +#ifdef USE_SFIO +#include "perlsfio.h" +#endif /* USE_SFIO */ +#endif /* PERLIO_IS_STDIO */ + +#ifndef EOF +#define EOF (-1) +#endif + +/* This is to catch case with no stdio */ +#ifndef BUFSIZ +#define BUFSIZ 1024 +#endif + +#ifndef SEEK_SET +#define SEEK_SET 0 +#endif + +#ifndef SEEK_CUR +#define SEEK_CUR 1 +#endif + +#ifndef SEEK_END +#define SEEK_END 2 +#endif + +#ifndef PerlIO +struct _PerlIO; +#define PerlIO struct _PerlIO +#endif /* No PerlIO */ + +#ifndef Fpos_t +#define Fpos_t long +#endif + +#ifndef NEXT30_NO_ATTRIBUTE +#ifndef HASATTRIBUTE /* disable GNU-cc attribute checking? */ +#ifdef __attribute__ /* Avoid possible redefinition errors */ +#undef __attribute__ +#endif +#define __attribute__(attr) +#endif +#endif + +#ifndef PerlIO_stdoutf +extern int PerlIO_stdoutf _((const char *,...)) + __attribute__((format (printf, 1, 2))); +#endif +#ifndef PerlIO_puts +extern int PerlIO_puts _((PerlIO *,const char *)); +#endif +#ifndef PerlIO_open +extern PerlIO * PerlIO_open _((const char *,const char *)); +#endif +#ifndef PerlIO_close +extern int PerlIO_close _((PerlIO *)); +#endif +#ifndef PerlIO_eof +extern int PerlIO_eof _((PerlIO *)); +#endif +#ifndef PerlIO_error +extern int PerlIO_error _((PerlIO *)); +#endif +#ifndef PerlIO_clearerr +extern void PerlIO_clearerr _((PerlIO *)); +#endif +#ifndef PerlIO_getc +extern int PerlIO_getc _((PerlIO *)); +#endif +#ifndef PerlIO_putc +extern int PerlIO_putc _((PerlIO *,int)); +#endif +#ifndef PerlIO_flush +extern int PerlIO_flush _((PerlIO *)); +#endif +#ifndef PerlIO_ungetc +extern int PerlIO_ungetc _((PerlIO *,int)); +#endif +#ifndef PerlIO_fileno +extern int PerlIO_fileno _((PerlIO *)); +#endif +#ifndef PerlIO_fdopen +extern PerlIO * PerlIO_fdopen _((int, const char *)); +#endif +#ifndef PerlIO_importFILE +extern PerlIO * PerlIO_importFILE _((FILE *,int)); +#endif +#ifndef PerlIO_exportFILE +extern FILE * PerlIO_exportFILE _((PerlIO *,int)); +#endif +#ifndef PerlIO_findFILE +extern FILE * PerlIO_findFILE _((PerlIO *)); +#endif +#ifndef PerlIO_releaseFILE +extern void PerlIO_releaseFILE _((PerlIO *,FILE *)); +#endif +#ifndef PerlIO_read +extern SSize_t PerlIO_read _((PerlIO *,void *,Size_t)); +#endif +#ifndef PerlIO_write +extern SSize_t PerlIO_write _((PerlIO *,const void *,Size_t)); +#endif +#ifndef PerlIO_setlinebuf +extern void PerlIO_setlinebuf _((PerlIO *)); +#endif +#ifndef PerlIO_printf +extern int PerlIO_printf _((PerlIO *, const char *,...)) + __attribute__((format (printf, 2, 3))); +#endif +#ifndef PerlIO_sprintf +extern int PerlIO_sprintf _((char *, int, const char *,...)) + __attribute__((format (printf, 3, 4))); +#endif +#ifndef PerlIO_vprintf +extern int PerlIO_vprintf _((PerlIO *, const char *, va_list)); +#endif +#ifndef PerlIO_tell +extern long PerlIO_tell _((PerlIO *)); +#endif +#ifndef PerlIO_seek +extern int PerlIO_seek _((PerlIO *,off_t,int)); +#endif +#ifndef PerlIO_rewind +extern void PerlIO_rewind _((PerlIO *)); +#endif +#ifndef PerlIO_has_base +extern int PerlIO_has_base _((PerlIO *)); +#endif +#ifndef PerlIO_has_cntptr +extern int PerlIO_has_cntptr _((PerlIO *)); +#endif +#ifndef PerlIO_fast_gets +extern int PerlIO_fast_gets _((PerlIO *)); +#endif +#ifndef PerlIO_canset_cnt +extern int PerlIO_canset_cnt _((PerlIO *)); +#endif +#ifndef PerlIO_get_ptr +extern STDCHAR * PerlIO_get_ptr _((PerlIO *)); +#endif +#ifndef PerlIO_get_cnt +extern int PerlIO_get_cnt _((PerlIO *)); +#endif +#ifndef PerlIO_set_cnt +extern void PerlIO_set_cnt _((PerlIO *,int)); +#endif +#ifndef PerlIO_set_ptrcnt +extern void PerlIO_set_ptrcnt _((PerlIO *,STDCHAR *,int)); +#endif +#ifndef PerlIO_get_base +extern STDCHAR * PerlIO_get_base _((PerlIO *)); +#endif +#ifndef PerlIO_get_bufsiz +extern int PerlIO_get_bufsiz _((PerlIO *)); +#endif +#ifndef PerlIO_tmpfile +extern PerlIO * PerlIO_tmpfile _((void)); +#endif +#ifndef PerlIO_stdin +extern PerlIO * PerlIO_stdin _((void)); +#endif +#ifndef PerlIO_stdout +extern PerlIO * PerlIO_stdout _((void)); +#endif +#ifndef PerlIO_stderr +extern PerlIO * PerlIO_stderr _((void)); +#endif +#ifndef PerlIO_getpos +extern int PerlIO_getpos _((PerlIO *,Fpos_t *)); +#endif +#ifndef PerlIO_setpos +extern int PerlIO_setpos _((PerlIO *,const Fpos_t *)); +#endif + + +/* + * Interface for directory functions + */ + +#ifdef PERL_OBJECT + +class IPerlDir +{ +public: + virtual int Makedir(const char *dirname, int mode, int &err) = 0; + virtual int Chdir(const char *dirname, int &err) = 0; + virtual int Rmdir(const char *dirname, int &err) = 0; + virtual int Close(DIR *dirp, int &err) = 0; + virtual DIR * Open(char *filename, int &err) = 0; + virtual struct direct *Read(DIR *dirp, int &err) = 0; + virtual void Rewind(DIR *dirp, int &err) = 0; + virtual void Seek(DIR *dirp, long loc, int &err) = 0; + virtual long Tell(DIR *dirp, int &err) = 0; +}; + +#define PerlDir_mkdir(name, mode) \ + piDir->Makedir((name), (mode), ErrorNo()) +#define PerlDir_chdir(name) \ + piDir->Chdir((name), ErrorNo()) +#define PerlDir_rmdir(name) \ + piDir->Rmdir((name), ErrorNo()) +#define PerlDir_close(dir) \ + piDir->Close((dir), ErrorNo()) +#define PerlDir_open(name) \ + piDir->Open((name), ErrorNo()) +#define PerlDir_read(dir) \ + piDir->Read((dir), ErrorNo()) +#define PerlDir_rewind(dir) \ + piDir->Rewind((dir), ErrorNo()) +#define PerlDir_seek(dir, loc) \ + piDir->Seek((dir), (loc), ErrorNo()) +#define PerlDir_tell(dir) \ + piDir->Tell((dir), ErrorNo()) + +#else /* PERL_OBJECT */ + +#define PerlDir_mkdir(name, mode) Mkdir((name), (mode)) +#ifdef VMS +# define PerlDir_chdir(n) chdir(((n) && *(n)) ? (n) : "SYS$LOGIN") +#else +# define PerlDir_chdir(name) chdir((name)) +#endif +#define PerlDir_rmdir(name) rmdir((name)) +#define PerlDir_close(dir) closedir((dir)) +#define PerlDir_open(name) opendir((name)) +#define PerlDir_read(dir) readdir((dir)) +#define PerlDir_rewind(dir) rewinddir((dir)) +#define PerlDir_seek(dir, loc) seekdir((dir), (loc)) +#define PerlDir_tell(dir) telldir((dir)) + +#endif /* PERL_OBJECT */ + +/* + Interface for perl environment functions +*/ + +#ifdef PERL_OBJECT + +class IPerlEnv +{ +public: + virtual char * Getenv(const char *varname, int &err) = 0; + virtual int Putenv(const char *envstring, int &err) = 0; + virtual char * LibPath(char *patchlevel) =0; + virtual char * SiteLibPath(char *patchlevel) =0; +}; + +#define PerlEnv_putenv(str) piENV->Putenv((str), ErrorNo()) +#define PerlEnv_getenv(str) piENV->Getenv((str), ErrorNo()) +#ifdef WIN32 +#define PerlEnv_lib_path(str) piENV->LibPath((str)) +#define PerlEnv_sitelib_path(str) piENV->SiteLibPath((str)) +#endif + +#else /* PERL_OBJECT */ + +#define PerlEnv_putenv(str) putenv((str)) +#define PerlEnv_getenv(str) getenv((str)) + +#endif /* PERL_OBJECT */ + +/* + Interface for perl low-level IO functions +*/ + +#ifdef PERL_OBJECT + +class IPerlLIO +{ +public: + virtual int Access(const char *path, int mode, int &err) = 0; + virtual int Chmod(const char *filename, int pmode, int &err) = 0; + virtual int Chown(const char *filename, uid_t owner, + gid_t group, int &err) = 0; + virtual int Chsize(int handle, long size, int &err) = 0; + virtual int Close(int handle, int &err) = 0; + virtual int Dup(int handle, int &err) = 0; + virtual int Dup2(int handle1, int handle2, int &err) = 0; + virtual int Flock(int fd, int oper, int &err) = 0; + virtual int FileStat(int handle, struct stat *buffer, int &err) = 0; + virtual int IOCtl(int i, unsigned int u, char *data, int &err) = 0; + virtual int Isatty(int handle, int &err) = 0; + virtual long Lseek(int handle, long offset, int origin, int &err) = 0; + virtual int Lstat(const char *path, struct stat *buffer, int &err) = 0; + virtual char * Mktemp(char *Template, int &err) = 0; + virtual int Open(const char *filename, int oflag, int &err) = 0; + virtual int Open(const char *filename, int oflag, + int pmode, int &err) = 0; + virtual int Read(int handle, void *buffer, + unsigned int count, int &err) = 0; + virtual int Rename(const char *oldname, + const char *newname, int &err) = 0; + virtual int Setmode(int handle, int mode, int &err) = 0; + virtual int NameStat(const char *path, + struct stat *buffer, int &err) = 0; + virtual char * Tmpnam(char *string, int &err) = 0; + virtual int Umask(int pmode, int &err) = 0; + virtual int Unlink(const char *filename, int &err) = 0; + virtual int Utime(char *filename, struct utimbuf *times, int &err) = 0; + virtual int Write(int handle, const void *buffer, + unsigned int count, int &err) = 0; +}; + +#define PerlLIO_access(file, mode) \ + piLIO->Access((file), (mode), ErrorNo()) +#define PerlLIO_chmod(file, mode) \ + piLIO->Chmod((file), (mode), ErrorNo()) +#define PerlLIO_chown(file, owner, group) \ + piLIO->Chown((file), (owner), (group), ErrorNo()) +#define PerlLIO_chsize(fd, size) \ + piLIO->Chsize((fd), (size), ErrorNo()) +#define PerlLIO_close(fd) \ + piLIO->Close((fd), ErrorNo()) +#define PerlLIO_dup(fd) \ + piLIO->Dup((fd), ErrorNo()) +#define PerlLIO_dup2(fd1, fd2) \ + piLIO->Dup2((fd1), (fd2), ErrorNo()) +#define PerlLIO_flock(fd, op) \ + piLIO->Flock((fd), (op), ErrorNo()) +#define PerlLIO_fstat(fd, buf) \ + piLIO->FileStat((fd), (buf), ErrorNo()) +#define PerlLIO_ioctl(fd, u, buf) \ + piLIO->IOCtl((fd), (u), (buf), ErrorNo()) +#define PerlLIO_isatty(fd) \ + piLIO->Isatty((fd), ErrorNo()) +#define PerlLIO_lseek(fd, offset, mode) \ + piLIO->Lseek((fd), (offset), (mode), ErrorNo()) +#define PerlLIO_lstat(name, buf) \ + piLIO->Lstat((name), (buf), ErrorNo()) +#define PerlLIO_mktemp(file) \ + piLIO->Mktemp((file), ErrorNo()) +#define PerlLIO_open(file, flag) \ + piLIO->Open((file), (flag), ErrorNo()) +#define PerlLIO_open3(file, flag, perm) \ + piLIO->Open((file), (flag), (perm), ErrorNo()) +#define PerlLIO_read(fd, buf, count) \ + piLIO->Read((fd), (buf), (count), ErrorNo()) +#define PerlLIO_rename(oldname, newname) \ + piLIO->Rename((oldname), (newname), ErrorNo()) +#define PerlLIO_setmode(fd, mode) \ + piLIO->Setmode((fd), (mode), ErrorNo()) +#define PerlLIO_stat(name, buf) \ + piLIO->NameStat((name), (buf), ErrorNo()) +#define PerlLIO_tmpnam(str) \ + piLIO->Tmpnam((str), ErrorNo()) +#define PerlLIO_umask(mode) \ + piLIO->Umask((mode), ErrorNo()) +#define PerlLIO_unlink(file) \ + piLIO->Unlink((file), ErrorNo()) +#define PerlLIO_utime(file, time) \ + piLIO->Utime((file), (time), ErrorNo()) +#define PerlLIO_write(fd, buf, count) \ + piLIO->Write((fd), (buf), (count), ErrorNo()) + +#else /* PERL_OBJECT */ + +#define PerlLIO_access(file, mode) access((file), (mode)) +#define PerlLIO_chmod(file, mode) chmod((file), (mode)) +#define PerlLIO_chown(file, owner, grp) chown((file), (owner), (grp)) +#define PerlLIO_chsize(fd, size) chsize((fd), (size)) +#define PerlLIO_close(fd) close((fd)) +#define PerlLIO_dup(fd) dup((fd)) +#define PerlLIO_dup2(fd1, fd2) dup2((fd1), (fd2)) +#define PerlLIO_flock(fd, op) FLOCK((fd), (op)) +#define PerlLIO_fstat(fd, buf) Fstat((fd), (buf)) +#define PerlLIO_ioctl(fd, u, buf) ioctl((fd), (u), (buf)) +#define PerlLIO_isatty(fd) isatty((fd)) +#define PerlLIO_lseek(fd, offset, mode) lseek((fd), (offset), (mode)) +#define PerlLIO_lstat(name, buf) lstat((name), (buf)) +#define PerlLIO_mktemp(file) mktemp((file)) +#define PerlLIO_mkstemp(file) mkstemp((file)) +#define PerlLIO_open(file, flag) open((file), (flag)) +#define PerlLIO_open3(file, flag, perm) open((file), (flag), (perm)) +#define PerlLIO_read(fd, buf, count) read((fd), (buf), (count)) +#define PerlLIO_rename(old, new) rename((old), (new)) +#define PerlLIO_setmode(fd, mode) setmode((fd), (mode)) +#define PerlLIO_stat(name, buf) Stat((name), (buf)) +#define PerlLIO_tmpnam(str) tmpnam((str)) +#define PerlLIO_umask(mode) umask((mode)) +#define PerlLIO_unlink(file) unlink((file)) +#define PerlLIO_utime(file, time) utime((file), (time)) +#define PerlLIO_write(fd, buf, count) write((fd), (buf), (count)) + +#endif /* PERL_OBJECT */ + +/* + Interface for perl memory allocation +*/ + +#ifdef PERL_OBJECT + +class IPerlMem +{ +public: + virtual void * Malloc(size_t) = 0; + virtual void * Realloc(void*, size_t) = 0; + virtual void Free(void*) = 0; +}; + +#define PerlMem_malloc(size) piMem->Malloc((size)) +#define PerlMem_realloc(buf, size) piMem->Realloc((buf), (size)) +#define PerlMem_free(buf) piMem->Free((buf)) + +#else /* PERL_OBJECT */ + +#define PerlMem_malloc(size) malloc((size)) +#define PerlMem_realloc(buf, size) realloc((buf), (size)) +#define PerlMem_free(buf) free((buf)) + +#endif /* PERL_OBJECT */ + +/* + Interface for perl process functions +*/ + + +#ifdef PERL_OBJECT + +#ifndef Sighandler_t +typedef Signal_t (*Sighandler_t) _((int)); +#endif +#ifndef jmp_buf +#include +#endif + +class IPerlProc +{ +public: + virtual void Abort(void) = 0; + virtual void Exit(int status) = 0; + virtual void _Exit(int status) = 0; + virtual int Execl(const char *cmdname, const char *arg0, + const char *arg1, const char *arg2, + const char *arg3) = 0; + virtual int Execv(const char *cmdname, const char *const *argv) = 0; + virtual int Execvp(const char *cmdname, const char *const *argv) = 0; + virtual uid_t Getuid(void) = 0; + virtual uid_t Geteuid(void) = 0; + virtual gid_t Getgid(void) = 0; + virtual gid_t Getegid(void) = 0; + virtual char * Getlogin(void) = 0; + virtual int Kill(int pid, int sig) = 0; + virtual int Killpg(int pid, int sig) = 0; + virtual int PauseProc(void) = 0; + virtual PerlIO * Popen(const char *command, const char *mode) = 0; + virtual int Pclose(PerlIO *stream) = 0; + virtual int Pipe(int *phandles) = 0; + virtual int Setuid(uid_t uid) = 0; + virtual int Setgid(gid_t gid) = 0; + virtual int Sleep(unsigned int) = 0; + virtual int Times(struct tms *timebuf) = 0; + virtual int Wait(int *status) = 0; + virtual int Waitpid(int pid, int *status, int flags) = 0; + virtual Sighandler_t Signal(int sig, Sighandler_t subcode) = 0; +#ifdef WIN32 + virtual void GetSysMsg(char*& msg, DWORD& dwLen, DWORD dwErr) = 0; + virtual void FreeBuf(char* msg) = 0; + virtual BOOL DoCmd(char *cmd) = 0; + virtual int Spawn(char*cmds) = 0; + virtual int Spawnvp(int mode, const char *cmdname, + const char *const *argv) = 0; + virtual int ASpawn(void *vreally, void **vmark, void **vsp) = 0; +#endif +}; + +#define PerlProc_abort() piProc->Abort() +#define PerlProc_exit(s) piProc->Exit((s)) +#define PerlProc__exit(s) piProc->_Exit((s)) +#define PerlProc_execl(c, w, x, y, z) \ + piProc->Execl((c), (w), (x), (y), (z)) + +#define PerlProc_execv(c, a) piProc->Execv((c), (a)) +#define PerlProc_execvp(c, a) piProc->Execvp((c), (a)) +#define PerlProc_getuid() piProc->Getuid() +#define PerlProc_geteuid() piProc->Geteuid() +#define PerlProc_getgid() piProc->Getgid() +#define PerlProc_getegid() piProc->Getegid() +#define PerlProc_getlogin() piProc->Getlogin() +#define PerlProc_kill(i, a) piProc->Kill((i), (a)) +#define PerlProc_killpg(i, a) piProc->Killpg((i), (a)) +#define PerlProc_pause() piProc->PauseProc() +#define PerlProc_popen(c, m) piProc->Popen((c), (m)) +#define PerlProc_pclose(f) piProc->Pclose((f)) +#define PerlProc_pipe(fd) piProc->Pipe((fd)) +#define PerlProc_setuid(u) piProc->Setuid((u)) +#define PerlProc_setgid(g) piProc->Setgid((g)) +#define PerlProc_sleep(t) piProc->Sleep((t)) +#define PerlProc_times(t) piProc->Times((t)) +#define PerlProc_wait(t) piProc->Wait((t)) +#define PerlProc_waitpid(p,s,f) piProc->Waitpid((p), (s), (f)) +#define PerlProc_setjmp(b, n) Sigsetjmp((b), (n)) +#define PerlProc_longjmp(b, n) Siglongjmp((b), (n)) +#define PerlProc_signal(n, h) piProc->Signal((n), (h)) + +#ifdef WIN32 +#define PerlProc_GetSysMsg(s,l,e) \ + piProc->GetSysMsg((s), (l), (e)) + +#define PerlProc_FreeBuf(s) piProc->FreeBuf((s)) +#define PerlProc_Cmd(s) piProc->DoCmd((s)) +#define do_spawn(s) piProc->Spawn((s)) +#define do_spawnvp(m, c, a) piProc->Spawnvp((m), (c), (a)) +#define PerlProc_aspawn(m,c,a) piProc->ASpawn((m), (c), (a)) +#endif + +#else /* PERL_OBJECT */ + +#define PerlProc_abort() abort() +#define PerlProc_exit(s) exit((s)) +#define PerlProc__exit(s) _exit((s)) +#define PerlProc_execl(c,w,x,y,z) \ + execl((c), (w), (x), (y), (z)) +#define PerlProc_execv(c, a) execv((c), (a)) +#define PerlProc_execvp(c, a) execvp((c), (a)) +#define PerlProc_getuid() getuid() +#define PerlProc_geteuid() geteuid() +#define PerlProc_getgid() getgid() +#define PerlProc_getegid() getegid() +#define PerlProc_getlogin() getlogin() +#define PerlProc_kill(i, a) kill((i), (a)) +#define PerlProc_killpg(i, a) killpg((i), (a)) +#define PerlProc_pause() Pause() +#define PerlProc_popen(c, m) my_popen((c), (m)) +#define PerlProc_pclose(f) my_pclose((f)) +#define PerlProc_pipe(fd) pipe((fd)) +#define PerlProc_setuid(u) setuid((u)) +#define PerlProc_setgid(g) setgid((g)) +#define PerlProc_sleep(t) sleep((t)) +#define PerlProc_times(t) times((t)) +#define PerlProc_wait(t) wait((t)) +#define PerlProc_waitpid(p,s,f) waitpid((p), (s), (f)) +#define PerlProc_setjmp(b, n) Sigsetjmp((b), (n)) +#define PerlProc_longjmp(b, n) Siglongjmp((b), (n)) +#define PerlProc_signal(n, h) signal((n), (h)) + + +#endif /* PERL_OBJECT */ + +/* + Interface for perl socket functions +*/ + +#ifdef PERL_OBJECT + +class IPerlSock +{ +public: + virtual u_long Htonl(u_long hostlong) = 0; + virtual u_short Htons(u_short hostshort) = 0; + virtual u_long Ntohl(u_long netlong) = 0; + virtual u_short Ntohs(u_short netshort) = 0; + virtual SOCKET Accept(SOCKET s, struct sockaddr* addr, + int* addrlen, int &err) = 0; + virtual int Bind(SOCKET s, const struct sockaddr* name, + int namelen, int &err) = 0; + virtual int Connect(SOCKET s, const struct sockaddr* name, + int namelen, int &err) = 0; + virtual void Endhostent(int &err) = 0; + virtual void Endnetent(int &err) = 0; + virtual void Endprotoent(int &err) = 0; + virtual void Endservent(int &err) = 0; + virtual int Gethostname(char* name, int namelen, int &err) = 0; + virtual int Getpeername(SOCKET s, struct sockaddr* name, + int* namelen, int &err) = 0; + virtual struct hostent * Gethostbyaddr(const char* addr, int len, + int type, int &err) = 0; + virtual struct hostent * Gethostbyname(const char* name, int &err) = 0; + virtual struct hostent * Gethostent(int &err) = 0; + virtual struct netent * Getnetbyaddr(long net, int type, int &err) = 0; + virtual struct netent * Getnetbyname(const char *, int &err) = 0; + virtual struct netent * Getnetent(int &err) = 0; + virtual struct protoent * Getprotobyname(const char* name, int &err) = 0; + virtual struct protoent * Getprotobynumber(int number, int &err) = 0; + virtual struct protoent * Getprotoent(int &err) = 0; + virtual struct servent * Getservbyname(const char* name, + const char* proto, int &err) = 0; + virtual struct servent * Getservbyport(int port, const char* proto, + int &err) = 0; + virtual struct servent * Getservent(int &err) = 0; + virtual int Getsockname(SOCKET s, struct sockaddr* name, + int* namelen, int &err) = 0; + virtual int Getsockopt(SOCKET s, int level, int optname, + char* optval, int* optlen, int &err) = 0; + virtual unsigned long InetAddr(const char* cp, int &err) = 0; + virtual char * InetNtoa(struct in_addr in, int &err) = 0; + virtual int Listen(SOCKET s, int backlog, int &err) = 0; + virtual int Recv(SOCKET s, char* buf, int len, + int flags, int &err) = 0; + virtual int Recvfrom(SOCKET s, char* buf, int len, int flags, + struct sockaddr* from, int* fromlen, int &err) = 0; + virtual int Select(int nfds, char* readfds, char* writefds, + char* exceptfds, const struct timeval* timeout, + int &err) = 0; + virtual int Send(SOCKET s, const char* buf, int len, + int flags, int &err) = 0; + virtual int Sendto(SOCKET s, const char* buf, int len, int flags, + const struct sockaddr* to, int tolen, int &err) = 0; + virtual void Sethostent(int stayopen, int &err) = 0; + virtual void Setnetent(int stayopen, int &err) = 0; + virtual void Setprotoent(int stayopen, int &err) = 0; + virtual void Setservent(int stayopen, int &err) = 0; + virtual int Setsockopt(SOCKET s, int level, int optname, + const char* optval, int optlen, int &err) = 0; + virtual int Shutdown(SOCKET s, int how, int &err) = 0; + virtual SOCKET Socket(int af, int type, int protocol, int &err) = 0; + virtual int Socketpair(int domain, int type, int protocol, + int* fds, int &err) = 0; +#ifdef WIN32 + virtual int Closesocket(SOCKET s, int& err) = 0; + virtual int Ioctlsocket(SOCKET s, long cmd, u_long *argp, + int& err) = 0; +#endif +}; + +#define PerlSock_htonl(x) piSock->Htonl(x) +#define PerlSock_htons(x) piSock->Htons(x) +#define PerlSock_ntohl(x) piSock->Ntohl(x) +#define PerlSock_ntohs(x) piSock->Ntohs(x) +#define PerlSock_accept(s, a, l) piSock->Accept(s, a, l, ErrorNo()) +#define PerlSock_bind(s, n, l) piSock->Bind(s, n, l, ErrorNo()) +#define PerlSock_connect(s, n, l) piSock->Connect(s, n, l, ErrorNo()) +#define PerlSock_endhostent() piSock->Endhostent(ErrorNo()) +#define PerlSock_endnetent() piSock->Endnetent(ErrorNo()) +#define PerlSock_endprotoent() piSock->Endprotoent(ErrorNo()) +#define PerlSock_endservent() piSock->Endservent(ErrorNo()) +#define PerlSock_gethostbyaddr(a, l, t) piSock->Gethostbyaddr(a, l, t, ErrorNo()) +#define PerlSock_gethostbyname(n) piSock->Gethostbyname(n, ErrorNo()) +#define PerlSock_gethostent() piSock->Gethostent(ErrorNo()) +#define PerlSock_gethostname(n, l) piSock->Gethostname(n, l, ErrorNo()) +#define PerlSock_getnetbyaddr(n, t) piSock->Getnetbyaddr(n, t, ErrorNo()) +#define PerlSock_getnetbyname(c) piSock->Getnetbyname(c, ErrorNo()) +#define PerlSock_getnetent() piSock->Getnetent(ErrorNo()) +#define PerlSock_getpeername(s, n, l) piSock->Getpeername(s, n, l, ErrorNo()) +#define PerlSock_getprotobyname(n) piSock->Getprotobyname(n, ErrorNo()) +#define PerlSock_getprotobynumber(n) piSock->Getprotobynumber(n, ErrorNo()) +#define PerlSock_getprotoent() piSock->Getprotoent(ErrorNo()) +#define PerlSock_getservbyname(n, p) piSock->Getservbyname(n, p, ErrorNo()) +#define PerlSock_getservbyport(port, p) piSock->Getservbyport(port, p, ErrorNo()) +#define PerlSock_getservent() piSock->Getservent(ErrorNo()) +#define PerlSock_getsockname(s, n, l) piSock->Getsockname(s, n, l, ErrorNo()) +#define PerlSock_getsockopt(s,l,n,v,i) piSock->Getsockopt(s, l, n, v, i, ErrorNo()) +#define PerlSock_inet_addr(c) piSock->InetAddr(c, ErrorNo()) +#define PerlSock_inet_ntoa(i) piSock->InetNtoa(i, ErrorNo()) +#define PerlSock_listen(s, b) piSock->Listen(s, b, ErrorNo()) +#define PerlSock_recv(s, b, l, f) piSock->Recv(s, b, l, f, ErrorNo()) +#define PerlSock_recvfrom(s,b,l,f,from,fromlen) \ + piSock->Recvfrom(s, b, l, f, from, fromlen, ErrorNo()) +#define PerlSock_select(n, r, w, e, t) \ + piSock->Select(n, (char*)r, (char*)w, (char*)e, t, ErrorNo()) +#define PerlSock_send(s, b, l, f) piSock->Send(s, b, l, f, ErrorNo()) +#define PerlSock_sendto(s, b, l, f, t, tlen) \ + piSock->Sendto(s, b, l, f, t, tlen, ErrorNo()) +#define PerlSock_sethostent(f) piSock->Sethostent(f, ErrorNo()) +#define PerlSock_setnetent(f) piSock->Setnetent(f, ErrorNo()) +#define PerlSock_setprotoent(f) piSock->Setprotoent(f, ErrorNo()) +#define PerlSock_setservent(f) piSock->Setservent(f, ErrorNo()) +#define PerlSock_setsockopt(s, l, n, v, len) \ + piSock->Setsockopt(s, l, n, v, len, ErrorNo()) +#define PerlSock_shutdown(s, h) piSock->Shutdown(s, h, ErrorNo()) +#define PerlSock_socket(a, t, p) piSock->Socket(a, t, p, ErrorNo()) +#define PerlSock_socketpair(a, t, p, f) piSock->Socketpair(a, t, p, f, ErrorNo()) + +#else /* PERL_OBJECT */ + +#define PerlSock_htonl(x) htonl(x) +#define PerlSock_htons(x) htons(x) +#define PerlSock_ntohl(x) ntohl(x) +#define PerlSock_ntohs(x) ntohs(x) +#define PerlSock_accept(s, a, l) accept(s, a, l) +#define PerlSock_bind(s, n, l) bind(s, n, l) +#define PerlSock_connect(s, n, l) connect(s, n, l) + +#define PerlSock_gethostbyaddr(a, l, t) gethostbyaddr(a, l, t) +#define PerlSock_gethostbyname(n) gethostbyname(n) +#define PerlSock_gethostent gethostent +#define PerlSock_endhostent endhostent +#define PerlSock_gethostname(n, l) gethostname(n, l) + +#define PerlSock_getnetbyaddr(n, t) getnetbyaddr(n, t) +#define PerlSock_getnetbyname(n) getnetbyname(n) +#define PerlSock_getnetent getnetent +#define PerlSock_endnetent endnetent +#define PerlSock_getpeername(s, n, l) getpeername(s, n, l) + +#define PerlSock_getprotobyname(n) getprotobyname(n) +#define PerlSock_getprotobynumber(n) getprotobynumber(n) +#define PerlSock_getprotoent getprotoent +#define PerlSock_endprotoent endprotoent + +#define PerlSock_getservbyname(n, p) getservbyname(n, p) +#define PerlSock_getservbyport(port, p) getservbyport(port, p) +#define PerlSock_getservent getservent +#define PerlSock_endservent endservent + +#define PerlSock_getsockname(s, n, l) getsockname(s, n, l) +#define PerlSock_getsockopt(s,l,n,v,i) getsockopt(s, l, n, v, i) +#define PerlSock_inet_addr(c) inet_addr(c) +#define PerlSock_inet_ntoa(i) inet_ntoa(i) +#define PerlSock_listen(s, b) listen(s, b) +#define PerlSock_recvfrom(s, b, l, f, from, fromlen) \ + recvfrom(s, b, l, f, from, fromlen) +#define PerlSock_select(n, r, w, e, t) select(n, r, w, e, t) +#define PerlSock_send(s, b, l, f) send(s, b, l, f) +#define PerlSock_sendto(s, b, l, f, t, tlen) \ + sendto(s, b, l, f, t, tlen) +#define PerlSock_sethostent(f) sethostent(f) +#define PerlSock_setnetent(f) setnetent(f) +#define PerlSock_setprotoent(f) setprotoent(f) +#define PerlSock_setservent(f) setservent(f) +#define PerlSock_setsockopt(s, l, n, v, len) \ + setsockopt(s, l, n, v, len) +#define PerlSock_shutdown(s, h) shutdown(s, h) +#define PerlSock_socket(a, t, p) socket(a, t, p) +#define PerlSock_socketpair(a, t, p, f) socketpair(a, t, p, f) + + +#endif /* PERL_OBJECT */ + +#endif /* __Inc__IPerl___ */ + diff --git a/iplio.h b/iplio.h deleted file mode 100644 index 0c5455f..0000000 --- a/iplio.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - - iplio.h - Interface for perl Low IO functions - -*/ - -#ifndef __Inc__IPerlLIO___ -#define __Inc__IPerlLIO___ - -class IPerlLIO -{ -public: - virtual int Access(const char *path, int mode, int &err) = 0; - virtual int Chmod(const char *filename, int pmode, int &err) = 0; - virtual int Chown(const char *filename, uid_t owner, gid_t group, int &err) = 0; - virtual int Chsize(int handle, long size, int &err) = 0; - virtual int Close(int handle, int &err) = 0; - virtual int Dup(int handle, int &err) = 0; - virtual int Dup2(int handle1, int handle2, int &err) = 0; - virtual int Flock(int fd, int oper, int &err) = 0; - virtual int FileStat(int handle, struct stat *buffer, int &err) = 0; - virtual int IOCtl(int i, unsigned int u, char *data, int &err) = 0; - virtual int Isatty(int handle, int &err) = 0; - virtual long Lseek(int handle, long offset, int origin, int &err) = 0; - virtual int Lstat(const char *path, struct stat *buffer, int &err) = 0; - virtual char *Mktemp(char *Template, int &err) = 0; - virtual int Open(const char *filename, int oflag, int &err) = 0; - virtual int Open(const char *filename, int oflag, int pmode, int &err) = 0; - virtual int Read(int handle, void *buffer, unsigned int count, int &err) = 0; - virtual int Rename(const char *oldname, const char *newname, int &err) = 0; - virtual int Setmode(int handle, int mode, int &err) = 0; - virtual int NameStat(const char *path, struct stat *buffer, int &err) = 0; - virtual char *Tmpnam(char *string, int &err) = 0; - virtual int Umask(int pmode, int &err) = 0; - virtual int Unlink(const char *filename, int &err) = 0; - virtual int Utime(char *filename, struct utimbuf *times, int &err) = 0; - virtual int Write(int handle, const void *buffer, unsigned int count, int &err) = 0; -}; - -#endif /* __Inc__IPerlLIO___ */ diff --git a/ipmem.h b/ipmem.h deleted file mode 100644 index 0554cf5..0000000 --- a/ipmem.h +++ /dev/null @@ -1,20 +0,0 @@ -/* - - ipmem.h - Interface for perl memory allocation - -*/ - -#ifndef __Inc__IPerlMem___ -#define __Inc__IPerlMem___ - -class IPerlMem -{ -public: - virtual void* Malloc(size_t) = 0; - virtual void* Realloc(void*, size_t) = 0; - virtual void Free(void*) = 0; -}; - -#endif /* __Inc__IPerlMem___ */ - diff --git a/ipproc.h b/ipproc.h deleted file mode 100644 index 0395b5b..0000000 --- a/ipproc.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - - ipproc.h - Interface for perl process functions - -*/ - -#ifndef __Inc__IPerlProc___ -#define __Inc__IPerlProc___ - -#ifndef Sighandler_t -typedef Signal_t (*Sighandler_t) _((int)); -#endif -#ifndef jmp_buf -#include -#endif - -class IPerlProc -{ -public: - virtual void Abort(void) = 0; - virtual void Exit(int status) = 0; - virtual void _Exit(int status) = 0; - virtual int Execl(const char *cmdname, const char *arg0, const char *arg1, const char *arg2, const char *arg3) = 0; - virtual int Execv(const char *cmdname, const char *const *argv) = 0; - virtual int Execvp(const char *cmdname, const char *const *argv) = 0; - virtual uid_t Getuid(void) = 0; - virtual uid_t Geteuid(void) = 0; - virtual gid_t Getgid(void) = 0; - virtual gid_t Getegid(void) = 0; - virtual char *Getlogin(void) = 0; - virtual int Kill(int pid, int sig) = 0; - virtual int Killpg(int pid, int sig) = 0; - virtual int PauseProc(void) = 0; - virtual PerlIO* Popen(const char *command, const char *mode) = 0; - virtual int Pclose(PerlIO *stream) = 0; - virtual int Pipe(int *phandles) = 0; - virtual int Setuid(uid_t uid) = 0; - virtual int Setgid(gid_t gid) = 0; - virtual int Sleep(unsigned int) = 0; - virtual int Times(struct tms *timebuf) = 0; - virtual int Wait(int *status) = 0; - virtual int Waitpid(int pid, int *status, int flags) = 0; - virtual Sighandler_t Signal(int sig, Sighandler_t subcode) = 0; -#ifdef WIN32 - virtual void GetSysMsg(char*& msg, DWORD& dwLen, DWORD dwErr) = 0; - virtual void FreeBuf(char* msg) = 0; - virtual BOOL DoCmd(char *cmd) = 0; - virtual int Spawn(char*cmds) = 0; - virtual int Spawnvp(int mode, const char *cmdname, const char *const *argv) = 0; - virtual int ASpawn(void *vreally, void **vmark, void **vsp) = 0; -#endif -}; - -#endif /* __Inc__IPerlProc___ */ - diff --git a/ipsock.h b/ipsock.h deleted file mode 100644 index 1875d56..0000000 --- a/ipsock.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - - ipsock.h - Interface for perl socket functions - -*/ - -#ifndef __Inc__IPerlSock___ -#define __Inc__IPerlSock___ - -class IPerlSock -{ -public: - virtual u_long Htonl(u_long hostlong) = 0; - virtual u_short Htons(u_short hostshort) = 0; - virtual u_long Ntohl(u_long netlong) = 0; - virtual u_short Ntohs(u_short netshort) = 0; - virtual SOCKET Accept(SOCKET s, struct sockaddr* addr, int* addrlen, int &err) = 0; - virtual int Bind(SOCKET s, const struct sockaddr* name, int namelen, int &err) = 0; - virtual int Connect(SOCKET s, const struct sockaddr* name, int namelen, int &err) = 0; - virtual void Endhostent(int &err) = 0; - virtual void Endnetent(int &err) = 0; - virtual void Endprotoent(int &err) = 0; - virtual void Endservent(int &err) = 0; - virtual struct hostent* Gethostbyaddr(const char* addr, int len, int type, int &err) = 0; - virtual struct hostent* Gethostbyname(const char* name, int &err) = 0; - virtual struct hostent* Gethostent(int &err) = 0; - virtual int Gethostname(char* name, int namelen, int &err) = 0; - virtual struct netent *Getnetbyaddr(long net, int type, int &err) = 0; - virtual struct netent *Getnetbyname(const char *, int &err) = 0; - virtual struct netent *Getnetent(int &err) = 0; - virtual int Getpeername(SOCKET s, struct sockaddr* name, int* namelen, int &err) = 0; - virtual struct protoent* Getprotobyname(const char* name, int &err) = 0; - virtual struct protoent* Getprotobynumber(int number, int &err) = 0; - virtual struct protoent* Getprotoent(int &err) = 0; - virtual struct servent* Getservbyname(const char* name, const char* proto, int &err) = 0; - virtual struct servent* Getservbyport(int port, const char* proto, int &err) = 0; - virtual struct servent* Getservent(int &err) = 0; - virtual int Getsockname(SOCKET s, struct sockaddr* name, int* namelen, int &err) = 0; - virtual int Getsockopt(SOCKET s, int level, int optname, char* optval, int* optlen, int &err) = 0; - virtual unsigned long InetAddr(const char* cp, int &err) = 0; - virtual char* InetNtoa(struct in_addr in, int &err) = 0; - virtual int Listen(SOCKET s, int backlog, int &err) = 0; - virtual int Recv(SOCKET s, char* buf, int len, int flags, int &err) = 0; - virtual int Recvfrom(SOCKET s, char* buf, int len, int flags, struct sockaddr* from, int* fromlen, int &err) = 0; - virtual int Select(int nfds, char* readfds, char* writefds, char* exceptfds, const struct timeval* timeout, int &err) = 0; - virtual int Send(SOCKET s, const char* buf, int len, int flags, int &err) = 0; - virtual int Sendto(SOCKET s, const char* buf, int len, int flags, const struct sockaddr* to, int tolen, int &err) = 0; - virtual void Sethostent(int stayopen, int &err) = 0; - virtual void Setnetent(int stayopen, int &err) = 0; - virtual void Setprotoent(int stayopen, int &err) = 0; - virtual void Setservent(int stayopen, int &err) = 0; - virtual int Setsockopt(SOCKET s, int level, int optname, const char* optval, int optlen, int &err) = 0; - virtual int Shutdown(SOCKET s, int how, int &err) = 0; - virtual SOCKET Socket(int af, int type, int protocol, int &err) = 0; - virtual int Socketpair(int domain, int type, int protocol, int* fds, int &err) = 0; -#ifdef WIN32 - virtual int Closesocket(SOCKET s, int& err) = 0; - virtual int Ioctlsocket(SOCKET s, long cmd, u_long *argp, int& err) = 0; -#endif -}; - -#endif /* __Inc__IPerlSock___ */ - diff --git a/ipstdio.h b/ipstdio.h deleted file mode 100644 index d639aca..0000000 --- a/ipstdio.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - - ipstdio.h - Interface for perl stdio functions - -*/ - -#ifndef __Inc__IPerlStdIO___ -#define __Inc__IPerlStdIO___ - -#ifndef PerlIO -typedef struct _PerlIO PerlIO; -#endif - -class IPerlStdIO -{ -public: - virtual PerlIO* Stdin(void) = 0; - virtual PerlIO* Stdout(void) = 0; - virtual PerlIO* Stderr(void) = 0; - virtual PerlIO* Open(const char *, const char *, int &err) = 0; - virtual int Close(PerlIO*, int &err) = 0; - virtual int Eof(PerlIO*, int &err) = 0; - virtual int Error(PerlIO*, int &err) = 0; - virtual void Clearerr(PerlIO*, int &err) = 0; - virtual int Getc(PerlIO*, int &err) = 0; - virtual char* GetBase(PerlIO *, int &err) = 0; - virtual int GetBufsiz(PerlIO *, int &err) = 0; - virtual int GetCnt(PerlIO *, int &err) = 0; - virtual char* GetPtr(PerlIO *, int &err) = 0; - virtual char* Gets(PerlIO*, char*, int, int& err) = 0; - virtual int Putc(PerlIO*, int, int &err) = 0; - virtual int Puts(PerlIO*, const char *, int &err) = 0; - virtual int Flush(PerlIO*, int &err) = 0; - virtual int Ungetc(PerlIO*,int, int &err) = 0; - virtual int Fileno(PerlIO*, int &err) = 0; - virtual PerlIO* Fdopen(int, const char *, int &err) = 0; - virtual PerlIO* Reopen(const char*, const char*, PerlIO*, int &err) = 0; - virtual SSize_t Read(PerlIO*,void *,Size_t, int &err) = 0; - virtual SSize_t Write(PerlIO*,const void *,Size_t, int &err) = 0; - virtual void SetBuf(PerlIO *, char*, int &err) = 0; - virtual int SetVBuf(PerlIO *, char*, int, Size_t, int &err) = 0; - virtual void SetCnt(PerlIO *, int, int &err) = 0; - virtual void SetPtrCnt(PerlIO *, char *, int, int& err) = 0; - virtual void Setlinebuf(PerlIO*, int &err) = 0; - virtual int Printf(PerlIO*, int &err, const char *,...) = 0; - virtual int Vprintf(PerlIO*, int &err, const char *, va_list) = 0; - virtual long Tell(PerlIO*, int &err) = 0; - virtual int Seek(PerlIO*, off_t, int, int &err) = 0; - virtual void Rewind(PerlIO*, int &err) = 0; - virtual PerlIO* Tmpfile(int &err) = 0; - virtual int Getpos(PerlIO*, Fpos_t *, int &err) = 0; - virtual int Setpos(PerlIO*, const Fpos_t *, int &err) = 0; - virtual void Init(int &err) = 0; - virtual void InitOSExtras(void* p) = 0; -#ifdef WIN32 - virtual int OpenOSfhandle(long osfhandle, int flags) = 0; - virtual int GetOSfhandle(int filenum) = 0; -#endif -}; - -#endif /* __Inc__IPerlStdIO___ */ - diff --git a/mg.h b/mg.h index 1490470..16efdb5 100644 --- a/mg.h +++ b/mg.h @@ -7,6 +7,9 @@ * */ +#ifdef STRUCT_MGVTBL_DEFINITION +STRUCT_MGVTBL_DEFINITION; +#else struct mgvtbl { int (CPERLscope(*svt_get)) _((SV *sv, MAGIC* mg)); int (CPERLscope(*svt_set)) _((SV *sv, MAGIC* mg)); @@ -14,6 +17,7 @@ struct mgvtbl { int (CPERLscope(*svt_clear)) _((SV *sv, MAGIC* mg)); int (CPERLscope(*svt_free)) _((SV *sv, MAGIC* mg)); }; +#endif struct magic { MAGIC* mg_moremagic; diff --git a/op.h b/op.h index 7c60aec..fee95f7 100644 --- a/op.h +++ b/op.h @@ -32,6 +32,9 @@ typedef U32 PADOFFSET; #define OPCODE U16 #endif +#ifdef BASEOP_DEFINITION +#define BASEOP BASEOP_DEFINITION +#else #define BASEOP \ OP* op_next; \ OP* op_sibling; \ @@ -41,6 +44,7 @@ typedef U32 PADOFFSET; U16 op_seq; \ U8 op_flags; \ U8 op_private; +#endif #define OP_GIMME(op,dfl) \ (((op)->op_flags & OPf_WANT) == OPf_WANT_VOID ? G_VOID : \ diff --git a/perl.h b/perl.h index c8bd8b5..7df5f89 100644 --- a/perl.h +++ b/perl.h @@ -90,8 +90,8 @@ are local to a function. PERL HOST 1. The perl host is linked with perlX.lib to get perl_alloc. This function will return a pointer to CPerlObj (the PERL_OBJECT). It -takes pointers to the various PerlXXX_YYY interfaces (see ipdir.h for -information on this). +takes pointers to the various PerlXXX_YYY interfaces (see iperlsys.h +for more information on this). 2. The perl host calls the same functions as normally would be called in setting up and running a perl script, except that the functions are now member functions of the PERL_OBJECT. @@ -312,13 +312,7 @@ register struct op *op asm(stringify(OP_IN_REGISTER)); # endif #endif -#include "perlio.h" -#include "perlmem.h" -#include "perllio.h" -#include "perlsock.h" -#include "perlproc.h" -#include "perlenv.h" -#include "perldir.h" +#include "iperlsys.h" #ifdef USE_NEXT_CTYPE @@ -1207,17 +1201,17 @@ typedef pthread_key_t perl_key; # endif #endif +#ifdef UNION_ANY_DEFINITION +UNION_ANY_DEFINITION; +#else union any { void* any_ptr; I32 any_i32; IV any_iv; long any_long; void (CPERLscope(*any_dptr)) _((void*)); -#if defined(WIN32) && !defined(PERL_OBJECT) - /* Visual C thinks that a pointer to a member variable is 16 bytes in size. */ - char handle_VC_problem[16]; -#endif }; +#endif #ifdef USE_THREADS #define ARGSproto struct perl_thread *thr diff --git a/perldir.h b/perldir.h deleted file mode 100644 index 0272bac..0000000 --- a/perldir.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef H_PERLDIR -#define H_PERLDIR 1 - -#ifdef PERL_OBJECT - -#include "ipdir.h" - -#define PerlDir_mkdir(name, mode) piDir->Makedir((name), (mode), ErrorNo()) -#define PerlDir_chdir(name) piDir->Chdir((name), ErrorNo()) -#define PerlDir_rmdir(name) piDir->Rmdir((name), ErrorNo()) -#define PerlDir_close(dir) piDir->Close((dir), ErrorNo()) -#define PerlDir_open(name) piDir->Open((name), ErrorNo()) -#define PerlDir_read(dir) piDir->Read((dir), ErrorNo()) -#define PerlDir_rewind(dir) piDir->Rewind((dir), ErrorNo()) -#define PerlDir_seek(dir, loc) piDir->Seek((dir), (loc), ErrorNo()) -#define PerlDir_tell(dir) piDir->Tell((dir), ErrorNo()) -#else -#define PerlDir_mkdir(name, mode) Mkdir((name), (mode)) -#ifdef VMS -# define PerlDir_chdir(name) chdir(((name) && *(name)) ? (name) : "SYS$LOGIN") -#else -# define PerlDir_chdir(name) chdir((name)) -#endif -#define PerlDir_rmdir(name) rmdir((name)) -#define PerlDir_close(dir) closedir((dir)) -#define PerlDir_open(name) opendir((name)) -#define PerlDir_read(dir) readdir((dir)) -#define PerlDir_rewind(dir) rewinddir((dir)) -#define PerlDir_seek(dir, loc) seekdir((dir), (loc)) -#define PerlDir_tell(dir) telldir((dir)) -#endif /* PERL_OBJECT */ - -#endif /* Include guard */ - diff --git a/perlenv.h b/perlenv.h deleted file mode 100644 index 07cce76..0000000 --- a/perlenv.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef H_PERLENV -#define H_PERLENV 1 - -#ifdef PERL_OBJECT - -#include "ipenv.h" - -#define PerlEnv_putenv(str) piENV->Putenv((str), ErrorNo()) -#define PerlEnv_getenv(str) piENV->Getenv((str), ErrorNo()) -#ifdef WIN32 -#define PerlEnv_lib_path(str) piENV->LibPath((str)) -#define PerlEnv_sitelib_path(str) piENV->SiteLibPath((str)) -#endif -#else -#define PerlEnv_putenv(str) putenv((str)) -#define PerlEnv_getenv(str) getenv((str)) -#endif /* PERL_OBJECT */ - -#endif /* Include guard */ diff --git a/perlio.c b/perlio.c index c293f54..314881e 100644 --- a/perlio.c +++ b/perlio.c @@ -16,7 +16,7 @@ #endif /* * This file provides those parts of PerlIO abstraction - * which are not #defined in perlio.h. + * which are not #defined in iperlsys.h. * Which these are depends on various Configure #ifdef's */ diff --git a/perlio.h b/perlio.h deleted file mode 100644 index 8d453a5..0000000 --- a/perlio.h +++ /dev/null @@ -1,251 +0,0 @@ -#ifndef H_PERLIO -#define H_PERLIO 1 - -/* Clean up (or at least document) the various possible #defines. - This section attempts to match the 5.003_03 Configure variables - onto the 5.003_02 header file values. - I can't figure out where USE_STDIO was supposed to be set. - --AD -*/ -#ifndef USE_PERLIO -# define PERLIO_IS_STDIO -#endif - -/* Below is the 5.003_02 stuff. */ -#ifdef USE_STDIO -# ifndef PERLIO_IS_STDIO -# define PERLIO_IS_STDIO -# endif -#else -extern void PerlIO_init _((void)); -#endif - -#ifdef PERL_OBJECT - -#include "ipstdio.h" - -#define PerlIO_canset_cnt(f) 1 -#define PerlIO_has_base(f) 1 -#define PerlIO_has_cntptr(f) 1 -#define PerlIO_fast_gets(f) 1 - -#define PerlIO_stdin() piStdIO->Stdin() -#define PerlIO_stdout() piStdIO->Stdout() -#define PerlIO_stderr() piStdIO->Stderr() -#define PerlIO_open(x,y) piStdIO->Open((x),(y), ErrorNo()) -#define PerlIO_close(f) piStdIO->Close((f), ErrorNo()) -#define PerlIO_eof(f) piStdIO->Eof((f), ErrorNo()) -#define PerlIO_error(f) piStdIO->Error((f), ErrorNo()) -#define PerlIO_clearerr(f) piStdIO->Clearerr((f), ErrorNo()) -#define PerlIO_getc(f) piStdIO->Getc((f), ErrorNo()) -#define PerlIO_get_base(f) piStdIO->GetBase((f), ErrorNo()) -#define PerlIO_get_bufsiz(f) piStdIO->GetBufsiz((f), ErrorNo()) -#define PerlIO_get_cnt(f) piStdIO->GetCnt((f), ErrorNo()) -#define PerlIO_get_ptr(f) piStdIO->GetPtr((f), ErrorNo()) -#define PerlIO_putc(f,c) piStdIO->Putc((f),(c), ErrorNo()) -#define PerlIO_puts(f,s) piStdIO->Puts((f),(s), ErrorNo()) -#define PerlIO_flush(f) piStdIO->Flush((f), ErrorNo()) -#define PerlIO_gets(s, n, fp) piStdIO->Gets((fp), s, n, ErrorNo()) -#define PerlIO_ungetc(f,c) piStdIO->Ungetc((f),(c), ErrorNo()) -#define PerlIO_fileno(f) piStdIO->Fileno((f), ErrorNo()) -#define PerlIO_fdopen(f, s) piStdIO->Fdopen((f),(s), ErrorNo()) -#define PerlIO_reopen(p, m, f) piStdIO->Reopen((p), (m), (f), ErrorNo()) -#define PerlIO_read(f,buf,count) (SSize_t)piStdIO->Read((f), (buf), (count), ErrorNo()) -#define PerlIO_write(f,buf,count) piStdIO->Write((f), (buf), (count), ErrorNo()) -#define PerlIO_setbuf(f,b) piStdIO->SetBuf((f), (b), ErrorNo()) -#define PerlIO_setvbuf(f,b,t,s) piStdIO->SetVBuf((f), (b), (t), (s), ErrorNo()) -#define PerlIO_set_cnt(f,c) piStdIO->SetCnt((f), (c), ErrorNo()) -#define PerlIO_set_ptrcnt(f,p,c) piStdIO->SetPtrCnt((f), (p), (c), ErrorNo()) -#define PerlIO_setlinebuf(f) piStdIO->Setlinebuf((f), ErrorNo()) -#define PerlIO_printf fprintf -#define PerlIO_stdoutf piStdIO->Printf -#define PerlIO_vprintf(f,fmt,a) piStdIO->Vprintf((f), ErrorNo(), (fmt),a) -#define PerlIO_tell(f) piStdIO->Tell((f), ErrorNo()) -#define PerlIO_seek(f,o,w) piStdIO->Seek((f),(o),(w), ErrorNo()) -#define PerlIO_getpos(f,p) piStdIO->Getpos((f),(p), ErrorNo()) -#define PerlIO_setpos(f,p) piStdIO->Setpos((f),(p), ErrorNo()) -#define PerlIO_rewind(f) piStdIO->Rewind((f), ErrorNo()) -#define PerlIO_tmpfile() piStdIO->Tmpfile(ErrorNo()) -#define PerlIO_init() piStdIO->Init(ErrorNo()) -#undef init_os_extras -#define init_os_extras() piStdIO->InitOSExtras(this) - -#else -#include "perlsdio.h" -#endif - -#ifndef PERLIO_IS_STDIO -#ifdef USE_SFIO -#include "perlsfio.h" -#endif /* USE_SFIO */ -#endif /* PERLIO_IS_STDIO */ - -#ifndef EOF -#define EOF (-1) -#endif - -/* This is to catch case with no stdio */ -#ifndef BUFSIZ -#define BUFSIZ 1024 -#endif - -#ifndef SEEK_SET -#define SEEK_SET 0 -#endif - -#ifndef SEEK_CUR -#define SEEK_CUR 1 -#endif - -#ifndef SEEK_END -#define SEEK_END 2 -#endif - -#ifndef PerlIO -struct _PerlIO; -#define PerlIO struct _PerlIO -#endif /* No PerlIO */ - -#ifndef Fpos_t -#define Fpos_t long -#endif - -#ifndef NEXT30_NO_ATTRIBUTE -#ifndef HASATTRIBUTE /* disable GNU-cc attribute checking? */ -#ifdef __attribute__ /* Avoid possible redefinition errors */ -#undef __attribute__ -#endif -#define __attribute__(attr) -#endif -#endif - -#ifndef PerlIO_stdoutf -extern int PerlIO_stdoutf _((const char *,...)) - __attribute__((format (printf, 1, 2))); -#endif -#ifndef PerlIO_puts -extern int PerlIO_puts _((PerlIO *,const char *)); -#endif -#ifndef PerlIO_open -extern PerlIO * PerlIO_open _((const char *,const char *)); -#endif -#ifndef PerlIO_close -extern int PerlIO_close _((PerlIO *)); -#endif -#ifndef PerlIO_eof -extern int PerlIO_eof _((PerlIO *)); -#endif -#ifndef PerlIO_error -extern int PerlIO_error _((PerlIO *)); -#endif -#ifndef PerlIO_clearerr -extern void PerlIO_clearerr _((PerlIO *)); -#endif -#ifndef PerlIO_getc -extern int PerlIO_getc _((PerlIO *)); -#endif -#ifndef PerlIO_putc -extern int PerlIO_putc _((PerlIO *,int)); -#endif -#ifndef PerlIO_flush -extern int PerlIO_flush _((PerlIO *)); -#endif -#ifndef PerlIO_ungetc -extern int PerlIO_ungetc _((PerlIO *,int)); -#endif -#ifndef PerlIO_fileno -extern int PerlIO_fileno _((PerlIO *)); -#endif -#ifndef PerlIO_fdopen -extern PerlIO * PerlIO_fdopen _((int, const char *)); -#endif -#ifndef PerlIO_importFILE -extern PerlIO * PerlIO_importFILE _((FILE *,int)); -#endif -#ifndef PerlIO_exportFILE -extern FILE * PerlIO_exportFILE _((PerlIO *,int)); -#endif -#ifndef PerlIO_findFILE -extern FILE * PerlIO_findFILE _((PerlIO *)); -#endif -#ifndef PerlIO_releaseFILE -extern void PerlIO_releaseFILE _((PerlIO *,FILE *)); -#endif -#ifndef PerlIO_read -extern SSize_t PerlIO_read _((PerlIO *,void *,Size_t)); -#endif -#ifndef PerlIO_write -extern SSize_t PerlIO_write _((PerlIO *,const void *,Size_t)); -#endif -#ifndef PerlIO_setlinebuf -extern void PerlIO_setlinebuf _((PerlIO *)); -#endif -#ifndef PerlIO_printf -extern int PerlIO_printf _((PerlIO *, const char *,...)) - __attribute__((format (printf, 2, 3))); -#endif -#ifndef PerlIO_sprintf -extern int PerlIO_sprintf _((char *, int, const char *,...)) - __attribute__((format (printf, 3, 4))); -#endif -#ifndef PerlIO_vprintf -extern int PerlIO_vprintf _((PerlIO *, const char *, va_list)); -#endif -#ifndef PerlIO_tell -extern long PerlIO_tell _((PerlIO *)); -#endif -#ifndef PerlIO_seek -extern int PerlIO_seek _((PerlIO *,off_t,int)); -#endif -#ifndef PerlIO_rewind -extern void PerlIO_rewind _((PerlIO *)); -#endif -#ifndef PerlIO_has_base -extern int PerlIO_has_base _((PerlIO *)); -#endif -#ifndef PerlIO_has_cntptr -extern int PerlIO_has_cntptr _((PerlIO *)); -#endif -#ifndef PerlIO_fast_gets -extern int PerlIO_fast_gets _((PerlIO *)); -#endif -#ifndef PerlIO_canset_cnt -extern int PerlIO_canset_cnt _((PerlIO *)); -#endif -#ifndef PerlIO_get_ptr -extern STDCHAR * PerlIO_get_ptr _((PerlIO *)); -#endif -#ifndef PerlIO_get_cnt -extern int PerlIO_get_cnt _((PerlIO *)); -#endif -#ifndef PerlIO_set_cnt -extern void PerlIO_set_cnt _((PerlIO *,int)); -#endif -#ifndef PerlIO_set_ptrcnt -extern void PerlIO_set_ptrcnt _((PerlIO *,STDCHAR *,int)); -#endif -#ifndef PerlIO_get_base -extern STDCHAR * PerlIO_get_base _((PerlIO *)); -#endif -#ifndef PerlIO_get_bufsiz -extern int PerlIO_get_bufsiz _((PerlIO *)); -#endif -#ifndef PerlIO_tmpfile -extern PerlIO * PerlIO_tmpfile _((void)); -#endif -#ifndef PerlIO_stdin -extern PerlIO * PerlIO_stdin _((void)); -#endif -#ifndef PerlIO_stdout -extern PerlIO * PerlIO_stdout _((void)); -#endif -#ifndef PerlIO_stderr -extern PerlIO * PerlIO_stderr _((void)); -#endif -#ifndef PerlIO_getpos -extern int PerlIO_getpos _((PerlIO *,Fpos_t *)); -#endif -#ifndef PerlIO_setpos -extern int PerlIO_setpos _((PerlIO *,const Fpos_t *)); -#endif -#endif /* Include guard */ diff --git a/perllio.h b/perllio.h deleted file mode 100644 index 8ae606d..0000000 --- a/perllio.h +++ /dev/null @@ -1,63 +0,0 @@ -#ifndef H_PERLLIO -#define H_PERLLIO 1 - -#ifdef PERL_OBJECT - -#include "iplio.h" - -#define PerlLIO_access(file, mode) piLIO->Access((file), (mode), ErrorNo()) -#define PerlLIO_chmod(file, mode) piLIO->Chmod((file), (mode), ErrorNo()) -#define PerlLIO_chown(file, owner, group) piLIO->Chown((file), (owner), (group), ErrorNo()) -#define PerlLIO_chsize(fd, size) piLIO->Chsize((fd), (size), ErrorNo()) -#define PerlLIO_close(fd) piLIO->Close((fd), ErrorNo()) -#define PerlLIO_dup(fd) piLIO->Dup((fd), ErrorNo()) -#define PerlLIO_dup2(fd1, fd2) piLIO->Dup2((fd1), (fd2), ErrorNo()) -#define PerlLIO_flock(fd, op) piLIO->Flock((fd), (op), ErrorNo()) -#define PerlLIO_fstat(fd, buf) piLIO->FileStat((fd), (buf), ErrorNo()) -#define PerlLIO_ioctl(fd, u, buf) piLIO->IOCtl((fd), (u), (buf), ErrorNo()) -#define PerlLIO_isatty(fd) piLIO->Isatty((fd), ErrorNo()) -#define PerlLIO_lseek(fd, offset, mode) piLIO->Lseek((fd), (offset), (mode), ErrorNo()) -#define PerlLIO_lstat(name, buf) piLIO->Lstat((name), (buf), ErrorNo()) -#define PerlLIO_mktemp(file) piLIO->Mktemp((file), ErrorNo()) -#define PerlLIO_open(file, flag) piLIO->Open((file), (flag), ErrorNo()) -#define PerlLIO_open3(file, flag, perm) piLIO->Open((file), (flag), (perm), ErrorNo()) -#define PerlLIO_read(fd, buf, count) piLIO->Read((fd), (buf), (count), ErrorNo()) -#define PerlLIO_rename(oldname, newname) piLIO->Rename((oldname), (newname), ErrorNo()) -#define PerlLIO_setmode(fd, mode) piLIO->Setmode((fd), (mode), ErrorNo()) -#define PerlLIO_stat(name, buf) piLIO->NameStat((name), (buf), ErrorNo()) -#define PerlLIO_tmpnam(str) piLIO->Tmpnam((str), ErrorNo()) -#define PerlLIO_umask(mode) piLIO->Umask((mode), ErrorNo()) -#define PerlLIO_unlink(file) piLIO->Unlink((file), ErrorNo()) -#define PerlLIO_utime(file, time) piLIO->Utime((file), (time), ErrorNo()) -#define PerlLIO_write(fd, buf, count) piLIO->Write((fd), (buf), (count), ErrorNo()) -#else -#define PerlLIO_access(file, mode) access((file), (mode)) -#define PerlLIO_chmod(file, mode) chmod((file), (mode)) -#define PerlLIO_chown(file, owner, group) chown((file), (owner), (group)) -#define PerlLIO_chsize(fd, size) chsize((fd), (size)) -#define PerlLIO_close(fd) close((fd)) -#define PerlLIO_dup(fd) dup((fd)) -#define PerlLIO_dup2(fd1, fd2) dup2((fd1), (fd2)) -#define PerlLIO_flock(fd, op) FLOCK((fd), (op)) -#define PerlLIO_fstat(fd, buf) Fstat((fd), (buf)) -#define PerlLIO_ioctl(fd, u, buf) ioctl((fd), (u), (buf)) -#define PerlLIO_isatty(fd) isatty((fd)) -#define PerlLIO_lseek(fd, offset, mode) lseek((fd), (offset), (mode)) -#define PerlLIO_lstat(name, buf) lstat((name), (buf)) -#define PerlLIO_mktemp(file) mktemp((file)) -#define PerlLIO_mkstemp(file) mkstemp((file)) -#define PerlLIO_open(file, flag) open((file), (flag)) -#define PerlLIO_open3(file, flag, perm) open((file), (flag), (perm)) -#define PerlLIO_read(fd, buf, count) read((fd), (buf), (count)) -#define PerlLIO_rename(oldname, newname) rename((oldname), (newname)) -#define PerlLIO_setmode(fd, mode) setmode((fd), (mode)) -#define PerlLIO_stat(name, buf) Stat((name), (buf)) -#define PerlLIO_tmpnam(str) tmpnam((str)) -#define PerlLIO_umask(mode) umask((mode)) -#define PerlLIO_unlink(file) unlink((file)) -#define PerlLIO_utime(file, time) utime((file), (time)) -#define PerlLIO_write(fd, buf, count) write((fd), (buf), (count)) -#endif /* PERL_OBJECT */ - -#endif /* Include guard */ - diff --git a/perlmem.h b/perlmem.h deleted file mode 100644 index 5c2efdb..0000000 --- a/perlmem.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef H_PERLMEM -#define H_PERLMEM 1 - -#ifdef PERL_OBJECT - -#include "ipmem.h" - -#define PerlMem_malloc(size) piMem->Malloc((size)) -#define PerlMem_realloc(buf, size) piMem->Realloc((buf), (size)) -#define PerlMem_free(buf) piMem->Free((buf)) -#else -#define PerlMem_malloc(size) malloc((size)) -#define PerlMem_realloc(buf, size) realloc((buf), (size)) -#define PerlMem_free(buf) free((buf)) - -#endif /* PERL_OBJECT */ - -#endif /* Include guard */ - diff --git a/perlproc.h b/perlproc.h deleted file mode 100644 index adf66a2..0000000 --- a/perlproc.h +++ /dev/null @@ -1,71 +0,0 @@ -#ifndef H_PERLPROC -#define H_PERLPROC 1 - -#ifdef PERL_OBJECT - -#include "ipproc.h" - -#define PerlProc_abort() piProc->Abort() -#define PerlProc_exit(s) piProc->Exit((s)) -#define PerlProc__exit(s) piProc->_Exit((s)) -#define PerlProc_execl(c, w, x, y, z) piProc->Execl((c), (w), (x), (y), (z)) -#define PerlProc_execv(c, a) piProc->Execv((c), (a)) -#define PerlProc_execvp(c, a) piProc->Execvp((c), (a)) -#define PerlProc_getuid() piProc->Getuid() -#define PerlProc_geteuid() piProc->Geteuid() -#define PerlProc_getgid() piProc->Getgid() -#define PerlProc_getegid() piProc->Getegid() -#define PerlProc_getlogin() piProc->Getlogin() -#define PerlProc_kill(i, a) piProc->Kill((i), (a)) -#define PerlProc_killpg(i, a) piProc->Killpg((i), (a)) -#define PerlProc_pause() piProc->PauseProc() -#define PerlProc_popen(c, m) piProc->Popen((c), (m)) -#define PerlProc_pclose(f) piProc->Pclose((f)) -#define PerlProc_pipe(fd) piProc->Pipe((fd)) -#define PerlProc_setuid(u) piProc->Setuid((u)) -#define PerlProc_setgid(g) piProc->Setgid((g)) -#define PerlProc_sleep(t) piProc->Sleep((t)) -#define PerlProc_times(t) piProc->Times((t)) -#define PerlProc_wait(t) piProc->Wait((t)) -#define PerlProc_waitpid(p, s, f) piProc->Waitpid((p), (s), (f)) -#define PerlProc_setjmp(b, n) Sigsetjmp((b), (n)) -#define PerlProc_longjmp(b, n) Siglongjmp((b), (n)) -#define PerlProc_signal(n, h) piProc->Signal((n), (h)) -#ifdef WIN32 -#define PerlProc_GetSysMsg(s,l,e) piProc->GetSysMsg((s), (l), (e)) -#define PerlProc_FreeBuf(s) piProc->FreeBuf((s)) -#define PerlProc_Cmd(s) piProc->DoCmd((s)) -#define do_spawn(s) piProc->Spawn((s)) -#define do_spawnvp(m, c, a) piProc->Spawnvp((m), (c), (a)) -#define PerlProc_aspawn(m, c, a) piProc->ASpawn((m), (c), (a)) -#endif -#else -#define PerlProc_abort() abort() -#define PerlProc_exit(s) exit((s)) -#define PerlProc__exit(s) _exit((s)) -#define PerlProc_execl(c, w, x, y, z) execl((c), (w), (x), (y), (z)) -#define PerlProc_execv(c, a) execv((c), (a)) -#define PerlProc_execvp(c, a) execvp((c), (a)) -#define PerlProc_getuid() getuid() -#define PerlProc_geteuid() geteuid() -#define PerlProc_getgid() getgid() -#define PerlProc_getegid() getegid() -#define PerlProc_getlogin() getlogin() -#define PerlProc_kill(i, a) kill((i), (a)) -#define PerlProc_killpg(i, a) killpg((i), (a)) -#define PerlProc_pause() Pause() -#define PerlProc_popen(c, m) my_popen((c), (m)) -#define PerlProc_pclose(f) my_pclose((f)) -#define PerlProc_pipe(fd) pipe((fd)) -#define PerlProc_setuid(u) setuid((u)) -#define PerlProc_setgid(g) setgid((g)) -#define PerlProc_sleep(t) sleep((t)) -#define PerlProc_times(t) times((t)) -#define PerlProc_wait(t) wait((t)) -#define PerlProc_waitpid(p, s, f) waitpid((p), (s), (f)) -#define PerlProc_setjmp(b, n) Sigsetjmp((b), (n)) -#define PerlProc_longjmp(b, n) Siglongjmp((b), (n)) -#define PerlProc_signal(n, h) signal((n), (h)) -#endif /* PERL_OBJECT */ - -#endif /* Include guard */ diff --git a/perlsock.h b/perlsock.h deleted file mode 100644 index 70350be..0000000 --- a/perlsock.h +++ /dev/null @@ -1,102 +0,0 @@ -#ifndef H_PERLSOCK -#define H_PERLSOCK 1 - -#ifdef PERL_OBJECT - -#include "ipsock.h" - -#define PerlSock_htonl(x) piSock->Htonl(x) -#define PerlSock_htons(x) piSock->Htons(x) -#define PerlSock_ntohl(x) piSock->Ntohl(x) -#define PerlSock_ntohs(x) piSock->Ntohs(x) -#define PerlSock_accept(s, a, l) piSock->Accept(s, a, l, ErrorNo()) -#define PerlSock_bind(s, n, l) piSock->Bind(s, n, l, ErrorNo()) -#define PerlSock_connect(s, n, l) piSock->Connect(s, n, l, ErrorNo()) -#define PerlSock_endhostent() piSock->Endhostent(ErrorNo()) -#define PerlSock_endnetent() piSock->Endnetent(ErrorNo()) -#define PerlSock_endprotoent() piSock->Endprotoent(ErrorNo()) -#define PerlSock_endservent() piSock->Endservent(ErrorNo()) -#define PerlSock_gethostbyaddr(a, l, t) piSock->Gethostbyaddr(a, l, t, ErrorNo()) -#define PerlSock_gethostbyname(n) piSock->Gethostbyname(n, ErrorNo()) -#define PerlSock_gethostent() piSock->Gethostent(ErrorNo()) -#define PerlSock_gethostname(n, l) piSock->Gethostname(n, l, ErrorNo()) -#define PerlSock_getnetbyaddr(n, t) piSock->Getnetbyaddr(n, t, ErrorNo()) -#define PerlSock_getnetbyname(c) piSock->Getnetbyname(c, ErrorNo()) -#define PerlSock_getnetent() piSock->Getnetent(ErrorNo()) -#define PerlSock_getpeername(s, n, l) piSock->Getpeername(s, n, l, ErrorNo()) -#define PerlSock_getprotobyname(n) piSock->Getprotobyname(n, ErrorNo()) -#define PerlSock_getprotobynumber(n) piSock->Getprotobynumber(n, ErrorNo()) -#define PerlSock_getprotoent() piSock->Getprotoent(ErrorNo()) -#define PerlSock_getservbyname(n, p) piSock->Getservbyname(n, p, ErrorNo()) -#define PerlSock_getservbyport(port, p) piSock->Getservbyport(port, p, ErrorNo()) -#define PerlSock_getservent() piSock->Getservent(ErrorNo()) -#define PerlSock_getsockname(s, n, l) piSock->Getsockname(s, n, l, ErrorNo()) -#define PerlSock_getsockopt(s, l, n, v, i) piSock->Getsockopt(s, l, n, v, i, ErrorNo()) -#define PerlSock_inet_addr(c) piSock->InetAddr(c, ErrorNo()) -#define PerlSock_inet_ntoa(i) piSock->InetNtoa(i, ErrorNo()) -#define PerlSock_listen(s, b) piSock->Listen(s, b, ErrorNo()) -#define PerlSock_recv(s, b, l, f) piSock->Recv(s, b, l, f, ErrorNo()) -#define PerlSock_recvfrom(s, b, l, f, from, fromlen) piSock->Recvfrom(s, b, l, f, from, fromlen, ErrorNo()) -#define PerlSock_select(n, r, w, e, t) piSock->Select(n, (char*)r, (char*)w, (char*)e, t, ErrorNo()) -#define PerlSock_send(s, b, l, f) piSock->Send(s, b, l, f, ErrorNo()) -#define PerlSock_sendto(s, b, l, f, t, tlen) piSock->Sendto(s, b, l, f, t, tlen, ErrorNo()) -#define PerlSock_sethostent(f) piSock->Sethostent(f, ErrorNo()) -#define PerlSock_setnetent(f) piSock->Setnetent(f, ErrorNo()) -#define PerlSock_setprotoent(f) piSock->Setprotoent(f, ErrorNo()) -#define PerlSock_setservent(f) piSock->Setservent(f, ErrorNo()) -#define PerlSock_setsockopt(s, l, n, v, len) piSock->Setsockopt(s, l, n, v, len, ErrorNo()) -#define PerlSock_shutdown(s, h) piSock->Shutdown(s, h, ErrorNo()) -#define PerlSock_socket(a, t, p) piSock->Socket(a, t, p, ErrorNo()) -#define PerlSock_socketpair(a, t, p, f) piSock->Socketpair(a, t, p, f, ErrorNo()) -#else -#define PerlSock_htonl(x) htonl(x) -#define PerlSock_htons(x) htons(x) -#define PerlSock_ntohl(x) ntohl(x) -#define PerlSock_ntohs(x) ntohs(x) -#define PerlSock_accept(s, a, l) accept(s, a, l) -#define PerlSock_bind(s, n, l) bind(s, n, l) -#define PerlSock_connect(s, n, l) connect(s, n, l) - -#define PerlSock_gethostbyaddr(a, l, t) gethostbyaddr(a, l, t) -#define PerlSock_gethostbyname(n) gethostbyname(n) -#define PerlSock_gethostent gethostent -#define PerlSock_endhostent endhostent -#define PerlSock_gethostname(n, l) gethostname(n, l) - -#define PerlSock_getnetbyaddr(n, t) getnetbyaddr(n, t) -#define PerlSock_getnetbyname(n) getnetbyname(n) -#define PerlSock_getnetent getnetent -#define PerlSock_endnetent endnetent -#define PerlSock_getpeername(s, n, l) getpeername(s, n, l) - -#define PerlSock_getprotobyname(n) getprotobyname(n) -#define PerlSock_getprotobynumber(n) getprotobynumber(n) -#define PerlSock_getprotoent getprotoent -#define PerlSock_endprotoent endprotoent - -#define PerlSock_getservbyname(n, p) getservbyname(n, p) -#define PerlSock_getservbyport(port, p) getservbyport(port, p) -#define PerlSock_getservent getservent -#define PerlSock_endservent endservent - -#define PerlSock_getsockname(s, n, l) getsockname(s, n, l) -#define PerlSock_getsockopt(s, l, n, v, i) getsockopt(s, l, n, v, i) -#define PerlSock_inet_addr(c) inet_addr(c) -#define PerlSock_inet_ntoa(i) inet_ntoa(i) -#define PerlSock_listen(s, b) listen(s, b) -#define PerlSock_recvfrom(s, b, l, f, from, fromlen) recvfrom(s, b, l, f, from, fromlen) -#define PerlSock_select(n, r, w, e, t) select(n, r, w, e, t) -#define PerlSock_send(s, b, l, f) send(s, b, l, f) -#define PerlSock_sendto(s, b, l, f, t, tlen) sendto(s, b, l, f, t, tlen) -#define PerlSock_sethostent(f) sethostent(f) -#define PerlSock_setnetent(f) setnetent(f) -#define PerlSock_setprotoent(f) setprotoent(f) -#define PerlSock_setservent(f) setservent(f) -#define PerlSock_setsockopt(s, l, n, v, len) setsockopt(s, l, n, v, len) -#define PerlSock_shutdown(s, h) shutdown(s, h) -#define PerlSock_socket(a, t, p) socket(a, t, p) -#define PerlSock_socketpair(a, t, p, f) socketpair(a, t, p, f) -#endif /* PERL_OBJECT */ - -#endif /* Include guard */ - diff --git a/proto.h b/proto.h index 78e6c1b..c8f6a43 100644 --- a/proto.h +++ b/proto.h @@ -1,11 +1,4 @@ #ifdef PERL_OBJECT -#include "ipstdio.h" -#include "ipdir.h" -#include "ipenv.h" -#include "iplio.h" -#include "ipmem.h" -#include "ipproc.h" -#include "ipsock.h" #define VIRTUAL virtual #else #define VIRTUAL diff --git a/util.c b/util.c index 2fa7740..0e0f3df 100644 --- a/util.c +++ b/util.c @@ -14,7 +14,6 @@ #include "EXTERN.h" #include "perl.h" -#include "perlmem.h" #if !defined(NSIG) || defined(M_UNIX) || defined(M_XENIX) #include diff --git a/win32/Makefile b/win32/Makefile index a38e2d9..a0f1d00 100644 --- a/win32/Makefile +++ b/win32/Makefile @@ -397,12 +397,12 @@ CORE_NOCFG_H = \ ..\gv.h \ ..\handy.h \ ..\hv.h \ + ..\iperlsys.h \ ..\mg.h \ ..\nostdio.h \ ..\op.h \ ..\opcode.h \ ..\perl.h \ - ..\perlio.h \ ..\perlsdio.h \ ..\perlsfio.h \ ..\perly.h \ diff --git a/win32/dl_win32.xs b/win32/dl_win32.xs index a5183c3..c650acf 100644 --- a/win32/dl_win32.xs +++ b/win32/dl_win32.xs @@ -37,7 +37,7 @@ calls. static SV *error_sv; static char * -OS_Error_String(void) +OS_Error_String(CPERLarg) { DWORD err = GetLastError(); STRLEN len; @@ -110,7 +110,8 @@ dl_load_file(filename,flags=0) DLDEBUG(2,PerlIO_printf(PerlIO_stderr()," libref=%x\n", RETVAL)); ST(0) = sv_newmortal() ; if (RETVAL == NULL) - SaveError(PERL_OBJECT_THIS_ "load_file:%s",OS_Error_String()) ; + SaveError(PERL_OBJECT_THIS_ "load_file:%s", + OS_Error_String(PERL_OBJECT_THIS)) ; else sv_setiv( ST(0), (IV)RETVAL); @@ -126,7 +127,8 @@ dl_find_symbol(libhandle, symbolname) DLDEBUG(2,PerlIO_printf(PerlIO_stderr()," symbolref = %x\n", RETVAL)); ST(0) = sv_newmortal() ; if (RETVAL == NULL) - SaveError(PERL_OBJECT_THIS_ "find_symbol:%s",OS_Error_String()) ; + SaveError(PERL_OBJECT_THIS_ "find_symbol:%s", + OS_Error_String(PERL_OBJECT_THIS)) ; else sv_setiv( ST(0), (IV)RETVAL); diff --git a/win32/makefile.mk b/win32/makefile.mk index b5650a8..f0e258d 100644 --- a/win32/makefile.mk +++ b/win32/makefile.mk @@ -511,12 +511,12 @@ CORE_NOCFG_H = \ ..\gv.h \ ..\handy.h \ ..\hv.h \ + ..\iperlsys.h \ ..\mg.h \ ..\nostdio.h \ ..\op.h \ ..\opcode.h \ ..\perl.h \ - ..\perlio.h \ ..\perlsdio.h \ ..\perlsfio.h \ ..\perly.h \ diff --git a/win32/perlhost.h b/win32/perlhost.h new file mode 100644 index 0000000..a4c2e3c --- /dev/null +++ b/win32/perlhost.h @@ -0,0 +1,971 @@ + +#include "iperlsys.h" + +extern CPerlObj *pPerl; + +#define CALLFUNC0RET(x)\ + int ret = x;\ + if (ret < 0)\ + err = errno;\ + return ret; + +#define PROCESS_AND_RETURN \ + if (errno) \ + err = errno; \ + return r + +#define CALLFUNCRET(x)\ + int ret = x;\ + if (ret)\ + err = errno;\ + return ret; + +#define CALLFUNCERR(x)\ + int ret = x;\ + if (errno)\ + err = errno;\ + return ret; + +#define LCALLFUNCERR(x)\ + long ret = x;\ + if (errno)\ + err = errno;\ + return ret; + +extern int g_closedir(DIR *dirp); +extern DIR * g_opendir(char *filename); +extern struct direct * g_readdir(DIR *dirp); +extern void g_rewinddir(DIR *dirp); +extern void g_seekdir(DIR *dirp, long loc); +extern long g_telldir(DIR *dirp); + +class CPerlDir : public IPerlDir +{ +public: + CPerlDir() {}; + virtual int Makedir(const char *dirname, int mode, int &err) + { + CALLFUNC0RET(win32_mkdir(dirname, mode)); + }; + virtual int Chdir(const char *dirname, int &err) + { + CALLFUNC0RET(win32_chdir(dirname)); + }; + virtual int Rmdir(const char *dirname, int &err) + { + CALLFUNC0RET(win32_rmdir(dirname)); + }; + virtual int Close(DIR *dirp, int &err) + { + return g_closedir(dirp); + }; + virtual DIR *Open(char *filename, int &err) + { + return g_opendir(filename); + }; + virtual struct direct *Read(DIR *dirp, int &err) + { + return g_readdir(dirp); + }; + virtual void Rewind(DIR *dirp, int &err) + { + g_rewinddir(dirp); + }; + virtual void Seek(DIR *dirp, long loc, int &err) + { + g_seekdir(dirp, loc); + }; + virtual long Tell(DIR *dirp, int &err) + { + return g_telldir(dirp); + }; +}; + + +extern char * g_win32_get_privlib(char *pl); +extern char * g_win32_get_sitelib(char *pl); + +class CPerlEnv : public IPerlEnv +{ +public: + CPerlEnv() {}; + virtual char *Getenv(const char *varname, int &err) + { + return win32_getenv(varname); + }; + virtual int Putenv(const char *envstring, int &err) + { + return putenv(envstring); + }; + virtual char* LibPath(char *pl) + { + return g_win32_get_privlib(pl); + }; + virtual char* SiteLibPath(char *pl) + { + return g_win32_get_sitelib(pl); + }; +}; + +class CPerlSock : public IPerlSock +{ +public: + CPerlSock() {}; + virtual u_long Htonl(u_long hostlong) + { + return win32_htonl(hostlong); + }; + virtual u_short Htons(u_short hostshort) + { + return win32_htons(hostshort); + }; + virtual u_long Ntohl(u_long netlong) + { + return win32_ntohl(netlong); + }; + virtual u_short Ntohs(u_short netshort) + { + return win32_ntohs(netshort); + } + + virtual SOCKET Accept(SOCKET s, struct sockaddr* addr, int* addrlen, int &err) + { + SOCKET r = win32_accept(s, addr, addrlen); + PROCESS_AND_RETURN; + }; + virtual int Bind(SOCKET s, const struct sockaddr* name, int namelen, int &err) + { + int r = win32_bind(s, name, namelen); + PROCESS_AND_RETURN; + }; + virtual int Connect(SOCKET s, const struct sockaddr* name, int namelen, int &err) + { + int r = win32_connect(s, name, namelen); + PROCESS_AND_RETURN; + }; + virtual void Endhostent(int &err) + { + win32_endhostent(); + }; + virtual void Endnetent(int &err) + { + win32_endnetent(); + }; + virtual void Endprotoent(int &err) + { + win32_endprotoent(); + }; + virtual void Endservent(int &err) + { + win32_endservent(); + }; + virtual struct hostent* Gethostbyaddr(const char* addr, int len, int type, int &err) + { + struct hostent *r = win32_gethostbyaddr(addr, len, type); + PROCESS_AND_RETURN; + }; + virtual struct hostent* Gethostbyname(const char* name, int &err) + { + struct hostent *r = win32_gethostbyname(name); + PROCESS_AND_RETURN; + }; + virtual struct hostent* Gethostent(int &err) + { + croak("gethostent not implemented!\n"); + return NULL; + }; + virtual int Gethostname(char* name, int namelen, int &err) + { + int r = win32_gethostname(name, namelen); + PROCESS_AND_RETURN; + }; + virtual struct netent *Getnetbyaddr(long net, int type, int &err) + { + struct netent *r = win32_getnetbyaddr(net, type); + PROCESS_AND_RETURN; + }; + virtual struct netent *Getnetbyname(const char *name, int &err) + { + struct netent *r = win32_getnetbyname((char*)name); + PROCESS_AND_RETURN; + }; + virtual struct netent *Getnetent(int &err) + { + struct netent *r = win32_getnetent(); + PROCESS_AND_RETURN; + }; + virtual int Getpeername(SOCKET s, struct sockaddr* name, int* namelen, int &err) + { + int r = win32_getpeername(s, name, namelen); + PROCESS_AND_RETURN; + }; + virtual struct protoent* Getprotobyname(const char* name, int &err) + { + struct protoent *r = win32_getprotobyname(name); + PROCESS_AND_RETURN; + }; + virtual struct protoent* Getprotobynumber(int number, int &err) + { + struct protoent *r = win32_getprotobynumber(number); + PROCESS_AND_RETURN; + }; + virtual struct protoent* Getprotoent(int &err) + { + struct protoent *r = win32_getprotoent(); + PROCESS_AND_RETURN; + }; + virtual struct servent* Getservbyname(const char* name, const char* proto, int &err) + { + struct servent *r = win32_getservbyname(name, proto); + PROCESS_AND_RETURN; + }; + virtual struct servent* Getservbyport(int port, const char* proto, int &err) + { + struct servent *r = win32_getservbyport(port, proto); + PROCESS_AND_RETURN; + }; + virtual struct servent* Getservent(int &err) + { + struct servent *r = win32_getservent(); + PROCESS_AND_RETURN; + }; + virtual int Getsockname(SOCKET s, struct sockaddr* name, int* namelen, int &err) + { + int r = win32_getsockname(s, name, namelen); + PROCESS_AND_RETURN; + }; + virtual int Getsockopt(SOCKET s, int level, int optname, char* optval, int* optlen, int &err) + { + int r = win32_getsockopt(s, level, optname, optval, optlen); + PROCESS_AND_RETURN; + }; + virtual unsigned long InetAddr(const char* cp, int &err) + { + unsigned long r = win32_inet_addr(cp); + PROCESS_AND_RETURN; + }; + virtual char* InetNtoa(struct in_addr in, int &err) + { + char *r = win32_inet_ntoa(in); + PROCESS_AND_RETURN; + }; + virtual int Listen(SOCKET s, int backlog, int &err) + { + int r = win32_listen(s, backlog); + PROCESS_AND_RETURN; + }; + virtual int Recv(SOCKET s, char* buffer, int len, int flags, int &err) + { + int r = win32_recv(s, buffer, len, flags); + PROCESS_AND_RETURN; + }; + virtual int Recvfrom(SOCKET s, char* buffer, int len, int flags, struct sockaddr* from, int* fromlen, int &err) + { + int r = win32_recvfrom(s, buffer, len, flags, from, fromlen); + PROCESS_AND_RETURN; + }; + virtual int Select(int nfds, char* readfds, char* writefds, char* exceptfds, const struct timeval* timeout, int &err) + { + int r = win32_select(nfds, (Perl_fd_set*)readfds, (Perl_fd_set*)writefds, (Perl_fd_set*)exceptfds, timeout); + PROCESS_AND_RETURN; + }; + virtual int Send(SOCKET s, const char* buffer, int len, int flags, int &err) + { + int r = win32_send(s, buffer, len, flags); + PROCESS_AND_RETURN; + }; + virtual int Sendto(SOCKET s, const char* buffer, int len, int flags, const struct sockaddr* to, int tolen, int &err) + { + int r = win32_sendto(s, buffer, len, flags, to, tolen); + PROCESS_AND_RETURN; + }; + virtual void Sethostent(int stayopen, int &err) + { + win32_sethostent(stayopen); + }; + virtual void Setnetent(int stayopen, int &err) + { + win32_setnetent(stayopen); + }; + virtual void Setprotoent(int stayopen, int &err) + { + win32_setprotoent(stayopen); + }; + virtual void Setservent(int stayopen, int &err) + { + win32_setservent(stayopen); + }; + virtual int Setsockopt(SOCKET s, int level, int optname, const char* optval, int optlen, int &err) + { + int r = win32_setsockopt(s, level, optname, optval, optlen); + PROCESS_AND_RETURN; + }; + virtual int Shutdown(SOCKET s, int how, int &err) + { + int r = win32_shutdown(s, how); + PROCESS_AND_RETURN; + }; + virtual SOCKET Socket(int af, int type, int protocol, int &err) + { + SOCKET r = win32_socket(af, type, protocol); + PROCESS_AND_RETURN; + }; + virtual int Socketpair(int domain, int type, int protocol, int* fds, int &err) + { + croak("socketpair not implemented!\n"); + return 0; + }; + virtual int Closesocket(SOCKET s, int& err) + { + int r = win32_closesocket(s); + PROCESS_AND_RETURN; + }; + virtual int Ioctlsocket(SOCKET s, long cmd, u_long *argp, int& err) + { + int r = win32_ioctlsocket(s, cmd, argp); + PROCESS_AND_RETURN; + }; +}; + +class CPerlLIO : public IPerlLIO +{ +public: + CPerlLIO() {}; + virtual int Access(const char *path, int mode, int &err) + { + CALLFUNCRET(access(path, mode)) + }; + virtual int Chmod(const char *filename, int pmode, int &err) + { + CALLFUNCRET(chmod(filename, pmode)) + }; + virtual int Chown(const char *filename, uid_t owner, gid_t group, int &err) + { + CALLFUNCERR(chown(filename, owner, group)) + }; + virtual int Chsize(int handle, long size, int &err) + { + CALLFUNCRET(chsize(handle, size)) + }; + virtual int Close(int handle, int &err) + { + CALLFUNCRET(win32_close(handle)) + }; + virtual int Dup(int handle, int &err) + { + CALLFUNCERR(win32_dup(handle)) + }; + virtual int Dup2(int handle1, int handle2, int &err) + { + CALLFUNCERR(win32_dup2(handle1, handle2)) + }; + virtual int Flock(int fd, int oper, int &err) + { + CALLFUNCERR(win32_flock(fd, oper)) + }; + virtual int FileStat(int handle, struct stat *buffer, int &err) + { + CALLFUNCERR(fstat(handle, buffer)) + }; + virtual int IOCtl(int i, unsigned int u, char *data, int &err) + { + CALLFUNCERR(win32_ioctlsocket((SOCKET)i, (long)u, (u_long*)data)) + }; + virtual int Isatty(int fd, int &err) + { + return isatty(fd); + }; + virtual long Lseek(int handle, long offset, int origin, int &err) + { + LCALLFUNCERR(win32_lseek(handle, offset, origin)) + }; + virtual int Lstat(const char *path, struct stat *buffer, int &err) + { + return NameStat(path, buffer, err); + }; + virtual char *Mktemp(char *Template, int &err) + { + return mktemp(Template); + }; + virtual int Open(const char *filename, int oflag, int &err) + { + CALLFUNCERR(win32_open(filename, oflag)) + }; + virtual int Open(const char *filename, int oflag, int pmode, int &err) + { + int ret; + if(stricmp(filename, "/dev/null") == 0) + ret = open("NUL", oflag, pmode); + else + ret = open(filename, oflag, pmode); + + if(errno) + err = errno; + return ret; + }; + virtual int Read(int handle, void *buffer, unsigned int count, int &err) + { + CALLFUNCERR(win32_read(handle, buffer, count)) + }; + virtual int Rename(const char *OldFileName, const char *newname, int &err) + { + char szNewWorkName[MAX_PATH+1]; + WIN32_FIND_DATA fdOldFile, fdNewFile; + HANDLE handle; + char *ptr; + + if((strchr(OldFileName, '\\') || strchr(OldFileName, '/')) + && strchr(newname, '\\') == NULL + && strchr(newname, '/') == NULL) + { + strcpy(szNewWorkName, OldFileName); + if((ptr = strrchr(szNewWorkName, '\\')) == NULL) + ptr = strrchr(szNewWorkName, '/'); + strcpy(++ptr, newname); + } + else + strcpy(szNewWorkName, newname); + + if(stricmp(OldFileName, szNewWorkName) != 0) + { // check that we're not being fooled by relative paths + // and only delete the new file + // 1) if it exists + // 2) it is not the same file as the old file + // 3) old file exist + // GetFullPathName does not return the long file name on some systems + handle = FindFirstFile(OldFileName, &fdOldFile); + if(handle != INVALID_HANDLE_VALUE) + { + FindClose(handle); + + handle = FindFirstFile(szNewWorkName, &fdNewFile); + + if(handle != INVALID_HANDLE_VALUE) + FindClose(handle); + else + fdNewFile.cFileName[0] = '\0'; + + if(strcmp(fdOldFile.cAlternateFileName, fdNewFile.cAlternateFileName) != 0 + && strcmp(fdOldFile.cFileName, fdNewFile.cFileName) != 0) + { // file exists and not same file + DeleteFile(szNewWorkName); + } + } + } + int ret = rename(OldFileName, szNewWorkName); + if(ret) + err = errno; + + return ret; + }; + virtual int Setmode(int handle, int mode, int &err) + { + CALLFUNCRET(win32_setmode(handle, mode)) + }; + virtual int NameStat(const char *path, struct stat *buffer, int &err) + { + return win32_stat(path, buffer); + }; + virtual char *Tmpnam(char *string, int &err) + { + return tmpnam(string); + }; + virtual int Umask(int pmode, int &err) + { + return umask(pmode); + }; + virtual int Unlink(const char *filename, int &err) + { + chmod(filename, S_IREAD | S_IWRITE); + CALLFUNCRET(unlink(filename)) + }; + virtual int Utime(char *filename, struct utimbuf *times, int &err) + { + CALLFUNCRET(win32_utime(filename, times)) + }; + virtual int Write(int handle, const void *buffer, unsigned int count, int &err) + { + CALLFUNCERR(win32_write(handle, buffer, count)) + }; +}; + +class CPerlMem : public IPerlMem +{ +public: + CPerlMem() {}; + virtual void* Malloc(size_t size) + { + return win32_malloc(size); + }; + virtual void* Realloc(void* ptr, size_t size) + { + return win32_realloc(ptr, size); + }; + virtual void Free(void* ptr) + { + win32_free(ptr); + }; +}; + +#define EXECF_EXEC 1 +#define EXECF_SPAWN 2 + +extern char * g_getlogin(void); +extern int do_spawn2(char *cmd, int exectype); +extern int g_do_aspawn(void *vreally, void **vmark, void **vsp); + +class CPerlProc : public IPerlProc +{ +public: + CPerlProc() {}; + virtual void Abort(void) + { + win32_abort(); + }; + virtual void Exit(int status) + { + exit(status); + }; + virtual void _Exit(int status) + { + _exit(status); + }; + virtual int Execl(const char *cmdname, const char *arg0, const char *arg1, const char *arg2, const char *arg3) + { + return execl(cmdname, arg0, arg1, arg2, arg3); + }; + virtual int Execv(const char *cmdname, const char *const *argv) + { + return win32_execvp(cmdname, argv); + }; + virtual int Execvp(const char *cmdname, const char *const *argv) + { + return win32_execvp(cmdname, argv); + }; + virtual uid_t Getuid(void) + { + return getuid(); + }; + virtual uid_t Geteuid(void) + { + return geteuid(); + }; + virtual gid_t Getgid(void) + { + return getgid(); + }; + virtual gid_t Getegid(void) + { + return getegid(); + }; + virtual char *Getlogin(void) + { + return g_getlogin(); + }; + virtual int Kill(int pid, int sig) + { + return win32_kill(pid, sig); + }; + virtual int Killpg(int pid, int sig) + { + croak("killpg not implemented!\n"); + return 0; + }; + virtual int PauseProc(void) + { + return win32_sleep((32767L << 16) + 32767); + }; + virtual PerlIO* Popen(const char *command, const char *mode) + { + win32_fflush(stdout); + win32_fflush(stderr); + return (PerlIO*)win32_popen(command, mode); + }; + virtual int Pclose(PerlIO *stream) + { + return win32_pclose((FILE*)stream); + }; + virtual int Pipe(int *phandles) + { + return win32_pipe(phandles, 512, O_BINARY); + }; + virtual int Setuid(uid_t u) + { + return setuid(u); + }; + virtual int Setgid(gid_t g) + { + return setgid(g); + }; + virtual int Sleep(unsigned int s) + { + return win32_sleep(s); + }; + virtual int Times(struct tms *timebuf) + { + return win32_times(timebuf); + }; + virtual int Wait(int *status) + { + return win32_wait(status); + }; + virtual int Waitpid(int pid, int *status, int flags) + { + return win32_waitpid(pid, status, flags); + }; + virtual Sighandler_t Signal(int sig, Sighandler_t subcode) + { + return 0; + }; + virtual void GetSysMsg(char*& sMsg, DWORD& dwLen, DWORD dwErr) + { + dwLen = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER + |FORMAT_MESSAGE_IGNORE_INSERTS + |FORMAT_MESSAGE_FROM_SYSTEM, NULL, + dwErr, 0, (char *)&sMsg, 1, NULL); + if (0 < dwLen) { + while (0 < dwLen && isspace(sMsg[--dwLen])) + ; + if ('.' != sMsg[dwLen]) + dwLen++; + sMsg[dwLen]= '\0'; + } + if (0 == dwLen) { + sMsg = (char*)LocalAlloc(0, 64/**sizeof(TCHAR)*/); + dwLen = sprintf(sMsg, + "Unknown error #0x%lX (lookup 0x%lX)", + dwErr, GetLastError()); + } + }; + virtual void FreeBuf(char* sMsg) + { + LocalFree(sMsg); + }; + virtual BOOL DoCmd(char *cmd) + { + do_spawn2(cmd, EXECF_EXEC); + return FALSE; + }; + virtual int Spawn(char* cmds) + { + return do_spawn2(cmds, EXECF_SPAWN); + }; + virtual int Spawnvp(int mode, const char *cmdname, const char *const *argv) + { + return win32_spawnvp(mode, cmdname, argv); + }; + virtual int ASpawn(void *vreally, void **vmark, void **vsp) + { + return g_do_aspawn(vreally, vmark, vsp); + }; +}; + + +class CPerlStdIO : public IPerlStdIO +{ +public: + CPerlStdIO() {}; + virtual PerlIO* Stdin(void) + { + return (PerlIO*)win32_stdin(); + }; + virtual PerlIO* Stdout(void) + { + return (PerlIO*)win32_stdout(); + }; + virtual PerlIO* Stderr(void) + { + return (PerlIO*)win32_stderr(); + }; + virtual PerlIO* Open(const char *path, const char *mode, int &err) + { + PerlIO*pf = (PerlIO*)win32_fopen(path, mode); + if(errno) + err = errno; + return pf; + }; + virtual int Close(PerlIO* pf, int &err) + { + CALLFUNCERR(win32_fclose(((FILE*)pf))) + }; + virtual int Eof(PerlIO* pf, int &err) + { + CALLFUNCERR(win32_feof((FILE*)pf)) + }; + virtual int Error(PerlIO* pf, int &err) + { + CALLFUNCERR(win32_ferror((FILE*)pf)) + }; + virtual void Clearerr(PerlIO* pf, int &err) + { + win32_clearerr((FILE*)pf); + }; + virtual int Getc(PerlIO* pf, int &err) + { + CALLFUNCERR(win32_getc((FILE*)pf)) + }; + virtual char* GetBase(PerlIO* pf, int &err) + { + FILE *f = (FILE*)pf; + return FILE_base(f); + }; + virtual int GetBufsiz(PerlIO* pf, int &err) + { + FILE *f = (FILE*)pf; + return FILE_bufsiz(f); + }; + virtual int GetCnt(PerlIO* pf, int &err) + { + FILE *f = (FILE*)pf; + return FILE_cnt(f); + }; + virtual char* GetPtr(PerlIO* pf, int &err) + { + FILE *f = (FILE*)pf; + return FILE_ptr(f); + }; + virtual char* Gets(PerlIO* pf, char* s, int n, int& err) + { + char* ret = win32_fgets(s, n, (FILE*)pf); + if(errno) + err = errno; + return ret; + }; + virtual int Putc(PerlIO* pf, int c, int &err) + { + CALLFUNCERR(win32_fputc(c, (FILE*)pf)) + }; + virtual int Puts(PerlIO* pf, const char *s, int &err) + { + CALLFUNCERR(win32_fputs(s, (FILE*)pf)) + }; + virtual int Flush(PerlIO* pf, int &err) + { + CALLFUNCERR(win32_fflush((FILE*)pf)) + }; + virtual int Ungetc(PerlIO* pf,int c, int &err) + { + CALLFUNCERR(win32_ungetc(c, (FILE*)pf)) + }; + virtual int Fileno(PerlIO* pf, int &err) + { + CALLFUNCERR(win32_fileno((FILE*)pf)) + }; + virtual PerlIO* Fdopen(int fd, const char *mode, int &err) + { + PerlIO* pf = (PerlIO*)win32_fdopen(fd, mode); + if(errno) + err = errno; + return pf; + }; + virtual PerlIO* Reopen(const char*path, const char*mode, PerlIO* pf, int &err) + { + PerlIO* newPf = (PerlIO*)win32_freopen(path, mode, (FILE*)pf); + if(errno) + err = errno; + return newPf; + }; + virtual SSize_t Read(PerlIO* pf, void *buffer, Size_t size, int &err) + { + SSize_t i = win32_fread(buffer, 1, size, (FILE*)pf); + if(errno) + err = errno; + return i; + }; + virtual SSize_t Write(PerlIO* pf, const void *buffer, Size_t size, int &err) + { + SSize_t i = win32_fwrite(buffer, 1, size, (FILE*)pf); + if(errno) + err = errno; + return i; + }; + virtual void SetBuf(PerlIO* pf, char* buffer, int &err) + { + win32_setbuf((FILE*)pf, buffer); + }; + virtual int SetVBuf(PerlIO* pf, char* buffer, int type, Size_t size, int &err) + { + int i = win32_setvbuf((FILE*)pf, buffer, type, size); + if(errno) + err = errno; + return i; + }; + virtual void SetCnt(PerlIO* pf, int n, int &err) + { + FILE *f = (FILE*)pf; + FILE_cnt(f) = n; + }; + virtual void SetPtrCnt(PerlIO* pf, char * ptr, int n, int& err) + { + FILE *f = (FILE*)pf; + FILE_ptr(f) = ptr; + FILE_cnt(f) = n; + }; + virtual void Setlinebuf(PerlIO* pf, int &err) + { + win32_setvbuf((FILE*)pf, NULL, _IOLBF, 0); + }; + virtual int Printf(PerlIO* pf, int &err, const char *format,...) + { + va_list(arglist); + va_start(arglist, format); + int i = win32_vfprintf((FILE*)pf, format, arglist); + if(errno) + err = errno; + return i; + }; + virtual int Vprintf(PerlIO* pf, int &err, const char *format, va_list arglist) + { + int i = win32_vfprintf((FILE*)pf, format, arglist); + if(errno) + err = errno; + return i; + }; + virtual long Tell(PerlIO* pf, int &err) + { + long l = win32_ftell((FILE*)pf); + if(errno) + err = errno; + return l; + }; + virtual int Seek(PerlIO* pf, off_t offset, int origin, int &err) + { + int i = win32_fseek((FILE*)pf, offset, origin); + if(errno) + err = errno; + return i; + }; + virtual void Rewind(PerlIO* pf, int &err) + { + win32_rewind((FILE*)pf); + }; + virtual PerlIO* Tmpfile(int &err) + { + PerlIO* pf = (PerlIO*)win32_tmpfile(); + if(errno) + err = errno; + return pf; + }; + virtual int Getpos(PerlIO* pf, Fpos_t *p, int &err) + { + int i = win32_fgetpos((FILE*)pf, p); + if(errno) + err = errno; + return i; + }; + virtual int Setpos(PerlIO* pf, const Fpos_t *p, int &err) + { + int i = win32_fsetpos((FILE*)pf, p); + if(errno) + err = errno; + return i; + }; + virtual void Init(int &err) + { + }; + virtual void InitOSExtras(void* p) + { + Perl_init_os_extras(); + }; + virtual int OpenOSfhandle(long osfhandle, int flags) + { + return win32_open_osfhandle(osfhandle, flags); + } + virtual int GetOSfhandle(int filenum) + { + return win32_get_osfhandle(filenum); + } +}; + +class CPerlHost +{ +public: + CPerlHost() { pPerl = NULL; }; + inline BOOL PerlCreate(void) + { + try + { + pPerl = perl_alloc(&perlMem, &perlEnv, &perlStdIO, &perlLIO, + &perlDir, &perlSock, &perlProc); + if(pPerl != NULL) + { + try + { + pPerl->perl_construct(); + } + catch(...) + { + win32_fprintf(stderr, "%s\n", + "Error: Unable to construct data structures"); + pPerl->perl_free(); + pPerl = NULL; + } + } + } + catch(...) + { + win32_fprintf(stderr, "%s\n", "Error: Unable to allocate memory"); + pPerl = NULL; + } + return (pPerl != NULL); + }; + inline int PerlParse(void (*xs_init)(CPerlObj*), int argc, char** argv, char** env) + { + int retVal; + try + { + retVal = pPerl->perl_parse(xs_init, argc, argv, env); + } + catch(int x) + { + // this is where exit() should arrive + retVal = x; + } + catch(...) + { + win32_fprintf(stderr, "Error: Parse exception\n"); + retVal = -1; + } + *win32_errno() = 0; + 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(...) + { + win32_fprintf(stderr, "Error: Runtime exception\n"); + retVal = -1; + } + return retVal; + }; + inline void PerlDestroy(void) + { + try + { + pPerl->perl_destruct(); + pPerl->perl_free(); + } + catch(...) + { + } + }; + +protected: + CPerlDir perlDir; + CPerlEnv perlEnv; + CPerlLIO perlLIO; + CPerlMem perlMem; + CPerlProc perlProc; + CPerlSock perlSock; + CPerlStdIO perlStdIO; +}; diff --git a/win32/runperl.c b/win32/runperl.c index 7d49182..3947f9e 100644 --- a/win32/runperl.c +++ b/win32/runperl.c @@ -6,988 +6,28 @@ #define NO_XSLOCKS #include "XSUB.H" -#include "Win32iop.h" - -#define errno (*win32_errno()) -#define stdout (win32_stdout()) -#define stderr (win32_stderr()) - -CPerlObj *pPerl; +#include "win32iop.h" #include -#include -#include -#include -#include -#include -#include -#include - -#define CALLFUNC0RET(x)\ - int ret = x;\ - if(ret < 0)\ - err = errno;\ - return ret; - -extern int g_closedir(DIR *dirp); -extern DIR *g_opendir(char *filename); -extern struct direct *g_readdir(DIR *dirp); -extern void g_rewinddir(DIR *dirp); -extern void g_seekdir(DIR *dirp, long loc); -extern long g_telldir(DIR *dirp); -class CPerlDir : public IPerlDir -{ -public: - CPerlDir() {}; - virtual int Makedir(const char *dirname, int mode, int &err) - { - CALLFUNC0RET(win32_mkdir(dirname, mode)); - }; - virtual int Chdir(const char *dirname, int &err) - { - CALLFUNC0RET(win32_chdir(dirname)); - }; - virtual int Rmdir(const char *dirname, int &err) - { - CALLFUNC0RET(win32_rmdir(dirname)); - }; - virtual int Close(DIR *dirp, int &err) - { - return g_closedir(dirp); - }; - virtual DIR *Open(char *filename, int &err) - { - return g_opendir(filename); - }; - virtual struct direct *Read(DIR *dirp, int &err) - { - return g_readdir(dirp); - }; - virtual void Rewind(DIR *dirp, int &err) - { - g_rewinddir(dirp); - }; - virtual void Seek(DIR *dirp, long loc, int &err) - { - g_seekdir(dirp, loc); - }; - virtual long Tell(DIR *dirp, int &err) - { - return g_telldir(dirp); - }; -}; - - -extern char * g_win32_get_privlib(char *pl); -extern char * g_win32_get_sitelib(char *pl); -class CPerlEnv : public IPerlEnv -{ -public: - CPerlEnv() {}; - virtual char *Getenv(const char *varname, int &err) - { - return win32_getenv(varname); - }; - virtual int Putenv(const char *envstring, int &err) - { - return putenv(envstring); - }; - virtual char* LibPath(char *pl) - { - return g_win32_get_privlib(pl); - }; - virtual char* SiteLibPath(char *pl) - { - return g_win32_get_sitelib(pl); - }; -}; - -#define PROCESS_AND_RETURN \ - if(errno) \ - err = errno; \ - return r - -class CPerlSock : public IPerlSock -{ -public: - CPerlSock() {}; - virtual u_long Htonl(u_long hostlong) - { - return win32_htonl(hostlong); - }; - virtual u_short Htons(u_short hostshort) - { - return win32_htons(hostshort); - }; - virtual u_long Ntohl(u_long netlong) - { - return win32_ntohl(netlong); - }; - virtual u_short Ntohs(u_short netshort) - { - return win32_ntohs(netshort); - } - - virtual SOCKET Accept(SOCKET s, struct sockaddr* addr, int* addrlen, int &err) - { - SOCKET r = win32_accept(s, addr, addrlen); - PROCESS_AND_RETURN; - }; - virtual int Bind(SOCKET s, const struct sockaddr* name, int namelen, int &err) - { - int r = win32_bind(s, name, namelen); - PROCESS_AND_RETURN; - }; - virtual int Connect(SOCKET s, const struct sockaddr* name, int namelen, int &err) - { - int r = win32_connect(s, name, namelen); - PROCESS_AND_RETURN; - }; - virtual void Endhostent(int &err) - { - win32_endhostent(); - }; - virtual void Endnetent(int &err) - { - win32_endnetent(); - }; - virtual void Endprotoent(int &err) - { - win32_endprotoent(); - }; - virtual void Endservent(int &err) - { - win32_endservent(); - }; - virtual struct hostent* Gethostbyaddr(const char* addr, int len, int type, int &err) - { - struct hostent *r = win32_gethostbyaddr(addr, len, type); - PROCESS_AND_RETURN; - }; - virtual struct hostent* Gethostbyname(const char* name, int &err) - { - struct hostent *r = win32_gethostbyname(name); - PROCESS_AND_RETURN; - }; - virtual struct hostent* Gethostent(int &err) - { - croak("gethostent not implemented!\n"); - return NULL; - }; - virtual int Gethostname(char* name, int namelen, int &err) - { - int r = win32_gethostname(name, namelen); - PROCESS_AND_RETURN; - }; - virtual struct netent *Getnetbyaddr(long net, int type, int &err) - { - struct netent *r = win32_getnetbyaddr(net, type); - PROCESS_AND_RETURN; - }; - virtual struct netent *Getnetbyname(const char *name, int &err) - { - struct netent *r = win32_getnetbyname((char*)name); - PROCESS_AND_RETURN; - }; - virtual struct netent *Getnetent(int &err) - { - struct netent *r = win32_getnetent(); - PROCESS_AND_RETURN; - }; - virtual int Getpeername(SOCKET s, struct sockaddr* name, int* namelen, int &err) - { - int r = win32_getpeername(s, name, namelen); - PROCESS_AND_RETURN; - }; - virtual struct protoent* Getprotobyname(const char* name, int &err) - { - struct protoent *r = win32_getprotobyname(name); - PROCESS_AND_RETURN; - }; - virtual struct protoent* Getprotobynumber(int number, int &err) - { - struct protoent *r = win32_getprotobynumber(number); - PROCESS_AND_RETURN; - }; - virtual struct protoent* Getprotoent(int &err) - { - struct protoent *r = win32_getprotoent(); - PROCESS_AND_RETURN; - }; - virtual struct servent* Getservbyname(const char* name, const char* proto, int &err) - { - struct servent *r = win32_getservbyname(name, proto); - PROCESS_AND_RETURN; - }; - virtual struct servent* Getservbyport(int port, const char* proto, int &err) - { - struct servent *r = win32_getservbyport(port, proto); - PROCESS_AND_RETURN; - }; - virtual struct servent* Getservent(int &err) - { - struct servent *r = win32_getservent(); - PROCESS_AND_RETURN; - }; - virtual int Getsockname(SOCKET s, struct sockaddr* name, int* namelen, int &err) - { - int r = win32_getsockname(s, name, namelen); - PROCESS_AND_RETURN; - }; - virtual int Getsockopt(SOCKET s, int level, int optname, char* optval, int* optlen, int &err) - { - int r = win32_getsockopt(s, level, optname, optval, optlen); - PROCESS_AND_RETURN; - }; - virtual unsigned long InetAddr(const char* cp, int &err) - { - unsigned long r = win32_inet_addr(cp); - PROCESS_AND_RETURN; - }; - virtual char* InetNtoa(struct in_addr in, int &err) - { - char *r = win32_inet_ntoa(in); - PROCESS_AND_RETURN; - }; - virtual int Listen(SOCKET s, int backlog, int &err) - { - int r = win32_listen(s, backlog); - PROCESS_AND_RETURN; - }; - virtual int Recv(SOCKET s, char* buffer, int len, int flags, int &err) - { - int r = win32_recv(s, buffer, len, flags); - PROCESS_AND_RETURN; - }; - virtual int Recvfrom(SOCKET s, char* buffer, int len, int flags, struct sockaddr* from, int* fromlen, int &err) - { - int r = win32_recvfrom(s, buffer, len, flags, from, fromlen); - PROCESS_AND_RETURN; - }; - virtual int Select(int nfds, char* readfds, char* writefds, char* exceptfds, const struct timeval* timeout, int &err) - { - int r = win32_select(nfds, (Perl_fd_set*)readfds, (Perl_fd_set*)writefds, (Perl_fd_set*)exceptfds, timeout); - PROCESS_AND_RETURN; - }; - virtual int Send(SOCKET s, const char* buffer, int len, int flags, int &err) - { - int r = win32_send(s, buffer, len, flags); - PROCESS_AND_RETURN; - }; - virtual int Sendto(SOCKET s, const char* buffer, int len, int flags, const struct sockaddr* to, int tolen, int &err) - { - int r = win32_sendto(s, buffer, len, flags, to, tolen); - PROCESS_AND_RETURN; - }; - virtual void Sethostent(int stayopen, int &err) - { - win32_sethostent(stayopen); - }; - virtual void Setnetent(int stayopen, int &err) - { - win32_setnetent(stayopen); - }; - virtual void Setprotoent(int stayopen, int &err) - { - win32_setprotoent(stayopen); - }; - virtual void Setservent(int stayopen, int &err) - { - win32_setservent(stayopen); - }; - virtual int Setsockopt(SOCKET s, int level, int optname, const char* optval, int optlen, int &err) - { - int r = win32_setsockopt(s, level, optname, optval, optlen); - PROCESS_AND_RETURN; - }; - virtual int Shutdown(SOCKET s, int how, int &err) - { - int r = win32_shutdown(s, how); - PROCESS_AND_RETURN; - }; - virtual SOCKET Socket(int af, int type, int protocol, int &err) - { - SOCKET r = win32_socket(af, type, protocol); - PROCESS_AND_RETURN; - }; - virtual int Socketpair(int domain, int type, int protocol, int* fds, int &err) - { - croak("socketpair not implemented!\n"); - return 0; - }; - virtual int Closesocket(SOCKET s, int& err) - { - int r = win32_closesocket(s); - PROCESS_AND_RETURN; - }; - virtual int Ioctlsocket(SOCKET s, long cmd, u_long *argp, int& err) - { - int r = win32_ioctlsocket(s, cmd, argp); - PROCESS_AND_RETURN; - }; -}; - +#include "perlhost.h" -#define CALLFUNCRET(x)\ - int ret = x;\ - if(ret)\ - err = errno;\ - return ret; -#define CALLFUNCERR(x)\ - int ret = x;\ - if(errno)\ - err = errno;\ - return ret; - -#define LCALLFUNCERR(x)\ - long ret = x;\ - if(errno)\ - err = errno;\ - return ret; - -class CPerlLIO : public IPerlLIO -{ -public: - CPerlLIO() {}; - virtual int Access(const char *path, int mode, int &err) - { - CALLFUNCRET(access(path, mode)) - }; - virtual int Chmod(const char *filename, int pmode, int &err) - { - CALLFUNCRET(chmod(filename, pmode)) - }; - virtual int Chown(const char *filename, uid_t owner, gid_t group, int &err) - { - CALLFUNCERR(chown(filename, owner, group)) - }; - virtual int Chsize(int handle, long size, int &err) - { - CALLFUNCRET(chsize(handle, size)) - }; - virtual int Close(int handle, int &err) - { - CALLFUNCRET(win32_close(handle)) - }; - virtual int Dup(int handle, int &err) - { - CALLFUNCERR(win32_dup(handle)) - }; - virtual int Dup2(int handle1, int handle2, int &err) - { - CALLFUNCERR(win32_dup2(handle1, handle2)) - }; - virtual int Flock(int fd, int oper, int &err) - { - CALLFUNCERR(win32_flock(fd, oper)) - }; - virtual int FileStat(int handle, struct stat *buffer, int &err) - { - CALLFUNCERR(fstat(handle, buffer)) - }; - virtual int IOCtl(int i, unsigned int u, char *data, int &err) - { - CALLFUNCERR(win32_ioctlsocket((SOCKET)i, (long)u, (u_long*)data)) - }; - virtual int Isatty(int fd, int &err) - { - return isatty(fd); - }; - virtual long Lseek(int handle, long offset, int origin, int &err) - { - LCALLFUNCERR(win32_lseek(handle, offset, origin)) - }; - virtual int Lstat(const char *path, struct stat *buffer, int &err) - { - return NameStat(path, buffer, err); - }; - virtual char *Mktemp(char *Template, int &err) - { - return mktemp(Template); - }; - virtual int Open(const char *filename, int oflag, int &err) - { - CALLFUNCERR(win32_open(filename, oflag)) - }; - virtual int Open(const char *filename, int oflag, int pmode, int &err) - { - int ret; - if(stricmp(filename, "/dev/null") == 0) - ret = open("NUL", oflag, pmode); - else - ret = open(filename, oflag, pmode); - - if(errno) - err = errno; - return ret; - }; - virtual int Read(int handle, void *buffer, unsigned int count, int &err) - { - CALLFUNCERR(win32_read(handle, buffer, count)) - }; - virtual int Rename(const char *OldFileName, const char *newname, int &err) - { - char szNewWorkName[MAX_PATH+1]; - WIN32_FIND_DATA fdOldFile, fdNewFile; - HANDLE handle; - char *ptr; - - if((strchr(OldFileName, '\\') || strchr(OldFileName, '/')) - && strchr(newname, '\\') == NULL - && strchr(newname, '/') == NULL) - { - strcpy(szNewWorkName, OldFileName); - if((ptr = strrchr(szNewWorkName, '\\')) == NULL) - ptr = strrchr(szNewWorkName, '/'); - strcpy(++ptr, newname); - } - else - strcpy(szNewWorkName, newname); - - if(stricmp(OldFileName, szNewWorkName) != 0) - { // check that we're not being fooled by relative paths - // and only delete the new file - // 1) if it exists - // 2) it is not the same file as the old file - // 3) old file exist - // GetFullPathName does not return the long file name on some systems - handle = FindFirstFile(OldFileName, &fdOldFile); - if(handle != INVALID_HANDLE_VALUE) - { - FindClose(handle); - - handle = FindFirstFile(szNewWorkName, &fdNewFile); - - if(handle != INVALID_HANDLE_VALUE) - FindClose(handle); - else - fdNewFile.cFileName[0] = '\0'; - - if(strcmp(fdOldFile.cAlternateFileName, fdNewFile.cAlternateFileName) != 0 - && strcmp(fdOldFile.cFileName, fdNewFile.cFileName) != 0) - { // file exists and not same file - DeleteFile(szNewWorkName); - } - } - } - int ret = rename(OldFileName, szNewWorkName); - if(ret) - err = errno; - - return ret; - }; - virtual int Setmode(int handle, int mode, int &err) - { - CALLFUNCRET(win32_setmode(handle, mode)) - }; - virtual int NameStat(const char *path, struct stat *buffer, int &err) - { - return win32_stat(path, buffer); - }; - virtual char *Tmpnam(char *string, int &err) - { - return tmpnam(string); - }; - virtual int Umask(int pmode, int &err) - { - return umask(pmode); - }; - virtual int Unlink(const char *filename, int &err) - { - chmod(filename, S_IREAD | S_IWRITE); - CALLFUNCRET(unlink(filename)) - }; - virtual int Utime(char *filename, struct utimbuf *times, int &err) - { - CALLFUNCRET(win32_utime(filename, times)) - }; - virtual int Write(int handle, const void *buffer, unsigned int count, int &err) - { - CALLFUNCERR(win32_write(handle, buffer, count)) - }; -}; - -class CPerlMem : public IPerlMem -{ -public: - CPerlMem() {}; - virtual void* Malloc(size_t size) - { - return win32_malloc(size); - }; - virtual void* Realloc(void* ptr, size_t size) - { - return win32_realloc(ptr, size); - }; - virtual void Free(void* ptr) - { - win32_free(ptr); - }; -}; - -#define EXECF_EXEC 1 -#define EXECF_SPAWN 2 - -extern char *g_getlogin(void); -extern int do_spawn2(char *cmd, int exectype); -extern int g_do_aspawn(void *vreally, void **vmark, void **vsp); -class CPerlProc : public IPerlProc -{ -public: - CPerlProc() {}; - virtual void Abort(void) - { - win32_abort(); - }; - virtual void Exit(int status) - { - exit(status); - }; - virtual void _Exit(int status) - { - _exit(status); - }; - virtual int Execl(const char *cmdname, const char *arg0, const char *arg1, const char *arg2, const char *arg3) - { - return execl(cmdname, arg0, arg1, arg2, arg3); - }; - virtual int Execv(const char *cmdname, const char *const *argv) - { - return win32_execvp(cmdname, argv); - }; - virtual int Execvp(const char *cmdname, const char *const *argv) - { - return win32_execvp(cmdname, argv); - }; - virtual uid_t Getuid(void) - { - return getuid(); - }; - virtual uid_t Geteuid(void) - { - return geteuid(); - }; - virtual gid_t Getgid(void) - { - return getgid(); - }; - virtual gid_t Getegid(void) - { - return getegid(); - }; - virtual char *Getlogin(void) - { - return g_getlogin(); - }; - virtual int Kill(int pid, int sig) - { - return win32_kill(pid, sig); - }; - virtual int Killpg(int pid, int sig) - { - croak("killpg not implemented!\n"); - return 0; - }; - virtual int PauseProc(void) - { - return win32_sleep((32767L << 16) + 32767); - }; - virtual PerlIO* Popen(const char *command, const char *mode) - { - win32_fflush(stdout); - win32_fflush(stderr); - return (PerlIO*)win32_popen(command, mode); - }; - virtual int Pclose(PerlIO *stream) - { - return win32_pclose((FILE*)stream); - }; - virtual int Pipe(int *phandles) - { - return win32_pipe(phandles, 512, O_BINARY); - }; - virtual int Setuid(uid_t u) - { - return setuid(u); - }; - virtual int Setgid(gid_t g) - { - return setgid(g); - }; - virtual int Sleep(unsigned int s) - { - return win32_sleep(s); - }; - virtual int Times(struct tms *timebuf) - { - return win32_times(timebuf); - }; - virtual int Wait(int *status) - { - return win32_wait(status); - }; - virtual int Waitpid(int pid, int *status, int flags) - { - return win32_waitpid(pid, status, flags); - }; - virtual Sighandler_t Signal(int sig, Sighandler_t subcode) - { - return 0; - }; - virtual void GetSysMsg(char*& sMsg, DWORD& dwLen, DWORD dwErr) - { - dwLen = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER - |FORMAT_MESSAGE_IGNORE_INSERTS - |FORMAT_MESSAGE_FROM_SYSTEM, NULL, - dwErr, 0, (char *)&sMsg, 1, NULL); - if (0 < dwLen) { - while (0 < dwLen && isspace(sMsg[--dwLen])) - ; - if ('.' != sMsg[dwLen]) - dwLen++; - sMsg[dwLen]= '\0'; - } - if (0 == dwLen) { - sMsg = (char*)LocalAlloc(0, 64/**sizeof(TCHAR)*/); - dwLen = sprintf(sMsg, - "Unknown error #0x%lX (lookup 0x%lX)", - dwErr, GetLastError()); - } - }; - virtual void FreeBuf(char* sMsg) - { - LocalFree(sMsg); - }; - virtual BOOL DoCmd(char *cmd) - { - do_spawn2(cmd, EXECF_EXEC); - return FALSE; - }; - virtual int Spawn(char* cmds) - { - return do_spawn2(cmds, EXECF_SPAWN); - }; - virtual int Spawnvp(int mode, const char *cmdname, const char *const *argv) - { - return win32_spawnvp(mode, cmdname, argv); - }; - virtual int ASpawn(void *vreally, void **vmark, void **vsp) - { - return g_do_aspawn(vreally, vmark, vsp); - }; -}; - - -class CPerlStdIO : public IPerlStdIO -{ -public: - CPerlStdIO() {}; - virtual PerlIO* Stdin(void) - { - return (PerlIO*)win32_stdin(); - }; - virtual PerlIO* Stdout(void) - { - return (PerlIO*)win32_stdout(); - }; - virtual PerlIO* Stderr(void) - { - return (PerlIO*)win32_stderr(); - }; - virtual PerlIO* Open(const char *path, const char *mode, int &err) - { - PerlIO*pf = (PerlIO*)win32_fopen(path, mode); - if(errno) - err = errno; - return pf; - }; - virtual int Close(PerlIO* pf, int &err) - { - CALLFUNCERR(win32_fclose(((FILE*)pf))) - }; - virtual int Eof(PerlIO* pf, int &err) - { - CALLFUNCERR(win32_feof((FILE*)pf)) - }; - virtual int Error(PerlIO* pf, int &err) - { - CALLFUNCERR(win32_ferror((FILE*)pf)) - }; - virtual void Clearerr(PerlIO* pf, int &err) - { - win32_clearerr((FILE*)pf); - }; - virtual int Getc(PerlIO* pf, int &err) - { - CALLFUNCERR(win32_getc((FILE*)pf)) - }; - virtual char* GetBase(PerlIO* pf, int &err) - { - FILE *f = (FILE*)pf; - return FILE_base(f); - }; - virtual int GetBufsiz(PerlIO* pf, int &err) - { - FILE *f = (FILE*)pf; - return FILE_bufsiz(f); - }; - virtual int GetCnt(PerlIO* pf, int &err) - { - FILE *f = (FILE*)pf; - return FILE_cnt(f); - }; - virtual char* GetPtr(PerlIO* pf, int &err) - { - FILE *f = (FILE*)pf; - return FILE_ptr(f); - }; - virtual char* Gets(PerlIO* pf, char* s, int n, int& err) - { - char* ret = win32_fgets(s, n, (FILE*)pf); - if(errno) - err = errno; - return ret; - }; - virtual int Putc(PerlIO* pf, int c, int &err) - { - CALLFUNCERR(win32_fputc(c, (FILE*)pf)) - }; - virtual int Puts(PerlIO* pf, const char *s, int &err) - { - CALLFUNCERR(win32_fputs(s, (FILE*)pf)) - }; - virtual int Flush(PerlIO* pf, int &err) - { - CALLFUNCERR(win32_fflush((FILE*)pf)) - }; - virtual int Ungetc(PerlIO* pf,int c, int &err) - { - CALLFUNCERR(win32_ungetc(c, (FILE*)pf)) - }; - virtual int Fileno(PerlIO* pf, int &err) - { - CALLFUNCERR(win32_fileno((FILE*)pf)) - }; - virtual PerlIO* Fdopen(int fd, const char *mode, int &err) - { - PerlIO* pf = (PerlIO*)win32_fdopen(fd, mode); - if(errno) - err = errno; - return pf; - }; - virtual PerlIO* Reopen(const char*path, const char*mode, PerlIO* pf, int &err) - { - PerlIO* newPf = (PerlIO*)win32_freopen(path, mode, (FILE*)pf); - if(errno) - err = errno; - return newPf; - }; - virtual SSize_t Read(PerlIO* pf, void *buffer, Size_t size, int &err) - { - SSize_t i = win32_fread(buffer, 1, size, (FILE*)pf); - if(errno) - err = errno; - return i; - }; - virtual SSize_t Write(PerlIO* pf, const void *buffer, Size_t size, int &err) - { - SSize_t i = win32_fwrite(buffer, 1, size, (FILE*)pf); - if(errno) - err = errno; - return i; - }; - virtual void SetBuf(PerlIO* pf, char* buffer, int &err) - { - win32_setbuf((FILE*)pf, buffer); - }; - virtual int SetVBuf(PerlIO* pf, char* buffer, int type, Size_t size, int &err) - { - int i = win32_setvbuf((FILE*)pf, buffer, type, size); - if(errno) - err = errno; - return i; - }; - virtual void SetCnt(PerlIO* pf, int n, int &err) - { - FILE *f = (FILE*)pf; - FILE_cnt(f) = n; - }; - virtual void SetPtrCnt(PerlIO* pf, char * ptr, int n, int& err) - { - FILE *f = (FILE*)pf; - FILE_ptr(f) = ptr; - FILE_cnt(f) = n; - }; - virtual void Setlinebuf(PerlIO* pf, int &err) - { - win32_setvbuf((FILE*)pf, NULL, _IOLBF, 0); - }; - virtual int Printf(PerlIO* pf, int &err, const char *format,...) - { - va_list(arglist); - va_start(arglist, format); - int i = win32_vfprintf((FILE*)pf, format, arglist); - if(errno) - err = errno; - return i; - }; - virtual int Vprintf(PerlIO* pf, int &err, const char *format, va_list arglist) - { - int i = win32_vfprintf((FILE*)pf, format, arglist); - if(errno) - err = errno; - return i; - }; - virtual long Tell(PerlIO* pf, int &err) - { - long l = win32_ftell((FILE*)pf); - if(errno) - err = errno; - return l; - }; - virtual int Seek(PerlIO* pf, off_t offset, int origin, int &err) - { - int i = win32_fseek((FILE*)pf, offset, origin); - if(errno) - err = errno; - return i; - }; - virtual void Rewind(PerlIO* pf, int &err) - { - win32_rewind((FILE*)pf); - }; - virtual PerlIO* Tmpfile(int &err) - { - PerlIO* pf = (PerlIO*)win32_tmpfile(); - if(errno) - err = errno; - return pf; - }; - virtual int Getpos(PerlIO* pf, Fpos_t *p, int &err) - { - int i = win32_fgetpos((FILE*)pf, p); - if(errno) - err = errno; - return i; - }; - virtual int Setpos(PerlIO* pf, const Fpos_t *p, int &err) - { - int i = win32_fsetpos((FILE*)pf, p); - if(errno) - err = errno; - return i; - }; - virtual void Init(int &err) - { - }; - virtual void InitOSExtras(void* p) - { - Perl_init_os_extras(); - }; - virtual int OpenOSfhandle(long osfhandle, int flags) - { - return win32_open_osfhandle(osfhandle, flags); - } - virtual int GetOSfhandle(int filenum) - { - return win32_get_osfhandle(filenum); - } +char *staticlinkmodules[] = { + "DynaLoader", + NULL, }; +EXTERN_C void boot_DynaLoader _((CV* cv _CPERLarg)); -static void xs_init _((CPERLarg)); - -class CPerlHost +static void +xs_init(CPERLarg) { -public: - CPerlHost() { pPerl = NULL; }; - inline BOOL PerlCreate(void) - { - try - { - pPerl = perl_alloc(&perlMem, &perlEnv, &perlStdIO, &perlLIO, &perlDir, &perlSock, &perlProc); - if(pPerl != NULL) - { - try - { - pPerl->perl_construct(); - } - catch(...) - { - win32_fprintf(stderr, "%s\n", "Error: Unable to construct data structures"); - pPerl->perl_free(); - pPerl = NULL; - } - } - } - catch(...) - { - win32_fprintf(stderr, "%s\n", "Error: Unable to allocate memory"); - pPerl = NULL; - } - return (pPerl != NULL); - }; - inline int PerlParse(int argc, char** argv, char** env) - { - int retVal; - try - { - retVal = pPerl->perl_parse(xs_init, argc, argv, env); - } - catch(int x) - { - // this is where exit() should arrive - retVal = x; - } - catch(...) - { - win32_fprintf(stderr, "Error: Parse exception\n"); - retVal = -1; - } - *win32_errno() = 0; - 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(...) - { - win32_fprintf(stderr, "Error: Runtime exception\n"); - retVal = -1; - } - return retVal; - }; - inline void PerlDestroy(void) - { - try - { - pPerl->perl_destruct(); - pPerl->perl_free(); - } - catch(...) - { - } - }; + char *file = __FILE__; + dXSUB_SYS; + newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file); +} -protected: - CPerlDir perlDir; - CPerlEnv perlEnv; - CPerlLIO perlLIO; - CPerlMem perlMem; - CPerlProc perlProc; - CPerlSock perlSock; - CPerlStdIO perlStdIO; -}; +CPerlObj *pPerl; #undef PERL_SYS_INIT #define PERL_SYS_INIT(a, c) @@ -1001,34 +41,16 @@ main(int argc, char **argv, char **env) if(!host.PerlCreate()) exit(exitstatus); - - exitstatus = host.PerlParse(argc, argv, NULL); + exitstatus = host.PerlParse(xs_init, argc, argv, NULL); if (!exitstatus) - { exitstatus = host.PerlRun(); - } host.PerlDestroy(); return exitstatus; } -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); -} - #else /* PERL_OBJECT */ #ifdef __GNUC__ diff --git a/win32/win32.h b/win32/win32.h index eaced28..e1cf335 100644 --- a/win32/win32.h +++ b/win32/win32.h @@ -152,6 +152,55 @@ typedef long uid_t; typedef long gid_t; #pragma warning(disable: 4018 4035 4101 4102 4244 4245 4761) +#ifndef PERL_OBJECT + +/* Visual C thinks that a pointer to a member variable is 16 bytes in size. */ +#define STRUCT_MGVTBL_DEFINITION \ +struct mgvtbl { \ + union { \ + int (CPERLscope(*svt_get)) _((SV *sv, MAGIC* mg)); \ + char handle_VC_problem1[16]; \ + }; \ + union { \ + int (CPERLscope(*svt_set)) _((SV *sv, MAGIC* mg)); \ + char handle_VC_problem2[16]; \ + }; \ + union { \ + U32 (CPERLscope(*svt_len)) _((SV *sv, MAGIC* mg)); \ + char handle_VC_problem3[16]; \ + }; \ + union { \ + int (CPERLscope(*svt_clear)) _((SV *sv, MAGIC* mg)); \ + char handle_VC_problem4[16]; \ + }; \ + union { \ + int (CPERLscope(*svt_free)) _((SV *sv, MAGIC* mg)); \ + char handle_VC_problem5[16]; \ + }; \ +} + +#define BASEOP_DEFINITION \ + OP* op_next; \ + OP* op_sibling; \ + OP* (CPERLscope(*op_ppaddr))_((ARGSproto)); \ + char handle_VC_problem[12]; \ + PADOFFSET op_targ; \ + OPCODE op_type; \ + U16 op_seq; \ + U8 op_flags; \ + U8 op_private; + +#define UNION_ANY_DEFINITION union any { \ + void* any_ptr; \ + I32 any_i32; \ + IV any_iv; \ + long any_long; \ + void (CPERLscope(*any_dptr)) _((void*)); \ + char handle_VC_problem[16]; \ +} + +#endif /* PERL_OBJECT */ + #endif /* _MSC_VER */ #ifdef __MINGW32__ /* Minimal Gnu-Win32 */