This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
perl 5.003_02: [no incremental changelog available]
authorLarry Wall <lwall@sems.com>
Sat, 10 Aug 1996 15:24:58 +0000 (15:24 +0000)
committerLarry Wall <lwall@sems.com>
Sat, 10 Aug 1996 15:24:58 +0000 (15:24 +0000)
138 files changed:
Changes
Configure
MANIFEST
Makefile.SH
cflags.SH
config_h.SH
cop.h
deb.c
doio.c
doop.c
dump.c
embed.h
embed.pl
ext/DB_File/DB_File.pm
ext/DynaLoader/Makefile.PL
ext/DynaLoader/dl_aix.xs
ext/DynaLoader/dl_dld.xs
ext/DynaLoader/dl_dlopen.xs
ext/DynaLoader/dl_hpux.xs
ext/DynaLoader/dl_next.xs
ext/DynaLoader/dl_os2.xs
ext/DynaLoader/dl_vms.xs
ext/DynaLoader/dlutils.c
ext/FileHandle/FileHandle.xs
ext/IO/IO.xs
ext/IO/lib/IO/Handle.pm
ext/IO/lib/IO/Select.pm
ext/IO/lib/IO/Socket.pm
ext/Opcode/Opcode.xs
ext/POSIX/POSIX.xs
ext/POSIX/mkposixman.pl [new file with mode: 0644]
global.sym
gv.c
handy.h
hints/README.NeXT [new file with mode: 0644]
hints/next_3.sh
hints/next_3_2.sh [deleted file]
hints/next_3_3.sh [deleted file]
hints/next_4.sh
hints/os2.sh
interp.sym
lib/ExtUtils/MM_Unix.pm
lib/ExtUtils/MakeMaker.pm
lib/ExtUtils/Mksymlists.pm
lib/Test/Harness.pm
lib/Text/ParseWords.pm
makedepend.SH
malloc.c
mg.c
myconfig
nostdio.h [new file with mode: 0644]
op.c
os2/Makefile.SHs
os2/OS2/ExtAttr/Changes [new file with mode: 0644]
os2/OS2/ExtAttr/ExtAttr.pm [new file with mode: 0644]
os2/OS2/ExtAttr/ExtAttr.xs [new file with mode: 0644]
os2/OS2/ExtAttr/MANIFEST [new file with mode: 0644]
os2/OS2/ExtAttr/Makefile.PL [new file with mode: 0644]
os2/OS2/ExtAttr/myea.h [new file with mode: 0644]
os2/OS2/ExtAttr/t/os2_ea.t [new file with mode: 0644]
os2/OS2/ExtAttr/typemap [new file with mode: 0644]
os2/OS2/PrfDB/Changes [new file with mode: 0644]
os2/OS2/PrfDB/MANIFEST [new file with mode: 0644]
os2/OS2/PrfDB/Makefile.PL [new file with mode: 0644]
os2/OS2/PrfDB/PrfDB.pm [new file with mode: 0644]
os2/OS2/PrfDB/PrfDB.xs [new file with mode: 0644]
os2/OS2/PrfDB/t/os2_prfdb.t [new file with mode: 0644]
os2/OS2/PrfDB/typemap [new file with mode: 0644]
os2/OS2/Process/MANIFEST [new file with mode: 0644]
os2/OS2/Process/Makefile.PL [new file with mode: 0644]
os2/OS2/Process/Process.pm [new file with mode: 0644]
os2/OS2/Process/Process.xs [new file with mode: 0644]
os2/OS2/REXX/Changes [new file with mode: 0644]
os2/OS2/REXX/MANIFEST [new file with mode: 0644]
os2/OS2/REXX/Makefile.PL [new file with mode: 0644]
os2/OS2/REXX/REXX.pm [new file with mode: 0644]
os2/OS2/REXX/REXX.xs [new file with mode: 0644]
os2/OS2/REXX/t/rx_cmprt.t [new file with mode: 0644]
os2/OS2/REXX/t/rx_dllld.t [new file with mode: 0644]
os2/OS2/REXX/t/rx_objcall.t [new file with mode: 0644]
os2/OS2/REXX/t/rx_sql.test [new file with mode: 0644]
os2/OS2/REXX/t/rx_tiesql.test [new file with mode: 0644]
os2/OS2/REXX/t/rx_tievar.t [new file with mode: 0644]
os2/OS2/REXX/t/rx_tieydb.t [new file with mode: 0644]
os2/OS2/REXX/t/rx_varset.t [new file with mode: 0644]
os2/OS2/REXX/t/rx_vrexx.t [new file with mode: 0644]
os2/README [new file with mode: 0644]
os2/README.old [deleted file]
os2/diff.configure
os2/dlfcn.h
os2/os2.c
os2/os2ish.h
os2/perl2cmd.pl
patchlevel.h
perl.c
perl.h
perlio.c [new file with mode: 0644]
perlio.h [new file with mode: 0644]
perlsdio.h [new file with mode: 0644]
perlsfio.h [new file with mode: 0644]
perly.c
perly.h
plan9/fndvers
plan9/genconfig.pl
plan9/mkfile
plan9/perlplan9.doc
plan9/perlplan9.pod
plan9/setup.rc
plan9/versnum [new file with mode: 0644]
pod/Makefile.PL [new file with mode: 0644]
pod/perl.pod
pod/perlapio.pod [new file with mode: 0644]
pod/perlobj.pod
pp.c
pp_ctl.c
pp_hot.c
pp_sys.c
proto.h
regcomp.c
regexec.c
run.c
scope.c
sv.c
sv.h
t/comp/redef.t [new file with mode: 0644]
t/lib/db-btree.t
t/lib/io_udp.t
t/op/inc.t [new file with mode: 0644]
taint.c
toke.c
universal.c
util.c
utils/h2ph.PL
utils/h2xs.PL
vms/perly_c.vms
vms/vms.c
x2p/Makefile.SH
x2p/cflags.SH

diff --git a/Changes b/Changes
index 7a8b96b..90175e0 100644 (file)
--- a/Changes
+++ b/Changes
@@ -7,6 +7,47 @@ site, in the .../src/5.0 directory for full version releases,
 or in the .../src/5/0/unsupported directory for sub-version
 releases.)
 
+----------------
+Version 5.003_02
+----------------
+o Visible Changes to Core Functionality
+  - Redefining constant subs, or changing sub's prototype now give warnings.
+  - Fixes for ++/-- of values close to max/min size of an integer 
+  - Warning for un-qualified bareword as handler in $SIG{}. 
+  - UNIVERSAL::isa can now be called as static method. 
+
+o Changes in Core Internals
+  - PerlIO abstraction added.
+    Perl core and standard extensions no longer assume ANSI C's stdio is IO
+    mechanism, Default Configure mode is still to use stdio via set of C macros.
+    Alternate modes are to use stdio via one perlio.c module, or 
+    to use sfio if available.
+    
+  - Several bug fixs from perl5-porters
+      - Make sources non-ANSI C correct again.
+      - SUPER in gv.c 
+      - Last of shared-hash-key patches
+      - eval '(0,1..3)'; # --> SegFault
+      - coredumps after simple subsitutes.
+      - Correction to UNIVERSAL::VERSION docs.
+      - Fixed io_udp test.
+      - Fixed another abuse of malloc'ed memory.
+  - Enabled DEBUGING_MSTATS whenever perl's malloc() is used.
+  - Reverted to default of not hiding perl's malloc (if used). 
+
+o Changes in the Standard Library and Utilities
+  - Fixed MakeMaker for static SDBM and builing in a link tree.
+  - Upgraded to IO-1.09, and includes latest (still experimental) IO::Select. 
+  - Documentation/test tweak to DB_File
+  - h2xs upgrade to allow use C::Scan module 
+
+o Changes in OS-specific and Build-time Support
+  - Attempted to re-created 5.003_01's NeXT support with metaconfig units.
+  - Updated MANIFEST 
+  - make minitest now depends on lib/Config.pm, as some of tests require it. 
+  - Included latest plan9 sub-directory
+  - Applied OS/2 patches.
+  - Typo patch for VMS.
 
 ----------------
 Version 5.003_01
index e74287d..1c1ac68 100755 (executable)
--- a/Configure
+++ b/Configure
@@ -20,7 +20,7 @@
 
 # $Id: Head.U,v 3.0.1.8 1995/07/25 13:40:02 ram Exp $
 #
-# Generated on Wed Feb 21 14:26:18 EST 1996 [metaconfig 3.0 PL60]
+# Generated on Thu Aug  8 17:48:02 BST 1996 [metaconfig 3.0 PL60]
 
 cat >/tmp/c1$$ <<EOF
 ARGGGHHHH!!!!!
@@ -226,12 +226,12 @@ baserev=''
 bin=''
 binexp=''
 installbin=''
+bin_sh=''
 byteorder=''
 cc=''
 gccversion=''
 ccflags=''
 cppflags=''
-mab=''
 ldflags=''
 lkflags=''
 locincpth=''
@@ -323,6 +323,7 @@ d_open3=''
 d_fpathconf=''
 d_pathconf=''
 d_pause=''
+d_perlstdio=''
 d_pipe=''
 d_poll=''
 d_portable=''
@@ -356,6 +357,7 @@ d_setreuid=''
 d_setrgid=''
 d_setruid=''
 d_setsid=''
+d_sfio=''
 d_shm=''
 d_shmat=''
 d_shmatprototype=''
@@ -459,6 +461,7 @@ d_pwcomment=''
 d_pwexpire=''
 d_pwquota=''
 i_pwd=''
+i_sfio=''
 i_stddef=''
 i_stdlib=''
 i_string=''
@@ -486,6 +489,7 @@ i_time=''
 timeincl=''
 i_unistd=''
 i_utime=''
+i_values=''
 i_stdarg=''
 i_varargs=''
 i_varhdr=''
@@ -500,6 +504,7 @@ xlibpth=''
 libs=''
 lns=''
 lseektype=''
+mab=''
 d_mymalloc=''
 freetype=''
 mallocobj=''
@@ -542,6 +547,7 @@ package=''
 spackage=''
 pager=''
 patchlevel=''
+subversion=''
 perladmin=''
 perlpath=''
 prefix=''
@@ -572,7 +578,6 @@ ssizetype=''
 startperl=''
 startsh=''
 stdchar=''
-subversion=''
 sysman=''
 uidtype=''
 nm_opt=''
@@ -678,6 +683,7 @@ usesafe=true
 exe_ext='' 
 : Extra object files, if any, needed on this platform.
 archobjs=''
+bin_sh='/bin/sh'
 : Possible local include directories to search.
 : Set locincpth to "" in a hint file to defeat local include searches.
 locincpth="/usr/local/include /opt/local/include /usr/gnu/include"
@@ -703,11 +709,12 @@ glibpth="$glibpth /usr/ccs/lib /usr/ucblib /usr/shlib"
 : machines, like the mips.  Usually, it should be empty.
 plibpth=''
 
+mab=''
 : full support for void wanted by default
 defvoidused=15
 
 : List of libraries we want.
-libswanted='net socket inet nsl nm ndbm gdbm dbm db malloc dl'
+libswanted='sfio net socket inet nsl nm ndbm gdbm dbm db malloc dl'
 libswanted="$libswanted dld ld sun m c cposix posix ndir dir crypt"
 libswanted="$libswanted ucb bsd BSD PW x"
 : We probably want to search /usr/shlib before most other libraries.
@@ -717,8 +724,79 @@ glibpth="/usr/shlib $glibpth"
 : Do not use vfork unless overridden by a hint file.
 usevfork=false
 
+: see if sh knows # comments
+echo " "
+echo "Checking your sh to see if it knows about # comments..." >&4
+if `sh -c '#' >/dev/null 2>&1`; then
+       echo "Your sh handles # comments correctly."
+       shsharp=true
+       spitshell=cat
+       echo " "
+       echo "Okay, let's see if #! works on this system..."
+       xcat=/bin/cat
+       test -f $xcat || xcat=/usr/bin/cat
+       echo "#!$xcat" >try
+       $eunicefix try
+       chmod +x try
+       ./try > today
+       if test -s today; then
+               echo "It does."
+               sharpbang='#!'
+       else
+               echo "#! $xcat" > try
+               $eunicefix try
+               chmod +x try
+               ./try > today
+               if test -s today; then
+                       echo "It does."
+                       sharpbang='#! '
+               else
+                       echo "It's just a comment."
+                       sharpbang=': use '
+               fi
+       fi
+else
+       echo "Your sh doesn't grok # comments--I will strip them later on."
+       shsharp=false
+       cd ..
+       echo "exec grep -v '^[  ]*#'" >spitshell
+       chmod +x spitshell
+       $eunicefix spitshell
+       spitshell=`pwd`/spitshell
+       cd UU
+       echo "I presume that if # doesn't work, #! won't work either!"
+       sharpbang=': use '
+fi
+rm -f try today
+
+: figure out how to guarantee sh startup
+echo " "
+echo "Checking out how to guarantee sh startup..." >&4
+case "$SYSTYPE" in
+*bsd*|sys5*) startsh=$sharpbang"/$SYSTYPE/bin/sh";;
+*) startsh=$sharpbang'/bin/sh';;
+esac
+echo "Let's see if '$startsh' works..."
+cat >try <<EOSS
+$startsh
+set abc
+test "$?abc" != 1
+EOSS
+
+chmod +x try
+$eunicefix try
+if ./try; then
+       echo "Yup, it does."
+else
+echo "Nope.  You may have to fix up the shell scripts to make sure sh runs them."
+fi
+rm -f try
+
 : script used to extract .SH files with variable substitutions
-cat >extract <<'EOS'
+cat >extract <<EOS
+$startsh
+EOS
+cat >>extract <<'EOS'
 CONFIG=true
 echo "Doing variable substitutions on .SH files..."
 if test -f MANIFEST; then
@@ -1014,7 +1092,7 @@ THIS PACKAGE SEEMS TO BE INCOMPLETE.
 You have the option of continuing the configuration process, despite the
 distinct possibility that your kit is damaged, by typing 'y'es.  If you
 do, don't blame me if something goes wrong.  I advise you to type 'n'o
-and contact the author (doughera@lafcol.lafayette.edu).
+and contact the author (lwall@sems.com).
 
 EOM
                echo $n "Continue? [n] $c" >&4
@@ -1155,7 +1233,10 @@ EOF
 : general instructions
 needman=true
 firsttime=true
-user=`( (logname) 2>/dev/null || whoami) 2>&1`
+user=`(logname) 2>/dev/null`
+case "$user" in "")
+       user=`whoami 2>&1` ;;
+esac
 if $contains "^$user\$" ../.config/instruct >/dev/null 2>&1; then
        firsttime=false
        echo " "
@@ -1211,7 +1292,7 @@ Much effort has been expended to ensure that this shell script will run on any
 Unix system.  If despite that it blows up on yours, your best bet is to edit
 Configure and run it again.  If you can't run Configure for some reason,
 you'll have to generate a config.sh file by hand.  Whatever problems you
-have, let me (doughera@lafcol.lafayette.edu) know how I blew it.
+have, let me (lwall@sems.com) know how I blew it.
 
 This installation script affects things in two ways:
 
@@ -1232,74 +1313,6 @@ EOH
        esac
 fi
 
-: see if sh knows # comments
-echo " "
-echo "Checking your sh to see if it knows about # comments..." >&4
-if `sh -c '#' >/dev/null 2>&1`; then
-       echo "Your sh handles # comments correctly."
-       shsharp=true
-       spitshell=cat
-       echo " "
-       echo "Okay, let's see if #! works on this system..."
-       xcat=/bin/cat
-       test -f $xcat || xcat=/usr/bin/cat
-       echo "#!$xcat" >try
-       $eunicefix try
-       chmod +x try
-       ./try > today
-       if test -s today; then
-               echo "It does."
-               sharpbang='#!'
-       else
-               echo "#! $xcat" > try
-               $eunicefix try
-               chmod +x try
-               ./try > today
-               if test -s today; then
-                       echo "It does."
-                       sharpbang='#! '
-               else
-                       echo "It's just a comment."
-                       sharpbang=': use '
-               fi
-       fi
-else
-       echo "Your sh doesn't grok # comments--I will strip them later on."
-       shsharp=false
-       cd ..
-       echo "exec grep -v '^[  ]*#'" >spitshell
-       chmod +x spitshell
-       $eunicefix spitshell
-       spitshell=`pwd`/spitshell
-       cd UU
-       echo "I presume that if # doesn't work, #! won't work either!"
-       sharpbang=': use '
-fi
-rm -f try today
-
-: figure out how to guarantee sh startup
-echo " "
-echo "Checking out how to guarantee sh startup..." >&4
-case "$SYSTYPE" in
-*bsd*|sys5*) startsh=$sharpbang"/$SYSTYPE/bin/sh";;
-*) startsh=$sharpbang'/bin/sh';;
-esac
-echo "Let's see if '$startsh' works..."
-cat >try <<EOSS
-$startsh
-set abc
-test "$?abc" != 1
-EOSS
-
-chmod +x try
-$eunicefix try
-if ./try; then
-       echo "Yup, it does."
-else
-echo "Nope.  You may have to fix up the shell scripts to make sure sh runs them."
-fi
-rm -f try
-
 : find out where common programs are
 echo " "
 echo "Locating common programs..." >&4
@@ -1555,7 +1568,7 @@ EOM
        cd hints; ls -C *.sh | $sed 's/\.sh/   /g' >&4
        dflt=''
        : Half the following guesses are probably wrong... If you have better
-       : tests or hints, please send them to doughera@lafcol.lafayette.edu
+       : tests or hints, please send them to lwall@sems.com
        : The metaconfig authors would also appreciate a copy...
        $test -f /irix && osname=irix
        $test -f /xenix && osname=sco_xenix
@@ -1628,6 +1641,9 @@ EOM
                dgux) osname=dgux 
                        osvers="$3"
                        ;;
+               dynixptx*) osname=dynixptx
+                       osvers="$3"
+                       ;;
                freebsd) osname=freebsd 
                        osvers="$3" ;;
                genix) osname=genix ;;
@@ -1898,6 +1914,8 @@ case "$ans" in
 none)  osname='' ;;
 *) osname=`echo "$ans" | $sed -e 's/[  ][      ]*/_/g' | ./tr '[A-Z]' '[a-z]'`;;
 esac
+
+
 : who configured the system
 cf_time=`$date 2>&1`
 (logname > .temp) >/dev/null 2>&1
@@ -2308,13 +2326,13 @@ baserev=5.0
 echo " "
 echo "Getting the current patchlevel..." >&4
 if $test -r ../patchlevel.h;then
-       patchlevel=`awk '/PATCHLEVEL/ {print $3}' ../patchlevel.h`
-       subversion=`awk '/SUBVERSION/ {print $3}' ../patchlevel.h`
+       patchlevel=`awk '/PATCHLEVEL/ {print $3}' ../patchlevel.h`
+       subversion=`awk '/SUBVERSION/ {print $3}' ../patchlevel.h`
 else
        patchlevel=0
        subversion=0
 fi
-echo "(You have $package $baserev PL$patchlevel sub$subversion.)"
+echo "(You have $package $baserev patchlevel $patchlevel subversion $subversion.)"
 
 : set the prefixup variable, to restore leading tilda escape
 prefixup='case "$prefixexp" in
@@ -2328,14 +2346,13 @@ eval $prefixit
 case "$archlib" in
 '')
        case "$privlib" in
-       '')
-               dflt=`./loc . "." $prefixexp/lib /usr/local/lib /usr/lib /lib`
+       '')     dflt=`./loc . "." $prefixexp/lib /usr/local/lib /usr/lib /lib`
                set dflt
                eval $prefixup
                ;;
        *)      version=`LC_ALL=C;export LC_ALL;\
-                   echo $baserev $patchlevel $subversion | \
-                   $awk '{print $1 + $2/1000.0 + $3/100000.0}'`
+                       echo $baserev $patchlevel $subversion | \
+                       $awk '{print $1 + $2/1000.0 + $3/100000.0}'`
                dflt="$privlib/$archname/$version"
                ;;
        esac
@@ -2551,6 +2568,7 @@ EOM
        fi
 else
        echo "I don't think setuid scripts are secure (no /dev/fd directory)." >&4
+       echo "(That's for file descriptors, not floppy disks.)"
        val="$undef"
 fi
 set d_suidsafe
@@ -2693,12 +2711,13 @@ if $test ! -d "$dflt/auto"; then
 fi
 cat <<EOM
 
-In 5.001, Perl stored architecture-dependent library files in a library
+In 5.001, Perl stored architecture-dependent library files in a directory
 with a name such as $privlib/$archname, 
 and this directory contained files from the standard extensions and 
 files from any additional extensions you might have added.  Starting 
 with version 5.002, all the architecture-dependent standard extensions 
-will go into $archlib, 
+will go into a version-specific directory such as
+$archlib, 
 while locally-added extensions will go into
 $sitearch.
 
@@ -2720,6 +2739,34 @@ esac
 set d_oldarchlib
 eval $setvar
 
+
+case "$usestdio" in
+false) dflt='n';;
+*) dflt='y';;
+esac
+echo "$package can now use alternate file IO mechanisms to ANSI stdio."
+echo "However these are experimental and may cause problems with some"
+echo "extension modules"
+rp="Use stdio as with previous versions?"
+. ./myread
+case "$ans" in
+y|Y) 
+       echo "Ok, doing things the stdio way"
+       val="$define"
+       ;;     
+*)      
+       val="$undef"
+       ;;
+esac
+set d_perlstdio 
+eval $setvar 
+case "$d_perlstdio" in
+$define) usestdio='true';;
+*) usestdio='false';;
+esac
+
+
+
 : determine where public executables go
 echo " "
 set dflt bin bin
@@ -3860,7 +3907,7 @@ case "$optimize" in
 esac
 $cat <<EOH
 
-Some C compilers have problems with their optimizers, by default, $package
+Some C compilers have problems with their optimizers.  By default, $package
 compiles with the -O flag to use the optimizer.  Alternately, you might want
 to use the symbolic debugger, which uses the -g flag (on traditional Unix
 systems).  Either flag can be specified here.  To use neither flag, specify
@@ -4624,10 +4671,6 @@ $cat >try.c <<'EOP'
 #endif
 main() { 
        char buf[64]; 
-       /* This test must come first. <AlanBurlison@unn.unisys.com> */
-       Gconvert(0.1, 8, 0, buf);
-       if (buf[0] != '.' || buf[1] != '1' || buf[2] != '\0')
-               exit(1);
        Gconvert(1.0, 8, 0, buf); 
        if (buf[0] != '1' || buf[1] != '\0')
                exit(1);
@@ -5653,8 +5696,9 @@ main()
        exit(0);
 }
 EOM
+       : Call the object file tmp-dyna.o in case dlext=o.
        if $cc $ccflags $cccdlflags -c dyna.c > /dev/null 2>&1 && 
-               mv dyna.o tmp-dyna.o > /dev/null 2>&1 &&
+               mv dyna.o tmp-dyna.o > /dev/null 2>&1 && 
                $ld $lddlflags -o dyna.$dlext tmp-dyna.o > /dev/null 2>&1 && 
                $cc $ccflags $ldflags $cccdlflags $ccdlflags fred.c -o fred $libs > /dev/null 2>&1; then
                xxx=`./fred`
@@ -6549,6 +6593,57 @@ eval $inlibc
 set setsid d_setsid
 eval $inlibc
 
+: see if sfio.h is available
+set sfio.h i_sfio
+eval $inhdr
+
+
+: see if sfio is available
+case "$i_sfio" in
+$define)
+       val=''
+       set sfreserve val
+       eval $inlibc
+       ;;
+*)
+       val="$undef"
+       ;;
+esac
+case "$val" in
+$define)
+       case "$usesfio" in
+       true) dflt='y';;
+       *) dflt='n';;
+       esac
+       echo "$package can use sfio library, but this is experimental."
+       rp="You seem to have sfio available, do you want to try using it?"
+       . ./myread
+       case "$ans" in
+       y|Y) 
+               ;;     
+       *)      
+               echo "Ok, avoiding sfio this time"
+               val="$undef"
+               ;;
+       esac
+       ;;
+*)
+       case "$usesfio" in
+       false) ;;
+       *)
+               echo "Sorry cannot find sfio on this machine"
+               ;;
+       esac
+       ;;
+esac
+set d_sfio 
+eval $setvar 
+case "$d_sfio" in
+$define) usesfio='true';;
+*) usesfio='false';;
+esac
+
+
 : see if shmctl exists
 set shmctl d_shmctl
 eval $inlibc
@@ -6633,12 +6728,11 @@ fi
 set sigaction d_sigaction
 eval $inlibc
 
-
 : see if sigsetjmp exists
 echo " "
 case "$d_sigsetjmp" in
 '')
-       $cat >set.c <<EOP
+       $cat >set.c <<'EOP'
 #include <setjmp.h>
 sigjmp_buf env;
 int set = 1;
@@ -6651,25 +6745,26 @@ main()
        exit(1);
 }
 EOP
-       if $cc $ccflags $ldflags set.c -o set $libs >/dev/null 2>&1; then
+       if $cc $ccflags $ldflags -o set set.c $libs > /dev/null 2>&1 ; then
                if ./set >/dev/null 2>&1; then
                        echo "POSIX sigsetjmp found." >&4
                        val="$define"
                else
-                       $cat <<EOM
+                       $cat >&4 <<EOM
 Uh-Oh! You have POSIX sigsetjmp and siglongjmp, but they do not work properly!!
+I'll ignore them.
 EOM
                        val="$undef"
                fi
        else
-               echo "Sigsetjmp not found." >&4
+               echo "sigsetjmp not found." >&4
                val="$undef"
        fi
        ;;
 *) val="$d_sigsetjmp"
        case "$d_sigsetjmp" in
        $define) echo "POSIX sigsetjmp found." >&4;;
-       $undef) echo "Sigsetjmp not found." >&4;;
+       $undef) echo "sigsetjmp not found." >&4;;
        esac
        ;;
 esac
@@ -7462,9 +7557,9 @@ case "$voidflags" in
 '')
        $cat >try.c <<'EOCP'
 #if TRY & 1
-void main() {
+void sub() {
 #else
-main() {
+sub() {
 #endif
        extern void moo();      /* function returning void */
        void (*goo)();          /* ptr to func returning void */
@@ -7482,8 +7577,9 @@ main() {
 #endif
        exit(0);
 }
+main() { sub(); }
 EOCP
-       if $cc -c -DTRY=$defvoidused try.c >.out 2>&1 ; then
+       if $cc $ccflags -c -DTRY=$defvoidused try.c >.out 2>&1 ; then
                voidflags=$defvoidused
        echo "It appears to support void to the level $package wants ($defvoidused)."
                if $contains warning .out >/dev/null 2>&1; then
@@ -7492,16 +7588,16 @@ EOCP
                fi
        else
 echo "Hmm, your compiler has some difficulty with void. Checking further..." >&4
-               if $cc -c -DTRY=1 try.c >/dev/null 2>&1 ; then
+               if $cc $ccflags -c -DTRY=1 try.c >/dev/null 2>&1; then
                        echo "It supports 1..."
-                       if $cc -c -DTRY=3 try.c >/dev/null 2>&1 ; then
+                       if $cc $ccflags -c -DTRY=3 try.c >/dev/null 2>&1; then
                                echo "It also supports 2..."
-                               if $cc -c -DTRY=7 try.c >/dev/null 2>&1 ; then
+                               if $cc $ccflags -c -DTRY=7 try.c >/dev/null 2>&1; then
                                        voidflags=7
                                        echo "And it supports 4 but not 8 definitely."
                                else
                                        echo "It doesn't support 4..."
-                                       if $cc -c -DTRY=11 try.c >/dev/null 2>&1 ; then
+                                       if $cc $ccflags -c -DTRY=11 try.c >/dev/null 2>&1; then
                                                voidflags=11
                                                echo "But it supports 8."
                                        else
@@ -7511,11 +7607,11 @@ echo "Hmm, your compiler has some difficulty with void. Checking further..." >&4
                                fi
                        else
                                echo "It does not support 2..."
-                               if $cc -c -DTRY=13 try.c >/dev/null 2>&1 ; then
+                               if $cc $ccflags -c -DTRY=13 try.c >/dev/null 2>&1; then
                                        voidflags=13
                                        echo "But it supports 4 and 8."
                                else
-                                       if $cc -c -DTRY=5 try.c >/dev/null 2>&1 ; then
+                                       if $cc $ccflags -c -DTRY=5 try.c >/dev/null 2>&1; then
                                                voidflags=5
                                                echo "And it supports 4 but has not heard about 8."
                                        else
@@ -8004,13 +8100,59 @@ $cat > signal.c <<'EOP'
 #include <sys/types.h>
 #include <signal.h>
 int main() {
-#ifdef NSIG
-printf("NSIG %d\n", NSIG);
-#else
-#ifdef _NSIG
-printf("NSIG %d\n", _NSIG);
+
+/* Strange style to avoid deeply-nested #if/#else/#endif */
+#ifndef NSIG
+#  ifdef _NSIG
+#    define NSIG (_NSIG)
+#  endif
+#endif
+
+#ifndef NSIG
+#  ifdef SIGMAX
+#    define NSIG (SIGMAX+1)
+#  endif
+#endif
+
+#ifndef NSIG
+#  ifdef SIG_MAX
+#    define NSIG (SIG_MAX+1)
+#  endif
+#endif
+
+#ifndef NSIG
+#  ifdef MAXSIG
+#    define NSIG (MAXSIG+1)
+#  endif
 #endif
+
+#ifndef NSIG
+#  ifdef MAX_SIG
+#    define NSIG (MAX_SIG+1)
+#  endif
+#endif
+
+#ifndef NSIG
+#  ifdef SIGARRAYSIZE
+#    define NSIG (SIGARRAYSIZE+1) /* Not sure of the +1 */
+#  endif
+#endif
+
+#ifndef NSIG
+#  ifdef _sys_nsig
+#    define NSIG (_sys_nsig) /* Solaris 2.5 */
+#  endif
+#endif
+
+/* Default to some arbitrary number that's big enough to get most
+   of the common signals.
+*/
+#ifndef NSIG
+#    define NSIG 50
 #endif
+
+printf("NSIG %d\n", NSIG);
+
 EOP
 echo $xxx | $tr ' ' '\012' | $sort | $uniq | $awk '
 {
@@ -8138,14 +8280,16 @@ main()
                printf("int\n");
        else 
                printf("long\n");
+       exit(0);
 }
 EOM
 echo " "
-if $cc $ccflags $ldflags -o ssize ssize.c $libs > /dev/null 2>&1 ; then
+if $cc $ccflags $ldflags -o ssize ssize.c $libs > /dev/null 2>&1  &&
+               ./ssize > /dev/null 2>&1 ; then
        ssizetype=`./ssize`
        echo "I'll be using $ssizetype for functions returning a byte count." >&4
 else
-       echo "(I can't compile the test program--please enlighten me!)"
+       echo "(I can't compile and run the test program--please enlighten me!)"
        $cat <<EOM
 
 I need a type that is the same size as $sizetype, but is guaranteed to
@@ -8684,6 +8828,10 @@ eval $inhdr
 set utime.h i_utime
 eval $inhdr
 
+: see if this is a values.h system
+set values.h i_values
+eval $inhdr
+
 : see if this is a vfork system
 case "$d_vfork" in
 "$define")
@@ -8951,6 +9099,7 @@ awk='$awk'
 baserev='$baserev'
 bash='$bash'
 bin='$bin'
+bin_sh='$bin_sh'
 binexp='$binexp'
 bison='$bison'
 byacc='$byacc'
@@ -9064,6 +9213,7 @@ d_oldsock='$d_oldsock'
 d_open3='$d_open3'
 d_pathconf='$d_pathconf'
 d_pause='$d_pause'
+d_perlstdio='$d_perlstdio'
 d_phostname='$d_phostname'
 d_pipe='$d_pipe'
 d_poll='$d_poll'
@@ -9102,6 +9252,7 @@ d_setreuid='$d_setreuid'
 d_setrgid='$d_setrgid'
 d_setruid='$d_setruid'
 d_setsid='$d_setsid'
+d_sfio='$d_sfio'
 d_shm='$d_shm'
 d_shmat='$d_shmat'
 d_shmatprototype='$d_shmatprototype'
@@ -9209,6 +9360,7 @@ i_neterrno='$i_neterrno'
 i_niin='$i_niin'
 i_pwd='$i_pwd'
 i_rpcsvcdbm='$i_rpcsvcdbm'
+i_sfio='$i_sfio'
 i_sgtty='$i_sgtty'
 i_stdarg='$i_stdarg'
 i_stddef='$i_stddef'
@@ -9234,6 +9386,7 @@ i_termios='$i_termios'
 i_time='$i_time'
 i_unistd='$i_unistd'
 i_utime='$i_utime'
+i_values='$i_values'
 i_varargs='$i_varargs'
 i_varhdr='$i_varhdr'
 i_vfork='$i_vfork'
index d78dff0..2bd0c29 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -1,80 +1,80 @@
-Artistic               The "Artistic License"
-Changes                        Differences from previous versions.
-Changes.Conf           Recent changes in the Configure & build process
-configure              Crude emulation of GNU configure
-Configure              Portability tool
-Copying                        The GNU General Public License
-EXTERN.h               Included before foreign .h files
-INSTALL                        Detailed installation instructions.
-INTERN.h               Included before domestic .h files
-MANIFEST               This list of files
-Makefile.SH            A script that generates Makefile
-README                 The Instructions
-README.os2             Notes about OS/2 port
-README.plan9           Notes about Plan9 port
-README.vms             Notes about VMS port
-Todo                   The Wishlist
-XSUB.h                 Include file for extension subroutines
-av.c                   Array value code
-av.h                   Array value header
-cflags.SH              A script that emits C compilation flags per file
-config_H               Sample config.h
-config_h.SH            Produces config.h
-configpm               Produces lib/Config.pm
-cop.h                  Control operator header
-cv.h                   Code value header
-deb.c                  Debugging routines
-doio.c                 I/O operations
-doop.c                 Support code for various operations
-dosish.h               Some defines for MS/DOSish machines
-dump.c                 Debugging output
-eg/ADB                 An adb wrapper to put in your crash dir
-eg/README              Intro to example perl scripts
-eg/changes             A program to list recently changed files
-eg/client              A sample client
-eg/down                        A program to do things to subdirectories
-eg/dus                 A program to do du -s on non-mounted dirs
-eg/findcp              A find wrapper that implements a -cp switch
-eg/findtar             A find wrapper that pumps out a tar file
-eg/g/gcp               A program to do a global rcp
-eg/g/gcp.man           Manual page for gcp
-eg/g/ged               A program to do a global edit
-eg/g/ghosts            A sample /etc/ghosts file
-eg/g/gsh               A program to do a global rsh
-eg/g/gsh.man           Manual page for gsh
-eg/muck                        A program to find missing make dependencies
-eg/muck.man            Manual page for muck
-eg/myrup               A program to find lightly loaded machines
-eg/nih                 Script to insert #! workaround
-eg/relink              A program to change symbolic links
-eg/rename              A program to rename files
-eg/rmfrom              A program to feed doomed filenames to
-eg/scan/scan_df                Scan for filesystem anomalies
-eg/scan/scan_last      Scan for login anomalies
-eg/scan/scan_messages  Scan for console message anomalies
-eg/scan/scan_passwd    Scan for passwd file anomalies
-eg/scan/scan_ps                Scan for process anomalies
-eg/scan/scan_sudo      Scan for sudo anomalies
-eg/scan/scan_suid      Scan for setuid anomalies
-eg/scan/scanner                An anomaly reporter
-eg/server              A sample server
-eg/shmkill             A program to remove unused shared memory
-eg/sysvipc/README      Intro to Sys V IPC examples
-eg/sysvipc/ipcmsg      Example of SYS V IPC message queues
-eg/sysvipc/ipcsem      Example of Sys V IPC semaphores
-eg/sysvipc/ipcshm      Example of Sys V IPC shared memory
-eg/travesty            A program to print travesties of its input text
-eg/unuc                        Un-uppercases an all-uppercase text
-eg/uudecode            A version of uudecode
-eg/van/empty           A program to empty the trashcan
-eg/van/unvanish                A program to undo what vanish does
-eg/van/vanexp          A program to expire vanished files
-eg/van/vanish          A program to put files in a trashcan
-eg/who                 A sample who program
-eg/wrapsuid            A setuid script wrapper generator
-emacs/cperl-mode.el    An alternate perl-mode
-embed.h                        Maps symbols to safer names
-embed.pl               Produces embed.h
+Artistic                       The "Artistic License"
+Changes                                Differences from previous versions.
+Changes.Conf                   Recent changes in the Configure & build process
+Configure                      Portability tool
+Copying                                The GNU General Public License
+EXTERN.h                       Included before foreign .h files
+INSTALL                                Detailed installation instructions.
+INTERN.h                       Included before domestic .h files
+MANIFEST                       This list of files
+Makefile.SH                    A script that generates Makefile
+README                         The Instructions
+README.os2                     Notes about OS/2 port
+README.plan9                   Notes about Plan9 port
+README.vms                     Notes about VMS port
+Todo                           The Wishlist
+XSUB.h                         Include file for extension subroutines
+av.c                           Array value code
+av.h                           Array value header
+cflags.SH                      A script that emits C compilation flags per file
+config_H                       Sample config.h
+config_h.SH                    Produces config.h
+configpm                       Produces lib/Config.pm
+configure                      Crude emulation of GNU configure
+cop.h                          Control operator header
+cv.h                           Code value header
+deb.c                          Debugging routines
+doio.c                         I/O operations
+doop.c                         Support code for various operations
+dosish.h                       Some defines for MS/DOSish machines
+dump.c                         Debugging output
+eg/ADB                         An adb wrapper to put in your crash dir
+eg/README                      Intro to example perl scripts
+eg/changes                     A program to list recently changed files
+eg/client                      A sample client
+eg/down                                A program to do things to subdirectories
+eg/dus                         A program to do du -s on non-mounted dirs
+eg/findcp                      A find wrapper that implements a -cp switch
+eg/findtar                     A find wrapper that pumps out a tar file
+eg/g/gcp                       A program to do a global rcp
+eg/g/gcp.man                   Manual page for gcp
+eg/g/ged                       A program to do a global edit
+eg/g/ghosts                    A sample /etc/ghosts file
+eg/g/gsh                       A program to do a global rsh
+eg/g/gsh.man                   Manual page for gsh
+eg/muck                                A program to find missing make dependencies
+eg/muck.man                    Manual page for muck
+eg/myrup                       A program to find lightly loaded machines
+eg/nih                         Script to insert #! workaround
+eg/relink                      A program to change symbolic links
+eg/rename                      A program to rename files
+eg/rmfrom                      A program to feed doomed filenames to
+eg/scan/scan_df                        Scan for filesystem anomalies
+eg/scan/scan_last              Scan for login anomalies
+eg/scan/scan_messages          Scan for console message anomalies
+eg/scan/scan_passwd            Scan for passwd file anomalies
+eg/scan/scan_ps                        Scan for process anomalies
+eg/scan/scan_sudo              Scan for sudo anomalies
+eg/scan/scan_suid              Scan for setuid anomalies
+eg/scan/scanner                        An anomaly reporter
+eg/server                      A sample server
+eg/shmkill                     A program to remove unused shared memory
+eg/sysvipc/README              Intro to Sys V IPC examples
+eg/sysvipc/ipcmsg              Example of SYS V IPC message queues
+eg/sysvipc/ipcsem              Example of Sys V IPC semaphores
+eg/sysvipc/ipcshm              Example of Sys V IPC shared memory
+eg/travesty                    A program to print travesties of its input text
+eg/unuc                                Un-uppercases an all-uppercase text
+eg/uudecode                    A version of uudecode
+eg/van/empty                   A program to empty the trashcan
+eg/van/unvanish                        A program to undo what vanish does
+eg/van/vanexp                  A program to expire vanished files
+eg/van/vanish                  A program to put files in a trashcan
+eg/who                         A sample who program
+eg/wrapsuid                    A setuid script wrapper generator
+emacs/cperl-mode.el            An alternate perl-mode
+embed.h                                Maps symbols to safer names
+embed.pl                       Produces embed.h
 ext/DB_File/DB_File.pm         Berkeley DB extension Perl module
 ext/DB_File/DB_File.xs         Berkeley DB extension external subroutines
 ext/DB_File/DB_File_BS         Berkeley DB extension mkbootstrap fodder
@@ -89,7 +89,7 @@ ext/DynaLoader/dl_dlopen.xs   BSD/SunOS4&5 dlopen() style implementation
 ext/DynaLoader/dl_hpux.xs      HP-UX implementation
 ext/DynaLoader/dl_next.xs      Next implementation
 ext/DynaLoader/dl_none.xs      Stub implementation
-ext/DynaLoader/dl_os2.xs       OS/2 (non-a.out) implementation
+ext/DynaLoader/dl_os2.xs       OS/2 implementation
 ext/DynaLoader/dl_vms.xs       VMS implementation
 ext/DynaLoader/dlutils.c       Dynamic loader utilities for dl_*.xs files
 ext/Fcntl/Fcntl.pm             Fcntl extension Perl module
@@ -125,153 +125,153 @@ ext/ODBM_File/hints/sco.pl      Hint for ODBM_File for named architecture
 ext/ODBM_File/hints/solaris.pl Hint for ODBM_File for named architecture
 ext/ODBM_File/hints/svr4.pl    Hint for ODBM_File for named architecture
 ext/ODBM_File/typemap          ODBM extension interface types
+ext/Opcode/Makefile.PL         Opcode extension makefile writer
 ext/Opcode/Opcode.pm           Opcode extension Perl module
 ext/Opcode/Opcode.xs           Opcode extension external subroutines
 ext/Opcode/Safe.pm             Safe extension Perl module
 ext/Opcode/ops.pm              "Pragma" form of Opcode extension Perl module
-ext/Opcode/Makefile.PL         Opcode extension makefile writer
 ext/POSIX/Makefile.PL          POSIX extension makefile writer
 ext/POSIX/POSIX.pm             POSIX extension Perl module
 ext/POSIX/POSIX.pod            POSIX extension documentation
 ext/POSIX/POSIX.xs             POSIX extension external subroutines
+ext/POSIX/mkposixman.pl                ???????
 ext/POSIX/typemap              POSIX extension interface types
 ext/SDBM_File/Makefile.PL      SDBM extension makefile writer
 ext/SDBM_File/SDBM_File.pm     SDBM extension Perl module
 ext/SDBM_File/SDBM_File.xs     SDBM extension external subroutines
-ext/SDBM_File/sdbm/CHANGES             SDBM kit
-ext/SDBM_File/sdbm/COMPARE             SDBM kit
-ext/SDBM_File/sdbm/Makefile.PL         SDBM kit
-ext/SDBM_File/sdbm/README              SDBM kit
-ext/SDBM_File/sdbm/README.too          SDBM kit
-ext/SDBM_File/sdbm/biblio              SDBM kit
-ext/SDBM_File/sdbm/dba.c               SDBM kit
-ext/SDBM_File/sdbm/dbd.c               SDBM kit
-ext/SDBM_File/sdbm/dbe.1               SDBM kit
-ext/SDBM_File/sdbm/dbe.c               SDBM kit
-ext/SDBM_File/sdbm/dbm.c               SDBM kit
-ext/SDBM_File/sdbm/dbm.h               SDBM kit
-ext/SDBM_File/sdbm/dbu.c               SDBM kit
-ext/SDBM_File/sdbm/grind               SDBM kit
-ext/SDBM_File/sdbm/hash.c              SDBM kit
+ext/SDBM_File/sdbm/CHANGES     SDBM kit
+ext/SDBM_File/sdbm/COMPARE     SDBM kit
+ext/SDBM_File/sdbm/Makefile.PL SDBM kit
+ext/SDBM_File/sdbm/README      SDBM kit
+ext/SDBM_File/sdbm/README.too  SDBM kit
+ext/SDBM_File/sdbm/biblio      SDBM kit
+ext/SDBM_File/sdbm/dba.c       SDBM kit
+ext/SDBM_File/sdbm/dbd.c       SDBM kit
+ext/SDBM_File/sdbm/dbe.1       SDBM kit
+ext/SDBM_File/sdbm/dbe.c       SDBM kit
+ext/SDBM_File/sdbm/dbm.c       SDBM kit
+ext/SDBM_File/sdbm/dbm.h       SDBM kit
+ext/SDBM_File/sdbm/dbu.c       SDBM kit
+ext/SDBM_File/sdbm/grind       SDBM kit
+ext/SDBM_File/sdbm/hash.c      SDBM kit
 ext/SDBM_File/sdbm/linux.patches       SDBM kit
 ext/SDBM_File/sdbm/makefile.sdbm       SDBM kit
-ext/SDBM_File/sdbm/pair.c              SDBM kit
-ext/SDBM_File/sdbm/pair.h              SDBM kit
-ext/SDBM_File/sdbm/readme.ms           SDBM kit
-ext/SDBM_File/sdbm/sdbm.3              SDBM kit
-ext/SDBM_File/sdbm/sdbm.c              SDBM kit
-ext/SDBM_File/sdbm/sdbm.h              SDBM kit
-ext/SDBM_File/sdbm/tune.h              SDBM kit
-ext/SDBM_File/sdbm/util.c              SDBM kit
+ext/SDBM_File/sdbm/pair.c      SDBM kit
+ext/SDBM_File/sdbm/pair.h      SDBM kit
+ext/SDBM_File/sdbm/readme.ms   SDBM kit
+ext/SDBM_File/sdbm/sdbm.3      SDBM kit
+ext/SDBM_File/sdbm/sdbm.c      SDBM kit
+ext/SDBM_File/sdbm/sdbm.h      SDBM kit
+ext/SDBM_File/sdbm/tune.h      SDBM kit
+ext/SDBM_File/sdbm/util.c      SDBM kit
 ext/SDBM_File/typemap          SDBM extension interface types
-ext/Socket/Makefile.PL Socket extension makefile writer
-ext/Socket/Socket.pm   Socket extension Perl module
-ext/Socket/Socket.xs   Socket extension external subroutines
-ext/util/extliblist    Used by extension Makefile.PL to make lib lists
-ext/util/make_ext      Used by Makefile to execute extension Makefiles
-ext/util/mkbootstrap   Turns ext/*/*_BS into bootstrap info
-form.h                 Public declarations for the above
-global.sym             Symbols that need hiding when embedded
-globals.c              File to declare global symbols (for shared library)
-gv.c                   Glob value code
-gv.h                   Glob value header
-h2pl/README            How to turn .ph files into .pl files
-h2pl/cbreak.pl         cbreak routines using .ph
-h2pl/cbreak2.pl                cbreak routines using .pl
-h2pl/eg/sizeof.ph      Sample sizeof array initialization
-h2pl/eg/sys/errno.pl   Sample translated errno.pl
-h2pl/eg/sys/ioctl.pl   Sample translated ioctl.pl
-h2pl/eg/sysexits.pl    Sample translated sysexits.pl
-h2pl/getioctlsizes     Program to extract types from ioctl.h
-h2pl/mksizes           Program to make %sizeof array
-h2pl/mkvars            Program to make .pl from .ph files
-h2pl/tcbreak           cbreak test routine using .ph
-h2pl/tcbreak2          cbreak test routine using .pl
-handy.h                        Handy definitions
-hints/3b1.sh           Hints for named architecture
-hints/3b1cc            Hints for named architecture
-hints/README.hints     Notes about hints.
-hints/aix.sh           Hints for named architecture
-hints/altos486.sh      Hints for named architecture
-hints/apollo.sh                Hints for named architecture
-hints/aux.sh           Hints for named architecture
-hints/bsdos.sh         Hints for named architecture
-hints/convexos.sh      Hints for named architecture
-hints/cxux.sh          Hints for named architecture
-hints/dec_osf.sh       Hints for named architecture
-hints/dgux.sh          Hints for named architecture
-hints/dnix.sh          Hints for named architecture
-hints/dynix.sh         Hints for named architecture
-hints/dynixptx.sh      Hints for named architecture
-hints/epix.sh          Hints for named architecture
-hints/esix4.sh         Hints for named architecture
-hints/fps.sh           Hints for named architecture
-hints/freebsd.sh       Hints for named architecture
-hints/genix.sh         Hints for named architecture
-hints/greenhills.sh    Hints for named architecture
-hints/hpux.sh          Hints for named architecture
-hints/i386.sh          Hints for named architecture
-hints/irix_4.sh                Hints for named architecture
-hints/irix_5.sh                Hints for named architecture
-hints/irix_6.sh                Hints for named architecture
-hints/irix_6_2.sh      Hints for named architecture
-hints/isc.sh           Hints for named architecture
-hints/isc_2.sh         Hints for named architecture
-hints/linux.sh         Hints for named architecture
-hints/machten.sh       Hints for named architecture
-hints/machten_2.sh     Hints for named architecture
-hints/mips.sh          Hints for named architecture
-hints/mpc.sh           Hints for named architecture
-hints/mpeix.sh         Hints for named architecture
-hints/ncr_tower.sh     Hints for named architecture
-hints/netbsd.sh                Hints for named architecture
-hints/next_3.sh                Hints for named architecture
-hints/next_3_0.sh      Hints for named architecture
-hints/next_3_2.sh      Hints for named architecture
-hints/next_3_3.sh      Hints for named architecture
-hints/next_4.sh                Hints for named architecture
-hints/opus.sh          Hints for named architecture
-hints/os2.sh           Hints for named architecture
-hints/powerux.sh       Hints for named architecture
-hints/sco.sh           Hints for named architecture
-hints/sco_2_3_0.sh     Hints for named architecture
-hints/sco_2_3_1.sh     Hints for named architecture
-hints/sco_2_3_2.sh     Hints for named architecture
-hints/sco_2_3_3.sh     Hints for named architecture
-hints/sco_2_3_4.sh     Hints for named architecture
-hints/solaris_2.sh     Hints for named architecture
-hints/stellar.sh       Hints for named architecture
-hints/sunos_4_0.sh     Hints for named architecture
-hints/sunos_4_1.sh     Hints for named architecture
-hints/svr4.sh          Hints for named architecture
-hints/ti1500.sh                Hints for named architecture
-hints/titanos.sh       Hints for named architecture
-hints/ultrix_4.sh      Hints for named architecture
-hints/unicos.sh                Hints for named architecture
-hints/unisysdynix.sh   Hints for named architecture
-hints/utekv.sh         Hints for named architecture
-hints/uts.sh           Hints for named architecture
-hv.c                   Hash value code
-hv.h                   Hash value header
-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
-keywords.h             The keyword numbers
-keywords.pl            Program to write keywords.h
-lib/AnyDBM_File.pm     Perl module to emulate dbmopen
-lib/AutoLoader.pm      Autoloader base class
-lib/AutoSplit.pm       A module to split up autoload functions
-lib/Benchmark.pm       A module to time pieces of code and such
-lib/Carp.pm            Error message base class
-lib/Cwd.pm             Various cwd routines (getcwd, fastcwd, chdir)
-lib/Devel/SelfStubber.pm Generate stubs for SelfLoader.pm
-lib/DirHandle.pm       like FileHandle only for directories
-lib/English.pm         Readable aliases for short variables
-lib/Env.pm             Map environment into ordinary variables
-lib/Exporter.pm                Exporter base class
-lib/ExtUtils/Embed.pm  Utilities for embedding Perl in C programs
-lib/ExtUtils/Install.pm        Handles 'make install' on extensions
-lib/ExtUtils/Liblist.pm        Locates libraries
+ext/Socket/Makefile.PL         Socket extension makefile writer
+ext/Socket/Socket.pm           Socket extension Perl module
+ext/Socket/Socket.xs           Socket extension external subroutines
+ext/util/extliblist            Used by extension Makefile.PL to make lib lists
+ext/util/make_ext              Used by Makefile to execute extension Makefiles
+ext/util/mkbootstrap           Turns ext/*/*_BS into bootstrap info
+form.h                         Public declarations for the above
+global.sym                     Symbols that need hiding when embedded
+globals.c                      File to declare global symbols (for shared library)
+gv.c                           Glob value code
+gv.h                           Glob value header
+h2pl/README                    How to turn .ph files into .pl files
+h2pl/cbreak.pl                 cbreak routines using .ph
+h2pl/cbreak2.pl                        cbreak routines using .pl
+h2pl/eg/sizeof.ph              Sample sizeof array initialization
+h2pl/eg/sys/errno.pl           Sample translated errno.pl
+h2pl/eg/sys/ioctl.pl           Sample translated ioctl.pl
+h2pl/eg/sysexits.pl            Sample translated sysexits.pl
+h2pl/getioctlsizes             Program to extract types from ioctl.h
+h2pl/mksizes                   Program to make %sizeof array
+h2pl/mkvars                    Program to make .pl from .ph files
+h2pl/tcbreak                   cbreak test routine using .ph
+h2pl/tcbreak2                  cbreak test routine using .pl
+handy.h                                Handy definitions
+hints/3b1.sh                   Hints for named architecture
+hints/3b1cc                    Hints for named architecture
+hints/README.NeXT              Notes about NeXT hints.
+hints/README.hints             Notes about hints.
+hints/aix.sh                   Hints for named architecture
+hints/altos486.sh              Hints for named architecture
+hints/apollo.sh                        Hints for named architecture
+hints/aux.sh                   Hints for named architecture
+hints/bsdos.sh                 Hints for named architecture
+hints/convexos.sh              Hints for named architecture
+hints/cxux.sh                  Hints for named architecture
+hints/dec_osf.sh               Hints for named architecture
+hints/dgux.sh                  Hints for named architecture
+hints/dnix.sh                  Hints for named architecture
+hints/dynix.sh                 Hints for named architecture
+hints/dynixptx.sh              Hints for named architecture
+hints/epix.sh                  Hints for named architecture
+hints/esix4.sh                 Hints for named architecture
+hints/fps.sh                   Hints for named architecture
+hints/freebsd.sh               Hints for named architecture
+hints/genix.sh                 Hints for named architecture
+hints/greenhills.sh            Hints for named architecture
+hints/hpux.sh                  Hints for named architecture
+hints/i386.sh                  Hints for named architecture
+hints/irix_4.sh                        Hints for named architecture
+hints/irix_5.sh                        Hints for named architecture
+hints/irix_6.sh                        Hints for named architecture
+hints/irix_6_2.sh              Hints for named architecture
+hints/isc.sh                   Hints for named architecture
+hints/isc_2.sh                 Hints for named architecture
+hints/linux.sh                 Hints for named architecture
+hints/machten.sh               Hints for named architecture
+hints/machten_2.sh             Hints for named architecture
+hints/mips.sh                  Hints for named architecture
+hints/mpc.sh                   Hints for named architecture
+hints/mpeix.sh                 Hints for named architecture
+hints/ncr_tower.sh             Hints for named architecture
+hints/netbsd.sh                        Hints for named architecture
+hints/next_3.sh                        Hints for named architecture
+hints/next_3_0.sh              Hints for named architecture
+hints/next_4.sh                        Hints for named architecture
+hints/opus.sh                  Hints for named architecture
+hints/os2.sh                   Hints for named architecture
+hints/powerux.sh               Hints for named architecture
+hints/sco.sh                   Hints for named architecture
+hints/sco_2_3_0.sh             Hints for named architecture
+hints/sco_2_3_1.sh             Hints for named architecture
+hints/sco_2_3_2.sh             Hints for named architecture
+hints/sco_2_3_3.sh             Hints for named architecture
+hints/sco_2_3_4.sh             Hints for named architecture
+hints/solaris_2.sh             Hints for named architecture
+hints/stellar.sh               Hints for named architecture
+hints/sunos_4_0.sh             Hints for named architecture
+hints/sunos_4_1.sh             Hints for named architecture
+hints/svr4.sh                  Hints for named architecture
+hints/ti1500.sh                        Hints for named architecture
+hints/titanos.sh               Hints for named architecture
+hints/ultrix_4.sh              Hints for named architecture
+hints/unicos.sh                        Hints for named architecture
+hints/unisysdynix.sh           Hints for named architecture
+hints/utekv.sh                 Hints for named architecture
+hints/uts.sh                   Hints for named architecture
+hv.c                           Hash value code
+hv.h                           Hash value header
+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
+keywords.h                     The keyword numbers
+keywords.pl                    Program to write keywords.h
+lib/AnyDBM_File.pm             Perl module to emulate dbmopen
+lib/AutoLoader.pm              Autoloader base class
+lib/AutoSplit.pm               A module to split up autoload functions
+lib/Benchmark.pm               A module to time pieces of code and such
+lib/Carp.pm                    Error message base class
+lib/Cwd.pm                     Various cwd routines (getcwd, fastcwd, chdir)
+lib/Devel/SelfStubber.pm       Generate stubs for SelfLoader.pm
+lib/DirHandle.pm               like FileHandle only for directories
+lib/English.pm                 Readable aliases for short variables
+lib/Env.pm                     Map environment into ordinary variables
+lib/Exporter.pm                        Exporter base class
+lib/ExtUtils/Embed.pm          Utilities for embedding Perl in C programs
+lib/ExtUtils/Install.pm                Handles 'make install' on extensions
+lib/ExtUtils/Liblist.pm                Locates libraries
 lib/ExtUtils/MM_OS2.pm         MakeMaker methods for OS/2
 lib/ExtUtils/MM_Unix.pm                MakeMaker base class for Unix
 lib/ExtUtils/MM_VMS.pm         MakeMaker methods for VMS.
@@ -279,366 +279,409 @@ lib/ExtUtils/MakeMaker.pm       Write Makefiles for extensions
 lib/ExtUtils/Manifest.pm       Utilities to write MANIFEST files
 lib/ExtUtils/Mkbootstrap.pm    Writes a bootstrap file (see MakeMaker)
 lib/ExtUtils/Mksymlists.pm     Writes a linker options file for extensions
-lib/ExtUtils/testlib.pm        Fixes up @INC to use just-built extension
+lib/ExtUtils/testlib.pm                Fixes up @INC to use just-built extension
 lib/ExtUtils/typemap           Extension interface types
 lib/ExtUtils/xsubpp            External subroutine preprocessor
-lib/Fatal.pm           Make do-or-die equivalents of functions
-lib/File/Basename.pm   A module to emulate the basename program
-lib/File/CheckTree.pm  Perl module supporting wholesale file mode validation
-lib/File/Copy.pm       Emulation of cp command
-lib/File/Find.pm       Routines to do a find
-lib/File/Path.pm       A module to do things like `mkdir -p' and `rm -r'
-lib/FileCache.pm       Keep more files open than the system permits
-lib/FindBin.pm         Find name of currently executing program
-lib/Getopt/Long.pm     A module to fetch command options (GetOptions)
-lib/Getopt/Std.pm      A module to fetch command options (getopt, getopts)
-lib/I18N/Collate.pm    Routines to do strxfrm-based collation
-lib/IPC/Open2.pm       Open a two-ended pipe
-lib/IPC/Open3.pm       Open a three-ended pipe!
-lib/Math/BigFloat.pm   An arbitrary precision floating-point arithmetic package
-lib/Math/BigInt.pm     An arbitrary precision integer arithmetic package
-lib/Math/Complex.pm    A Complex package
-lib/Net/Ping.pm                Ping methods
-lib/Pod/Functions.pm   used by pod/splitpod
-lib/Pod/Text.pm                Convert POD data to formatted ASCII text
-lib/Search/Dict.pm     A module to do binary search on dictionaries
-lib/SelectSaver.pm     A module to enforce proper select scoping
-lib/SelfLoader.pm      A module to load functions only on demand.
-lib/Shell.pm           A module to make AUTOLOADed system() calls
-lib/Symbol.pm          Symbol table manipulation routines
-lib/Sys/Hostname.pm    Hostname methods
-lib/Sys/Syslog.pm      Perl module supporting syslogging
-lib/Term/Cap.pm                Perl module supporting termcap usage
-lib/Term/Complete.pm   A command completion subroutine
-lib/Term/ReadLine.pm   Stub readline library
-lib/Test/Harness.pm    A test harness
-lib/Text/Abbrev.pm     An abbreviation table builder
-lib/Text/ParseWords.pm Perl module to split words on arbitrary delimiter
-lib/Text/Soundex.pm    Perl module to implement Soundex
-lib/Text/Tabs.pm       Do expand and unexpand
-lib/Text/Wrap.pm       Paragraph formatter
-lib/Tie/Hash.pm                Base class for tied hashes
-lib/Tie/Scalar.pm      Base class for tied scalars
-lib/Tie/SubstrHash.pm  Compact hash for known key, value and table size
-lib/Time/Local.pm      Reverse translation of localtime, gmtime
-lib/abbrev.pl          An abbreviation table builder
-lib/assert.pl          assertion and panic with stack trace
-lib/bigfloat.pl                An arbitrary precision floating point package
-lib/bigint.pl          An arbitrary precision integer arithmetic package
-lib/bigrat.pl          An arbitrary precision rational arithmetic package
-lib/cacheout.pl                Manages output filehandles when you need too many
-lib/chat2.inter                A chat2 with interaction
-lib/chat2.pl           Randal's famous expect-ish routines
-lib/complete.pl                A command completion subroutine
-lib/ctime.pl           A ctime workalike
-lib/diagnostics.pm     Print verbose diagnostics
-lib/dotsh.pl           Code to "dot" in a shell script
-lib/dumpvar.pl         A variable dumper
-lib/exceptions.pl      catch and throw routines
-lib/fastcwd.pl         a faster but more dangerous getcwd
-lib/find.pl            A find emulator--used by find2perl
-lib/finddepth.pl       A depth-first find emulator--used by find2perl
-lib/flush.pl           Routines to do single flush
-lib/ftp.pl             FTP code
-lib/getcwd.pl          A getcwd() emulator
-lib/getopt.pl          Perl library supporting option parsing
-lib/getopts.pl         Perl library supporting option parsing
-lib/hostname.pl                Old hostname code
-lib/importenv.pl       Perl routine to get environment into variables
-lib/integer.pm         For "use integer"
-lib/less.pm            For "use less"
-lib/lib.pm             For "use lib"
-lib/look.pl            A "look" equivalent
-lib/newgetopt.pl       A perl library supporting long option parsing
-lib/open2.pl           Open a two-ended pipe
-lib/open3.pl           Open a three-ended pipe
-lib/overload.pm                Module for overloading perl operators.
-lib/perl5db.pl         Perl debugging routines
-lib/pwd.pl             Routines to keep track of PWD environment variable
-lib/shellwords.pl      Perl library to split into words with shell quoting
-lib/sigtrap.pm         For trapping an abort and giving traceback
-lib/splain             Standalone program to print verbose diagnostics.
-lib/stat.pl            Perl library supporting stat function
-lib/strict.pm          For "use strict"
-lib/subs.pm            Declare overriding subs
-lib/syslog.pl          Perl library supporting syslogging
-lib/tainted.pl         Old code for tainting
-lib/termcap.pl         Perl library supporting termcap usage
-lib/timelocal.pl       Perl library supporting inverse of localtime, gmtime
-lib/validate.pl                Perl library supporting wholesale file mode validation
-lib/vars.pm            Declare pseudo-imported global variables
-makeaperl.SH           perl script that produces a new perl binary
-makedepend.SH          Precursor to makedepend
-makedir.SH             Precursor to makedir
-malloc.c               A version of malloc you might not want
-mg.c                   Magic code
-mg.h                   Magic header
-minimod.pl             Writes lib/ExtUtils/Miniperl.pm
-miniperlmain.c         Basic perl w/o dynamic loading or extensions
-mv-if-diff             Script to mv a file if it changed
-myconfig               Prints summary of the current configuration
-op.c                   Opcode syntax tree code
-op.h                   Opcode syntax tree header
-opcode.h               Automatically generated opcode header
-opcode.pl              Opcode header generatore
-os2/diff.configure     Patches to Configure
-os2/dl_os2.c           Addon for dl_open
-os2/dlfcn.h            Addon for dl_open
-os2/Makefile.SHs       Shared library generation for OS/2
-os2/POSIX.mkfifo       POSIX.xs patch.
-os2/README.old         previous OS/2 port info, partially relevant.
-os2/notes              Notes for perl maintainer
-os2/os2.c              Additional code for OS/2
-os2/os2ish.h           Header for OS/2
-os2/perl2cmd.pl                Corrects installed binaries under OS/2
-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.
-perlsh                 A poor man's perl shell
-perly.c                        A byacc'ed perly.y
-perly.c.diff           Fixup perly.c to allow recursion
-perly.fixer            A program to remove yacc stack limitations
-perly.h                        The header file for perly.c
-perly.y                        Yacc grammar for perl
-plan9/aperl            Shell to make Perl error messages Acme-friendly
-plan9/arpa/inet.h      Plan9 port: replacement C header file
-plan9/buildinfo                Plan9 port: configuration information
-plan9/config.plan9     Plan9 port: config.h template
-plan9/exclude          Plan9 port: tests to skip
-plan9/fndvers          Plan9 port: update Perl version in config.plan9 
-plan9/genconfig.pl     Plan9 port: generate config.sh
-plan9/mkfile           Plan9 port: Mk driver for build
-plan9/myconfig.plan9   Plan9 port: script to print config summary
-plan9/perlplan9.doc    Plan9 port: Plan9-specific formatted documentation
-plan9/perlplan9.pod    Plan9 port: Plan9-specific pod documentation
-plan9/plan9.c          Plan9 port: Plan9-specific C routines
-plan9/plan9ish.h       Plan9 port: Plan9-specific C header file
-plan9/setup.rc         Plan9 port: script for easy build+install
-pod/Makefile           Make pods into something else
-pod/buildtoc           generate perltoc.pod
-pod/perl.pod           Top level perl man page
-pod/perlbook.pod       Book info
-pod/perlbot.pod                Object-oriented Bag o' Tricks
-pod/perlcall.pod       Callback info
-pod/perldata.pod       Data structure info
-pod/perldebug.pod      Debugger info
-pod/perldiag.pod       Diagnostic info
-pod/perldsc.pod                Data Structures Cookbook
-pod/perlembed.pod      Embedding info
-pod/perlform.pod       Format info
-pod/perlfunc.pod       Function info
-pod/perlguts.pod       Internals info
-pod/perlipc.pod                IPC info
-pod/perllol.pod                How to use lists of lists.
-pod/perlmod.pod                Module info
-pod/perlobj.pod                Object info
-pod/perlop.pod         Operator info
-pod/perlovl.pod                Overloading info
-pod/perlpod.pod                Pod info
-pod/perlre.pod         Regular expression info
-pod/perlref.pod                References info
-pod/perlrun.pod                Execution info
-pod/perlsec.pod                Security info
-pod/perlstyle.pod      Style info
-pod/perlsub.pod                Subroutine info
-pod/perlsyn.pod                Syntax info
-pod/perltie.pod                Tieing an object class into a simple variable
-pod/perltoc.pod                Table of Contents info
-pod/perltrap.pod       Trap info
-pod/perlvar.pod                Variable info
-pod/perlxs.pod         XS api info
-pod/perlxstut.pod      XS tutorial
-pod/pod2html.PL                Precursor for translator to turn pod into HTML
-pod/pod2latex.PL       Precursor for translator to turn pod into LaTeX
-pod/pod2man.PL         Precursor for translator to turn pod into manpage
-pod/pod2text.PL                Precursor for translator to turn pod into text
-pod/roffitall          troff the whole man page set
-pod/splitman           Splits perlfunc into multiple man pages
-pod/splitpod           Splits perlfunc into multiple pod pages
-pp.c                   Push/Pop code
-pp.h                   Push/Pop code defs
-pp_ctl.c               Push/Pop code for control flow
-pp_hot.c               Push/Pop code for heavily used opcodes
-pp_sys.c               Push/Pop code for system interaction
-proto.h                        Prototypes
-regcomp.c              Regular expression compiler
-regcomp.h              Private declarations for above
-regexec.c              Regular expression evaluator
-regexp.h               Public declarations for the above
-run.c                  The interpreter loop
-scope.c                        Scope entry and exit code
-scope.h                        Scope entry and exit header
-sv.c                   Scalar value code
-sv.h                   Scalar value header
-t/README               Instructions for regression tests
-t/TEST                 The regression tester
-t/base/cond.t          See if conditionals work
-t/base/if.t            See if if works
-t/base/lex.t           See if lexical items work
-t/base/pat.t           See if pattern matching works
-t/base/term.t          See if various terms work
-t/cmd/elsif.t          See if else-if works
-t/cmd/for.t            See if for loops work
-t/cmd/mod.t            See if statement modifiers work
-t/cmd/subval.t         See if subroutine values work
-t/cmd/switch.t         See if switch optimizations work
-t/cmd/while.t          See if while loops work
-t/comp/cmdopt.t                See if command optimization works
-t/comp/cpp.aux         main file for cpp.t
-t/comp/cpp.t           See if C preprocessor works
-t/comp/decl.t          See if declarations work
-t/comp/multiline.t     See if multiline strings work
-t/comp/package.t       See if packages work
-t/comp/script.t                See if script invokation works
-t/comp/term.t          See if more terms work
-t/harness              Finer diagnostics from test suite
-t/io/argv.t            See if ARGV stuff works
-t/io/dup.t             See if >& works right
-t/io/fs.t              See if directory manipulations work
-t/io/inplace.t         See if inplace editing works
-t/io/pipe.t            See if secure pipes work
-t/io/print.t           See if print commands work
-t/io/tell.t            See if file seeking works
-t/lib/anydbm.t         See if AnyDBM_File works
-t/lib/bigint.t         See if bigint.pl works
-t/lib/bigintpm.t       See if BigInt.pm works
-t/lib/db-btree.t       See if DB_File works
-t/lib/db-hash.t                See if DB_File works
-t/lib/db-recno.t       See if DB_File works
-t/lib/dirhand.t                See if DirHandle works
-t/lib/english.t                See if English works
-t/lib/filehand.t       See if FileHandle works
-t/lib/io_dup.t         See if dup()-related methods from IO work
-t/lib/io_pipe.t                See if pipe()-related methods from IO work
-t/lib/io_sock.t                See if INET socket-related methods from IO work
-t/lib/io_tell.t                See if seek()/tell()-related methods from IO work
-t/lib/io_udp.t         See if UDP socket-related methods from IO work
-t/lib/io_xs.t          See if XSUB methods from IO work
-t/lib/gdbm.t           See if GDBM_File works
-t/lib/ndbm.t           See if NDBM_File works
-t/lib/odbm.t           See if ODBM_File works
-t/lib/opcode.t         See if Opcode works
-t/lib/ops.t            See if Opcode works
-t/lib/posix.t          See if POSIX works
-t/lib/safe1.t          See if Safe works
-t/lib/safe2.t          See if Safe works
-t/lib/sdbm.t           See if SDBM_File works
-t/lib/socket.t         See if Socket works
-t/lib/soundex.t                See if Soundex works
-t/op/append.t          See if . works
-t/op/array.t           See if array operations work
-t/op/auto.t            See if autoincrement et all work
-t/op/chop.t            See if chop works
-t/op/cond.t            See if conditional expressions work
-t/op/delete.t          See if delete works
-t/op/do.t              See if subroutines work
-t/op/each.t            See if associative iterators work
-t/op/eval.t            See if eval operator works
-t/op/exec.t            See if exec and system work
-t/op/exp.t             See if math functions work
-t/op/flip.t            See if range operator works
-t/op/fork.t            See if fork works
-t/op/glob.t            See if <*> works
-t/op/goto.t            See if goto works
-t/op/groups.t          See if $( works
-t/op/index.t           See if index works
-t/op/int.t             See if int works
-t/op/join.t            See if join works
-t/op/list.t            See if array lists work
-t/op/local.t           See if local works
-t/op/magic.t           See if magic variables work
-t/op/misc.t            See if miscellaneous bugs have been fixed
-t/op/mkdir.t           See if mkdir works
-t/op/my.t              See if lexical scoping works
-t/op/oct.t             See if oct and hex work
-t/op/ord.t             See if ord works
-t/op/overload.t                See if operator overload works
-t/op/pack.t            See if pack and unpack work
-t/op/pat.t             See if esoteric patterns work
-t/op/push.t            See if push and pop work
-t/op/quotemeta.t       See if quotemeta works
-t/op/rand.t            See if rand works
-t/op/range.t           See if .. works
-t/op/re_tests          Input file for op.regexp
-t/op/read.t            See if read() works
-t/op/readdir.t         See if readdir() works
-t/op/ref.t             See if refs and objects work
-t/op/regexp.t          See if regular expressions work
-t/op/repeat.t          See if x operator works
-t/op/sleep.t           See if sleep works
-t/op/sort.t            See if sort works
-t/op/split.t           See if split works
-t/op/sprintf.t         See if sprintf works
-t/op/stat.t            See if stat works
-t/op/study.t           See if study works
-t/op/subst.t           See if substitution works
-t/op/substr.t          See if substr works
-t/op/tie.t             See if tie/untie functions work
-t/op/time.t            See if time functions work
-t/op/undef.t           See if undef works
-t/op/unshift.t         See if unshift works
-t/op/vec.t             See if vectors work
-t/op/write.t           See if write works
-t/re_tests             Regular expressions for regexp.t
-taint.c                        Tainting code
-toke.c                 The tokener
-universal.c            The default UNIVERSAL package methods
-unixish.h              Defines that are assumed on Unix
-util.c                 Utility routines
-util.h                 Public declarations for the above
-utils/Makefile         Extract the utility scripts.
-utils/c2ph.PL          program to translate dbx stabs to perl
-utils/h2ph.PL          A thing to turn C .h files into perl .ph files
-utils/h2xs.PL          Program to make .xs files from C header files
-utils/perlbug.PL       A simple tool to submit a bug report
-utils/perldoc.PL       A simple tool to find & display perl's documentation
-utils/pl2pm.PL         A pl to pm translator
-vms/Makefile           VMS port
-vms/config.vms         default config.h for VMS
-vms/descrip.mms                MM[SK] description file for build
-vms/ext/Filespec.pm    VMS-Unix file syntax interconversion
+lib/Fatal.pm                   Make do-or-die equivalents of functions
+lib/File/Basename.pm           A module to emulate the basename program
+lib/File/CheckTree.pm          Perl module supporting wholesale file mode validation
+lib/File/Copy.pm               Emulation of cp command
+lib/File/Find.pm               Routines to do a find
+lib/File/Path.pm               A module to do things like `mkdir -p' and `rm -r'
+lib/FileCache.pm               Keep more files open than the system permits
+lib/FindBin.pm                 Find name of currently executing program
+lib/Getopt/Long.pm             A module to fetch command options (GetOptions)
+lib/Getopt/Std.pm              A module to fetch command options (getopt, getopts)
+lib/I18N/Collate.pm            Routines to do strxfrm-based collation
+lib/IPC/Open2.pm               Open a two-ended pipe
+lib/IPC/Open3.pm               Open a three-ended pipe!
+lib/Math/BigFloat.pm           An arbitrary precision floating-point arithmetic package
+lib/Math/BigInt.pm             An arbitrary precision integer arithmetic package
+lib/Math/Complex.pm            A Complex package
+lib/Net/Ping.pm                        Ping methods
+lib/Pod/Functions.pm           used by pod/splitpod
+lib/Pod/Text.pm                        Convert POD data to formatted ASCII text
+lib/Search/Dict.pm             A module to do binary search on dictionaries
+lib/SelectSaver.pm             A module to enforce proper select scoping
+lib/SelfLoader.pm              A module to load functions only on demand.
+lib/Shell.pm                   A module to make AUTOLOADed system() calls
+lib/Symbol.pm                  Symbol table manipulation routines
+lib/Sys/Hostname.pm            Hostname methods
+lib/Sys/Syslog.pm              Perl module supporting syslogging
+lib/Term/Cap.pm                        Perl module supporting termcap usage
+lib/Term/Complete.pm           A command completion subroutine
+lib/Term/ReadLine.pm           Stub readline library
+lib/Test/Harness.pm            A test harness
+lib/Text/Abbrev.pm             An abbreviation table builder
+lib/Text/ParseWords.pm         Perl module to split words on arbitrary delimiter
+lib/Text/Soundex.pm            Perl module to implement Soundex
+lib/Text/Tabs.pm               Do expand and unexpand
+lib/Text/Wrap.pm               Paragraph formatter
+lib/Tie/Hash.pm                        Base class for tied hashes
+lib/Tie/Scalar.pm              Base class for tied scalars
+lib/Tie/SubstrHash.pm          Compact hash for known key, value and table size
+lib/Time/Local.pm              Reverse translation of localtime, gmtime
+lib/abbrev.pl                  An abbreviation table builder
+lib/assert.pl                  assertion and panic with stack trace
+lib/bigfloat.pl                        An arbitrary precision floating point package
+lib/bigint.pl                  An arbitrary precision integer arithmetic package
+lib/bigrat.pl                  An arbitrary precision rational arithmetic package
+lib/cacheout.pl                        Manages output filehandles when you need too many
+lib/chat2.inter                        A chat2 with interaction
+lib/chat2.pl                   Randal's famous expect-ish routines
+lib/complete.pl                        A command completion subroutine
+lib/ctime.pl                   A ctime workalike
+lib/diagnostics.pm             Print verbose diagnostics
+lib/dotsh.pl                   Code to "dot" in a shell script
+lib/dumpvar.pl                 A variable dumper
+lib/exceptions.pl              catch and throw routines
+lib/fastcwd.pl                 a faster but more dangerous getcwd
+lib/find.pl                    A find emulator--used by find2perl
+lib/finddepth.pl               A depth-first find emulator--used by find2perl
+lib/flush.pl                   Routines to do single flush
+lib/ftp.pl                     FTP code
+lib/getcwd.pl                  A getcwd() emulator
+lib/getopt.pl                  Perl library supporting option parsing
+lib/getopts.pl                 Perl library supporting option parsing
+lib/hostname.pl                        Old hostname code
+lib/importenv.pl               Perl routine to get environment into variables
+lib/integer.pm                 For "use integer"
+lib/less.pm                    For "use less"
+lib/lib.pm                     For "use lib"
+lib/look.pl                    A "look" equivalent
+lib/newgetopt.pl               A perl library supporting long option parsing
+lib/open2.pl                   Open a two-ended pipe
+lib/open3.pl                   Open a three-ended pipe
+lib/overload.pm                        Module for overloading perl operators.
+lib/perl5db.pl                 Perl debugging routines
+lib/pwd.pl                     Routines to keep track of PWD environment variable
+lib/shellwords.pl              Perl library to split into words with shell quoting
+lib/sigtrap.pm                 For trapping an abort and giving traceback
+lib/splain                     Standalone program to print verbose diagnostics.
+lib/stat.pl                    Perl library supporting stat function
+lib/strict.pm                  For "use strict"
+lib/subs.pm                    Declare overriding subs
+lib/syslog.pl                  Perl library supporting syslogging
+lib/tainted.pl                 Old code for tainting
+lib/termcap.pl                 Perl library supporting termcap usage
+lib/timelocal.pl               Perl library supporting inverse of localtime, gmtime
+lib/validate.pl                        Perl library supporting wholesale file mode validation
+lib/vars.pm                    Declare pseudo-imported global variables
+makeaperl.SH                   perl script that produces a new perl binary
+makedepend.SH                  Precursor to makedepend
+makedir.SH                     Precursor to makedir
+malloc.c                       A version of malloc you might not want
+mg.c                           Magic code
+mg.h                           Magic header
+minimod.pl                     Writes lib/ExtUtils/Miniperl.pm
+miniperlmain.c                 Basic perl w/o dynamic loading or extensions
+mv-if-diff                     Script to mv a file if it changed
+myconfig                       Prints summary of the current configuration
+nostdio.h                      Cause compile error on stdio calls
+op.c                           Opcode syntax tree code
+op.h                           Opcode syntax tree header
+opcode.h                       Automatically generated opcode header
+opcode.pl                      Opcode header generatore
+os2/Makefile.SHs               Shared library generation for OS/2
+os2/OS2/ExtAttr/Changes                EA access module
+os2/OS2/ExtAttr/ExtAttr.pm     EA access module
+os2/OS2/ExtAttr/ExtAttr.xs     EA access module
+os2/OS2/ExtAttr/MANIFEST       EA access module
+os2/OS2/ExtAttr/Makefile.PL    EA access module
+os2/OS2/ExtAttr/myea.h         EA access module
+os2/OS2/ExtAttr/t/os2_ea.t     EA access module
+os2/OS2/ExtAttr/typemap                EA access module
+os2/OS2/PrfDB/Changes          System database access module
+os2/OS2/PrfDB/MANIFEST         System database access module
+os2/OS2/PrfDB/Makefile.PL      System database access module
+os2/OS2/PrfDB/PrfDB.pm         System database access module
+os2/OS2/PrfDB/PrfDB.xs         System database access module
+os2/OS2/PrfDB/t/os2_prfdb.t    System database access module
+os2/OS2/PrfDB/typemap          System database access module
+os2/OS2/Process/MANIFEST       system() constants in a module
+os2/OS2/Process/Makefile.PL    system() constants in a module
+os2/OS2/Process/Process.pm     system() constants in a module
+os2/OS2/Process/Process.xs     system() constants in a module
+os2/OS2/REXX/Changes           DLL access module
+os2/OS2/REXX/MANIFEST          DLL access module
+os2/OS2/REXX/Makefile.PL       DLL access module
+os2/OS2/REXX/REXX.pm           DLL access module
+os2/OS2/REXX/REXX.xs           DLL access module
+os2/OS2/REXX/t/rx_cmprt.t      DLL access module
+os2/OS2/REXX/t/rx_dllld.t      DLL access module
+os2/OS2/REXX/t/rx_objcall.t    DLL access module
+os2/OS2/REXX/t/rx_sql.test     DLL access module
+os2/OS2/REXX/t/rx_tiesql.test  DLL access module
+os2/OS2/REXX/t/rx_tievar.t     DLL access module
+os2/OS2/REXX/t/rx_tieydb.t     DLL access module
+os2/OS2/REXX/t/rx_varset.t     DLL access module
+os2/OS2/REXX/t/rx_vrexx.t      DLL access module
+os2/POSIX.mkfifo               POSIX.xs patch.
+os2/README                     OS/2 port info
+os2/diff.configure             Patches to Configure
+os2/dl_os2.c                   Addon for dl_open
+os2/dlfcn.h                    Addon for dl_open
+os2/notes                      Notes about OS/2
+os2/os2.c                      Additional code for OS/2
+os2/os2ish.h                   Header for OS/2
+os2/perl2cmd.pl                        Corrects installed binaries under OS/2
+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.
+perlio.c                       C code for PerlIO abstraction.
+perlio.h                       Interface to PerlIO abstraction.
+perlsh                         A poor man's perl shell
+perlsfio.h                     Prototype sfio mapping for PerlIO
+perlsdio.h                     Fake stdio using perlio
+perly.c                                A byacc'ed perly.y
+perly.c.diff                   Fixup perly.c to allow recursion
+perly.fixer                    A program to remove yacc stack limitations
+perly.h                                The header file for perly.c
+perly.y                                Yacc grammar for perl
+plan9/aperl                    Shell to make Perl error messages Acme-friendly
+plan9/arpa/inet.h              Plan9 port: replacement C header file
+plan9/buildinfo                        Plan9 port: configuration information
+plan9/config.plan9             Plan9 port: config.h template
+plan9/exclude                  Plan9 port: tests to skip
+plan9/fndvers                  Plan9 port: update Perl version in config.plan9 
+plan9/genconfig.pl             Plan9 port: generate config.sh
+plan9/mkfile                   Plan9 port: Mk driver for build
+plan9/myconfig.plan9           Plan9 port: script to print config summary
+plan9/perlplan9.doc            Plan9 port: Plan9-specific formatted documentation
+plan9/perlplan9.pod            Plan9 port: Plan9-specific pod documentation
+plan9/plan9.c                  Plan9 port: Plan9-specific C routines
+plan9/plan9ish.h               Plan9 port: Plan9-specific C header file
+plan9/setup.rc                 Plan9 port: script for easy build+install
+plan9/versnum                  ????
+pod/Makefile                   Make pods into something else
+pod/Makefile.PL                        Maybe generate above Makefile ??
+pod/buildtoc                   generate perltoc.pod
+pod/perl.pod                   Top level perl man page
+pod/perlapio.pod               IO API info
+pod/perlbook.pod               Book info
+pod/perlbot.pod                        Object-oriented Bag o' Tricks
+pod/perlcall.pod               Callback info
+pod/perldata.pod               Data structure info
+pod/perldebug.pod              Debugger info
+pod/perldiag.pod               Diagnostic info
+pod/perldsc.pod                        Data Structures Cookbook
+pod/perlembed.pod              Embedding info
+pod/perlform.pod               Format info
+pod/perlfunc.pod               Function info
+pod/perlguts.pod               Internals info
+pod/perlipc.pod                        IPC info
+pod/perllol.pod                        How to use lists of lists.
+pod/perlmod.pod                        Module info
+pod/perlobj.pod                        Object info
+pod/perlop.pod                 Operator info
+pod/perlovl.pod                        Overloading info
+pod/perlpod.pod                        Pod info
+pod/perlre.pod                 Regular expression info
+pod/perlref.pod                        References info
+pod/perlrun.pod                        Execution info
+pod/perlsec.pod                        Security info
+pod/perlstyle.pod              Style info
+pod/perlsub.pod                        Subroutine info
+pod/perlsyn.pod                        Syntax info
+pod/perltie.pod                        Tieing an object class into a simple variable
+pod/perltoc.pod                        Table of Contents info
+pod/perltrap.pod               Trap info
+pod/perlvar.pod                        Variable info
+pod/perlxs.pod                 XS api info
+pod/perlxstut.pod              XS tutorial
+pod/pod2html.PL                        Precursor for translator to turn pod into HTML
+pod/pod2latex.PL               Precursor for translator to turn pod into LaTeX
+pod/pod2man.PL                 Precursor for translator to turn pod into manpage
+pod/pod2text.PL                        Precursor for translator to turn pod into text
+pod/roffitall                  troff the whole man page set
+pod/splitman                   Splits perlfunc into multiple man pages
+pod/splitpod                   Splits perlfunc into multiple pod pages
+pp.c                           Push/Pop code
+pp.h                           Push/Pop code defs
+pp_ctl.c                       Push/Pop code for control flow
+pp_hot.c                       Push/Pop code for heavily used opcodes
+pp_sys.c                       Push/Pop code for system interaction
+proto.h                                Prototypes
+regcomp.c                      Regular expression compiler
+regcomp.h                      Private declarations for above
+regexec.c                      Regular expression evaluator
+regexp.h                       Public declarations for the above
+run.c                          The interpreter loop
+scope.c                                Scope entry and exit code
+scope.h                                Scope entry and exit header
+sv.c                           Scalar value code
+sv.h                           Scalar value header
+t/README                       Instructions for regression tests
+t/TEST                         The regression tester
+t/base/cond.t                  See if conditionals work
+t/base/if.t                    See if if works
+t/base/lex.t                   See if lexical items work
+t/base/pat.t                   See if pattern matching works
+t/base/term.t                  See if various terms work
+t/cmd/elsif.t                  See if else-if works
+t/cmd/for.t                    See if for loops work
+t/cmd/mod.t                    See if statement modifiers work
+t/cmd/subval.t                 See if subroutine values work
+t/cmd/switch.t                 See if switch optimizations work
+t/cmd/while.t                  See if while loops work
+t/comp/cmdopt.t                        See if command optimization works
+t/comp/cpp.aux                 main file for cpp.t
+t/comp/cpp.t                   See if C preprocessor works
+t/comp/decl.t                  See if declarations work
+t/comp/multiline.t             See if multiline strings work
+t/comp/package.t               See if packages work
+t/comp/redef.t                 See if we get correct warnings on redefined subs
+t/comp/script.t                        See if script invokation works
+t/comp/term.t                  See if more terms work
+t/harness                      Finer diagnostics from test suite
+t/io/argv.t                    See if ARGV stuff works
+t/io/dup.t                     See if >& works right
+t/io/fs.t                      See if directory manipulations work
+t/io/inplace.t                 See if inplace editing works
+t/io/pipe.t                    See if secure pipes work
+t/io/print.t                   See if print commands work
+t/io/tell.t                    See if file seeking works
+t/lib/anydbm.t                 See if AnyDBM_File works
+t/lib/bigint.t                 See if bigint.pl works
+t/lib/bigintpm.t               See if BigInt.pm works
+t/lib/db-btree.t               See if DB_File works
+t/lib/db-hash.t                        See if DB_File works
+t/lib/db-recno.t               See if DB_File works
+t/lib/dirhand.t                        See if DirHandle works
+t/lib/english.t                        See if English works
+t/lib/filehand.t               See if FileHandle works
+t/lib/gdbm.t                   See if GDBM_File works
+t/lib/io_dup.t                 See if dup()-related methods from IO work
+t/lib/io_pipe.t                        See if pipe()-related methods from IO work
+t/lib/io_sock.t                        See if INET socket-related methods from IO work
+t/lib/io_tell.t                        See if seek()/tell()-related methods from IO work
+t/lib/io_udp.t                 See if UDP socket-related methods from IO work
+t/lib/io_xs.t                  See if XSUB methods from IO work
+t/lib/ndbm.t                   See if NDBM_File works
+t/lib/odbm.t                   See if ODBM_File works
+t/lib/opcode.t                 See if Opcode works
+t/lib/ops.t                    See if Opcode works
+t/lib/posix.t                  See if POSIX works
+t/lib/safe1.t                  See if Safe works
+t/lib/safe2.t                  See if Safe works
+t/lib/sdbm.t                   See if SDBM_File works
+t/lib/socket.t                 See if Socket works
+t/lib/soundex.t                        See if Soundex works
+t/op/append.t                  See if . works
+t/op/array.t                   See if array operations work
+t/op/auto.t                    See if autoincrement et all work
+t/op/chop.t                    See if chop works
+t/op/cond.t                    See if conditional expressions work
+t/op/delete.t                  See if delete works
+t/op/do.t                      See if subroutines work
+t/op/each.t                    See if associative iterators work
+t/op/eval.t                    See if eval operator works
+t/op/exec.t                    See if exec and system work
+t/op/exp.t                     See if math functions work
+t/op/flip.t                    See if range operator works
+t/op/fork.t                    See if fork works
+t/op/glob.t                    See if <*> works
+t/op/goto.t                    See if goto works
+t/op/groups.t                  See if $( works
+t/op/inc.t                     See if inc/dec of integers near 32 bit limit work
+t/op/index.t                   See if index works
+t/op/int.t                     See if int works
+t/op/join.t                    See if join works
+t/op/list.t                    See if array lists work
+t/op/local.t                   See if local works
+t/op/magic.t                   See if magic variables work
+t/op/misc.t                    See if miscellaneous bugs have been fixed
+t/op/mkdir.t                   See if mkdir works
+t/op/my.t                      See if lexical scoping works
+t/op/oct.t                     See if oct and hex work
+t/op/ord.t                     See if ord works
+t/op/overload.t                        See if operator overload works
+t/op/pack.t                    See if pack and unpack work
+t/op/pat.t                     See if esoteric patterns work
+t/op/push.t                    See if push and pop work
+t/op/quotemeta.t               See if quotemeta works
+t/op/rand.t                    See if rand works
+t/op/range.t                   See if .. works
+t/op/re_tests                  Input file for op.regexp
+t/op/read.t                    See if read() works
+t/op/readdir.t                 See if readdir() works
+t/op/ref.t                     See if refs and objects work
+t/op/regexp.t                  See if regular expressions work
+t/op/repeat.t                  See if x operator works
+t/op/sleep.t                   See if sleep works
+t/op/sort.t                    See if sort works
+t/op/split.t                   See if split works
+t/op/sprintf.t                 See if sprintf works
+t/op/stat.t                    See if stat works
+t/op/study.t                   See if study works
+t/op/subst.t                   See if substitution works
+t/op/substr.t                  See if substr works
+t/op/tie.t                     See if tie/untie functions work
+t/op/time.t                    See if time functions work
+t/op/undef.t                   See if undef works
+t/op/unshift.t                 See if unshift works
+t/op/vec.t                     See if vectors work
+t/op/write.t                   See if write works
+t/re_tests                     Regular expressions for regexp.t
+taint.c                                Tainting code
+toke.c                         The tokener
+universal.c                    The default UNIVERSAL package methods
+unixish.h                      Defines that are assumed on Unix
+util.c                         Utility routines
+util.h                         Public declarations for the above
+utils/Makefile                 Extract the utility scripts.
+utils/c2ph.PL                  program to translate dbx stabs to perl
+utils/h2ph.PL                  A thing to turn C .h files into perl .ph files
+utils/h2xs.PL                  Program to make .xs files from C header files
+utils/perlbug.PL               A simple tool to submit a bug report
+utils/perldoc.PL               A simple tool to find & display perl's documentation
+utils/pl2pm.PL                 A pl to pm translator
+vms/Makefile                   VMS port
+vms/config.vms                 default config.h for VMS
+vms/descrip.mms                        MM[SK] description file for build
+vms/ext/Filespec.pm            VMS-Unix file syntax interconversion
 vms/ext/Stdio/0README.txt      ReadMe file for VMS::Stdio
 vms/ext/Stdio/Makefile.PL      MakeMaker driver for VMS::Stdio
-vms/ext/Stdio/Stdio.pm VMS options to stdio routines
-vms/ext/Stdio/Stdio.xs VMS options to stdio routines
-vms/ext/Stdio/test.pl  regression tests for VMS::Stdio
-vms/ext/filespec.t     See if VMS::Filespec funtions work
-vms/fndvers.com        parse Perl version from patchlevel.h
-vms/gen_shrfls.pl      generate options files and glue for shareable image
-vms/genconfig.pl       retcon config.sh from config.h
-vms/genopt.com         hack to write options files in case of broken makes
-vms/make_command.com   record MM[SK] command used to build Perl
-vms/mms2make.pl                convert descrip.mms to make syntax
-vms/myconfig.com       record local configuration info for bug report
-vms/perlvms.pod                VMS-specific additions to Perl documentation
-vms/perly_c.vms                perly.c with fixed declarations for global syms
-vms/perly_h.vms                perly.h with fixed declarations for global syms
-vms/sockadapt.c                glue for SockshShr socket support
-vms/sockadapt.h                glue for SockshShr socket support
-vms/test.com           DCL driver for regression tests
-vms/vms.c              VMS-specific C code for Perl core
-vms/vms_yfix.pl                convert Unix perly.[ch] to VMS perly_[ch].vms
-vms/vmsish.h           VMS-specific C header for Perl core
-vms/writemain.pl       Generate perlmain.c from miniperlmain.c+extensions
-writemain.SH           Generate perlmain.c from miniperlmain.c+extensions
-x2p/EXTERN.h           Same as above
-x2p/INTERN.h           Same as above
-x2p/Makefile.SH                Precursor to Makefile
-x2p/a2p.c              Output of a2p.y run through byacc
-x2p/a2p.h              Global declarations
-x2p/a2p.man            Manual page for awk to perl translator
-x2p/a2p.y              A yacc grammer for awk
-x2p/a2py.c             Awk compiler, sort of
-x2p/cflags.SH          A script that emits C compilation flags per file
-x2p/find2perl.PL       A find to perl translator
-x2p/handy.h            Handy definitions
-x2p/hash.c             Associative arrays again
-x2p/hash.h             Public declarations for the above
-x2p/s2p.PL             Sed to perl translator
-x2p/s2p.man            Manual page for sed to perl translator
-x2p/str.c              String handling package
-x2p/str.h              Public declarations for the above
-x2p/util.c             Utility routines
-x2p/util.h             Public declarations for the above
-x2p/walk.c             Parse tree walker
+vms/ext/Stdio/Stdio.pm         VMS options to stdio routines
+vms/ext/Stdio/Stdio.xs         VMS options to stdio routines
+vms/ext/Stdio/test.pl          regression tests for VMS::Stdio
+vms/ext/filespec.t             See if VMS::Filespec funtions work
+vms/fndvers.com                        parse Perl version from patchlevel.h
+vms/gen_shrfls.pl              generate options files and glue for shareable image
+vms/genconfig.pl               retcon config.sh from config.h
+vms/genopt.com                 hack to write options files in case of broken makes
+vms/make_command.com           record MM[SK] command used to build Perl
+vms/mms2make.pl                        convert descrip.mms to make syntax
+vms/myconfig.com               record local configuration info for bug report
+vms/perlvms.pod                        VMS-specific additions to Perl documentation
+vms/perly_c.vms                        perly.c with fixed declarations for global syms
+vms/perly_h.vms                        perly.h with fixed declarations for global syms
+vms/sockadapt.c                        glue for SockshShr socket support
+vms/sockadapt.h                        glue for SockshShr socket support
+vms/test.com                   DCL driver for regression tests
+vms/vms.c                      VMS-specific C code for Perl core
+vms/vms_yfix.pl                        convert Unix perly.[ch] to VMS perly_[ch].vms
+vms/vmsish.h                   VMS-specific C header for Perl core
+vms/writemain.pl               Generate perlmain.c from miniperlmain.c+extensions
+writemain.SH                   Generate perlmain.c from miniperlmain.c+extensions
+x2p/EXTERN.h                   Same as above
+x2p/INTERN.h                   Same as above
+x2p/Makefile.SH                        Precursor to Makefile
+x2p/a2p.c                      Output of a2p.y run through byacc
+x2p/a2p.h                      Global declarations
+x2p/a2p.man                    Manual page for awk to perl translator
+x2p/a2p.y                      A yacc grammer for awk
+x2p/a2py.c                     Awk compiler, sort of
+x2p/cflags.SH                  A script that emits C compilation flags per file
+x2p/find2perl.PL               A find to perl translator
+x2p/handy.h                    Handy definitions
+x2p/hash.c                     Associative arrays again
+x2p/hash.h                     Public declarations for the above
+x2p/s2p.PL                     Sed to perl translator
+x2p/s2p.man                    Manual page for sed to perl translator
+x2p/str.c                      String handling package
+x2p/str.h                      Public declarations for the above
+x2p/util.c                     Utility routines
+x2p/util.h                     Public declarations for the above
+x2p/walk.c                     Parse tree walker
index 2972373..f69f58a 100755 (executable)
@@ -43,7 +43,13 @@ case "$d_shrplib" in
         # NeXT uses $patchlevel to set the current version of the dynamic
        # library produced later. And the Major release number in the name
        plibsuf=.5.$so
-    fi;;
+    fi
+    if test "$osname" = "os2" ; then
+       d_shrplib=custom; 
+       shrpenv=
+       plibsuf=$plibext
+    fi
+    ;;
 *)  plibsuf=$lib_ext
     pldlflags="";;
 esac
@@ -173,18 +179,18 @@ addedbyconf = UU $(shextract) $(plextract) pstruct
 h1 = EXTERN.h INTERN.h XSUB.h av.h config.h cop.h cv.h dosish.h
 h2 = embed.h form.h gv.h handy.h hv.h keywords.h mg.h op.h
 h3 = opcode.h patchlevel.h perl.h perly.h pp.h proto.h regcomp.h
-h4 = regexp.h scope.h sv.h unixish.h util.h
+h4 = regexp.h scope.h sv.h unixish.h util.h perlio.h 
 h = $(h1) $(h2) $(h3) $(h4)
 
 c1 = $(mallocsrc) av.c scope.c op.c doop.c doio.c dump.c hv.c mg.c
 c2 = perl.c perly.c pp.c pp_hot.c pp_ctl.c pp_sys.c regcomp.c regexec.c
-c3 = gv.c sv.c taint.c toke.c util.c deb.c run.c universal.c globals.c
+c3 = gv.c sv.c taint.c toke.c util.c deb.c run.c universal.c globals.c perlio.c
 
 c = $(c1) $(c2) $(c3) miniperlmain.c perlmain.c
 
 obj1 = $(mallocobj) gv$(OBJ_EXT) toke$(OBJ_EXT) perly$(OBJ_EXT) op$(OBJ_EXT) regcomp$(OBJ_EXT) dump$(OBJ_EXT) util$(OBJ_EXT) mg$(OBJ_EXT)
 obj2 = hv$(OBJ_EXT) av$(OBJ_EXT) run$(OBJ_EXT) pp_hot$(OBJ_EXT) sv$(OBJ_EXT) pp$(OBJ_EXT) scope$(OBJ_EXT) pp_ctl$(OBJ_EXT) pp_sys$(OBJ_EXT)
-obj3 = doop$(OBJ_EXT) doio$(OBJ_EXT) regexec$(OBJ_EXT) taint$(OBJ_EXT) deb$(OBJ_EXT) universal$(OBJ_EXT) globals$(OBJ_EXT)
+obj3 = doop$(OBJ_EXT) doio$(OBJ_EXT) regexec$(OBJ_EXT) taint$(OBJ_EXT) deb$(OBJ_EXT) universal$(OBJ_EXT) globals$(OBJ_EXT) perlio$(OBJ_EXT)
 
 obj = $(obj1) $(obj2) $(obj3) $(ARCHOBJS)
 
@@ -251,13 +257,13 @@ ext.libs: $(static_ext)
        -@test -f ext.libs || touch ext.libs
 
 perl: $& perlmain$(OBJ_EXT) $(perllib) $(DYNALOADER) $(static_ext) ext.libs
-       $(SHRPENV) $(CC) $(LARGE) $(MAB) $(CLDFLAGS) $(CCDLFLAGS) -o perl perlmain$(OBJ_EXT) $(perllib) $(DYNALOADER) $(static_ext) `cat ext.libs` $(libs)
+       $(SHRPENV) $(CC) $(LARGE) $(MAB) $(CLDFLAGS) $(CCDLFLAGS) -o perl perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(perllib) `cat ext.libs` $(libs)
 
 pureperl: $& perlmain$(OBJ_EXT) $(perllib) $(DYNALOADER) $(static_ext) ext.libs
-       purify $(CC) $(LARGE) $(MAB) $(CLDFLAGS) $(CCDLFLAGS) -o pureperl perlmain$(OBJ_EXT) $(perllib) $(DYNALOADER) $(static_ext) `cat ext.libs` $(libs)
+       purify $(CC) $(LARGE) $(MAB) $(CLDFLAGS) $(CCDLFLAGS) -o pureperl perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(perllib) `cat ext.libs` $(libs)
 
 quantperl: $& perlmain$(OBJ_EXT) $(perllib) $(DYNALOADER) $(static_ext) ext.libs
-       quantify $(CC) $(LARGE) $(MAB) $(CLDFLAGS) $(CCDLFLAGS) -o quantperl perlmain$(OBJ_EXT) $(perllib) $(DYNALOADER) $(static_ext) `cat ext.libs` $(libs)
+       quantify $(CC) $(LARGE) $(MAB) $(CLDFLAGS) $(CCDLFLAGS) -o quantperl perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(perllib) `cat ext.libs` $(libs)
 
 $(perllib): $& perl$(OBJ_EXT) $(obj)
 !NO!SUBS!
@@ -272,13 +278,11 @@ $spitshell >>Makefile <<'!NO!SUBS!'
 else
 $spitshell >>Makefile <<!GROK!THIS!
        version=$patchlevel; \\
+       libtool -dynamic -undefined warning -framework System \\
+           -compatibility_version 1 -current_version \$\$version \\
+           -prebind -seg1addr 0x27000000 -install_name \$(shrpdir)/\$@ \\
+           -o \$@ perl.o \$(obj)
 !GROK!THIS!
-$spitshell >>Makefile <<'!NO!SUBS!'
-       libtool -dynamic -undefined warning -framework System \
-           -compatibility_version 1 -current_version $$version \
-           -prebind -seg1addr 0x27000000 -install_name $(shrpdir)/$@ \
-           -o $@ perl.o $(obj)
-!NO!SUBS!
 fi
 ;;
 custom)
@@ -368,7 +372,7 @@ run_byacc:  FORCE
        @ echo 'Expect' 130 shift/reduce and 1 reduce/reduce conflict
        $(BYACC) -d perly.y
        sh $(shellflags) ./perly.fixer y.tab.c perly.c
-       sed -e s/stderr/Perl_debug_log/g perly.c >perly.tmp && mv perly.tmp perly.c
+       sed -e 's/fprintf *( *stderr *,/PerlIO_printf(Perl_debug_log,/g' perly.c >perly.tmp && mv perly.tmp perly.c
        mv y.tab.h perly.h
        echo 'extern YYSTYPE yylval;' >>perly.h
        - perl vms/vms_yfix.pl perly.c perly.h vms/perly_c.vms vms/perly_h.vms
@@ -483,7 +487,7 @@ makedepend: makedepend.SH config.sh
 test: miniperl perl preplibrary $(dynamic_ext)
        - cd t && (rm -f perl$(EXE_EXT); $(LNS) ../perl$(EXE_EXT) perl$(EXE_EXT)) && ./perl TEST </dev/tty
 
-minitest: miniperl
+minitest: miniperl lib/Config.pm
        - cd t && (rm -f perl$(EXE_EXT); $(LNS) ../miniperl$(EXE_EXT) perl$(EXE_EXT)) \
                && ./perl TEST base/*.t comp/*.t cmd/*.t io/*.t op/*.t </dev/tty
 
@@ -499,6 +503,15 @@ shlist: $(sh)
 pllist: $(pl)
        echo $(pl) | tr ' ' '\012' >.pllist
 
+Makefile: Makefile.SH ./config.sh 
+       $(SHELL) Makefile.SH
+
+distcheck : FORCE
+       perl '-MExtUtils::Manifest=&fullcheck' -e 'fullcheck()'
+
+manifest  : 
+       perl '-MExtUtils::Manifest=&mkmanifest' -e 'mkmanifest()'
+
 # AUTOMATICALLY GENERATED MAKE DEPENDENCIES--PUT NOTHING BELOW THIS LINE
 # If this runs make out of memory, delete /usr/include lines.
 !NO!SUBS!
index 88aa4e0..39e96cc 100755 (executable)
--- a/cflags.SH
+++ b/cflags.SH
@@ -123,8 +123,8 @@ for file do
                optimize="$optdebug"
        fi
 
-    echo "$cc -c $ccflags $optimize $perltype $large $split"
-    eval "$also "'"$cc -c $ccflags $optimize $perltype $large $split"'
+    echo "$cc -c -DPERL_CORE $ccflags $optimize $perltype $large $split"
+    eval "$also "'"$cc -DPERL_CORE -c $ccflags $optimize $perltype $large $split"'
 
     . $TOP/config.sh
 
index 331a722..2b7694f 100755 (executable)
@@ -1,4 +1,3 @@
-#! /bin/sh
 case $CONFIG in
 '')
        if test -f config.sh; then TOP=.;
@@ -12,18 +11,10 @@ case $CONFIG in
        . $TOP/config.sh
        ;;
 esac
-
-case "$bin_sh" in
-'')
-       bin_sh='/bin/sh'
-       ;;
-esac
-
 case "$0" in
 */*) cd `expr X$0 : 'X\(.*\)/'` ;;
 esac
 echo "Extracting config.h (with variable substitutions)"
-rm -f config.h
 sed <<!GROK!THIS! >config.h -e 's!^#undef!/\*#define!' -e 's!^#un-def!#undef!'
 /*
  * This file was produced by running the config_h.SH script, which
@@ -34,7 +25,7 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef!/\*#define!' -e 's!^#un-def!#undef!'
  * that running config_h.SH again will wipe out any changes you've made.
  * For a more permanent change edit config.sh and rerun config_h.SH.
  *
- * \$Id: config_h.SH,v 1.2 1996/07/05 23:49:13 gerti Exp $
+ * \$Id: Config_h.U,v 3.0.1.4 1995/09/25 09:10:49 ram Exp $
  */
 
 /* Configuration time: $cf_time
@@ -1301,16 +1292,6 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef!/\*#define!' -e 's!^#un-def!#undef!'
  */
 #define Size_t $sizetype        /* length paramater for string functions */
 
-/* SSize_t:
- *     This symbol holds the type used by functions that return
- *     a count of bytes or an error condition.  It must be a signed type.
- *     It is usually ssize_t, but may be long or int, etc.
- *     It may be necessary to include <sys/types.h> or <unistd.h>
- *     to get any typedef'ed information.
- *     We will pick a type such that sizeof(SSize_t) == sizeof(Size_t).
- */
-#define SSize_t $ssizetype      /* signed count of bytes */
-
 /* STDCHAR:
  *     This symbol is defined to be the type of char used in stdio.h.
  *     It has the values "unsigned char" or "char".
@@ -1335,33 +1316,36 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef!/\*#define!' -e 's!^#un-def!#undef!'
  */
 #define LOC_SED        "$full_sed"     /**/
 
+/* OSNAME:
+ *     This symbol contains the name of the operating system, as determined
+ *     by Configure.  You shouldn't rely on it too much; the specific
+ *     feature tests from Configure are generally more reliable.
+ */
+#define OSNAME "$osname"               /**/
+
 /* ARCHLIB_EXP:
  *     This symbol contains the ~name expanded version of ARCHLIB, to be used
  *     in programs that are not prepared to deal with ~ expansion at run-time.
  */
 #$d_archlib ARCHLIB_EXP "$archlibexp"          /**/
 
-/* OSNAME:
- *     This symbol contains the name of the operating system, as determined
- *     by Configure.
+/* BIN_SH:
+ *     Pathname to /bin/sh equivalent
  */
-#define OSNAME "$osname"               /**/
-
+#define BIN_SH "$bin_sh"       /**/
 /* BYTEORDER:
  *     This symbol hold the hexadecimal constant defined in byteorder,
  *     i.e. 0x1234 or 0x4321, etc...
  */
 #ifndef NeXT
 #define BYTEORDER 0x$byteorder /* large digits for MSB */
-#else /* NeXT */
-
-#ifdef __BIG_ENDIAN__
-#define BYTEORDER 0x4321
-#else /* __LITTLE_ENDIAN__ */
+#else  /* NeXT */
+#ifdef __LITTLE_ENDIAN__
 #define BYTEORDER 0x1234
+#else /* __BIG_ENDIAN__ */
+#define BYTEORDER 0x4321
 #endif /* ENDIAN CHECK */
-
-#endif /* !NeXT */
+#endif /* NeXT */
 
 /* CSH:
  *     This symbol, if defined, indicates that the C-shell exists.
@@ -1414,26 +1398,40 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef!/\*#define!' -e 's!^#un-def!#undef!'
  */
 #define Gconvert(x,n,t,b) $d_Gconvert
 
+/* PERLIO_IS_STDIO:
+ *     This symbol, if defined, indicates that stdio should
+ *     be used in a fully backward compatible manner.
+ */
+#$d_perlstdio  PERLIO_IS_STDIO         /**/
+
+/* USE_SFIO:
+ *     This symbol, if defined, indicates that sfio should
+ *     be used.
+ */
+#$d_sfio       USE_SFIO                /**/
+
 /* Sigjmp_buf:
- * This is the buffer type to be used with Sigsetjmp and Siglongjmp.
+ *     This is the buffer type to be used with Sigsetjmp and Siglongjmp.
  */
 /* Sigsetjmp:
- * This macro is used in the same way as sigsetjmp(), but will invoke
- * traditional setjmp() if sigsetjmp isn't available.
+ *     This macro is used in the same way as sigsetjmp(), but will invoke
+ *     traditional setjmp() if sigsetjmp isn't available.
+ *     See HAS_SIGSETJMP.
  */
 /* Siglongjmp:
- * This macro is used in the same way as siglongjmp(), but will invoke
- * traditional longjmp() if siglongjmp isn't available.
+ *     This macro is used in the same way as siglongjmp(), but will invoke
+ *     traditional longjmp() if siglongjmp isn't available.
+ *     See HAS_SIGSETJMP.
  */
 #$d_sigsetjmp HAS_SIGSETJMP    /**/
 #ifdef HAS_SIGSETJMP
 #define Sigjmp_buf sigjmp_buf
-#define Sigsetjmp(buf,save_mask) sigsetjmp(buf,save_mask)
-#define Siglongjmp(buf,retval) siglongjmp(buf,retval)
+#define Sigsetjmp(buf,save_mask) sigsetjmp((buf),(save_mask))
+#define Siglongjmp(buf,retval) siglongjmp((buf),(retval))
 #else
 #define Sigjmp_buf jmp_buf
-#define Sigsetjmp(buf,save_mask) setjmp(buf)
-#define Siglongjmp(buf,retval) longjmp(buf,retval)
+#define Sigsetjmp(buf,save_mask) setjmp((buf))
+#define Siglongjmp(buf,retval) longjmp((buf),(retval))
 #endif
 
 /* USE_DYNAMIC_LOADING:
@@ -1459,12 +1457,20 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef!/\*#define!' -e 's!^#un-def!#undef!'
  */
 #$i_locale     I_LOCALE                /**/
 
+/* I_SFIO:
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include <sfio.h>.
+ */
+#$i_sfio       I_SFIO          /**/
+
 /* I_SYS_STAT:
  *     This symbol, if defined, indicates to the C program that it should
  *     include <sys/stat.h>.
  */
 #$i_sysstat    I_SYS_STAT              /**/
 
+#$i_values I_LIMITS            /**/
+
 /* I_STDARG:
  *     This symbol, if defined, indicates that <stdarg.h> exists and should
  *     be included.
@@ -1580,6 +1586,16 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef!/\*#define!' -e 's!^#un-def!#undef!'
  */
 #define SITELIB_EXP "$sitelibexp"              /**/
 
+/* SSize_t:
+ *     This symbol holds the type used by functions that return
+ *     a count of bytes or an error condition.  It must be a signed type.
+ *     It is usually ssize_t, but may be long or int, etc.
+ *     It may be necessary to include <sys/types.h> or <unistd.h>
+ *     to get any typedef'ed information.
+ *     We will pick a type such that sizeof(SSize_t) == sizeof(Size_t).
+ */
+#define SSize_t $ssizetype      /* signed count of bytes */
+
 /* STARTPERL:
  *     This variable contains the string to put in front of a perl
  *     script to make sure (one hopes) that it runs with perl and not
@@ -1587,11 +1603,6 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef!/\*#define!' -e 's!^#un-def!#undef!'
  */
 #define STARTPERL "$startperl"         /**/
 
-/* BIN_SH:
- *     This variable contains the path to the shell.
- */
-#define BIN_SH "$bin_sh"               /**/
-
 /* VOIDFLAGS:
  *     This symbol indicates how much support of the void type is given by this
  *     compiler.  What various bits mean:
diff --git a/cop.h b/cop.h
index bea47c4..6aa32df 100644 (file)
--- a/cop.h
+++ b/cop.h
@@ -147,7 +147,7 @@ struct block {
        cx->blk_oldretsp        = retstack_ix,                          \
        cx->blk_oldpm           = curpm,                                \
        cx->blk_gimme           = gimme;                                \
-       DEBUG_l( fprintf(stderr,"Entering block %ld, type %s\n",        \
+       DEBUG_l( PerlIO_printf(PerlIO_stderr(), "Entering block %ld, type %s\n",        \
                    (long)cxstack_ix, block_type[t]); )
 
 /* Exit a block (RETURN and LAST). */
@@ -159,7 +159,7 @@ struct block {
        retstack_ix     = cx->blk_oldretsp,                             \
        pm              = cx->blk_oldpm,                                \
        gimme           = cx->blk_gimme;                                \
-       DEBUG_l( fprintf(stderr,"Leaving block %ld, type %s\n",         \
+       DEBUG_l( PerlIO_printf(PerlIO_stderr(), "Leaving block %ld, type %s\n",         \
                    (long)cxstack_ix+1,block_type[cx->cx_type]); )
 
 /* Continue a block elsewhere (NEXT and REDO). */
diff --git a/deb.c b/deb.c
index 381fc52..fea6ffa 100644 (file)
--- a/deb.c
+++ b/deb.c
@@ -30,12 +30,12 @@ deb(pat,a1,a2,a3,a4,a5,a6,a7,a8)
     register I32 i;
     GV* gv = curcop->cop_filegv;
 
-    fprintf(Perl_debug_log,"(%s:%ld)\t",
+    PerlIO_printf(Perl_debug_log, "(%s:%ld)\t",
        SvTYPE(gv) == SVt_PVGV ? SvPVX(GvSV(gv)) : "<free>",
        (long)curcop->cop_line);
     for (i=0; i<dlevel; i++)
-       fprintf(Perl_debug_log,"%c%c ",debname[i],debdelim[i]);
-    fprintf(Perl_debug_log,pat,a1,a2,a3,a4,a5,a6,a7,a8);
+       PerlIO_printf(Perl_debug_log, "%c%c ",debname[i],debdelim[i]);
+    PerlIO_printf(Perl_debug_log, pat,a1,a2,a3,a4,a5,a6,a7,a8);
 }
 
 #else /* !defined(I_STDARG) && !defined(I_VARARGS) */
@@ -55,18 +55,18 @@ deb(pat, va_alist)
     register I32 i;
     GV* gv = curcop->cop_filegv;
 
-    fprintf(Perl_debug_log,"(%s:%ld)\t",
+    PerlIO_printf(Perl_debug_log, "(%s:%ld)\t",
        SvTYPE(gv) == SVt_PVGV ? SvPVX(GvSV(gv)) : "<free>",
        (long)curcop->cop_line);
     for (i=0; i<dlevel; i++)
-       fprintf(Perl_debug_log,"%c%c ",debname[i],debdelim[i]);
+       PerlIO_printf(Perl_debug_log, "%c%c ",debname[i],debdelim[i]);
 
 #  ifdef I_STDARG
     va_start(args, pat);
 #  else
     va_start(args);
 #  endif
-    (void) vfprintf(Perl_debug_log,pat,args);
+    (void) PerlIO_vprintf(Perl_debug_log,pat,args);
     va_end( args );
 }
 #endif /* !defined(I_STDARG) && !defined(I_VARARGS) */
@@ -82,11 +82,11 @@ deb_growlevel()
 I32
 debstackptrs()
 {
-    fprintf(Perl_debug_log, "%8lx %8lx %8ld %8ld %8ld\n",
+    PerlIO_printf(Perl_debug_log, "%8lx %8lx %8ld %8ld %8ld\n",
        (unsigned long)curstack, (unsigned long)stack_base,
        (long)*markstack_ptr, (long)(stack_sp-stack_base),
        (long)(stack_max-stack_base));
-    fprintf(Perl_debug_log, "%8lx %8lx %8ld %8ld %8ld\n",
+    PerlIO_printf(Perl_debug_log, "%8lx %8lx %8ld %8ld %8ld\n",
        (unsigned long)mainstack, (unsigned long)AvARRAY(curstack),
        (long)mainstack, (long)AvFILL(curstack), (long)AvMAX(curstack));
     return 0;
@@ -106,25 +106,25 @@ debstack()
        if (*markscan >= i)
            break;
 
-    fprintf(Perl_debug_log, i ? "    =>  ...  " : "    =>  ");
+    PerlIO_printf(Perl_debug_log, i ? "    =>  ...  " : "    =>  ");
     if (stack_base[0] != &sv_undef || stack_sp < stack_base)
-       fprintf(Perl_debug_log, " [STACK UNDERFLOW!!!]\n");
+       PerlIO_printf(Perl_debug_log, " [STACK UNDERFLOW!!!]\n");
     do {
        ++i;
        if (markscan <= markstack_ptr && *markscan < i) {
            do {
                ++markscan;
-               putc('*', Perl_debug_log);
+               PerlIO_putc(Perl_debug_log, '*');
            }
            while (markscan <= markstack_ptr && *markscan < i);
-           fprintf(Perl_debug_log, "  ");
+           PerlIO_printf(Perl_debug_log, "  ");
        }
        if (i > top)
            break;
-       fprintf(Perl_debug_log, "%-4s  ", SvPEEK(stack_base[i]));
+       PerlIO_printf(Perl_debug_log, "%-4s  ", SvPEEK(stack_base[i]));
     }
     while (1);
-    fprintf(Perl_debug_log, "\n");
+    PerlIO_printf(Perl_debug_log, "\n");
     return 0;
 }
 #else
diff --git a/doio.c b/doio.c
index 575427a..d5b3cc8 100644 (file)
--- a/doio.c
+++ b/doio.c
@@ -60,21 +60,21 @@ register char *name;
 I32 len;
 int as_raw;
 int rawmode, rawperm;
-FILE *supplied_fp;
+PerlIO *supplied_fp;
 {
     register IO *io = GvIOn(gv);
-    FILE *saveifp = Nullfp;
-    FILE *saveofp = Nullfp;
+    PerlIO *saveifp = Nullfp;
+    PerlIO *saveofp = Nullfp;
     char savetype = ' ';
     int writing = 0;
-    FILE *fp;
+    PerlIO *fp;
     int fd;
     int result;
 
     forkprocess = 1;           /* assume true if no fork */
 
     if (IoIFP(io)) {
-       fd = fileno(IoIFP(io));
+       fd = PerlIO_fileno(IoIFP(io));
        if (IoTYPE(io) == '-')
            result = 0;
        else if (fd <= maxsysfd) {
@@ -87,16 +87,16 @@ FILE *supplied_fp;
            result = my_pclose(IoIFP(io));
        else if (IoIFP(io) != IoOFP(io)) {
            if (IoOFP(io)) {
-               result = fclose(IoOFP(io));
-               fclose(IoIFP(io));      /* clear stdio, fd already closed */
+               result = PerlIO_close(IoOFP(io));
+               PerlIO_close(IoIFP(io));        /* clear stdio, fd already closed */
            }
            else
-               result = fclose(IoIFP(io));
+               result = PerlIO_close(IoIFP(io));
        }
        else
-           result = fclose(IoIFP(io));
+           result = PerlIO_close(IoIFP(io));
        if (result == EOF && fd > maxsysfd)
-           fprintf(stderr,"Warning: unable to close filehandle %s properly.\n",
+           PerlIO_printf(PerlIO_stderr(), "Warning: unable to close filehandle %s properly.\n",
              GvENAME(gv));
        IoOFP(io) = IoIFP(io) = Nullfp;
     }
@@ -109,7 +109,7 @@ FILE *supplied_fp;
        if (fd == -1)
            fp = NULL;
        else {
-           fp = fdopen(fd, ((result == 0) ? "r"
+           fp = PerlIO_fdopen(fd, ((result == 0) ? "r"
                             : (result == 1) ? "w"
                             : "r+"));
            if (!fp)
@@ -183,7 +183,7 @@ FILE *supplied_fp;
                            goto say_false;
                        }
                        if (IoIFP(thatio)) {
-                           fd = fileno(IoIFP(thatio));
+                           fd = PerlIO_fileno(IoIFP(thatio));
                            if (IoTYPE(thatio) == 's')
                                IoTYPE(io) = 's';
                        }
@@ -192,7 +192,7 @@ FILE *supplied_fp;
                    }
                    if (dodup)
                        fd = dup(fd);
-                   if (!(fp = fdopen(fd,mode))) {
+                   if (!(fp = PerlIO_fdopen(fd,mode))) {
                        if (dodup)
                            close(fd);
                        }
@@ -202,11 +202,11 @@ FILE *supplied_fp;
                /*SUPPRESS 530*/
                for (; isSPACE(*name); name++) ;
                if (strEQ(name,"-")) {
-                   fp = stdout;
+                   fp = PerlIO_stdout();
                    IoTYPE(io) = '-';
                }
                else  {
-                   fp = fopen(name,mode);
+                   fp = PerlIO_open(name,mode);
                }
            }
        }
@@ -217,11 +217,11 @@ FILE *supplied_fp;
            if (*name == '&')
                goto duplicity;
            if (strEQ(name,"-")) {
-               fp = stdin;
+               fp = PerlIO_stdin();
                IoTYPE(io) = '-';
            }
            else
-               fp = fopen(name,mode);
+               fp = PerlIO_open(name,mode);
        }
        else if (name[len-1] == '|') {
            name[--len] = '\0';
@@ -240,11 +240,11 @@ FILE *supplied_fp;
            /*SUPPRESS 530*/
            for (; isSPACE(*name); name++) ;
            if (strEQ(name,"-")) {
-               fp = stdin;
+               fp = PerlIO_stdin();
                IoTYPE(io) = '-';
            }
            else
-               fp = fopen(name,"r");
+               fp = PerlIO_open(name,"r");
        }
     }
     if (!fp) {
@@ -254,8 +254,8 @@ FILE *supplied_fp;
     }
     if (IoTYPE(io) &&
       IoTYPE(io) != '|' && IoTYPE(io) != '-') {
-       if (Fstat(fileno(fp),&statbuf) < 0) {
-           (void)fclose(fp);
+       if (Fstat(PerlIO_fileno(fp),&statbuf) < 0) {
+           (void)PerlIO_close(fp);
            goto say_false;
        }
        if (S_ISSOCK(statbuf.st_mode))
@@ -269,7 +269,7 @@ FILE *supplied_fp;
 #endif
        ) {
            int buflen = sizeof tokenbuf;
-           if (getsockname(fileno(fp), (struct sockaddr *)tokenbuf, &buflen) >= 0
+           if (getsockname(PerlIO_fileno(fp), (struct sockaddr *)tokenbuf, &buflen) >= 0
                || errno != ENOTSOCK)
                IoTYPE(io) = 's'; /* some OS's return 0 on fstat()ed socket */
                                /* but some return 0 for streams too, sigh */
@@ -277,43 +277,43 @@ FILE *supplied_fp;
 #endif
     }
     if (saveifp) {             /* must use old fp? */
-       fd = fileno(saveifp);
+       fd = PerlIO_fileno(saveifp);
        if (saveofp) {
-           Fflush(saveofp);            /* emulate fclose() */
+           PerlIO_flush(saveofp);              /* emulate PerlIO_close() */
            if (saveofp != saveifp) {   /* was a socket? */
-               fclose(saveofp);
+               PerlIO_close(saveofp);
                if (fd > 2)
                    Safefree(saveofp);
            }
        }
-       if (fd != fileno(fp)) {
+       if (fd != PerlIO_fileno(fp)) {
            int pid;
            SV *sv;
 
-           dup2(fileno(fp), fd);
-           sv = *av_fetch(fdpid,fileno(fp),TRUE);
+           dup2(PerlIO_fileno(fp), fd);
+           sv = *av_fetch(fdpid,PerlIO_fileno(fp),TRUE);
            (void)SvUPGRADE(sv, SVt_IV);
            pid = SvIVX(sv);
            SvIVX(sv) = 0;
            sv = *av_fetch(fdpid,fd,TRUE);
            (void)SvUPGRADE(sv, SVt_IV);
            SvIVX(sv) = pid;
-           fclose(fp);
+           PerlIO_close(fp);
 
        }
        fp = saveifp;
-       clearerr(fp);
+       PerlIO_clearerr(fp);
     }
 #if defined(HAS_FCNTL) && defined(F_SETFD)
-    fd = fileno(fp);
+    fd = PerlIO_fileno(fp);
     fcntl(fd,F_SETFD,fd > maxsysfd);
 #endif
     IoIFP(io) = fp;
     if (writing) {
        if (IoTYPE(io) == 's'
          || (IoTYPE(io) == '>' && S_ISCHR(statbuf.st_mode)) ) {
-           if (!(IoOFP(io) = fdopen(fileno(fp),"w"))) {
-               fclose(fp);
+           if (!(IoOFP(io) = PerlIO_fdopen(PerlIO_fileno(fp),"w"))) {
+               PerlIO_close(fp);
                IoIFP(io) = Nullfp;
                goto say_false;
            }
@@ -330,7 +330,7 @@ say_false:
     return FALSE;
 }
 
-FILE *
+PerlIO *
 nextargv(gv)
 register GV *gv;
 {
@@ -345,7 +345,7 @@ register GV *gv;
     if (!argvoutgv)
        argvoutgv = gv_fetchpv("ARGVOUT",TRUE,SVt_PVIO);
     if (filemode & (S_ISUID|S_ISGID)) {
-       Fflush(IoIFP(GvIOn(argvoutgv)));  /* chmod must follow last write */
+       PerlIO_flush(IoIFP(GvIOn(argvoutgv)));  /* chmod must follow last write */
 #ifdef HAS_FCHMOD
        (void)fchmod(lastfd,filemode);
 #else
@@ -444,7 +444,7 @@ register GV *gv;
                    continue;
                }
                setdefout(argvoutgv);
-               lastfd = fileno(IoIFP(GvIOp(argvoutgv)));
+               lastfd = PerlIO_fileno(IoIFP(GvIOp(argvoutgv)));
                (void)Fstat(lastfd,&statbuf);
 #ifdef HAS_FCHMOD
                (void)fchmod(lastfd,filemode);
@@ -464,7 +464,7 @@ register GV *gv;
            return IoIFP(GvIOp(gv));
        }
        else
-           fprintf(stderr,"Can't open %s: %s\n",SvPV(sv, na), Strerror(errno));
+           PerlIO_printf(PerlIO_stderr(), "Can't open %s: %s\n",SvPV(sv, na), Strerror(errno));
     }
     if (inplace) {
        (void)do_close(argvoutgv,FALSE);
@@ -499,15 +499,15 @@ GV *wgv;
 
     if (pipe(fd) < 0)
        goto badexit;
-    IoIFP(rstio) = fdopen(fd[0], "r");
-    IoOFP(wstio) = fdopen(fd[1], "w");
+    IoIFP(rstio) = PerlIO_fdopen(fd[0], "r");
+    IoOFP(wstio) = PerlIO_fdopen(fd[1], "w");
     IoIFP(wstio) = IoOFP(wstio);
     IoTYPE(rstio) = '<';
     IoTYPE(wstio) = '>';
     if (!IoIFP(rstio) || !IoOFP(wstio)) {
-       if (IoIFP(rstio)) fclose(IoIFP(rstio));
+       if (IoIFP(rstio)) PerlIO_close(IoIFP(rstio));
        else close(fd[0]);
-       if (IoOFP(wstio)) fclose(IoOFP(wstio));
+       if (IoOFP(wstio)) PerlIO_close(IoOFP(wstio));
        else close(fd[1]);
        goto badexit;
     }
@@ -573,11 +573,11 @@ IO* io;
            retval = TRUE;
        else {
            if (IoOFP(io) && IoOFP(io) != IoIFP(io)) {          /* a socket */
-               retval = (fclose(IoOFP(io)) != EOF);
-               fclose(IoIFP(io));      /* clear stdio, fd already closed */
+               retval = (PerlIO_close(IoOFP(io)) != EOF);
+               PerlIO_close(IoIFP(io));        /* clear stdio, fd already closed */
            }
            else
-               retval = (fclose(IoIFP(io)) != EOF);
+               retval = (PerlIO_close(IoIFP(io)) != EOF);
        }
        IoOFP(io) = IoIFP(io) = Nullfp;
     }
@@ -599,20 +599,20 @@ GV *gv;
 
     while (IoIFP(io)) {
 
-#ifdef USE_STDIO_PTR                   /* (the code works without this) */
-       if (FILE_cnt(IoIFP(io)) > 0)    /* cheat a little, since */
-           return FALSE;               /* this is the most usual case */
-#endif
+        if (PerlIO_has_cntptr(IoIFP(io))) {    /* (the code works without this) */
+           if (PerlIO_get_cnt(IoIFP(io)) > 0)  /* cheat a little, since */
+               return FALSE;                   /* this is the most usual case */
+        }
 
-       ch = getc(IoIFP(io));
+       ch = PerlIO_getc(IoIFP(io));
        if (ch != EOF) {
-           (void)ungetc(ch, IoIFP(io));
+           (void)PerlIO_ungetc(IoIFP(io),ch);
            return FALSE;
        }
-#if defined(USE_STDIO_PTR) && defined(STDIO_CNT_LVALUE)
-       if (FILE_cnt(IoIFP(io)) < -1)
-           FILE_cnt(IoIFP(io)) = -1;
-#endif
+        if (PerlIO_has_cntptr(IoIFP(io)) && PerlIO_canset_cnt(IoIFP(io))) {
+           if (PerlIO_get_cnt(IoIFP(io)) < -1)
+               PerlIO_set_cnt(IoIFP(io),-1);
+       }
        if (op->op_flags & OPf_SPECIAL) { /* not necessarily a real EOF yet? */
            if (!nextargv(argvgv))      /* get another fp handy */
                return TRUE;
@@ -637,11 +637,11 @@ GV *gv;
        goto phooey;
 
 #ifdef ULTRIX_STDIO_BOTCH
-    if (feof(IoIFP(io)))
-       (void)fseek (IoIFP(io), 0L, 2);         /* ultrix 1.2 workaround */
+    if (PerlIO_eof(IoIFP(io)))
+       (void)PerlIO_seek (IoIFP(io), 0L, 2);           /* ultrix 1.2 workaround */
 #endif
 
-    return ftell(IoIFP(io));
+    return PerlIO_tell(IoIFP(io));
 
 phooey:
     if (dowarn)
@@ -666,11 +666,11 @@ int whence;
        goto nuts;
 
 #ifdef ULTRIX_STDIO_BOTCH
-    if (feof(IoIFP(io)))
-       (void)fseek (IoIFP(io), 0L, 2);         /* ultrix 1.2 workaround */
+    if (PerlIO_eof(IoIFP(io)))
+       (void)PerlIO_seek (IoIFP(io), 0L, 2);           /* ultrix 1.2 workaround */
 #endif
 
-    return fseek(IoIFP(io), pos, whence) >= 0;
+    return PerlIO_seek(IoIFP(io), pos, whence) >= 0;
 
 nuts:
     if (dowarn)
@@ -784,7 +784,7 @@ SV *sv;
 bool
 do_print(sv,fp)
 register SV *sv;
-FILE *fp;
+PerlIO *fp;
 {
     register char *tmps;
     STRLEN len;
@@ -796,13 +796,13 @@ FILE *fp;
        if (SvGMAGICAL(sv))
            mg_get(sv);
         if (SvIOK(sv) && SvIVX(sv) != 0) {
-           fprintf(fp, ofmt, (double)SvIVX(sv));
-           return !ferror(fp);
+           PerlIO_printf(fp, ofmt, (double)SvIVX(sv));
+           return !PerlIO_error(fp);
        }
        if (  (SvNOK(sv) && SvNVX(sv) != 0.0)
           || (looks_like_number(sv) && sv_2nv(sv) != 0.0) ) {
-           fprintf(fp, ofmt, SvNVX(sv));
-           return !ferror(fp);
+           PerlIO_printf(fp, ofmt, SvNVX(sv));
+           return !PerlIO_error(fp);
        }
     }
     switch (SvTYPE(sv)) {
@@ -814,17 +814,17 @@ FILE *fp;
        if (SvIOK(sv)) {
            if (SvGMAGICAL(sv))
                mg_get(sv);
-           fprintf(fp, "%ld", (long)SvIVX(sv));
-           return !ferror(fp);
+           PerlIO_printf(fp, "%ld", (long)SvIVX(sv));
+           return !PerlIO_error(fp);
        }
        /* FALL THROUGH */
     default:
        tmps = SvPV(sv, len);
        break;
     }
-    if (len && (fwrite1(tmps,1,len,fp) == 0 || ferror(fp)))
+    if (len && (PerlIO_write(fp,tmps,len) == 0 || PerlIO_error(fp)))
        return FALSE;
-    return TRUE;
+    return !PerlIO_error(fp);
 }
 
 I32
@@ -844,7 +844,7 @@ dARGS
            statgv = tmpgv;
            sv_setpv(statname,"");
            laststype = OP_STAT;
-           return (laststatval = Fstat(fileno(IoIFP(io)), &statcache));
+           return (laststatval = Fstat(PerlIO_fileno(IoIFP(io)), &statcache));
        }
        else {
            if (tmpgv == defgv)
@@ -955,6 +955,8 @@ do_execfree()
     }
 }
 
+#ifndef OS2
+
 bool
 do_exec(cmd)
 char *cmd;
@@ -1044,6 +1046,8 @@ char *cmd;
     return FALSE;
 }
 
+#endif 
+
 I32
 apply(type,mark,sp)
 I32 type;
diff --git a/doop.c b/doop.c
index 85146bf..b7c220a 100644 (file)
--- a/doop.c
+++ b/doop.c
@@ -320,7 +320,7 @@ register SV **sarg;
            /* end of switch, copy results */
            *t = ch;
            if (xs == buf && xlen >= sizeof(buf)) {     /* Ooops! */
-               fputs("panic: sprintf overflow - memory corrupted!\n",stderr);
+               PerlIO_puts(PerlIO_stderr(),"panic: sprintf overflow - memory corrupted!\n");
                my_exit(1);
            }
            SvGROW(sv, SvCUR(sv) + (f - s) + xlen + 1 + pre + post);
diff --git a/dump.c b/dump.c
index e461d69..a490383 100644 (file)
--- a/dump.c
+++ b/dump.c
@@ -25,25 +25,13 @@ dump_all()
 #ifdef I_STDARG
 static void dump(char *pat, ...);
 #else
-#  if defined(I_VARARGS)
-/*VARARGS0*/
-static void
-dump(pat, va_alist)
-    char *pat;
-    va_dcl
-#  else
 static void dump();
-#  endif
 #endif
 
 void
 dump_all()
 {
-#ifdef HAS_SETLINEBUF
-    setlinebuf(Perl_debug_log);
-#else
-    setvbuf(Perl_debug_log, Nullch, _IOLBF, 0);
-#endif
+    PerlIO_setlinebuf(Perl_debug_log);
     if (main_root)
        dump_op(main_root);
     dump_packsubs(defstash);
@@ -119,18 +107,18 @@ register OP *op;
 
     dump("{\n");
     if (op->op_seq)
-       fprintf(Perl_debug_log, "%-4d", op->op_seq);
+       PerlIO_printf(Perl_debug_log, "%-4d", op->op_seq);
     else
-       fprintf(Perl_debug_log, "    ");
+       PerlIO_printf(Perl_debug_log, "    ");
     dump("TYPE = %s  ===> ", op_name[op->op_type]);
     if (op->op_next) {
        if (op->op_seq)
-           fprintf(Perl_debug_log, "%d\n", op->op_next->op_seq);
+           PerlIO_printf(Perl_debug_log, "%d\n", op->op_next->op_seq);
        else
-           fprintf(Perl_debug_log, "(%d)\n", op->op_next->op_seq);
+           PerlIO_printf(Perl_debug_log, "(%d)\n", op->op_next->op_seq);
     }
     else
-       fprintf(Perl_debug_log, "DONE\n");
+       PerlIO_printf(Perl_debug_log, "DONE\n");
     dumplvl++;
     if (op->op_targ) {
        if (op->op_type == OP_NULL)
@@ -255,31 +243,31 @@ register OP *op;
     case OP_ENTERLOOP:
        dump("REDO ===> ");
        if (cLOOP->op_redoop)
-           fprintf(Perl_debug_log, "%d\n", cLOOP->op_redoop->op_seq);
+           PerlIO_printf(Perl_debug_log, "%d\n", cLOOP->op_redoop->op_seq);
        else
-           fprintf(Perl_debug_log, "DONE\n");
+           PerlIO_printf(Perl_debug_log, "DONE\n");
        dump("NEXT ===> ");
        if (cLOOP->op_nextop)
-           fprintf(Perl_debug_log, "%d\n", cLOOP->op_nextop->op_seq);
+           PerlIO_printf(Perl_debug_log, "%d\n", cLOOP->op_nextop->op_seq);
        else
-           fprintf(Perl_debug_log, "DONE\n");
+           PerlIO_printf(Perl_debug_log, "DONE\n");
        dump("LAST ===> ");
        if (cLOOP->op_lastop)
-           fprintf(Perl_debug_log, "%d\n", cLOOP->op_lastop->op_seq);
+           PerlIO_printf(Perl_debug_log, "%d\n", cLOOP->op_lastop->op_seq);
        else
-           fprintf(Perl_debug_log, "DONE\n");
+           PerlIO_printf(Perl_debug_log, "DONE\n");
        break;
     case OP_COND_EXPR:
        dump("TRUE ===> ");
        if (cCONDOP->op_true)
-           fprintf(Perl_debug_log, "%d\n", cCONDOP->op_true->op_seq);
+           PerlIO_printf(Perl_debug_log, "%d\n", cCONDOP->op_true->op_seq);
        else
-           fprintf(Perl_debug_log, "DONE\n");
+           PerlIO_printf(Perl_debug_log, "DONE\n");
        dump("FALSE ===> ");
        if (cCONDOP->op_false)
-           fprintf(Perl_debug_log, "%d\n", cCONDOP->op_false->op_seq);
+           PerlIO_printf(Perl_debug_log, "%d\n", cCONDOP->op_false->op_seq);
        else
-           fprintf(Perl_debug_log, "DONE\n");
+           PerlIO_printf(Perl_debug_log, "DONE\n");
        break;
     case OP_MAPWHILE:
     case OP_GREPWHILE:
@@ -287,9 +275,9 @@ register OP *op;
     case OP_AND:
        dump("OTHER ===> ");
        if (cLOGOP->op_other)
-           fprintf(Perl_debug_log, "%d\n", cLOGOP->op_other->op_seq);
+           PerlIO_printf(Perl_debug_log, "%d\n", cLOGOP->op_other->op_seq);
        else
-           fprintf(Perl_debug_log, "DONE\n");
+           PerlIO_printf(Perl_debug_log, "DONE\n");
        break;
     case OP_PUSHRE:
     case OP_MATCH:
@@ -315,12 +303,12 @@ register GV *gv;
     SV *sv;
 
     if (!gv) {
-       fprintf(Perl_debug_log,"{}\n");
+       PerlIO_printf(Perl_debug_log, "{}\n");
        return;
     }
     sv = sv_newmortal();
     dumplvl++;
-    fprintf(Perl_debug_log,"{\n");
+    PerlIO_printf(Perl_debug_log, "{\n");
     gv_fullname(sv,gv);
     dump("GV_NAME = %s", SvPVX(sv));
     if (gv != GvEGV(gv)) {
@@ -400,8 +388,8 @@ long arg2, arg3, arg4, arg5;
     I32 i;
 
     for (i = dumplvl*4; i; i--)
-       (void)putc(' ',Perl_debug_log);
-    fprintf(Perl_debug_log,arg1, arg2, arg3, arg4, arg5);
+       (void)PerlIO_putc(Perl_debug_log,' ');
+    PerlIO_printf(Perl_debug_log, arg1, arg2, arg3, arg4, arg5);
 }
 
 #else
@@ -419,9 +407,6 @@ dump(pat,va_alist)
 {
     I32 i;
     va_list args;
-#ifndef HAS_VPRINTF
-    int vfprintf();
-#endif
 
 #ifdef I_STDARG
     va_start(args, pat);
@@ -429,8 +414,8 @@ dump(pat,va_alist)
     va_start(args);
 #endif
     for (i = dumplvl*4; i; i--)
-       (void)putc(' ',stderr);
-    vfprintf(Perl_debug_log,pat,args);
+       (void)PerlIO_putc(Perl_debug_log,' ');
+    PerlIO_vprintf(Perl_debug_log,pat,args);
     va_end(args);
 }
 #endif
diff --git a/embed.h b/embed.h
index 9d47483..a4669e5 100644 (file)
--- a/embed.h
+++ b/embed.h
 #define curcopdb       Perl_curcopdb
 #define curinterp      Perl_curinterp
 #define curpad         Perl_curpad
+#define cv_const_sv    Perl_cv_const_sv
 #define dc             Perl_dc
+#define debug          Perl_debug
 #define dec_amg                Perl_dec_amg
 #define di             Perl_di
 #define div_amg                Perl_div_amg
 #define div_ass_amg    Perl_div_ass_amg
+#define do_undump      Perl_do_undump
 #define ds             Perl_ds
 #define egid           Perl_egid
 #define envgv          Perl_envgv
 #define my             Perl_my
 #define my_bcopy       Perl_my_bcopy
 #define my_bzero       Perl_my_bzero
-#define my_chsize              Perl_my_chsize
+#define my_chsize      Perl_my_chsize
 #define my_exit                Perl_my_exit
 #define my_htonl       Perl_my_htonl
 #define my_lstat       Perl_my_lstat
 /* Undefine symbols that were defined by EMBED. Somewhat ugly */
 
 #undef curcop
+#undef curcopdb
 #undef envgv
 #undef siggv
-#undef stack
 #undef tainting
 
 #define Argv           (curinterp->IArgv)
 #define debdelim       (curinterp->Idebdelim)
 #define debname                (curinterp->Idebname)
 #define debstash       (curinterp->Idebstash)
-#define debug          (curinterp->Idebug)
 #define defgv          (curinterp->Idefgv)
 #define defoutgv       (curinterp->Idefoutgv)
 #define defstash       (curinterp->Idefstash)
 #define dirty          (curinterp->Idirty)
 #define dlevel         (curinterp->Idlevel)
 #define dlmax          (curinterp->Idlmax)
-#define do_undump      (curinterp->Ido_undump)
 #define doextract      (curinterp->Idoextract)
 #define doswitches     (curinterp->Idoswitches)
 #define dowarn         (curinterp->Idowarn)
 #define Idebdelim      debdelim
 #define Idebname       debname
 #define Idebstash      debstash
-#define Idebug         debug
 #define Idefgv         defgv
 #define Idefoutgv      defoutgv
 #define Idefstash      defstash
 #define Idirty         dirty
 #define Idlevel                dlevel
 #define Idlmax         dlmax
-#define Ido_undump     do_undump
 #define Idoextract     doextract
 #define Idoswitches    doswitches
 #define Idowarn                dowarn
index e4469c9..240d078 100755 (executable)
--- a/embed.pl
+++ b/embed.pl
@@ -30,7 +30,8 @@ open(GL, "<global.sym") || die "Can't open global.sym: $!\n";
 while(<GL>) {
        s/[ \t]*#.*//;          # Delete comments.
        next unless /\S/;
-       s/(.*)/#define $1\t\tPerl_$1/;
+       s/^\s*(\S+).*$/#define $1\t\tPerl_$1/;
+       $global{$1} = 1; 
        s/(................\t)\t/$1/;
        print EM $_;
 }
@@ -47,19 +48,25 @@ print EM <<'END';
 
 /* Undefine symbols that were defined by EMBED. Somewhat ugly */
 
-#undef curcop
-#undef envgv
-#undef siggv
-#undef stack
-#undef tainting
-
 END
 
+
+open(INT, "<interp.sym") || die "Can't open interp.sym: $!\n";
+while (<INT>) {
+       s/[ \t]*#.*//;          # Delete comments.
+       next unless /\S/;
+       s/^\s*(\S*).*$/#undef $1/;
+       print EM $_ if (exists $global{$1});
+}
+close(INT) || warn "Can't close interp.sym: $!\n";
+
+print EM "\n";
+
 open(INT, "<interp.sym") || die "Can't open interp.sym: $!\n";
 while (<INT>) {
        s/[ \t]*#.*//;          # Delete comments.
        next unless /\S/;
-       s/(.*)/#define $1\t\t(curinterp->I$1)/;
+       s/^\s*(\S+).*$/#define $1\t\t(curinterp->I$1)/;
        s/(................\t)\t/$1/;
        print EM $_;
 }
@@ -75,7 +82,7 @@ open(INT, "<interp.sym") || die "Can't open interp.sym: $!\n";
 while (<INT>) {
        s/[ \t]*#.*//;          # Delete comments.
        next unless /\S/;
-       s/(.*)/#define I$1\t\t$1/;
+       s/^\s*(\S+).*$/#define I$1\t\t$1/;
        s/(................\t)\t/$1/;
        print EM $_;
 }
index 0fff538..61cd138 100644 (file)
@@ -273,18 +273,14 @@ DB_File - Perl5 access to Berkeley DB
  [$X =] tie %hash,  'DB_File', [$filename, $flags, $mode, $DB_HASH] ;
  [$X =] tie %hash,  'DB_File', $filename, $flags, $mode, $DB_BTREE ;
  [$X =] tie @array, 'DB_File', $filename, $flags, $mode, $DB_RECNO ;
-  
- [$X =] tie %hash,  DB_File, $filename [, $flags, $mode, $DB_HASH ] ;
- [$X =] tie %hash,  DB_File, $filename, $flags, $mode, $DB_BTREE ;
- [$X =] tie @array, DB_File, $filename, $flags, $mode, $DB_RECNO ;
-   
+
  $status = $X->del($key [, $flags]) ;
  $status = $X->put($key, $value [, $flags]) ;
  $status = $X->get($key, $value [, $flags]) ;
- $status = $X->seq($key, $value , $flags) ;
+ $status = $X->seq($key, $value, $flags) ;
  $status = $X->sync([$flags]) ;
  $status = $X->fd ;
-    
+
  $count = $X->get_dup($key) ;
  @list  = $X->get_dup($key) ;
  %list  = $X->get_dup($key, 1) ;
@@ -321,11 +317,6 @@ applications, is built into Berkeley DB. If you do need to use your own
 hashing algorithm it is possible to write your own in Perl and have
 B<DB_File> use it instead.
 
-When opening an existing database, you may omit the final three arguments
-to C<tie>; they default to O_RDWR, 0644, and $DB_HASH.  If you're
-creating a new file, you need to specify at least the C<$flags>
-argument, which must include O_CREAT.
-
 =item B<DB_BTREE>
 
 The btree format allows arbitrary key/value pairs to be stored in a
index 5ccdc68..9323935 100644 (file)
@@ -3,7 +3,7 @@ use ExtUtils::MakeMaker;
 WriteMakefile(
     NAME => 'DynaLoader',
     LINKTYPE   => 'static',
-    DEFINE     => '-DLIBC="$(LIBC)"',
+    DEFINE     => '-DPERL_CORE -DLIBC="$(LIBC)"',
     MAN3PODS   => ' ',         # Pods will be built by installman.
     SKIP       => [qw(dynamic dynamic_lib dynamic_bs)],
     XSPROTOARG => '-noprototypes',             # XXX remove later?
index f8bace1..68831ed 100644 (file)
@@ -527,9 +527,9 @@ void *
 dl_load_file(filename)
        char *          filename
        CODE:
-       DLDEBUG(1,fprintf(stderr,"dl_load_file(%s):\n", filename));
+       DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "dl_load_file(%s):\n", filename));
        RETVAL = dlopen(filename, 1) ;
-       DLDEBUG(2,fprintf(stderr," libref=%x\n", RETVAL));
+       DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), " libref=%x\n", RETVAL));
        ST(0) = sv_newmortal() ;
        if (RETVAL == NULL)
            SaveError("%s",dlerror()) ;
@@ -542,10 +542,10 @@ dl_find_symbol(libhandle, symbolname)
        void *          libhandle
        char *          symbolname
        CODE:
-       DLDEBUG(2,fprintf(stderr,"dl_find_symbol(handle=%x, symbol=%s)\n",
+       DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "dl_find_symbol(handle=%x, symbol=%s)\n",
                libhandle, symbolname));
        RETVAL = dlsym(libhandle, symbolname);
-       DLDEBUG(2,fprintf(stderr,"  symbolref = %x\n", RETVAL));
+       DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "  symbolref = %x\n", RETVAL));
        ST(0) = sv_newmortal() ;
        if (RETVAL == NULL)
            SaveError("%s",dlerror()) ;
@@ -567,7 +567,7 @@ dl_install_xsub(perl_name, symref, filename="$Package")
     void *     symref 
     char *     filename
     CODE:
-    DLDEBUG(2,fprintf(stderr,"dl_install_xsub(name=%s, symref=%x)\n",
+    DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "dl_install_xsub(name=%s, symref=%x)\n",
        perl_name, symref));
     ST(0)=sv_2mortal(newRV((SV*)newXS(perl_name, (void(*)())symref, filename)));
 
index a0028a1..d2f2f7f 100644 (file)
@@ -62,7 +62,7 @@ dl_private_init()
         if (dlderr) {
             char *msg = dld_strerror(dlderr);
             SaveError("dld_init(%s) failed: %s", origargv[0], msg);
-            DLDEBUG(1,fprintf(stderr,"%s", LastError));
+            DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "%s", LastError));
         }
 #ifdef __linux__
     }
@@ -83,12 +83,12 @@ dl_load_file(filename)
     int dlderr,x,max;
     GV *gv;
     RETVAL = filename;
-    DLDEBUG(1,fprintf(stderr,"dl_load_file(%s)\n", filename));
+    DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "dl_load_file(%s)\n", filename));
 
     max = AvFILL(dl_require_symbols);
     for (x = 0; x <= max; x++) {
        char *sym = SvPVX(*av_fetch(dl_require_symbols, x, 0));
-       DLDEBUG(1,fprintf(stderr, "dld_create_ref(%s)\n", sym));
+       DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "dld_create_ref(%s)\n", sym));
        if (dlderr = dld_create_reference(sym)) {
            SaveError("dld_create_reference(%s): %s", sym,
                      dld_strerror(dlderr));
@@ -96,7 +96,7 @@ dl_load_file(filename)
        }
     }
 
-    DLDEBUG(1,fprintf(stderr, "dld_link(%s)\n", filename));
+    DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "dld_link(%s)\n", filename));
     if (dlderr = dld_link(filename)) {
        SaveError("dld_link(%s): %s", filename, dld_strerror(dlderr));
        goto haverror;
@@ -105,13 +105,13 @@ dl_load_file(filename)
     max = AvFILL(dl_resolve_using);
     for (x = 0; x <= max; x++) {
        char *sym = SvPVX(*av_fetch(dl_resolve_using, x, 0));
-       DLDEBUG(1,fprintf(stderr, "dld_link(%s)\n", sym));
+       DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "dld_link(%s)\n", sym));
        if (dlderr = dld_link(sym)) {
            SaveError("dld_link(%s): %s", sym, dld_strerror(dlderr));
            goto haverror;
        }
     }
-    DLDEBUG(2,fprintf(stderr,"libref=%s\n", RETVAL));
+    DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "libref=%s\n", RETVAL));
 haverror:
     ST(0) = sv_newmortal() ;
     if (dlderr == 0)
@@ -123,11 +123,11 @@ dl_find_symbol(libhandle, symbolname)
     void *     libhandle
     char *     symbolname
     CODE:
-    DLDEBUG(2,fprintf(stderr,"dl_find_symbol(handle=%x, symbol=%s)\n",
+    DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "dl_find_symbol(handle=%x, symbol=%s)\n",
            libhandle, symbolname));
     RETVAL = (void *)dld_get_func(symbolname);
     /* if RETVAL==NULL we should try looking for a non-function symbol */
-    DLDEBUG(2,fprintf(stderr,"  symbolref = %x\n", RETVAL));
+    DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "  symbolref = %x\n", RETVAL));
     ST(0) = sv_newmortal() ;
     if (RETVAL == NULL)
        SaveError("dl_find_symbol: Unable to find '%s' symbol", symbolname) ;
@@ -157,7 +157,7 @@ dl_install_xsub(perl_name, symref, filename="$Package")
     void *     symref 
     char *     filename
     CODE:
-    DLDEBUG(2,fprintf(stderr,"dl_install_xsub(name=%s, symref=%x)\n",
+    DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "dl_install_xsub(name=%s, symref=%x)\n",
            perl_name, symref));
     ST(0)=sv_2mortal(newRV((SV*)newXS(perl_name, (void(*)())symref, filename)));
 
index a2a6816..5dfe5c1 100644 (file)
@@ -151,9 +151,9 @@ dl_load_file(filename)
     if (dl_nonlazy)
        mode = RTLD_NOW;
 #endif
-    DLDEBUG(1,fprintf(stderr,"dl_load_file(%s):\n", filename));
+    DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "dl_load_file(%s):\n", filename));
     RETVAL = dlopen(filename, mode) ;
-    DLDEBUG(2,fprintf(stderr," libref=%x\n", RETVAL));
+    DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), " libref=%x\n", RETVAL));
     ST(0) = sv_newmortal() ;
     if (RETVAL == NULL)
        SaveError("%s",dlerror()) ;
@@ -170,10 +170,10 @@ dl_find_symbol(libhandle, symbolname)
     char symbolname_buf[1024];
     symbolname = dl_add_underscore(symbolname, symbolname_buf);
 #endif
-    DLDEBUG(2,fprintf(stderr,"dl_find_symbol(handle=%x, symbol=%s)\n",
+    DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "dl_find_symbol(handle=%x, symbol=%s)\n",
        libhandle, symbolname));
     RETVAL = dlsym(libhandle, symbolname);
-    DLDEBUG(2,fprintf(stderr,"  symbolref = %x\n", RETVAL));
+    DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "  symbolref = %x\n", RETVAL));
     ST(0) = sv_newmortal() ;
     if (RETVAL == NULL)
        SaveError("%s",dlerror()) ;
@@ -195,7 +195,7 @@ dl_install_xsub(perl_name, symref, filename="$Package")
     void *             symref 
     char *             filename
     CODE:
-    DLDEBUG(2,fprintf(stderr,"dl_install_xsub(name=%s, symref=%x)\n",
+    DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "dl_install_xsub(name=%s, symref=%x)\n",
                perl_name, symref));
     ST(0)=sv_2mortal(newRV((SV*)newXS(perl_name, (void(*)())symref, filename)));
 
index 0e14683..975d26d 100644 (file)
@@ -52,17 +52,17 @@ dl_load_file(filename)
     max = AvFILL(dl_resolve_using);
     for (i = 0; i <= max; i++) {
        char *sym = SvPVX(*av_fetch(dl_resolve_using, i, 0));
-       DLDEBUG(1,fprintf(stderr, "dl_load_file(%s) (dependent)\n", sym));
+       DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "dl_load_file(%s) (dependent)\n", sym));
        obj = shl_load(sym, bind_type | BIND_NOSTART, 0L);
        if (obj == NULL) {
            goto end;
        }
     }
 
-    DLDEBUG(1,fprintf(stderr,"dl_load_file(%s): ", filename));
+    DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "dl_load_file(%s): ", filename));
     obj = shl_load(filename, bind_type | BIND_NOSTART, 0L);
 
-    DLDEBUG(2,fprintf(stderr," libref=%x\n", obj));
+    DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), " libref=%x\n", obj));
 end:
     ST(0) = sv_newmortal() ;
     if (obj == NULL)
@@ -83,17 +83,17 @@ dl_find_symbol(libhandle, symbolname)
     char symbolname_buf[MAXPATHLEN];
     symbolname = dl_add_underscore(symbolname, symbolname_buf);
 #endif
-    DLDEBUG(2,fprintf(stderr,"dl_find_symbol(handle=%x, symbol=%s)\n",
+    DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "dl_find_symbol(handle=%x, symbol=%s)\n",
                libhandle, symbolname));
     ST(0) = sv_newmortal() ;
     errno = 0;
 
     status = shl_findsym(&obj, symbolname, TYPE_PROCEDURE, &symaddr);
-    DLDEBUG(2,fprintf(stderr,"  symbolref(PROCEDURE) = %x\n", symaddr));
+    DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "  symbolref(PROCEDURE) = %x\n", symaddr));
 
     if (status == -1 && errno == 0) {  /* try TYPE_DATA instead */
        status = shl_findsym(&obj, symbolname, TYPE_DATA, &symaddr);
-       DLDEBUG(2,fprintf(stderr,"  symbolref(DATA) = %x\n", symaddr));
+       DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "  symbolref(DATA) = %x\n", symaddr));
     }
 
     if (status == -1) {
@@ -117,7 +117,7 @@ dl_install_xsub(perl_name, symref, filename="$Package")
     void *     symref 
     char *     filename
     CODE:
-    DLDEBUG(2,fprintf(stderr,"dl_install_xsub(name=%s, symref=%x)\n",
+    DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "dl_install_xsub(name=%s, symref=%x)\n",
            perl_name, symref));
     ST(0)=sv_2mortal(newRV((SV*)newXS(perl_name, (void(*)())symref, filename)));
 
index 9e98d56..3e908ff 100644 (file)
@@ -245,9 +245,9 @@ dl_load_file(filename)
     char *     filename
     CODE:
     int mode = 1;
-    DLDEBUG(1,fprintf(stderr,"dl_load_file(%s):\n", filename));
+    DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "dl_load_file(%s):\n", filename));
     RETVAL = dlopen(filename, mode) ;
-    DLDEBUG(2,fprintf(stderr," libref=%x\n", RETVAL));
+    DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), " libref=%x\n", RETVAL));
     ST(0) = sv_newmortal() ;
     if (RETVAL == NULL)
        SaveError("%s",dlerror()) ;
@@ -264,10 +264,10 @@ dl_find_symbol(libhandle, symbolname)
     char symbolname_buf[1024];
     symbolname = dl_add_underscore(symbolname, symbolname_buf);
 #endif
-    DLDEBUG(2,fprintf(stderr,"dl_find_symbol(handle=%x, symbol=%s)\n",
+    DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "dl_find_symbol(handle=%x, symbol=%s)\n",
            libhandle, symbolname));
     RETVAL = dlsym(libhandle, symbolname);
-    DLDEBUG(2,fprintf(stderr,"  symbolref = %x\n", RETVAL));
+    DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "  symbolref = %x\n", RETVAL));
     ST(0) = sv_newmortal() ;
     if (RETVAL == NULL)
        SaveError("%s",dlerror()) ;
@@ -289,7 +289,7 @@ dl_install_xsub(perl_name, symref, filename="$Package")
     void *     symref 
     char *     filename
     CODE:
-    DLDEBUG(2,fprintf(stderr,"dl_install_xsub(name=%s, symref=%x)\n",
+    DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "dl_install_xsub(name=%s, symref=%x)\n",
            perl_name, symref));
     ST(0)=sv_2mortal(newRV((SV*)newXS(perl_name, (void(*)())symref, filename)));
 
index 2c72be2..3042a00 100644 (file)
@@ -126,9 +126,9 @@ dl_load_file(filename)
 #ifdef RTLD_LAZY
     mode = RTLD_LAZY; /* Solaris 2 */
 #endif
-    DLDEBUG(1,fprintf(stderr,"dl_load_file(%s):\n", filename));
+    DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "dl_load_file(%s):\n", filename));
     RETVAL = dlopen(filename, mode) ;
-    DLDEBUG(2,fprintf(stderr," libref=%x\n", RETVAL));
+    DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), " libref=%x\n", RETVAL));
     ST(0) = sv_newmortal() ;
     if (RETVAL == NULL)
        SaveError("%s",dlerror()) ;
@@ -145,10 +145,10 @@ dl_find_symbol(libhandle, symbolname)
     char symbolname_buf[1024];
     symbolname = dl_add_underscore(symbolname, symbolname_buf);
 #endif
-    DLDEBUG(2,fprintf(stderr,"dl_find_symbol(handle=%x, symbol=%s)\n",
+    DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "dl_find_symbol(handle=%x, symbol=%s)\n",
        libhandle, symbolname));
     RETVAL = dlsym(libhandle, symbolname);
-    DLDEBUG(2,fprintf(stderr,"  symbolref = %x\n", RETVAL));
+    DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "  symbolref = %x\n", RETVAL));
     ST(0) = sv_newmortal() ;
     if (RETVAL == NULL)
        SaveError("%s",dlerror()) ;
@@ -173,7 +173,7 @@ dl_install_xsub(perl_name, symref, filename="$Package")
     void *             symref 
     char *             filename
     CODE:
-    DLDEBUG(2,fprintf(stderr,"dl_install_xsub(name=%s, symref=%x)\n",
+    DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "dl_install_xsub(name=%s, symref=%x)\n",
                perl_name, symref));
     ST(0)=sv_2mortal(newRV((SV*)newXS(perl_name, (void(*)())symref, filename)));
 
index 3f46ffc..a646e11 100644 (file)
@@ -126,7 +126,7 @@ findsym_handler(void *sig, void *mech)
     myvec[0] = args = usig[0] > 10 ? 9 : usig[0] - 1;
     while (--args) myvec[args] = usig[args];
     _ckvmssts(sys$putmsg(myvec,copy_errmsg,0,0));
-    DLDEBUG(2,fprintf(stderr,"findsym_handler: received\n\t%s\n",LastError));
+    DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "findsym_handler: received\n\t%s\n",LastError));
     return SS$_CONTINUE;
 }
 
@@ -177,11 +177,11 @@ dl_expandspec(filespec)
     dlfab.fab$b_fns = strlen(vmsspec);
     dlfab.fab$l_dna = 0;
     dlfab.fab$b_dns = 0;
-    DLDEBUG(1,fprintf(stderr,"dl_expand_filespec(%s):\n",vmsspec));
+    DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "dl_expand_filespec(%s):\n",vmsspec));
     /* On the first pass, just parse the specification string */
     dlnam.nam$b_nop = NAM$M_SYNCHK;
     sts = sys$parse(&dlfab);
-    DLDEBUG(2,fprintf(stderr,"\tSYNCHK sys$parse = %d\n",sts));
+    DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "\tSYNCHK sys$parse = %d\n",sts));
     if (!(sts & 1)) {
       dl_set_error(dlfab.fab$l_sts,dlfab.fab$l_stv);
       ST(0) = &sv_undef;
@@ -194,7 +194,7 @@ dl_expandspec(filespec)
              dlnam.nam$b_type + dlnam.nam$b_ver);
       deflen += dlnam.nam$b_type + dlnam.nam$b_ver;
       memcpy(vmsspec,dlnam.nam$l_name,dlnam.nam$b_name);
-      DLDEBUG(2,fprintf(stderr,"\tsplit filespec: name = %.*s, default = %.*s\n",
+      DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "\tsplit filespec: name = %.*s, default = %.*s\n",
                         dlnam.nam$b_name,vmsspec,deflen,defspec));
       /* . . . and go back to expand it */
       dlnam.nam$b_nop = 0;
@@ -202,7 +202,7 @@ dl_expandspec(filespec)
       dlfab.fab$b_dns = deflen;
       dlfab.fab$b_fns = dlnam.nam$b_name;
       sts = sys$parse(&dlfab);
-      DLDEBUG(2,fprintf(stderr,"\tname/default sys$parse = %d\n",sts));
+      DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "\tname/default sys$parse = %d\n",sts));
       if (!(sts & 1)) {
         dl_set_error(dlfab.fab$l_sts,dlfab.fab$l_stv);
         ST(0) = &sv_undef;
@@ -210,14 +210,14 @@ dl_expandspec(filespec)
       else {
         /* Now find the actual file */
         sts = sys$search(&dlfab);
-        DLDEBUG(2,fprintf(stderr,"\tsys$search = %d\n",sts));
+        DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "\tsys$search = %d\n",sts));
         if (!(sts & 1)) {
           dl_set_error(dlfab.fab$l_sts,dlfab.fab$l_stv);
           ST(0) = &sv_undef;
         }
         else {
           ST(0) = sv_2mortal(newSVpv(dlnam.nam$l_rsa,dlnam.nam$b_rsl));
-          DLDEBUG(1,fprintf(stderr,"\tresult = \\%.*s\\\n",
+          DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "\tresult = \\%.*s\\\n",
                             dlnam.nam$b_rsl,dlnam.nam$l_rsa));
         }
       }
@@ -242,16 +242,16 @@ dl_load_file(filespec)
     vmssts sts, failed = 0;
     void (*entry)();
 
-    DLDEBUG(1,fprintf(stderr,"dl_load_file(%s):\n",filespec));
+    DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "dl_load_file(%s):\n",filespec));
     specdsc.dsc$a_pointer = tovmsspec(filespec,vmsspec);
     specdsc.dsc$w_length = strlen(specdsc.dsc$a_pointer);
-    DLDEBUG(2,fprintf(stderr,"\tVMS-ified filespec is %s\n",
+    DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "\tVMS-ified filespec is %s\n",
                       specdsc.dsc$a_pointer));
     New(7901,dlptr,1,struct libref);
     dlptr->name.dsc$b_dtype = dlptr->defspec.dsc$b_dtype = DSC$K_DTYPE_T;
     dlptr->name.dsc$b_class = dlptr->defspec.dsc$b_class = DSC$K_CLASS_S;
     sts = sys$filescan(&specdsc,namlst,0);
-    DLDEBUG(2,fprintf(stderr,"\tsys$filescan: returns %d, name is %.*s\n",
+    DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "\tsys$filescan: returns %d, name is %.*s\n",
                       sts,namlst[0].len,namlst[0].string));
     if (!(sts & 1)) {
       failed = 1;
@@ -267,21 +267,21 @@ dl_load_file(filespec)
       memcpy(dlptr->defspec.dsc$a_pointer + deflen,
              namlst[0].string + namlst[0].len,
              dlptr->defspec.dsc$w_length - deflen);
-      DLDEBUG(2,fprintf(stderr,"\tlibref = name: %s, defspec: %.*s\n",
+      DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "\tlibref = name: %s, defspec: %.*s\n",
                         dlptr->name.dsc$a_pointer,
                         dlptr->defspec.dsc$w_length,
                         dlptr->defspec.dsc$a_pointer));
       if (!(reqSVhndl = av_fetch(dl_require_symbols,0,FALSE)) || !(reqSV = *reqSVhndl)) {
-        DLDEBUG(2,fprintf(stderr,"\t@dl_require_symbols empty, returning untested libref\n"));
+        DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "\t@dl_require_symbols empty, returning untested libref\n"));
       }
       else {
         symdsc.dsc$w_length = SvCUR(reqSV);
         symdsc.dsc$a_pointer = SvPVX(reqSV);
-        DLDEBUG(2,fprintf(stderr,"\t$dl_require_symbols[0] = %.*s\n",
+        DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "\t$dl_require_symbols[0] = %.*s\n",
                           symdsc.dsc$w_length, symdsc.dsc$a_pointer));
         sts = my_find_image_symbol(&(dlptr->name),&symdsc,
                                     &entry,&(dlptr->defspec));
-        DLDEBUG(2,fprintf(stderr,"\tlib$find_image_symbol returns %d\n",sts));
+        DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "\tlib$find_image_symbol returns %d\n",sts));
         if (!(sts&1)) {
           failed = 1;
           dl_set_error(sts,0);
@@ -311,13 +311,13 @@ dl_find_symbol(librefptr,symname)
     void (*entry)();
     vmssts sts;
 
-    DLDEBUG(1,fprintf(stderr,"dl_find_dymbol(%.*s,%.*s):\n",
+    DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "dl_find_dymbol(%.*s,%.*s):\n",
                       thislib.name.dsc$w_length, thislib.name.dsc$a_pointer,
                       symdsc.dsc$w_length,symdsc.dsc$a_pointer));
     sts = my_find_image_symbol(&(thislib.name),&symdsc,
                                &entry,&(thislib.defspec));
-    DLDEBUG(2,fprintf(stderr,"\tlib$find_image_symbol returns %d\n",sts));
-    DLDEBUG(2,fprintf(stderr,"\tentry point is %d\n",
+    DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "\tlib$find_image_symbol returns %d\n",sts));
+    DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "\tentry point is %d\n",
                       (unsigned long int) entry));
     if (!(sts & 1)) {
       /* error message already saved by findsym_handler */
@@ -339,7 +339,7 @@ dl_install_xsub(perl_name, symref, filename="$Package")
     void *     symref 
     char *     filename
     CODE:
-    DLDEBUG(2,fprintf(stderr,"dl_install_xsub(name=%s, symref=%x)\n",
+    DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "dl_install_xsub(name=%s, symref=%x)\n",
         perl_name, symref));
     ST(0)=sv_2mortal(newRV((SV*)newXS(perl_name, (void(*)())symref, filename)));
 
index 07ea332..599dd37 100644 (file)
@@ -35,7 +35,7 @@ dl_generic_private_init()     /* called by dl_*.xs dl_private_init() */
     if ( (perl_dl_nonlazy = getenv("PERL_DL_NONLAZY")) != NULL )
        dl_nonlazy = atoi(perl_dl_nonlazy);
     if (dl_nonlazy)
-       DLDEBUG(1,fprintf(stderr,"DynaLoader bind mode is 'non-lazy'\n"));
+       DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "DynaLoader bind mode is 'non-lazy'\n"));
 #ifdef DL_LOADONCEONLY
     if (!dl_loaded_files)
        dl_loaded_files = newHV(); /* provide cache for dl_*.xs if needed */
@@ -79,7 +79,7 @@ SaveError(pat, va_alist)
 
     /* Copy message into LastError (including terminating null char)   */
     strncpy(LastError, message, len) ;
-    DLDEBUG(2,fprintf(stderr,"DynaLoader: stored error msg '%s'\n",LastError));
+    DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "DynaLoader: stored error msg '%s'\n",LastError));
 }
 
 
index 8b1c60e..413b312 100644 (file)
@@ -1,10 +1,11 @@
 #include "EXTERN.h"
+#define PERLIO_NOT_STDIO 1
 #include "perl.h"
 #include "XSUB.h"
 
 typedef int SysRet;
-typedef FILE * InputStream;
-typedef FILE * OutputStream;
+typedef PerlIO * InputStream;
+typedef PerlIO * OutputStream;
 
 static int
 not_here(s)
@@ -64,35 +65,27 @@ SV *
 fgetpos(handle)
        InputStream     handle
     CODE:
-#ifdef HAS_FGETPOS
        if (handle) {
            Fpos_t pos;
-           fgetpos(handle, &pos);
+           PerlIO_getpos(handle, &pos);
            ST(0) = sv_2mortal(newSVpv((char*)&pos, sizeof(Fpos_t)));
        }
        else {
            ST(0) = &sv_undef;
            errno = EINVAL;
        }
-#else
-       ST(0) = (SV *) not_here("fgetpos");
-#endif
 
 SysRet
 fsetpos(handle, pos)
        InputStream     handle
        SV *            pos
     CODE:
-#ifdef HAS_FSETPOS
        if (handle)
-           RETVAL = fsetpos(handle, (Fpos_t*)SvPVX(pos));
+           RETVAL = PerlIO_setpos(handle, (Fpos_t*)SvPVX(pos));
        else {
            RETVAL = -1;
            errno = EINVAL;
        }
-#else
-           RETVAL = (SysRet) not_here("fsetpos");
-#endif
     OUTPUT:
        RETVAL
 
@@ -102,7 +95,7 @@ ungetc(handle, c)
        int             c
     CODE:
        if (handle)
-           RETVAL = ungetc(c, handle);
+           RETVAL = PerlIO_ungetc(handle, c);
        else {
            RETVAL = -1;
            errno = EINVAL;
@@ -114,7 +107,7 @@ OutputStream
 new_tmpfile(packname = "FileHandle")
     char *             packname
     CODE:
-       RETVAL = tmpfile();
+       RETVAL = PerlIO_tmpfile();
     OUTPUT:
        RETVAL
 
@@ -123,7 +116,7 @@ ferror(handle)
        InputStream     handle
     CODE:
        if (handle)
-           RETVAL = ferror(handle);
+           RETVAL = PerlIO_error(handle);
        else {
            RETVAL = -1;
            errno = EINVAL;
@@ -136,7 +129,7 @@ fflush(handle)
        OutputStream    handle
     CODE:
        if (handle)
-           RETVAL = Fflush(handle);
+           RETVAL = PerlIO_flush(handle);
        else {
            RETVAL = -1;
            errno = EINVAL;
@@ -149,9 +142,12 @@ setbuf(handle, buf)
        OutputStream    handle
        char *          buf = SvPOK(ST(1)) ? sv_grow(ST(1), BUFSIZ) : 0;
     CODE:
+#ifdef PERLIO_IS_STDIO
        if (handle)
            setbuf(handle, buf);
-
+#else
+       not_here("setbuf");
+#endif
 
 
 SysRet
@@ -161,6 +157,7 @@ setvbuf(handle, buf, type, size)
        int             type
        int             size
     CODE:
+#ifdef PERLIO_IS_STDIO
 #ifdef _IOFBF   /* Should be HAS_SETVBUF once Configure tests for that */
        if (handle)
            RETVAL = setvbuf(handle, buf, type, size);
@@ -171,6 +168,9 @@ setvbuf(handle, buf, type, size)
 #else
            RETVAL = (SysRet) not_here("setvbuf");
 #endif /* _IOFBF */
+#else
+       RETVAL = (SysRet) not_here("setvbuf");
+#endif
     OUTPUT:
        RETVAL
 
index 9dc09b2..82dce85 100644 (file)
@@ -1,13 +1,18 @@
 #include "EXTERN.h"
+#define PERLIO_NOT_STDIO 1
 #include "perl.h"
 #include "XSUB.h"
+
 #ifdef I_UNISTD
 #  include <unistd.h>
 #endif
+#ifdef I_FCNTL
+#  include <fcntl.h>
+#endif
 
 typedef int SysRet;
-typedef FILE * InputStream;
-typedef FILE * OutputStream;
+typedef PerlIO * InputStream;
+typedef PerlIO * OutputStream;
 
 static int
 not_here(s)
@@ -62,12 +67,6 @@ IV *pval;
 #else
            return FALSE;
 #endif
-       if (strEQ(name, "SEEK_EOF"))
-#ifdef SEEK_EOF
-           { *pval = SEEK_EOF; return TRUE; }
-#else
-           return FALSE;
-#endif
        break;
     }
 
@@ -81,35 +80,27 @@ SV *
 fgetpos(handle)
        InputStream     handle
     CODE:
-#ifdef HAS_FGETPOS
        if (handle) {
            Fpos_t pos;
-           fgetpos(handle, &pos);
+           PerlIO_getpos(handle, &pos);
            ST(0) = sv_2mortal(newSVpv((char*)&pos, sizeof(Fpos_t)));
        }
        else {
            ST(0) = &sv_undef;
            errno = EINVAL;
        }
-#else
-       ST(0) = (SV *) not_here("IO::Seekable::fgetpos");
-#endif
 
 SysRet
 fsetpos(handle, pos)
        InputStream     handle
        SV *            pos
     CODE:
-#ifdef HAS_FSETPOS
        if (handle)
-           RETVAL = fsetpos(handle, (Fpos_t*)SvPVX(pos));
+           RETVAL = PerlIO_setpos(handle, (Fpos_t*)SvPVX(pos));
        else {
            RETVAL = -1;
            errno = EINVAL;
        }
-#else
-           RETVAL = (SysRet) not_here("IO::Seekable::fsetpos");
-#endif
     OUTPUT:
        RETVAL
 
@@ -119,7 +110,7 @@ OutputStream
 new_tmpfile(packname = "IO::File")
     char *             packname
     CODE:
-       RETVAL = tmpfile();
+       RETVAL = PerlIO_tmpfile();
     OUTPUT:
        RETVAL
 
@@ -141,7 +132,7 @@ ungetc(handle, c)
        int             c
     CODE:
        if (handle)
-           RETVAL = ungetc(c, handle);
+           RETVAL = PerlIO_ungetc(handle, c);
        else {
            RETVAL = -1;
            errno = EINVAL;
@@ -154,7 +145,7 @@ ferror(handle)
        InputStream     handle
     CODE:
        if (handle)
-           RETVAL = ferror(handle);
+           RETVAL = PerlIO_error(handle);
        else {
            RETVAL = -1;
            errno = EINVAL;
@@ -167,7 +158,7 @@ fflush(handle)
        OutputStream    handle
     CODE:
        if (handle)
-           RETVAL = Fflush(handle);
+           RETVAL = PerlIO_flush(handle);
        else {
            RETVAL = -1;
            errno = EINVAL;
@@ -181,9 +172,11 @@ setbuf(handle, buf)
        char *          buf = SvPOK(ST(1)) ? sv_grow(ST(1), BUFSIZ) : 0;
     CODE:
        if (handle)
+#ifdef PERLIO_IS_STDIO
            setbuf(handle, buf);
-
-
+#else
+           not_here("IO::Handle::setbuf");
+#endif
 
 SysRet
 setvbuf(handle, buf, type, size)
@@ -192,6 +185,7 @@ setvbuf(handle, buf, type, size)
        int             type
        int             size
     CODE:
+#ifdef PERLIO_IS_STDIO
 #ifdef _IOFBF   /* Should be HAS_SETVBUF once Configure tests for that */
        if (handle)
            RETVAL = setvbuf(handle, buf, type, size);
@@ -202,6 +196,9 @@ setvbuf(handle, buf, type, size)
 #else
            RETVAL = (SysRet) not_here("IO::Handle::setvbuf");
 #endif /* _IOFBF */
+#else
+           not_here("IO::Handle::setvbuf");
+#endif
     OUTPUT:
        RETVAL
 
index aaba77c..f208604 100644 (file)
@@ -186,7 +186,7 @@ require Exporter;
 @FileHandle::ISA = qw(IO::Handle);
 
 
-$VERSION = sprintf("%d.%02d", q$Revision: 1.8 $ =~ /(\d+)\.(\d+)/);
+$VERSION = sprintf("%d.%02d", q$Revision: 1.9 $ =~ /(\d+)\.(\d+)/);
 
 @EXPORT_OK = qw(
     autoflush
@@ -259,8 +259,6 @@ sub new_from_fd {
     IO::Handle::fdopen($fh, @_)
        or return undef;
     bless $fh, $class;
-    $fh->_ref_fd;
-    $fh;
 }
 
 # FileHandle::DESTROY use to call close(). This creates a problem
index 208be0c..ed8c2bb 100644 (file)
@@ -49,7 +49,9 @@ handle with the same C<fileno> is specified then only the last one is cached.
 
 =item remove ( HANDLES )
 
-Remove all the given handles from the object.
+Remove all the given handles from the object. This method also works
+by the C<fileno> of the handles. So the exact handles that were added
+need not be passed, just handles that have an equivalent C<fileno>
 
 =item can_read ( [ TIMEOUT ] )
 
@@ -66,6 +68,12 @@ Same as C<can_read> except check for handles that can be written to.
 Same as C<can_read> except check for handles that have an error condition, for
 example EOF.
 
+=item count ()
+
+Returns the number of handles that the object will check for when
+one of the C<can_> methods is called or the object is passed to
+the C<select> static method.
+
 =item select ( READ, WRITE, ERROR [, TIMEOUT ] )
 
 C<select> is a static method, that is you call it with the package name
@@ -132,12 +140,16 @@ $VERSION = sprintf("%d.%02d", q$Revision: 1.2 $ =~ /(\d+)\.(\d+)/);
 
 @ISA = qw(Exporter); # This is only so we can do version checking
 
+sub VEC_BITS {0}
+sub FD_COUNT {1}
+sub FIRST_FD {2}
+
 sub new
 {
  my $self = shift;
  my $type = ref($self) || $self;
 
- my $vec = bless [''], $type;
+ my $vec = bless [undef,0], $type;
 
  $vec->add(@_)
     if @_;
@@ -150,14 +162,19 @@ sub add
  my $vec = shift;
  my $f;
 
+ $vec->[VEC_BITS] = '' unless defined $vec->[VEC_BITS];
+
  foreach $f (@_)
   {
    my $fn = $f =~ /^\d+$/ ? $f : fileno($f);
    next
     unless defined $fn;
-   vec($vec->[0],$fn++,1) = 1;
-   $vec->[$fn] = $f;
+   vec($vec->[VEC_BITS],$fn,1) = 1;
+   $vec->[FD_COUNT] += 1
+       unless defined $vec->[$fn+FIRST_FD];
+   $vec->[$fn+FIRST_FD] = $f;
   }
+ $vec->[VEC_BITS] = undef unless $vec->count;
 }
 
 sub remove
@@ -170,9 +187,11 @@ sub remove
    my $fn = $f =~ /^\d+$/ ? $f : fileno($f);
    next
     unless defined $fn;
-   vec($vec->[0],$fn++,1) = 0;
-   $vec->[$fn] = undef;
+   vec($vec->[VEC_BITS],$fn,1) = 0;
+   $vec->[$fn+FIRST_FD] = undef;
+   $vec->[FD_COUNT] -= 1;
   }
+ $vec->[VEC_BITS] = undef unless $vec->count;
 }
 
 sub can_read
@@ -180,7 +199,7 @@ sub can_read
  my $vec = shift;
  my $timeout = shift;
 
- my $r = $vec->[0];
+ my $r = $vec->[VEC_BITS] or return ();
 
  select($r,undef,undef,$timeout) > 0
     ? _handles($vec, $r)
@@ -192,7 +211,7 @@ sub can_write
  my $vec = shift;
  my $timeout = shift;
 
- my $w = $vec->[0];
+ my $w = $vec->[VEC_BITS] or return ();
 
  select(undef,$w,undef,$timeout) > 0
     ? _handles($vec, $w)
@@ -204,13 +223,19 @@ sub has_error
  my $vec = shift;
  my $timeout = shift;
 
- my $e = $vec->[0];
+ my $e = $vec->[VEC_BITS] or return ();
 
  select(undef,undef,$e,$timeout) > 0
     ? _handles($vec, $e)
     : ();
 }
 
+sub count
+{
+ my $vec = shift;
+ $vec->[FD_COUNT];
+}
+
 sub _max
 {
  my($a,$b,$c) = @_;
@@ -231,28 +256,28 @@ sub select
  my($r,$w,$e,$t) = @_;
  my @result = ();
 
- my $rb = defined $r ? $r->[0] : undef;
- my $wb = defined $w ? $e->[0] : undef;
- my $eb = defined $e ? $w->[0] : undef;
+ my $rb = defined $r ? $r->[VEC_BITS] : undef;
+ my $wb = defined $w ? $e->[VEC_BITS] : undef;
+ my $eb = defined $e ? $w->[VEC_BITS] : undef;
 
  if(select($rb,$wb,$eb,$t) > 0)
   {
    my @r = ();
    my @w = ();
    my @e = ();
-   my $i = _max(defined $r ? scalar(@$r) : 0,
-                defined $w ? scalar(@$w) : 0,
-                defined $e ? scalar(@$e) : 0);
+   my $i = _max(defined $r ? scalar(@$r)-1 : 0,
+                defined $w ? scalar(@$w)-1 : 0,
+                defined $e ? scalar(@$e)-1 : 0);
 
-   for( ; $i > 0 ; $i--)
+   for( ; $i >= FIRST_FD ; $i--)
     {
-     my $j = $i - 1;
+     my $j = $i - FIRST_FD;
      push(@r, $r->[$i])
-        if defined $r->[$i] && vec($rb, $j, 1);
+        if defined $rb && defined $r->[$i] && vec($rb, $j, 1);
      push(@w, $w->[$i])
-        if defined $w->[$i] && vec($wb, $j, 1);
+        if defined $wb && defined $w->[$i] && vec($wb, $j, 1);
      push(@e, $e->[$i])
-        if defined $e->[$i] && vec($eb, $j, 1);
+        if defined $eb && defined $e->[$i] && vec($eb, $j, 1);
     }
 
    @result = (\@r, \@w, \@e);
@@ -267,14 +292,15 @@ sub _handles
  my @h = ();
  my $i;
 
- for($i = scalar(@$vec) - 1 ; $i > 0 ; $i--)
+ for($i = scalar(@$vec) - 1 ; $i >= FIRST_FD ; $i--)
   {
    next unless defined $vec->[$i];
    push(@h, $vec->[$i])
-      if vec($bits,$i - 1,1);
+      if vec($bits,$i - FIRST_FD,1);
   }
  
  @h;
 }
 
 1;
+
index be81d9a..5f2a8ef 100644 (file)
@@ -76,7 +76,8 @@ use Exporter;
 @ISA = qw(IO::Handle);
 
 # This one will turn 1.2 => 1.02 and 1.2.3 => 1.0203 and so on ...
-$VERSION = do{my @r=(q$Revision: 1.8$=~/(\d+)/g);sprintf "%d."."%02d"x$#r,@r};
+
+$VERSION = do{my @r=(q$Revision: 1.9 $=~/(\d+)/g);sprintf "%d."."%02d"x$#r,@r};
 
 sub import {
     my $pkg = shift;
@@ -131,7 +132,7 @@ sub connect {
     local($SIG{ALRM}) = $timeout ? sub { undef $fh; }
                                 : $SIG{ALRM} || 'DEFAULT';
 
-    eval {
+     eval {
        croak 'connect: Bad address'
            if(@_ == 2 && !defined $_[1]);
 
@@ -140,17 +141,17 @@ sub connect {
                $timeout = 0;
        }
 
-       my $ok = eval { connect($fh, $addr) };
+       my $ok = connect($fh, $addr);
 
        alarm(0)
            if($timeout);
 
-       croak "connect: timeout"
-           unless defined $fh;
-
-       undef $fh unless $ok;
+       croak "connect: timeout"
+           unless defined $fh;
 
+       undef $fh unless $ok;
     };
+
     $fh;
 }
 
@@ -544,14 +545,14 @@ Graham Barr <Graham.Barr@tiuk.ti.com>
 
 =head1 REVISION
 
-$Revision: 1.8 $
+$Revision: 1.9 $
 
 The VERSION is derived from the revision turning each number after the
 first dot into a 2 digit number so
 
-       Revision 1.8   => VERSION 1.08
-       Revision 1.2.3 => VERSION 1.0203
+       Revision 1.8   => VERSION 1.08
+       Revision 1.2.3 => VERSION 1.0203
+
 =head1 COPYRIGHT
 
 Copyright (c) 1995 Graham Barr. All rights reserved. This program is free
index 928f680..5d9d63f 100644 (file)
@@ -233,7 +233,7 @@ PROTOTYPES: ENABLE
 
 BOOT:
     assert(maxo < OP_MASK_BUF_SIZE);
-    opset_len = (maxo / 8) + 1;
+    opset_len = (maxo + 7) / 8;
     if (opcode_debug >= 1)
        warn("opset_len %d\n", opset_len);
     op_names_init();
index 3ba3c5b..69849b1 100644 (file)
@@ -1,4 +1,5 @@
 #include "EXTERN.h"
+#define PERLIO_NOT_STDIO 1
 #include "perl.h"
 #include "XSUB.h"
 #include <ctype.h>
@@ -245,13 +246,6 @@ char *cuserid _((char *));
 #define waitpid(a,b,c) not_here("waitpid")
 #endif
 
-#ifndef HAS_FGETPOS
-#define fgetpos(a,b) not_here("fgetpos")
-#endif
-#ifndef HAS_FSETPOS
-#define fsetpos(a,b) not_here("fsetpos")
-#endif
-
 #ifndef HAS_MBLEN
 #ifndef mblen
 #define mblen(a,b) not_here("mblen")
diff --git a/ext/POSIX/mkposixman.pl b/ext/POSIX/mkposixman.pl
new file mode 100644 (file)
index 0000000..3daa1bf
--- /dev/null
@@ -0,0 +1,1134 @@
+#!/tmp/perl5 -w
+#!/tmp/perl5
+
+# Ramrodded by Dean Roehrich.
+#
+# Submissions for function descriptions are needed.  Don't write a tutorial,
+# and don't repeat things that can be found in the system's manpages,
+# just give a quick 2-3 line note and a one-line example.
+#
+# Check the latest version of the Perl5 Module List for Dean's current
+# email address (listed as DMR).
+#
+my $VERS = 951129;  # yymmdd
+
+local *main::XS;
+local *main::PM;
+
+open( XS, "<POSIX.xs" ) || die "Unable to open POSIX.xs";
+open( PM, "<POSIX.pm" ) || die "Unable to open POSIX.pm";
+close STDOUT;
+open( STDOUT, ">POSIX.pod" ) || die "Unable to open POSIX.pod";
+
+print <<'EOQ';
+=head1 NAME
+
+POSIX - Perl interface to IEEE Std 1003.1
+
+=head1 SYNOPSIS
+
+    use POSIX;
+    use POSIX qw(setsid);
+    use POSIX qw(:errno_h :fcntl_h);
+
+    printf "EINTR is %d\n", EINTR;
+
+    $sess_id = POSIX::setsid();
+
+    $fd = POSIX::open($path, O_CREAT|O_EXCL|O_WRONLY, 0644);
+       # note: that's a filedescriptor, *NOT* a filehandle
+
+=head1 DESCRIPTION
+
+The POSIX module permits you to access all (or nearly all) the standard
+POSIX 1003.1 identifiers.  Many of these identifiers have been given Perl-ish
+interfaces.  Things which are C<#defines> in C, like EINTR or O_NDELAY, are
+automatically exported into your namespace.  All functions are only exported
+if you ask for them explicitly.  Most likely people will prefer to use the
+fully-qualified function names.
+
+This document gives a condensed list of the features available in the POSIX
+module.  Consult your operating system's manpages for general information on
+most features.  Consult L<perlfunc> for functions which are noted as being
+identical to Perl's builtin functions.
+
+The first section describes POSIX functions from the 1003.1 specification.
+The second section describes some classes for signal objects, TTY objects,
+and other miscellaneous objects.  The remaining sections list various
+constants and macros in an organization which roughly follows IEEE Std
+1003.1b-1993.
+
+=head1 NOTE
+
+The POSIX module is probably the most complex Perl module supplied with
+the standard distribution.  It incorporates autoloading, namespace games,
+and dynamic loading of code that's in Perl, C, or both.  It's a great
+source of wisdom.
+
+=head1 CAVEATS 
+
+A few functions are not implemented because they are C specific.  If you
+attempt to call these, they will print a message telling you that they
+aren't implemented, and suggest using the Perl equivalent should one
+exist.  For example, trying to access the setjmp() call will elicit the
+message "setjmp() is C-specific: use eval {} instead".
+
+Furthermore, some evil vendors will claim 1003.1 compliance, but in fact
+are not so: they will not pass the PCTS (POSIX Compliance Test Suites).
+For example, one vendor may not define EDEADLK, or the semantics of the
+errno values set by open(2) might not be quite right.  Perl does not
+attempt to verify POSIX compliance.  That means you can currently
+successfully say "use POSIX",  and then later in your program you find
+that your vendor has been lax and there's no usable ICANON macro after
+all.  This could be construed to be a bug.
+
+EOQ
+
+use strict;
+
+
+my $constants = {};
+my $macros = {};
+my $packages = [];
+my $posixpack = Package->new( 'POSIX' );
+my $descriptions = Description->new;
+
+get_constants( 'XS', $constants, $macros );
+get_functions( 'XS', $packages, $posixpack );
+get_PMfunctions( 'PM', $packages, $posixpack, $descriptions );
+
+
+# It is possible that the matches of setup_*() may depend on
+# the matches of an earlier setup_*().  If you change the order,
+# be careful that you're getting only what you want, and no more.
+#
+my $termios_flags = setup_termios( $constants );
+my $wait_stuff = setup_wait( $constants, $macros );
+my $stat = setup_file_char( $constants, $macros );
+my $port = setup_pat( $constants, '^_POSIX' );
+my $sc = setup_pat( $constants, '^_SC_' );
+my $pc = setup_pat( $constants, '^_PC_' );
+my $fcntl = setup_pat( $constants, '^([FO]_|FD_)' );
+my $sigs = setup_pat( $constants, '^(SIG|SA_)' );
+my $float = setup_pat( $constants, '^(L?DBL_|FLT_)' );
+my $locale = setup_pat( $constants, '^LC_' );
+my $stdio = setup_pat( $constants, '(^BUFSIZ$)|(^L_)|(^_IO...$)|(^EOF$)|(^FILENAME_MAX$)|(^TMP_MAX$)' );
+my $stdlib = setup_pat( $constants, '(^EXIT_)|(^MB_CUR_MAX$)|(^RAND_MAX$)' );
+my $limits = setup_pat( $constants, '(_MAX$)|(_MIN$)|(_BIT$)|(^MAX_)|(_BUF$)' );
+my $math = setup_pat( $constants, '^HUGE_VAL$' );
+my $time = setup_pat( $constants, '^CL' );
+my $unistd = setup_pat( $constants, '(_FILENO$)|(^SEEK_...$)|(^._OK$)' );
+my $errno = setup_pat( $constants, '^E' );
+
+print_posix( $posixpack, $descriptions );
+print_classes( $packages, $constants, $termios_flags, $descriptions );
+print_misc( 'Pathname Constants', $pc );
+print_misc( 'POSIX Constants', $port );
+print_misc( 'System Configuration', $sc );
+print_misc( 'Errno', $errno );
+print_misc( 'Fcntl', $fcntl );
+print_misc( 'Float', $float );
+print_misc( 'Limits', $limits );
+print_misc( 'Locale', $locale );
+print_misc( 'Math', $math );
+print_misc( 'Signal', $sigs );
+print_misc( 'Stat', $stat );
+print_misc( 'Stdlib', $stdlib );
+print_misc( 'Stdio', $stdio );
+print_misc( 'Time', $time );
+print_misc( 'Unistd', $unistd );
+print_misc( 'Wait', $wait_stuff );
+
+print_vers( $VERS );
+
+dregs( $macros, $constants );
+
+exit(0);
+
+Unimplemented.
+
+sub dregs {
+       my $macros = shift;
+       my $constants = shift;
+
+       foreach (keys %$macros){
+               warn "Unknown macro $_ in the POSIX.xs module.\n";
+       }
+       foreach (keys %$constants){
+               warn "Unknown constant $_ in the POSIX.xs module.\n";
+       }
+}
+
+sub get_constants {
+       no strict 'refs';
+       my $fh = shift;
+       my $constants = shift;
+       my $macros = shift;
+       my $v;
+
+       while(<$fh>){
+               last if /^constant/;
+       }
+       while(<$fh>){ # }{{
+               last if /^}/;
+               if( /return\s+([^;]+)/ ){
+                       $v = $1;
+                       # skip non-symbols
+                       if( $v !~ /^\d+$/ ){
+                               # remove any C casts
+                               $v =~ s,\(.*?\)\s*(\w),$1,;
+                               # is it a macro?
+                               if( $v =~ s/(\(.*?\))// ){
+                                       $macros->{$v} = $1;
+                               }
+                               else{
+                                       $constants->{$v} = 1;
+                               }
+                       }
+               }
+       }
+}
+
+Close the file.  This uses file descriptors such as those obtained by calling
+C<POSIX::open>.
+
+       $fd = POSIX::open( "foo", &POSIX::O_RDONLY );
+       POSIX::close( $fd );
+
+sub get_functions {
+       no strict 'refs';
+       my $fh = shift;
+       my $packages = shift;
+       my $posixpack = shift;
+       my $header = 0;
+       my $pack = '';
+       my $prefix = '';
+       my( $x, $y );
+       my( $curfuncs, $curpack );
+       my $ret;
+
+       while(<$fh>){
+               if( /^MODULE.*?PACKAGE\s*=\s*([^\s]+)/ ){
+                       $pack = $1;
+                       $prefix = '';
+                       if( /PREFIX\s*=\s*([^\n]+)/ ){
+                               $prefix = $1;
+                       }
+                       #print "package($pack) prefix($prefix)\n";
+                       if( $pack eq 'POSIX' ){
+                               $curpack = $posixpack;
+                       }
+                       else{
+                               $curpack = Package->new( $pack );
+                               push @$packages, $curpack;
+                       }
+                       $curfuncs = $curpack->curfuncs;
+                       next;
+               }
+
+               chop;
+               # find function header
+               if( /^[^\s]/ && ! /^#/ ){
+                       $ret = /^SysRet/ ? 2 : 1;
+                       chop($x = <$fh>);
+                       next if( $pack eq 'POSIX' and $x =~ /^constant/ );
+                       $x =~ /^(.*?)\s*\((.*?)\)/;
+                       ($x,$y) = ($1, $2); # func,sig
+                       $x =~ s/^$prefix//;
+                       $curfuncs->{$x} = $ret;
+                       ++$header
+               }
+               # leave function header
+               else{
+                       $header = 0;
+               }
+       }
+}
+
+
+sub get_PMfunctions {
+       no strict 'refs';
+       my $fh = shift;
+       my $packages = shift;
+       my $posixpack = shift;
+       my $desc = shift;
+       my $pack = '';
+       my( $curfuncs, $curpack );
+       my $y;
+       my $x;
+       my $sub = '';
+
+       # find the second package statement.
+       while(<$fh>){
+               if( /^package\s+(.*?);/ ){
+                       $pack = $1;
+                       last if $pack ne 'POSIX';
+               }
+       }
+
+       # Check if this package is already
+       # being used.
+       $curpack = '';
+       foreach (@$packages){
+               if( $_->name eq $pack ){
+                       $curpack = $_;
+                       last;
+               }
+       }
+       # maybe start a new package.
+       if( $curpack eq '' ){
+               $curpack = Package->new( $pack );
+               push @$packages, $curpack;
+       }
+       $curfuncs = $curpack->curfuncs;
+
+       # now fetch functions
+       while(<$fh>){
+               if( /^package\s+(.*?);/ ){
+                       $pack = $1;
+                       if( $pack eq 'POSIX' ){
+                               $curpack = $posixpack;
+                       }
+                       else{
+                               # Check if this package is already
+                               # being used.
+                               $curpack = '';
+                               foreach (@$packages){
+                                       if( $_->name() eq $pack ){
+                                               $curpack = $_;
+                                               last;
+                                       }
+                               }
+                               # maybe start a new package.
+                               if( $curpack eq '' ){
+                                       $curpack = Package->new( $pack );
+                                       push @$packages, $curpack;
+                               }
+                       }
+                       $curfuncs = $curpack->curfuncs;
+                       next;
+               }
+               if( /^sub\s+(.*?)\s/ ){
+                       $sub = $1;
+
+                       # special cases
+                       if( $pack eq 'POSIX::SigAction' and
+                          $sub eq 'new' ){
+                               $curfuncs->{$sub} = 1;
+                       }
+                       elsif( $pack eq 'POSIX' and $sub eq 'perror' ){
+                               $curfuncs->{$sub} = 1;
+                       }
+
+                       next;
+               }
+               if( /usage.*?\((.*?)\)/ ){
+                       $y = $1;
+                       $curfuncs->{$sub} = 1;
+                       next;
+                }
+                if( /^\s+unimpl\s+"(.*?)"/ ){
+                       $y = $1;
+                       $y =~ s/, stopped//;
+                       $desc->append( $pack, $sub, $y );
+                       $curfuncs->{$sub} = 1;
+                       next;
+                }
+                if( /^\s+redef\s+"(.*?)"/ ){
+                       $x = $1;
+                       $y = "Use method C<$x> instead";
+                       $desc->append( $pack, $sub, $y );
+                       $curfuncs->{$sub} = 1;
+                       next;
+                }
+       }
+}
+
+Retrieves the value of a configurable limit on a file or directory.  This
+uses file descriptors such as those obtained by calling C<POSIX::open>.
+
+The following will determine the maximum length of the longest allowable
+pathname on the filesystem which holds C</tmp/foo>.
+
+       $fd = POSIX::open( "/tmp/foo", &POSIX::O_RDONLY );
+       $path_max = POSIX::fpathconf( $fd, &POSIX::_PC_PATH_MAX );
+Return the mantissa and exponent of a floating-point number.
+
+       ($mantissa, $exponent) = POSIX::frexp( 3.14 );
+Get file status.  This uses file descriptors such as those obtained by
+calling C<POSIX::open>.  The data returned is identical to the data from
+Perl's builtin C<stat> function.
+
+       $fd = POSIX::open( "foo", &POSIX::O_RDONLY );
+       @stats = POSIX::fstat( $fd );
+
+sub print_posix {
+       my $pack = shift;
+       my $desc = shift;
+
+       print "=head1 FUNCTIONS\n\n";
+       print "=over 8\n\n";
+       dumpfuncs( $pack, $desc );
+       print "=back\n\n";
+}
+
+sub print_classes {
+       my $packages = shift;
+       my $constants = shift;
+       my $termios = shift;
+       my $desc = shift;
+       my $pack;
+       my @pkgs;
+
+       print "=head1 CLASSES\n\n";
+       @pkgs = sort { $main::a->name() cmp $main::b->name() } @$packages;
+       while( @pkgs ){
+               $pack = shift @pkgs;
+               print "=head2 ", $pack->name(), "\n\n";
+               print "=over 8\n\n";
+
+               dumpfuncs( $pack, $desc );
+
+               if( $pack->name() =~ /termios/i ){
+                       dumpflags( $termios );
+               }
+               print "=back\n\n";
+       }
+}
+
+sub setup_termios {
+       my $constants = shift;
+       my $obj;
+
+       $obj = {
+               'c_iflag field' => [qw( BRKINT ICRNL IGNBRK IGNCR IGNPAR
+                                       INLCR INPCK ISTRIP IXOFF IXON
+                                       PARMRK )],
+               'c_oflag field' => [qw( OPOST )],
+               'c_cflag field' => [qw( CLOCAL CREAD CSIZE CS5 CS6 CS7 CS8
+                                       CSTOPB HUPCL PARENB PARODD )],
+               'c_lflag field' => [qw( ECHO ECHOE ECHOK ECHONL ICANON
+                                       IEXTEN ISIG NOFLSH TOSTOP )],
+               'c_cc field'    => [qw( VEOF VEOL VERASE VINTR VKILL VQUIT
+                                       VSUSP VSTART VSTOP VMIN VTIME NCCS )],
+               'Baud rate'     => [],
+               'Terminal interface' => [],
+       };
+       # look for baud rates in constants, add to termios
+       foreach (keys %$constants){
+               if( /^B\d+$/ ){
+                       push @{$obj->{'Baud rate'}}, $_;
+               }
+       }
+       # look for TC* in constants, add to termios
+       foreach (keys %$constants){
+               if( /^TC/ ){
+                       push @{$obj->{'Terminal interface'}}, $_;
+               }
+       }
+       # trim the constants
+       foreach (keys %$obj){
+               trim_hash( 'Constant', $obj->{$_}, $constants );
+       }
+       return $obj;
+}
+
+
+sub dumpfuncs {
+       my $pack = shift;
+       my $desc = shift;
+       my $curfuncs = $pack->curfuncs;
+       my $pname = $pack->name;
+       my $func;
+       my @funcs = sort keys %$curfuncs;
+
+       if( exists $curfuncs->{'new'} ){ # do new first
+               @funcs = grep( $_ ne 'new', @funcs );
+               unshift @funcs, 'new';
+       }
+       while( @funcs ){
+               $func = shift @funcs;
+               if( $func eq 'DESTROY' ){
+                       next;    # don't do DESTROY
+               }
+               print "=item $func\n\n";
+               if( $desc->print( $pname, $func, $curfuncs->{$func} ) ){
+                       # if it was printed, note that
+                       delete $curfuncs->{$func};
+               }
+       }
+}
+
+sub dumpflags {
+       my $flags = shift;
+       my $field;
+
+       foreach $field (sort keys %$flags){
+               print "=item $field values\n\n";
+               print join( ' ', @{$flags->{$field}} ), "\n\n";
+       }
+}
+
+sub setup_wait {
+       my $constants = shift;
+       my $macros = shift;
+       my $obj;
+
+       $obj = {
+               'Macros'    => [qw( WIFEXITED WEXITSTATUS WIFSIGNALED
+                                   WTERMSIG WIFSTOPPED WSTOPSIG )],
+               'Constants' => [qw( WNOHANG WUNTRACED )],
+       };
+       trim_hash( 'Constant', $obj->{Constants}, $constants );
+       trim_hash( 'Macro', $obj->{Macros}, $macros );
+       return $obj;
+}
+
+sub setup_file_char {
+       my $constants = shift;
+       my $macros = shift;
+       my $obj;
+
+       $obj = {
+               'Macros'    => [],
+               'Constants' => [],
+       };
+       # find S_* constants and add to object.
+       foreach (sort keys %$constants){
+               if( /^S_/ ){
+                       push @{$obj->{'Constants'}}, $_;
+               }
+       }
+       # find S_* macros and add to object.
+       foreach (sort keys %$macros){
+               if( /^S_/ ){
+                       push @{$obj->{'Macros'}}, $_;
+               }
+       }
+       # trim the hashes
+       trim_hash( 'Constant', $obj->{Constants}, $constants );
+       trim_hash( 'Macro', $obj->{Macros}, $macros );
+       return $obj;
+}
+
+
+sub setup_pat {
+       my $constants = shift;
+       my $pat = shift;
+       my $obj;
+
+       $obj = { 'Constants' => [] };
+       foreach (sort keys %$constants){
+               if( /$pat/ ){
+                       push @{$obj->{'Constants'}}, $_;
+               }
+       }
+       trim_hash( 'Constant', $obj->{Constants}, $constants );
+       return $obj;
+}
+
+Get numeric formatting information.  Returns a reference to a hash
+containing the current locale formatting values.
+
+The database for the B<de> (Deutsch or German) locale.
+
+       $loc = POSIX::setlocale( &POSIX::LC_ALL, "de" );
+       print "Locale = $loc\n";
+       $lconv = POSIX::localeconv();
+       print "decimal_point    = ", $lconv->{decimal_point},   "\n";
+       print "thousands_sep    = ", $lconv->{thousands_sep},   "\n";
+       print "grouping = ", $lconv->{grouping},        "\n";
+       print "int_curr_symbol  = ", $lconv->{int_curr_symbol}, "\n";
+       print "currency_symbol  = ", $lconv->{currency_symbol}, "\n";
+       print "mon_decimal_point = ", $lconv->{mon_decimal_point}, "\n";
+       print "mon_thousands_sep = ", $lconv->{mon_thousands_sep}, "\n";
+       print "mon_grouping     = ", $lconv->{mon_grouping},    "\n";
+       print "positive_sign    = ", $lconv->{positive_sign},   "\n";
+       print "negative_sign    = ", $lconv->{negative_sign},   "\n";
+       print "int_frac_digits  = ", $lconv->{int_frac_digits}, "\n";
+       print "frac_digits      = ", $lconv->{frac_digits},     "\n";
+       print "p_cs_precedes    = ", $lconv->{p_cs_precedes},   "\n";
+       print "p_sep_by_space   = ", $lconv->{p_sep_by_space},  "\n";
+       print "n_cs_precedes    = ", $lconv->{n_cs_precedes},   "\n";
+       print "n_sep_by_space   = ", $lconv->{n_sep_by_space},  "\n";
+       print "p_sign_posn      = ", $lconv->{p_sign_posn},     "\n";
+       print "n_sign_posn      = ", $lconv->{n_sign_posn},     "\n";
+Move the read/write file pointer.  This uses file descriptors such as
+those obtained by calling C<POSIX::open>.
+
+       $fd = POSIX::open( "foo", &POSIX::O_RDONLY );
+       $off_t = POSIX::lseek( $fd, 0, &POSIX::SEEK_SET );
+
+sub print_vers {
+       my $vers = shift;
+
+       print "=head1 CREATION\n\n";
+       print "This document generated by $0 version $vers.\n\n";
+}
+
+sub print_misc {
+       my $hdr = shift;
+       my $obj = shift;
+       my $item;
+
+       print "=head1 ", uc($hdr), "\n\n";
+       print "=over 8\n\n";
+       foreach $item (sort keys %$obj){
+               print "=item $item\n\n";
+               print join( ' ', @{$obj->{$item}}), "\n\n";
+       }
+       print "=back\n\n";
+}
+
+sub trim_hash {
+       my $name = shift;
+       my $av = shift;
+       my $hv = shift;
+
+       foreach (@$av){
+               if( exists $hv->{$_} ){
+                       delete $hv->{$_};
+               }
+               else{
+                       warn "$name $_ is not in the POSIX.xs module";
+               }
+       }
+}
+
+{ package Package; ## Package package
+
+  sub new {
+       my $type = shift;
+       my $pack = shift || die;
+       my $self = [ $pack, {} ];
+       bless $self, $type;
+  }
+  sub name {
+       my $self = shift;
+       $self->[0];
+  }
+  sub curfuncs {
+       my $self = shift;
+       $self->[1];
+  }
+  sub DESTROY {
+       my $self = shift;
+       my $pack = $self->name;
+       foreach (keys %{$self->curfuncs}){
+               if( $_ eq 'DESTROY' ){
+                       next; # don't expect much on DESTROY
+               }
+               warn "Function ". $pack . "::$_ did not have a description.\n";
+       }
+  }
+}
+{ package Description;  ## Function description
+
+  sub new {
+       my $type = shift;
+       my $self = {};
+       bless $self, $type;
+       $self->fetch;
+       return $self;
+  }
+  sub fetch {
+       my $self = shift;
+       my $pack = '';
+       my $c;
+       my( $sub, $as );
+
+       while(<main::DATA>){
+               next if /^#/;
+               $sub = $as = '';
+               if( /^==(.*)/ ){
+                       $pack = $1;
+                       next;
+               }
+               if( /^=([^\+]+)\+\+/ ){
+                       $sub = $1;
+                       $as = $sub;
+               }
+               elsif( /^=([^\+]+)\+C/ ){
+                       $sub = $1;
+                       $as = 'C';
+               }
+               elsif( /^=([^\+]+)\+(\w+)/ ){
+                       $sub = $1;
+                       $as = $2;
+               }
+               elsif( /^=(.*)/ ){
+                       $sub = $1;
+               }
+
+               if( $sub ne '' ){
+                       $sub = $1;
+                       $self->{$pack."::$sub"} = '';
+                       $c = \($self->{$pack."::$sub"});
+                       if( $as eq 'C' ){
+                               $$c .= "This is identical to the C function C<$sub()>.\n";
+                       }
+                       elsif( $as ne '' ){
+                               $$c .= "This is identical to Perl's builtin C<$as()> function.\n";
+                       }
+                       next;
+               }
+               $$c .= $_;
+       }
+  }
+  sub DESTROY {
+       my $self = shift;
+       foreach (keys %$self){
+               warn "Function $_ is not in the POSIX.xs module.\n";
+       }
+  }
+  sub append {
+       my $self = shift;
+       my $pack = shift;
+       my $sub = shift;
+       my $str = shift || die;
+
+       if( exists $self->{$pack."::$sub"} ){
+               $self->{$pack."::$sub"} .= "\n$str.\n";
+       }
+       else{
+               $self->{$pack."::$sub"} = "$str.\n";
+       }
+  }
+  sub print {
+       my $self = shift;
+       my $pack = shift;
+       my $sub = shift;
+       my $rtype = shift || die;
+       my $ret = 0;
+
+       if( exists $self->{$pack."::$sub"} ){
+               if( $rtype > 1 ){
+                       $self->{$pack."::$sub"} =~ s/identical/similar/;
+               }
+               print $self->{$pack."::$sub"}, "\n";
+               delete $self->{$pack."::$sub"};
+               if( $rtype > 1 ){
+                       print "Returns C<undef> on failure.\n\n";
+               }
+               $ret = 1;
+       }
+       $ret;
+  }
+}
+
+Create an interprocess channel.  This returns file descriptors like those
+returned by C<POSIX::open>.
+
+       ($fd0, $fd1) = POSIX::pipe();
+       POSIX::write( $fd0, "hello", 5 );
+       POSIX::read( $fd1, $buf, 5 );
+Read from a file.  This uses file descriptors such as those obtained by
+calling C<POSIX::open>.  If the buffer C<$buf> is not large enough for the
+read then Perl will extend it to make room for the request.
+
+       $fd = POSIX::open( "foo", &POSIX::O_RDONLY );
+       $bytes = POSIX::read( $fd, $buf, 3 );
+This is similar to the C function C<setpgid()>.
+Detailed signal management.  This uses C<POSIX::SigAction> objects for the
+C<action> and C<oldaction> arguments.  Consult your system's C<sigaction>
+manpage for details.
+
+Synopsis:
+
+       sigaction(sig, action, oldaction = 0)
+Install a signal mask and suspend process until signal arrives.  This uses
+C<POSIX::SigSet> objects for the C<signal_mask> argument.  Consult your
+system's C<sigsuspend> manpage for details.
+
+Synopsis:
+
+       sigsuspend(signal_mask)
+This is identical to Perl's builtin C<sprintf()> function.
+Convert date and time information to string.  Returns the string.
+
+Synopsis:
+
+       strftime(fmt, sec, min, hour, mday, mon, year, wday = 0, yday = 0, isdst = 0)
+
+The month (C<mon>), weekday (C<wday>), and yearday (C<yday>) begin at zero.
+I.e. January is 0, not 1; Sunday is 0, not 1; January 1st is 0, not 1.  The
+year (C<year>) is given in years since 1900.  I.e. The year 1995 is 95; the
+year 2001 is 101.  Consult your system's C<strftime()> manpage for details
+about these and the other arguments.
+
+The string for Tuesday, December 12, 1995.
+
+       $str = POSIX::strftime( "%A, %B %d, %Y", 0, 0, 0, 12, 11, 95, 2 );
+       print "$str\n";
+String transformation.  Returns the transformed string.
+
+       $dst = POSIX::strxfrm( $src );
+Get name of current operating system.
+
+       ($sysname, $nodename, $release, $version, $machine ) = POSIX::uname();
+Returns the current file position, in bytes.
+
+       $pos = $fh->tell;
+Get terminal control attributes.
+
+Obtain the attributes for stdin.
+
+       $termios->getattr()
+
+Obtain the attributes for stdout.
+
+       $termios->getattr( 1 )
+Set terminal control attributes.
+
+Set attributes immediately for stdout.
+
+       $termios->setattr( 1, &POSIX::TCSANOW );
+
+__END__
+##########
+==POSIX::SigSet
+=new
+Create a new SigSet object.  This object will be destroyed automatically
+when it is no longer needed.  Arguments may be supplied to initialize the
+set.
+
+Create an empty set.
+
+       $sigset = POSIX::SigSet->new;
+
+Create a set with SIGUSR1.
+
+       $sigset = POSIX::SigSet->new( &POSIX::SIGUSR1 );
+=addset
+Add a signal to a SigSet object.
+
+       $sigset->addset( &POSIX::SIGUSR2 );
+=delset
+Remove a signal from the SigSet object.
+
+       $sigset->delset( &POSIX::SIGUSR2 );
+=emptyset
+Initialize the SigSet object to be empty.
+
+       $sigset->emptyset();
+=fillset
+Initialize the SigSet object to include all signals.
+
+       $sigset->fillset();
+=ismember
+Tests the SigSet object to see if it contains a specific signal.
+
+       if( $sigset->ismember( &POSIX::SIGUSR1 ) ){
+               print "contains SIGUSR1\n";
+       }
+##########
+==POSIX::Termios
+=new
+Create a new Termios object.  This object will be destroyed automatically
+when it is no longer needed.
+
+       $termios = POSIX::Termios->new;
+=getiflag
+Retrieve the c_iflag field of a termios object.
+
+       $c_iflag = $termios->getiflag;
+=getoflag
+Retrieve the c_oflag field of a termios object.
+
+       $c_oflag = $termios->getoflag;
+=getcflag
+Retrieve the c_cflag field of a termios object.
+
+       $c_cflag = $termios->getcflag;
+=getlflag
+Retrieve the c_lflag field of a termios object.
+
+       $c_lflag = $termios->getlflag;
+=getcc
+Retrieve a value from the c_cc field of a termios object.  The c_cc field is
+an array so an index must be specified.
+
+       $c_cc[1] = $termios->getcc(1);
+=getospeed
+Retrieve the output baud rate.
+
+       $ospeed = $termios->getospeed;
+=getispeed
+Retrieve the input baud rate.
+
+       $ispeed = $termios->getispeed;
+=setiflag
+Set the c_iflag field of a termios object.
+
+       $termios->setiflag( &POSIX::BRKINT );
+=setoflag
+Set the c_oflag field of a termios object.
+
+       $termios->setoflag( &POSIX::OPOST );
+=setcflag
+Set the c_cflag field of a termios object.
+
+       $termios->setcflag( &POSIX::CLOCAL );
+=setlflag
+Set the c_lflag field of a termios object.
+
+       $termios->setlflag( &POSIX::ECHO );
+=setcc
+Set a value in the c_cc field of a termios object.  The c_cc field is an
+array so an index must be specified.
+
+       $termios->setcc( 1, &POSIX::VEOF );
+=setospeed
+Set the output baud rate.
+
+       $termios->setospeed( &POSIX::B9600 );
+=setispeed
+Set the input baud rate.
+
+       $termios->setispeed( &POSIX::B9600 );
+##
+=setattr
+=getattr
+##########
+==FileHandle
+=new
+=new_from_fd
+=flush
+=getc
+=ungetc
+=seek
+=setbuf
+=error
+=clearerr
+=tell
+=getpos
+=gets
+=close
+=new_tmpfile
+=eof
+=fileno
+=setpos
+=setvbuf
+##########
+==POSIX
+=tolower+lc
+=toupper+uc
+=remove+unlink
+=fabs+abs
+=strstr+index
+##
+=closedir++
+=readdir++
+=rewinddir++
+=fcntl++
+=getgrgid++
+=getgrnam++
+=atan2++
+=cos++
+=exp++
+=abs++
+=log++
+=sin++
+=sqrt++
+=getpwnam++
+=getpwuid++
+=kill++
+=getc++
+=rename++
+=exit++
+=system++
+=chmod++
+=mkdir++
+=stat++
+=umask++
+=gmtime++
+=localtime++
+=time++
+=alarm++
+=chdir++
+=chown++
+=fork++
+=getlogin++
+=getpgrp++
+=getppid++
+=link++
+=rmdir++
+=sleep++
+=unlink++
+=utime++
+##
+=perror+C
+=pause+C
+=tzset+C
+=difftime+C
+=ctime+C
+=clock+C
+=asctime+C
+=strcoll+C
+=abort+C
+=tcgetpgrp+C
+=setsid+C
+=_exit+C
+=tanh+C
+=tan+C
+=sinh+C
+=log10+C
+=ldexp+C
+=fmod+C
+=floor+C
+=cosh+C
+=ceil+C
+=atan+C
+=asin+C
+=acos+C
+##
+=isatty
+Returns a boolean indicating whether the specified filehandle is connected
+to a tty.
+=setuid
+Sets the real user id for this process.
+=setgid
+Sets the real group id for this process.
+=getpid
+Returns the process's id.
+=getuid
+Returns the user's id.
+=getegid
+Returns the effective group id.
+=geteuid
+Returns the effective user id.
+=getgid
+Returns the user's real group id.
+=getgroups
+Returns the ids of the user's supplementary groups.
+=getcwd
+Returns the name of the current working directory.
+=strerror
+Returns the error string for the specified errno.
+=getenv
+Returns the value of the specified enironment variable.
+=getchar
+Returns one character from STDIN.
+=raise
+Sends the specified signal to the current process.
+=gets
+Returns one line from STDIN.
+=printf
+Prints the specified arguments to STDOUT.
+=rewind
+Seeks to the beginning of the file.
+##
+=tmpnam
+Returns a name for a temporary file.
+
+       $tmpfile = POSIX::tmpnam();
+=cuserid
+Get the character login name of the user.
+
+       $name = POSIX::cuserid();
+=ctermid
+Generates the path name for controlling terminal.
+
+       $path = POSIX::ctermid();
+=times
+The times() function returns elapsed realtime since some point in the past
+(such as system startup), user and system times for this process, and user
+and system times used by child processes.  All times are returned in clock
+ticks.
+
+    ($realtime, $user, $system, $cuser, $csystem) = POSIX::times();
+
+Note: Perl's builtin C<times()> function returns four values, measured in
+seconds.
+=pow
+Computes $x raised to the power $exponent.
+
+       $ret = POSIX::pow( $x, $exponent );
+=errno
+Returns the value of errno.
+
+       $errno = POSIX::errno();
+=sysconf
+Retrieves values of system configurable variables.
+
+The following will get the machine's clock speed.
+
+       $clock_ticks = POSIX::sysconf( &POSIX::_SC_CLK_TCK );
+=pathconf
+Retrieves the value of a configurable limit on a file or directory.
+
+The following will determine the maximum length of the longest allowable
+pathname on the filesystem which holds C</tmp>.
+
+       $path_max = POSIX::pathconf( "/tmp", &POSIX::_PC_PATH_MAX );
+=access
+Determines the accessibility of a file.
+
+       if( POSIX::access( "/", &POSIX::R_OK ) ){
+               print "have read permission\n";
+       }
+=setlocale
+Modifies and queries program's locale.
+
+The following will set the traditional UNIX system locale behavior.
+
+This document generated by ./mkposixman.PL version 19951212.
+##
+=waitpid
+=wait
+=fstat
+=sprintf
+=opendir
+=creat
+=ttyname
+=tzname
+=fpathconf
+=mktime
+=tcsendbreak
+=tcflush
+=tcflow
+=tcdrain
+=tcsetpgrp
+=mkfifo
+=strxfrm
+=wctomb
+=wcstombs
+=mbtowc
+=mbstowcs
+=mblen
+=write
+=uname
+=setpgid
+=read
+=pipe
+=nice
+=lseek
+=dup2
+=dup
+=close
+=sigsuspend
+=sigprocmask
+=sigpending
+=sigaction
+=modf
+=frexp
+=localeconv
+=open
+=isxdigit
+=isupper
+=isspace
+=ispunct
+=isprint
+=isgraph
+=isdigit
+=iscntrl
+=isalpha
+=isalnum
+=islower
+=assert
+=strftime
+##########
+==POSIX::SigAction
+=new
+Creates a new SigAction object.  This object will be destroyed automatically
+when it is no longer needed.
index 3db71f1..5f0ef52 100644 (file)
@@ -40,11 +40,14 @@ curcop
 curcopdb
 curinterp
 curpad
+cv_const_sv
 dc
+debug
 dec_amg
 di
 div_amg
 div_ass_amg
+do_undump
 ds
 egid
 envgv
diff --git a/gv.c b/gv.c
index c136fc5..cb38bad 100644 (file)
--- a/gv.c
+++ b/gv.c
@@ -241,9 +241,10 @@ char* name;
        /* Failed obvious case - look for SUPER as last element of stash's name */
        char *packname = HvNAME(stash);
        STRLEN len     = strlen(packname);
-       if ((len -= 7) >= 0 && strEQ(packname+len,"::SUPER")) {
+       if (len >= 7 && strEQ(packname+len-7,"::SUPER")) {
            /* Now look for @.*::SUPER::ISA */
            GV** gvp = (GV**)hv_fetch(stash,"ISA",3,FALSE);
+           len -= 7;
            if (!gvp || (gv = *gvp) == (GV*)&sv_undef || !GvAV(gv)) {
                /* No @ISA in package ending in ::SUPER - drop suffix
                   and see if there is an @ISA there
diff --git a/handy.h b/handy.h
index 76d9a4f..b1fca33 100644 (file)
--- a/handy.h
+++ b/handy.h
@@ -20,7 +20,7 @@
 
 #define Null(type) ((type)NULL)
 #define Nullch Null(char*)
-#define Nullfp Null(FILE*)
+#define Nullfp Null(PerlIO*)
 #define Nullsv Null(SV*)
 
 #ifdef TRUE
diff --git a/hints/README.NeXT b/hints/README.NeXT
new file mode 100644 (file)
index 0000000..3e1a461
--- /dev/null
@@ -0,0 +1,56 @@
+OPENSTEP
+--------
+
+Support for OPENSTEP was added. Perl will build with as shared library. To build and install it, use this sequence:
+
+cd <wherever your perl source is>
+sh Configure -des
+DYLD_LIBRARY_PATH=`pwd`; export DYLD_LIBRARY_PATH
+make
+make test
+make install
+
+
+Depending on your shell, you might have to use 
+       
+       setenv DYLD_LIBRARY_PATH `pwd`
+
+instead of
+       
+       DYLD_LIBRARY_PATH=`pwd`; export DYLD_LIBRARY_PATH
+
+Note:
+During compilation/linking there are going to be some warnings, they do not seem to have any ill effects.
+
+Perl is going to be installed below the path /usr/local/OPENSTEP. This is done so that binaries for NEXTSTEP (3.2, 3.3 etc) will not be overwritten, since the OPENSTEP binaries will not work on those systems. Below is a part of my .zshrc file, that makes sure that the new OPENSTEP binaries are used on OPENSTEP:
+
+##############################
+if(fgrep -s 'OPENSTEP 4.' /usr/lib/NextStep/software_version )
+then
+path=(. /etc /usr/etc ~/Unix/bin /usr/local/OPENSTEP/bin /usr/local/bin /usr/local/netpbm/bin /usr/ucb /bin /usr/bin /usr/sybase/bin ~/Apps /LocalApps /NextApps /NextAdmin /NextDeveloper/Demos)
+else
+path=(. /etc /usr/etc ~/Unix/bin /usr/local/bin /usr/local/netpbm/bin /usr/ucb /bin /usr/bin /usr/sybase/bin ~/Apps /LocalApps /NextApps /NextAdmin /NextDeveloper/Demos)
+fi
+##############################
+
+You can change the installation path by changing 'prefix' in hints/next_4.sh before you run Configure.
+
+
+
+NEXTSTEP
+--------
+
+The hints file for NEXTSTEP (hints/next_3.sh) was changed:
+
+- Support for MAB was added
+- perl's malloc is used now; this should take care of some problems with NEXTSTEP 3.2
+
+perl should build and install fine with this sequence:
+
+cd <wherever your perl source is>
+sh Configure -des
+make
+make test
+make install
+
+
index e9f616a..38ad0ec 100644 (file)
@@ -1,11 +1,12 @@
-# This file has been put together by Anno Siegel <siegel@zrz.TU-Berlin.DE>
-# and Andreas Koenig <k@franz.ww.TU-Berlin.DE>. Comments, questions, and
-# improvements welcome!
+# This file has been put together by Anno Siegel <siegel@zrz.TU-Berlin.DE>,
+# Andreas Koenig <k@franz.ww.TU-Berlin.DE> and Gerd Knops <gerti@BITart.com>.
+# Comments, questions, and improvements welcome!
 #
 # These hints work for NeXT 3.2 and 3.3.  3.0 has it's own
 # special hint file.
+#
 
-ccflags='-DUSE_NEXT_CTYPE'
+ccflags='-DUSE_NEXT_CTYPE -DUSE_PERL_SBRK -DHIDEMYMALLOC'
 POSIX_cflags='ccflags="-posix $ccflags"'
 ldflags='-u libsys_s'
 libswanted='dbm gdbm db'
@@ -15,7 +16,12 @@ lddlflags='-nostdlib -r'
 # using GNU cc and try to specify -fpic for cccdlflags.
 cccdlflags=' '
 
+#
+# Change the line below if you do not want to build 'quad-fat'
+# binaries
+#
 mab='-arch m68k -arch i386 -arch hppa -arch sparc'
+
 archname='next-fat'
 ld='cc'
 
@@ -23,20 +29,48 @@ i_utime='undef'
 groupstype='int'
 direntrytype='struct direct'
 d_strcoll='undef'
+
+######################################################################
+# THE MALLOC STORY
+######################################################################
+# 1994:
 # the simple program `for ($i=1;$i<38771;$i++){$t{$i}=123}' fails
 # with Larry's malloc on NS 3.2 due to broken sbrk()
-usemymalloc='n'
+#
+# setting usemymalloc='n' was the solution back then. Later came
+# reports that perl would run unstable on 3.2:
+#
+# From about perl5.002beta1h perl became unstable on the
+# NeXT. Intermittent coredumps were frequent on 3.2 OS. There were
+# reports, that the developer version of 3.3 didn't have problems, so it
+# seemed pretty obvious that we had to work around an malloc bug in 3.2.
+# This hints file reflects a patch to perl5.002_01 that introduces a
+# home made sbrk routine (remember, NeXT's sbrk _never_ worked). This
+# sbrk makes it possible to run perl with its own malloc. Thanks to
+# Ilya who showed me the way to his sbrk for OS/2!!
+# andreas koenig, 1996-06-16
+#
+# So, this hintsfile is using perl's malloc. If you want to turn perl's
+# malloc off, you need to change remove '-DUSE_PERL_SBRK' and 
+# '-DHIDEMYMALLOC' from the ccflags above and set usemymalloc below
+# to 'n'.
+#
+######################################################################
+usemymalloc='y'
+
 d_uname='define'
 d_setpgid='define'
 d_setsid='define'
 d_tcgetpgrp='define'
 d_tcsetpgrp='define'
+
 #
 # On some NeXT machines, the timestamp put by ranlib is not correct, and
 # this may cause useless recompiles.  Fix that by adding a sleep before
 # running ranlib.  The '5' is an empirical number that's "long enough."
-# (Thanks to Andreas Koenig <k@franz.ww.tu-berlin.de>)
+#
 ranlib='sleep 5; /bin/ranlib' 
+
 #
 # There where reports that the compiler on HPPA machines
 # fails with the -O flag on pp.c.
diff --git a/hints/next_3_2.sh b/hints/next_3_2.sh
deleted file mode 100644 (file)
index 37bbf16..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-# This file has been put together by Anno Siegel <siegel@zrz.TU-Berlin.DE>
-# and Andreas Koenig <k@franz.ww.TU-Berlin.DE>. Comments, questions, and
-# improvements welcome!
-#
-# These hints are intended for NeXT 3.2.
-
-# From about perl5.002beta1h perl became unstable on the
-# NeXT. Intermittent coredumps were frequent on 3.2 OS. There were
-# reports, that the developer version of 3.3 didn't have problems, so it
-# seemed pretty obvious that we had to work around an malloc bug in 3.2.
-# This hints file reflects a patch to perl5.002_01 that introduces a
-# home made sbrk routine (remember, NeXT's sbrk _never_ worked). This
-# sbrk makes it possible to run perl with its own malloc. Thanks to
-# Ilya who showed me the way to his sbrk for OS/2!!
-# andreas koenig, 1996-06-16
-
-ccflags='-DUSE_NEXT_CTYPE -DUSE_PERL_SBRK -DHIDEMYMALLOC'
-POSIX_cflags='ccflags="-posix $ccflags"'
-ldflags='-u libsys_s'
-libswanted='dbm gdbm db'
-
-lddlflags='-r'
-# Give cccdlflags an empty value since Configure will detect we are
-# using GNU cc and try to specify -fpic for cccdlflags.
-cccdlflags=' '
-
-i_utime='undef'
-groupstype='int'
-direntrytype='struct direct'
-d_strcoll='undef'
-
-# the simple program `for ($i=1;$i<38771;$i++){$t{$i}=123}' fails
-# with Larry's malloc on NS 3.2 due to broken sbrk()
-######################################################################
-#    above comment should stay here, but is not longer of importance #
-# with -DUSE_PERL_SBRK and -DHIDEMYMALLOC we can now say 'yes' to    #
-# usemymalloc. We call this hintsfile next_3_2.sh, so folks with 3.3 #
-# can decide what they prefer. Actually folks with 3.3 "user" version#
-# will also need this hintsfile, but how can I discern which 3.3 it  #
-# is?                                                                #
-######################################################################
-usemymalloc='y'
-
-d_uname='define'
-d_setpgid='define'
-d_setsid='define'
-d_tcgetpgrp='define'
-d_tcsetpgrp='define'
-
-#
-# On some NeXT machines, the timestamp put by ranlib is not correct, and
-# this may cause useless recompiles.  Fix that by adding a sleep before
-# running ranlib.  The '5' is an empirical number that's "long enough."
-#
-ranlib='sleep 5; /bin/ranlib' 
-
-
-#
-# There where reports that the compiler on HPPA machines
-# fails with the -O flag on pp.c.
-#
-if [ `arch` = "hppa" ]; then
-pp_cflags='optimize="-g"'
-fi
diff --git a/hints/next_3_3.sh b/hints/next_3_3.sh
deleted file mode 100644 (file)
index e5dc1fd..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-# This file has been put together by Anno Siegel <siegel@zrz.TU-Berlin.DE>
-# and Andreas Koenig <k@franz.ww.TU-Berlin.DE>. Comments, questions, and
-# improvements welcome!
-#
-
-# These hints are intended for NeXT 3.3. If you're running the 3.3
-# "user" version of the NeXT OS, you should not change the malloc
-# related hints (USE_PERL_SBRK, HIDEMYMALLOC, usemymalloc). If you're
-# running the 3.3 "dev" version of the OS, I do not know what to
-# recommend (I have no 3.3 dev).
-# From about perl5.002beta1h perl became unstable on the
-# NeXT. Intermittent coredumps were frequent on 3.2 OS. There were
-# reports, that the developer version of 3.3 didn't have problems, so it
-# seemed pretty obvious that we had to work around an malloc bug in 3.2.
-# This hints file reflects a patch to perl5.002_01 that introduces a
-# home made sbrk routine (remember, NeXT's sbrk _never_ worked). This
-# sbrk makes it possible to run perl with its own malloc. Thanks to
-# Ilya who showed me the way to his sbrk for OS/2!!
-# andreas koenig, 1996-06-16
-
-ccflags='-DUSE_NEXT_CTYPE -DUSE_PERL_SBRK -DHIDEMYMALLOC'
-POSIX_cflags='ccflags="-posix $ccflags"'
-ldflags='-u libsys_s'
-libswanted='dbm gdbm db'
-
-lddlflags='-r'
-# Give cccdlflags an empty value since Configure will detect we are
-# using GNU cc and try to specify -fpic for cccdlflags.
-cccdlflags=' '
-
-i_utime='undef'
-groupstype='int'
-direntrytype='struct direct'
-d_strcoll='undef'
-
-# the simple program `for ($i=1;$i<38771;$i++){$t{$i}=123}' fails
-# with Larry's malloc on NS 3.2 due to broken sbrk()
-######################################################################
-#    above comment should stay here, but is not longer of importance #
-# with -DUSE_PERL_SBRK and -DHIDEMYMALLOC we can now say 'yes' to    #
-# usemymalloc. We call this hintsfile next_3_2.sh, so folks with 3.3 #
-# can decide what they prefer. Actually folks with 3.3 "user" version#
-# will also need this hintsfile, but how can I discern which 3.3 it  #
-# is?                                                                #
-######################################################################
-usemymalloc='y'
-
-d_uname='define'
-d_setpgid='define'
-d_setsid='define'
-d_tcgetpgrp='define'
-d_tcsetpgrp='define'
-
-#
-# On some NeXT machines, the timestamp put by ranlib is not correct, and
-# this may cause useless recompiles.  Fix that by adding a sleep before
-# running ranlib.  The '5' is an empirical number that's "long enough."
-#
-ranlib='sleep 5; /bin/ranlib' 
-
-
-#
-# There where reports that the compiler on HPPA machines
-# fails with the -O flag on pp.c.
-#
-if [ `arch` = "hppa" ]; then
-pp_cflags='optimize="-g"'
-fi
index 0e6b7e0..70438dd 100644 (file)
@@ -1,4 +1,4 @@
-# Posix support has been removed from NextStep, expect test/POSIX to fail 
+######################################################################
 #
 # IMPORTANT: before you run 'make', you need to enter one of these two
 # lines (depending on your shell):
@@ -6,6 +6,10 @@
 # or
 #      setenv DYLD_LIBRARY_PATH `pwd`
 #
+######################################################################
+
+# Posix support has been removed from NextStep 
+#
 useposix='undef'
 
 altmake='gnumake'
@@ -14,18 +18,28 @@ libswanted=' '
 libc='/NextLibrary/Frameworks/System.framework/System'
 
 isnext_4='define'
+
+#
+# Change the line below if you do not want to build 'quad-fat'
+# binaries
+#
 mab='-arch m68k -arch i386 -arch sparc'
 ldflags='-dynamic -prebind'
 lddlflags='-dynamic -bundle -undefined suppress'
-ccflags='-dynamic -fno-common -DUSE_NEXT_CTYPE'
+ccflags='-dynamic -fno-common -DUSE_NEXT_CTYPE -DUSE_PERL_SBRK -DHIDEMYMALLOC'
 cccdlflags='none'
 ld='cc'
-optimize='-g -O'
+#optimize='-g -O'
 
 d_shrplib='define'
 dlext='bundle'
 so='dylib'
 
+#
+# The default prefix would be '/usr/local'. But since many people are
+# likely to have still 3.3 machines on their network, we do not want
+# to overwrite possibly existing 3.3 binaries. 
+#
 prefix='/usr/local/OPENSTEP'
 #archlib='/usr/lib/perl5'
 #archlibexp='/usr/lib/perl5'
@@ -37,9 +51,33 @@ i_utime='undef'
 groupstype='int'
 direntrytype='struct direct'
 
+######################################################################
+# THE MALLOC STORY
+######################################################################
+# 1994:
 # the simple program `for ($i=1;$i<38771;$i++){$t{$i}=123}' fails
 # with Larry's malloc on NS 3.2 due to broken sbrk()
-usemymalloc='n'
+#
+# setting usemymalloc='n' was the solution back then. Later came
+# reports that perl would run unstable on 3.2:
+#
+# From about perl5.002beta1h perl became unstable on the
+# NeXT. Intermittent coredumps were frequent on 3.2 OS. There were
+# reports, that the developer version of 3.3 didn't have problems, so it
+# seemed pretty obvious that we had to work around an malloc bug in 3.2.
+# This hints file reflects a patch to perl5.002_01 that introduces a
+# home made sbrk routine (remember, NeXT's sbrk _never_ worked). This
+# sbrk makes it possible to run perl with its own malloc. Thanks to
+# Ilya who showed me the way to his sbrk for OS/2!!
+# andreas koenig, 1996-06-16
+#
+# So, this hintsfile is using perl's malloc. If you want to turn perl's
+# malloc off, you need to change remove '-DUSE_PERL_SBRK' and 
+# '-DHIDEMYMALLOC' from the ccflags above and set usemymalloc below
+# to 'n'.
+#
+######################################################################
+usemymalloc='y'
 clocktype='int'
 
 #
index 1652cb7..91138f4 100644 (file)
@@ -16,6 +16,8 @@
 
 bin_sh=`../UU/loc sh.exe /bin c:/bin d:/bin e:/bin f:/bin g:/bin h:/bin /bin`
 echo "####### Shell found at $bin_sh #############" >&4
+sh="$bin_sh"
+startsh="#!$bin_sh"
 
 #osname="OS/2"
 sysman=`../UU/loc . /man/man1 c:/man/man1 c:/usr/man/man1 d:/man/man1 d:/usr/man/man1 e:/man/man1 e:/usr/man/man1 f:/man/man1 f:/usr/man/man1 g:/man/man1 g:/usr/man/man1 /usr/man/man1`
@@ -74,10 +76,10 @@ else
     ar='emxomfar'
     plibext='.lib'
     d_fork='undef'
-    lddlflags='-Zdll -Zomf -Zcrtdll'
+    lddlflags='-Zdll -Zomf -Zmt -Zcrtdll'
     # Recursive regmatch may eat 2.5M of stack alone.
-    ldflags='-Zexe -Zomf -Zcrtdll -Zstack 32000'
-    ccflags='-Zomf -DDOSISH -DOS2=2 -DEMBED -I. -DPACK_MALLOC -DDEBUGGING_MSTATS'
+    ldflags='-Zexe -Zomf -Zmt -Zcrtdll -Zstack 32000'
+    ccflags='-Zomf -Zmt -DDOSISH -DOS2=2 -DEMBED -I. -DPACK_MALLOC -DDEBUGGING_MSTATS'
     use_clib='c_import'
     usedl='define'
 fi
@@ -162,3 +164,35 @@ d_setprior='define'
 
 # Commented:
 #startsh='extproc ksh\\n#! sh'
+
+# Now install the external modules. We are in the ./hints directory.
+
+cd ../os2/OS2
+
+if ! test -d ../../ext/OS2 ; then
+   mkdir ../../ext/OS2
+fi
+
+cp -rfu * ../../ext/OS2/
+
+# Install tests:
+
+for xxx in * ; do
+       if $test -d $xxx/t; then
+               cp -uf $xxx/t/*.t ../../t/lib
+       else
+               if $test -d $xxx; then
+                       cd $xxx
+                       for yyy in * ; do
+                               if $test -d $yyy/t; then
+                                   cp -uf $yyy/t/*.t ../../t/lib
+                               fi
+                       done
+                       cd ..
+               fi
+       fi
+done
+
+
+# Now go back
+cd ../../hints
index a2f04c7..33fb2c7 100644 (file)
@@ -31,7 +31,6 @@ dbargs
 debdelim
 debname
 debstash
-debug
 defgv
 defoutgv
 defstash
@@ -40,7 +39,6 @@ diehook
 dirty
 dlevel
 dlmax
-do_undump
 doextract
 doswitches
 dowarn
index 341786d..b70659a 100644 (file)
@@ -1147,8 +1147,8 @@ sub init_dirscan {        # --- File and Directory Lists (.xs .pm .pod etc)
     foreach $name ($self->lsdir($self->curdir)){
        next if $name eq $self->curdir or $name eq $self->updir or $ignore{$name};
        next unless $self->libscan($name);
-       next if -l $name; # We do not support symlinks at all
        if (-d $name){
+           next if -l $name; # We do not support symlinks at all
            $dir{$name} = $name if (-f $self->catfile($name,"Makefile.PL"));
        } elsif ($name =~ /\.xs$/){
            my($c); ($c = $name) =~ s/\.xs$/.c/;
@@ -1365,14 +1365,11 @@ sub init_main {
     # It may also edit @modparts if required.
     if (defined &DynaLoader::mod2fname) {
         $modfname = &DynaLoader::mod2fname(\@modparts);
-    } elsif ($Is_OS2) {                # Need manual correction if run with miniperl:-(
-        $modfname = substr($modfname, 0, 7) . '_';
-    }
-
+    } 
 
     ($self->{PARENT_NAME}, $self->{BASEEXT}) = $self->{NAME} =~ m!([\w:]+::)?(\w+)$! ;
 
-    if (defined &DynaLoader::mod2fname or $Is_OS2) {
+    if (defined &DynaLoader::mod2fname) {
        # As of 5.001m, dl_os2 appends '_'
        $self->{DLBASE} = $modfname;
     } else {
@@ -2609,14 +2606,14 @@ sub static_lib {
     my(@m);
     push(@m, <<'END');
 $(INST_STATIC): $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)/.exists
+       $(RM_RF) $@
 END
     # If this extension has it's own library (eg SDBM_File)
     # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
     push(@m, "\t$self->{CP} \$(MYEXTLIB) \$\@\n") if $self->{MYEXTLIB};
 
     push @m,
-q{     $(RM_RF) $@
-       $(AR) $(AR_STATIC_ARGS) $@ $(OBJECT) && $(RANLIB) $@
+q{     $(AR) $(AR_STATIC_ARGS) $@ $(OBJECT) && $(RANLIB) $@
        }.$self->{NOECHO}.q{echo "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)/extralibs.ld
        $(CHMOD) 755 $@
 };
index 544dece..a3307a1 100644 (file)
@@ -25,8 +25,9 @@ use vars qw(
           );
 # use strict;
 
-eval {require DynaLoader;};    # Get mod2fname, if defined. Will fail
-                                # with miniperl.
+# &DynaLoader::mod2fname should be available to miniperl, thus 
+# should be a pseudo-builtin (cmp. os2.c).
+#eval {require DynaLoader;};
 
 #
 # Set up the inheritance before we pull in the MM_* packages, because they
index 5c0173a..3583194 100644 (file)
@@ -40,6 +40,7 @@ sub Mksymlists {
     }
 
 #    We'll need this if we ever add any OS which uses mod2fname
+#    not as pseudo-builtin.
 #    require DynaLoader;
     if (defined &DynaLoader::mod2fname and not $spec{DLBASE}) {
         $spec{DLBASE} = DynaLoader::mod2fname([ split(/::/,$spec{NAME}) ]);
index 2a89f20..387c40c 100644 (file)
@@ -5,7 +5,10 @@ use Exporter;
 use Benchmark;
 use Config;
 use FileHandle;
-use vars qw($VERSION $verbose $switches $have_devel_corestack);
+use strict;
+
+use vars qw($VERSION $verbose $switches $have_devel_corestack $curtest
+           @ISA @EXPORT @EXPORT_OK);
 $have_devel_corestack = 0;
 
 $VERSION = "1.12";
@@ -14,6 +17,23 @@ $VERSION = "1.12";
 @EXPORT= qw(&runtests);
 @EXPORT_OK= qw($verbose $switches);
 
+format STDOUT_TOP =
+Failed Test  Status Wstat Total Fail  Failed  List of failed
+------------------------------------------------------------------------------
+.
+
+format STDOUT =
+@<<<<<<<<<<<<<< @>> @>>>> @>>>> @>>> ^##.##%  @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+{ $curtest->{name},
+                $curtest->{estat},
+                    $curtest->{wstat},
+                          $curtest->{max},
+                                $curtest->{failed},
+                                     $curtest->{percent},
+                                              $curtest->{canon}
+}
+.
+
 
 $verbose = 0;
 $switches = "-w";
@@ -21,7 +41,7 @@ $switches = "-w";
 sub runtests {
     my(@tests) = @_;
     local($|) = 1;
-    my($test,$te,$ok,$next,$max,$pct);
+    my($test,$te,$ok,$next,$max,$pct,$totok,@failed,%failedtests);
     my $totmax = 0;
     my $files = 0;
     my $bad = 0;
@@ -82,6 +102,11 @@ sub runtests {
                }
            }
            $bad++;
+           $failedtests{$test} = { canon => '??',  max => $max || '??',
+                                   failed => '??', 
+                                   name => $test, percent => undef,
+                                   estat => $estatus, wstat => $wstatus,
+                                 };
        } elsif ($ok == $max && $next == $max+1) {
            if ($max) {
                print "ok\n";
@@ -94,14 +119,30 @@ sub runtests {
                push @failed, $next..$max;
            }
            if (@failed) {
-               print canonfailed($max,@failed);
+               my ($txt, $canon) = canonfailed($max,@failed);
+               print $txt;
+               $failedtests{$test} = { canon => $canon,  max => $max,
+                                       failed => scalar @failed,
+                                       name => $test, percent => 100*(scalar @failed)/$max,
+                                       estat => '', wstat => '',
+                                     };
            } else {
                print "Don't know which tests failed: got $ok ok, expected $max\n";
+               $failedtests{$test} = { canon => '??',  max => $max,
+                                       failed => '??', 
+                                       name => $test, percent => undef,
+                                       estat => '', wstat => '',
+                                     };
            }
            $bad++;
        } elsif ($next == 0) {
            print "FAILED before any test output arrived\n";
            $bad++;
+           $failedtests{$test} = { canon => '??',  max => '??',
+                                   failed => '??',
+                                   name => $test, percent => undef,
+                                   estat => '', wstat => '',
+                                 };
        }
     }
     my $t_total = timediff(new Benchmark, $t_start);
@@ -117,9 +158,12 @@ sub runtests {
        $pct = sprintf("%.2f", $good / $total * 100);
        my $subpct = sprintf " %d/%d subtests failed, %.2f%% okay.",
        $totmax - $totok, $totmax, 100*$totok/$totmax;
-       if ($bad == 1) {
-           die "Failed 1 test script, $pct% okay.$subpct\n";
-       } else {
+       my $script;
+       for $script (sort keys %failedtests) {
+         $curtest = $failedtests{$script};
+         write;
+       }
+       if ($bad > 1) {
            die "Failed $bad/$total test scripts, $pct% okay.$subpct\n";
        }
     }
@@ -154,6 +198,7 @@ sub canonfailed ($@) {
     my @canon = ();
     my $min;
     my $last = $min = shift @failed;
+    my $canon;
     if (@failed) {
        for (@failed, $failed[-1]) { # don't forget the last one
            if ($_ > $last+1 || $_ == $last) {
@@ -168,13 +213,16 @@ sub canonfailed ($@) {
        }
        local $" = ", ";
        push @result, "FAILED tests @canon\n";
+       $canon = "@canon";
     } else {
        push @result, "FAILED test $last\n";
+       $canon = $last;
     }
 
     push @result, "\tFailed $failed/$max tests, ";
     push @result, sprintf("%.2f",100*(1-$failed/$max)), "% okay\n";
-    join "", @result;
+    my $txt = join "", @result;
+    ($txt, $canon);
 }
 
 1;
index 317597c..33b6835 100644 (file)
@@ -115,7 +115,7 @@ sub quotewords {
                last;
            }
            else {
-                while (length($_) && !(/^$delim/ || /^['"\\]/)) {
+                while ($_ && !(/^$delim/ || /^['"\\]/)) {
                   $snippet .=  substr($_, 0, 1);
                    substr($_, 0, 1) = '';
                 }
index 931dd82..93ab261 100755 (executable)
@@ -124,10 +124,12 @@ $sed <$mf >$mf.new -e '1,/^# AUTOMATICALLY/!d'
 $MAKE shlist || ($echo "Searching for .SH files..."; \
        $echo *.SH | $tr ' ' '\012' | $egrep -v '\*' >.shlist)
 
-# Now extract the dependency on makedepend.SH
-# (it should reside in the main Makefile):
+# Now extract the dependencies on makedepend.SH and Makefile.SH
+# (they should reside in the main Makefile):
 mv .shlist .shlist.old
 $egrep -v '^makedepend\.SH' <.shlist.old >.shlist
+mv .shlist .shlist.old
+$egrep -v '^Makefile\.SH' <.shlist.old >.shlist
 rm .shlist.old
 
 if $test -s .deptmp; then
index 87b1ac7..806d037 100644 (file)
--- a/malloc.c
+++ b/malloc.c
 #include "EXTERN.h"
 #include "perl.h"
 
+#ifdef DEBUGGING
+#undef DEBUG_m
+#define DEBUG_m(a)  if (debug & 128)   a
+#endif
+
 /* I don't much care whether these are defined in sys/types.h--LAW */
 
 #define u_char unsigned char
@@ -64,7 +69,7 @@ union overhead {
 #define        ov_rmagic       ovu.ovu_rmagic
 };
 
-#ifdef debug
+#ifdef DEBUGGING
 static void botch _((char *s));
 #endif
 static void morecore _((int bucket));
@@ -160,10 +165,9 @@ extern     char *sbrk();
  * for a given block size.
  */
 static u_int nmalloc[NBUCKETS];
-#include <stdio.h>
 #endif
 
-#ifdef debug
+#ifdef DEBUGGING
 #define        ASSERT(p)   if (!(p)) botch("p"); else
 static void
 botch(s)
@@ -192,7 +196,7 @@ malloc(nbytes)
 
 #ifdef MSDOS
        if (nbytes > 0xffff) {
-               fprintf(stderr, "Allocation too large: %lx\n", (long)nbytes);
+               PerlIO_printf(PerlIO_stderr(), "Allocation too large: %lx\n", (long)nbytes);
                my_exit(1);
        }
 #endif /* MSDOS */
@@ -231,7 +235,7 @@ malloc(nbytes)
        if ((p = (union overhead *)nextf[bucket]) == NULL) {
 #ifdef safemalloc
                if (!nomemok) {
-                   fputs("Out of memory!\n", stderr);
+                   PerlIO_puts(PerlIO_stderr(),"Out of memory!\n");
                    my_exit(1);
                }
 #else
@@ -240,14 +244,14 @@ malloc(nbytes)
        }
 
 #ifdef safemalloc
-    DEBUG_m(fprintf(Perl_debug_log,"0x%lx: (%05d) malloc %ld bytes\n",
+    DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%lx: (%05d) malloc %ld bytes\n",
        (unsigned long)(p+1),an++,(long)size));
 #endif /* safemalloc */
 
        /* remove from linked list */
 #ifdef RCHECK
        if (*((int*)p) & (sizeof(union overhead) - 1))
-           fprintf(stderr,"Corrupt malloc ptr 0x%lx at 0x%lx\n",
+           PerlIO_printf(PerlIO_stderr(), "Corrupt malloc ptr 0x%lx at 0x%lx\n",
                (unsigned long)*((int*)p),(unsigned long)p);
 #endif
        nextf[bucket] = p->ov_next;
@@ -390,7 +394,7 @@ free(mp)
 #endif 
 
 #ifdef safemalloc
-    DEBUG_m(fprintf(Perl_debug_log,"0x%lx: (%05d) free\n",(unsigned long)cp,an++));
+    DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%lx: (%05d) free\n",(unsigned long)cp,an++));
 #endif /* safemalloc */
 
        if (cp == NULL)
@@ -400,7 +404,7 @@ free(mp)
 #ifdef PACK_MALLOC
        bucket = OV_INDEX(op);
 #endif 
-#ifdef debug
+#ifdef DEBUGGING
        ASSERT(OV_MAGIC(op, bucket) == MAGIC); /* make sure it was in use */
 #else
        if (OV_MAGIC(op, bucket) != MAGIC) {
@@ -467,7 +471,7 @@ realloc(mp, nbytes)
 
 #ifdef MSDOS
        if (nbytes > 0xffff) {
-               fprintf(stderr, "Reallocation too large: %lx\n", size);
+               PerlIO_printf(PerlIO_stderr(), "Reallocation too large: %lx\n", size);
                my_exit(1);
        }
 #endif /* MSDOS */
@@ -542,8 +546,8 @@ realloc(mp, nbytes)
 #ifdef safemalloc
 #ifdef DEBUGGING
     if (debug & 128) {
-       fprintf(stderr,"0x%lx: (%05d) rfree\n",(unsigned long)res,an++);
-       fprintf(stderr,"0x%lx: (%05d) realloc %ld bytes\n",
+       PerlIO_printf(PerlIO_stderr(), "0x%lx: (%05d) rfree\n",(unsigned long)res,an++);
+       PerlIO_printf(PerlIO_stderr(), "0x%lx: (%05d) realloc %ld bytes\n",
            (unsigned long)res,an++,(long)size);
     }
 #endif
@@ -616,20 +620,20 @@ dump_mstats(s)
                        topbucket = i;
        }
        if (s)
-               fprintf(stderr, "Memory allocation statistics %s (buckets 8..%d)\n",
+               PerlIO_printf(PerlIO_stderr(), "Memory allocation statistics %s (buckets 8..%d)\n",
                        s, (1 << (topbucket + 3)) );
-       fprintf(stderr, " %7d free: ", totfree);
+       PerlIO_printf(PerlIO_stderr(), " %7d free: ", totfree);
        for (i=0; i <= topbucket; i++) {
-               fprintf(stderr, (i<5)?" %5d":" %3d", nfree[i]);
+               PerlIO_printf(PerlIO_stderr(), (i<5)?" %5d":" %3d", nfree[i]);
        }
-       fprintf(stderr, "\n %7d used: ", totused);
+       PerlIO_printf(PerlIO_stderr(), "\n %7d used: ", totused);
        for (i=0; i <= topbucket; i++) {
-               fprintf(stderr, (i<5)?" %5d":" %3d", nmalloc[i]);
+               PerlIO_printf(PerlIO_stderr(), (i<5)?" %5d":" %3d", nmalloc[i]);
        }
-       fprintf(stderr, "\n");
+       PerlIO_printf(PerlIO_stderr(), "\n");
 #ifdef PACK_MALLOC
        if (sbrk_slack || start_slack) {
-           fprintf(stderr, "Odd ends: %7d bytes from sbrk(), %7d from malloc.\n",
+           PerlIO_printf(PerlIO_stderr(), "Odd ends: %7d bytes from sbrk(), %7d from malloc.\n",
                    sbrk_slack, start_slack);
        }
 #endif
@@ -646,32 +650,31 @@ dump_mstats(s)
 
 #ifdef USE_PERL_SBRK
 
-#ifdef NeXT
-#ifdef HIDEMYMALLOC
-#undef malloc
-#else
-#include "Error: -DUSE_PERL_SBRK on the NeXT requires -DHIDEMYMALLOC"
-#endif
+#   ifdef NeXT
+#      define PERL_SBRK_VIA_MALLOC
+#   endif
+
+#   ifdef PERL_SBRK_VIA_MALLOC
+#      ifdef HIDEMYMALLOC
+#         undef malloc
+#      else
+#         include "Error: -DPERL_SBRK_VIA_MALLOC requires -DHIDEMYMALLOC"
+#      endif
 
 /* it may seem schizophrenic to use perl's malloc and let it call system */
 /* malloc, the reason for that is only the 3.2 version of the OS that had */
 /* frequent core dumps within nxzonefreenolock. This sbrk routine put an */
 /* end to the cores */
 
-#define SYSTEM_ALLOC(a) malloc(a)
-
-#else
-
-/* OS/2 comes to mind ... */
-
-#endif
+#      define SYSTEM_ALLOC(a) malloc(a)
 
+#   endif  /* PERL_SBRK_VIA_MALLOC */
 
 static IV Perl_sbrk_oldchunk;
 static long Perl_sbrk_oldsize;
 
-#define PERLSBRK_32_K (1<<15)
-#define PERLSBRK_64_K (1<<16)
+#   define PERLSBRK_32_K (1<<15)
+#   define PERLSBRK_64_K (1<<16)
 
 char *
 Perl_sbrk(size)
@@ -707,7 +710,7 @@ int size;
     }
 
 #ifdef safemalloc
-    DEBUG_m(fprintf(stderr,"sbrk malloc size %ld (reqsize %ld), left size %ld, give addr 0x%lx\n",
+    DEBUG_m(PerlIO_printf(PerlIO_stderr(), "sbrk malloc size %ld (reqsize %ld), left size %ld, give addr 0x%lx\n",
                    size, reqsize, Perl_sbrk_oldsize, got));
 #endif
 
diff --git a/mg.c b/mg.c
index 4b46ec4..31c542e 100644 (file)
--- a/mg.c
+++ b/mg.c
@@ -99,6 +99,7 @@ SV* sv;
     MGS* mgs;
     MAGIC* mg;
     MAGIC** mgp;
+    int mgp_valid = 0;
 
     ENTER;
     mgs = save_magic(sv);
@@ -109,12 +110,16 @@ SV* sv;
        if (!(mg->mg_flags & MGf_GSKIP) && vtbl && vtbl->svt_get) {
            (*vtbl->svt_get)(sv, mg);
            /* Ignore this magic if it's been deleted */
-           if (*mgp == mg && (mg->mg_flags & MGf_GSKIP))
+           if ((mg == (mgp_valid ? *mgp : SvMAGIC(sv))) && (mg->mg_flags & MGf_GSKIP))
                mgs->mgs_flags = 0;
        }
        /* Advance to next magic (complicated by possible deletion) */
-       if (*mgp == mg)
+       if (mg == (mgp_valid ? *mgp : SvMAGIC(sv))) {
            mgp = &mg->mg_moremagic;
+           mgp_valid = 1;
+       }
+       else
+           mgp = &SvMAGIC(sv); /* Re-establish pointer after sv_upgrade */
     }
 
     LEAVE;
@@ -664,7 +669,7 @@ MAGIC* mg;
        if(psig_ptr[i])
            sv_setsv(sv,psig_ptr[i]);
        else {
-           void (*origsig)(int);
+           void (*origsig) _((int));
            /* get signal state without losing signals */
            sig_trapped=0;
            origsig = rsignal(i,sig_trap);
@@ -765,6 +770,8 @@ MAGIC* mg;
            *svp = 0;
     }
     else {
+       if(hints & HINT_STRICT_REFS)
+               die(no_symref,s,"a subroutine");
        if (!strchr(s,':') && !strchr(s,'\'')) {
            sprintf(tokenbuf, "main::%s",s);
            sv_setpv(sv,tokenbuf);
@@ -1454,6 +1461,10 @@ int sig;
     SV *sv;
     CV *cv;
     AV *oldstack;
+    
+    if(!psig_ptr[sig])
+       die("Signal SIG%s received, but no signal handler set.\n",
+       sig_name[sig]);
 
     cv = sv_2cv(psig_ptr[sig],&st,&gv,TRUE);
     if (!cv || !CvROOT(cv)) {
index 719ca70..e684634 100755 (executable)
--- a/myconfig
+++ b/myconfig
@@ -24,6 +24,7 @@ Summary of my $package ($baserev patchlevel $PATCHLEVEL subversion $SUBVERSION)
     osname=$osname, osvers=$osvers, archname=$archname
     uname='$myuname'
     hint=$hint, useposix=$useposix, d_sigaction=$d_sigaction
+    perlstdio=$d_perlstdio sfio=$d_sfio
   Compiler:
     cc='$cc', optimize='$optimize', gccversion=$gccversion
     cppflags='$cppflags'
diff --git a/nostdio.h b/nostdio.h
new file mode 100644 (file)
index 0000000..3e1e665
--- /dev/null
+++ b/nostdio.h
@@ -0,0 +1,25 @@
+/* This is an 1st attempt to stop other include files pulling 
+   in real <stdio.h>.
+   A more ambitious set of possible symbols can be found in
+   sfio.h (inside an _cplusplus gard).
+*/
+#if !defined(_STDIO_H) && !defined(FILE) && !defined(_STDIO_INCLUDED)
+#define _STDIO_H
+#define _STDIO_INCLUDED
+struct _FILE;
+#define FILE struct _FILE
+#endif
+
+#define _CANNOT "CANNOT"
+
+#undef stdin
+#undef stdout
+#undef stderr
+#undef getc
+#undef putc
+#undef clearerr
+#undef fflush
+#undef feof
+#undef ferror
+#undef fileno
+
diff --git a/op.c b/op.c
index c4f0d41..d008533 100644 (file)
--- a/op.c
+++ b/op.c
@@ -321,7 +321,7 @@ U32 tmptype;
     }
     SvFLAGS(sv) |= tmptype;
     curpad = AvARRAY(comppad);
-    DEBUG_X(fprintf(Perl_debug_log, "Pad alloc %ld for %s\n", (long) retval, op_name[optype]));
+    DEBUG_X(PerlIO_printf(Perl_debug_log, "Pad alloc %ld for %s\n", (long) retval, op_name[optype]));
     return (PADOFFSET)retval;
 }
 
@@ -335,7 +335,7 @@ pad_sv(PADOFFSET po)
 {
     if (!po)
        croak("panic: pad_sv po");
-    DEBUG_X(fprintf(Perl_debug_log, "Pad sv %d\n", po));
+    DEBUG_X(PerlIO_printf(Perl_debug_log, "Pad sv %d\n", po));
     return curpad[po];         /* eventually we'll turn this into a macro */
 }
 
@@ -353,7 +353,7 @@ pad_free(PADOFFSET po)
        croak("panic: pad_free curpad");
     if (!po)
        croak("panic: pad_free po");
-    DEBUG_X(fprintf(Perl_debug_log, "Pad free %d\n", po));
+    DEBUG_X(PerlIO_printf(Perl_debug_log, "Pad free %d\n", po));
     if (curpad[po] && curpad[po] != &sv_undef)
        SvPADTMP_off(curpad[po]);
     if ((I32)po < padix)
@@ -372,7 +372,7 @@ pad_swipe(PADOFFSET po)
        croak("panic: pad_swipe curpad");
     if (!po)
        croak("panic: pad_swipe po");
-    DEBUG_X(fprintf(Perl_debug_log, "Pad swipe %d\n", po));
+    DEBUG_X(PerlIO_printf(Perl_debug_log, "Pad swipe %d\n", po));
     SvPADTMP_off(curpad[po]);
     curpad[po] = NEWSV(1107,0);
     SvPADTMP_on(curpad[po]);
@@ -387,7 +387,7 @@ pad_reset()
 
     if (AvARRAY(comppad) != curpad)
        croak("panic: pad_reset curpad");
-    DEBUG_X(fprintf(Perl_debug_log, "Pad reset\n"));
+    DEBUG_X(PerlIO_printf(Perl_debug_log, "Pad reset\n"));
     if (!tainting) {   /* Can't mix tainted and non-tainted temporaries. */
        for (po = AvMAX(comppad); po > padix_floor; po--) {
            if (curpad[po] && curpad[po] != &sv_undef)
@@ -2812,6 +2812,30 @@ CV* proto;
     return cv;
 }
 
+SV *
+cv_const_sv(cv)
+CV *cv;
+{
+    OP *o;
+    SV *sv = Nullsv;
+    
+    if(cv && SvPOK(cv) && !SvCUR(cv)) {
+       for (o = CvSTART(cv); o; o = o->op_next) {
+           OPCODE type = o->op_type;
+       
+           if (type == OP_NEXTSTATE || type == OP_NULL || type == OP_PUSHMARK)
+               continue;
+           if (type == OP_LEAVESUB || type == OP_RETURN)
+               break;
+           if (type != OP_CONST || sv)
+               return Nullsv;
+
+           sv = ((SVOP*)o)->op_sv;
+       }
+    }
+    return sv;
+}
+
 CV *
 newSUB(floor,op,proto,block)
 I32 floor;
@@ -2832,11 +2856,22 @@ OP *block;
        if (GvCVGEN(gv))
            cv = 0;                     /* just a cached method */
        else if (CvROOT(cv) || CvXSUB(cv) || GvASSUMECV(gv)) {
-           if (dowarn && strNE(name, "BEGIN")) {/* already defined (or promised)? */
+           SV* const_sv = cv_const_sv(cv);
+
+           char *p = proto ? SvPVx(((SVOP*)proto)->op_sv, na) : Nullch;
+
+           if((!proto != !SvPOK(cv)) || (p && strNE(SvPV((SV*)cv,na), p))) {
+               warn("Prototype mismatch: (%s) vs (%s)",
+                       SvPOK(cv) ? SvPV((SV*)cv,na) : "none",
+                       p ? p : "none");
+           }
+
+           if ((const_sv || dowarn) && strNE(name, "BEGIN")) {/* already defined (or promised)? */
                line_t oldline = curcop->cop_line;
 
                curcop->cop_line = copline;
-               warn("Subroutine %s redefined",name);
+               warn(const_sv ? "Constant subroutine %s redefined"
+                             : "Subroutine %s redefined",name);
                curcop->cop_line = oldline;
            }
            SvREFCNT_dec(cv);
@@ -2864,8 +2899,6 @@ OP *block;
 
     if (proto) {
        char *p = SvPVx(((SVOP*)proto)->op_sv, na);
-       if (SvPOK(cv) && strNE(SvPV((SV*)cv,na), p))
-           warn("Prototype mismatch: (%s) vs (%s)", SvPV((SV*)cv, na), p);
        sv_setpv((SV*)cv, p);
        op_free(proto);
     }
index 83227bb..72b4383 100644 (file)
@@ -41,6 +41,7 @@ perl5.def: perl.linkexp
        echo '  "dlopen"'                               >>$@
        echo '  "dlsym"'                                >>$@
        echo '  "dlerror"'                              >>$@
+       echo '  "perl_init_i18nl10n"'                   >>$@
 !NO!SUBS!
 
 if [ ! -z "$myttyname" ] ; then
@@ -119,6 +120,11 @@ miniperl_: $& miniperlmain$(AOUT_OBJ_EXT) $(aout_perllib) ext.libs
 perl_: $& aout_perlmain$(AOUT_OBJ_EXT) $(aout_perllib) $(AOUT_DYNALOADER) $(aout_static_ext) ext.libs
        $(CC) $(LARGE) $(AOUT_CLDFLAGS) $(CCDLFLAGS) -o perl_ aout_perlmain$(AOUT_OBJ_EXT) $(AOUT_DYNALOADER) $(aout_static_ext) $(aout_perllib) `cat ext.libs` $(libs)
 
+perl : perl__
+
+perl__: $& perlmain$(OBJ_EXT) $(perllib) $(DYNALOADER) $(static_ext) ext.libs
+       $(CC) $(LARGE) $(CLDFLAGS) $(CCDLFLAGS) -o perl__ perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(perllib) `cat ext.libs` $(libs) -Zlinker /PM:PM
+
 aout_clean:
        -rm *perl_.* *.o *.a lib/auto/*/*.a ext/*/Makefile.aout
 
@@ -128,13 +134,22 @@ aout_install.perl: perl_ installperl
        ./perl_ installperl
 
 aout_test: perl_
-       - cd t && (rm -f perl_$(EXE_EXT); $(LNS) ../perl_$(EXE_EXT) perl_$(EXE_EXT)) && ./perl_ TEST </dev/tty
+       - cd t && (rm -f perl_$(EXE_EXT); $(LNS) ../perl_$(EXE_EXT) perl$(EXE_EXT)) && ./perl TEST </dev/tty
+
+lib/auto/OS2/*/%.a : ext/OS2/%/Makefile.aout
+       cd ext/OS2/$(basename $(notdir $@)) ; make -f Makefile.aout config || echo "$make config failed, continuing anyway..."
+       cd ext/OS2/$(basename $(notdir $@)) ; make -f Makefile.aout LINKTYPE=static CCCDLFLAGS=
 
 lib/auto/*/%.a : ext/%/Makefile.aout
        cd ext/$(basename $(notdir $@)) ; make -f Makefile.aout config || echo "$make config failed, continuing anyway..."
        cd ext/$(basename $(notdir $@)) ; make -f Makefile.aout LINKTYPE=static CCCDLFLAGS=
 
+.PRECIOUS : ext/%/Makefile.aout ext/OS2/%/Makefile.aout
+
+ext/OS2/%/Makefile.aout : miniperl_
+       cd $(dir $@) ; ../../../miniperl_ -I ../../../lib Makefile.PL MAKEFILE=Makefile.aout INSTALLDIRS=perl 
+
 ext/%/Makefile.aout : miniperl_
-       cd $(dir $@) ; ../../miniperl_ Makefile.PL MAKEFILE=Makefile.aout INSTALLDIRS=perl 
+       cd $(dir $@) ; ../../miniperl_ -I ../../lib Makefile.PL MAKEFILE=Makefile.aout INSTALLDIRS=perl 
 
 !NO!SUBS!
diff --git a/os2/OS2/ExtAttr/Changes b/os2/OS2/ExtAttr/Changes
new file mode 100644 (file)
index 0000000..55fdc5f
--- /dev/null
@@ -0,0 +1,5 @@
+Revision history for Perl extension OS2::ExtAttr.
+
+0.01  Sun Apr 21 11:07:04 1996
+       - original version; created by h2xs 1.16
+
diff --git a/os2/OS2/ExtAttr/ExtAttr.pm b/os2/OS2/ExtAttr/ExtAttr.pm
new file mode 100644 (file)
index 0000000..bebbcc9
--- /dev/null
@@ -0,0 +1,186 @@
+package OS2::ExtAttr;
+
+use strict;
+use vars qw($VERSION @ISA @EXPORT);
+
+require Exporter;
+require DynaLoader;
+
+@ISA = qw(Exporter DynaLoader);
+# Items to export into callers namespace by default. Note: do not export
+# names by default without a very good reason. Use EXPORT_OK instead.
+# Do not simply export all your public functions/methods/constants.
+@EXPORT = qw(
+       
+);
+$VERSION = '0.01';
+
+bootstrap OS2::ExtAttr $VERSION;
+
+# Preloaded methods go here.
+
+# Format of the array: 
+# 0 ead, 1 file name, 2 file handle. 3 length, 4 position, 5 need to write.
+
+sub TIEHASH {
+  my $class = shift;
+  my $ea = _create() || die "Cannot create EA: $!";
+  my $file = shift;
+  my ($name, $handle);
+  if (ref $file eq 'GLOB' or ref \$file eq 'GLOB') {
+    die "File handle is not opened" unless $handle = fileno $file;
+    _read($ea, undef, $handle, 0);
+  } else {
+    $name = $file;
+    _read($ea, $name, 0, 0);
+  }
+  bless [$ea, $name, $handle, 0, 0, 0], $class;
+}
+
+sub DESTROY {
+  my $eas = shift;
+  # 0 means: discard eas which are not in $eas->[0].
+  _write( $eas->[0], $eas->[1], $eas->[2], 0) and die "Cannot write EA: $!"
+    if $eas->[5];
+  _destroy( $eas->[0] );
+}
+
+sub FIRSTKEY {
+  my $eas = shift;
+  $eas->[3] = _count($eas->[0]);
+  $eas->[4] = 1;
+  return undef if $eas->[4] > $eas->[3];
+  return _get_name($eas->[0], $eas->[4]);
+}
+
+sub NEXTKEY {
+  my $eas = shift;
+  $eas->[4]++;
+  return undef if $eas->[4] > $eas->[3];
+  return _get_name($eas->[0], $eas->[4]);
+}
+
+sub FETCH {
+  my $eas = shift;
+  my $index = _find($eas->[0], shift);
+  return undef if $index <= 0;
+  return value($eas->[0], $index);
+}
+
+sub EXISTS {
+  my $eas = shift;
+  return _find($eas->[0], shift) > 0;
+}
+
+sub STORE {
+  my $eas = shift;
+  $eas->[5] = 1;
+  add($eas->[0], shift, shift) > 0 or die "Error setting EA: $!";
+}
+
+sub DELETE {
+  my $eas = shift;
+  my $index = _find($eas->[0], shift);
+  return undef if $index <= 0;
+  my $value = value($eas->[0], $index);
+  _delete($eas->[0], $index) and die "Error deleting EA: $!";
+  $eas->[5] = 1;
+  return $value;
+}
+
+sub CLEAR {
+  my $eas = shift;
+  _clear($eas->[0]);
+  $eas->[5] = 1;
+}
+
+# Here are additional methods:
+
+*new = \&TIEHASH;
+
+sub copy {
+  my $eas = shift;
+  my $file = shift;
+  my ($name, $handle);
+  if (ref $file eq 'GLOB' or ref \$file eq 'GLOB') {
+    die "File handle is not opened" unless $handle = fileno $file;
+    _write($eas->[0], undef, $handle, 0) or die "Cannot write EA: $!";
+  } else {
+    $name = $file;
+    _write($eas->[0], $name, 0, 0) or die "Cannot write EA: $!";
+  }
+}
+
+sub update {
+  my $eas = shift;
+  # 0 means: discard eas which are not in $eas->[0].
+  _write( $eas->[0], $eas->[1], $eas->[2], 0) and die "Cannot write EA: $!";
+}
+
+# Autoload methods go after =cut, and are processed by the autosplit program.
+
+1;
+__END__
+# Below is the stub of documentation for your module. You better edit it!
+
+=head1 NAME
+
+OS2::ExtAttr - Perl access to extended attributes.
+
+=head1 SYNOPSIS
+
+  use OS2::ExtAttr;
+  tie %ea, 'OS2::ExtAttr', 'my.file';
+  print $ea{eaname};
+  $ea{myfield} = 'value';
+  
+  untie %ea;
+
+=head1 DESCRIPTION
+
+The package provides low-level and high-level interface to Extended
+Attributes under OS/2. 
+
+=head2 High-level interface: C<tie>
+
+The only argument of tie() is a file name, or an open file handle.
+
+Note that all the changes of the tied hash happen in core, to
+propagate it to disk the tied hash should be untie()ed or should go
+out of scope. Alternatively, one may use the low-level C<update>
+method on the corresponding object. Example:
+
+  tied(%hash)->update;
+
+Note also that setting/getting EA flag is not supported by the
+high-level interface, one should use the low-level interface
+instead. To use it on a tied hash one needs undocumented way to find
+C<eas> give the tied hash.
+
+=head2 Low-level interface
+
+Two low-level methods are supported by the objects: copy() and
+update(). The copy() takes one argument: the name of a file to copy
+the attributes to, or an opened file handle. update() takes no
+arguments, and is discussed above.
+
+Three convenience functions are provided:
+
+  value($eas, $key)
+  add($eas, $key, $value [, $flag])
+  replace($eas, $key, $value [, $flag])
+
+The default value for C<flag> is 0.
+
+In addition, all the C<_ea_*> and C<_ead_*> functions defined in EMX
+library are supported, with leading C<_ea/_ead> stripped.
+
+=head1 AUTHOR
+
+Ilya Zakharevich, ilya@math.ohio-state.edu
+
+=head1 SEE ALSO
+
+perl(1).
+
+=cut
diff --git a/os2/OS2/ExtAttr/ExtAttr.xs b/os2/OS2/ExtAttr/ExtAttr.xs
new file mode 100644 (file)
index 0000000..566b659
--- /dev/null
@@ -0,0 +1,193 @@
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+#ifdef __cplusplus
+}
+#endif
+
+#include "myea.h"
+
+SV *
+my_eadvalue(_ead ead, int index)
+{
+    SV *sv;
+    int size = _ead_value_size(ead, index);
+    void *p;
+
+    if (size == -1) {
+       die("Error getting size of EA: %s", strerror(errno));
+    }
+    p = _ead_get_value(ead, index);
+    return  newSVpv((char*)p, size);
+}
+
+#define my_eadreplace(ead, index, sv, flag)    \
+       _ead_replace((ead), (index), flag, SvPVX(sv), SvCUR(sv))
+
+#define my_eadadd(ead, name, sv, flag) \
+       _ead_add((ead), (name), flag, SvPVX(sv), SvCUR(sv))
+
+
+MODULE = OS2::ExtAttr          PACKAGE = OS2::ExtAttr  PREFIX = my_ead
+
+SV *
+my_eadvalue(ead, index)
+       _ead    ead
+       int     index
+
+int
+my_eadreplace(ead, index, sv, flag = 0)
+       _ead    ead
+       int     index
+       SV *    sv
+       int     flag
+
+int
+my_eadadd(ead, name, sv, flag = 0)
+       _ead    ead
+       char *  name
+       SV *    sv
+       int     flag
+
+MODULE = OS2::ExtAttr          PACKAGE = OS2::ExtAttr  PREFIX = _ea
+
+
+void
+_ea_free(ptr)
+       struct _ea *    ptr
+
+int
+_ea_get(dst, path, handle, name)
+       struct _ea *    dst
+       char *  path
+       int     handle
+       char *  name
+
+int
+_ea_put(src, path, handle, name)
+       struct _ea *    src
+       char *  path
+       int     handle
+       char *  name
+
+int
+_ea_remove(path, handle, name)
+       char *  path
+       int     handle
+       char *  name
+
+MODULE = OS2::ExtAttr          PACKAGE = OS2::ExtAttr  PREFIX = _ead
+
+int
+_ead_add(ead, name, flags, value, size)
+       _ead    ead
+       char *  name
+       int     flags
+       void *  value
+       int     size
+
+void
+_ead_clear(ead)
+       _ead    ead
+
+int
+_ead_copy(dst_ead, src_ead, src_index)
+       _ead    dst_ead
+       _ead    src_ead
+       int     src_index
+
+int
+_ead_count(ead)
+       _ead    ead
+
+_ead
+_ead_create()
+
+int
+_ead_delete(ead, index)
+       _ead    ead
+       int     index
+
+void
+_ead_destroy(ead)
+       _ead    ead
+
+int
+_ead_fea2list_size(ead)
+       _ead    ead
+
+void *
+_ead_fea2list_to_fealist(src)
+       void *  src
+
+void *
+_ead_fealist_to_fea2list(src)
+       void *  src
+
+int
+_ead_find(ead, name)
+       _ead    ead
+       char *  name
+
+void *
+_ead_get_fea2list(ead)
+       _ead    ead
+
+int
+_ead_get_flags(ead, index)
+       _ead    ead
+       int     index
+
+char *
+_ead_get_name(ead, index)
+       _ead    ead
+       int     index
+
+void *
+_ead_get_value(ead, index)
+       _ead    ead
+       int     index
+
+int
+_ead_name_len(ead, index)
+       _ead    ead
+       int     index
+
+int
+_ead_read(ead, path, handle, flags)
+       _ead    ead
+       char *  path
+       int     handle
+       int     flags
+
+int
+_ead_replace(ead, index, flags, value, size)
+       _ead    ead
+       int     index
+       int     flags
+       void *  value
+       int     size
+
+void
+_ead_sort(ead)
+       _ead    ead
+
+int
+_ead_use_fea2list(ead, src)
+       _ead    ead
+       void *  src
+
+int
+_ead_value_size(ead, index)
+       _ead    ead
+       int     index
+
+int
+_ead_write(ead, path, handle, flags)
+       _ead    ead
+       char *  path
+       int     handle
+       int     flags
diff --git a/os2/OS2/ExtAttr/MANIFEST b/os2/OS2/ExtAttr/MANIFEST
new file mode 100644 (file)
index 0000000..b1a8e80
--- /dev/null
@@ -0,0 +1,8 @@
+Changes
+ExtAttr.pm
+ExtAttr.xs
+MANIFEST
+Makefile.PL
+myea.h
+t/os2_ea.t
+typemap
diff --git a/os2/OS2/ExtAttr/Makefile.PL b/os2/OS2/ExtAttr/Makefile.PL
new file mode 100644 (file)
index 0000000..4e8498f
--- /dev/null
@@ -0,0 +1,10 @@
+use ExtUtils::MakeMaker;
+# See lib/ExtUtils/MakeMaker.pm for details of how to influence
+# the contents of the Makefile that is written.
+WriteMakefile(
+    'NAME'     => 'OS2::ExtAttr',
+    'VERSION_FROM' => 'ExtAttr.pm', # finds $VERSION
+    'LIBS'     => [''],   # e.g., '-lm' 
+    'DEFINE'   => '',     # e.g., '-DHAVE_SOMETHING' 
+    'INC'      => '',     # e.g., '-I/usr/include/other' 
+);
diff --git a/os2/OS2/ExtAttr/myea.h b/os2/OS2/ExtAttr/myea.h
new file mode 100644 (file)
index 0000000..ec4dc81
--- /dev/null
@@ -0,0 +1,2 @@
+#include <sys/ea.h>
+#include <sys/ead.h>
diff --git a/os2/OS2/ExtAttr/t/os2_ea.t b/os2/OS2/ExtAttr/t/os2_ea.t
new file mode 100644 (file)
index 0000000..c102419
--- /dev/null
@@ -0,0 +1,79 @@
+BEGIN {
+    chdir 't' if -d 't/lib';
+    @INC = '../lib' if -d 'lib';
+    require Config; import Config;
+    if (-d 'lib' and $Config{'extensions'} !~ /\bOS2::REXX\b/) {
+       print "1..0\n";
+       exit 0;
+    }
+}
+
+# Before `make install' is performed this script should be runnable with
+# `make test'. After `make install' it should work as `perl test.pl'
+
+######################### We start with some black magic to print on failure.
+
+# Change 1..1 below to 1..last_test_to_print .
+# (It may become useful if the test is moved to ./t subdirectory.)
+
+BEGIN { $| = 1; print "1..21\n"; }
+END {print "not ok 1\n" unless $loaded;}
+use OS2::ExtAttr;
+$loaded = 1;
+print "ok 1\n";
+
+######################### End of black magic.
+
+# Insert your test code below (better if it prints "ok 13"
+# (correspondingly "not ok 13") depending on the success of chunk 13
+# of the test code):
+
+system 'cmd', '/c', 'del t.out';
+system 'cmd', '/c', 'echo OK > t.out';
+
+{
+  my %a;
+  tie %a, 'OS2::ExtAttr', 't.out';
+  print "ok 2\n";
+  
+  keys %a == 0 ? print "ok 3\n" : print "not ok 3\n";
+  $a{'++'} = '---';
+  print "ok 4\n";
+  $a{'AAA'} = 'xyz';
+  print "ok 5\n";
+}
+
+{
+  my %a;
+  tie %a, 'OS2::ExtAttr', 't.out';
+  print "ok 6\n";
+  
+  my $c = keys %a;
+  $c == 2 ? print "ok 7\n" : print "not ok 7\n# c=$c\n";
+  my @b = sort keys %a;
+  "@b" eq '++ AAA' ? print "ok 8\n" : print "not ok 8\n# keys=`@b'\n";
+  $a{'++'} eq '---' ? print "ok 9\n" : print "not ok 9\n";;
+  $a{'AAA'} eq 'xyz' ? print "ok 10\n" : print "not ok 10\n# aaa->`$a{AAA}'\n";
+  $c = delete $a{'++'};
+  $c eq '---' ? print "ok 11\n" : print "not ok 11\n# deleted->`$c'\n";;
+}
+
+print "ok 12\n";
+
+{
+  my %a;
+  tie %a, 'OS2::ExtAttr', 't.out';
+  print "ok 13\n";
+  
+  keys %a == 1 ? print "ok 14\n" : print "not ok 14\n";
+  my @b = sort keys %a;
+  "@b" eq 'AAA' ? print "ok 15\n" : print "not ok 15\n";
+  $a{'AAA'} eq 'xyz' ? print "ok 16\n" : print "not ok 16\n";;
+  ! exists $a{'+'} ? print "ok 17\n" : print "not ok 17\n";;
+  ! defined $a{'+'} ? print "ok 18\n" : print "not ok 18\n# ->`$a{'++'}'\n";;
+  ! exists $a{'++'} ? print "ok 19\n" : print "not ok 19\n";;
+  ! defined $a{'++'} ? print "ok 20\n" : print "not ok 20\n# ->`$a{'++'}'\n";;
+}
+
+print "ok 21\n";
+
diff --git a/os2/OS2/ExtAttr/typemap b/os2/OS2/ExtAttr/typemap
new file mode 100644 (file)
index 0000000..a5ff8d6
--- /dev/null
@@ -0,0 +1,2 @@
+struct _ea *           T_PTR
+_ead                   T_PTR
diff --git a/os2/OS2/PrfDB/Changes b/os2/OS2/PrfDB/Changes
new file mode 100644 (file)
index 0000000..3e8bf3f
--- /dev/null
@@ -0,0 +1,5 @@
+Revision history for Perl extension OS2::PrfDB.
+
+0.01  Tue Mar 26 19:35:27 1996
+       - original version; created by h2xs 1.16
+0.02:  Field do-not-close added to OS2::Prf::Hini.
diff --git a/os2/OS2/PrfDB/MANIFEST b/os2/OS2/PrfDB/MANIFEST
new file mode 100644 (file)
index 0000000..fb96b03
--- /dev/null
@@ -0,0 +1,7 @@
+Changes
+MANIFEST
+Makefile.PL
+PrfDB.pm
+PrfDB.xs
+t/os2_prfdb.t
+typemap
diff --git a/os2/OS2/PrfDB/Makefile.PL b/os2/OS2/PrfDB/Makefile.PL
new file mode 100644 (file)
index 0000000..c591c04
--- /dev/null
@@ -0,0 +1,10 @@
+use ExtUtils::MakeMaker;
+# See lib/ExtUtils/MakeMaker.pm for details of how to influence
+# the contents of the Makefile that is written.
+WriteMakefile(
+    'NAME'     => 'OS2::PrfDB',
+    'VERSION_FROM' => 'PrfDB.pm', # finds $VERSION
+    'LIBS'     => [''],   # e.g., '-lm' 
+    'DEFINE'   => '',     # e.g., '-DHAVE_SOMETHING' 
+    'INC'      => '',     # e.g., '-I/usr/include/other' 
+);
diff --git a/os2/OS2/PrfDB/PrfDB.pm b/os2/OS2/PrfDB/PrfDB.pm
new file mode 100644 (file)
index 0000000..d404c8b
--- /dev/null
@@ -0,0 +1,314 @@
+package OS2::PrfDB;
+
+use strict;
+use vars qw($VERSION @ISA @EXPORT);
+
+require Exporter;
+require DynaLoader;
+
+@ISA = qw(Exporter DynaLoader);
+# Items to export into callers namespace by default. Note: do not export
+# names by default without a very good reason. Use EXPORT_OK instead.
+# Do not simply export all your public functions/methods/constants.
+@EXPORT = qw(
+            AnyIni UserIni SystemIni
+           );
+$VERSION = '0.02';
+
+bootstrap OS2::PrfDB $VERSION;
+
+# Preloaded methods go here.
+
+sub AnyIni {
+  new_from_int OS2::PrfDB::Hini OS2::Prf::System(0), 
+  'Anyone of two "systemish" databases', 1;
+}
+
+sub UserIni {
+  new_from_int OS2::PrfDB::Hini OS2::Prf::System(1), 'User settings database', 1;
+}
+
+sub SystemIni {
+  new_from_int OS2::PrfDB::Hini OS2::Prf::System(2),'System settings database',1;
+}
+
+use vars qw{$debug @ISA};
+use Tie::Hash;
+@ISA = qw{Tie::Hash};
+
+# Internal structure 0 => HINI, 1 => array of entries, 2 => iterator.
+
+sub TIEHASH {
+  die "Usage: tie %arr, OS2::PrfDB, filename\n" unless @_ == 2;
+  my ($obj, $file) = @_;
+  my $hini = ref $file eq 'OS2::PrfDB::Hini' ? $file 
+                                            : new OS2::PrfDB::Hini $file;
+  die "Error opening profile database `$file': $!" unless $hini;
+  # print "tiehash `@_', hini $hini\n" if $debug;
+  bless [$hini, undef, undef];
+}
+
+sub STORE {
+  my ($self, $key, $val) = @_;
+  die unless @_ == 3;
+  die unless ref $val eq 'HASH';
+  my %sub;
+  tie %sub, 'OS2::PrfDB::Sub', $self->[0], $key;
+  %sub = %$val;
+}
+
+sub FETCH {
+  my ($self, $key) = @_;
+  die unless @_ == 2;
+  my %sub;
+  tie %sub, 'OS2::PrfDB::Sub', $self->[0], $key;
+  \%sub;
+}
+
+sub DELETE {
+  my ($self, $key) = @_;
+  die unless @_ == 2;
+  my %sub;
+  tie %sub, 'OS2::PrfDB::Sub', $self->[0], $key;
+  %sub = ();
+}
+
+# CLEAR ???? - deletion of the whole
+
+sub EXISTS {
+  my ($self, $key) = @_;
+  die unless @_ == 2;
+  return OS2::Prf::GetLength($self->[0]->[0], $key, undef) >= 0;
+}
+
+sub FIRSTKEY {
+  my $self = shift;
+  my $keys = OS2::Prf::Get($self->[0]->[0], undef, undef);
+  return undef unless defined $keys;
+  chop($keys);
+  $self->[1] = [split /\0/, $keys];
+  # print "firstkey1 $self, `$self->[3]->[0], $self->[3]->[1]'\n" if $debug;
+  $self->[2] = 0;
+  return $self->[1]->[0];
+         # OS2::Prf::Get($self->[0]->[0], $self->[2], $self->[3]->[0]));
+}
+
+sub NEXTKEY {
+  # print "nextkey `@_'\n" if $debug;
+  my $self = shift;
+  return undef unless $self->[2]++ < $#{$self->[1]};
+  my $key = $self->[1]->[$self->[2]];
+  return $key; #, OS2::Prf::Get($self->[0]->[0], $self->[2], $key));
+}
+
+package OS2::PrfDB::Hini;
+
+sub new {
+  die "Usage: new OS2::PrfDB::Hini filename\n" unless @_ == 2;
+  shift;
+  my $file = shift;
+  my $hini = OS2::Prf::Open($file);
+  die "Error opening profile database `$file': $!" unless $hini;
+  bless [$hini, $file];
+}
+
+# Takes HINI and file name:
+
+sub new_from_int { shift; bless [@_] }
+
+# Internal structure 0 => HINI, 1 => filename, 2 => do-not-close.
+
+sub DESTROY {
+  my $self = shift; 
+  my $hini = $self->[0];
+  unless ($self->[2]) {
+    OS2::Prf::Close($hini) or die "Error closing profile `$self->[1]': $!";
+  }
+}
+
+package OS2::PrfDB::Sub;
+use vars qw{$debug @ISA};
+use Tie::Hash;
+@ISA = qw{Tie::Hash};
+
+# Internal structure 0 => HINI, 1 => array of entries, 2 => iterator,
+# 3 => appname.
+
+sub TIEHASH {
+  die "Usage: tie %arr, OS2::PrfDB::Sub, filename, appname\n" unless @_ == 3;
+  my ($obj, $file, $app) = @_;
+  my $hini = ref $file eq 'OS2::PrfDB::Hini' ? $file 
+                                            : new OS2::PrfDB::Hini $file;
+  die "Error opening profile database `$file': $!" unless $hini;
+  # print "tiehash `@_', hini $hini\n" if $debug;
+  bless [$hini, undef, undef, $app];
+}
+
+sub STORE {
+  my ($self, $key, $val) = @_;
+  die unless @_ == 3;
+  OS2::Prf::Set($self->[0]->[0], $self->[3], $key, $val);
+}
+
+sub FETCH {
+  my ($self, $key) = @_;
+  die unless @_ == 2;
+  OS2::Prf::Get($self->[0]->[0], $self->[3], $key);
+}
+
+sub DELETE {
+  my ($self, $key) = @_;
+  die unless @_ == 2;
+  OS2::Prf::Set($self->[0]->[0], $self->[3], $key, undef);
+}
+
+# CLEAR ???? - deletion of the whole
+
+sub EXISTS {
+  my ($self, $key) = @_;
+  die unless @_ == 2;
+  return OS2::Prf::GetLength($self->[0]->[0], $self->[3], $key) >= 0;
+}
+
+sub FIRSTKEY {
+  my $self = shift;
+  my $keys = OS2::Prf::Get($self->[0]->[0], $self->[3], undef);
+  return undef unless defined $keys;
+  chop($keys);
+  $self->[1] = [split /\0/, $keys];
+  # print "firstkey1 $self, `$self->[3]->[0], $self->[3]->[1]'\n" if $debug;
+  $self->[2] = 0;
+  return $self->[1]->[0];
+         # OS2::Prf::Get($self->[0]->[0], $self->[2], $self->[3]->[0]));
+}
+
+sub NEXTKEY {
+  # print "nextkey `@_'\n" if $debug;
+  my $self = shift;
+  return undef unless $self->[2]++ < $#{$self->[1]};
+  my $key = $self->[1]->[$self->[2]];
+  return $key; #, OS2::Prf::Get($self->[0]->[0], $self->[2], $key));
+}
+
+# Autoload methods go after =cut, and are processed by the autosplit program.
+
+1;
+__END__
+# Below is the stub of documentation for your module. You better edit it!
+
+=head1 NAME
+
+OS2::PrfDB - Perl extension for access to OS/2 setting database.
+
+=head1 SYNOPSIS
+
+  use OS2::PrfDB;
+  tie %settings, OS2::PrfDB, 'my.ini';
+  tie %subsettings, OS2::PrfDB::Sub, 'my.ini', 'mykey';
+
+  print "$settings{firstkey}{subkey}\n";
+  print "$subsettings{subkey}\n";
+
+  tie %system, OS2::PrfDB, SystemIni;
+  $system{myapp}{mykey} = "myvalue";
+
+
+=head1 DESCRIPTION
+
+The extention provides both high-level and low-level access to .ini
+files. 
+
+=head2 High level access
+
+High-level access is the tie-hash access via two packages:
+C<OS2::PrfDB> and C<OS2::PrfDB::Sub>. First one supports one argument,
+the name of the file to open, the second one the name of the file to
+open and so called I<Application name>, or the primary key of the
+database.
+
+  tie %settings, OS2::PrfDB, 'my.ini';
+  tie %subsettings, OS2::PrfDB::Sub, 'my.ini', 'mykey';
+
+One may substitute a handle for already opened ini-file instead of the
+file name (obtained via low-level access functions). In particular, 3
+functions SystemIni(), UserIni(), and AnyIni() provide handles to the
+"systemish" databases. AniIni will read from both, and write into User
+database.
+
+=head2 Low-level access
+
+Low-level access functions reside in the package C<OS2::Prf>. They are
+
+=over 14
+
+=item C<Open(file)>
+
+Opens the database, returns an I<integer handle>.
+
+=item C<Close(hndl)>
+
+Closes the database given an I<integer handle>.
+
+=item C<Get(hndl, appname, key)>
+
+Retrieves data from the database given 2-part-key C<appname> C<key>.
+If C<key> is C<undef>, return the "\0" delimited list of C<key>s,
+terminated by \0. If C<appname> is C<undef>, returns the list of
+possible C<appname>s in the same form.
+
+=item C<GetLength(hndl, appname, key)>
+
+Same as above, but returns the length of the value.
+
+=item C<Set(hndl, appname, key, value [ , length ])>
+
+Sets the value. If the C<value> is not defined, removes the C<key>. If
+the C<key> is not defined, removes the C<appname>.
+
+=item C<System(val)>
+
+Return an I<integer handle> associated with the system database. If
+C<val> is 1, it is I<User> database, if 2, I<System> database, if
+0, handle for "both" of them: the handle works for read from any one,
+and for write into I<User> one.
+
+=item C<Profiles()>
+
+returns a reference to a list of two strings, giving names of the
+I<User> and I<System> databases.
+
+=item C<SetUser(file)>
+
+B<(Not tested.)> Sets the profile name of the I<User> database. The
+application should have a message queue to use this function!
+
+=back
+
+=head2 Integer handles
+
+To convert a name or an integer handle into an object acceptable as
+argument to tie() interface, one may use the following functions from
+the package C<OS2::Prf::Hini>:
+
+=over 14
+
+=item C<new(package, file)>
+
+=item C<new_from_int(package, int_hndl [ , filename ])>
+
+=back
+
+=head2 Exports
+
+SystemIni(), UserIni(), and AnyIni().
+
+=head1 AUTHOR
+
+Ilya Zakharevich, ilya@math.ohio-state.edu
+
+=head1 SEE ALSO
+
+perl(1).
+
+=cut
+
diff --git a/os2/OS2/PrfDB/PrfDB.xs b/os2/OS2/PrfDB/PrfDB.xs
new file mode 100644 (file)
index 0000000..a5b2c89
--- /dev/null
@@ -0,0 +1,131 @@
+#define INCL_WINSHELLDATA /* Or use INCL_WIN, INCL_PM, */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+#include <os2.h>
+#ifdef __cplusplus
+}
+#endif
+
+#define Prf_Open(pszFileName) SaveWinError(PrfOpenProfile(Perl_hab, (pszFileName)))
+#define Prf_Close(hini) (!CheckWinError(PrfCloseProfile(hini)))
+
+SV *
+Prf_Get(HINI hini, PSZ app, PSZ key) {
+    ULONG len;
+    BOOL rc;
+    SV *sv;
+
+    if (CheckWinError(PrfQueryProfileSize(hini, app, key, &len))) return &sv_undef;
+    sv = newSVpv("", 0);
+    SvGROW(sv, len);
+    if (CheckWinError(PrfQueryProfileData(hini, app, key, SvPVX(sv), &len))
+       || (len == 0 && (app == NULL || key == NULL))) { /* Somewhy needed. */
+       SvREFCNT_dec(sv);
+       return &sv_undef;
+    }
+    SvCUR_set(sv, len);
+    *SvEND(sv) = 0;
+    return sv;
+}
+
+U32
+Prf_GetLength(HINI hini, PSZ app, PSZ key) {
+    U32 len;
+
+    if (CheckWinError(PrfQueryProfileSize(hini, app, key, &len))) return -1;
+    return len;
+}
+
+#define Prf_Set(hini, app, key, s, l)                  \
+        (!(CheckWinError(PrfWriteProfileData(hini, app, key, s, l))))
+
+#define Prf_System(key)                                        \
+       ( (key) ? ( (key) == 1  ? HINI_USERPROFILE      \
+                               : ( (key) == 2 ? HINI_SYSTEMPROFILE \
+                                               : (die("Wrong profile id %i", key), 0) )) \
+         : HINI_PROFILE)
+
+SV*
+Prf_Profiles()
+{
+    AV *av = newAV();
+    SV *rv;
+    char user[257];
+    char system[257];
+    PRFPROFILE info = { 257, user, 257, system};
+    
+    if (CheckWinError(PrfQueryProfile(Perl_hab, &info))) return &sv_undef;
+    if (info.cchUserName > 257 || info.cchSysName > 257)
+       die("Panic: Profile names too long");
+    av_push(av, newSVpv(user, info.cchUserName - 1));
+    av_push(av, newSVpv(system, info.cchSysName - 1));
+    rv = newRV((SV*)av);
+    SvREFCNT_dec(av);
+    return rv;
+}
+
+BOOL
+Prf_SetUser(SV *sv)
+{
+    char user[257];
+    char system[257];
+    PRFPROFILE info = { 257, user, 257, system};
+    
+    if (!SvPOK(sv)) die("User profile name not defined");
+    if (SvCUR(sv) > 256) die("User profile name too long");
+    if (CheckWinError(PrfQueryProfile(Perl_hab, &info))) return 0;
+    if (info.cchSysName > 257)
+       die("Panic: System profile name too long");
+    info.cchUserName = SvCUR(sv) + 1;
+    info.pszUserName = SvPVX(sv);
+    return !CheckWinError(PrfReset(Perl_hab, &info));
+}
+
+MODULE = OS2::PrfDB            PACKAGE = OS2::Prf PREFIX = Prf_
+
+HINI
+Prf_Open(pszFileName)
+ PSZ     pszFileName;
+
+BOOL
+Prf_Close(hini)
+ HINI     hini;
+
+SV *
+Prf_Get(hini, app, key)
+ HINI hini;
+ PSZ app;
+ PSZ key;
+
+int
+Prf_Set(hini, app, key, s, l = (SvPOK(ST(3)) ? SvCUR(ST(3)): -1))
+ HINI hini;
+ PSZ app;
+ PSZ key;
+ PSZ s;
+ ULONG l;
+
+U32
+Prf_GetLength(hini, app, key)
+ HINI hini;
+ PSZ app;
+ PSZ key;
+
+HINI
+Prf_System(key)
+ int key;
+
+SV*
+Prf_Profiles()
+
+BOOL
+Prf_SetUser(sv)
+ SV *sv
+
+BOOT:
+       Acquire_hab();
diff --git a/os2/OS2/PrfDB/t/os2_prfdb.t b/os2/OS2/PrfDB/t/os2_prfdb.t
new file mode 100644 (file)
index 0000000..4c0883d
--- /dev/null
@@ -0,0 +1,185 @@
+BEGIN {
+    chdir 't' if -d 't/lib';
+    @INC = '../lib' if -d 'lib';
+    require Config; import Config;
+    if (-d 'lib' and $Config{'extensions'} !~ /\bOS2::PrfDB\b/) {
+       print "1..0\n";
+       exit 0;
+    }
+}
+
+# Before `make install' is performed this script should be runnable with
+# `make test'. After `make install' it should work as `perl test.pl'
+
+######################### We start with some black magic to print on failure.
+
+# Change 1..1 below to 1..last_test_to_print .
+# (It may become useful if the test is moved to ./t subdirectory.)
+
+BEGIN { $| = 1; print "1..48\n"; }
+END {print "not ok 1\n" unless $loaded;}
+use OS2::PrfDB;
+$loaded = 1;
+use strict;
+
+print "ok 1\n";
+
+######################### End of black magic.
+
+# Insert your test code below (better if it prints "ok 13"
+# (correspondingly "not ok 13") depending on the success of chunk 13
+# of the test code):
+
+my $inifile = "my.ini";
+
+unlink $inifile if -w $inifile;
+
+my $ini = OS2::Prf::Open($inifile);
+print( ($ini ? "": "not "), "ok 2\n# HINI=`$ini'\n");
+
+print( (OS2::Prf::GetLength($ini,'aaa', 'bbb') != -1) ? 
+    "not ok 3\n# err: `$^E'\n" : "ok 3\n");
+
+
+print( OS2::Prf::Set($ini,'aaa', 'bbb','xyz') ? "ok 4\n" :
+    "not ok 4\n# err: `$^E'\n");
+
+my $len = OS2::Prf::GetLength($ini,'aaa', 'bbb');
+print( $len == 3 ? "ok 5\n" : "not ok 5# len: `$len' err: `$^E'\n");
+
+my $val = OS2::Prf::Get($ini,'aaa', 'bbb');
+print( $val eq 'xyz' ? "ok 6\n" : "not ok 6# val: `$val' err: `$^E'\n");
+
+$val = OS2::Prf::Get($ini,'aaa', undef);
+print( $val eq "bbb\0" ? "ok 7\n" : "not ok 7# val: `$val' err: `$^E'\n");
+
+$val = OS2::Prf::Get($ini, undef, undef);
+print( $val eq "aaa\0" ? "ok 8\n" : "not ok 8# val: `$val' err: `$^E'\n");
+
+my $res = OS2::Prf::Set($ini,'aaa', 'bbb',undef);
+print( $res ? "ok 9\n" : "not ok 9# err: `$^E'\n");
+