applied patch, with indentation tweaks
[p5sagit/p5-mst-13.2.git] / win32 / runperl.c
index d008158..17d2ac2 100644 (file)
@@ -8,13 +8,9 @@
 #include "XSUB.H"
 #include "Win32iop.h"
 
-#undef errno
-#if defined(_MT)
-_CRTIMP int * __cdecl _errno(void);
-#define errno (*_errno())
-#else
-_CRTIMP extern int errno;
-#endif
+#define errno (*win32_errno())
+#define stdout (win32_stdout())
+#define stderr (win32_stderr())
 
 CPerlObj *pPerl;
 
@@ -27,12 +23,11 @@ CPerlObj *pPerl;
 #include <ipproc.h>
 #include <ipstdio.h>
 
-class IPerlStdIOWin : public IPerlStdIO
-{
-public:
-    virtual int OpenOSfhandle(long osfhandle, int flags) = 0;
-    virtual int GetOSfhandle(int filenum) = 0;
-};
+#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);
@@ -46,15 +41,15 @@ public:
     CPerlDir() {};
     virtual int Makedir(const char *dirname, int mode, int &err)
     {
-       return win32_mkdir(dirname, mode);
+       CALLFUNC0RET(win32_mkdir(dirname, mode));
     };
     virtual int Chdir(const char *dirname, int &err)
     {
-       return win32_chdir(dirname);
+       CALLFUNC0RET(win32_chdir(dirname));
     };
     virtual int Rmdir(const char *dirname, int &err)
     {
-       return win32_rmdir(dirname);
+       CALLFUNC0RET(win32_rmdir(dirname));
     };
     virtual int Close(DIR *dirp, int &err)
     {
@@ -83,7 +78,8 @@ public:
 };
 
 
-extern char * g_win32_perllib_path(char *sfx,...);
+extern char * g_win32_get_privlib(char *pl);
+extern char * g_win32_get_sitelib(char *pl);
 class CPerlEnv : public IPerlEnv
 {
 public:
@@ -94,19 +90,15 @@ public:
     };
     virtual int Putenv(const char *envstring, int &err)
     {
-       return _putenv(envstring);
+       return putenv(envstring);
     };
-    virtual char* LibPath(char *sfx, ...)
+    virtual char* LibPath(char *pl)
     {
-       LPSTR ptr1, ptr2, ptr3, ptr4, ptr5;
-       va_list ap;
-       va_start(ap,sfx);
-       ptr1 = va_arg(ap,char *);
-       ptr2 = va_arg(ap,char *);
-       ptr3 = va_arg(ap,char *);
-       ptr4 = va_arg(ap,char *);
-       ptr5 = va_arg(ap,char *);
-       return g_win32_perllib_path(sfx, ptr1, ptr2, ptr3, ptr4, ptr5);
+       return g_win32_get_privlib(pl);
+    };
+    virtual char* SiteLibPath(char *pl)
+    {
+       return g_win32_get_sitelib(pl);
     };
 };
 
@@ -257,14 +249,14 @@ public:
        char *r = win32_inet_ntoa(in);
        PROCESS_AND_RETURN;
     };
-    virtual int IoctlSocket(SOCKET s, long cmd, u_long *argp, int& err)
+    virtual int Listen(SOCKET s, int backlog, int &err)
     {
-       int r = win32_ioctlsocket(s, cmd, argp);
+       int r = win32_listen(s, backlog);
        PROCESS_AND_RETURN;
     };
-    virtual int Listen(SOCKET s, int backlog, int &err)
+    virtual int Recv(SOCKET s, char* buffer, int len, int flags, int &err)
     {
-       int r = win32_listen(s, backlog);
+       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)
@@ -323,6 +315,16 @@ public:
         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;
+    };
 };
 
 
@@ -493,7 +495,7 @@ public:
     };
     virtual int Unlink(const char *filename, int &err)
     {
-       chmod(filename, _S_IREAD | _S_IWRITE);
+       chmod(filename, S_IREAD | S_IWRITE);
        CALLFUNCRET(unlink(filename))
     };
     virtual int Utime(char *filename, struct utimbuf *times, int &err)
@@ -593,6 +595,8 @@ public:
     };
     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)
@@ -601,7 +605,7 @@ public:
     };
     virtual int Pipe(int *phandles)
     {
-       return win32_pipe(phandles, 512, _O_BINARY);
+       return win32_pipe(phandles, 512, O_BINARY);
     };
     virtual int Setuid(uid_t u)
     {
@@ -671,7 +675,7 @@ public:
 };
 
 
-class CPerlStdIO : public IPerlStdIOWin
+class CPerlStdIO : public IPerlStdIO
 {
 public:
     CPerlStdIO() {};
@@ -716,19 +720,30 @@ public:
     };
     virtual char* GetBase(PerlIO* pf, int &err)
     {
-       return ((FILE*)pf)->_base;
+       FILE *f = (FILE*)pf;
+       return FILE_base(f);
     };
     virtual int GetBufsiz(PerlIO* pf, int &err)
     {
-       return ((FILE*)pf)->_bufsiz;
+       FILE *f = (FILE*)pf;
+       return FILE_bufsiz(f);
     };
     virtual int GetCnt(PerlIO* pf, int &err)
     {
-       return ((FILE*)pf)->_cnt;
+       FILE *f = (FILE*)pf;
+       return FILE_cnt(f);
     };
     virtual char* GetPtr(PerlIO* pf, int &err)
     {
-       return ((FILE*)pf)->_ptr;
+       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)
     {
@@ -791,12 +806,14 @@ public:
     };
     virtual void SetCnt(PerlIO* pf, int n, int &err)
     {
-       ((FILE*)pf)->_cnt = n;
+       FILE *f = (FILE*)pf;
+       FILE_cnt(f) = n;
     };
     virtual void SetPtrCnt(PerlIO* pf, char * ptr, int n, int& err)
     {
-       ((FILE*)pf)->_ptr = ptr;
-       ((FILE*)pf)->_cnt = n;
+       FILE *f = (FILE*)pf;
+       FILE_ptr(f) = ptr;
+       FILE_cnt(f) = n;
     };
     virtual void Setlinebuf(PerlIO* pf, int &err)
     {
@@ -876,9 +893,6 @@ public:
 
 
 static void xs_init _((CPERLarg));
-#define stderr (&_iob[2])
-#undef fprintf
-#undef environ
 
 class CPerlHost
 {
@@ -897,7 +911,7 @@ public:
                }
                catch(...)
                {
-                   fprintf(stderr, "%s\n", "Error: Unable to construct data structures");
+                   win32_fprintf(stderr, "%s\n", "Error: Unable to construct data structures");
                    pPerl->perl_free();
                    pPerl = NULL;
                }
@@ -905,18 +919,17 @@ public:
        }
        catch(...)
        {
-           fprintf(stderr, "%s\n", "Error: Unable to allocate memory");
+           win32_fprintf(stderr, "%s\n", "Error: Unable to allocate memory");
            pPerl = NULL;
        }
        return (pPerl != NULL);
     };
     inline int PerlParse(int argc, char** argv, char** env)
     {
-       char* environ = NULL;
        int retVal;
        try
        {
-           retVal = pPerl->perl_parse(xs_init, argc, argv, (env == NULL || *env == NULL ? &environ : env));
+           retVal = pPerl->perl_parse(xs_init, argc, argv, env);
        }
        catch(int x)
        {
@@ -925,9 +938,10 @@ public:
        }
        catch(...)
        {
-           fprintf(stderr, "Error: Parse exception\n");
+           win32_fprintf(stderr, "Error: Parse exception\n");
            retVal = -1;
        }
+       *win32_errno() = 0;
        return retVal;
     };
     inline int PerlRun(void)
@@ -944,7 +958,7 @@ public:
        }
        catch(...)
        {
-           fprintf(stderr, "Error: Runtime exception\n");
+           win32_fprintf(stderr, "Error: Runtime exception\n");
            retVal = -1;
        }
        return retVal;
@@ -984,7 +998,7 @@ main(int argc, char **argv, char **env)
        exit(exitstatus);
 
 
-    exitstatus = host.PerlParse(argc, argv, env);
+    exitstatus = host.PerlParse(argc, argv, NULL);
 
     if (!exitstatus)
     {
@@ -1001,7 +1015,7 @@ char *staticlinkmodules[] = {
     NULL,
 };
 
-EXTERN_C void boot_DynaLoader _((CPERLarg_ CV* cv));
+EXTERN_C void boot_DynaLoader _((CV* cv _CPERLarg));
 
 static void
 xs_init(CPERLarg)
@@ -1013,7 +1027,6 @@ xs_init(CPERLarg)
 
 #else  /* PERL_OBJECT */
 
-/* Say NO to CPP! Hallelujah! */
 #ifdef __GNUC__
 /*
  * GNU C does not do __declspec()