Change 16368 by jhi@alpha on 2002/05/03 12:31:52

        Integrate perlio;
        
        Several of non-default builds now seem to work reasonably well
        English.t seems to fail on an errno test, and socketpair blathers
        about something.
        Basic fix is to stop PERL_IMPLICIT_SYS turning on USE_PERLIO by the 
        back door, and instead have perlsdio.h vector stdio via iperlsys.h
        function tables (latter was done in earlier change).
        Update comments in Makefile.mk 
        
        Finish off 16350 for non-PERLIO build on linux,
        non PERL_IMPLICIT_SYS parts of iperlsys.h had junk
        for some slots which now perlsdio.h is targeting.
        
        setbuf / setvbuf are not PerlIO_ concepts
        
        perl_clone is a threads thing
        
        Have perlsdio.h use the iperlsys.h aliases and see
        if that helps non-PERLIO IMP_SYS on Win32.
        (Miniperl okay on linux).
        
        More layer syms
        
        Use PerlSIO_fdupopen() if not using PerlIO
        
        Do not build if not using layers

Affected files ...

.... //depot/perl/XSUB.h#64 integrate
.... //depot/perl/iperlsys.h#56 integrate
.... //depot/perl/makedef.pl#119 integrate
.... //depot/perl/perlio.c#170 integrate
.... //depot/perl/perlio.h#41 integrate
.... //depot/perl/perlsdio.h#25 integrate
.... //depot/perl/win32/makefile.mk#228 integrate
.... //depot/perl/win32/perlhost.h#52 integrate
.... //depot/perl/win32/win32.c#199 integrate
.... //depot/perl/win32/win32io.c#14 integrate

Differences ...

==== //depot/perl/XSUB.h#64 (text) ====
Index: perl/XSUB.h
--- perl/XSUB.h.~1~     Fri May  3 06:45:05 2002
+++ perl/XSUB.h Fri May  3 06:45:05 2002
@@ -339,9 +339,9 @@
 #    define putenv             PerlEnv_putenv
 #    define getenv             PerlEnv_getenv
 #    define uname              PerlEnv_uname
-#    define stdin              PerlIO_stdin()
-#    define stdout             PerlIO_stdout()
-#    define stderr             PerlIO_stderr()
+#    define stdin              PerlSIO_stdin()
+#    define stdout             PerlSIO_stdout()
+#    define stderr             PerlSIO_stderr()
 #    define fopen              PerlIO_open
 #    define fclose             PerlIO_close
 #    define feof               PerlIO_eof
@@ -357,9 +357,9 @@
 #    define freopen            PerlIO_reopen
 #    define fread(b,s,c,f)     PerlIO_read((f),(b),(s*c))
 #    define fwrite(b,s,c,f)    PerlIO_write((f),(b),(s*c))
-#    define setbuf             PerlIO_setbuf
-#    define setvbuf            PerlIO_setvbuf
-#    define setlinebuf         PerlIO_setlinebuf
+#    define setbuf             PerlSIO_setbuf
+#    define setvbuf            PerlSIO_setvbuf
+#    define setlinebuf         PerlSIO_setlinebuf
 #    define stdoutf            PerlIO_stdoutf
 #    define vfprintf           PerlIO_vprintf
 #    define ftell              PerlIO_tell

==== //depot/perl/iperlsys.h#56 (text) ====
Index: perl/iperlsys.h
--- perl/iperlsys.h.~1~ Fri May  3 06:45:05 2002
+++ perl/iperlsys.h     Fri May  3 06:45:05 2002
@@ -340,9 +340,9 @@
 #define PerlSIO_set_ptr(f,p)           PerlIOProc_abort()
 #endif
 #define PerlSIO_setlinebuf(f)          setlinebuf(f)
-#define PerlSIO_printf                 Perl_fprintf_nocontext
-#define PerlSIO_stdoutf                        *PL_StdIO->pPrintf
-#define PerlSIO_vprintf(f,fmt,a)       
+#define PerlSIO_printf                 fprintf
+#define PerlSIO_stdoutf                        printf
+#define PerlSIO_vprintf(f,fmt,a)       vfprintf(f,fmt,a)
 #define PerlSIO_ftell(f)               ftell(f)
 #define PerlSIO_fseek(f,o,w)           fseek(f,o,w)
 #define PerlSIO_fgetpos(f,p)           fgetpos(f,p)
@@ -809,7 +809,7 @@
 
 /* Shared memory macros */
 #ifdef NETWARE
-  
+
  #define PerlMemShared_malloc(size)                        \
        (*PL_Mem->pMalloc)(PL_Mem, (size))
 #define PerlMemShared_realloc(buf, size)                   \

==== //depot/perl/makedef.pl#119 (text) ====
Index: perl/makedef.pl
--- perl/makedef.pl.~1~ Fri May  3 06:45:05 2002
+++ perl/makedef.pl     Fri May  3 06:45:05 2002
@@ -114,6 +114,8 @@
     if ($define{PERL_IMPLICIT_SYS}) {
        output_symbol("perl_get_host_info");
        output_symbol("perl_alloc_override");
+    }
+    if ($define{USE_ITHREADS}) {
        output_symbol("perl_clone_host");
     }
 }
@@ -695,6 +697,30 @@
                         PerlIO_push
                         PerlIO_sv_dup
                         PerlIO_perlio
+
+Perl_PerlIO_clearerr
+Perl_PerlIO_close
+Perl_PerlIO_eof
+Perl_PerlIO_error
+Perl_PerlIO_fileno
+Perl_PerlIO_fill
+Perl_PerlIO_flush
+Perl_PerlIO_get_base
+Perl_PerlIO_get_bufsiz
+Perl_PerlIO_get_cnt
+Perl_PerlIO_get_ptr
+Perl_PerlIO_read
+Perl_PerlIO_seek
+Perl_PerlIO_set_cnt
+Perl_PerlIO_set_ptrcnt
+Perl_PerlIO_setlinebuf
+Perl_PerlIO_stderr
+Perl_PerlIO_stdin
+Perl_PerlIO_stdout
+Perl_PerlIO_tell
+Perl_PerlIO_unread
+Perl_PerlIO_write
+
 );
 
 
@@ -787,6 +813,8 @@
        # Skip the PerlIO layer symbols - although
        # nothing should have exported them any way
        skip_symbols \@layer_syms;
+        skip_symbols [qw(PL_def_layerlist PL_known_layers PL_perlio)];
+
        # Also do NOT add abstraction symbols from $perlio_sym
        # abstraction is done as #define to stdio
        # Remaining remnants that _may_ be functions
@@ -1242,14 +1270,11 @@
 perl_parse
 perl_run
 # Oddities from PerlIO 
-PerlIO_open
 PerlIO_binmode
 PerlIO_getpos
 PerlIO_init
-PerlIO_perlio
 PerlIO_setpos
 PerlIO_sprintf
-PerlIO_printf
 PerlIO_sv_dup
 PerlIO_tmpfile
 PerlIO_vsprintf

==== //depot/perl/perlio.c#170 (text) ====
Index: perl/perlio.c
--- perl/perlio.c.~1~   Fri May  3 06:45:05 2002
+++ perl/perlio.c       Fri May  3 06:45:05 2002
@@ -186,7 +186,15 @@
 PerlIO *
 PerlIO_fdupopen(pTHX_ PerlIO *f, CLONE_PARAMS *param, int flags)
 {
-#ifndef PERL_MICRO
+#ifdef PERL_MICRO
+    return NULL;
+#else
+#ifdef PERL_IMPLICIT_SYS
+    return PerlSIO_fdupopen(f); 
+#else
+#ifdef WIN32
+    return win32_fdupopen(f);
+#else
     if (f) {
        int fd = PerlLIO_dup(PerlIO_fileno(f));
        if (fd >= 0) {
@@ -206,6 +214,8 @@
     }
 #endif
     return NULL;
+#endif
+#endif
 }
 
 

==== //depot/perl/perlio.h#41 (text) ====
Index: perl/perlio.h
--- perl/perlio.h.~1~   Fri May  3 06:45:05 2002
+++ perl/perlio.h       Fri May  3 06:45:05 2002
@@ -40,7 +40,7 @@
 #if defined(PERL_IMPLICIT_SYS)
 #ifndef USE_PERLIO
 #ifndef NETWARE
-# define USE_PERLIO
+/* # define USE_PERLIO */
 #endif
 #endif
 #endif

==== //depot/perl/perlsdio.h#25 (text) ====
Index: perl/perlsdio.h
--- perl/perlsdio.h.~1~ Fri May  3 06:45:05 2002
+++ perl/perlsdio.h     Fri May  3 06:45:05 2002
@@ -18,23 +18,23 @@
  * Make this as close to original stdio as possible.
  */
 #define PerlIO                         FILE
-#define PerlIO_stderr()                        stderr
-#define PerlIO_stdout()                        stdout
-#define PerlIO_stdin()                 stdin
+#define PerlIO_stderr()                        PerlSIO_stderr
+#define PerlIO_stdout()                        PerlSIO_stdout
+#define PerlIO_stdin()                 PerlSIO_stdin
 
 #define PerlIO_isutf8(f)               0
 
-#define PerlIO_printf                  fprintf
-#define PerlIO_stdoutf                 printf
-#define PerlIO_vprintf(f,fmt,a)                vfprintf(f,fmt,a)
-#define PerlIO_write(f,buf,count)      fwrite1(buf,1,count,f)
+#define PerlIO_printf                  PerlSIO_printf
+#define PerlIO_stdoutf                 PerlSIO_stdoutf
+#define PerlIO_vprintf(f,fmt,a)                PerlSIO_vprintf(f,fmt,a)
+#define PerlIO_write(f,buf,count)      PerlSIO_fwrite(buf,1,count,f)
 #define PerlIO_unread(f,buf,count)     (-1)
-#define PerlIO_open                    fopen
-#define PerlIO_fdopen                  fdopen
-#define PerlIO_reopen                  freopen
-#define PerlIO_close(f)                        fclose(f)
-#define PerlIO_puts(f,s)               fputs(s,f)
-#define PerlIO_putc(f,c)               fputc(c,f)
+#define PerlIO_open                    PerlSIO_fopen
+#define PerlIO_fdopen                  PerlSIO_fdopen
+#define PerlIO_reopen                  PerlSIO_freopen
+#define PerlIO_close(f)                        PerlSIO_fclose(f)
+#define PerlIO_puts(f,s)               PerlSIO_fputs(f,s)
+#define PerlIO_putc(f,c)               PerlSIO_fputc(f,c)
 #if defined(VMS)
 #  if defined(__DECC)
      /* Unusual definition of ungetc() here to accomodate fast_sv_gets()'
@@ -57,26 +57,26 @@
                (feof(f) ? 0 : (SSize_t)fread(buf,1,count,f))
 #  define PerlIO_tell(f)               ftell(f)
 #else
-#  define PerlIO_getc(f)               getc(f)
-#  define PerlIO_ungetc(f,c)           ungetc(c,f)
-#  define PerlIO_read(f,buf,count)     (SSize_t)fread(buf,1,count,f)
-#  define PerlIO_tell(f)               ftell(f)
+#  define PerlIO_getc(f)               PerlSIO_fgetc(f)
+#  define PerlIO_ungetc(f,c)           PerlSIO_ungetc(c,f)
+#  define PerlIO_read(f,buf,count)     (SSize_t)PerlSIO_fread(buf,1,count,f)
+#  define PerlIO_tell(f)               PerlSIO_ftell(f)
 #endif
-#define PerlIO_eof(f)                  feof(f)
+#define PerlIO_eof(f)                  PerlSIO_feof(f)
 #define PerlIO_getname(f,b)            fgetname(f,b)
-#define PerlIO_error(f)                        ferror(f)
-#define PerlIO_fileno(f)               fileno(f)
-#define PerlIO_clearerr(f)             clearerr(f)
-#define PerlIO_flush(f)                        Fflush(f)
+#define PerlIO_error(f)                        PerlSIO_ferror(f)
+#define PerlIO_fileno(f)               PerlSIO_fileno(f)
+#define PerlIO_clearerr(f)             PerlSIO_clearerr(f)
+#define PerlIO_flush(f)                        PerlSIO_fflush(f)
 #if defined(VMS) && !defined(__DECC)
 /* Old VAXC RTL doesn't reset EOF on seek; Perl folk seem to expect this */
 #define PerlIO_seek(f,o,w)     (((f) && (*f) && ((*f)->_flag &= 
~_IOEOF)),fseek(f,o,w))
 #else
-#  define PerlIO_seek(f,o,w)           fseek(f,o,w)
+#  define PerlIO_seek(f,o,w)           PerlSIO_fseek(f,o,w)
 #endif
 
-#define PerlIO_rewind(f)               rewind(f)
-#define PerlIO_tmpfile()               tmpfile()
+#define PerlIO_rewind(f)               PerlSIO_rewind(f)
+#define PerlIO_tmpfile()               PerlSIO_tmpfile()
 
 #define PerlIO_importFILE(f,fl)                (f)
 #define PerlIO_exportFILE(f,fl)                (f)
@@ -84,21 +84,21 @@
 #define PerlIO_releaseFILE(p,f)                ((void) 0)
 
 #ifdef HAS_SETLINEBUF
-#define PerlIO_setlinebuf(f)           setlinebuf(f);
+#define PerlIO_setlinebuf(f)           PerlSIO_setlinebuf(f);
 #else
-#define PerlIO_setlinebuf(f)           setvbuf(f, Nullch, _IOLBF, 0);
+#define PerlIO_setlinebuf(f)           PerlSIO_setvbuf(f, Nullch, _IOLBF, 0);
 #endif
 
 /* Now our interface to Configure's FILE_xxx macros */
 
 #ifdef USE_STDIO_PTR
 #define PerlIO_has_cntptr(f)           1
-#define PerlIO_get_ptr(f)              FILE_ptr(f)
-#define PerlIO_get_cnt(f)              FILE_cnt(f)
+#define PerlIO_get_ptr(f)              PerlSIO_get_ptr(f)
+#define PerlIO_get_cnt(f)              PerlSIO_get_cnt(f)
 
 #ifdef STDIO_CNT_LVALUE
 #define PerlIO_canset_cnt(f)           1
-#define PerlIO_set_cnt(f,c)            (FILE_cnt(f) = (c))
+#define PerlIO_set_cnt(f,c)            PerlSIO_set_cnt(f,c)
 #ifdef STDIO_PTR_LVALUE
 #ifdef STDIO_PTR_LVAL_NOCHANGE_CNT
 #define PerlIO_fast_gets(f)            1
@@ -111,11 +111,11 @@
 
 #ifdef STDIO_PTR_LVALUE
 #ifdef STDIO_PTR_LVAL_NOCHANGE_CNT
-#define PerlIO_set_ptrcnt(f,p,c)      STMT_START {FILE_ptr(f) = (p), 
PerlIO_set_cnt(f,c);} STMT_END
+#define PerlIO_set_ptrcnt(f,p,c)      STMT_START {PerlSIO_set_ptr(f,p), 
+PerlIO_set_cnt(f,c);} STMT_END
 #else
 #ifdef STDIO_PTR_LVAL_SETS_CNT
 /* assert() may pre-process to ""; potential syntax error (FILE_ptr(), ) */
-#define PerlIO_set_ptrcnt(f,p,c)      STMT_START {FILE_ptr(f) = (p); 
assert(FILE_cnt(f) == (c));} STMT_END
+#define PerlIO_set_ptrcnt(f,p,c)      STMT_START {PerlSIO_set_ptr(f,p); 
+assert(PerlSIO_get_cnt(f) == (c));} STMT_END
 #define PerlIO_fast_gets(f)            1
 #else
 #define PerlIO_set_ptrcnt(f,p,c)       abort()
@@ -141,8 +141,8 @@
 
 #ifdef FILE_base
 #define PerlIO_has_base(f)             1
-#define PerlIO_get_base(f)             FILE_base(f)
-#define PerlIO_get_bufsiz(f)           FILE_bufsiz(f)
+#define PerlIO_get_base(f)             PerlSIO_get_base(f)
+#define PerlIO_get_bufsiz(f)           PerlSIO_get_bufsiz(f)
 #else
 #define PerlIO_has_base(f)             0
 #define PerlIO_get_base(f)             (abort(),(void *)0)

==== //depot/perl/win32/makefile.mk#228 (text) ====
Index: perl/win32/makefile.mk
--- perl/win32/makefile.mk.~1~  Fri May  3 06:45:05 2002
+++ perl/win32/makefile.mk      Fri May  3 06:45:05 2002
@@ -49,26 +49,30 @@
 
 #
 # uncomment to enable multiple interpreters.  This is need for fork()
-# emulation.
+# emulation and for thread support.
 #
 USE_MULTI      *= define
 
 #
-# Beginnings of interpreter cloning/threads; still very incomplete.
-# This should be enabled to get the fork() emulation.  This needs
-# USE_MULTI as well.
+# Interpreter cloning/threads; now reasonably complete.
+# This should be enabled to get the fork() emulation.  
+# This needs USE_MULTI above.
 #
 USE_ITHREADS   *= define
 
 #
 # uncomment to enable the implicit "host" layer for all system calls
-# made by perl.  This needs USE_MULTI above.  This is also needed to
-# get fork().
+# made by perl.  This needs USE_MULTI above.  
+# This is also needed to get fork().
 #
 USE_IMP_SYS    *= define
 
 #
-# Comment to disable I/O subsystem and use compiler's stdio for IO 
+# Comment out next assign to disable perl's I/O subsystem and use compiler's 
+# stdio for IO - depending on your compiler vendor and run time library you may 
+# then get a number of fails from make test i.e. bugs - complain to them not us ;-). 
+# You will also be unable to take full advantage of perl5.8's support for multiple 
+# encodings and may see lower IO performance. You have been warned.
 USE_PERLIO     = define
 
 #
@@ -112,7 +116,7 @@
 # If not enabled, we automatically try to use maximum optimization
 # with all compilers that are known to have a working optimizer.
 #
-CFG            *= Debug
+#CFG           *= Debug
 
 #
 # uncomment to enable use of PerlCRT.DLL when using the Visual C compiler.

==== //depot/perl/win32/perlhost.h#52 (text) ====
==== //depot/perl/win32/win32.c#199 (text) ====
Index: perl/win32/win32.c
--- perl/win32/win32.c.~1~      Fri May  3 06:45:05 2002
+++ perl/win32/win32.c  Fri May  3 06:45:05 2002
@@ -2643,6 +2643,7 @@
 #ifdef USE_RTL_POPEN
     return _popen(command, mode);
 #else
+    dTHX;
     int p[2];
     int parent, child;
     int stdfd, oldfd;
@@ -4036,6 +4037,58 @@
     return (intptr_t)_get_osfhandle(fd);
 }
 
+FILE *
+win32_fdupopen(FILE *pf)
+{
+    FILE* pfdup;
+    fpos_t pos;
+    char mode[3];
+    int fileno = win32_dup(win32_fileno(pf));
+
+    /* open the file in the same mode */
+#ifdef __BORLANDC__
+    if((pf)->flags & _F_READ) {
+       mode[0] = 'r';
+       mode[1] = 0;
+    }
+    else if((pf)->flags & _F_WRIT) {
+       mode[0] = 'a';
+       mode[1] = 0;
+    }
+    else if((pf)->flags & _F_RDWR) {
+       mode[0] = 'r';
+       mode[1] = '+';
+       mode[2] = 0;
+    }
+#else
+    if((pf)->_flag & _IOREAD) {
+       mode[0] = 'r';
+       mode[1] = 0;
+    }
+    else if((pf)->_flag & _IOWRT) {
+       mode[0] = 'a';
+       mode[1] = 0;
+    }
+    else if((pf)->_flag & _IORW) {
+       mode[0] = 'r';
+       mode[1] = '+';
+       mode[2] = 0;
+    }
+#endif
+
+    /* it appears that the binmode is attached to the
+     * file descriptor so binmode files will be handled
+     * correctly
+     */
+    pfdup = win32_fdopen(fileno, mode);
+
+    /* move the file pointer to the same position */
+    if (!fgetpos(pf, &pos)) {
+       fsetpos(pfdup, &pos);
+    }
+    return pfdup;
+}
+
 DllExport void*
 win32_dynaload(const char* filename)
 {

==== //depot/perl/win32/win32io.c#14 (text) ====
Index: perl/win32/win32io.c
--- perl/win32/win32io.c.~1~    Fri May  3 06:45:05 2002
+++ perl/win32/win32io.c        Fri May  3 06:45:05 2002
@@ -10,11 +10,15 @@
 #include <sys/stat.h>
 #include "EXTERN.h"
 #include "perl.h"
+
+#ifdef PERLIO_LAYERS
+
 #include "perliol.h"
 
 #define NO_XSLOCKS
 #include "XSUB.h"
 
+
 /* Bottom-most level for Win32 case */
 
 typedef struct
@@ -359,5 +363,5 @@
  NULL, /* set_ptrcnt */
 };
 
-
+#endif
 
End of Patch.

Reply via email to