perl 4.0.00: (no release announcement available) perl-4.0.00
authorLarry Wall <lwall@netlabs.com>
Thu, 21 Mar 1991 00:00:00 +0000 (00:00 +0000)
committerLarry Wall <lwall@netlabs.com>
Thu, 21 Mar 1991 00:00:00 +0000 (00:00 +0000)
So far, 4.0 is still a beta test version.  For the last production
version, look in pub/perl.3.0/kits@44.

229 files changed:
Changes [deleted file]
Configure
EXTERN.h
INTERN.h
MANIFEST
Makefile.SH
PACKINGLIST
README
README.xenix [new file with mode: 0644]
Wishlist
arg.h
array.c
array.h
cmd.c
cmd.h
config.H
config_h.SH [moved from config.h.SH with 65% similarity]
cons.c
consarg.c
doarg.c
doio.c
dolist.c
dump.c
eg/ADB
eg/changes
eg/dus
eg/findcp
eg/findtar
eg/g/gcp
eg/g/gcp.man
eg/g/ged
eg/g/gsh
eg/g/gsh.man
eg/muck.man
eg/myrup
eg/nih
eg/relink
eg/rename
eg/rmfrom
eg/scan/scan_df
eg/scan/scan_last
eg/scan/scan_messages
eg/scan/scan_passwd
eg/scan/scan_ps
eg/scan/scan_sudo
eg/scan/scan_suid
eg/scan/scanner
eg/shmkill
eg/van/empty
eg/van/unvanish
eg/van/vanexp
eg/van/vanish
emacs/perl-mode.el [new file with mode: 0644]
emacs/perldb.el [new file with mode: 0644]
emacs/perldb.pl [new file with mode: 0644]
emacs/tedstuff [new file with mode: 0644]
eval.c
evalargs.xc [deleted file]
form.c
form.h
h2ph.SH
handy.h
hash.c
hash.h
installperl
lib/bigfloat.pl
lib/bigrat.pl
lib/ctime.pl
lib/getopt.pl
lib/importenv.pl
lib/look.pl
lib/nsyslog.pl [deleted file]
lib/perldb.pl
lib/pwd.pl
lib/stat.pl
lib/syslog.pl
lib/termcap.pl
lib/timelocal.pl [new file with mode: 0644]
lib/validate.pl
makedepend.SH
makedir.SH
makelib.SH [deleted file]
malloc.c
msdos/README.msdos
msdos/chdir.c [new file with mode: 0644]
msdos/config.h
msdos/dir.h
msdos/directory.c
msdos/msdos.c
msdos/popen.c
msdos/usage.c [new file with mode: 0644]
os2/README.OS2
os2/a2p.cs
os2/alarm.c [new file with mode: 0644]
os2/alarm.h [new file with mode: 0644]
os2/config.h
os2/director.c
os2/eg/alarm.pl [new file with mode: 0644]
os2/eg/os2.pl
os2/glob.c [new file with mode: 0644]
os2/os2.c
os2/perl.bad
os2/perl.cs
os2/perl.def
os2/perlglob.bad [new file with mode: 0644]
os2/perlglob.cs
os2/s2p.cmd [new file with mode: 0644]
os2/selfrun.bat [new file with mode: 0644]
os2/suffix.c
patchlevel.h
perl.c [moved from perly.c with 88% similarity]
perl.h
perl.man [new file with mode: 0644]
perl.man.1 [deleted file]
perl.man.2 [deleted file]
perl.man.3 [deleted file]
perl.man.4 [deleted file]
perly.fixer [new file with mode: 0644]
perly.y [moved from perl.y with 89% similarity]
regcomp.c
regcomp.h
regexec.c
regexp.h
spat.h
stab.c
stab.h
str.c
str.h
t/TEST
t/base/cond.t [moved from t/base.cond with 84% similarity]
t/base/if.t [moved from t/base.if with 78% similarity]
t/base/lex.t [moved from t/base.lex with 94% similarity]
t/base/pat.t [moved from t/base.pat with 77% similarity]
t/base/term.t [moved from t/base.term with 92% similarity]
t/cmd/elsif.t [moved from t/cmd.elsif with 88% similarity]
t/cmd/for.t [moved from t/cmd.for with 93% similarity]
t/cmd/mod.t [moved from t/cmd.mod with 91% similarity]
t/cmd/subval.t [moved from t/cmd.subval with 98% similarity]
t/cmd/switch.t [moved from t/cmd.switch with 96% similarity]
t/cmd/while.t [moved from t/cmd.while with 97% similarity]
t/comp/cmdopt.t [moved from t/comp.cmdopt with 97% similarity]
t/comp/cpp.t [moved from t/comp.cpp with 90% similarity]
t/comp/decl.t [moved from t/comp.decl with 87% similarity]
t/comp/multiline.t [moved from t/comp.multiline with 91% similarity]
t/comp/package.t [moved from t/comp.package with 100% similarity]
t/comp/script.t [moved from t/comp.script with 87% similarity]
t/comp/term.t [moved from t/comp.term with 95% similarity]
t/io/argv.t [moved from t/io.argv with 93% similarity]
t/io/dup.t [moved from t/io.dup with 89% similarity]
t/io/fs.t [moved from t/io.fs with 98% similarity]
t/io/inplace.t [moved from t/io.inplace with 81% similarity]
t/io/pipe.t [moved from t/io.pipe with 93% similarity]
t/io/print.t [moved from t/io.print with 86% similarity]
t/io/tell.t [moved from t/io.tell with 94% similarity]
t/lib/big.t [moved from t/lib.big with 100% similarity]
t/op.subst [deleted file]
t/op/append.t [moved from t/op.append with 87% similarity]
t/op/array.t [moved from t/op.array with 98% similarity]
t/op/auto.t [moved from t/op.auto with 97% similarity]
t/op/chop.t [moved from t/op.chop with 89% similarity]
t/op/cond.t [moved from t/op.cond with 78% similarity]
t/op/dbm.t [moved from t/op.dbm with 87% similarity]
t/op/delete.t [moved from t/op.delete with 91% similarity]
t/op/do.t [moved from t/op.do with 94% similarity]
t/op/each.t [moved from t/op.each with 94% similarity]
t/op/eval.t [moved from t/op.eval with 94% similarity]
t/op/exec.t [moved from t/op.exec with 90% similarity]
t/op/exp.t [moved from t/op.exp with 91% similarity]
t/op/flip.t [moved from t/op.flip with 89% similarity]
t/op/fork.t [moved from t/op.fork with 78% similarity]
t/op/glob.t [moved from t/op.glob with 68% similarity]
t/op/goto.t [moved from t/op.goto with 90% similarity]
t/op/groups.t [new file with mode: 0644]
t/op/index.t [moved from t/op.index with 96% similarity]
t/op/int.t [moved from t/op.int with 86% similarity]
t/op/join.t [moved from t/op.join with 83% similarity]
t/op/list.t [moved from t/op.list with 97% similarity]
t/op/local.t [moved from t/op.local with 92% similarity]
t/op/magic.t [moved from t/op.magic with 93% similarity]
t/op/mkdir.t [moved from t/op.mkdir with 86% similarity]
t/op/oct.t [moved from t/op.oct with 81% similarity]
t/op/ord.t [moved from t/op.ord with 79% similarity]
t/op/pack.t [moved from t/op.pack with 89% similarity]
t/op/pat.t [moved from t/op.pat with 98% similarity]
t/op/push.t [moved from t/op.push with 94% similarity]
t/op/range.t [moved from t/op.range with 92% similarity]
t/op/re_tests [moved from t/re_tests with 95% similarity]
t/op/read.t [moved from t/op.read with 69% similarity]
t/op/regexp.t [moved from t/op.regexp with 72% similarity]
t/op/repeat.t [moved from t/op.repeat with 55% similarity]
t/op/s.t [moved from t/op.s with 98% similarity]
t/op/sleep.t [moved from t/op.sleep with 64% similarity]
t/op/sort.t [moved from t/op.sort with 93% similarity]
t/op/split.t [moved from t/op.split with 96% similarity]
t/op/sprintf.t [moved from t/op.sprintf with 74% similarity]
t/op/stat.t [moved from t/op.stat with 92% similarity]
t/op/study.t [moved from t/op.study with 96% similarity]
t/op/substr.t [moved from t/op.substr with 96% similarity]
t/op/time.t [moved from t/op.time with 94% similarity]
t/op/undef.t [moved from t/op.undef with 92% similarity]
t/op/unshift.t [moved from t/op.unshift with 80% similarity]
t/op/vec.t [moved from t/op.vec with 93% similarity]
t/op/write.t [moved from t/op.write with 97% similarity]
toke.c
usersub.c
usub/README [new file with mode: 0644]
usub/curses.mus
usub/pager
usub/usersub.c
util.c
util.h
x2p/EXTERN.h
x2p/INTERN.h
x2p/Makefile.SH
x2p/a2p.h
x2p/a2p.man
x2p/a2p.y
x2p/a2py.c
x2p/find2perl.SH [new file with mode: 0644]
x2p/handy.h
x2p/hash.c
x2p/hash.h
x2p/s2p.SH
x2p/s2p.man
x2p/str.c
x2p/str.h
x2p/util.c
x2p/util.h
x2p/walk.c

diff --git a/Changes b/Changes
deleted file mode 100644 (file)
index fdd452d..0000000
--- a/Changes
+++ /dev/null
@@ -1,259 +0,0 @@
-Changes to perl
----------------
-
-Apart from little bug fixes, here are the new features:
-
-Perl can now handle binary data correctly and has functions to pack and
-unpack binary structures into arrays or lists.  You can now do arbitrary
-ioctl functions.
-
-You can do i/o with sockets and select.
-
-You can now write packages with their own namespace.
-
-You can now pass things to subroutines by reference.
-
-The debugger now has hooks in the perl parser so it doesn't get confused.
-The debugger won't interfere with stdin and stdout.  New debugger commands:
-       n               Single step around subroutine call.
-       l min+incr      List incr+1 lines starting at min.
-       l               List incr+1 more lines.
-       l subname       List subroutine.
-       b subname       Set breakpoint at first line of subroutine.
-       S               List subroutine names.
-       D               Delete all breakpoints.
-       A               List line actions.
-       < command       Define command before prompt.
-       > command       Define command after prompt.
-       ! number        Redo command (default previous command).
-       ! -number       Redo numberth to last command.
-       h -number       Display last number commands (default all).
-       p expr          Same as \"print DBout expr\".
-
-The rules are more consistent about where parens are needed and
-where they are not.  In particular, unary operators and list operators now
-behave like functions if they're called like functions.
-
-There are some new quoting mechanisms:
-       $foo = q/"'"'"'"'"'"'"/;
-       $foo = qq/"'"''$bar"''/;
-       $foo = q(hi there);
-       $foo = <<'EOF' x 10;
-       Why, it's the old here-is mechanism!
-       EOF
-
-You can now work with array slices (note the initial @):
-       @foo[1,2,3];
-       @foo{'Sun','Mon','Tue','Wed','Thu','Fri','Sat'} = (1,2,3,4,5,6,7);
-       @foo{split} = (1,1,1,1,1,1,1);
-
-There's now a range operator that works in array contexts:
-       for (1..15) { ...
-       @foo[3..5] = ('time','for','all');
-       @foo{'Sun','Mon','Tue','Wed','Thu','Fri','Sat'} = 1..7;
-
-You can now reference associative arrays as a whole:
-       %abc = %def;
-       %foo = ('Sun',1,'Mon',2,'Tue',3,'Wed',4,'Thu',5,'Fri',6,'Sat',7);
-
-Associative arrays can now be bound to a dbm or ndbm file.  Perl automatically
-caches references to the dbm file for you.
-
-An array or associative array can now be assigned to as part of a list, if
-it's the last thing in the list:
-       ($a,$b,@rest) = split;
-
-An array or associative array may now appear in a local() list.
-       local(%assoc);
-       local(@foo) = @_;
-
-Array values may now be interpolated into strings:
-       `echo @ARGV`;
-       print "first three = @list[0..2]\n";
-       print "@ENV{keys(ENV)}";
-       ($" is used as the delimiter between array elements)
-
-Array sizes may be interpolated into strings:
-       print "The last element is $#foo.\n";
-
-Array values may now be returned from subroutines, evals, and do blocks.
-
-Lists of values in formats may now be arbitrary expressions, separated
-by commas.
-
-Subroutine names are now distinguished by prefixing with &.  You can call
-subroutines without using do, and without passing any argument list at all:
-       $foo = &min($a,$b,$c);
-       $num = &myrand;
-
-You can use the new -u switch to cause perl to dump core so that you can
-run undump and produce a binary executable image.  Alternately you can
-use the "dump" operator after initializing any variables and such.
-
-Perl now optimizes splits that are assigned directly to an array, or
-to a list with fewer elements than the split would produce, or that
-split on a constant string.
-
-Perl now optimizes on end matches such as /foo$/;
-
-Perl now recognizes {n,m} in patterns to match preceding item at least n times
-and no more than m times.  Also recognizes {n,} and {n} to match n or more
-times, or exactly n times.  If { occurs in other than this context it is
-still treated as a normal character.
-
-Perl now optimizes "next" to avoid unnecessary longjmps and subroutine calls.
-
-Perl now optimizes appended input: $_ .= <>;
-
-Substitutions are faster if the substituted text is constant, especially
-when substituting at the beginning of a string.  This plus the previous
-optimization let you run down a file comparing multiple lines more
-efficiently. (Basically the equivalents of sed's N and D are faster.)
-
-Similarly, combinations of shifts and pushes on the same array are much
-faster now--it doesn't copy all the pointers every time you shift (just
-every n times, where n is approximately the length of the array plus 10,
-more if you pre-extend the array), so you can use an array as a shift
-register much more efficiently:
-       push(@ary,shift(@ary));
-or
-       shift(@ary); push(@ary,<>);
-
-The shift operator used inside subroutines now defaults to shifting
-the @_ array.  You can still shift ARGV explicitly, of course.
-
-The @_ array which is passed to subroutines is a local array, but the
-elements of it are passed by reference now.  This means that if you
-explicitly modify $_[0], you are actually modifying the first argument
-to the routine.  Assignment to another location (such as the usual
-local($foo) = @_ trick) causes a copy of the value, so this will not
-affect most scripts.  However, if you've modified @_ values in the
-subroutine you could be in for a surprise.  I don't believe most people
-will find this a problem, and the long term efficiency gain is worth
-a little confusion.
-
-Perl now detects sequences of references to the same variable and builds
-switch statements internally wherever reasonable.
-
-The substr function can take offsets from the end of the string.
-
-The substr function can be assigned to in order to change the interior of a
-string in place.
-
-The split function can return as part of the returned array any substrings
-matched as part of the delimiter:
-       split(/([-,])/, '1-10,20')
-returns
-       (1,'-',10,',',20)
-
-If you specify a maximum number of fields to split, the truncation of
-trailing null fields is disabled.
-
-You can now chop lists.
-
-Perl now uses /bin/csh to do filename globbing, if available.  This means
-that filenames with spaces or other strangenesses work right.
-
-Perl can now report multiple syntax errors with a single invocation.
-
-Perl syntax errors now give two tokens of context where reasonable.
-
-Perl will now report the possibility of a runaway multi-line string if
-such a string ends on a line with a syntax error.
-
-The assumed assignment in a while now works in the while modifier as
-well as the while statement.
-
-Perl can now warn you if you use numeric == on non-numeric string values.
-
-New functions:
-       mkdir and rmdir
-       getppid
-       getpgrp and setpgrp
-       getpriority and setpriority
-       chroot
-       ioctl and fcntl
-       flock
-       readlink
-       lstat
-       rindex                  - find last occurrence of substring
-       pack and unpack         - turn structures into arrays and vice versa
-       read                    - just what you think
-       warn                    - like die, only not fatal
-       dbmopen and dbmclose    - bind a dbm file to an associative array
-       dump                    - do core dump so you can undump
-       reverse                 - turns an array value end for end
-        defined                 - does an object exist?
-        undef                   - make an object not exist
-       vec                     - treat string as a vector of small integers
-       fileno                  - return the file descriptor for a handle
-       wantarray               - was subroutine called in array context?
-       opendir
-       readdir
-       telldir
-       seekdir
-       rewinddir
-       closedir
-       syscall
-       socket
-       bind
-       connect
-       listen
-       accept
-       shutdown
-       socketpair
-       getsockname
-       getpeername
-       getsockopt
-       setsockopt
-       getpwnam
-       getpwuid
-       getpwent
-       setpwent
-       endpwent
-       getgrnam
-       getgrgid
-       getgrent
-       setgrent
-       endgrent
-       gethostbyname
-       gethostbyaddr
-       gethostent
-       sethostent
-       endhostent
-       getnetbyname
-       getnetbyaddr
-       getnetent
-       setnetent
-       endnetent
-       getprotobyname
-       getprotobynumber
-       getprotoent
-       setprotoent
-       endprotoent
-       getservbyname
-       getservbyport
-       getservent
-       setservent
-       endservent
-
-Changes to s2p
---------------
-
-In patterns, s2p now translates \{n,m\} correctly to {n,m}.
-
-In patterns, s2p no longer removes backslashes in front of |.
-
-In patterns, s2p now removes backslashes in front of [a-zA-Z0-9].
-
-S2p now makes use of the location of perl as determined by Configure.
-
-
-Changes to a2p
---------------
-
-A2p can now accurately translate the "in" operator by using perl's new
-"defined" operator.
-
-A2p can now accurately translate the passing of arrays by reference.
-
index f40c802..3cbf520 100755 (executable)
--- a/Configure
+++ b/Configure
@@ -8,14 +8,14 @@
 # and edit it to reflect your system.  Some packages may include samples
 # of config.h for certain machines, so you might look for one of those.)
 #
-# $Header: Configure,v 3.0.1.14 91/01/11 21:56:38 lwall Locked $
+# $Id: Head.U,v 2.11 90/09/17 17:04:47 hokey Exp Locker: hokey $
 #
 # Yes, you may rip this off to use in other distribution packages.
 # (Note: this Configure script was generated automatically.  Rather than
 # working with this copy of Configure, you may wish to get metaconfig.)
 
 : sanity checks
-PATH="$PATH:.:/bin:/usr/bin:/usr/local/bin:/usr/ucb:/usr/local:/usr/lbin:/etc:/usr/new:/usr/new/bin:/usr/nbin"
+PATH=".:$PATH:/bin:/usr/bin:/usr/local/bin:/usr/ucb:/usr/local:/usr/lbin:/etc:/usr/new:/usr/new/bin:/usr/nbin"
 export PATH || (echo "OOPS, this isn't sh.  Desperation time.  I will feed myself to sh."; sh $0; kill $$)
 
 if test ! -t 0; then
@@ -38,6 +38,7 @@ case "$1" in
 -d) shift; fastread='yes';;
 esac
 
+kit_has_binaries=''
 d_eunice=''
 define=''
 eunicefix=''
@@ -92,10 +93,17 @@ touch=''
 make=''
 date=''
 csh=''
+bash=''
+ksh=''
+lex=''
+flex=''
+bison=''
 Log=''
 Header=''
+Id=''
 alignbytes=''
 bin=''
+installbin=''
 byteorder=''
 contains=''
 cppstdin=''
@@ -124,18 +132,27 @@ d_getpgrp2=''
 d_getprior=''
 d_htonl=''
 d_index=''
-d_ioctl=''
 d_killpg=''
 d_lstat=''
 d_memcmp=''
 d_memcpy=''
 d_mkdir=''
+d_msg=''
+d_msgctl=''
+d_msgget=''
+d_msgrcv=''
+d_msgsnd=''
 d_ndbm=''
 d_odbm=''
+d_open3=''
 d_readdir=''
 d_rename=''
 d_rmdir=''
 d_select=''
+d_sem=''
+d_semctl=''
+d_semget=''
+d_semop=''
 d_setegid=''
 d_seteuid=''
 d_setpgrp=''
@@ -147,6 +164,11 @@ d_setreuid=''
 d_setresuid=''
 d_setrgid=''
 d_setruid=''
+d_shm=''
+d_shmat=''
+d_shmctl=''
+d_shmdt=''
+d_shmget=''
 d_socket=''
 d_sockpair=''
 d_oldsock=''
@@ -157,43 +179,49 @@ d_strctcpy=''
 d_strerror=''
 d_symlink=''
 d_syscall=''
-d_sysvipc=''
-d_ipcmsg=''
-d_ipcsem=''
-d_ipcshm=''
 d_truncate=''
-d_varargs=''
 d_vfork=''
 d_voidsig=''
+d_tosignal=''
 d_volatile=''
 d_vprintf=''
 d_charvspr=''
 d_wait4=''
 d_waitpid=''
 gidtype=''
-i_dirent=''
-d_dirnamlen=''
 i_fcntl=''
+i_gdbm=''
 i_grp=''
 i_niin=''
+i_sysin=''
 i_pwd=''
-d_pwcomment=''
 d_pwquota=''
 d_pwage=''
 d_pwchange=''
 d_pwclass=''
 d_pwexpire=''
-i_sysdir=''
+d_pwcomment=''
+i_sys_file=''
 i_sysioctl=''
-i_sysndir=''
 i_time=''
-i_systime=''
+i_sys_time=''
+i_sys_select=''
 d_systimekernel=''
 i_utime=''
 i_varargs=''
 i_vfork=''
 intsize=''
 libc=''
+nm_opts=''
+libndir=''
+i_my_dir=''
+i_ndir=''
+i_sys_ndir=''
+i_dirent=''
+i_sys_dir=''
+d_dirnamlen=''
+ndirc=''
+ndiro=''
 mallocsrc=''
 mallocobj=''
 usemymalloc=''
@@ -223,15 +251,22 @@ sharpbang=''
 startsh=''
 stdchar=''
 uidtype=''
-voidflags=''
-defvoidused=''
+usrinclude=''
+inclPath=''
+void=''
+voidhave=''
+voidwant=''
+w_localtim=''
+w_s_timevl=''
+w_s_tm=''
 yacc=''
-privlib=''
 lib=''
+privlib=''
+installprivlib=''
 CONFIG=''
-: set package name
+: get the name of the package
 package=perl
-
+: Here we go...
 echo " "
 echo "Beginning of configuration questions for $package kit."
 : Eunice requires " " instead of "", can you believe it
@@ -241,10 +276,9 @@ define='define'
 undef='undef'
 : change the next line if compiling for Xenix/286 on Xenix/386
 xlibpth='/usr/lib/386 /lib/386'
-libpth='/usr/ccs/lib /usr/lib /usr/local/lib /usr/lib/large /lib '$xlibpth' /lib/large /usr/lib/small /lib/small'
+libpth='/usr/ccs/lib /usr/lib /usr/ucblib /usr/local/lib /usr/lib/large /lib '$xlibpth' /lib/large /usr/lib/small /lib/small'
 smallmach='pdp11 i8086 z8000 i80286 iAPX286'
-rmlist='kit[1-9]isdone kit[1-9][0-9]isdone'
-trap 'echo " "; rm -f $rmlist; exit 1' 1 2 3
+trap 'echo " "; exit 1' 1 2 3
 
 : We must find out about Eunice early
 eunicefix=':'
@@ -255,35 +289,64 @@ if test -f /etc/unixtovms.exe; then
     eunicefix=/etc/unixtovms.exe
 fi
 
+kit_has_binaries=false
+attrlist="DGUX M_I186 M_I286 M_I386 M_I8086 M_XENIX UTS __DGUX__"
+attrlist="$attrlist __STDC__ __m88k__ ansi bsd4_2 gcos gimpel"
+attrlist="$attrlist hp9000s300 hp9000s500 hp9000s800 hpux"
+attrlist="$attrlist i186 i386 i8086 iAPX286 ibm interdata"
+attrlist="$attrlist m68k m88k mc300 mc500 mc68000 mc68k mc700 mert"
+attrlist="$attrlist ns16000 ns32000 nsc32000 os pdp11 posix pyr sinix"
+attrlist="$attrlist sparc sun tower tower32 tower32_600 tower32_800 tss"
+attrlist="$attrlist u3b2 u3b20 u3b200 u3b5 ultrix unix vax venix xenix"
+attrlist="$attrlist z8000"
+boPATH=""
+eoPATH="/usr/ucb /bin /usr/bin /usr/local /usr/local/bin /usr/lbin /usr/plx /usr/5bin /vol/local/bin /etc /usr/lib /lib /usr/local/lib /sys5.3/bin /sys5.3/usr/bin /bsd4.3/bin /bsd4.3/usr/bin /bsd4.3/usr/ucb /bsd43/usr/bin"
+d_newshome="/usr/NeWS"
+errnolist=errnolist
+h_fcntl=false
+h_sys_file=false
+serve_shm=""
+serve_msg="$undef"
+serve_inet_udp=""
+serve_inet_tcp=""
+serve_unix_udp=""
+serve_unix_tcp=""
+d_ndir=ndir
+voidwant=1
+libswanted="net_s net nsl_s nsl socket nm ndir ndbm dbm sun m bsd BSD x c_s"
+inclwanted='/usr/include /usr/netinclude /usr/include/sun /usr/include/bsd /usr/include/lan'
+
 : Now test for existence of everything in MANIFEST
 
 echo "First let's make sure your kit is complete.  Checking..."
-(cd ..; awk '' `awk '$1 !~ /PACKINGLIST/ {print $1}' MANIFEST` >/dev/null || kill $$)
+if $kit_has_binaries; then
+( cd ..
+  bad=false
+  for i in `awk '$1 !~ /PACKINGLIST/ {print $1}' MANIFEST`
+  do
+    if test ! -f $i ; then
+      echo Missing $i
+      bad=true
+    fi
+  done
+  if $bad; then
+    kill $$
+  fi
+)
+else
+    (cd ..; awk '{}' `awk '$1 !~ /PACKINGLIST/ {print $1}' MANIFEST` >/dev/null || kill $$)
+fi
 echo "Looks good..."
 
-attrlist="mc68000 sun gcos unix ibm gimpel interdata tss os mert pyr"
-attrlist="$attrlist vax pdp11 i8086 z8000 u3b2 u3b5 u3b20 u3b200"
-attrlist="$attrlist hpux hp9000s300 hp9000s500 hp9000s800"
-attrlist="$attrlist ns32000 ns16000 iAPX286 mc300 mc500 mc700 sparc"
-attrlist="$attrlist nsc32000 sinix xenix venix posix ansi M_XENIX"
-attrlist="$attrlist $mc68k __STDC__ UTS M_I8086 M_I186 M_I286 M_I386"
-attrlist="$attrlist i186 __m88k__ m88k DGUX __DGUX__"
-pth="/usr/ccs/bin /bin /usr/bin /usr/ucb /usr/local /usr/local/bin /usr/lbin /usr/plx /usr/5bin /vol/local/bin /etc /usr/lib /lib /usr/local/lib /sys5.3/bin /sys5.3/usr/bin /bsd4.3/bin /bsd4.3/usr/bin /bsd4.3/usr/ucb"
-d_newshome="/usr/NeWS"
-defvoidused=7
-libswanted="net_s net nsl_s nsl socket nm ndir ndbm dbm sun m bsd BSD x c_s"
-inclwanted='/usr/netinclude /usr/include/sun /usr/include/bsd /usr/include/lan'
-
 : some greps do not return status, grrr.
-echo "grimblepritz" >grimble
-if grep blurfldyick grimble >/dev/null 2>&1 ; then
+echo "grimblepritz" >contains.txt
+if grep blurfldyick contains.txt >/dev/null 2>&1 ; then
     contains=contains
-elif grep grimblepritz grimble >/dev/null 2>&1 ; then
+elif grep grimblepritz contains.txt >/dev/null 2>&1 ; then
     contains=grep
 else
     contains=contains
 fi
-rm -f grimble
 : the following should work in any shell
 case "$contains" in
 contains*)
@@ -304,18 +367,22 @@ if sh -c '#' >/dev/null 2>&1 ; then
     spitshell=cat
     echo " "
     echo "Okay, let's see if #! works on this system..."
-    echo "#!/bin/echo hi" > try
-    $eunicefix try
-    chmod +x try
-    ./try > today
+    if test -f /bsd43/bin/echo; then
+       echo "#!/bsd43/bin/echo hi" > spit.sh
+    else
+       echo "#!/bin/echo hi" > spit.sh
+    fi
+    $eunicefix spit.sh
+    chmod +x spit.sh
+    ./spit.sh > today
     if $contains hi today >/dev/null 2>&1; then
        echo "It does."
        sharpbang='#!'
     else
-       echo "#! /bin/echo hi" > try
-       $eunicefix try
-       chmod +x try
-       ./try > today
+       echo "#! /bin/echo hi" > spit.sh
+       $eunicefix spit.sh
+       chmod +x spit.sh
+       ./spit.sh > today
        if test -s today; then
            echo "It does."
            sharpbang='#! '
@@ -340,25 +407,24 @@ echo " "
 echo "Checking out how to guarantee sh startup..."
 startsh=$sharpbang'/bin/sh'
 echo "Let's see if '$startsh' works..."
-cat >try <<EOSS
+cat >start.sh <<EOSS
 $startsh
 set abc
 test "$?abc" != 1
 EOSS
 
-chmod +x try
-$eunicefix try
-if ./try; then
+chmod +x start.sh
+$eunicefix start.sh
+if ./start.sh; 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 today
 
 : first determine how to suppress newline on echo command
 echo "Checking echo to see how to suppress newlines..."
-(echo "hi there\c" ; echo " ") >.echotmp
-if $contains c .echotmp >/dev/null 2>&1 ; then
+(echo "hi there\c" ; echo " ") >echotmp
+if $contains c echotmp >/dev/null 2>&1 ; then
     echo "...using -n."
     n='-n'
     c=''
@@ -371,7 +437,6 @@ EOM
 fi
 echo $n "Type carriage return to continue.  Your cursor should be here-->$c"
 read ans
-rm -f .echotmp
 
 : now set up to do reads with possible shell escape and default assignment
 cat <<EOSC >myread
@@ -421,9 +486,9 @@ echo $n "$rp $c"
 . myread
 cat <<EOH
 
-Much effort has been expended to ensure that this shell script will run
-on any Unix system.  If despite that it blows up on you, your best bet is
-to edit Configure and run it again. Also, let me (lwall@jpl-devvax.jpl.nasa.gov)
+Much effort has been expended to ensure that this shell script will run on any
+Unix system.  If despite that it blows up on you, your best bet is to edit
+Configure and run it again. Also, let me (lwall@jpl-devvax.jpl.nasa.gov)
 know how I blew it.  If you can't run Configure for some reason, you'll have
 to generate a config.sh file by hand.
 
@@ -513,11 +578,16 @@ uniq
 "
 trylist="
 Mcc
+bison
 cpp
 csh
 egrep
+nroff
 test
+uname
+yacc
 "
+pth=`echo :$boPATH:$PATH:$eoPATH: | sed -e 's/:/ /g'`
 for file in $loclist; do
     xxx=`./loc $file $file $pth`
     eval $file=$xxx
@@ -575,9 +645,9 @@ echo)
 /bin/echo)
     echo " "
     echo "Checking compatibility between /bin/echo and builtin echo (if any)..."
-    $echo $n "hi there$c" >foo1
-    echo $n "hi there$c" >foo2
-    if cmp foo1 foo2 >/dev/null 2>&1; then
+    $echo $n "hi there$c" >Loc1.txt
+    echo $n "hi there$c" >Loc2.txt
+    if cmp Loc1.txt Loc2.txt >/dev/null 2>&1; then
        echo "They are compatible.  In fact, they may be identical."
     else
        case "$n" in
@@ -595,14 +665,12 @@ FOO
        $echo $n "$rp$c"
        . myread
     fi
-    $rm -f foo1 foo2
     ;;
 *)
     : cross your fingers
     echo=echo
     ;;
 esac
-rmlist="$rmlist loc"
 
 : set up shell script to do ~ expansion
 cat >filexp <<EOSS
@@ -645,11 +713,21 @@ $eunicefix filexp
 : determine where manual pages go
 $cat <<EOM
   
-$package has manual pages that need to be installed in source form.
+$package has manual pages available in source form.
 EOM
+case "$nroff" in
+'')
+    echo "However, you don't have nroff, so they're probably useless to you."
+    case "$mansrc" in
+    '')
+       mansrc="none"
+       ;;
+    esac
+esac
+echo "If you don't want the manual sources installed, answer 'none'."
 case "$mansrc" in
 '')
-    dflt=`./loc . /usr/man/man1 /usr/man/mann /usr/man/manl /usr/man/local/man1 /usr/man/u_man/man1 /usr/man/man1 /usr/man/man.L`
+    dflt=`./loc . none /usr/man/local/man1 /usr/man/man.L /usr/man/manl /usr/man/mann /usr/man/u_man/man1 /usr/man/man1`
     ;;
 *)  dflt="$mansrc"
     ;;
@@ -657,28 +735,39 @@ esac
 cont=true
 while $test "$cont" ; do
     echo " "
-    rp="Where do the manual pages (source) go? (~name ok) [$dflt]"
+    rp="Where do the manual pages (source) go (~name ok)? [$dflt]"
     $echo $n "$rp $c"
     . myread
-    mansrc=`./filexp "$ans"`
-    if $test -d "$mansrc"; then
+    case "$ans" in
+    'none')
+       mansrc=''
        cont=''
-    else
-       if $test "$fastread" = yes; then
-           dflt=y
-       else
-           dflt=n
-       fi
-       rp="Directory $mansrc doesn't exist.  Use that name anyway? [$dflt]"
-       $echo $n "$rp $c"
-       . myread
-       dflt=''
-       case "$ans" in
-       y*) cont='';;
-       esac
-    fi
+       ;;
+    *)
+        mansrc=`./filexp "$ans"`
+        if $test -d "$mansrc"; then
+           cont=''
+        else
+           if $test "$fastread" = yes; then
+               dflt=y
+           else
+               dflt=n
+           fi
+           rp="Directory $mansrc doesn't exist.  Use that name anyway? [$dflt]"
+           $echo $n "$rp $c"
+           . myread
+           dflt=''
+           case "$ans" in
+           y*) cont='';;
+           esac
+        fi
+       ;;
+    esac
 done
 case "$mansrc" in
+'')
+    manext=''
+    ;;
 *l)
     manext=l
     ;;
@@ -689,7 +778,7 @@ case "$mansrc" in
     manext=l
     ;;
 *p)
-    manext=p
+    manext=n
     ;;
 *C)
     manext=C
@@ -702,16 +791,74 @@ case "$mansrc" in
     ;;
 esac
 
-: make some quick guesses about what we are up against
+: Sigh.  Well, at least the box is fast...
 echo " "
 $echo $n "Hmm...  $c"
-cat /usr/include/signal.h /usr/include/sys/signal.h >foo
-if test `echo abc | tr a-z A-Z` = Abc ; then
+case "$usrinclude" in
+'') dflt='/usr/include';;
+*) dflt=$usrinclude;;
+esac
+inclPath=''
+if $test -f /bin/mips && /bin/mips; then
+    echo "Looks like a MIPS system..."
+    $cat >usrinclude.c <<'EOCP'
+#ifdef SYSTYPE_BSD43
+/bsd43
+#endif
+EOCP
+    if cc -E usrinclude.c > usrinclude.out && $contains / usrinclude.out >/dev/null 2>&1 ; then
+       echo "and you're compiling with the BSD43 compiler and libraries."
+       dflt='/bsd43/usr/include'
+       inclPath='/bsd43'
+    else
+       echo "and you're compiling with the SysV compiler and libraries."
+    fi
+else
+    echo "Doesn't look like a MIPS system."
+    echo "exit 1" >mips
+    chmod +x mips
+    $eunicefix mips
+fi
+
+cont=true
+while $test "$cont" ; do
+    echo " "
+    rp="Where are the include files you want to use? [$dflt]"
+    $echo $n "$rp $c"
+    . myread
+    usrinclude="$ans"
+    if $test -d $ans; then
+       cont=''
+    else
+       if $test "$fastread" = yes; then
+           dflt=y
+       else
+           dflt=n
+       fi
+       rp="Directory $ans doesn't exist.  Use that name anyway? [$dflt]"
+       $echo $n "$rp $c"
+       . myread
+       dflt=''
+       case "$ans" in
+       y*) cont='';;
+       esac
+    fi
+done
+
+: make some quick guesses about what we are up against
+echo " "
+cat $usrinclude/signal.h $usrinclude/sys/signal.h >guess.txt 2>/dev/null
+if test "$usrinclude" = "/bsd43/usr/include" ; then
+    echo "Looks kind of like a SysV MIPS running BSD, but we'll see..."
+    echo exit 0 >bsd
+    echo exit 1 >usg
+    echo exit 1 >v7
+elif test `echo abc | tr a-z A-Z` = Abc ; then
     echo "Looks kind of like a USG system, but we'll see..."
     echo exit 1 >bsd
     echo exit 0 >usg
     echo exit 1 >v7
-elif $contains SIGTSTP foo >/dev/null 2>&1 ; then
+elif $contains SIGTSTP guess.txt >/dev/null 2>&1 ; then
     echo "Looks kind of like a BSD system, but we'll see..."
     echo exit 0 >bsd
     echo exit 1 >usg
@@ -762,8 +909,6 @@ else
 fi
 chmod +x bsd usg v7 eunice venix
 $eunicefix bsd usg v7 eunice venix
-rm -rf foo
-rmlist="$rmlist bsd usg v7 eunice venix xenix"
 
 : see what memory models we can support
 case "$models" in
@@ -1012,10 +1157,12 @@ case "$ccflags" in
 esac
 for thisincl in $inclwanted; do
     if test -d $thisincl; then
-       case "$dflt" in
-       *$thisincl*);;
-       *) dflt="$dflt -I$thisincl";;
-       esac
+       if test "x$thisincl" != "x$usrinclude"; then
+           case "$dflt" in
+           *$thisincl*);;
+           *) dflt="$dflt -I$thisincl";;
+           esac
+       fi
     fi
 done
 case "$optimize" in
@@ -1026,7 +1173,7 @@ case "$optimize" in
     esac
     ;;
 esac
-if $contains 'LANGUAGE_C' /usr/include/signal.h >/dev/null 2>&1; then
+if $contains 'LANGUAGE_C' $usrinclude/signal.h >/dev/null 2>&1; then
     case "$dflt" in
     *LANGUAGE_C*);;
     *) dflt="$dflt -DLANGUAGE_C";;
@@ -1062,7 +1209,7 @@ case "$cppflags" in
     cppflags=''
     for flag do
        case $flag in
-       -D*|-I*) cppflags="$cppflags $flag";;
+       -D*|-I*|-traditional|-ansi|-nostdinc) cppflags="$cppflags $flag";;
        esac
     done
     case "$cppflags" in
@@ -1088,11 +1235,13 @@ case "$ans" in
 none) ans='';
 esac
 ldflags="$ans"
-rmlist="$rmlist pdp11"
 
 echo " "
 echo "Checking for optional libraries..."
-dflt=''
+case "$libs" in
+'') dflt='';;
+*) dflt="$libs";;
+esac
 case "$libswanted" in
 '') libswanted='c_s';;
 esac
@@ -1103,7 +1252,7 @@ for thislib in $libswanted; do
     *) thatlib="${thislib}_s";;
     *) thatlib=NONE;;
     esac
-    xxx=`./loc lib$thislib.a X /usr/ccs/lib /usr/lib /usr/local/lib /lib`
+    xxx=`./loc lib$thislib.a X /usr/ccs/lib /usr/lib /usr/ucblib /usr/local/lib /lib`
     if test -f $xxx; then
        echo "Found -l$thislib."
        case "$dflt" in
@@ -1135,10 +1284,6 @@ done
 set X $dflt
 shift
 dflt="$*"
-case "$libs" in
-'') dflt="$dflt";;
-*) dflt="$libs";;
-esac
 case "$dflt" in
 '') dflt='none';;
 esac
@@ -1199,21 +1344,29 @@ alignbytes="$ans"
 $rm -f try.c try
 
 : determine where public executables go
+cat <<EOF
+The following questions distinguish the directory in which executables
+reside from the directory in which they are installed (and from which they
+are presumably copied to the former directory by occult means).  This
+distinction is often necessary under afs.  On most other systems, however,
+the two directories are the same.
+EOF
 case "$bin" in
 '')
-    dflt=`./loc . /bin /usr/local/bin /usr/lbin /usr/local /usr/bin`
+    dflt=`./loc . /usr/local/bin /usr/local/bin /usr/lbin /usr/local /usr/bin /bin`
     ;;
 *)  dflt="$bin"
     ;;
 esac
 cont=true
 while $test "$cont" ; do
-    echo " "
-    rp="Where do you want to put the public executables? (~name ok) [$dflt]"
+    rp="In which directory will public executables reside (~name ok)? [$dflt]"
     $echo $n "$rp $c"
     . myread
     bin="$ans"
-    bin=`./filexp "$bin"`
+    bin=`./filexp $bin`
     if test -d $bin; then
        cont=''
     else
@@ -1231,6 +1384,37 @@ while $test "$cont" ; do
     fi
 done
 
+case "$installbin" in
+'')
+    dflt=`echo $bin | sed 's#^/afs/#/afs/.#'`
+    ;;
+*)  dflt="$installbin"
+    ;;
+esac
+cont=true
+while $test "$cont" ; do
+    rp="In which directory will public executables be installed (~name ok)? [$dflt]"
+    $echo $n "$rp $c"
+    . myread
+    installbin="$ans"
+    installbin=`./filexp $installbin`
+    if test -d $installbin; then
+       cont=''
+    else
+       case "$fastread" in
+       yes) dflt=y;;
+       *) dflt=n;;
+       esac
+       rp="Directory $installbin doesn't exist.  Use that name anyway? [$dflt]"
+       $echo $n "$rp $c"
+       . myread
+       dflt=''
+       case "$ans" in
+       y*) cont='';;
+       esac
+    fi
+done
+
 : check for ordering of bytes in a long
 case "$byteorder" in
 '')
@@ -1243,7 +1427,7 @@ machines may have weird orders like 3412.  A Cray will report 87654321.  If
 the test program works the default is probably right.
 I'm now running the test program...
 EOM
-    $cat >try.c <<'EOCP'
+    $cat >byteorder.c <<'EOCP'
 #include <stdio.h>
 main()
 {
@@ -1254,7 +1438,7 @@ main()
     } u;
 
     if (sizeof(long) > 4)
-       u.l = (0x08070605<<32) | 0x04030201;
+       u.l = (0x08070605 << 32) | 0x04030201;
     else
        u.l = 0x04030201;
     for (i=0; i < sizeof(long); i++)
@@ -1262,8 +1446,8 @@ main()
     printf("\n");
 }
 EOCP
-    if $cc $ccflags try.c -o try >/dev/null 2>&1 ; then
-       dflt=`./try`
+    if $cc byteorder.c -o byteorder >/dev/null 2>&1 ; then
+       dflt=`./byteorder`
        case "$dflt" in
        ????|????????) echo "(The test program ran ok.)";;
        *) echo "(The test program didn't run right for some reason.)";;
@@ -1282,12 +1466,13 @@ rp="What is the order of bytes in a long? [$dflt]"
 $echo $n "$rp $c"
 . myread
 byteorder="$ans"
-$rm -f try.c try
 
 : check for ability to cast negative floats to unsigned
 echo " "
 echo 'Checking to see if your C compiler can cast weird floats to unsigned'
 $cat >try.c <<'EOCP'
+#include <signal.h>
+
 main()
 {
        double f = -123;
@@ -1296,6 +1481,7 @@ main()
        unsigned short ashort;
        int result = 0;
 
+       signal(SIGFPE, SIG_IGN);
        along = (unsigned long)f;
        aint = (unsigned int)f;
        ashort = (unsigned short)f;
@@ -1307,22 +1493,29 @@ main()
            result |= 1;
        f = (double)0x40000000;
        f = f + f;
+       along = 0;
        along = (unsigned long)f;
        if (along != 0x80000000)
            result |= 2;
        f -= 1;
+       along = 0;
        along = (unsigned long)f;
        if (along != 0x7fffffff)
            result |= 1;
        f += 2;
+       along = 0;
        along = (unsigned long)f;
        if (along != 0x80000001)
            result |= 2;
        exit(result);
 }
 EOCP
-$cc -o try $ccflags try.c >/dev/null 2>&1 && ./try
-castflags=$?
+if $cc -o try $ccflags try.c >/dev/null 2>&1; then
+    ./try
+    castflags=$?
+else
+    castflags=3
+fi
 case "$castflags" in
 0)  d_castneg="$define"
     echo "Yup, it does."
@@ -1440,15 +1633,31 @@ else
        fi
     fi
 fi
-rm -f testcpp.c testcpp.out
 
 : get list of predefined functions in a handy place
 echo " "
 case "$libc" in
 '') libc=unknown;;
 esac
+case "$nm_opts" in
+'') if test -f /mach_boot; then
+       nm_opts=''
+    elif test -d /usr/ccs/lib; then
+       nm_opts='-p'
+    else
+       nm_opts=''
+    fi
+    ;;
+esac
+: on mips, we DO NOT want /lib, and we want inclPath/usr/lib
 case "$libpth" in
-'') libpth='/usr/ccs/lib /lib /usr/lib /usr/local/lib';;
+'') if mips; then
+       libpth='$inclPath/usr/lib /usr/local/lib'
+       nm_opts="-B"
+    else
+       libpth='/usr/ccs/lib /lib /usr/lib /usr/ucblib /usr/local/lib'
+    fi
+    ;;
 esac
 case "$libs" in
 *-lc_s*) libc=`./loc libc_s.a $libc $libpth`
@@ -1482,36 +1691,29 @@ esac
 set /usr/ccs/lib/libc.so
 test -f $1 || set /usr/lib/libc.so
 test -f $1 || set /usr/lib/libc.so.[0-9]*
+test -f $1 || set /lib/libsys_s.a
 eval set \$$#
 if test -f "$1"; then
     echo "Your shared C library is in $1."
     libc="$1"
 elif test -f $libc; then
     echo "Your C library is in $libc, like you said before."
-    if test $libc = "/lib/libc"; then
-       libc="$libc /lib/clib"
-    fi
 elif test -f /lib/libc.a; then
     echo "Your C library is in /lib/libc.a.  You're normal."
     libc=/lib/libc.a
 else
-    ans=`./loc libc.a blurfl/dyick $libpth`
-    if test ! -f "$ans"; then
-       ans=`./loc Slibc.a blurfl/dyick $xlibpth`
-    fi
-    if test ! -f "$ans"; then
-       ans=`./loc Mlibc.a blurfl/dyick $xlibpth`
-    fi
-    if test ! -f "$ans"; then
-       ans=`./loc Llibc.a blurfl/dyick $xlibpth`
-    fi
-    if test ! -f "$ans"; then
-       ans=`./loc libc blurfl/dyick $libpth`
-    fi
-    if test ! -f "$ans"; then
-       ans=`./loc clib blurfl/dyick $libpth`
-    else
-       libnames="$libnames "`./loc clib blurfl/dyick $libpth`
+    if   ans=`./loc libc.a  blurfl/dyick $libpth`; test -f "$ans"; then
+       :
+    elif ans=`./loc libc    blurfl/dyick $libpth`; test -f "$ans"; then
+           libnames="$libnames "`./loc clib blurfl/dyick $libpth`
+    elif ans=`./loc clib    blurfl/dyick $libpth`; test -f "$ans"; then
+       :
+    elif ans=`./loc Slibc.a blurfl/dyick $xlibpth`; test -f "$ans"; then
+       :
+    elif ans=`./loc Mlibc.a blurfl/dyick $xlibpth`; test -f "$ans"; then
+       :
+    elif ans=`./loc Llibc.a blurfl/dyick $xlibpth`; test -f "$ans"; then
+       :
     fi
     if test -f "$ans"; then
        echo "Your C library is in $ans, of all places."
@@ -1533,25 +1735,42 @@ EOM
     fi
 fi
 echo " "
+if test $libc = "/lib/libc"; then
+    libc="$libc /lib/clib"
+fi
 set `echo $libc $libnames | tr ' ' '\012' | sort | uniq`
 $echo $n "Extracting names from $* for later perusal...$c"
-nm $* 2>/dev/null >libc.tmp
-$sed -n -e 's/^.* [ATDS]  *_[_.]*//p' -e 's/^.* [ATDS] //p' <libc.tmp >libc.list
+nm $nm_opts $* 2>/dev/null >libc.tmp
+$sed -n -e 's/^.* [ATDS]  *[_.]*//p' -e 's/^.* [ATDS] //p' <libc.tmp >libc.list
 if $contains '^printf$' libc.list >/dev/null 2>&1; then
-    echo "done"
+    echo done
+elif $sed -n -e 's/^__*//' -e 's/^\([a-zA-Z_0-9$]*\).*xtern.*/\1/p' \
+       <libc.tmp >libc.list; \
+  $contains '^printf$' libc.list >/dev/null 2>&1; then
+    echo done
+elif $sed -n -e '/|UNDEF/d' -e '/FUNC..GL/s/^.*|__*//p' <libc.tmp >libc.list; \
+  $contains '^printf$' libc.list >/dev/null 2>&1; then
+    echo done
+elif $sed -n -e 's/^.* D __*//p' -e 's/^.* D //p' <libc.tmp >libc.list; \
+  $contains '^printf$' libc.list >/dev/null 2>&1; then
+    echo done
+elif $sed -n -e 's/^_//' -e 's/^\([a-zA-Z_0-9]*\).*xtern.*text.*/\1/p' \
+               <libc.tmp >libc.list; \
+  $contains '^printf$' libc.list >/dev/null 2>&1; then
+    echo done
+elif $grep '|' <libc.tmp | $sed -n -e '/|COMMON/d' -e '/|DATA/d' \
+                                   -e 's/^\([^     ]*\).*/\1/p' >libc.list
+  $contains '^printf$' libc.list >/dev/null 2>&1; then
+    echo done
+elif $sed -n -e 's/^.*|FUNC |GLOB .*|//p' -e 's/^.*|FUNC |WEAK .*|//p' \
+          <libc.tmp >libc.list; \
+  $contains '^printf$' libc.list >/dev/null 2>&1; then
+    echo done
 else
-    $sed -n -e 's/^__*//' -e 's/^\([a-zA-Z_0-9$]*\).*xtern.*/\1/p' <libc.tmp >libc.list
-    $contains '^printf$' libc.list >/dev/null 2>&1 || \
-       $sed -n -e '/|UNDEF/d' -e '/FUNC..GL/s/^.*|__*//p' <libc.tmp >libc.list
-    $contains '^printf$' libc.list >/dev/null 2>&1 || \
-       $sed -n -e 's/^.* D __*//p' -e 's/^.* D //p' <libc.tmp >libc.list
-    $contains '^printf$' libc.list >/dev/null 2>&1 || \
-       $sed -n -e 's/^_//' \
-             -e 's/^\([a-zA-Z_0-9]*\).*xtern.*text.*/\1/p' <libc.tmp >libc.list
-    $contains '^printf$' libc.list >/dev/null 2>&1 || \
-       $sed -n -e 's/^.*|FUNC |GLOB .*|//p' -e 's/^.*|FUNC |WEAK .*|//p' \
-          <libc.tmp >libc.list
+    nm -p $* 2>/dev/null >libc.tmp
+    $sed -n -e 's/^.* [AT]  *_[_.]*//p' -e 's/^.* [AT] //p' <libc.tmp >libc.list
     if $contains '^printf$' libc.list >/dev/null 2>&1; then
+       nm_opts='-p'
        echo "done"
     else
        echo " "
@@ -1574,8 +1793,8 @@ else
                done
                echo "Ok."
            else
-               echo "That didn't work either.  Giving up."
-               exit 1
+               echo "That didn't work either.  Giving up."
+               exit 1
            fi
        fi
     fi
@@ -1586,8 +1805,6 @@ if $contains "^$1\$" libc.list >/dev/null 2>&1;
 then echo "$1() found"; eval "$2=$define";
 else echo "$1() not found"; eval "$2=$undef"; fi'
 
-rmlist="$rmlist libc.tmp libc.list"
-
 : see if bcmp exists
 set bcmp d_bcmp
 eval $inlibc
@@ -1602,25 +1819,23 @@ eval $inlibc
 
 : see if sprintf is declared as int or pointer to char
 echo " "
-cat >.ucbsprf.c <<'EOF'
+cat >ucbsprf.c <<'EOF'
 main() { char buf[10]; exit((unsigned long)sprintf(buf,"%s","foo") > 10L); }
 EOF
-if $cc $ccflags .ucbsprf.c -o .ucbsprf >/dev/null 2>&1 && .ucbsprf; then
+if $cc $ccflags ucbsprf.c -o ucbsprf >/dev/null 2>&1 && ./ucbsprf; then
     echo "Your sprintf() returns (int)."
     d_charsprf="$undef"
 else
     echo "Your sprintf() returns (char*)."
     d_charsprf="$define"
 fi
-/bin/rm -f .ucbsprf.c .ucbsprf
 
 : see if vprintf exists
 echo " "
 if $contains '^vprintf$' libc.list >/dev/null 2>&1; then
     echo 'vprintf() found.'
     d_vprintf="$define"
-    cat >.ucbsprf.c <<'EOF'
-#include <stdio.h>
+    cat >vprintf.c <<'EOF'
 #include <varargs.h>
 
 main() { xxx("foo"); }
@@ -1635,14 +1850,13 @@ va_dcl
     exit((unsigned long)vsprintf(buf,"%s",args) > 10L);
 }
 EOF
-    if $cc $ccflags .ucbsprf.c -o .ucbsprf >/dev/null 2>&1 && .ucbsprf; then
+    if $cc $ccflags vprintf.c -o vprintf >/dev/null 2>&1 && ./vprintf; then
        echo "Your vsprintf() returns (int)."
        d_charvspr="$undef"
     else
        echo "Your vsprintf() returns (char*)."
        d_charvspr="$define"
     fi
-    /bin/rm -f .ucbsprf.c .ucbsprf
 else
     echo 'vprintf() not found.'
     d_vprintf="$undef"
@@ -1690,24 +1904,83 @@ case "$csh" in
 *)     d_csh="$define" ;;
 esac
 
-: see if this is a dirent system
+: see if readdir exists
+set readdir d_readdir
+eval $inlibc
+
+: see if there are directory access routines out there
 echo " "
-if $test -r /usr/include/dirent.h ; then
-    i_dirent="$define"
+xxx=`./loc ndir.h x $usrinclude /usr/local/include $inclwanted`
+case "$xxx" in
+x)
+    xxx=`./loc sys/ndir.h x $usrinclude /usr/local/include $inclwanted`
+    ;;
+esac
+d_dirnamlen="$undef"
+i_dirent="$undef"
+i_sys_dir="$undef"
+i_my_dir="$undef"
+i_ndir="$undef"
+i_sys_ndir="$undef"
+libndir=''
+ndirc=''
+ndiro=''
+if $test -r $usrinclude/dirent.h; then
     echo "dirent.h found."
-    if $contains 'd_namlen' /usr/include/sys/dirent.h >/dev/null 2>&1; then
+    if $contains 'd_namlen' $usrinclude/dirent.h >/dev/null 2>&1; then
        d_dirnamlen="$define"
+    fi
+    i_dirent="$define"
+elif $test -r $xxx; then
+    echo "You seem to use <$xxx>,"
+    if $test "$d_readdir" = "$define"; then
+       echo "and I can get readdir() from your C library."
+    elif $test -r /usr/lib/libndir.a || $test -r /usr/local/lib/libndir.a; then
+       echo "and I'll get the routines using -lndir ."
+       libndir='-lndir'
     else
-       d_dirnamlen="$undef"
+       ans=`./loc libndir.a x $libpth`
+       case "$ans" in
+       x)
+           echo "but I can't find the ndir library!"
+           ;;
+       *)
+           echo "and I found the directory library in $ans."
+           libndir="$ans"
+           ;;
+       esac
     fi
-else
-    i_dirent="$undef"
-    if $contains 'd_namlen' /usr/include/sys/dir.h >/dev/null 2>&1; then
+    if $contains 'd_namlen' $xxx >/dev/null 2>&1; then
        d_dirnamlen="$define"
+    fi
+    case "$xxx" in
+    sys/)
+       i_sys_ndir="$define"
+       ;;
+    *)
+       i_ndir="$define"
+       ;;
+    esac
+else
+    # The next line used to require this to be a bsd system.
+    if $contains '^readdir$' libc.list >/dev/null 2>&1 ; then
+       echo "No ndir library found, but you have readdir() so we'll use that."
+       if $contains 'd_namlen' $usrinclude/sys/dir.h >/dev/null 2>&1; then
+           d_dirnamlen="$define"
+       fi
+       i_sys_dir="$define"
     else
-       d_dirnamlen="$undef"
+       echo "No ndir library found--using ./$d_ndir.c."
+# This will lose since $d_ndir.h is in another directory.
+# I doubt we can rely on it being in ../$d_ndir.h . 
+# At least it will fail in a conservative manner.
+       if $contains 'd_namlen' $d_ndir.h >/dev/null 2>&1; then
+           d_dirnamlen="$define"
+       fi
+       i_my_dir="$define"
+       ndirc="$d_ndir.c"
+       ndiro="$d_ndir.o"
     fi
-    echo "No dirent.h found."
 fi
 
 : now see if they want to do setuid emulation
@@ -1749,14 +2022,8 @@ set fchown d_fchown
 eval $inlibc
 
 : see if this is an fcntl system
-echo " "
-if $test -r /usr/include/fcntl.h ; then
-    d_fcntl="$define"
-    echo "fcntl.h found."
-else
-    d_fcntl="$undef"
-    echo "No fcntl.h found, but that's ok."
-fi
+set fcntl d_fcntl
+eval $inlibc
 
 : see if we can have long filenames
 echo " "
@@ -1833,31 +2100,6 @@ else
     fi
 fi
 
-: see if ioctl defs are in sgtty/termio or sys/ioctl
-echo " "
-if $test -r /usr/include/sys/ioctl.h ; then
-    d_ioctl="$define"
-    echo "sys/ioctl.h found."
-else
-    d_ioctl="$undef"
-    echo "sys/ioctl.h not found, assuming ioctl args are defined in sgtty.h."
-fi
-
-: see if there is System V IPC
-set msgget d_ipcmsg
-eval $inlibc
-
-set semget d_ipcsem
-eval $inlibc
-
-set shmget d_ipcshm
-eval $inlibc
-
-case "$d_ipcmsg$d_ipcsem$d_ipcshm" in
-*define*) d_sysvipc="$define";;
-*) d_sysvipc="$undef";;
-esac
-
 : see if killpg exists
 set killpg d_killpg
 eval $inlibc
@@ -1878,9 +2120,40 @@ eval $inlibc
 set mkdir d_mkdir
 eval $inlibc
 
+: see if msgctl exists
+set msgctl d_msgctl
+eval $inlibc
+
+: see if msgget exists
+set msgget d_msgget
+eval $inlibc
+
+: see if msgsnd exists
+set msgsnd d_msgsnd
+eval $inlibc
+
+: see if msgrcv exists
+set msgrcv d_msgrcv
+eval $inlibc
+
+: see how much of the 'msg*(2)' library is present.
+h_msg=true
+echo " "
+case "$d_msgctl$d_msgget$d_msgsnd$d_msgrcv" in
+*undef*) h_msg=false;;
+esac
+: we could also check for sys/ipc.h ...
+if $h_msg && $test -r $usrinclude/sys/msg.h; then
+    echo "You have the full msg*(2) library."
+    d_msg="$define"
+else
+    echo "You don't have the full msg*(2) library."
+    d_msg="$undef"
+fi
+
 : see if ndbm is available
 echo " "
-xxx=`./loc ndbm.h x /usr/include /usr/local/include $inclwanted`
+xxx=`./loc ndbm.h x $usrinclude /usr/local/include $inclwanted`
 if test -f $xxx; then
     d_ndbm="$define"
     echo "ndbm.h found."
@@ -1891,7 +2164,7 @@ fi
 
 : see if we have the old dbm
 echo " "
-xxx=`./loc dbm.h x /usr/include /usr/local/include $inclwanted`
+xxx=`./loc dbm.h x $usrinclude /usr/local/include $inclwanted`
 if test -f $xxx; then
     d_odbm="$define"
     echo "dbm.h found."
@@ -1900,9 +2173,9 @@ else
     echo "dbm.h not found."
 fi
 
-socketlib=''
 : see whether socket exists
 echo " "
+socketlib=''
 if $contains socket libc.list >/dev/null 2>&1; then
     echo "Looks like you have Berkeley networking support."
     d_socket="$define"
@@ -1928,7 +2201,7 @@ else
                nm -g /usr/lib/libnet.a) 2>/dev/null >> libc.list
            if $contains socket libc.list >/dev/null 2>&1; then
                echo "but the Wollongong group seems to have hacked it in."
-               socketlib="-lnet"
+               socketlib="-lnet -lnsl_s"
                d_socket="$define"
                : now check for advanced features
                if $contains setsockopt libc.list >/dev/null 2>&1; then
@@ -1955,58 +2228,102 @@ else
     d_sockpair="$undef"
 fi
 
-: see if this is a pwd system
+: Locate the flags for 'open()'
 echo " "
-if $test -r /usr/include/pwd.h ; then
-    i_pwd="$define"
-    echo "pwd.h found."
-    $cppstdin $cppflags $cppminus </usr/include/pwd.h >$$.h
-    if $contains 'pw_comment' $$.h >/dev/null 2>&1; then
-       d_pwcomment="$define"
+$cat >open3.c <<'EOCP'
+#include <sys/types.h>
+#ifdef I_FCNTL
+#include <fcntl.h>
+#endif
+#ifdef I_SYS_FILE
+#include <sys/file.h>
+#endif
+main() {
+
+       if(O_RDONLY);
+
+#ifdef O_TRUNC
+       exit(0);
+#else
+       exit(1);
+#endif
+}
+EOCP
+: check sys/file.h first to get FREAD on Sun
+if $test -r $usrinclude/sys/file.h && \
+   $cc $cppflags "-DI_SYS_FILE" open3.c -o open3 >/dev/null 2>&1 ; then
+    h_sys_file=true;
+    echo "sys/file.h defines the O_* constants..."
+    if ./open3; then
+       echo "and you have the 3 argument form of open()."
+       d_open3="$define"
     else
-       d_pwcomment="$undef"
+       echo "but not the 3 argument form of open().  Oh, well."
+       d_open3="$undef"
+    fi
+elif $test -r $usrinclude/fcntl.h && \
+   $cc "-DI_FCNTL" open3.c -o open3 >/dev/null 2>&1 ; then
+    h_fcntl=true;
+    echo "fcntl.h defines the O_* constants..."
+    if ./open3; then
+       echo "and you have the 3 argument form of open()."
+       d_open3="$define"
+    else
+       echo "but not the 3 argument form of open().  Oh, well."
+       d_open3="$undef"
     fi
-    if $contains 'pw_quota' $$.h >/dev/null 2>&1; then
+else
+    d_open3="$undef"
+    echo "I can't find the O_* constant definitions!  You got problems."
+fi
+
+: see if how pwd stuff is defined
+echo " "
+if $test -r $usrinclude/pwd.h ; then
+    i_pwd="$define"
+    echo "pwd.h found."
+    $cppstdin $cppflags <$usrinclude/pwd.h >pwd.txt
+    if $contains 'pw_quota' pwd.txt >/dev/null 2>&1; then
        d_pwquota="$define"
     else
        d_pwquota="$undef"
     fi
-    if $contains 'pw_age' $$.h >/dev/null 2>&1; then
+    if $contains 'pw_age' pwd.txt >/dev/null 2>&1; then
        d_pwage="$define"
     else
        d_pwage="$undef"
     fi
-    if $contains 'pw_change' $$.h >/dev/null 2>&1; then
+    if $contains 'pw_change' pwd.txt >/dev/null 2>&1; then
        d_pwchange="$define"
     else
        d_pwchange="$undef"
     fi
-    if $contains 'pw_class' $$.h >/dev/null 2>&1; then
+    if $contains 'pw_class' pwd.txt >/dev/null 2>&1; then
        d_pwclass="$define"
     else
        d_pwclass="$undef"
     fi
-    if $contains 'pw_expire' $$.h >/dev/null 2>&1; then
+    if $contains 'pw_expire' pwd.txt >/dev/null 2>&1; then
        d_pwexpire="$define"
     else
        d_pwexpire="$undef"
     fi
-    rm -f $$.h
+    if $contains 'pw_comment' pwd.txt >/dev/null 2>&1; then
+       d_pwcomment="$define"
+    else
+       d_pwcomment="$undef"
+    fi
 else
     i_pwd="$undef"
-    d_pwcomment="$undef"
     d_pwquota="$undef"
     d_pwage="$undef"
     d_pwchange="$undef"
     d_pwclass="$undef"
     d_pwexpire="$undef"
+    d_pwcomment="$undef"
     echo "No pwd.h found."
 fi
 
-: see if readdir exists
-set readdir d_readdir
-eval $inlibc
-
 : see if rename exists
 set rename d_rename
 eval $inlibc
@@ -2019,6 +2336,33 @@ eval $inlibc
 set select d_select
 eval $inlibc
 
+: see if semctl exists
+set semctl d_semctl
+eval $inlibc
+
+: see if semget exists
+set semget d_semget
+eval $inlibc
+
+: see if semop exists
+set semop d_semop
+eval $inlibc
+
+: see how much of the 'sem*(2)' library is present.
+h_sem=true
+echo " "
+case "$d_semctl$d_semget$d_semop" in
+*undef*) h_sem=false;;
+esac
+: we could also check for sys/ipc.h ...
+if $h_sem && $test -r $usrinclude/sys/sem.h; then
+    echo "You have the full sem*(2) library."
+    d_sem="$define"
+else
+    echo "You don't have the full sem*(2) library."
+    d_sem="$undef"
+fi
+
 : see if setegid exists
 set setegid d_setegid
 eval $inlibc
@@ -2059,10 +2403,41 @@ eval $inlibc
 set setruid d_setruid
 eval $inlibc
 
-: see if stat knows about block sizes
+: see if shmctl exists
+set shmctl d_shmctl
+eval $inlibc
+
+: see if shmget exists
+set shmget d_shmget
+eval $inlibc
+
+: see if shmat exists
+set shmat d_shmat
+eval $inlibc
+
+: see if shmdt exists
+set shmdt d_shmdt
+eval $inlibc
+
+: see how much of the 'shm*(2)' library is present.
+h_shm=true
 echo " "
-if $contains 'st_blocks;' /usr/include/sys/stat.h >/dev/null 2>&1 ; then
-    if $contains 'st_blksize;' /usr/include/sys/stat.h >/dev/null 2>&1 ; then
+case "$d_shmctl$d_shmget$d_shmat$d_shmdt" in
+*undef*) h_shm=false;;
+esac
+: we could also check for sys/ipc.h ...
+if $h_shm && $test -r $usrinclude/sys/shm.h; then
+    echo "You have the full shm*(2) library."
+    d_shm="$define"
+else
+    echo "You don't have the full shm*(2) library."
+    d_shm="$undef"
+fi
+
+: see if stat knows about block sizes
+echo " "
+if $contains 'st_blocks;' $usrinclude/sys/stat.h >/dev/null 2>&1 ; then
+    if $contains 'st_blksize;' $usrinclude/sys/stat.h >/dev/null 2>&1 ; then
        echo "Your stat knows about block sizes."
        d_statblks="$define"
     else
@@ -2076,8 +2451,8 @@ fi
 
 : see if stdio is really std
 echo " "
-if $contains 'char.*_ptr.*;' /usr/include/stdio.h >/dev/null 2>&1 ; then
-    if $contains '_cnt;' /usr/include/stdio.h >/dev/null 2>&1 ; then
+if $contains 'char.*_ptr.*;' $usrinclude/stdio.h >/dev/null 2>&1 ; then
+    if $contains '_cnt;' $usrinclude/stdio.h >/dev/null 2>&1 ; then
        echo "Your stdio is pretty std."
        d_stdstdio="$define"
     else
@@ -2092,7 +2467,7 @@ fi
 : check for structure copying
 echo " "
 echo "Checking to see if your C compiler can copy structs..."
-$cat >try.c <<'EOCP'
+$cat >strctcpy.c <<'EOCP'
 main()
 {
        struct blurfl {
@@ -2102,14 +2477,13 @@ main()
        foo = bar;
 }
 EOCP
-if $cc -c $ccflags try.c >/dev/null 2>&1 ; then
+if $cc -c strctcpy.c >/dev/null 2>&1 ; then
     d_strctcpy="$define"
     echo "Yup, it can."
 else
     d_strctcpy="$undef"
     echo "Nope, it can't."
 fi
-$rm -f try.*
 
 : see if strerror exists
 set strerror d_strerror
@@ -2123,48 +2497,111 @@ eval $inlibc
 set syscall d_syscall
 eval $inlibc
 
-: see if we should include time.h, sys/time.h, or both
+: set if package uses struct tm
+w_s_tm=1
+
+: set if package uses struct timeval
+w_s_timevl=1
+
+: set if package uses localtime function
+w_localtim=1
+
+: see which of time.h, sys/time.h, and sys/select should be included.
+idefs=''
 cat <<'EOM'
   
-Testing to see if we should include <time.h>, <sys/time.h> or both.
-I'm now running the test program...
+Testing to see which of <time.h>, <sys/time.h>, and <sys/select.h>
+should be included, because this application wants:
+
 EOM
-$cat >try.c <<'EOCP'
+case "$w_s_itimer" in
+1)
+    echo "     struct itimerval"
+    idefs="-DS_ITIMERVAL $idefs"
+    ;;
+esac
+case "$w_s_timevl" in
+1)
+    echo "     struct timeval"
+    idefs="-DS_TIMEVAL $idefs"
+    ;;
+esac
+case "$w_s_tm" in
+1)
+    echo "     struct tm"
+    idefs="-DS_TM $idefs"
+    ;;
+esac
+case "$w_localtim" in
+1)
+    echo "     ctime(3) declarations"
+    idefs="-DD_CTIME $idefs"
+    ;;
+esac
+case "$idefs" in
+'')
+    echo "     (something I don't know about)"
+    ;;
+esac
+echo " "
+echo "I'm now running the test program..."
+$cat >i_time.c <<'EOCP'
+#include <sys/types.h>
 #ifdef I_TIME
 #include <time.h>
 #endif
-#ifdef I_SYSTIME
+#ifdef I_SYS_TIME
 #ifdef SYSTIMEKERNEL
 #define KERNEL
 #endif
 #include <sys/time.h>
 #endif
+#ifdef I_SYS_SELECT
+#include <sys/select.h>
+#endif
 main()
 {
     struct tm foo;
+    struct tm *tmp;
 #ifdef S_TIMEVAL
     struct timeval bar;
 #endif
+#ifdef S_ITIMERVAL
+    struct itimerval baz;
+#endif
+
     if (foo.tm_sec == foo.tm_sec)
        exit(0);
 #ifdef S_TIMEVAL
     if (bar.tv_sec == bar.tv_sec)
        exit(0);
+#endif
+#ifdef S_ITIMERVAL
+    if (baz.it_interval == baz.it_interval)
+       exit(0);
+#endif
+#ifdef S_TIMEVAL
+    if (bar.tv_sec == bar.tv_sec)
+       exit(0);
+#endif
+#ifdef D_CTIME
+    /* this might not do anything for us... */
+    tmp = localtime((time_t *)0);
 #endif
     exit(1);
 }
 EOCP
 flags=''
-for s_timeval in '-DS_TIMEVAL' ''; do
+for i_sys_select in '' '-DI_SYS_SELECT'; do
     for d_systimekernel in '' '-DSYSTIMEKERNEL'; do
        for i_time in '' '-DI_TIME'; do
-           for i_systime in '-DI_SYSTIME' ''; do
+           for i_systime in '-DI_SYS_TIME' ''; do
                case "$flags" in
-               '') echo Trying $i_time $i_systime $d_systimekernel $s_timeval
-                   if $cc $ccflags \
-                           $i_time $i_systime $d_systimekernel $s_timeval \
-                           try.c -o try >/dev/null 2>&1 ; then
-                       set X $i_time $i_systime $d_systimekernel $s_timeval
+               '') echo Trying $i_time $i_systime $d_systimekernel $i_sys_select
+                   if $cc $ccflags i_time.c $idefs \
+                           $i_time $i_systime $d_systimekernel $i_sys_select \
+                           -o i_time >/dev/null 2>&1 ; then
+                       set X $i_time $i_systime $d_systimekernel $i_sys_select
                        shift
                        flags="$*"
                        echo Succeeded with $flags
@@ -2184,40 +2621,32 @@ case "$flags" in
 *) i_time="$undef";;
 esac
 case "$flags" in
-*I_SYSTIME*) i_systime="$define";;
-*) i_systime="$undef";;
+*I_SYS_SELECT*) i_sys_select="$define";;
+*) i_sys_select="$undef";;
+esac
+case "$flags" in
+*I_SYS_TIME*) i_sys_time="$define";;
+*) i_sys_time="$undef";;
 esac
-$rm -f try.c try
-
-: see if truncate exists
-set truncate d_truncate
-eval $inlibc
-
-: see if this is a varargs system
-echo " "
-if $test -r /usr/include/varargs.h ; then
-    d_varargs="$define"
-    echo "varargs.h found."
-else
-    d_varargs="$undef"
-    echo "No varargs.h found, but that's ok (I hope)."
-fi
-
-: see if there is a vfork
-set vfork d_vfork
-eval $inlibc
 
 : see if signal is declared as pointer to function returning int or void
 echo " "
-$cppstdin $cppflags $cppminus < /usr/include/signal.h >$$.tmp
-if $contains 'void.*signal' $$.tmp >/dev/null 2>&1 ; then
+$cppstdin $cppflags $cppminus < $usrinclude/signal.h >d_voidsig.txt
+if $contains 'void.*signal' d_voidsig.txt >/dev/null 2>&1 ; then
     echo "You have void (*signal())() instead of int."
     d_voidsig="$define"
 else
     echo "You have int (*signal())() instead of void."
     d_voidsig="$undef"
 fi
-rm -f $$.tmp
+
+: see if truncate exists
+set truncate d_truncate
+eval $inlibc
+
+: see if there is a vfork
+set vfork d_vfork
+eval $inlibc
 
 : check for volatile keyword
 echo " "
@@ -2249,76 +2678,6 @@ eval $inlibc
 set waitpid d_waitpid
 eval $inlibc
 
-: check for void type
-echo " "
-$cat <<EOM
-Checking to see how well your C compiler groks the void type...
-
-  Support flag bits are:
-    1: basic void declarations.
-    2: arrays of pointers to functions returning void.
-    4: operations between pointers to and addresses of void functions.
-
-EOM
-case "$voidflags" in
-'')
-    $cat >try.c <<'EOCP'
-#if TRY & 1
-void main() {
-#else
-main() {
-#endif
-       extern void moo();      /* function returning void */
-       void (*goo)();          /* ptr to func returning void */
-#if TRY & 2
-       void (*foo[10])();
-#endif
-
-#if TRY & 4
-       if(goo == moo) {
-               exit(0);
-       }
-#endif
-       exit(0);
-}
-EOCP
-    if $cc $ccflags -c -DTRY=$defvoidused try.c >.out 2>&1 ; then
-       voidflags=$defvoidused
-       echo "It appears to support void."
-       if $contains warning .out >/dev/null 2>&1; then
-           echo "However, you might get some warnings that look like this:"
-           $cat .out
-       fi
-    else
-       echo "Hmm, your compiler has some difficulty with void.  Checking further..."
-       if $cc $ccflags -c -DTRY=1 try.c >/dev/null 2>&1 ; then
-           echo "It supports 1..."
-           if $cc $ccflags -c -DTRY=3 try.c >/dev/null 2>&1 ; then
-               voidflags=3
-               echo "And it supports 2 but not 4."
-           else
-               echo "It doesn't support 2..."
-               if $cc $ccflags -c -DTRY=5 try.c >/dev/null 2>&1 ; then
-                   voidflags=5
-                   echo "But it supports 4."
-               else
-                   voidflags=1
-                   echo "And it doesn't support 4."
-               fi
-           fi
-       else
-           echo "There is no support at all for void."
-           voidflags=0
-       fi
-    fi
-esac
-dflt="$voidflags";
-rp="Your void support flags add up to what? [$dflt]"
-$echo $n "$rp $c"
-. myread
-voidflags="$ans"
-$rm -f try.* .out
-
 : see what type gids are declared as in the kernel
 echo " "
 case "$gidtype" in
@@ -2327,10 +2686,10 @@ case "$gidtype" in
        dflt='short'
     elif $contains 'getgroups.*int' /usr/lib/lint/llib-lc >/dev/null 2>&1; then
        dflt='int'
-    elif $contains 'gid_t;' /usr/include/sys/types.h >/dev/null 2>&1 ; then
+    elif $contains 'gid_t;' $usrinclude/sys/types.h >/dev/null 2>&1 ; then
        dflt='gid_t'
     else
-       set `grep 'groups\[NGROUPS\];' /usr/include/sys/user.h 2>/dev/null` unsigned short
+       set `grep 'groups\[NGROUPS\];' $usrinclude/sys/user.h 2>/dev/null` unsigned short
        case $1 in
        unsigned) dflt="$1 $2" ;;
        *) dflt="$1" ;;
@@ -2347,112 +2706,20 @@ $echo $n "$rp $c"
 . myread
 gidtype="$ans"
 
-: see if this is an fcntl system
-echo " "
-if $test -r /usr/include/fcntl.h ; then
-    i_fcntl="$define"
-    echo "fcntl.h found."
-else
-    i_fcntl="$undef"
-    echo "No fcntl.h found, but that's ok."
-fi
-
-: see if this is an grp system
-echo " "
-if $test -r /usr/include/grp.h ; then
-    i_grp="$define"
-    echo "grp.h found."
-else
-    i_grp="$undef"
-    echo "No grp.h found."
-fi
-
-: see if this is a netinet/in.h system
-echo " "
-xxx=`./loc netinet/in.h x /usr/include /usr/local/include $inclwanted`
-if test -f $xxx; then
-    i_niin="$define"
-    echo "netinet/in.h found."
-else
-    i_niin="$undef"
-    echo "No netinet/in.h found."
-fi
-
-: see if this is a sys/dir.h system
-echo " "
-if $test -r /usr/include/sys/dir.h ; then
-    i_sysdir="$define"
-    echo "sys/dir.h found."
-else
-    i_sysdir="$undef"
-    echo "No sys/dir.h found."
-fi
-
-: see if ioctl defs are in sgtty/termio or sys/ioctl
-echo " "
-if $test -r /usr/include/sys/ioctl.h ; then
-    i_sysioctl="$define"
-    echo "sys/ioctl.h found."
-else
-    i_sysioctl="$undef"
-    echo "sys/ioctl.h not found, assuming ioctl args are defined in sgtty.h."
-fi
-
-: see if this is a sys/ndir.h system
-echo " "
-xxx=`./loc sys/ndir.h x /usr/include /usr/local/include $inclwanted`
-if test -f $xxx; then
-    i_sysndir="$define"
-    echo "sys/ndir.h found."
-else
-    i_sysndir="$undef"
-    echo "No sys/ndir.h found."
-fi
-
-: see if we should include utime.h
-echo " "
-if $test -r /usr/include/utime.h ; then
-    i_utime="$define"
-    echo "utime.h found."
-else
-    i_utime="$undef"
-    echo "No utime.h found, but that's ok."
-fi
-
-: see if this is a varargs system
-echo " "
-if $test -r /usr/include/varargs.h ; then
-    i_varargs="$define"
-    echo "varargs.h found."
-else
-    i_varargs="$undef"
-    echo "No varargs.h found, but that's ok (I hope)."
-fi
-
-: see if this is a vfork system
-echo " "
-if $test -r /usr/include/vfork.h ; then
-    i_vfork="$define"
-    echo "vfork.h found."
-else
-    i_vfork="$undef"
-    echo "No vfork.h found."
-fi
-
 : check for length of integer
 echo " "
 case "$intsize" in
 '')
     echo "Checking to see how big your integers are..."
-    $cat >try.c <<'EOCP'
+    $cat >intsize.c <<'EOCP'
 #include <stdio.h>
 main()
 {
     printf("%d\n", sizeof(int));
 }
 EOCP
-    if $cc $ccflags try.c -o try >/dev/null 2>&1 ; then
-       dflt=`./try`
+    if $cc intsize.c -o intsize >/dev/null 2>&1 ; then
+       dflt=`./intsize`
     else
        dflt='4'
        echo "(I can't seem to compile the test program.  Guessing...)"
@@ -2466,7 +2733,6 @@ rp="What is the size of an integer (in bytes)? [$dflt]"
 $echo $n "$rp $c"
 . myread
 intsize="$ans"
-$rm -f try.c try
 
 : determine where private executables go
 case "$privlib" in
@@ -2479,20 +2745,37 @@ case "$privlib" in
 esac
 $cat <<EOM
 
-The $package package has some auxiliary files that should be put in a library
-that is accessible by everyone.  Where do you want to put these "private"
+The $package package has some auxiliary files that should be reside in a library
+that is accessible by everyone.  Where should these "private" but accessible
 EOM
-$echo $n "but accessible files? (~name ok) [$dflt] $c"
-rp="Put private files where? [$dflt]"
+$echo $n "files reside? (~name ok) [$dflt] $c"
+rp="Private files will reside where? [$dflt]"
 . myread
 privlib=`./filexp "$ans"`
 
+case "$installprivlib" in
+'')
+    dflt=`echo $privlib | sed 's#^/afs/#/afs/.#'`
+    ;;
+*)  dflt="$installprivlib"
+    ;;
+esac
+$cat <<EOM
+
+On some systems (such as afs) you have to install the library files in a
+different directory to get them to go to the right place.  Where should the
+EOM
+$echo $n "library files be installed? (~name ok) [$dflt] $c"
+rp="Install private files where? [$dflt]"
+. myread
+installprivlib=`./filexp "$ans"`
+
 : check for size of random number generator
 echo " "
 case "$randbits" in
 '')
     echo "Checking to see how many bits your rand function produces..."
-    $cat >try.c <<'EOCP'
+    $cat >randbits.c <<'EOCP'
 #include <stdio.h>
 main()
 {
@@ -2509,8 +2792,8 @@ main()
     printf("%d\n",i);
 }
 EOCP
-    if $cc $ccflags try.c -o try >/dev/null 2>&1 ; then
-       dflt=`./try`
+    if $cc randbits.c -o randbits >/dev/null 2>&1 ; then
+       dflt=`./randbits`
     else
        dflt='?'
        echo "(I can't seem to compile the test program...)"
@@ -2524,14 +2807,56 @@ rp="How many bits does your rand() function produce? [$dflt]"
 $echo $n "$rp $c"
 . myread
 randbits="$ans"
-$rm -f try.c try
+
+: determine where public executables go
+case "$scriptdir" in
+'')
+    dflt="$bin"
+    : guess some guesses
+    test -d /usr/share/scripts && dflt=/usr/share/scripts
+    test -d /usr/share/bin && dflt=/usr/share/bin
+    ;;
+*)  dflt="$scriptdir"
+    ;;
+esac
+cont=true
+$cat <<EOM
+Some installations have a separate directory just for executable scripts so
+that they can mount it across multiple architectures but keep the scripts in
+one spot.  You might, for example, have a subdirectory of /usr/share for this.
+Or you might just lump your scripts in with all your other executables.
+EOM
+while $test "$cont" ; do
+    rp="Where do you keep publicly executable scripts (~name ok)? [$dflt]"
+    $echo $n "$rp $c"
+    . myread
+    scriptdir="$ans"
+    scriptdir=`./filexp "$scriptdir"`
+    if test -d $scriptdir; then
+       cont=''
+    else
+       case "$fastread" in
+       yes) dflt=y;;
+       *) dflt=n;;
+       esac
+       rp="Directory $scriptdir doesn't exist.  Use that name anyway? [$dflt]"
+       $echo $n "$rp $c"
+       . myread
+       dflt=''
+       case "$ans" in
+       y*) cont='';;
+       esac
+    fi
+done
 
 : generate list of signal names
 echo " "
 case "$sig_name" in
 '')
     echo "Generating a list of signal names..."
-    set X `cat /usr/include/signal.h /usr/include/sys/signal.h 2>&1 | awk '
+    set X `cat $usrinclude/signal.h $usrinclude/sys/signal.h 2>&1 | awk '
 $1 ~ /^#define$/ && $2 ~ /^SIG[A-Z0-9]*$/ && $3 ~ /^[1-9][0-9]*$/ {
     sig[$3] = substr($2,4,20)
     if (max < $3 && $3 < 60) {
@@ -2569,7 +2894,7 @@ echo "Signals are: $sig_name"
 
 : see what type of char stdio uses.
 echo " "
-if $contains 'unsigned.*char.*_ptr.*;' /usr/include/stdio.h >/dev/null 2>&1 ; then
+if $contains 'unsigned.*char.*_ptr;' $usrinclude/stdio.h >/dev/null 2>&1 ; then
     echo "Your stdio uses unsigned chars."
     stdchar="unsigned char"
 else
@@ -2580,10 +2905,10 @@ fi
 : see what type uids are declared as in the kernel
 case "$uidtype" in
 '')
-    if $contains 'uid_t;' /usr/include/sys/types.h >/dev/null 2>&1 ; then
+    if $contains 'uid_t;' $usrinclude/sys/types.h >/dev/null 2>&1 ; then
        dflt='uid_t';
     else
-       set `grep '_ruid;' /usr/include/sys/user.h 2>/dev/null` unsigned short
+       set `grep '_ruid;' $usrinclude/sys/user.h 2>/dev/null` unsigned short
        case $1 in
        unsigned) dflt="$1 $2" ;;
        *) dflt="$1" ;;
@@ -2600,9 +2925,79 @@ $echo $n "$rp $c"
 . myread
 uidtype="$ans"
 
+: check for void type
+echo " "
+$cat <<EOM
+Checking to see how well your C compiler groks the void type...
+
+  Support flag bits are:
+    1: basic void declarations.
+    2: arrays of pointers to functions returning void.
+    4: operations between pointers to and addresses of void functions.
+
+EOM
+case "$voidhave" in
+'')
+    $cat >void.c <<'EOCP'
+#if TRY & 1
+void main() {
+#else
+main() {
+#endif
+       extern void moo();      /* function returning void */
+       void (*goo)();          /* ptr to func returning void */
+#if TRY & 2
+       void (*foo[10])();
+#endif
+
+#if TRY & 4
+       if(goo == moo) {
+               exit(0);
+       }
+#endif
+       exit(0);
+}
+EOCP
+    if $cc -S -DTRY=$voidwant void.c >void.out 2>&1 ; then
+       voidhave=$voidwant
+       echo "It appears to support void to the level $package wants ($voidwant)."
+       if $contains warning void.out >/dev/null 2>&1; then
+           echo "However, you might get some warnings that look like this:"
+           $cat void.out
+       fi
+    else
+       echo "Hmm, your compiler has some difficulty with void.  Checking further..."
+       if $cc -S -DTRY=1 void.c >/dev/null 2>&1 ; then
+           echo "It supports 1..."
+           if $cc -S -DTRY=3 void.c >/dev/null 2>&1 ; then
+               voidhave=3
+               echo "And it supports 2 but not 4."
+           else
+               echo "It doesn't support 2..."
+               if $cc -S -DTRY=5 void.c >/dev/null 2>&1 ; then
+                   voidhave=5
+                   echo "But it supports 4."
+               else
+                   voidhave=1
+                   echo "And it doesn't support 4."
+               fi
+           fi
+       else
+           echo "There is no support at all for void."
+           voidhave=0
+       fi
+    fi
+esac
+dflt="$voidhave";
+rp="Your void support flags add up to what? [$dflt]"
+$echo $n "$rp $c"
+. myread
+voidhave="$ans"
+
 : preserve RCS keywords in files with variable substitution, grrr
 Log='$Log'
 Header='$Header'
+Id='$Id'
 
 
 : determine which malloc to compile in
@@ -2630,52 +3025,14 @@ y*) mallocsrc='malloc.c'; mallocobj='malloc.o';;
 *) mallocsrc=''; mallocobj='';;
 esac
 
-: determine where public executables go
-case "$scriptdir" in
-'')
-    dflt="$bin"
-    : guess some guesses
-    test -d /usr/share/scripts && dflt=/usr/share/scripts
-    test -d /usr/share/bin && dflt=/usr/share/bin
-    ;;
-*)  dflt="$scriptdir"
-    ;;
-esac
-cont=true
-$cat <<EOM
-Some installations have a separate directory just for executable scripts so
-that they can mount it across multiple architectures but keep the scripts in
-one spot.  You might, for example, have a subdirectory of /usr/share for this.
-Or you might just lump your scripts in with all your other executables.
-EOM
-while $test "$cont" ; do
-    rp="Where do you keep publicly executable scripts? (~name ok) [$dflt]"
-    $echo $n "$rp $c"
-    . myread
-    scriptdir="$ans"
-    scriptdir=`./filexp "$scriptdir"`
-    if test -d $scriptdir; then
-       cont=''
-    else
-       case "$fastread" in
-       yes) dflt=y;;
-       *) dflt=n;;
-       esac
-       rp="Directory $scriptdir doesn't exist.  Use that name anyway? [$dflt]"
-       $echo $n "$rp $c"
-       . myread
-       dflt=''
-       case "$ans" in
-       y*) cont='';;
-       esac
-    fi
-done
-
 : determine compiler compiler
 case "$yacc" in
-'') dflt=yacc;;
+'') if xenix; then
+       dflt=yacc
+    else
+       dflt='yacc -Sm25000'
+    fi
+    ;;
 *)  dflt="$yacc";;
 esac
 cont=true
@@ -2688,6 +3045,112 @@ case "$ans" in
 esac
 yacc="$ans"
 
+: see if we can include fcntl.h
+echo " "
+if $h_fcntl; then
+    i_fcntl="$define"
+    echo "We'll be including <fcntl.h>."
+else
+    i_fcntl="$undef"
+    if $h_sys_file; then
+       echo "We don't need to <fcntl.h> if we include <sys/file.h>."
+    else
+       echo "We won't be including <fcntl.h>."
+    fi
+fi
+
+: see if gdbm is available
+echo " "
+xxx=`./loc gdbm.h x $usrinclude /usr/local/include $inclwanted`
+if test -f $xxx; then
+    i_gdbm="$define"
+    echo "gdbm.h found."
+else
+    i_gdbm="$undef"
+    echo "gdbm.h not found."
+fi
+
+: see if this is an grp system
+echo " "
+if $test -r $usrinclude/grp.h ; then
+    i_grp="$define"
+    echo "grp.h found."
+else
+    i_grp="$undef"
+    echo "No grp.h found."
+fi
+
+: see if this is a netinet/in.h or sys/in.h system
+echo " "
+xxx=`./loc netinet/in.h x $usrinclude /usr/local/include $inclwanted`
+if test -f $xxx; then
+    i_niin="$define"
+    i_sysin="$undef"
+    echo "netinet/in.h found."
+else
+    i_niin="$undef"
+    echo "No netinet/in.h found, ..."
+    xxx=`./loc sys/in.h x $usrinclude /usr/local/include $inclwanted`
+    if test -f $xxx; then
+       i_sysin="$define"
+       echo "but I found sys/in.h instead."
+    else
+       i_sysin="$undef"
+       echo "and I didn't find sys/in.h either."
+    fi
+fi
+
+: Do we need to #include <sys/file.h> ?
+echo " "
+if $h_sys_file; then
+    i_sys_file="$define"
+    echo "We'll be including <sys/file.h>."
+else
+    i_sys_file="$undef"
+    echo "We won't be including <sys/file.h>."
+fi
+
+: see if ioctl defs are in sgtty/termio or sys/ioctl
+echo " "
+if $test -r $usrinclude/sys/ioctl.h ; then
+    i_sysioctl="$define"
+    echo "sys/ioctl.h found."
+else
+    i_sysioctl="$undef"
+    echo "sys/ioctl.h not found, assuming ioctl args are defined in sgtty.h."
+fi
+
+: see if we should include utime.h
+echo " "
+if $test -r $usrinclude/utime.h ; then
+    i_utime="$define"
+    echo "utime.h found."
+else
+    i_utime="$undef"
+    echo "No utime.h found, but that's ok."
+fi
+
+: see if this is a varargs system
+echo " "
+if $test -r $usrinclude/varargs.h ; then
+    i_varargs="$define"
+    echo "varargs.h found."
+else
+    i_varargs="$undef"
+    echo "No varargs.h found, but that's ok (I hope)."
+fi
+
+: see if this is a vfork system
+echo " "
+if $test -r $usrinclude/vfork.h ; then
+    i_vfork="$define"
+    echo "vfork.h found."
+else
+    i_vfork="$undef"
+    echo "No vfork.h found."
+fi
+
+: end of configuration questions
 echo " "
 echo "End of configuration questions."
 echo " "
@@ -2703,6 +3166,7 @@ $startsh
 # config.sh
 # This file was produced by running the Configure script.
 
+kit_has_binaries='$kit_has_binaries'
 d_eunice='$d_eunice'
 define='$define'
 eunicefix='$eunicefix'
@@ -2757,10 +3221,17 @@ touch='$touch'
 make='$make'
 date='$date'
 csh='$csh'
+bash='$bash'
+ksh='$ksh'
+lex='$lex'
+flex='$flex'
+bison='$bison'
 Log='$Log'
 Header='$Header'
+Id='$Id'
 alignbytes='$alignbytes'
 bin='$bin'
+installbin='$installbin'
 byteorder='$byteorder'
 contains='$contains'
 cppstdin='$cppstdin'
@@ -2789,18 +3260,27 @@ d_getpgrp2='$d_getpgrp2'
 d_getprior='$d_getprior'
 d_htonl='$d_htonl'
 d_index='$d_index'
-d_ioctl='$d_ioctl'
 d_killpg='$d_killpg'
 d_lstat='$d_lstat'
 d_memcmp='$d_memcmp'
 d_memcpy='$d_memcpy'
 d_mkdir='$d_mkdir'
+d_msg='$d_msg'
+d_msgctl='$d_msgctl'
+d_msgget='$d_msgget'
+d_msgrcv='$d_msgrcv'
+d_msgsnd='$d_msgsnd'
 d_ndbm='$d_ndbm'
 d_odbm='$d_odbm'
+d_open3='$d_open3'
 d_readdir='$d_readdir'
 d_rename='$d_rename'
 d_rmdir='$d_rmdir'
 d_select='$d_select'
+d_sem='$d_sem'
+d_semctl='$d_semctl'
+d_semget='$d_semget'
+d_semop='$d_semop'
 d_setegid='$d_setegid'
 d_seteuid='$d_seteuid'
 d_setpgrp='$d_setpgrp'
@@ -2812,6 +3292,11 @@ d_setreuid='$d_setreuid'
 d_setresuid='$d_setresuid'
 d_setrgid='$d_setrgid'
 d_setruid='$d_setruid'
+d_shm='$d_shm'
+d_shmat='$d_shmat'
+d_shmctl='$d_shmctl'
+d_shmdt='$d_shmdt'
+d_shmget='$d_shmget'
 d_socket='$d_socket'
 d_sockpair='$d_sockpair'
 d_oldsock='$d_oldsock'
@@ -2822,43 +3307,49 @@ d_strctcpy='$d_strctcpy'
 d_strerror='$d_strerror'
 d_symlink='$d_symlink'
 d_syscall='$d_syscall'
-d_sysvipc='$d_sysvipc'
-d_ipcmsg='$d_ipcmsg'
-d_ipcsem='$d_ipcsem'
-d_ipcshm='$d_ipcshm'
 d_truncate='$d_truncate'
-d_varargs='$d_varargs'
 d_vfork='$d_vfork'
 d_voidsig='$d_voidsig'
+d_tosignal='$d_tosignal'
 d_volatile='$d_volatile'
 d_vprintf='$d_vprintf'
 d_charvspr='$d_charvspr'
 d_wait4='$d_wait4'
 d_waitpid='$d_waitpid'
 gidtype='$gidtype'
-i_dirent='$i_dirent'
-d_dirnamlen='$d_dirnamlen'
 i_fcntl='$i_fcntl'
+i_gdbm='$i_gdbm'
 i_grp='$i_grp'
 i_niin='$i_niin'
+i_sysin='$i_sysin'
 i_pwd='$i_pwd'
-d_pwcomment='$d_pwcomment'
 d_pwquota='$d_pwquota'
 d_pwage='$d_pwage'
 d_pwchange='$d_pwchange'
 d_pwclass='$d_pwclass'
 d_pwexpire='$d_pwexpire'
-i_sysdir='$i_sysdir'
+d_pwcomment='$d_pwcomment'
+i_sys_file='$i_sys_file'
 i_sysioctl='$i_sysioctl'
-i_sysndir='$i_sysndir'
 i_time='$i_time'
-i_systime='$i_systime'
+i_sys_time='$i_sys_time'
+i_sys_select='$i_sys_select'
 d_systimekernel='$d_systimekernel'
 i_utime='$i_utime'
 i_varargs='$i_varargs'
 i_vfork='$i_vfork'
 intsize='$intsize'
 libc='$libc'
+nm_opts='$nm_opts'
+libndir='$libndir'
+i_my_dir='$i_my_dir'
+i_ndir='$i_ndir'
+i_sys_ndir='$i_sys_ndir'
+i_dirent='$i_dirent'
+i_sys_dir='$i_sys_dir'
+d_dirnamlen='$d_dirnamlen'
+ndirc='$ndirc'
+ndiro='$ndiro'
 mallocsrc='$mallocsrc'
 mallocobj='$mallocobj'
 usemymalloc='$usemymalloc'
@@ -2888,17 +3379,26 @@ sharpbang='$sharpbang'
 startsh='$startsh'
 stdchar='$stdchar'
 uidtype='$uidtype'
-voidflags='$voidflags'
-defvoidused='$defvoidused'
+usrinclude='$usrinclude'
+inclPath='$inclPath'
+void='$void'
+voidhave='$voidhave'
+voidwant='$voidwant'
+w_localtim='$w_localtim'
+w_s_timevl='$w_s_timevl'
+w_s_tm='$w_s_tm'
 yacc='$yacc'
-privlib='$privlib'
 lib='$lib'
+privlib='$privlib'
+installprivlib='$installprivlib'
 CONFIG=true
 EOT
 
+: Finish up
 CONFIG=true
 
 echo " "
+test -f patchlevel.h && awk '{printf "%s=%s\n",$2,$3}' patchlevel.h >>config.sh
 dflt=''
 fastread=''
 echo "If you didn't make any mistakes, then just type a carriage return here."
@@ -2942,7 +3442,7 @@ if test -f config.h.SH; then
     fi
 fi
 
-if $contains '^depend:' Makefile >/dev/null 2>&1; then
+if $contains '^depend:' [Mm]akefile >/dev/null 2>&1; then
     dflt=n
     $cat <<EOM
 
@@ -2960,7 +3460,7 @@ EOM
     *)  echo "You must run 'make depend' then 'make'."
        ;;
     esac
-elif test -f Makefile; then
+elif test -f [Mm]akefile; then
     echo " "
     echo "Now you must run a make."
 else
@@ -2968,8 +3468,5 @@ else
 fi
 
 $rm -f kit*isdone
-: the following is currently useless
-cd UU && $rm -f $rmlist
-: since this removes it all anyway
 cd .. && $rm -rf UU
 : end of Configure
index 19651c0..f5fc76d 100644 (file)
--- a/EXTERN.h
+++ b/EXTERN.h
@@ -1,4 +1,4 @@
-/* $Header: EXTERN.h,v 3.0 89/10/18 15:06:03 lwall Locked $
+/* $Header: EXTERN.h,v 4.0 91/03/20 00:58:26 lwall Locked $
  *
  *    Copyright (c) 1989, Larry Wall
  *
@@ -6,8 +6,8 @@
  *    as specified in the README file that comes with the perl 3.0 kit.
  *
  * $Log:       EXTERN.h,v $
- * Revision 3.0  89/10/18  15:06:03  lwall
- * 3.0 baseline
+ * Revision 4.0  91/03/20  00:58:26  lwall
+ * 4.0 baseline.
  * 
  */
 
index d18b30c..fe60edb 100644 (file)
--- a/INTERN.h
+++ b/INTERN.h
@@ -1,4 +1,4 @@
-/* $Header: INTERN.h,v 3.0 89/10/18 15:06:25 lwall Locked $
+/* $Header: INTERN.h,v 4.0 91/03/20 00:58:35 lwall Locked $
  *
  *    Copyright (c) 1989, Larry Wall
  *
@@ -6,8 +6,8 @@
  *    as specified in the README file that comes with the perl 3.0 kit.
  *
  * $Log:       INTERN.h,v $
- * Revision 3.0  89/10/18  15:06:25  lwall
- * 3.0 baseline
+ * Revision 4.0  91/03/20  00:58:35  lwall
+ * 4.0 baseline.
  * 
  */
 
index 2dd4004..3822640 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -1,4 +1,3 @@
-Changes                        Differences between 2.0 level 18 and 3.0 level 0
 Configure              Run this first
 Copying                        The GNU General Public License
 EXTERN.h               Included before foreign .h files
@@ -8,6 +7,7 @@ Makefile.SH             Precursor to Makefile
 PACKINGLIST            Which files came from which kits
 README                 The Instructions
 README.uport           Special instructions for Microports
+README.xenix           Special instructions for Xenix
 Wishlist               Some things that may or may not happen
 arg.h                  Public declarations for the above
 array.c                        Numerically subscripted arrays
@@ -62,8 +62,11 @@ 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
+emacs/perldb.pl                Emacs debugging
+emacs/perldb.el                Emacs debugging
+emacs/perl-mode.el     Emacs major mode for perl
+emacs/tedstuff         Some optional patches
 eval.c                 The expression evaluator
-evalargs.xc            The arg evaluator of eval.c
 form.c                 Format processing
 form.h                 Public declarations for the above
 gettest                        A little script to test the get* routines
@@ -103,16 +106,17 @@ lib/pwd.pl                Routines to keep track of PWD environment variable
 lib/stat.pl            Perl library supporting stat function
 lib/syslog.pl          Perl library supporting syslogging
 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
 makedepend.SH          Precursor to makedepend
 makedir.SH             Precursor to makedir
-makelib.SH             Deprecated (renamed to h2ph)
 malloc.c               A version of malloc you might not want
 msdos/Changes.dds      Expanation of MS-DOS patches by Diomidis Spinellis
 msdos/Makefile         MS-DOS makefile
 msdos/README.msdos     Compiling and usage information
 msdos/Wishlist.dds     My wishlist
 msdos/config.h         Definitions for msdos
+msdos/chdir.c          A chdir that can change drives
 msdos/dir.h            MS-DOS header for directory access functions
 msdos/directory.c      MS-DOS directory access functions.
 msdos/eg/crlf.bat      Convert files from unix to MS-DOS line termination
@@ -121,15 +125,20 @@ msdos/eg/lf.bat           Convert files from MS-DOS to Unix line termination
 msdos/glob.c           A command equivalent to csh glob
 msdos/msdos.c          MS-DOS ioctl, sleep, gete?[gu]if, spawn, aspawn
 msdos/popen.c          My_popen and my_pclose for MS-DOS
+msdos/usage.c          How to invoke perl under MS-DOS
 os2/Makefile           Makefile for OS/2
 os2/README.OS2         Notes for OS/2
 os2/a2p.cs             Compiler script for a2p
 os2/a2p.def            Linker defs for a2p
+os2/alarm.c            An implementation of alarm()
+os2/alarm.h            Header file for same
 os2/config.h           Configuration file for OS/2
 os2/dir.h              Directory header
 os2/director.c         Directory routines
+os2/eg/alarm.pl                Example of alarm code
 os2/eg/os2.pl          Sample script for OS/2
 os2/eg/syscalls.pl     Example of syscall on OS/2
+os2/glob.c             Globbing routines
 os2/makefile           Make file
 os2/mktemp.c           Mktemp() using TMP
 os2/os2.c              Unix compatibility functions
@@ -137,21 +146,22 @@ os2/perl.bad              names of protect-only API calls for BIND
 os2/perl.cs            Compiler script for perl
 os2/perl.def           Linker defs for perl
 os2/perldb.dif         Changes to make the debugger work
+os2/perlglob.bad       names of protect-only API calls for BIND
 os2/perlglob.cs                Compiler script for perlglob
 os2/perlglob.def       Linker defs for perlglob
 os2/perlsh.cmd         Poor man's shell for os2
 os2/popen.c            Code for opening pipes
+os2/s2p.cmd            s2p as command file
+os2/selfrun.bat                A self running perl script for DOS
 os2/selfrun.cmd                Example of extproc feature
 os2/suffix.c           Code for creating backup filenames
 patchlevel.h           The current patch level of perl
+perl.c                 main()
 perl.h                 Global declarations
-perl.y                 Yacc grammar for perl
-perl_man.1             The manual page(s), first fourth
-perl_man.2             The manual page(s), second fourth
-perl_man.3             The manual page(s), third fourth
-perl_man.4             The manual page(s), fourth fourth
+perl.man               The manual page(s)
 perlsh                 A poor man's perl shell
-perly.c                        main()
+perly.y                        Yacc grammar for perl
+perly.fixer            A program to remove yacc stack limitations
 regcomp.c              Regular expression compiler
 regcomp.h              Private declarations for above
 regexec.c              Regular expression evaluator
@@ -164,80 +174,82 @@ str.c                     String handling package
 str.h                  Public declarations for the above
 t/README               Instructions for regression tests
 t/TEST                 The regression tester
-t/base.cond            See if conditionals work
-t/base.if              See if if works
-t/base.lex             See if lexical items work
-t/base.pat             See if pattern matching works
-t/base.term            See if various terms work
-t/cmd.elsif            See if else-if works
-t/cmd.for              See if for loops work
-t/cmd.mod              See if statement modifiers work
-t/cmd.subval           See if subroutine values work
-t/cmd.switch           See if switch optimizations work
-t/cmd.while            See if while loops work
-t/comp.cmdopt          See if command optimization works
-t/comp.cpp             See if C preprocessor works
-t/comp.decl            See if declarations work
-t/comp.multiline       See if multiline strings work
-t/comp.package         See if packages work
-t/comp.script          See if script invokation works
-t/comp.term            See if more terms work
-t/io.argv              See if ARGV stuff works
-t/io.dup               See if >& works right
-t/io.fs                        See if directory manipulations work
-t/io.inplace           See if inplace editing works
-t/io.pipe              See if secure pipes work
-t/io.print             See if print commands work
-t/io.tell              See if file seeking works
-t/lib.big              See if lib/bigint.pl works
-t/op.append            See if . works
-t/op.array             See if array operations work
-t/op.auto              See if autoincrement et all work
-t/op.chop              See if chop works
-t/op.cond              See if conditional expressions work
-t/op.dbm               See if dbm binding works
-t/op.delete            See if delete works
-t/op.do                        See if subroutines work
-t/op.each              See if associative iterators work
-t/op.eval              See if eval operator works
-t/op.exec              See if exec and system work
-t/op.exp               See if math functions work
-t/op.flip              See if range operator works
-t/op.fork              See if fork works
-t/op.glob              See if <*> works
-t/op.goto              See if goto works
-t/op.index             See if index works
-t/op.int               See if int works
-t/op.join              See if join works
-t/op.list              See if array lists work
-t/op.local             See if local works
-t/op.magic             See if magic variables work
-t/op.mkdir             See if mkdir works
-t/op.oct               See if oct and hex work
-t/op.ord               See if ord works
-t/op.pack              See if pack and unpack work
-t/op.pat               See if esoteric patterns work
-t/op.push              See if push and pop work
-t/op.range             See if .. works
-t/op.read              See if read() works
-t/op.regexp            See if regular expressions work
-t/op.repeat            See if x operator works
-t/op.s                 See if substitutions work
-t/op.sleep             See if sleep works
-t/op.sort              See if sort works
-t/op.split             See if split works
-t/op.sprintf           See if sprintf works
-t/op.stat              See if stat works
-t/op.study             See if study works
-t/op.substr            See if substr works
-t/op.time              See if time functions work
-t/op.undef             See if undef works
-t/op.unshift           See if unshift works
-t/op.vec               See if vectors work
-t/op.write             See if write works
-t/re_tests             Input file for op.regexp
+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.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/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/big.t            See if lib/bigint.pl 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/dbm.t             See if dbm binding works
+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/mkdir.t           See if mkdir works
+t/op/oct.t             See if oct and hex work
+t/op/ord.t             See if ord 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/range.t           See if .. works
+t/op/read.t            See if read() works
+t/op/regexp.t          See if regular expressions work
+t/op/repeat.t          See if x operator works
+t/op/s.t               See if substitutions work
+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/substr.t          See if substr works
+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/op/re_tests          Input file for op.regexp
 toke.c                 The tokener
 usersub.c              User supplied (possibly proprietary) subroutines
+usub/README            Instructions for user supplied subroutines
 usub/Makefile          Makefile for curseperl
 usub/curses.mus                Glue routines for BSD curses
 usub/man2mus           A manual page to .mus translator
@@ -253,6 +265,7 @@ 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/find2perl.SH       A find to perl translator
 x2p/handy.h            Handy definitions
 x2p/hash.c             Associative arrays again
 x2p/hash.h             Public declarations for the above
index 7a2bfeb..af9e4ac 100644 (file)
@@ -5,7 +5,7 @@ case $CONFIG in
        ln ../../config.sh . || \
        ln ../../../config.sh . || \
        (echo "Can't find config.sh."; exit 1)
-    fi
+    fi 2>/dev/null
     . ./config.sh
     ;;
 esac
@@ -25,58 +25,19 @@ esac
 
 echo "Extracting Makefile (with variable substitutions)"
 cat >Makefile <<!GROK!THIS!
-# $Header: Makefile.SH,v 3.0.1.12 91/01/11 17:05:17 lwall Locked $
+# $Header: Makefile.SH,v 4.0 91/03/20 00:58:54 lwall Locked $
 #
 # $Log:        Makefile.SH,v $
-# Revision 3.0.1.12  91/01/11  17:05:17  lwall
-# patch42: added installperl script
+# Revision 4.0  91/03/20  00:58:54  lwall
+# 4.0 baseline.
 # 
-# Revision 3.0.1.11  90/11/10  01:25:51  lwall
-# patch38: new arbitrary precision libraries from Mark Biggar
-# 
-# Revision 3.0.1.10  90/10/20  01:59:21  lwall
-# patch37: added cryptlib support to Makefile
-# 
-# Revision 3.0.1.9  90/10/15  14:41:34  lwall
-# patch29: various portability fixes
-# 
-# Revision 3.0.1.8  90/08/13  21:50:49  lwall
-# patch28: not all yaccs are the same
-# 
-# Revision 3.0.1.7  90/08/09  02:19:56  lwall
-# patch19: Configure now asks where you want to put scripts
-# patch19: Added support for linked-in C subroutines
-# 
-# Revision 3.0.1.6  90/03/27  15:27:15  lwall
-# patch16: MSDOS support
-# 
-# Revision 3.0.1.5  90/03/12  16:15:17  lwall
-# patch13: some dependencies missing on perly.h
-# patch13: some relief for buggy parallel makes
-# patch13: bison doesn't declare extern YYSTYPE yylval;
-# 
-# Revision 3.0.1.4  90/02/28  16:19:43  lwall
-# patch9: extraneous $ on suidperl in Makefile
-# 
-# Revision 3.0.1.3  89/12/21  19:09:26  lwall
-# patch7: Configure now lets you pick between yacc or bison
-# 
-# Revision 3.0.1.2  89/11/11  04:07:30  lwall
-# patch2: $sockethdr incorporated into $ccflags
-# patch2: $libs now has most of the -l libraries
-# 
-# Revision 3.0.1.1  89/10/26  23:00:38  lwall
-# patch1: Makefile.SH needed some more .h dependecies
-# 
-# Revision 3.0  89/10/18  15:06:43  lwall
-# 3.0 baseline
 # 
 
 CC = $cc
 YACC = $yacc
-bin = $bin
+bin = $installbin
 scriptdir = $scriptdir
-privlib = $privlib
+privlib = $installprivlib
 mansrc = $mansrc
 manext = $manext
 CFLAGS = $ccflags $optimize
@@ -113,13 +74,13 @@ h2 = hash.h perl.h regcomp.h regexp.h spat.h stab.h str.h util.h
 h = $(h1) $(h2)
 
 c1 = array.c cmd.c cons.c consarg.c doarg.c doio.c dolist.c dump.c
-c2 = eval.c form.c hash.c $(mallocsrc) perly.c regcomp.c regexec.c
+c2 = eval.c form.c hash.c $(mallocsrc) perl.c regcomp.c regexec.c
 c3 = stab.c str.c toke.c util.c usersub.c
 
 c = $(c1) $(c2) $(c3)
 
 obj1 = array.o cmd.o cons.o consarg.o doarg.o doio.o dolist.o dump.o
-obj2 = eval.o form.o hash.o $(mallocobj) perly.o regcomp.o regexec.o
+obj2 = eval.o form.o hash.o $(mallocobj) perl.o regcomp.o regexec.o
 obj3 = stab.o str.o toke.o util.o
 
 obj = $(obj1) $(obj2) $(obj3)
@@ -140,29 +101,29 @@ SHELL = /bin/sh
 .c.o:
        $(CC) -c $(CFLAGS) $(LARGE) $*.c
 
-all: $(public) $(private) $(util) perl.man uperl.o $(scripts)
+all: $(public) $(private) $(util) uperl.o $(scripts)
        cd x2p; $(MAKE) all
        touch all
 
 # This is the standard version that contains no "taint" checks and is
 # used for all scripts that aren't set-id or running under something set-id.
 
-perl: perl.o $(obj) usersub.o
-       $(CC) $(LARGE) $(CLDFLAGS) $(obj) perl.o usersub.o $(libs) -o perl
+perl: $& perly.o $(obj) usersub.o
+       $(CC) $(LARGE) $(CLDFLAGS) $(obj) perly.o usersub.o $(libs) -o perl
 
-uperl.o: perl.o $(obj)
-       -ld $(LARGE) $(LDFLAGS) -r $(obj) perl.o $(libs) -o uperl.o
+uperl.o: $& perly.o $(obj)
+       -ld $(LARGE) $(LDFLAGS) -r $(obj) perly.o $(libs) -o uperl.o
 
-saber: perl.c
-       # load $(c) perl.c
+saber: perly.c
+       # load $(c) perly.c
 
 # This version, if specified in Configure, does ONLY those scripts which need
 # set-id emulation.  Suidperl must be setuid root.  It contains the "taint"
 # checks as well as the special code to validate that the script in question
 # has been invoked correctly.
 
-suidperl: tperl.o sperly.o $(tobj) usersub.o
-       $(CC) $(LARGE) $(CLDFLAGS) sperly.o $(tobj) tperl.o usersub.o $(libs) \
+suidperl: $& tperly.o sperl.o $(tobj) usersub.o
+       $(CC) $(LARGE) $(CLDFLAGS) sperl.o $(tobj) tperly.o usersub.o $(libs) \
            -o suidperl
 
 # This version interprets scripts that are already set-id either via a wrapper
@@ -170,29 +131,29 @@ suidperl: tperl.o sperly.o $(tobj) usersub.o
 # NOT be setuid to root or anything else.  The only difference between it
 # and normal perl is the presence of the "taint" checks.
 
-taintperl: tperl.o tperly.o $(tobj) usersub.o
-       $(CC) $(LARGE) $(CLDFLAGS) tperly.o $(tobj) tperl.o usersub.o $(libs) \
+taintperl: $& tperly.o tperl.o $(tobj) usersub.o
+       $(CC) $(LARGE) $(CLDFLAGS) tperl.o $(tobj) tperly.o usersub.o $(libs) \
            -o taintperl
 
 # Replicating all this junk is yucky, but I don't see a portable way to fix it.
 
-tperl.o: perl.c perly.h $(h)
-       /bin/rm -f tperl.c
-       $(SLN) perl.c tperl.c
-       $(CC) -c -DTAINT $(CFLAGS) $(LARGE) tperl.c
-       /bin/rm -f tperl.c
-
 tperly.o: perly.c perly.h $(h)
        /bin/rm -f tperly.c
        $(SLN) perly.c tperly.c
        $(CC) -c -DTAINT $(CFLAGS) $(LARGE) tperly.c
        /bin/rm -f tperly.c
 
-sperly.o: perly.c perly.h patchlevel.h $(h)
-       /bin/rm -f sperly.c
-       $(SLN) perly.c sperly.c
-       $(CC) -c -DTAINT -DIAMSUID $(CFLAGS) $(LARGE) sperly.c
-       /bin/rm -f sperly.c
+tperl.o: perl.c perly.h patchlevel.h perl.h $(h)
+       /bin/rm -f tperl.c
+       $(SLN) perl.c tperl.c
+       $(CC) -c -DTAINT $(CFLAGS) $(LARGE) tperl.c
+       /bin/rm -f tperl.c
+
+sperl.o: perl.c perly.h patchlevel.h $(h)
+       /bin/rm -f sperl.c
+       $(SLN) perl.c sperl.c
+       $(CC) -c -DTAINT -DIAMSUID $(CFLAGS) $(LARGE) sperl.c
+       /bin/rm -f sperl.c
 
 tarray.o: array.c $(h)
        /bin/rm -f tarray.c
@@ -296,38 +257,33 @@ tutil.o: util.c $(h)
        $(CC) -c -DTAINT $(CFLAGS) $(LARGE) tutil.c
        /bin/rm -f tutil.c
 
-perly.h: perl.c
+perly.h: perly.c
        @ echo Dummy dependency for dumb parallel make
        touch perly.h
 
-perl.c: perl.y
+perly.c: perly.y
        @ echo 'Expect either' 29 shift/reduce and 59 reduce/reduce conflicts...
        @ echo '           or' 27 shift/reduce and 61 reduce/reduce conflicts...
-       $(YACC) -d perl.y
-       mv y.tab.c perl.c
+       $(YACC) -d perly.y
+       sh perly.fixer y.tab.c perly.c
        mv y.tab.h perly.h
        echo 'extern YYSTYPE yylval;' >>perly.h
 
-perl.o: perl.c perly.h $(h)
-       $(CC) -c $(CFLAGS) $(LARGE) perl.c
-
-perl.man: perl_man.1 perl_man.2 perl_man.3 perl_man.4 patchlevel.h perl
-       ./perl  -e '($$r,$$p)=$$]=~/(\d+\.\d+).*\n\D*(\d+)/;' \
-               -e 'print ".ds RP Release $$r Patchlevel $$p\n";' >perl.man
-       cat perl_man.[1-4] >>perl.man
+perly.o: perly.c perly.h $(h)
+       $(CC) -c $(CFLAGS) $(LARGE) perly.c
 
 install: all
        ./perl installperl
        cd x2p; $(MAKE) install
 
 clean:
-       rm -f *.o all perl taintperl suidperl perl.man
+       rm -f *.o all perl taintperl suidperl
        cd x2p; $(MAKE) clean
 
 realclean: clean
        cd x2p; $(MAKE) realclean
        rm -f *.orig */*.orig *~ */*~ core $(addedbyconf) h2ph h2ph.man
-       rm -f perl.c perly.h t/perl Makefile config.h makedepend makedir
+       rm -f perly.c perly.h t/perl Makefile config.h makedepend makedir
        rm -f x2p/Makefile
 
 # The following lint has practically everything turned on.  Unfortunately,
@@ -335,8 +291,8 @@ realclean: clean
 # If the source file has a /*NOSTRICT*/ somewhere, ignore the lint message
 # for that spot.
 
-lint: perl.c $(c)
-       lint $(lintflags) $(defs) perl.c $(c) > perl.fuzz
+lint: perly.c $(c)
+       lint $(lintflags) $(defs) perly.c $(c) > perl.fuzz
 
 depend: makedepend
        - test -f perly.h || cp /dev/null perly.h
@@ -345,8 +301,8 @@ depend: makedepend
        cd x2p; $(MAKE) depend
 
 test: perl
-       - chmod +x t/TEST t/base.* t/comp.* t/cmd.* t/io.* t/op.* t/lib.*; \
-       cd t && (rm -f perl; $(SLN) ../perl .) && ./perl TEST
+       - cd t && chmod +x TEST */*.t
+       - cd t && (rm -f perl; $(SLN) ../perl .) && ./perl TEST </dev/tty
 
 clist:
        echo $(c) | tr ' ' '\012' >.clist
index 1232dec..b43c3a8 100644 (file)
@@ -2,196 +2,288 @@ After all the perl kits are run you should have the following files:
 
 Filename               Kit Description
 --------               --- -----------
-Changes                 20 Differences between 2.0 level 18 and 3.0 level 0
-Configure                2 Run this first
-Copying                 10 The GNU General Public License
-EXTERN.h                24 Included before foreign .h files
-INTERN.h                24 Included before domestic .h files
-MANIFEST                20 This list of files
-Makefile.SH             19 Precursor to Makefile
-PACKINGLIST             18 Which files came from which kits
+Configure:AA             3 Run this first
+Configure:AB            20 
+Copying                 26 The GNU General Public License
+EXTERN.h                36 Included before foreign .h files
+INTERN.h                36 Included before domestic .h files
+MANIFEST                13 This list of files
+Makefile.SH             28 Precursor to Makefile
+PACKINGLIST             16 Which files came from which kits
 README                   1 The Instructions
-Wishlist                24 Some things that may or may not happen
-arg.h                   11 Public declarations for the above
-array.c                 21 Numerically subscripted arrays
-array.h                 24 Public declarations for the above
-client                  24 A client to test sockets
-cmd.c                   15 Command interpreter
-cmd.h                   21 Public declarations for the above
-config.H                15 Sample config.h
-config.h.SH             14 Produces config.h
-cons.c                  10 Routines to construct cmd nodes of a parse tree
-consarg.c               14 Routines to construct arg nodes of a parse tree
-doarg.c                 11 Scalar expression evaluation
-doio.c                   7 I/O operations
-dolist.c                16 Array expression evaluation
-dump.c                  20 Debugging output
-eg/ADB                  24 An adb wrapper to put in your crash dir
+README.uport             1 Special instructions for Microports
+README.xenix             1 Special instructions for Xenix
+Wishlist                36 Some things that may or may not happen
+arg.h                   19 Public declarations for the above
+array.c                 30 Numerically subscripted arrays
+array.h                 35 Public declarations for the above
+client                  35 A client to test sockets
+cmd.c                   18 Command interpreter
+cmd.h                   30 Public declarations for the above
+config.H                25 Sample config.h
+config_h.SH             24 Produces config.h
+cons.c                  13 Routines to construct cmd nodes of a parse tree
+consarg.c               19 Routines to construct arg nodes of a parse tree
+doarg.c                 12 Scalar expression evaluation
+doio.c:AA                5 I/O operations
+doio.c:AB               28 
+dolist.c                11 Array expression evaluation
+dump.c                  25 Debugging output
+eg/ADB                  36 An adb wrapper to put in your crash dir
 eg/README                1 Intro to example perl scripts
-eg/changes              23 A program to list recently changed files
-eg/down                 24 A program to do things to subdirectories
-eg/dus                  24 A program to do du -s on non-mounted dirs
-eg/findcp               17 A find wrapper that implements a -cp switch
-eg/findtar              24 A find wrapper that pumps out a tar file
-eg/g/gcp                22 A program to do a global rcp
-eg/g/gcp.man            23 Manual page for gcp
-eg/g/ged                24 A program to do a global edit
-eg/g/ghosts             22 A sample /etc/ghosts file
-eg/g/gsh                22 A program to do a global rsh
-eg/g/gsh.man            21 Manual page for gsh
-eg/muck                 22 A program to find missing make dependencies
-eg/muck.man             24 Manual page for muck
-eg/myrup                23 A program to find lightly loaded machines
-eg/nih                  24 Script to insert #! workaround
-eg/rename               24 A program to rename files
-eg/rmfrom               24 A program to feed doomed filenames to
-eg/scan/scan_df         23 Scan for filesystem anomalies
-eg/scan/scan_last       23 Scan for login anomalies
-eg/scan/scan_messages   21 Scan for console message anomalies
-eg/scan/scan_passwd      6 Scan for passwd file anomalies
-eg/scan/scan_ps         24 Scan for process anomalies
-eg/scan/scan_sudo       23 Scan for sudo anomalies
-eg/scan/scan_suid       22 Scan for setuid anomalies
-eg/scan/scanner         23 An anomaly reporter
-eg/shmkill              23 A program to remove unused shared memory
-eg/van/empty            24 A program to empty the trashcan
-eg/van/unvanish         23 A program to undo what vanish does
-eg/van/vanexp           24 A program to expire vanished files
-eg/van/vanish           23 A program to put files in a trashcan
-eg/who                  24 A sample who program
-eval.c                   3 The expression evaluator
-evalargs.xc             19 The arg evaluator of eval.c
-form.c                  20 Format processing
-form.h                  24 Public declarations for the above
-gettest                 24 A little script to test the get* routines
-handy.h                 22 Handy definitions
-hash.c                  18 Associative arrays
-hash.h                  23 Public declarations for the above
-ioctl.pl                21 Sample ioctl.pl
-lib/abbrev.pl           24 An abbreviation table builder
-lib/complete.pl         23 A command completion subroutine
-lib/dumpvar.pl          24 A variable dumper
-lib/getopt.pl           23 Perl library supporting option parsing
-lib/getopts.pl          24 Perl library supporting option parsing
-lib/importenv.pl        24 Perl routine to get environment into variables
-lib/look.pl             23 A "look" equivalent
-lib/perldb.pl           18 Perl debugging routines
-lib/stat.pl             24 Perl library supporting stat function
-lib/termcap.pl          22 Perl library supporting termcap usage
-lib/validate.pl         21 Perl library supporting wholesale file mode validation
-makedepend.SH           21 Precursor to makedepend
-makedir.SH              23 Precursor to makedir
-makelib.SH              21 A thing to turn C .h file into perl .h files
-malloc.c                19 A version of malloc you might not want
-patchlevel.h            10 The current patch level of perl
-perl.h                   8 Global declarations
-perl.man.1               1 The manual page(s), first fourth
-perl.man.2               9 The manual page(s), second fourth
-perl.man.3               8 The manual page(s), third fourth
-perl.man.4               6 The manual page(s), fourth fourth
-perl.y                  12 Yacc grammar for perl
-perlsh                  24 A poor man's perl shell
-perly.c                 17 main()
-regcomp.c               12 Regular expression compiler
-regcomp.h                7 Private declarations for above
-regexec.c               13 Regular expression evaluator
-regexp.h                23 Public declarations for the above
-server                  24 A server to test sockets
-spat.h                  23 Search pattern declarations
-stab.c                   9 Symbol table stuff
-stab.h                  20 Public declarations for the above
-str.c                   13 String handling package
-str.h                   14 Public declarations for the above
+eg/changes              35 A program to list recently changed files
+eg/down                 36 A program to do things to subdirectories
+eg/dus                  35 A program to do du -s on non-mounted dirs
+eg/findcp               34 A find wrapper that implements a -cp switch
+eg/findtar              22 A find wrapper that pumps out a tar file
+eg/g/gcp                33 A program to do a global rcp
+eg/g/gcp.man            34 Manual page for gcp
+eg/g/ged                15 A program to do a global edit
+eg/g/ghosts             35 A sample /etc/ghosts file
+eg/g/gsh                32 A program to do a global rsh
+eg/g/gsh.man            33 Manual page for gsh
+eg/muck                 33 A program to find missing make dependencies
+eg/muck.man             35 Manual page for muck
+eg/myrup                35 A program to find lightly loaded machines
+eg/nih                  36 Script to insert #! workaround
+eg/relink               33 A program to change symbolic links
+eg/rename               34 A program to rename files
+eg/rmfrom               20 A program to feed doomed filenames to
+eg/scan/scan_df         34 Scan for filesystem anomalies
+eg/scan/scan_last       34 Scan for login anomalies
+eg/scan/scan_messages   30 Scan for console message anomalies
+eg/scan/scan_passwd     35 Scan for passwd file anomalies
+eg/scan/scan_ps         10 Scan for process anomalies
+eg/scan/scan_sudo       33 Scan for sudo anomalies
+eg/scan/scan_suid       33 Scan for setuid anomalies
+eg/scan/scanner         33 An anomaly reporter
+eg/shmkill              35 A program to remove unused shared memory
+eg/sysvipc/README        1 Intro to Sys V IPC examples
+eg/sysvipc/ipcmsg       35 Example of SYS V IPC message queues
+eg/sysvipc/ipcsem       35 Example of Sys V IPC semaphores
+eg/sysvipc/ipcshm       35 Example of Sys V IPC shared memory
+eg/travesty             35 A program to print travesties of its input text
+eg/van/empty            35 A program to empty the trashcan
+eg/van/unvanish         34 A program to undo what vanish does
+eg/van/vanexp           36 A program to expire vanished files
+eg/van/vanish           34 A program to put files in a trashcan
+eg/who                  36 A sample who program
+emacs/perl-mode.el      21 Emacs major mode for perl
+emacs/perldb.el         17 Emacs debugging
+emacs/perldb.pl         15 Emacs debugging
+emacs/tedstuff          27 Some optional patches
+eval.c:AA                2 The expression evaluator
+eval.c:AB               20 
+form.c                  28 Format processing
+form.h                  35 Public declarations for the above
+gettest                 35 A little script to test the get* routines
+h2ph.SH                 11 A thing to turn C .h file into perl .ph files
+h2pl/README              1 How to turn .ph files into .pl files
+h2pl/cbreak.pl          35 cbreak routines using .ph
+h2pl/cbreak2.pl         35 cbreak routines using .pl
+h2pl/eg/sizeof.ph       36 Sample sizeof array initialization
+h2pl/eg/sys/errno.pl    31 Sample translated errno.pl
+h2pl/eg/sys/ioctl.pl    31 Sample translated ioctl.pl
+h2pl/eg/sysexits.pl     36 Sample translated sysexits.pl
+h2pl/getioctlsizes      36 Program to extract types from ioctl.h
+h2pl/mksizes            35 Program to make %sizeof array.
+h2pl/mkvars             35 Program to make .pl from .ph files
+h2pl/tcbreak            36 cbreak test routine using .ph
+h2pl/tcbreak2           14 cbreak test routine using .pl
+handy.h                 32 Handy definitions
+hash.c                  26 Associative arrays
+hash.h                  34 Public declarations for the above
+installperl             31 Perl script to do "make install" dirty work
+ioctl.pl                31 Sample ioctl.pl
+lib/abbrev.pl           35 An abbreviation table builder
+lib/bigfloat.pl         26 An arbitrary precision floating point package
+lib/bigint.pl           29 An arbitrary precision integer arithmetic package
+lib/bigrat.pl           31 An arbitrary precision rational arithmetic package
+lib/cacheout.pl         35 Manages output filehandles when you need too many
+lib/complete.pl         33 A command completion subroutine
+lib/ctime.pl            29 A ctime workalike
+lib/dumpvar.pl          35 A variable dumper
+lib/flush.pl            36 Routines to do single flush
+lib/getopt.pl           34 Perl library supporting option parsing
+lib/getopts.pl          35 Perl library supporting option parsing
+lib/importenv.pl        36 Perl routine to get environment into variables
+lib/look.pl             34 A "look" equivalent
+lib/perldb.pl           25 Perl debugging routines
+lib/pwd.pl              34 Routines to keep track of PWD environment variable
+lib/stat.pl             35 Perl library supporting stat function
+lib/syslog.pl           29 Perl library supporting syslogging
+lib/termcap.pl          32 Perl library supporting termcap usage
+lib/timelocal.pl        33 Perl library supporting inverse of localtime, gmtime
+lib/validate.pl         32 Perl library supporting wholesale file mode validation
+makedepend.SH           31 Precursor to makedepend
+makedir.SH              34 Precursor to makedir
+malloc.c                12 A version of malloc you might not want
+msdos/Changes.dds       33 Expanation of MS-DOS patches by Diomidis Spinellis
+msdos/Makefile          33 MS-DOS makefile
+msdos/README.msdos       1 Compiling and usage information
+msdos/Wishlist.dds      18 My wishlist
+msdos/chdir.c           33 A chdir that can change drives
+msdos/config.h          22 Definitions for msdos
+msdos/dir.h             34 MS-DOS header for directory access functions
+msdos/directory.c       31 MS-DOS directory access functions.
+msdos/eg/crlf.bat       35 Convert files from unix to MS-DOS line termination
+msdos/eg/drives.bat     34 List the system drives and their characteristics
+msdos/eg/lf.bat         35 Convert files from MS-DOS to Unix line termination
+msdos/glob.c            36 A command equivalent to csh glob
+msdos/msdos.c           30 MS-DOS ioctl, sleep, gete?[gu]if, spawn, aspawn
+msdos/popen.c           32 My_popen and my_pclose for MS-DOS
+msdos/usage.c           34 How to invoke perl under MS-DOS
+os2/Makefile            32 Makefile for OS/2
+os2/README.OS2           1 Notes for OS/2
+os2/a2p.cs              13 Compiler script for a2p
+os2/a2p.def             36 Linker defs for a2p
+os2/alarm.c             31 An implementation of alarm()
+os2/alarm.h             36 Header file for same
+os2/config.h            18 Configuration file for OS/2
+os2/dir.h               33 Directory header
+os2/director.c          30 Directory routines
+os2/eg/alarm.pl         36 Example of alarm code
+os2/eg/os2.pl           33 Sample script for OS/2
+os2/eg/syscalls.pl      36 Example of syscall on OS/2
+os2/glob.c              36 Globbing routines
+os2/makefile            32 Make file
+os2/mktemp.c            36 Mktemp() using TMP
+os2/os2.c               29 Unix compatibility functions
+os2/perl.bad            36 names of protect-only API calls for BIND
+os2/perl.cs             35 Compiler script for perl
+os2/perl.def            19 Linker defs for perl
+os2/perldb.dif          34 Changes to make the debugger work
+os2/perlglob.bad        36 names of protect-only API calls for BIND
+os2/perlglob.cs         36 Compiler script for perlglob
+os2/perlglob.def        36 Linker defs for perlglob
+os2/perlsh.cmd          36 Poor man's shell for os2
+os2/popen.c             29 Code for opening pipes
+os2/s2p.cmd             27 s2p as command file
+os2/selfrun.bat         36 A self running perl script for DOS
+os2/selfrun.cmd         26 Example of extproc feature
+os2/suffix.c            31 Code for creating backup filenames
+patchlevel.h            36 The current patch level of perl
+perl.c                  15 main()
+perl.h                  24 Global declarations
+perl.man:AA              6 The manual page(s)
+perl.man:AB              7 
+perl.man:AC              8 
+perl.man:AD             10 
+perlsh                  36 A poor man's perl shell
+perly.fixer             34 A program to remove yacc stack limitations
+perly.y                 22 Yacc grammar for perl
+regcomp.c               17 Regular expression compiler
+regcomp.h               29 Private declarations for above
+regexec.c               21 Regular expression evaluator
+regexp.h                35 Public declarations for the above
+server                  35 A server to test sockets
+spat.h                  34 Search pattern declarations
+stab.c                  23 Symbol table stuff
+stab.h                  31 Public declarations for the above
+str.c                   14 String handling package
+str.h                   30 Public declarations for the above
 t/README                 1 Instructions for regression tests
-t/TEST                  23 The regression tester
-t/base.cond             24 See if conditionals work
-t/base.if               24 See if if works
-t/base.lex              23 See if lexical items work
-t/base.pat              24 See if pattern matching works
-t/base.term             24 See if various terms work
-t/cmd.elsif             24 See if else-if works
-t/cmd.for               23 See if for loops work
-t/cmd.mod               24 See if statement modifiers work
-t/cmd.subval            22 See if subroutine values work
-t/cmd.switch            12 See if switch optimizations work
-t/cmd.while             22 See if while loops work
-t/comp.cmdopt           22 See if command optimization works
-t/comp.cpp              24 See if C preprocessor works
-t/comp.decl             24 See if declarations work
-t/comp.multiline        24 See if multiline strings work
-t/comp.package          24 See if packages work
-t/comp.script           24 See if script invokation works
-t/comp.term             23 See if more terms work
-t/io.argv               23 See if ARGV stuff works
-t/io.dup                24 See if >& works right
-t/io.fs                 22 See if directory manipulations work
-t/io.inplace            24 See if inplace editing works
-t/io.pipe               24 See if secure pipes work
-t/io.print              24 See if print commands work
-t/io.tell               23 See if file seeking works
-t/op.append             24 See if . works
-t/op.array              22 See if array operations work
-t/op.auto               18 See if autoincrement et all work
-t/op.chop               24 See if chop works
-t/op.cond               24 See if conditional expressions work
-t/op.dbm                22 See if dbm binding works
-t/op.delete             24 See if delete works
-t/op.do                 23 See if subroutines work
-t/op.each               23 See if associative iterators work
-t/op.eval               23 See if eval operator works
-t/op.exec               24 See if exec and system work
-t/op.exp                 1 See if math functions work
-t/op.flip               24 See if range operator works
-t/op.fork               24 See if fork works
-t/op.glob               24 See if <*> works
-t/op.goto               24 See if goto works
-t/op.index              24 See if index works
-t/op.int                24 See if int works
-t/op.join               24 See if join works
-t/op.list               10 See if array lists work
-t/op.local              24 See if local works
-t/op.magic              23 See if magic variables work
-t/op.mkdir              24 See if mkdir works
-t/op.oct                24 See if oct and hex work
-t/op.ord                24 See if ord works
-t/op.pack               24 See if pack and unpack work
-t/op.pat                22 See if esoteric patterns work
-t/op.push               15 See if push and pop work
-t/op.range              24 See if .. works
-t/op.read               24 See if read() works
-t/op.regexp             24 See if regular expressions work
-t/op.repeat             23 See if x operator works
-t/op.sleep               8 See if sleep works
-t/op.sort               24 See if sort works
-t/op.split              13 See if split works
-t/op.sprintf            24 See if sprintf works
-t/op.stat               21 See if stat works
-t/op.study              23 See if study works
-t/op.subst              21 See if substitutions work
-t/op.substr             23 See if substr works
-t/op.time               23 See if time functions work
-t/op.undef              23 See if undef works
-t/op.unshift            24 See if unshift works
-t/op.vec                24 See if vectors work
-t/op.write              23 See if write works
-t/re_tests              22 Input file for op.regexp
-toke.c                   5 The tokener
-util.c                  17 Utility routines
-util.h                  24 Public declarations for the above
-x2p/EXTERN.h            24 Same as above
-x2p/INTERN.h            24 Same as above
-x2p/Makefile.SH         22 Precursor to Makefile
-x2p/a2p.h               20 Global declarations
-x2p/a2p.man             20 Manual page for awk to perl translator
-x2p/a2p.y               19 A yacc grammer for awk
-x2p/a2py.c              16 Awk compiler, sort of
-x2p/handy.h             24 Handy definitions
-x2p/hash.c              21 Associative arrays again
-x2p/hash.h              23 Public declarations for the above
-x2p/s2p.SH              18 Sed to perl translator
-x2p/s2p.man             22 Manual page for sed to perl translator
-x2p/str.c               19 String handling package
-x2p/str.h               23 Public declarations for the above
-x2p/util.c              15 Utility routines
-x2p/util.h              24 Public declarations for the above
-x2p/walk.c               4 Parse tree walker
+t/TEST                  34 The regression tester
+t/base/cond.t           36 See if conditionals work
+t/base/if.t             36 See if if works
+t/base/lex.t            34 See if lexical items work
+t/base/pat.t            36 See if pattern matching works
+t/base/term.t           17 See if various terms work
+t/cmd/elsif.t           35 See if else-if works
+t/cmd/for.t             35 See if for loops work
+t/cmd/mod.t             35 See if statement modifiers work
+t/cmd/subval.t          32 See if subroutine values work
+t/cmd/switch.t          34 See if switch optimizations work
+t/cmd/while.t            1 See if while loops work
+t/comp/cmdopt.t         33 See if command optimization works
+t/comp/cpp.t            35 See if C preprocessor works
+t/comp/decl.t           36 See if declarations work
+t/comp/multiline.t      35 See if multiline strings work
+t/comp/package.t        35 See if packages work
+t/comp/script.t         35 See if script invokation works
+t/comp/term.t           34 See if more terms work
+t/io/argv.t             35 See if ARGV stuff works
+t/io/dup.t              35 See if >& works right
+t/io/fs.t               32 See if directory manipulations work
+t/io/inplace.t          12 See if inplace editing works
+t/io/pipe.t             35 See if secure pipes work
+t/io/print.t            36 See if print commands work
+t/io/tell.t             34 See if file seeking works
+t/lib/big.t             31 See if lib/bigint.pl works
+t/op/append.t           36 See if . works
+t/op/array.t            31 See if array operations work
+t/op/auto.t             23 See if autoincrement et all work
+t/op/chop.t             35 See if chop works
+t/op/cond.t             36 See if conditional expressions work
+t/op/dbm.t              33 See if dbm binding works
+t/op/delete.t           16 See if delete works
+t/op/do.t               27 See if subroutines work
+t/op/each.t             34 See if associative iterators work
+t/op/eval.t             21 See if eval operator works
+t/op/exec.t             35 See if exec and system work
+t/op/exp.t              35 See if math functions work
+t/op/flip.t             35 See if range operator works
+t/op/fork.t             36 See if fork works
+t/op/glob.t             36 See if <*> works
+t/op/goto.t             35 See if goto works
+t/op/groups.t           35 See if $( works
+t/op/index.t            34 See if index works
+t/op/int.t              36 See if int works
+t/op/join.t             36 See if join works
+t/op/list.t             33 See if array lists work
+t/op/local.t            35 See if local works
+t/op/magic.t            35 See if magic variables work
+t/op/mkdir.t            36 See if mkdir works
+t/op/oct.t              36 See if oct and hex work
+t/op/ord.t              36 See if ord works
+t/op/pack.t             35 See if pack and unpack work
+t/op/pat.t              28 See if esoteric patterns work
+t/op/push.t             34 See if push and pop work
+t/op/range.t            35 See if .. works
+t/op/re_tests           32 Input file for op.regexp
+t/op/read.t             36 See if read() works
+t/op/regexp.t           35 See if regular expressions work
+t/op/repeat.t           34 See if x operator works
+t/op/s.t                30 See if substitutions work
+t/op/sleep.t            36 See if sleep works
+t/op/sort.t             35 See if sort works
+t/op/split.t            34 See if split works
+t/op/sprintf.t          34 See if sprintf works
+t/op/stat.t             30 See if stat works
+t/op/study.t            30 See if study works
+t/op/substr.t           32 See if substr works
+t/op/time.t             35 See if time functions work
+t/op/undef.t            34 See if undef works
+t/op/unshift.t          36 See if unshift works
+t/op/vec.t              35 See if vectors work
+t/op/write.t            33 See if write works
+toke.c:AA                4 The tokener
+toke.c:AB               28 
+usersub.c               32 User supplied (possibly proprietary) subroutines
+usub/Makefile           36 Makefile for curseperl
+usub/README              1 Instructions for user supplied subroutines
+usub/curses.mus         26 Glue routines for BSD curses
+usub/man2mus            34 A manual page to .mus translator
+usub/mus                33 A .mus to .c translator
+usub/pager              32 A sample pager in curseperl
+usub/usersub.c          36 An initialization file to call curses glue routines
+util.c                  16 Utility routines
+util.h                  35 Public declarations for the above
+x2p/EXTERN.h            36 Same as above
+x2p/INTERN.h            36 Same as above
+x2p/Makefile.SH         32 Precursor to Makefile
+x2p/a2p.h               29 Global declarations
+x2p/a2p.man             29 Manual page for awk to perl translator
+x2p/a2p.y               28 A yacc grammer for awk
+x2p/a2py.c              23 Awk compiler, sort of
+x2p/find2perl.SH        14 A find to perl translator
+x2p/handy.h             35 Handy definitions
+x2p/hash.c              30 Associative arrays again
+x2p/hash.h              34 Public declarations for the above
+x2p/s2p.SH              27 Sed to perl translator
+x2p/s2p.man             33 Manual page for sed to perl translator
+x2p/str.c               27 String handling package
+x2p/str.h               34 Public declarations for the above
+x2p/util.c              24 Utility routines
+x2p/util.h              35 Public declarations for the above
+x2p/walk.c               9 Parse tree walker
diff --git a/README b/README
index bca6537..4f80bc6 100644 (file)
--- a/README
+++ b/README
@@ -1,7 +1,7 @@
 
-                       Perl Kit, Version 3.0
+                       Perl Kit, Version 4.0
 
-                Copyright (c) 1989,1990, Larry Wall
+               Copyright (c) 1989,1990,1991, Larry Wall
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -55,7 +55,8 @@ Installation
 1)  Run Configure.  This will figure out various things about your system.
     Some things Configure will figure out for itself, other things it will
     ask you about.  It will then proceed to make config.h, config.sh, and
-    Makefile.
+    Makefile.  If you're a hotshot, run Configure -d to take all the
+    defaults and then edit config.sh to patch up any flaws.
 
     You might possibly have to trim # comments from the front of Configure
     if your sh doesn't handle them, but all other # comments will be taken
@@ -95,20 +96,23 @@ Installation
     absence of a specific rule.
 
     The 3b2 needs to turn off -O.
+    Compilers with limited switch tables may have to define -DSMALLSWITCHES
     Domain/OS 10.3 (at least) native C 6.7 may need -opt 2 for eval.c
     AIX/RT may need a -a switch and -DCRIPPLED_CC.
+    AIX RS/6000 needs to use system malloc and avoid -O on eval.c and toke.c.
+    AIX RS/6000 needs -D_NO_PROTO.
     SUNOS 4.0.[12] needs #define fputs(str,fp) fprintf(fp,"%s",str) in perl.h
     SUNOS 3.[45] should use the system malloc.
-    SGI machines may need -Ddouble="long float".
-    Ultrix (2.3) may need to hand assemble teval.s with a -J switch.
+    SGI machines may need -Ddouble="long float" and -O1.
+    Vax-based systems may need to hand assemble teval.s with a -J switch.
     Ultrix on MIPS machines may need -DLANGUAGE_C.
     Ultrix 4.0 on MIPS machines may need -Olimit 2820 or so.
     Ultrix 3.[01] on MIPS needs to undefine WAITPID--the system call is busted.
     MIPS machines may need to undef d_volatile.
-    MIPS machines may need to turn off -O on perly.c and tperly.c.
+    MIPS machines may need to turn off -O on cmd.c, perl.c and tperl.c.
     Some MIPS machines may need to undefine CASTNEGFLOAT.
-    SCO Xenix may need -m25000 for yacc.
     Xenix 386 needs -Sm11000 for yacc, and may need -UM_I86.
+    SCO Xenix may need -m25000 for yacc.  See also README.xenix.
     Genix needs to use libc rather than libc_s, or #undef VARARGS.
     NCR Tower 32 (OS 2.01.01) may need -W2,-Sl,2000 and #undef MKDIR.
     A/UX may appears to work with -O -B/usr/lib/big/ optimizer flags.
@@ -116,10 +120,14 @@ Installation
     A/UX may need -ZP -DPOSIX, and -g if big cc is used.
     FPS machines may need -J and -DBADSWITCH.
     UTS may need one or more of -DCRIPPLED_CC, -K or -g, and undef LSTAT.
+    dynix may need to undefine CASTNEGFLOAT (d_castneg='undef' in config.sh).
     Dnix (not dynix) may need to remove -O.
     IRIX 3.3 may need to undefine VFORK.
+    HP/UX may need to pull cerror.o and syscall.o out of libc.a and link
+       them in explicitly.
     If you get syntax errors on '(', try -DCRIPPLED_CC or -DBADSWITCH or both.
     Machines with half-implemented dbm routines will need to #undef ODBM & NDBM.
+    If you have GDBM available and want it instead of NDBM, say -DHAS_GDBM.
     C's that don't try to restore registers on longjmp() may need -DJMPCLOBBER.
        (Try this if you get random glitches.)
 
@@ -143,7 +151,7 @@ Installation
 7)  Read the manual entry before running perl.
 
 8)  IMPORTANT!  Help save the world!  Communicate any problems and suggested
-    patches to me, lwall@jpl-devvax.jpl.nasa.gov (Larry Wall), so we can
+    patches to me, lwall@netlabs.com (Larry Wall), so we can
     keep the world in sync.  If you have a problem, there's someone else
     out there who either has had or will have the same problem.
 
diff --git a/README.xenix b/README.xenix
new file mode 100644 (file)
index 0000000..ca9a060
--- /dev/null
@@ -0,0 +1,53 @@
+From jpl-devvax!elroy.jpl.nasa.gov!sdd.hp.com!spool.mu.edu!uunet!mcsun!ukc!stl!robobar!ronald Thu Mar  7 09:51:06 PST 1991
+Article 4564 of comp.lang.perl:
+Path: jpl-devvax!elroy.jpl.nasa.gov!sdd.hp.com!spool.mu.edu!uunet!mcsun!ukc!stl!robobar!ronald
+>From: ronald@robobar.co.uk (Ronald S H Khoo)
+Newsgroups: comp.lang.perl
+Subject: Re: directory entries chopped on SCO Unix
+Message-ID: <1991Mar7.083046.14410@robobar.co.uk>
+Date: 7 Mar 91 08:30:46 GMT
+References: <18097@ogicse.ogi.edu> <DJM.91Mar5054514@egypt.eng.umd.edu> <498@stephsf.stephsf.com>
+Organization: Robobar Ltd., Perivale, Middx., ENGLAND.
+Lines: 38
+Status: OR
+
+wengland@stephsf.stephsf.com (Bill England) writes:
+
+>   Would modification of the config to 
+>   drop the Xenix specific test and also dropping the -lx library
+>   work better on Xenix boxes ?  Sorry I can't test Xenix here.
+
+This is a difficult question to answer, mostly because it's hard to
+tell exactly what kind of Xenix you have.
+
+       Early releases didn't have any kind of ndir  -- no problem
+
+       Many releases have only sys/ndir + -lx       -- no problem
+
+       SCO Xenix 2.3.[012] have ndir + dirent, but dirent is reputedly
+               broken on .0 and .1, hence the hack to undef it.
+
+       *However*, the kernel upgrade to 2.3.3 (where dirent apparently works)
+       from any lower 2.3.? is a free upgrade, which you can anon FTP or UUCP.
+
+I use dirent -- I had to make a decision which set of directory routines
+to throw out (so that there would be no confusion), so I threw out the
+old ones.  This means I have to manually remove the ! defined(M_XENIX)
+hacks from the source which is very ugh.
+
+My opinion is that the hacks should be removed seeing as they only apply
+to a small number of operating system versions which you upgrade for
+free anyway.  Chip may disagree with me.  It all rather depends on your
+particular point of view.
+
+You could hack Configure to do case "`uname -r`" in 2.3.[01])
+I guess.  It's a lot of code to handle just one specific case,
+since you have to determine whether to do it or not as well.
+
+In short, I Really Don't Know But It's All Very Annoying.
+
+Just another Xenix user,
+-- 
+Ronald Khoo <ronald@robobar.co.uk> +44 81 991 1142 (O) +44 71 229 7741 (H)
+
+
index 13954af..5febfbe 100644 (file)
--- a/Wishlist
+++ b/Wishlist
@@ -1,6 +1,3 @@
-ctime to time support
-better format pictures
-pager?
 built-in cpp
 perl to C translator
 multi-threading
diff --git a/arg.h b/arg.h
index 8947baa..16e4a05 100644 (file)
--- a/arg.h
+++ b/arg.h
@@ -1,4 +1,4 @@
-/* $Header: arg.h,v 3.0.1.8 90/11/10 01:04:36 lwall Locked $
+/* $Header: arg.h,v 4.0 91/03/20 01:03:09 lwall Locked $
  *
  *    Copyright (c) 1989, Larry Wall
  *
  *    as specified in the README file that comes with the perl 3.0 kit.
  *
  * $Log:       arg.h,v $
- * Revision 3.0.1.8  90/11/10  01:04:36  lwall
- * patch38: added alarm function
- * patch38: socket, recv, select, socketpair, setsockopt didn't eval all args
- * 
- * Revision 3.0.1.7  90/10/15  14:53:59  lwall
- * patch29: added SysV IPC
- * patch29: added waitpid
- * patch29: added cmp and <=>
- * patch29: added caller
- * patch29: added scalar
- * patch29: added sysread and syswrite
- * patch29: added -M, -A and -C
- * patch29: index and substr now have optional 3rd args
- * patch29: you can now read into the middle string
- * patch29: various portability fixes
- * 
- * Revision 3.0.1.6  90/08/09  02:25:14  lwall
- * patch19: added require operator
- * patch19: added truncate operator
- * 
- * Revision 3.0.1.5  90/03/27  15:29:41  lwall
- * patch16: MSDOS support
- * 
- * Revision 3.0.1.4  90/03/12  16:18:21  lwall
- * patch13: added list slice operator (LIST)[LIST]
- * patch13: added splice operator: @oldelems = splice(@array,$offset,$len,LIST)
- * 
- * Revision 3.0.1.3  90/02/28  16:21:55  lwall
- * patch9: added pipe function
- * 
- * Revision 3.0.1.2  89/12/21  19:13:14  lwall
- * patch7: send() didn't allow a TO argument
- * 
- * Revision 3.0.1.1  89/10/26  23:02:35  lwall
- * patch1: reverse didn't work
- * 
- * Revision 3.0  89/10/18  15:08:27  lwall
- * 3.0 baseline
+ * Revision 4.0  91/03/20  01:03:09  lwall
+ * 4.0 baseline.
  * 
  */
 
 #define O_NULL 0
-#define O_ITEM 1
-#define O_ITEM2 2
-#define O_ITEM3 3
-#define O_CONCAT 4
-#define O_MATCH 5
-#define O_NMATCH 6
-#define O_SUBST 7
-#define O_NSUBST 8
-#define O_ASSIGN 9
-#define O_MULTIPLY 10
-#define O_DIVIDE 11
-#define O_MODULO 12
-#define O_ADD 13
-#define O_SUBTRACT 14
-#define O_LEFT_SHIFT 15
-#define O_RIGHT_SHIFT 16
-#define O_LT 17
-#define O_GT 18
-#define O_LE 19
-#define O_GE 20
-#define O_EQ 21
-#define O_NE 22
-#define O_BIT_AND 23
-#define O_XOR 24
-#define O_BIT_OR 25
-#define O_AND 26
-#define O_OR 27
-#define O_COND_EXPR 28
-#define O_COMMA 29
-#define O_NEGATE 30
-#define O_NOT 31
-#define O_COMPLEMENT 32
-#define O_WRITE 33
-#define O_OPEN 34
-#define O_TRANS 35
-#define O_NTRANS 36
-#define O_CLOSE 37
-#define O_ARRAY 38
-#define O_HASH 39
-#define O_LARRAY 40
-#define O_LHASH 41
-#define O_PUSH 42
-#define O_POP 43
-#define O_SHIFT 44
-#define O_SPLIT 45
-#define O_LENGTH 46
-#define O_SPRINTF 47
-#define O_SUBSTR 48
-#define O_JOIN 49
-#define O_SLT 50
-#define O_SGT 51
-#define O_SLE 52
-#define O_SGE 53
-#define O_SEQ 54
-#define O_SNE 55
-#define O_SUBR 56
-#define O_PRINT 57
-#define O_CHDIR 58
-#define O_DIE 59
-#define O_EXIT 60
-#define O_RESET 61
-#define O_LIST 62
-#define O_SELECT 63
-#define O_EOF 64
-#define O_TELL 65
-#define O_SEEK 66
-#define O_LAST 67
-#define O_NEXT 68
-#define O_REDO 69
-#define O_GOTO 70
-#define O_INDEX 71
-#define O_TIME 72
-#define O_TMS 73
-#define O_LOCALTIME 74
-#define O_GMTIME 75
-#define O_STAT 76
-#define O_CRYPT 77
-#define O_EXP 78
-#define O_LOG 79
-#define O_SQRT 80
-#define O_INT 81
-#define O_PRTF 82
-#define O_ORD 83
-#define O_SLEEP 84
-#define O_FLIP 85
-#define O_FLOP 86
-#define O_KEYS 87
-#define O_VALUES 88
-#define O_EACH 89
-#define O_CHOP 90
-#define O_FORK 91
-#define O_EXEC_OP 92
-#define O_SYSTEM 93
-#define O_OCT 94
-#define O_HEX 95
-#define O_CHMOD 96
-#define O_CHOWN 97
-#define O_KILL 98
-#define O_RENAME 99
-#define O_UNLINK 100
-#define O_UMASK 101
-#define O_UNSHIFT 102
-#define O_LINK 103
-#define O_REPEAT 104
-#define O_EVAL 105
-#define O_FTEREAD 106
-#define O_FTEWRITE 107
-#define O_FTEEXEC 108
-#define O_FTEOWNED 109
-#define O_FTRREAD 110
-#define O_FTRWRITE 111
-#define O_FTREXEC 112
-#define O_FTROWNED 113
-#define O_FTIS 114
-#define O_FTZERO 115
-#define O_FTSIZE 116
-#define O_FTFILE 117
-#define O_FTDIR 118
-#define O_FTLINK 119
-#define O_SYMLINK 120
-#define O_FTPIPE 121
-#define O_FTSOCK 122
-#define O_FTBLK 123
-#define O_FTCHR 124
-#define O_FTSUID 125
-#define O_FTSGID 126
-#define O_FTSVTX 127
-#define O_FTTTY 128
-#define O_DOFILE 129
-#define O_FTTEXT 130
-#define O_FTBINARY 131
-#define O_UTIME 132
-#define O_WAIT 133
-#define O_SORT 134
-#define O_DELETE 135
-#define O_STUDY 136
-#define O_ATAN2 137
-#define O_SIN 138
-#define O_COS 139
-#define O_RAND 140
-#define O_SRAND 141
-#define O_POW 142
-#define O_RETURN 143
-#define O_GETC 144
-#define O_MKDIR 145
-#define O_RMDIR 146
-#define O_GETPPID 147
-#define O_GETPGRP 148
-#define O_SETPGRP 149
-#define O_GETPRIORITY 150
-#define O_SETPRIORITY 151
-#define O_CHROOT 152
-#define O_IOCTL 153
-#define O_FCNTL 154
-#define O_FLOCK 155
-#define O_RINDEX 156
-#define O_PACK 157
-#define O_UNPACK 158
-#define O_READ 159
-#define O_WARN 160
-#define O_DBMOPEN 161
-#define O_DBMCLOSE 162
-#define O_ASLICE 163
-#define O_HSLICE 164
-#define O_LASLICE 165
-#define O_LHSLICE 166
-#define O_F_OR_R 167
-#define O_RANGE 168
-#define O_RCAT 169
-#define O_AASSIGN 170
-#define O_SASSIGN 171
-#define O_DUMP 172
-#define O_REVERSE 173
-#define O_ADDROF 174
-#define O_SOCKET 175
-#define O_BIND 176
-#define O_CONNECT 177
-#define O_LISTEN 178
-#define O_ACCEPT 179
-#define O_SEND 180
-#define O_RECV 181
-#define O_SSELECT 182
-#define O_SOCKPAIR 183
-#define O_DBSUBR 184
-#define O_DEFINED 185
-#define O_UNDEF 186
-#define O_READLINK 187
-#define O_LSTAT 188
-#define O_AELEM 189
-#define O_HELEM 190
-#define O_LAELEM 191
-#define O_LHELEM 192
-#define O_LOCAL 193
-#define O_PIPE 194
-#define O_FILENO 195
-#define O_GHBYNAME 196
-#define O_GHBYADDR 197
-#define O_GHOSTENT 198
-#define O_SHOSTENT 199
-#define O_EHOSTENT 200
-#define O_GSBYNAME 201
-#define O_GSBYPORT 202
-#define O_GSERVENT 203
-#define O_SSERVENT 204
-#define O_ESERVENT 205
-#define O_GPBYNAME 206
-#define O_GPBYNUMBER 207
-#define O_GPROTOENT 208
-#define O_SPROTOENT 209
-#define O_EPROTOENT 210
-#define O_GNBYNAME 211
-#define O_GNBYADDR 212
-#define O_GNETENT 213
-#define O_SNETENT 214
-#define O_ENETENT 215
-#define O_VEC 216
-#define O_GREP 217
-#define O_GPWNAM 218
-#define O_GPWUID 219
-#define O_GPWENT 220
-#define O_SPWENT 221
-#define O_EPWENT 222
-#define O_GGRNAM 223
-#define O_GGRGID 224
-#define O_GGRENT 225
-#define O_SGRENT 226
-#define O_EGRENT 227
-#define O_SHUTDOWN 228
-#define O_OPENDIR 229
-#define O_READDIR 230
-#define O_TELLDIR 231
-#define O_SEEKDIR 232
-#define O_REWINDDIR 233
-#define O_CLOSEDIR 234
-#define O_GETLOGIN 235
-#define O_SYSCALL 236
-#define O_GSOCKOPT 237
-#define O_SSOCKOPT 238
-#define O_GETSOCKNAME 239
-#define O_GETPEERNAME 240
-#define O_LSLICE 241
-#define O_SPLICE 242
-#define O_BINMODE 243
-#define O_REQUIRE 244
-#define O_TRUNCATE 245
-#define O_MSGGET 246
-#define O_MSGCTL 247
-#define O_MSGSND 248
-#define O_MSGRCV 249
-#define O_SEMGET 250
-#define O_SEMCTL 251
-#define O_SEMOP 252
-#define O_SHMGET 253
-#define O_SHMCTL 254
-#define O_SHMREAD 255
-#define O_SHMWRITE 256
-#define O_NCMP 257
-#define O_SCMP 258
-#define O_CALLER 259
-#define O_SCALAR 260
-#define O_SYSREAD 261
-#define O_SYSWRITE 262
-#define O_FTMTIME 263
-#define O_FTATIME 264
-#define O_FTCTIME 265
-#define O_WAITPID 266
-#define O_ALARM 267
-#define MAXO 268
+#define O_RCAT 1
+#define O_ITEM 2
+#define O_SCALAR 3
+#define O_ITEM2 4
+#define O_ITEM3 5
+#define O_CONCAT 6
+#define O_REPEAT 7
+#define O_MATCH 8
+#define O_NMATCH 9
+#define O_SUBST 10
+#define O_NSUBST 11
+#define O_ASSIGN 12
+#define O_LOCAL 13
+#define O_AASSIGN 14
+#define O_SASSIGN 15
+#define O_CHOP 16
+#define O_DEFINED 17
+#define O_UNDEF 18
+#define O_STUDY 19
+#define O_POW 20
+#define O_MULTIPLY 21
+#define O_DIVIDE 22
+#define O_MODULO 23
+#define O_ADD 24
+#define O_SUBTRACT 25
+#define O_LEFT_SHIFT 26
+#define O_RIGHT_SHIFT 27
+#define O_LT 28
+#define O_GT 29
+#define O_LE 30
+#define O_GE 31
+#define O_EQ 32
+#define O_NE 33
+#define O_NCMP 34
+#define O_BIT_AND 35
+#define O_XOR 36
+#define O_BIT_OR 37
+#define O_AND 38
+#define O_OR 39
+#define O_COND_EXPR 40
+#define O_COMMA 41
+#define O_NEGATE 42
+#define O_NOT 43
+#define O_COMPLEMENT 44
+#define O_SELECT 45
+#define O_WRITE 46
+#define O_DBMOPEN 47
+#define O_DBMCLOSE 48
+#define O_OPEN 49
+#define O_TRANS 50
+#define O_NTRANS 51
+#define O_CLOSE 52
+#define O_EACH 53
+#define O_VALUES 54
+#define O_KEYS 55
+#define O_LARRAY 56
+#define O_ARRAY 57
+#define O_AELEM 58
+#define O_DELETE 59
+#define O_LHASH 60
+#define O_HASH 61
+#define O_HELEM 62
+#define O_LAELEM 63
+#define O_LHELEM 64
+#define O_LSLICE 65
+#define O_ASLICE 66
+#define O_HSLICE 67
+#define O_LASLICE 68
+#define O_LHSLICE 69
+#define O_SPLICE 70
+#define O_PUSH 71
+#define O_POP 72
+#define O_SHIFT 73
+#define O_UNPACK 74
+#define O_SPLIT 75
+#define O_LENGTH 76
+#define O_SPRINTF 77
+#define O_SUBSTR 78
+#define O_PACK 79
+#define O_GREP 80
+#define O_JOIN 81
+#define O_SLT 82
+#define O_SGT 83
+#define O_SLE 84
+#define O_SGE 85
+#define O_SEQ 86
+#define O_SNE 87
+#define O_SCMP 88
+#define O_SUBR 89
+#define O_DBSUBR 90
+#define O_CALLER 91
+#define O_SORT 92
+#define O_REVERSE 93
+#define O_WARN 94
+#define O_DIE 95
+#define O_PRTF 96
+#define O_PRINT 97
+#define O_CHDIR 98
+#define O_EXIT 99
+#define O_RESET 100
+#define O_LIST 101
+#define O_EOF 102
+#define O_GETC 103
+#define O_TELL 104
+#define O_RECV 105
+#define O_READ 106
+#define O_SYSREAD 107
+#define O_SYSWRITE 108
+#define O_SEND 109
+#define O_SEEK 110
+#define O_RETURN 111
+#define O_REDO 112
+#define O_NEXT 113
+#define O_LAST 114
+#define O_DUMP 115
+#define O_GOTO 116
+#define O_INDEX 117
+#define O_RINDEX 118
+#define O_TIME 119
+#define O_TMS 120
+#define O_LOCALTIME 121
+#define O_GMTIME 122
+#define O_TRUNCATE 123
+#define O_LSTAT 124
+#define O_STAT 125
+#define O_CRYPT 126
+#define O_ATAN2 127
+#define O_SIN 128
+#define O_COS 129
+#define O_RAND 130
+#define O_SRAND 131
+#define O_EXP 132
+#define O_LOG 133
+#define O_SQRT 134
+#define O_INT 135
+#define O_ORD 136
+#define O_ALARM 137
+#define O_SLEEP 138
+#define O_RANGE 139
+#define O_F_OR_R 140
+#define O_FLIP 141
+#define O_FLOP 142
+#define O_FORK 143
+#define O_WAIT 144
+#define O_WAITPID 145
+#define O_SYSTEM 146
+#define O_EXEC_OP 147
+#define O_HEX 148
+#define O_OCT 149
+#define O_CHOWN 150
+#define O_KILL 151
+#define O_UNLINK 152
+#define O_CHMOD 153
+#define O_UTIME 154
+#define O_UMASK 155
+#define O_MSGGET 156
+#define O_SHMGET 157
+#define O_SEMGET 158
+#define O_MSGCTL 159
+#define O_SHMCTL 160
+#define O_SEMCTL 161
+#define O_MSGSND 162
+#define O_MSGRCV 163
+#define O_SEMOP 164
+#define O_SHMREAD 165
+#define O_SHMWRITE 166
+#define O_RENAME 167
+#define O_LINK 168
+#define O_MKDIR 169
+#define O_RMDIR 170
+#define O_GETPPID 171
+#define O_GETPGRP 172
+#define O_SETPGRP 173
+#define O_GETPRIORITY 174
+#define O_SETPRIORITY 175
+#define O_CHROOT 176
+#define O_FCNTL 177
+#define O_IOCTL 178
+#define O_FLOCK 179
+#define O_UNSHIFT 180
+#define O_REQUIRE 181
+#define O_DOFILE 182
+#define O_EVAL 183
+#define O_FTRREAD 184
+#define O_FTRWRITE 185
+#define O_FTREXEC 186
+#define O_FTEREAD 187
+#define O_FTEWRITE 188
+#define O_FTEEXEC 189
+#define O_FTIS 190
+#define O_FTEOWNED 191
+#define O_FTROWNED 192
+#define O_FTZERO 193
+#define O_FTSIZE 194
+#define O_FTMTIME 195
+#define O_FTATIME 196
+#define O_FTCTIME 197
+#define O_FTSOCK 198
+#define O_FTCHR 199
+#define O_FTBLK 200
+#define O_FTFILE 201
+#define O_FTDIR 202
+#define O_FTPIPE 203
+#define O_FTLINK 204
+#define O_SYMLINK 205
+#define O_READLINK 206
+#define O_FTSUID 207
+#define O_FTSGID 208
+#define O_FTSVTX 209
+#define O_FTTTY 210
+#define O_FTTEXT 211
+#define O_FTBINARY 212
+#define O_SOCKET 213
+#define O_BIND 214
+#define O_CONNECT 215
+#define O_LISTEN 216
+#define O_ACCEPT 217
+#define O_GHBYNAME 218
+#define O_GHBYADDR 219
+#define O_GHOSTENT 220
+#define O_GNBYNAME 221
+#define O_GNBYADDR 222
+#define O_GNETENT 223
+#define O_GPBYNAME 224
+#define O_GPBYNUMBER 225
+#define O_GPROTOENT 226
+#define O_GSBYNAME 227
+#define O_GSBYPORT 228
+#define O_GSERVENT 229
+#define O_SHOSTENT 230
+#define O_SNETENT 231
+#define O_SPROTOENT 232
+#define O_SSERVENT 233
+#define O_EHOSTENT 234
+#define O_ENETENT 235
+#define O_EPROTOENT 236
+#define O_ESERVENT 237
+#define O_SOCKPAIR 238
+#define O_SHUTDOWN 239
+#define O_GSOCKOPT 240
+#define O_SSOCKOPT 241
+#define O_GETSOCKNAME 242
+#define O_GETPEERNAME 243
+#define O_SSELECT 244
+#define O_FILENO 245
+#define O_BINMODE 246
+#define O_VEC 247
+#define O_GPWNAM 248
+#define O_GPWUID 249
+#define O_GPWENT 250
+#define O_SPWENT 251
+#define O_EPWENT 252
+#define O_GGRNAM 253
+#define O_GGRGID 254
+#define O_GGRENT 255
+#define O_SGRENT 256
+#define O_EGRENT 257
+#define O_GETLOGIN 258
+#define O_OPENDIR 259
+#define O_READDIR 260
+#define O_TELLDIR 261
+#define O_SEEKDIR 262
+#define O_REWINDDIR 263
+#define O_CLOSEDIR 264
+#define O_SYSCALL 265
+#define O_PIPE 266
+#define MAXO 267
 
 #ifndef DOINIT
 extern char *opname[];
 #else
 char *opname[] = {
     "NULL",
+    "RCAT",
     "ITEM",
+    "SCALAR",
     "ITEM2",
     "ITEM3",
     "CONCAT",
+    "REPEAT",
     "MATCH",
     "NMATCH",
     "SUBST",
     "NSUBST",
     "ASSIGN",
+    "LOCAL",
+    "AASSIGN",
+    "SASSIGN",
+    "CHOP",
+    "DEFINED",
+    "UNDEF",
+    "STUDY",
+    "POW",
     "MULTIPLY",
     "DIVIDE",
     "MODULO",
@@ -344,6 +318,7 @@ char *opname[] = {
     "GE",
     "EQ",
     "NE",
+    "NCMP",
     "BIT_AND",
     "XOR",
     "BIT_OR",
@@ -354,22 +329,42 @@ char *opname[] = {
     "NEGATE",
     "NOT",
     "COMPLEMENT",
+    "SELECT",
     "WRITE",
+    "DBMOPEN",
+    "DBMCLOSE",
     "OPEN",
     "TRANS",
     "NTRANS",
     "CLOSE",
-    "ARRAY",
-    "HASH",
+    "EACH",
+    "VALUES",
+    "KEYS",
     "LARRAY",
+    "ARRAY",
+    "AELEM",
+    "DELETE",
     "LHASH",
+    "HASH",
+    "HELEM",
+    "LAELEM",
+    "LHELEM",
+    "LSLICE",
+    "ASLICE",
+    "HSLICE",
+    "LASLICE",
+    "LHSLICE",
+    "SPLICE",
     "PUSH",
     "POP",
     "SHIFT",
+    "UNPACK",
     "SPLIT",
     "LENGTH",
     "SPRINTF",
     "SUBSTR",
+    "PACK",
+    "GREP",
     "JOIN",
     "SLT",
     "SGT",
@@ -377,168 +372,166 @@ char *opname[] = {
     "SGE",
     "SEQ",
     "SNE",
+    "SCMP",
     "SUBR",
+    "DBSUBR",
+    "CALLER",
+    "SORT",
+    "REVERSE",
+    "WARN",
+    "DIE",
+    "PRINTF",
     "PRINT",
     "CHDIR",
-    "DIE",
     "EXIT",
     "RESET",
     "LIST",
-    "SELECT",
     "EOF",
+    "GETC",
     "TELL",
+    "RECV",
+    "READ",
+    "SYSREAD",
+    "SYSWRITE",
+    "SEND",
     "SEEK",
-    "LAST",
-    "NEXT",
+    "RETURN",
     "REDO",
+    "NEXT",
+    "LAST",
+    "DUMP",
     "GOTO",/* shudder */
     "INDEX",
+    "RINDEX",
     "TIME",
     "TIMES",
     "LOCALTIME",
     "GMTIME",
+    "TRUNCATE",
+    "LSTAT",
     "STAT",
     "CRYPT",
+    "ATAN2",
+    "SIN",
+    "COS",
+    "RAND",
+    "SRAND",
     "EXP",
     "LOG",
     "SQRT",
     "INT",
-    "PRINTF",
     "ORD",
+    "ALARM",
     "SLEEP",
+    "RANGE",
+    "FLIP_OR_RANGE",
     "FLIP",
     "FLOP",
-    "KEYS",
-    "VALUES",
-    "EACH",
-    "CHOP",
     "FORK",
-    "EXEC",
+    "WAIT",
+    "WAITPID",
     "SYSTEM",
-    "OCT",
+    "EXEC",
     "HEX",
-    "CHMOD",
+    "OCT",
     "CHOWN",
     "KILL",
-    "RENAME",
     "UNLINK",
+    "CHMOD",
+    "UTIME",
     "UMASK",
-    "UNSHIFT",
+    "MSGGET",
+    "SHMGET",
+    "SEMGET",
+    "MSGCTL",
+    "SHMCTL",
+    "SEMCTL",
+    "MSGSND",
+    "MSGRCV",
+    "SEMOP",
+    "SHMREAD",
+    "SHMWRITE",
+    "RENAME",
     "LINK",
-    "REPEAT",
+    "MKDIR",
+    "RMDIR",
+    "GETPPID",
+    "GETPGRP",
+    "SETPGRP",
+    "GETPRIORITY",
+    "SETPRIORITY",
+    "CHROOT",
+    "FCNTL",
+    "SYSIOCTL",
+    "FLOCK",
+    "UNSHIFT",
+    "REQUIRE",
+    "DOFILE",
     "EVAL",
+    "FTRREAD",
+    "FTRWRITE",
+    "FTREXEC",
     "FTEREAD",
     "FTEWRITE",
     "FTEEXEC",
+    "FTIS",
     "FTEOWNED",
-    "FTRREAD",
-    "FTRWRITE",
-    "FTREXEC",
     "FTROWNED",
-    "FTIS",
     "FTZERO",
     "FTSIZE",
+    "FTMTIME",
+    "FTATIME",
+    "FTCTIME",
+    "FTSOCK",
+    "FTCHR",
+    "FTBLK",
     "FTFILE",
     "FTDIR",
+    "FTPIPE",
     "FTLINK",
     "SYMLINK",
-    "FTPIPE",
-    "FTSOCK",
-    "FTBLK",
-    "FTCHR",
+    "READLINK",
     "FTSUID",
     "FTSGID",
     "FTSVTX",
     "FTTTY",
-    "DOFILE",
     "FTTEXT",
     "FTBINARY",
-    "UTIME",
-    "WAIT",
-    "SORT",
-    "DELETE",
-    "STUDY",
-    "ATAN2",
-    "SIN",
-    "COS",
-    "RAND",
-    "SRAND",
-    "POW",
-    "RETURN",
-    "GETC",
-    "MKDIR",
-    "RMDIR",
-    "GETPPID",
-    "GETPGRP",
-    "SETPGRP",
-    "GETPRIORITY",
-    "SETPRIORITY",
-    "CHROOT",
-    "IOCTL",
-    "FCNTL",
-    "FLOCK",
-    "RINDEX",
-    "PACK",
-    "UNPACK",
-    "READ",
-    "WARN",
-    "DBMOPEN",
-    "DBMCLOSE",
-    "ASLICE",
-    "HSLICE",
-    "LASLICE",
-    "LHSLICE",
-    "FLIP_OR_RANGE",
-    "RANGE",
-    "RCAT",
-    "AASSIGN",
-    "SASSIGN",
-    "DUMP",
-    "REVERSE",
-    "ADDRESS_OF",
     "SOCKET",
     "BIND",
     "CONNECT",
     "LISTEN",
     "ACCEPT",
-    "SEND",
-    "RECV",
-    "SSELECT",
-    "SOCKPAIR",
-    "DBSUBR",
-    "DEFINED",
-    "UNDEF",
-    "READLINK",
-    "LSTAT",
-    "AELEM",
-    "HELEM",
-    "LAELEM",
-    "LHELEM",
-    "LOCAL",
-    "PIPE",
-    "FILENO",
     "GHBYNAME",
     "GHBYADDR",
     "GHOSTENT",
-    "SHOSTENT",
-    "EHOSTENT",
-    "GSBYNAME",
-    "GSBYPORT",
-    "GSERVENT",
-    "SSERVENT",
-    "ESERVENT",
-    "GPBYNAME",
-    "GPBYNUMBER",
-    "GPROTOENT",
-    "SPROTOENT",
-    "EPROTOENT",
     "GNBYNAME",
     "GNBYADDR",
     "GNETENT",
+    "GPBYNAME",
+    "GPBYNUMBER",
+    "GPROTOENT",
+    "GSBYNAME",
+    "GSBYPORT",
+    "GSERVENT",
+    "SHOSTENT",
     "SNETENT",
+    "SPROTOENT",
+    "SSERVENT",
+    "EHOSTENT",
     "ENETENT",
+    "EPROTOENT",
+    "ESERVENT",
+    "SOCKPAIR",
+    "SHUTDOWN",
+    "GSOCKOPT",
+    "SSOCKOPT",
+    "GETSOCKNAME",
+    "GETPEERNAME",
+    "SSELECT",
+    "FILENO",
+    "BINMODE",
     "VEC",
-    "GREP",
     "GPWNAM",
     "GPWUID",
     "GPWENT",
@@ -549,47 +542,16 @@ char *opname[] = {
     "GGRENT",
     "SGRENT",
     "EGRENT",
-    "SHUTDOWN",
+    "GETLOGIN",
     "OPENDIR",
     "READDIR",
     "TELLDIR",
     "SEEKDIR",
     "REWINDDIR",
     "CLOSEDIR",
-    "GETLOGIN",
     "SYSCALL",
-    "GSOCKOPT",
-    "SSOCKOPT",
-    "GETSOCKNAME",
-    "GETPEERNAME",
-    "LSLICE",
-    "SPLICE",
-    "BINMODE",
-    "REQUIRE",
-    "TRUNCATE",
-    "MSGGET",
-    "MSGCTL",
-    "MSGSND",
-    "MSGRCV",
-    "SEMGET",
-    "SEMCTL",
-    "SEMOP",
-    "SHMGET",
-    "SHMCTL",
-    "SHMREAD",
-    "SHMWRITE",
-    "NCMP",
-    "SCMP",
-    "CALLER",
-    "SCALAR",
-    "SYSREAD",
-    "SYSWRITE",
-    "FTMTIME",
-    "FTATIME",
-    "FTCTIME",
-    "WAITPID",
-    "ALARM",
-    "268"
+    "PIPE",
+    "267"
 };
 #endif
 
@@ -698,7 +660,7 @@ struct arg {
 #define AF_PRE 4               /* pre *crement this item */
 #define AF_UP 8                        /* increment rather than decrement */
 #define AF_COMMON 16           /* left and right have symbols in common */
-#define AF_UNUSED 32           /*  */
+#define AF_DEPR 32             /* an older form of the construct */
 #define AF_LISTISH 64          /* turn into list if important */
 #define AF_LOCAL 128           /* list of local variables */
 
@@ -721,15 +683,26 @@ EXT unsigned short opargs[MAXO+1];
 #define A5(e1,e2,e3,e4,e5) (e1+(e2<<2)+(e3<<4)+(e4<<6)+(e5<<8))
 unsigned short opargs[MAXO+1] = {
        A(0,0,0),       /* NULL */
+       A(1,1,0),       /* RCAT */
        A(1,0,0),       /* ITEM */
+       A(1,0,0),       /* SCALAR */
        A(0,0,0),       /* ITEM2 */
        A(0,0,0),       /* ITEM3 */
        A(1,1,0),       /* CONCAT */
+       A(3,1,0),       /* REPEAT */
        A(1,0,0),       /* MATCH */
        A(1,0,0),       /* NMATCH */
        A(1,0,0),       /* SUBST */
        A(1,0,0),       /* NSUBST */
        A(1,1,0),       /* ASSIGN */
+       A(1,0,0),       /* LOCAL */
+       A(3,3,0),       /* AASSIGN */
+       A(0,0,0),       /* SASSIGN */
+       A(3,0,0),       /* CHOP */
+       A(1,0,0),       /* DEFINED */
+       A(1,0,0),       /* UNDEF */
+       A(1,0,0),       /* STUDY */
+       A(1,1,0),       /* POW */
        A(1,1,0),       /* MULTIPLY */
        A(1,1,0),       /* DIVIDE */
        A(1,1,0),       /* MODULO */
@@ -743,6 +716,7 @@ unsigned short opargs[MAXO+1] = {
        A(1,1,0),       /* GE */
        A(1,1,0),       /* EQ */
        A(1,1,0),       /* NE */
+       A(1,1,0),       /* NCMP */
        A(1,1,0),       /* BIT_AND */
        A(1,1,0),       /* XOR */
        A(1,1,0),       /* BIT_OR */
@@ -753,22 +727,42 @@ unsigned short opargs[MAXO+1] = {
        A(1,0,0),       /* NEGATE */
        A(1,0,0),       /* NOT */
        A(1,0,0),       /* COMPLEMENT */
+       A(1,0,0),       /* SELECT */
        A(1,0,0),       /* WRITE */
+       A(1,1,1),       /* DBMOPEN */
+       A(1,0,0),       /* DBMCLOSE */
        A(1,1,0),       /* OPEN */
        A(1,0,0),       /* TRANS */
        A(1,0,0),       /* NTRANS */
        A(1,0,0),       /* CLOSE */
-       A(0,0,0),       /* ARRAY */
-       A(0,0,0),       /* HASH */
+       A(0,0,0),       /* EACH */
+       A(0,0,0),       /* VALUES */
+       A(0,0,0),       /* KEYS */
        A(0,0,0),       /* LARRAY */
+       A(0,0,0),       /* ARRAY */
+       A(0,1,0),       /* AELEM */
+       A(0,1,0),       /* DELETE */
        A(0,0,0),       /* LHASH */
+       A(0,0,0),       /* HASH */
+       A(0,1,0),       /* HELEM */
+       A(0,1,0),       /* LAELEM */
+       A(0,1,0),       /* LHELEM */
+       A(0,3,3),       /* LSLICE */
+       A(0,3,0),       /* ASLICE */
+       A(0,3,0),       /* HSLICE */
+       A(0,3,0),       /* LASLICE */
+       A(0,3,0),       /* LHSLICE */
+       A(0,3,1),       /* SPLICE */
        A(0,3,0),       /* PUSH */
        A(0,0,0),       /* POP */
        A(0,0,0),       /* SHIFT */
+       A(1,1,0),       /* UNPACK */
        A(1,0,1),       /* SPLIT */
        A(1,0,0),       /* LENGTH */
        A(3,0,0),       /* SPRINTF */
        A(1,1,1),       /* SUBSTR */
+       A(1,3,0),       /* PACK */
+       A(0,3,0),       /* GREP */
        A(1,3,0),       /* JOIN */
        A(1,1,0),       /* SLT */
        A(1,1,0),       /* SGT */
@@ -776,168 +770,166 @@ unsigned short opargs[MAXO+1] = {
        A(1,1,0),       /* SGE */
        A(1,1,0),       /* SEQ */
        A(1,1,0),       /* SNE */
+       A(1,1,0),       /* SCMP */
        A(0,3,0),       /* SUBR */
+       A(0,3,0),       /* DBSUBR */
+       A(1,0,0),       /* CALLER */
+       A(1,3,0),       /* SORT */
+       A(0,3,0),       /* REVERSE */
+       A(0,3,0),       /* WARN */
+       A(0,3,0),       /* DIE */
+       A(1,3,0),       /* PRINTF */
        A(1,3,0),       /* PRINT */
        A(1,0,0),       /* CHDIR */
-       A(0,3,0),       /* DIE */
        A(1,0,0),       /* EXIT */
        A(1,0,0),       /* RESET */
        A(3,0,0),       /* LIST */
-       A(1,0,0),       /* SELECT */
        A(1,0,0),       /* EOF */
+       A(1,0,0),       /* GETC */
        A(1,0,0),       /* TELL */
+       A5(1,1,1,1,0),  /* RECV */
+       A(1,1,3),       /* READ */
+       A(1,1,3),       /* SYSREAD */
+       A(1,1,3),       /* SYSWRITE */
+       A(1,1,3),       /* SEND */
        A(1,1,1),       /* SEEK */
-       A(0,0,0),       /* LAST */
-       A(0,0,0),       /* NEXT */
+       A(0,3,0),       /* RETURN */
        A(0,0,0),       /* REDO */
+       A(0,0,0),       /* NEXT */
+       A(0,0,0),       /* LAST */
+       A(0,0,0),       /* DUMP */
        A(0,0,0),       /* GOTO */
        A(1,1,1),       /* INDEX */
+       A(1,1,1),       /* RINDEX */
        A(0,0,0),       /* TIME */
        A(0,0,0),       /* TIMES */
        A(1,0,0),       /* LOCALTIME */
        A(1,0,0),       /* GMTIME */
+       A(1,1,0),       /* TRUNCATE */
+       A(1,0,0),       /* LSTAT */
        A(1,0,0),       /* STAT */
        A(1,1,0),       /* CRYPT */
+       A(1,1,0),       /* ATAN2 */
+       A(1,0,0),       /* SIN */
+       A(1,0,0),       /* COS */
+       A(1,0,0),       /* RAND */
+       A(1,0,0),       /* SRAND */
        A(1,0,0),       /* EXP */
        A(1,0,0),       /* LOG */
        A(1,0,0),       /* SQRT */
        A(1,0,0),       /* INT */
-       A(1,3,0),       /* PRINTF */
        A(1,0,0),       /* ORD */
+       A(1,0,0),       /* ALARM */
        A(1,0,0),       /* SLEEP */
+       A(1,1,0),       /* RANGE */
+       A(1,0,0),       /* F_OR_R */
        A(1,0,0),       /* FLIP */
        A(0,1,0),       /* FLOP */
-       A(0,0,0),       /* KEYS */
-       A(0,0,0),       /* VALUES */
-       A(0,0,0),       /* EACH */
-       A(3,0,0),       /* CHOP */
        A(0,0,0),       /* FORK */
-       A(1,3,0),       /* EXEC */
+       A(0,0,0),       /* WAIT */
+       A(1,1,0),       /* WAITPID */
        A(1,3,0),       /* SYSTEM */
-       A(1,0,0),       /* OCT */
+       A(1,3,0),       /* EXEC */
        A(1,0,0),       /* HEX */
-       A(0,3,0),       /* CHMOD */
+       A(1,0,0),       /* OCT */
        A(0,3,0),       /* CHOWN */
        A(0,3,0),       /* KILL */
-       A(1,1,0),       /* RENAME */
        A(0,3,0),       /* UNLINK */
+       A(0,3,0),       /* CHMOD */
+       A(0,3,0),       /* UTIME */
        A(1,0,0),       /* UMASK */
-       A(0,3,0),       /* UNSHIFT */
+       A(1,1,0),       /* MSGGET */
+       A(1,1,1),       /* SHMGET */
+       A(1,1,1),       /* SEMGET */
+       A(1,1,1),       /* MSGCTL */
+       A(1,1,1),       /* SHMCTL */
+       A5(1,1,1,1,0),  /* SEMCTL */
+       A(1,1,1),       /* MSGSND */
+       A5(1,1,1,1,1),  /* MSGRCV */
+       A(1,1,1),       /* SEMOP */
+       A5(1,1,1,1,0),  /* SHMREAD */
+       A5(1,1,1,1,0),  /* SHMWRITE */
+       A(1,1,0),       /* RENAME */
        A(1,1,0),       /* LINK */
-       A(1,1,0),       /* REPEAT */
+       A(1,1,0),       /* MKDIR */
+       A(1,0,0),       /* RMDIR */
+       A(0,0,0),       /* GETPPID */
+       A(1,0,0),       /* GETPGRP */
+       A(1,1,0),       /* SETPGRP */
+       A(1,1,0),       /* GETPRIORITY */
+       A(1,1,1),       /* SETPRIORITY */
+       A(1,0,0),       /* CHROOT */
+       A(1,1,1),       /* FCNTL */
+       A(1,1,1),       /* SYSIOCTL */
+       A(1,1,0),       /* FLOCK */
+       A(0,3,0),       /* UNSHIFT */
+       A(1,0,0),       /* REQUIRE */
+       A(1,0,0),       /* DOFILE */
        A(1,0,0),       /* EVAL */
+       A(1,0,0),       /* FTRREAD */
+       A(1,0,0),       /* FTRWRITE */
+       A(1,0,0),       /* FTREXEC */
        A(1,0,0),       /* FTEREAD */
        A(1,0,0),       /* FTEWRITE */
        A(1,0,0),       /* FTEEXEC */
+       A(1,0,0),       /* FTIS */
        A(1,0,0),       /* FTEOWNED */
-       A(1,0,0),       /* FTRREAD */
-       A(1,0,0),       /* FTRWRITE */
-       A(1,0,0),       /* FTREXEC */
        A(1,0,0),       /* FTROWNED */
-       A(1,0,0),       /* FTIS */
        A(1,0,0),       /* FTZERO */
        A(1,0,0),       /* FTSIZE */
+       A(1,0,0),       /* FTMTIME */
+       A(1,0,0),       /* FTATIME */
+       A(1,0,0),       /* FTCTIME */
+       A(1,0,0),       /* FTSOCK */
+       A(1,0,0),       /* FTCHR */
+       A(1,0,0),       /* FTBLK */
        A(1,0,0),       /* FTFILE */
        A(1,0,0),       /* FTDIR */
+       A(1,0,0),       /* FTPIPE */
        A(1,0,0),       /* FTLINK */
        A(1,1,0),       /* SYMLINK */
-       A(1,0,0),       /* FTPIPE */
-       A(1,0,0),       /* FTSOCK */
-       A(1,0,0),       /* FTBLK */
-       A(1,0,0),       /* FTCHR */
+       A(1,0,0),       /* READLINK */
        A(1,0,0),       /* FTSUID */
        A(1,0,0),       /* FTSGID */
        A(1,0,0),       /* FTSVTX */
        A(1,0,0),       /* FTTTY */
-       A(1,0,0),       /* DOFILE */
        A(1,0,0),       /* FTTEXT */
        A(1,0,0),       /* FTBINARY */
-       A(0,3,0),       /* UTIME */
-       A(0,0,0),       /* WAIT */
-       A(1,3,0),       /* SORT */
-       A(0,1,0),       /* DELETE */
-       A(1,0,0),       /* STUDY */
-       A(1,1,0),       /* ATAN2 */
-       A(1,0,0),       /* SIN */
-       A(1,0,0),       /* COS */
-       A(1,0,0),       /* RAND */
-       A(1,0,0),       /* SRAND */
-       A(1,1,0),       /* POW */
-       A(0,3,0),       /* RETURN */
-       A(1,0,0),       /* GETC */
-       A(1,1,0),       /* MKDIR */
-       A(1,0,0),       /* RMDIR */
-       A(0,0,0),       /* GETPPID */
-       A(1,0,0),       /* GETPGRP */
-       A(1,1,0),       /* SETPGRP */
-       A(1,1,0),       /* GETPRIORITY */
-       A(1,1,1),       /* SETPRIORITY */
-       A(1,0,0),       /* CHROOT */
-       A(1,1,1),       /* IOCTL */
-       A(1,1,1),       /* FCNTL */
-       A(1,1,0),       /* FLOCK */
-       A(1,1,1),       /* RINDEX */
-       A(1,3,0),       /* PACK */
-       A(1,1,0),       /* UNPACK */
-       A(1,1,3),       /* READ */
-       A(0,3,0),       /* WARN */
-       A(1,1,1),       /* DBMOPEN */
-       A(1,0,0),       /* DBMCLOSE */
-       A(0,3,0),       /* ASLICE */
-       A(0,3,0),       /* HSLICE */
-       A(0,3,0),       /* LASLICE */
-       A(0,3,0),       /* LHSLICE */
-       A(1,0,0),       /* F_OR_R */
-       A(1,1,0),       /* RANGE */
-       A(1,1,0),       /* RCAT */
-       A(3,3,0),       /* AASSIGN */
-       A(0,0,0),       /* SASSIGN */
-       A(0,0,0),       /* DUMP */
-       A(0,3,0),       /* REVERSE */
-       A(1,0,0),       /* ADDROF */
        A5(1,1,1,1,0),  /* SOCKET */
        A(1,1,0),       /* BIND */
        A(1,1,0),       /* CONNECT */
        A(1,1,0),       /* LISTEN */
        A(1,1,0),       /* ACCEPT */
-       A(1,1,3),       /* SEND */
-       A5(1,1,1,1,0),  /* RECV */
-       A5(1,1,1,1,0),  /* SSELECT */
-       A5(1,1,1,1,1),  /* SOCKPAIR */
-       A(0,3,0),       /* DBSUBR */
-       A(1,0,0),       /* DEFINED */
-       A(1,0,0),       /* UNDEF */
-       A(1,0,0),       /* READLINK */
-       A(1,0,0),       /* LSTAT */
-       A(0,1,0),       /* AELEM */
-       A(0,1,0),       /* HELEM */
-       A(0,1,0),       /* LAELEM */
-       A(0,1,0),       /* LHELEM */
-       A(1,0,0),       /* LOCAL */
-       A(1,1,0),       /* PIPE */
-       A(1,0,0),       /* FILENO */
        A(1,0,0),       /* GHBYNAME */
        A(1,1,0),       /* GHBYADDR */
        A(0,0,0),       /* GHOSTENT */
-       A(1,0,0),       /* SHOSTENT */
-       A(0,0,0),       /* EHOSTENT */
-       A(1,1,0),       /* GSBYNAME */
-       A(1,1,0),       /* GSBYPORT */
-       A(0,0,0),       /* GSERVENT */
-       A(1,0,0),       /* SSERVENT */
-       A(0,0,0),       /* ESERVENT */
-       A(1,0,0),       /* GPBYNAME */
-       A(1,0,0),       /* GPBYNUMBER */
-       A(0,0,0),       /* GPROTOENT */
-       A(1,0,0),       /* SPROTOENT */
-       A(0,0,0),       /* EPROTOENT */
        A(1,0,0),       /* GNBYNAME */
        A(1,1,0),       /* GNBYADDR */
        A(0,0,0),       /* GNETENT */
+       A(1,0,0),       /* GPBYNAME */
+       A(1,0,0),       /* GPBYNUMBER */
+       A(0,0,0),       /* GPROTOENT */
+       A(1,1,0),       /* GSBYNAME */
+       A(1,1,0),       /* GSBYPORT */
+       A(0,0,0),       /* GSERVENT */
+       A(1,0,0),       /* SHOSTENT */
        A(1,0,0),       /* SNETENT */
+       A(1,0,0),       /* SPROTOENT */
+       A(1,0,0),       /* SSERVENT */
+       A(0,0,0),       /* EHOSTENT */
        A(0,0,0),       /* ENETENT */
+       A(0,0,0),       /* EPROTOENT */
+       A(0,0,0),       /* ESERVENT */
+       A5(1,1,1,1,1),  /* SOCKPAIR */
+       A(1,1,0),       /* SHUTDOWN */
+       A(1,1,1),       /* GSOCKOPT */
+       A5(1,1,1,1,0),  /* SSOCKOPT */
+       A(1,0,0),       /* GETSOCKNAME */
+       A(1,0,0),       /* GETPEERNAME */
+       A5(1,1,1,1,0),  /* SSELECT */
+       A(1,0,0),       /* FILENO */
+       A(1,0,0),       /* BINMODE */
        A(1,1,1),       /* VEC */
-       A(0,3,0),       /* GREP */
        A(1,0,0),       /* GPWNAM */
        A(1,0,0),       /* GPWUID */
        A(0,0,0),       /* GPWENT */
@@ -948,46 +940,15 @@ unsigned short opargs[MAXO+1] = {
        A(0,0,0),       /* GGRENT */
        A(0,0,0),       /* SGRENT */
        A(0,0,0),       /* EGRENT */
-       A(1,1,0),       /* SHUTDOWN */
+       A(0,0,0),       /* GETLOGIN */
        A(1,1,0),       /* OPENDIR */
        A(1,0,0),       /* READDIR */
        A(1,0,0),       /* TELLDIR */
        A(1,1,0),       /* SEEKDIR */
        A(1,0,0),       /* REWINDDIR */
        A(1,0,0),       /* CLOSEDIR */
-       A(0,0,0),       /* GETLOGIN */
        A(1,3,0),       /* SYSCALL */
-       A(1,1,1),       /* GSOCKOPT */
-       A5(1,1,1,1,0),  /* SSOCKOPT */
-       A(1,0,0),       /* GETSOCKNAME */
-       A(1,0,0),       /* GETPEERNAME */
-       A(0,3,3),       /* LSLICE */
-       A(0,3,1),       /* SPLICE */
-       A(1,0,0),       /* BINMODE */
-       A(1,0,0),       /* REQUIRE */
-       A(1,1,0),       /* TRUNCATE */
-       A(1,1,0),       /* MSGGET */
-       A(1,1,1),       /* MSGCTL */
-       A(1,1,1),       /* MSGSND */
-       A5(1,1,1,1,1),  /* MSGRCV */
-       A(1,1,1),       /* SEMGET */
-       A5(1,1,1,1,0),  /* SEMCTL */
-       A(1,1,1),       /* SEMOP */
-       A(1,1,1),       /* SHMGET */
-       A(1,1,1),       /* SHMCTL */
-       A5(1,1,1,1,0),  /* SHMREAD */
-       A5(1,1,1,1,0),  /* SHMWRITE */
-       A(1,1,0),       /* NCMP */
-       A(1,1,0),       /* SCMP */
-       A(1,0,0),       /* CALLER */
-       A(1,0,0),       /* SCALAR */
-       A(1,1,3),       /* SYSREAD */
-       A(1,1,3),       /* SYSWRITE */
-       A(1,0,0),       /* FTMTIME */
-       A(1,0,0),       /* FTATIME */
-       A(1,0,0),       /* FTCTIME */
-       A(1,1,0),       /* WAITPID */
-       A(1,0,0),       /* ALARM */
+       A(1,1,0),       /* PIPE */
        0
 };
 #undef A
diff --git a/array.c b/array.c
index aff66ca..ae64d85 100644 (file)
--- a/array.c
+++ b/array.c
@@ -1,4 +1,4 @@
-/* $Header: array.c,v 3.0.1.3 90/10/15 14:56:17 lwall Locked $
+/* $Header: array.c,v 4.0 91/03/20 01:03:32 lwall Locked $
  *
  *    Copyright (c) 1989, Larry Wall
  *
@@ -6,17 +6,8 @@
  *    as specified in the README file that comes with the perl 3.0 kit.
  *
  * $Log:       array.c,v $
- * Revision 3.0.1.3  90/10/15  14:56:17  lwall
- * patch29: non-existent array values no longer cause core dumps
- * 
- * Revision 3.0.1.2  90/08/13  21:52:20  lwall
- * patch28: defined(@array) and defined(%array) didn't work right
- * 
- * Revision 3.0.1.1  89/11/17  15:02:52  lwall
- * patch5: nested foreach on same array didn't work
- * 
- * Revision 3.0  89/10/18  15:08:33  lwall
- * 3.0 baseline
+ * Revision 4.0  91/03/20  01:03:32  lwall
+ * 4.0 baseline.
  * 
  */
 
@@ -36,7 +27,7 @@ int lval;
            if (ar->ary_flags & ARF_REAL)
                str = Str_new(5,0);
            else
-               str = str_static(&str_undef);
+               str = str_mortal(&str_undef);
            (void)astore(ar,key,str);
            return str;
        }
@@ -126,8 +117,8 @@ STAB *stab;
 ARRAY *
 afake(stab,size,strp)
 STAB *stab;
-int size;
-STR **strp;
+register int size;
+register STR **strp;
 {
     register ARRAY *ar;
 
@@ -140,6 +131,9 @@ STR **strp;
     ar->ary_fill = size - 1;
     ar->ary_max = size - 1;
     ar->ary_flags = 0;
+    while (size--) {
+       (*strp++)->str_pok &= ~SP_TEMP;
+    }
     return ar;
 }
 
@@ -222,8 +216,14 @@ register int num;
        (void)astore(ar,ar->ary_fill+num,(STR*)0);      /* maybe extend array */
        dstr = ar->ary_array + ar->ary_fill;
        sstr = dstr - num;
+#ifdef BUGGY_MSC5
+ # pragma loop_opt(off)        /* don't loop-optimize the following code */
+#endif /* BUGGY_MSC5 */
        for (i = ar->ary_fill; i >= 0; i--) {
            *dstr-- = *sstr--;
+#ifdef BUGGY_MSC5
+ # pragma loop_opt()   /* loop-optimization back to command-line setting */
+#endif /* BUGGY_MSC5 */
        }
        Zero(ar->ary_array, num, STR*);
     }
diff --git a/array.h b/array.h
index 1388591..49ded9b 100644 (file)
--- a/array.h
+++ b/array.h
@@ -1,4 +1,4 @@
-/* $Header: array.h,v 3.0.1.1 89/11/17 15:03:42 lwall Locked $
+/* $Header: array.h,v 4.0 91/03/20 01:03:44 lwall Locked $
  *
  *    Copyright (c) 1989, Larry Wall
  *
@@ -6,11 +6,8 @@
  *    as specified in the README file that comes with the perl 3.0 kit.
  *
  * $Log:       array.h,v $
- * Revision 3.0.1.1  89/11/17  15:03:42  lwall
- * patch5: nested foreach on same array didn't work
- * 
- * Revision 3.0  89/10/18  15:08:41  lwall
- * 3.0 baseline
+ * Revision 4.0  91/03/20  01:03:44  lwall
+ * 4.0 baseline.
  * 
  */
 
diff --git a/cmd.c b/cmd.c
index d204620..539b42b 100644 (file)
--- a/cmd.c
+++ b/cmd.c
@@ -1,4 +1,4 @@
-/* $Header: cmd.c,v 3.0.1.10 90/10/20 02:01:56 lwall Locked $
+/* $Header: cmd.c,v 4.0 91/03/20 01:04:18 lwall Locked $
  *
  *    Copyright (c) 1989, Larry Wall
  *
@@ -6,52 +6,8 @@
  *    as specified in the README file that comes with the perl 3.0 kit.
  *
  * $Log:       cmd.c,v $
- * Revision 3.0.1.10  90/10/20  02:01:56  lwall
- * patch37: cray has weird restrictions on setjmp locations
- * 
- * Revision 3.0.1.9  90/10/15  15:32:39  lwall
- * patch29: non-existent array values no longer cause core dumps
- * patch29: scripts now run at almost full speed under the debugger
- * patch29: @ENV = () now works
- * patch29: added caller
- * 
- * Revision 3.0.1.8  90/08/09  02:28:49  lwall
- * patch19: did preliminary work toward debugging packages and evals
- * patch19: conditionals now always supply a scalar context to expression
- * patch19: switch optimizer was confused by negative fractional values
- * 
- * Revision 3.0.1.7  90/03/27  15:32:37  lwall
- * patch16: non-terminal blocks should never have arrays requested of them
- * 
- * Revision 3.0.1.6  90/03/12  16:21:09  lwall
- * patch13: fixed some backwards VOLATILE declarations
- * patch13: while (s/x//) {} still caused some anomolies
- * patch13: greater-than test of numeric switch structures did less-than action
- * 
- * Revision 3.0.1.5  90/02/28  16:38:31  lwall
- * patch9: volatilized some more variables for super-optimizing compilers
- * patch9: nested foreach loops didn't reset inner loop on next to outer loop
- * patch9: returned values were read from obsolete stack
- * patch9: added sanity check on longjmp() return value
- * patch9: substitutions that almost always succeed can corrupt label stack
- * patch9: subs which return by both mechanisms can clobber local return data
- * 
- * Revision 3.0.1.4  89/12/21  19:17:41  lwall
- * patch7: arranged for certain registers to be restored after longjmp()
- * patch7: made nested or recursive foreach work right
- * 
- * Revision 3.0.1.3  89/11/17  15:04:36  lwall
- * patch5: nested foreach on same array didn't work
- * 
- * Revision 3.0.1.2  89/11/11  04:08:56  lwall
- * patch2: non-BSD machines required two ^D's for <>
- * patch2: grow_dlevel() not inside #ifdef DEBUGGING
- * 
- * Revision 3.0.1.1  89/10/26  23:04:21  lwall
- * patch1: heuristically disabled optimization could cause core dump
- * 
- * Revision 3.0  89/10/18  15:09:02  lwall
- * 3.0 baseline
+ * Revision 4.0  91/03/20  01:04:18  lwall
+ * 4.0 baseline.
  * 
  */
 
@@ -388,6 +344,8 @@ until_loop:
                              retstr->str_ptr + cmd->c_slen,
                              retstr->str_cur - cmd->c_slen);
                    }
+                   if (cmd->c_spat)
+                       lastspat = cmd->c_spat;
                    match = !(cmdflags & CF_FIRSTNEG);
                    retstr = &str_yes;
                    goto flipmaybe;
@@ -422,6 +380,8 @@ until_loop:
                                         retstr->str_ptr + cmd->c_slen,
                                         retstr->str_cur - cmd->c_slen);
                        }
+                       if (cmd->c_spat)
+                           lastspat = cmd->c_spat;
                        match = !(cmdflags & CF_FIRSTNEG);
                        retstr = &str_yes;
                        goto flipmaybe;
@@ -461,13 +421,15 @@ until_loop:
                            str_nset(stab_val(leftstab),retstr->str_ptr,
                              tmps - retstr->str_ptr);
                        if (amperstab)
-                           str_sset(stab_val(amperstab),cmd->c_short);
+                           str_nset(stab_val(amperstab),
+                             tmps, cmd->c_short->str_cur);
                        if (rightstab)
                            str_nset(stab_val(rightstab),
                              tmps + cmd->c_short->str_cur,
                              retstr->str_cur - (tmps - retstr->str_ptr) -
                                cmd->c_short->str_cur);
                    }
+                   lastspat = cmd->c_spat;
                    match = !(cmdflags & CF_FIRSTNEG);
                    retstr = &str_yes;
                    goto flipmaybe;
@@ -567,8 +529,10 @@ until_loop:
        case CFT_EVAL:
            break;
        case CFT_UNFLIP:
-           while (tmps_max > tmps_base)        /* clean up after last eval */
-               str_free(tmps_list[tmps_max--]);
+           while (tmps_max > tmps_base) {      /* clean up after last eval */
+               str_free(tmps_list[tmps_max]);
+               tmps_list[tmps_max--] = Nullstr;
+           }
            newsp = eval(cmd->c_expr,gimme && (cmdflags & CF_TERM),sp);
            st = stack->ary_array;      /* possibly reallocated */
            retstr = st[newsp];
@@ -586,6 +550,7 @@ until_loop:
            *tmps = '\0';
            retstr->str_nok = 0;
            retstr->str_cur = tmps - retstr->str_ptr;
+           STABSET(retstr);
            retstr = &str_chop;
            goto flipmaybe;
        case CFT_ARRAY:
@@ -637,11 +602,15 @@ until_loop:
            lastretstr = Nullstr;
            lastspbase = sp;
            lastsize = newsp - sp;
+           if (lastsize < 0)
+               lastsize = 0;
        }
        else
            lastretstr = retstr;
-       while (tmps_max > tmps_base)    /* clean up after last eval */
-           str_free(tmps_list[tmps_max--]);
+       while (tmps_max > tmps_base) {  /* clean up after last eval */
+           str_free(tmps_list[tmps_max]);
+           tmps_list[tmps_max--] = Nullstr;
+       }
        newsp = eval(cmd->c_expr,
          gimme && (cmdflags & CF_TERM) && cmd->c_type == C_EXPR &&
                !cmd->ucmd.acmd.ac_expr,
@@ -658,8 +627,10 @@ until_loop:
 
     flipmaybe:
        if (match && cmdflags & CF_FLIP) {
-           while (tmps_max > tmps_base)        /* clean up after last eval */
-               str_free(tmps_list[tmps_max--]);
+           while (tmps_max > tmps_base) {      /* clean up after last eval */
+               str_free(tmps_list[tmps_max]);
+               tmps_list[tmps_max--] = Nullstr;
+           }
            if (cmd->c_expr->arg_type == O_FLOP) {      /* currently toggled? */
                newsp = eval(cmd->c_expr,G_SCALAR,sp);/*let eval undo it*/
                cmdflags = copyopt(cmd,cmd->c_expr[3].arg_ptr.arg_cmd);
@@ -699,11 +670,15 @@ until_loop:
                lastretstr = Nullstr;
                lastspbase = sp;
                lastsize = newsp - sp;
+               if (lastsize < 0)
+                   lastsize = 0;
            }
            else
                lastretstr = retstr;
-           while (tmps_max > tmps_base)        /* clean up after last eval */
-               str_free(tmps_list[tmps_max--]);
+           while (tmps_max > tmps_base) {      /* clean up after last eval */
+               str_free(tmps_list[tmps_max]);
+               tmps_list[tmps_max--] = Nullstr;
+           }
            newsp = eval(cmd->ucmd.acmd.ac_expr,gimme && (cmdflags&CF_TERM),sp);
            st = stack->ary_array;      /* possibly reallocated */
            retstr = st[newsp];
@@ -897,7 +872,7 @@ until_loop:
        if (savestack->ary_fill > oldsave) {
            if (cmdflags & CF_TERM) {
                for (match = sp + 1; match <= newsp; match++)
-                   st[match] = str_static(st[match]);
+                   st[match] = str_mortal(st[match]);
                retstr = st[newsp];
            }
            restorelist(oldsave);
@@ -989,6 +964,7 @@ STAB *stab;
     str->str_u.str_stab = stab;
     if (str->str_ptr) {
        Safefree(str->str_ptr);
+       str->str_ptr = Nullch;
        str->str_len = 0;
     }
     str->str_ptr = (char*)stab_array(stab);
@@ -1008,6 +984,7 @@ STAB *stab;
     str->str_u.str_stab = stab;
     if (str->str_ptr) {
        Safefree(str->str_ptr);
+       str->str_ptr = Nullch;
        str->str_len = 0;
     }
     str->str_ptr = (char*)stab_hash(stab);
diff --git a/cmd.h b/cmd.h
index 1825f50..0a4f84e 100644 (file)
--- a/cmd.h
+++ b/cmd.h
@@ -1,4 +1,4 @@
-/* $Header: cmd.h,v 3.0.1.4 90/10/15 15:34:50 lwall Locked $
+/* $Header: cmd.h,v 4.0 91/03/20 01:04:34 lwall Locked $
  *
  *    Copyright (c) 1989, Larry Wall
  *
@@ -6,21 +6,8 @@
  *    as specified in the README file that comes with the perl 3.0 kit.
  *
  * $Log:       cmd.h,v $
- * Revision 3.0.1.4  90/10/15  15:34:50  lwall
- * patch29: scripts now run at almost full speed under the debugger
- * patch29: added caller
- * 
- * Revision 3.0.1.3  90/08/09  02:29:58  lwall
- * patch19: did preliminary work toward debugging packages and evals
- * 
- * Revision 3.0.1.2  90/02/28  16:39:36  lwall
- * patch9: volatilized some more variables for super-optimizing compilers
- * 
- * Revision 3.0.1.1  89/10/26  23:05:43  lwall
- * patch1: unless was broken when run under the debugger
- * 
- * Revision 3.0  89/10/18  15:09:15  lwall
- * 3.0 baseline
+ * Revision 4.0  91/03/20  01:04:34  lwall
+ * 4.0 baseline.
  * 
  */
 
index a21a110..34d9ac2 100644 (file)
--- a/config.H
+++ b/config.H
@@ -1,3 +1,5 @@
+#ifndef config_h
+#define config_h
 /* config.h
  * This file was produced by running the config.h.SH script, which
  * gets its values from config.sh, which is generally produced by
  */
 
 
-/* EUNICE:
+/* EUNICE
  *     This symbol, if defined, indicates that the program is being compiled
  *     under the EUNICE package under VMS.  The program will need to handle
  *     things like files that don't go away the first time you unlink them,
  *     due to version numbering.  It will also need to compensate for lack
  *     of a respectable link() command.
  */
-/* VMS:
+/* VMS
  *     This symbol, if defined, indicates that the program is running under
  *     VMS.  It is currently only set in conjunction with the EUNICE symbol.
  */
 /*#undef       EUNICE          /**/
 /*#undef       VMS             /**/
 
-/* BIN:
+/* ALIGNBYTES
+ *     This symbol contains the number of bytes required to align a double.
+ *     Usual values are 2, 4, and 8.
+ */
+#define ALIGNBYTES 4           /**/
+
+/* BIN
  *     This symbol holds the name of the directory in which the user wants
- *     to put publicly executable images for the package in question.  It
+ *     to keep publicly executable images for the package in question.  It
  *     is most often a local directory such as /usr/local/bin.
  */
 #define BIN "/usr/local/bin"             /**/
 
-/* BYTEORDER:
+/* BYTEORDER
  *     This symbol contains an encoding of the order of bytes in a long.
  *     Usual values (in octal) are 01234, 04321, 02143, 03412...
  */
-#define BYTEORDER 01234                /**/
+#define BYTEORDER 0x1234               /**/
 
-/* CPPSTDIN:
+/* CPPSTDIN
  *     This symbol contains the first part of the string which will invoke
  *     the C preprocessor on the standard input and produce to standard
  *     output.  Typical value of "cc -E" or "/lib/cpp".
  */
-/* CPPMINUS:
+/* CPPMINUS
  *     This symbol contains the second part of the string which will invoke
  *     the C preprocessor on the standard input and produce to standard
  *     output.  This symbol will have the value "-" if CPPSTDIN needs a minus
  *     to specify standard input, otherwise the value is "".
  */
-#define CPPSTDIN "/lib/cpp"
-#define CPPMINUS ""
+#define CPPSTDIN "cc -E"
+#define CPPMINUS "-"
 
-/* BCMP:
+/* HAS_BCMP
  *     This symbol, if defined, indicates that the bcmp routine is available
  *     to compare blocks of memory.  If undefined, use memcmp.  If that's
  *     not available, roll your own.
  */
-#define        BCMP            /**/
+#define        HAS_BCMP                /**/
 
-/* BCOPY:
+/* HAS_BCOPY
  *     This symbol, if defined, indicates that the bcopy routine is available
  *     to copy blocks of memory.  Otherwise you should probably use memcpy().
  */
-#define        BCOPY           /**/
+#define        HAS_BCOPY               /**/
+
+/* HAS_BZERO
+ *     This symbol, if defined, indicates that the bzero routine is available
+ *     to zero blocks of memory.  Otherwise you should probably use memset()
+ *     or roll your own.
+ */
+#define        HAS_BZERO               /**/
 
-/* CHARSPRINTF:
+/* CASTNEGFLOAT
+ *     This symbol, if defined, indicates that this C compiler knows how to
+ *     cast negative or large floating point numbers to unsigned longs, ints
+ *     and shorts.
+ */
+/* CASTFLAGS
+ *     This symbol contains flags that say what difficulties the compiler
+ *     has casting odd floating values to unsigned long:
+ *             1 = couldn't cast < 0
+ *             2 = couldn't cast >= 0x80000000
+ */
+#define        CASTNEGFLOAT    /**/
+#define        CASTFLAGS 0     /**/
+
+/* CHARSPRINTF
  *     This symbol is defined if this system declares "char *sprintf()" in
  *     stdio.h.  The trend seems to be to declare it as "int sprintf()".  It
  *     is up to the package author to declare sprintf correctly based on the
  */
 #define        CHARSPRINTF     /**/
 
-/* CRYPT:
+/* HAS_CHSIZE
+ *     This symbol, if defined, indicates that the chsize routine is available
+ *     to truncate files.  You might need a -lx to get this routine.
+ */
+/*#undef       HAS_CHSIZE              /**/
+
+/* HAS_CRYPT
  *     This symbol, if defined, indicates that the crypt routine is available
  *     to encrypt passwords and the like.
  */
-#define        CRYPT           /**/
+#define        HAS_CRYPT               /**/
+
+/* CSH
+ *     This symbol, if defined, indicates that the C-shell exists.
+ *     If defined, contains the full pathname of csh.
+ */
+#define CSH "/bin/csh"         /**/
 
-/* DOSUID:
+/* DOSUID
  *     This symbol, if defined, indicates that the C program should
  *     check the script that it is executing for setuid/setgid bits, and
  *     attempt to emulate setuid/setgid on systems that have disabled
  *     subprocesses to which it must pass the filename rather than the
  *     file descriptor of the script to be executed.
  */
-#define DOSUID         /**/
+/*#undef DOSUID                /**/
 
-/* DUP2:
+/* HAS_DUP2
  *     This symbol, if defined, indicates that the dup2 routine is available
  *     to dup file descriptors.  Otherwise you should use dup().
  */
-#define        DUP2            /**/
+#define        HAS_DUP2                /**/
 
-/* FCHMOD:
+/* HAS_FCHMOD
  *     This symbol, if defined, indicates that the fchmod routine is available
  *     to change mode of opened files.  If unavailable, use chmod().
  */
-#define        FCHMOD          /**/
+#define        HAS_FCHMOD              /**/
 
-/* FCHOWN:
+/* HAS_FCHOWN
  *     This symbol, if defined, indicates that the fchown routine is available
  *     to change ownership of opened files.  If unavailable, use chown().
  */
-#define        FCHOWN          /**/
+#define        HAS_FCHOWN              /**/
 
-/* FCNTL:
- *     This symbol, if defined, indicates to the C program that it should
- *     include fcntl.h.
+/* HAS_FCNTL
+ *     This symbol, if defined, indicates to the C program that
+ *     the fcntl() function exists.
  */
-#define        FCNTL           /**/
+#define        HAS_FCNTL               /**/
 
-/* FLOCK:
+/* FLEXFILENAMES
+ *     This symbol, if defined, indicates that the system supports filenames
+ *     longer than 14 characters.
+ */
+#define        FLEXFILENAMES           /**/
+
+/* HAS_FLOCK
  *     This symbol, if defined, indicates that the flock() routine is
  *     available to do file locking.
  */
-#define        FLOCK           /**/
+#define        HAS_FLOCK               /**/
 
-/* GETGROUPS:
+/* HAS_GETGROUPS
  *     This symbol, if defined, indicates that the getgroups() routine is
  *     available to get the list of process groups.  If unavailable, multiple
  *     groups are probably not supported.
  */
-#define        GETGROUPS               /**/
+#define        HAS_GETGROUPS           /**/
 
-/* GETHOSTENT:
+/* HAS_GETHOSTENT
  *     This symbol, if defined, indicates that the gethostent() routine is
  *     available to lookup host names in some data base or other.
  */
-#define        GETHOSTENT              /**/
+#define        HAS_GETHOSTENT          /**/
 
-/* GETPGRP:
+/* HAS_GETPGRP
  *     This symbol, if defined, indicates that the getpgrp() routine is
  *     available to get the current process group.
  */
-#define        GETPGRP         /**/
+#define        HAS_GETPGRP             /**/
+
+/* HAS_GETPGRP2
+ *     This symbol, if defined, indicates that the getpgrp2() (as in DG/UX)
+ *     routine is available to get the current process group.
+ */
+/*#undef       HAS_GETPGRP2            /**/
 
-/* GETPRIORITY:
+/* HAS_GETPRIORITY
  *     This symbol, if defined, indicates that the getpriority() routine is
  *     available to get a process's priority.
  */
-#define        GETPRIORITY             /**/
+#define        HAS_GETPRIORITY         /**/
 
-/* HTONS:
+/* HAS_HTONS
  *     This symbol, if defined, indicates that the htons routine (and friends)
  *     are available to do network order byte swapping.
  */
-/* HTONL:
+/* HAS_HTONL
  *     This symbol, if defined, indicates that the htonl routine (and friends)
  *     are available to do network order byte swapping.
  */
-/* NTOHS:
+/* HAS_NTOHS
  *     This symbol, if defined, indicates that the ntohs routine (and friends)
  *     are available to do network order byte swapping.
  */
-/* NTOHL:
+/* HAS_NTOHL
  *     This symbol, if defined, indicates that the ntohl routine (and friends)
  *     are available to do network order byte swapping.
  */
-#define        HTONS           /**/
-#define        HTONL           /**/
-#define        NTOHS           /**/
-#define        NTOHL           /**/
+#define        HAS_HTONS       /**/
+#define        HAS_HTONL       /**/
+#define        HAS_NTOHS       /**/
+#define        HAS_NTOHL       /**/
 
-/* index:
+/* index
  *     This preprocessor symbol is defined, along with rindex, if the system
  *     uses the strchr and strrchr routines instead.
  */
-/* rindex:
+/* rindex
  *     This preprocessor symbol is defined, along with index, if the system
  *     uses the strchr and strrchr routines instead.
  */
 /*#undef       index strchr    /* cultural */
 /*#undef       rindex strrchr  /*  differences? */
 
-/* IOCTL:
- *     This symbol, if defined, indicates that sys/ioctl.h exists and should
- *     be included.
- */
-#define        IOCTL           /**/
-
-/* KILLPG:
+/* HAS_KILLPG
  *     This symbol, if defined, indicates that the killpg routine is available
  *     to kill process groups.  If unavailable, you probably should use kill
  *     with a negative process number.
  */
-#define        KILLPG          /**/
+#define        HAS_KILLPG              /**/
 
-/* MEMCMP:
+/* HAS_LSTAT
+ *     This symbol, if defined, indicates that the lstat() routine is
+ *     available to stat symbolic links.
+ */
+#define        HAS_LSTAT               /**/
+
+/* HAS_MEMCMP
  *     This symbol, if defined, indicates that the memcmp routine is available
  *     to compare blocks of memory.  If undefined, roll your own.
  */
-#define        MEMCMP          /**/
+#define        HAS_MEMCMP              /**/
 
-/* MEMCPY:
+/* HAS_MEMCPY
  *     This symbol, if defined, indicates that the memcpy routine is available
  *     to copy blocks of memory.  Otherwise you should probably use bcopy().
  *     If neither is defined, roll your own.
  */
-#define        MEMCPY          /**/
+#define        HAS_MEMCPY              /**/
 
-/* MKDIR:
+/* HAS_MKDIR
  *     This symbol, if defined, indicates that the mkdir routine is available
  *     to create directories.  Otherwise you should fork off a new process to
  *     exec /bin/mkdir.
  */
-#define        MKDIR           /**/
+#define        HAS_MKDIR               /**/
+
+/* HAS_MSG
+ *     This symbol, if defined, indicates that the entire msg*(2) library is
+ *     supported.
+ */
+#define        HAS_MSG         /**/
+
+/* HAS_MSGCTL
+ *     This symbol, if defined, indicates that the msgctl() routine is
+ *     available to stat symbolic links.
+ */
+#define        HAS_MSGCTL              /**/
+
+/* HAS_MSGGET
+ *     This symbol, if defined, indicates that the msgget() routine is
+ *     available to stat symbolic links.
+ */
+#define        HAS_MSGGET              /**/
+
+/* HAS_MSGRCV
+ *     This symbol, if defined, indicates that the msgrcv() routine is
+ *     available to stat symbolic links.
+ */
+#define        HAS_MSGRCV              /**/
 
-/* NDBM:
+/* HAS_MSGSND
+ *     This symbol, if defined, indicates that the msgsnd() routine is
+ *     available to stat symbolic links.
+ */
+#define        HAS_MSGSND              /**/
+
+/* HAS_NDBM
  *     This symbol, if defined, indicates that ndbm.h exists and should
  *     be included.
  */
-#define        NDBM            /**/
+#define        HAS_NDBM                /**/
 
-/* ODBM:
+/* HAS_ODBM
  *     This symbol, if defined, indicates that dbm.h exists and should
  *     be included.
  */
-#define        ODBM            /**/
+#define        HAS_ODBM                /**/
+
+/* HAS_OPEN3
+ *     This manifest constant lets the C program know that the three
+ *     argument form of open(2) is available.
+ */
+#define        HAS_OPEN3               /**/
 
-/* READDIR:
+/* HAS_READDIR
  *     This symbol, if defined, indicates that the readdir routine is available
- *     from the C library to create directories.
+ *     from the C library to read directories.
  */
-#define        READDIR         /**/
+#define        HAS_READDIR             /**/
 
-/* RENAME:
+/* HAS_RENAME
  *     This symbol, if defined, indicates that the rename routine is available
  *     to rename files.  Otherwise you should do the unlink(), link(), unlink()
  *     trick.
  */
-#define        RENAME          /**/
+#define        HAS_RENAME              /**/
 
-/* RMDIR:
+/* HAS_RMDIR
  *     This symbol, if defined, indicates that the rmdir routine is available
  *     to remove directories.  Otherwise you should fork off a new process to
  *     exec /bin/rmdir.
  */
-#define        RMDIR           /**/
+#define        HAS_RMDIR               /**/
+
+/* HAS_SELECT
+ *     This symbol, if defined, indicates that the select() subroutine
+ *     exists.
+ */
+#define        HAS_SELECT      /**/
+
+/* HAS_SEM
+ *     This symbol, if defined, indicates that the entire sem*(2) library is
+ *     supported.
+ */
+#define        HAS_SEM         /**/
+
+/* HAS_SEMCTL
+ *     This symbol, if defined, indicates that the semctl() routine is
+ *     available to stat symbolic links.
+ */
+#define        HAS_SEMCTL              /**/
+
+/* HAS_SEMGET
+ *     This symbol, if defined, indicates that the semget() routine is
+ *     available to stat symbolic links.
+ */
+#define        HAS_SEMGET              /**/
+
+/* HAS_SEMOP
+ *     This symbol, if defined, indicates that the semop() routine is
+ *     available to stat symbolic links.
+ */
+#define        HAS_SEMOP               /**/
 
-/* SETEGID:
+/* HAS_SETEGID
  *     This symbol, if defined, indicates that the setegid routine is available
  *     to change the effective gid of the current program.
  */
-#define        SETEGID         /**/
+#define        HAS_SETEGID             /**/
 
-/* SETEUID:
+/* HAS_SETEUID
  *     This symbol, if defined, indicates that the seteuid routine is available
  *     to change the effective uid of the current program.
  */
-#define        SETEUID         /**/
+#define        HAS_SETEUID             /**/
 
-/* SETPGRP:
+/* HAS_SETPGRP
  *     This symbol, if defined, indicates that the setpgrp() routine is
  *     available to set the current process group.
  */
-#define        SETPGRP         /**/
+#define        HAS_SETPGRP             /**/
 
-/* SETPRIORITY:
+/* HAS_SETPGRP2
+ *     This symbol, if defined, indicates that the setpgrp2() (as in DG/UX)
+ *     routine is available to set the current process group.
+ */
+/*#undef       HAS_SETPGRP2            /**/
+
+/* HAS_SETPRIORITY
  *     This symbol, if defined, indicates that the setpriority() routine is
  *     available to set a process's priority.
  */
-#define        SETPRIORITY             /**/
+#define        HAS_SETPRIORITY         /**/
 
-/* SETREGID:
- *     This symbol, if defined, indicates that the setregid routine is available
- *     to change the real and effective gid of the current program.
+/* HAS_SETREGID
+ *     This symbol, if defined, indicates that the setregid routine is
+ *     available to change the real and effective gid of the current program.
  */
-#define        SETREGID                /**/
+/* HAS_SETRESGID
+ *     This symbol, if defined, indicates that the setresgid routine is
+ *     available to change the real, effective and saved gid of the current
+ *     program.
+ */
+#define        HAS_SETREGID            /**/
+/*#undef       HAS_SETRESGID           /**/
 
-/* SETREUID:
- *     This symbol, if defined, indicates that the setreuid routine is available
- *     to change the real and effective uid of the current program.
+/* HAS_SETREUID
+ *     This symbol, if defined, indicates that the setreuid routine is
+ *     available to change the real and effective uid of the current program.
+ */
+/* HAS_SETRESUID
+ *     This symbol, if defined, indicates that the setresuid routine is
+ *     available to change the real, effective and saved uid of the current
+ *     program.
  */
-#define        SETREUID                /**/
+#define        HAS_SETREUID            /**/
+/*#undef       HAS_SETRESUID           /**/
 
-/* SETRGID:
+/* HAS_SETRGID
  *     This symbol, if defined, indicates that the setrgid routine is available
  *     to change the real gid of the current program.
  */
-#define        SETRGID         /**/
+#define        HAS_SETRGID             /**/
 
-/* SETRUID:
+/* HAS_SETRUID
  *     This symbol, if defined, indicates that the setruid routine is available
  *     to change the real uid of the current program.
  */
-#define        SETRUID         /**/
+#define        HAS_SETRUID             /**/
+
+/* HAS_SHM
+ *     This symbol, if defined, indicates that the entire shm*(2) library is
+ *     supported.
+ */
+#define        HAS_SHM         /**/
+
+/* HAS_SHMAT
+ *     This symbol, if defined, indicates that the shmat() routine is
+ *     available to stat symbolic links.
+ */
+#define        HAS_SHMAT               /**/
+
+/* HAS_SHMCTL
+ *     This symbol, if defined, indicates that the shmctl() routine is
+ *     available to stat symbolic links.
+ */
+#define        HAS_SHMCTL              /**/
+
+/* HAS_SHMDT
+ *     This symbol, if defined, indicates that the shmdt() routine is
+ *     available to stat symbolic links.
+ */
+#define        HAS_SHMDT               /**/
+
+/* HAS_SHMGET
+ *     This symbol, if defined, indicates that the shmget() routine is
+ *     available to stat symbolic links.
+ */
+#define        HAS_SHMGET              /**/
 
-/* SOCKET:
+/* HAS_SOCKET
  *     This symbol, if defined, indicates that the BSD socket interface is
  *     supported.
  */
-/* SOCKETPAIR:
+/* HAS_SOCKETPAIR
  *     This symbol, if defined, indicates that the BSD socketpair call is
  *     supported.
  */
-/* OLDSOCKET:
+/* OLDSOCKET
  *     This symbol, if defined, indicates that the 4.1c BSD socket interface
  *     is supported instead of the 4.2/4.3 BSD socket interface.
  */
-#define        SOCKET          /**/
+#define        HAS_SOCKET              /**/
 
-#define        SOCKETPAIR      /**/
+#define        HAS_SOCKETPAIR  /**/
 
 /*#undef       OLDSOCKET       /**/
 
-/* STATBLOCKS:
+/* STATBLOCKS
  *     This symbol is defined if this system has a stat structure declaring
  *     st_blksize and st_blocks.
  */
 #define        STATBLOCKS      /**/
 
-/* STDSTDIO:
+/* STDSTDIO
  *     This symbol is defined if this system has a FILE structure declaring
  *     _ptr and _cnt in stdio.h.
  */
 #define        STDSTDIO        /**/
 
-/* STRUCTCOPY:
+/* STRUCTCOPY
  *     This symbol, if defined, indicates that this C compiler knows how
  *     to copy structures.  If undefined, you'll need to use a block copy
  *     routine of some sort instead.
  */
 #define        STRUCTCOPY      /**/
 
-/* SYMLINK:
+/* HAS_STRERROR
+ *     This symbol, if defined, indicates that the strerror() routine is
+ *     available to translate error numbers to strings.
+ */
+/*#undef       HAS_STRERROR            /**/
+
+/* HAS_SYMLINK
  *     This symbol, if defined, indicates that the symlink routine is available
  *     to create symbolic links.
  */
-#define        SYMLINK         /**/
+#define        HAS_SYMLINK             /**/
 
-/* SYSCALL:
+/* HAS_SYSCALL
  *     This symbol, if defined, indicates that the syscall routine is available
  *     to call arbitrary system calls.  If undefined, that's tough.
  */
-#define        SYSCALL         /**/
-
-/* TMINSYS:
- *     This symbol is defined if this system declares "struct tm" in
- *     in <sys/time.h> rather than <time.h>.  We can't just say
- *     -I/usr/include/sys because some systems have both time files, and
- *     the -I trick gets the wrong one.
- */
-/* I_SYSTIME:
- *     This symbol is defined if this system has the file <sys/time.h>.
- */
-/*#undef       TMINSYS         /**/
-#define        I_SYSTIME       /**/
+#define        HAS_SYSCALL             /**/
 
-/* VARARGS:
- *     This symbol, if defined, indicates to the C program that it should
- *     include varargs.h.
+/* HAS_TRUNCATE
+ *     This symbol, if defined, indicates that the truncate routine is
+ *     available to truncate files.
  */
-#define        VARARGS         /**/
+#define        HAS_TRUNCATE            /**/
 
-/* vfork:
- *     This symbol, if defined, remaps the vfork routine to fork if the
- *     vfork() routine isn't supported here.
+/* HAS_VFORK
+ *     This symbol, if defined, indicates that vfork() exists.
  */
-/*#undef       vfork fork      /**/
+#define        HAS_VFORK       /**/
 
-/* VOIDSIG:
+/* VOIDSIG
  *     This symbol is defined if this system declares "void (*signal())()" in
  *     signal.h.  The old way was to declare it as "int (*signal())()".  It
  *     is up to the package author to declare things correctly based on the
  *     symbol.
  */
+/* TO_SIGNAL
+ *     This symbol's value is either "void" or "int", corresponding to the
+ *     appropriate return "type" of a signal handler.  Thus, one can declare
+ *     a signal handler using "TO_SIGNAL (*handler())()", and define the
+ *     handler using "TO_SIGNAL handler(sig)".
+ */
 /*#undef       VOIDSIG         /**/
+#define        TO_SIGNAL               /**/
 
-/* VPRINTF:
+/* HASVOLATILE
+ *     This symbol, if defined, indicates that this C compiler knows about
+ *     the volatile declaration.
+ */
+/*#undef       HASVOLATILE     /**/
+
+/* HAS_VPRINTF
  *     This symbol, if defined, indicates that the vprintf routine is available
  *     to printf with a pointer to an argument list.  If unavailable, you
  *     may need to write your own, probably in terms of _doprnt().
  */
-/* CHARVSPRINTF:
+/* CHARVSPRINTF
  *     This symbol is defined if this system has vsprintf() returning type
  *     (char*).  The trend seems to be to declare it as "int vsprintf()".  It
  *     is up to the package author to declare vsprintf correctly based on the
  *     symbol.
  */
-/*#undef       VPRINTF         /**/
+/*#undef       HAS_VPRINTF     /**/
 /*#undef       CHARVSPRINTF    /**/
 
-/* GIDTYPE:
+/* HAS_WAIT4
+ *     This symbol, if defined, indicates that wait4() exists.
+ */
+#define        HAS_WAIT4       /**/
+
+/* HAS_WAITPID
+ *     This symbol, if defined, indicates that waitpid() exists.
+ */
+/*#undef       HAS_WAITPID     /**/
+
+/* GIDTYPE
  *     This symbol has a value like gid_t, int, ushort, or whatever type is
  *     used to declare group ids in the kernel.
  */
-#define GIDTYPE gid_t          /**/
+#define GIDTYPE int            /**/
 
-/* I_DIRENT:
- *     This symbol, if defined, indicates to the C program that it should
- *     include dirent.h.
+/* I_FCNTL
+ *     This manifest constant tells the C program to include <fcntl.h>.
  */
-/* DIRNAMLEN:
- *     This symbol, if defined, indicates to the C program that the length
- *     of directory entry names is provided by a d_namlen field.  Otherwise
- *     you need to do strlen() on the d_name field.
- */
-/*#undef       I_DIRENT                /**/
-#define        DIRNAMLEN               /**/
+/*#undef       I_FCNTL /**/
 
-/* I_FCNTL:
- *     This symbol, if defined, indicates to the C program that it should
- *     include fcntl.h.
+/* I_GDBM
+ *     This symbol, if defined, indicates that gdbm.h exists and should
+ *     be included.
  */
-#define        I_FCNTL         /**/
+/*#undef       I_GDBM          /**/
 
-/* I_GRP:
+/* I_GRP
  *     This symbol, if defined, indicates to the C program that it should
  *     include grp.h.
  */
 #define        I_GRP           /**/
 
-/* I_PWD:
+/* I_NETINET_IN
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include netinet/in.h.
+ */
+/* I_SYS_IN
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include sys/in.h.
+ */
+#define        I_NETINET_IN            /**/
+/*#undef       I_SYS_IN                /**/
+
+/* I_PWD
  *     This symbol, if defined, indicates to the C program that it should
  *     include pwd.h.
  */
-/* PWQUOTA:
+/* PWQUOTA
  *     This symbol, if defined, indicates to the C program that struct passwd
  *     contains pw_quota.
  */
-/* PWAGE:
+/* PWAGE
  *     This symbol, if defined, indicates to the C program that struct passwd
  *     contains pw_age.
  */
+/* PWCHANGE
+ *     This symbol, if defined, indicates to the C program that struct passwd
+ *     contains pw_change.
+ */
+/* PWCLASS
+ *     This symbol, if defined, indicates to the C program that struct passwd
+ *     contains pw_class.
+ */
+/* PWEXPIRE
+ *     This symbol, if defined, indicates to the C program that struct passwd
+ *     contains pw_expire.
+ */
+/* PWCOMMENT
+ *     This symbol, if defined, indicates to the C program that struct passwd
+ *     contains pw_comment.
+ */
 #define        I_PWD           /**/
-#define        PWQUOTA         /**/
+/*#undef       PWQUOTA         /**/
 /*#undef       PWAGE           /**/
+/*#undef       PWCHANGE        /**/
+/*#undef       PWCLASS         /**/
+/*#undef       PWEXPIRE        /**/
+/*#undef       PWCOMMENT       /**/
 
-/* I_SYSDIR:
- *     This symbol, if defined, indicates to the C program that it should
- *     include sys/dir.h.
+/* I_SYS_FILE
+ *     This manifest constant tells the C program to include <sys/file.h>.
  */
-#define        I_SYSDIR                /**/
+#define        I_SYS_FILE      /**/
 
-/* I_SYSIOCTL:
+/* I_SYSIOCTL
  *     This symbol, if defined, indicates that sys/ioctl.h exists and should
  *     be included.
  */
 #define        I_SYSIOCTL              /**/
 
-/* I_VARARGS:
+/* I_TIME
+ *     This symbol is defined if the program should include <time.h>.
+ */
+/* I_SYS_TIME
+ *     This symbol is defined if the program should include <sys/time.h>.
+ */
+/* SYSTIMEKERNEL
+ *     This symbol is defined if the program should include <sys/time.h>
+ *     with KERNEL defined.
+ */
+/* I_SYS_SELECT
+ *     This symbol is defined if the program should include <sys/select.h>.
+ */
+/*#undef       I_TIME          /**/
+#define        I_SYS_TIME      /**/
+/*#undef       SYSTIMEKERNEL   /**/
+/*#undef       I_SYS_SELECT    /**/
+
+/* I_UTIME
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include utime.h.
+ */
+/*#undef       I_UTIME         /**/
+
+/* I_VARARGS
  *     This symbol, if defined, indicates to the C program that it should
  *     include varargs.h.
  */
 #define        I_VARARGS               /**/
 
-/* INTSIZE:
+/* I_VFORK
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include vfork.h.
+ */
+/*#undef       I_VFORK         /**/
+
+/* INTSIZE
  *     This symbol contains the size of an int, so that the C preprocessor
  *     can make decisions based on it.
  */
 #define INTSIZE 4              /**/
 
-/* RANDBITS:
+/* I_DIRENT
+ *     This symbol, if defined, indicates that the program should use the
+ *     P1003-style directory routines, and include <dirent.h>.
+ */
+/* I_SYS_DIR
+ *     This symbol, if defined, indicates that the program should use the
+ *     directory functions by including <sys/dir.h>.
+ */
+/* I_NDIR
+ *     This symbol, if defined, indicates that the program should include the
+ *     system's version of ndir.h, rather than the one with this package.
+ */
+/* I_SYS_NDIR
+ *     This symbol, if defined, indicates that the program should include the
+ *     system's version of sys/ndir.h, rather than the one with this package.
+ */
+/* I_MY_DIR
+ *     This symbol, if defined, indicates that the program should compile
+ *     the ndir.c code provided with the package.
+ */
+/* DIRNAMLEN
+ *     This symbol, if defined, indicates to the C program that the length
+ *     of directory entry names is provided by a d_namlen field.  Otherwise
+ *     you need to do strlen() on the d_name field.
+ */
+#define        I_DIRENT        /**/
+/*#undef       I_SYS_DIR       /**/
+/*#undef       I_NDIR          /**/
+/*#undef       I_SYS_NDIR      /**/
+/*#undef       I_MY_DIR        /**/
+/*#undef       DIRNAMLEN       /**/
+
+
+/* RANDBITS
  *     This symbol contains the number of bits of random number the rand()
  *     function produces.  Usual values are 15, 16, and 31.
  */
 #define RANDBITS 31            /**/
 
-/* SIG_NAME:
+/* SCRIPTDIR
+ *     This symbol holds the name of the directory in which the user wants
+ *     to put publicly executable scripts for the package in question.  It
+ *     is often a directory that is mounted across diverse architectures.
+ */
+#define SCRIPTDIR "/usr/local/bin"             /**/
+
+/* SIG_NAME
  *     This symbol contains an list of signal names in order.
  */
-#define SIG_NAME "ZERO","HUP","INT","QUIT","ILL","TRAP","IOT","EMT","FPE","KILL","BUS","SEGV","SYS","PIPE","ALRM","TERM","URG","STOP","TSTP","CONT","CHLD","TTIN","TTOU","IO","XCPU","XFSZ","VTALRM","PROF","WINCH","USR1","USR2"              /**/
+#define SIG_NAME "ZERO","HUP","INT","QUIT","ILL","TRAP","IOT","EMT","FPE","KILL","BUS","SEGV","SYS","PIPE","ALRM","TERM","URG","STOP","TSTP","CONT","CHLD","TTIN","TTOU","IO","XCPU","XFSZ","VTALRM","PROF","WINCH","LOST","USR1","USR2"               /**/
 
-/* STDCHAR:
+/* STDCHAR
  *     This symbol is defined to be the type of char used in stdio.h.
  *     It has the values "unsigned char" or "char".
  */
 #define STDCHAR char   /**/
 
-/* UIDTYPE:
+/* UIDTYPE
  *     This symbol has a value like uid_t, int, ushort, or whatever type is
  *     used to declare user ids in the kernel.
  */
 #define UIDTYPE uid_t          /**/
 
-/* VOIDFLAGS:
+/* VOIDHAVE
  *     This symbol indicates how much support of the void type is given by this
  *     compiler.  What various bits mean:
  *
  *         4 = supports comparisons between pointers to void functions and
  *                 addresses of void functions
  *
- *     The package designer should define VOIDUSED to indicate the requirements
- *     of the package.  This can be done either by #defining VOIDUSED before
- *     including config.h, or by defining defvoidused in Myinit.U.  If the
- *     latter approach is taken, only those flags will be tested.  If the
- *     level of void support necessary is not present, defines void to int.
- */
-#ifndef VOIDUSED
-#define VOIDUSED 7
+ *     The package designer should define VOIDWANT to indicate the requirements
+ *     of the package.  This can be done either by #defining VOIDWANT before
+ *     including config.h, or by defining voidwant in Myinit.U.  If the level
+ *     of void support necessary is not present, config.h defines void to "int",
+ *     VOID to the empty string, and VOIDP to "char *".
+ */
+/* void
+ *     This symbol is used for void casts.  On implementations which support
+ *     void appropriately, its value is "void".  Otherwise, its value maps
+ *     to "int".
+ */
+/* VOID
+ *     This symbol's value is "void" if the implementation supports void
+ *     appropriately.  Otherwise, its value is the empty string.  The primary
+ *     use of this symbol is in specifying void parameter lists for function
+ *     prototypes.
+ */
+/* VOIDP
+ *     This symbol is used for casting generic pointers.  On implementations
+ *     which support void appropriately, its value is "void *".  Otherwise,
+ *     its value is "char *".
+ */
+#ifndef VOIDWANT
+#define VOIDWANT 1
 #endif
-#define VOIDFLAGS 7
-#if (VOIDFLAGS & VOIDUSED) != VOIDUSED
+#define VOIDHAVE 1
+#if (VOIDHAVE & VOIDWANT) != VOIDWANT
 #define void int               /* is void to be avoided? */
+#define VOID
+#define VOIDP (char *)
 #define M_VOID         /* Xenix strikes again */
+#else
+#define VOID void
+#define VOIDP (void *)
 #endif
 
-/* PRIVLIB:
+/* PRIVLIB
  *     This symbol contains the name of the private library for this package.
  *     The library is private in the sense that it needn't be in anyone's
  *     execution path, but it should be accessible by the world.  The program
  */
 #define PRIVLIB "/usr/local/lib/perl"          /**/
 
+#endif
similarity index 65%
rename from config.h.SH
rename to config_h.SH
index ad1f801..b0cfe99 100644 (file)
@@ -1,3 +1,4 @@
+: make config.h.SH
 case $CONFIG in
 '')
     if test ! -f config.sh; then
@@ -6,12 +7,14 @@ case $CONFIG in
        ln ../../../config.sh . || \
        (echo "Can't find config.sh."; exit 1)
        echo "Using config.sh from above..."
-    fi
+    fi 2>/dev/null
     . ./config.sh
     ;;
 esac
 echo "Extracting config.h (with variable substitutions)"
 sed <<!GROK!THIS! >config.h -e 's!^#undef!/\*#undef!'
+#ifndef config_h
+#define config_h
 /* config.h
  * This file was produced by running the config.h.SH script, which
  * gets its values from config.sh, which is generally produced by
@@ -23,45 +26,45 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef!/\*#undef!'
  */
 
 
-/* EUNICE:
+/* EUNICE
  *     This symbol, if defined, indicates that the program is being compiled
  *     under the EUNICE package under VMS.  The program will need to handle
  *     things like files that don't go away the first time you unlink them,
  *     due to version numbering.  It will also need to compensate for lack
  *     of a respectable link() command.
  */
-/* VMS:
+/* VMS
  *     This symbol, if defined, indicates that the program is running under
  *     VMS.  It is currently only set in conjunction with the EUNICE symbol.
  */
 #$d_eunice     EUNICE          /**/
 #$d_eunice     VMS             /**/
 
-/* ALIGNBYTES:
+/* ALIGNBYTES
  *     This symbol contains the number of bytes required to align a double.
  *     Usual values are 2, 4, and 8.
  */
 #define ALIGNBYTES $alignbytes         /**/
 
-/* BIN:
+/* BIN
  *     This symbol holds the name of the directory in which the user wants
- *     to put publicly executable images for the package in question.  It
+ *     to keep publicly executable images for the package in question.  It
  *     is most often a local directory such as /usr/local/bin.
  */
 #define BIN "$bin"             /**/
 
-/* BYTEORDER:
+/* BYTEORDER
  *     This symbol contains an encoding of the order of bytes in a long.
  *     Usual values (in octal) are 01234, 04321, 02143, 03412...
  */
 #define BYTEORDER 0x$byteorder         /**/
 
-/* CPPSTDIN:
+/* CPPSTDIN
  *     This symbol contains the first part of the string which will invoke
  *     the C preprocessor on the standard input and produce to standard
  *     output.  Typical value of "cc -E" or "/lib/cpp".
  */
-/* CPPMINUS:
+/* CPPMINUS
  *     This symbol contains the second part of the string which will invoke
  *     the C preprocessor on the standard input and produce to standard
  *     output.  This symbol will have the value "-" if CPPSTDIN needs a minus
@@ -70,30 +73,32 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef!/\*#undef!'
 #define CPPSTDIN "$cppstdin"
 #define CPPMINUS "$cppminus"
 
-/* BCMP:
+/* HAS_BCMP
  *     This symbol, if defined, indicates that the bcmp routine is available
  *     to compare blocks of memory.  If undefined, use memcmp.  If that's
  *     not available, roll your own.
  */
-#$d_bcmp       BCMP            /**/
+#$d_bcmp       HAS_BCMP                /**/
 
-/* BCOPY:
+/* HAS_BCOPY
  *     This symbol, if defined, indicates that the bcopy routine is available
  *     to copy blocks of memory.  Otherwise you should probably use memcpy().
  */
-#$d_bcopy      BCOPY           /**/
+#$d_bcopy      HAS_BCOPY               /**/
 
-/* BZERO:
+/* HAS_BZERO
  *     This symbol, if defined, indicates that the bzero routine is available
- *     to zero blocks of memory.  Otherwise you should probably use memcpy().
+ *     to zero blocks of memory.  Otherwise you should probably use memset()
+ *     or roll your own.
  */
-#$d_bzero      BZERO           /**/
+#$d_bzero      HAS_BZERO               /**/
 
-/* CASTNEGFLOAT:
+/* CASTNEGFLOAT
  *     This symbol, if defined, indicates that this C compiler knows how to
- *     cast negative numbers to unsigned longs, ints and shorts.
+ *     cast negative or large floating point numbers to unsigned longs, ints
+ *     and shorts.
  */
-/* CASTFLAGS:
+/* CASTFLAGS
  *     This symbol contains flags that say what difficulties the compiler
  *     has casting odd floating values to unsigned long:
  *             1 = couldn't cast < 0
@@ -102,7 +107,7 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef!/\*#undef!'
 #$d_castneg    CASTNEGFLOAT    /**/
 #define        CASTFLAGS $castflags    /**/
 
-/* CHARSPRINTF:
+/* CHARSPRINTF
  *     This symbol is defined if this system declares "char *sprintf()" in
  *     stdio.h.  The trend seems to be to declare it as "int sprintf()".  It
  *     is up to the package author to declare sprintf correctly based on the
@@ -110,25 +115,25 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef!/\*#undef!'
  */
 #$d_charsprf   CHARSPRINTF     /**/
 
-/* CHSIZE:
+/* HAS_CHSIZE
  *     This symbol, if defined, indicates that the chsize routine is available
  *     to truncate files.  You might need a -lx to get this routine.
  */
-#$d_chsize     CHSIZE          /**/
+#$d_chsize     HAS_CHSIZE              /**/
 
-/* CRYPT:
+/* HAS_CRYPT
  *     This symbol, if defined, indicates that the crypt routine is available
  *     to encrypt passwords and the like.
  */
-#$d_crypt      CRYPT           /**/
+#$d_crypt      HAS_CRYPT               /**/
 
-/* CSH:
+/* CSH
  *     This symbol, if defined, indicates that the C-shell exists.
  *     If defined, contains the full pathname of csh.
  */
 #$d_csh CSH "$csh"             /**/
 
-/* DOSUID:
+/* DOSUID
  *     This symbol, if defined, indicates that the C program should
  *     check the script that it is executing for setuid/setgid bits, and
  *     attempt to emulate setuid/setgid on systems that have disabled
@@ -143,538 +148,630 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef!/\*#undef!'
  */
 #$d_dosuid DOSUID              /**/
 
-/* DUP2:
+/* HAS_DUP2
  *     This symbol, if defined, indicates that the dup2 routine is available
  *     to dup file descriptors.  Otherwise you should use dup().
  */
-#$d_dup2       DUP2            /**/
+#$d_dup2       HAS_DUP2                /**/
 
-/* FCHMOD:
+/* HAS_FCHMOD
  *     This symbol, if defined, indicates that the fchmod routine is available
  *     to change mode of opened files.  If unavailable, use chmod().
  */
-#$d_fchmod     FCHMOD          /**/
+#$d_fchmod     HAS_FCHMOD              /**/
 
-/* FCHOWN:
+/* HAS_FCHOWN
  *     This symbol, if defined, indicates that the fchown routine is available
  *     to change ownership of opened files.  If unavailable, use chown().
  */
-#$d_fchown     FCHOWN          /**/
+#$d_fchown     HAS_FCHOWN              /**/
 
-/* FCNTL:
- *     This symbol, if defined, indicates to the C program that it should
- *     include fcntl.h.
+/* HAS_FCNTL
+ *     This symbol, if defined, indicates to the C program that
+ *     the fcntl() function exists.
  */
-#$d_fcntl      FCNTL           /**/
+#$d_fcntl      HAS_FCNTL               /**/
 
-/* FLEXFILENAMES:
+/* FLEXFILENAMES
  *     This symbol, if defined, indicates that the system supports filenames
  *     longer than 14 characters.
  */
 #$d_flexfnam   FLEXFILENAMES           /**/
 
-/* FLOCK:
+/* HAS_FLOCK
  *     This symbol, if defined, indicates that the flock() routine is
  *     available to do file locking.
  */
-#$d_flock      FLOCK           /**/
+#$d_flock      HAS_FLOCK               /**/
 
-/* GETGROUPS:
+/* HAS_GETGROUPS
  *     This symbol, if defined, indicates that the getgroups() routine is
  *     available to get the list of process groups.  If unavailable, multiple
  *     groups are probably not supported.
  */
-#$d_getgrps    GETGROUPS               /**/
+#$d_getgrps    HAS_GETGROUPS           /**/
 
-/* GETHOSTENT:
+/* HAS_GETHOSTENT
  *     This symbol, if defined, indicates that the gethostent() routine is
  *     available to lookup host names in some data base or other.
  */
-#$d_gethent    GETHOSTENT              /**/
+#$d_gethent    HAS_GETHOSTENT          /**/
 
-/* GETPGRP:
+/* HAS_GETPGRP
  *     This symbol, if defined, indicates that the getpgrp() routine is
  *     available to get the current process group.
  */
-#$d_getpgrp    GETPGRP         /**/
+#$d_getpgrp    HAS_GETPGRP             /**/
 
-/* GETPGRP2:
+/* HAS_GETPGRP2
  *     This symbol, if defined, indicates that the getpgrp2() (as in DG/UX)
  *     routine is available to get the current process group.
  */
-#$d_getpgrp2   GETPGRP2                /**/
+#$d_getpgrp2   HAS_GETPGRP2            /**/
 
-/* GETPRIORITY:
+/* HAS_GETPRIORITY
  *     This symbol, if defined, indicates that the getpriority() routine is
  *     available to get a process's priority.
  */
-#$d_getprior   GETPRIORITY             /**/
+#$d_getprior   HAS_GETPRIORITY         /**/
 
-/* HTONS:
+/* HAS_HTONS
  *     This symbol, if defined, indicates that the htons routine (and friends)
  *     are available to do network order byte swapping.
  */
-/* HTONL:
+/* HAS_HTONL
  *     This symbol, if defined, indicates that the htonl routine (and friends)
  *     are available to do network order byte swapping.
  */
-/* NTOHS:
+/* HAS_NTOHS
  *     This symbol, if defined, indicates that the ntohs routine (and friends)
  *     are available to do network order byte swapping.
  */
-/* NTOHL:
+/* HAS_NTOHL
  *     This symbol, if defined, indicates that the ntohl routine (and friends)
  *     are available to do network order byte swapping.
  */
-#$d_htonl      HTONS           /**/
-#$d_htonl      HTONL           /**/
-#$d_htonl      NTOHS           /**/
-#$d_htonl      NTOHL           /**/
+#$d_htonl      HAS_HTONS       /**/
+#$d_htonl      HAS_HTONL       /**/
+#$d_htonl      HAS_NTOHS       /**/
+#$d_htonl      HAS_NTOHL       /**/
 
-/* index:
+/* index
  *     This preprocessor symbol is defined, along with rindex, if the system
  *     uses the strchr and strrchr routines instead.
  */
-/* rindex:
+/* rindex
  *     This preprocessor symbol is defined, along with index, if the system
  *     uses the strchr and strrchr routines instead.
  */
 #$d_index      index strchr    /* cultural */
 #$d_index      rindex strrchr  /*  differences? */
 
-/* IOCTL:
- *     This symbol, if defined, indicates that sys/ioctl.h exists and should
- *     be included.
- */
-#$d_ioctl      IOCTL           /**/
-
-/* KILLPG:
+/* HAS_KILLPG
  *     This symbol, if defined, indicates that the killpg routine is available
  *     to kill process groups.  If unavailable, you probably should use kill
  *     with a negative process number.
  */
-#$d_killpg     KILLPG          /**/
+#$d_killpg     HAS_KILLPG              /**/
 
-/* LSTAT:
+/* HAS_LSTAT
  *     This symbol, if defined, indicates that the lstat() routine is
- *     available to do file locking.
+ *     available to stat symbolic links.
  */
-#$d_lstat      LSTAT           /**/
+#$d_lstat      HAS_LSTAT               /**/
 
-/* MEMCMP:
+/* HAS_MEMCMP
  *     This symbol, if defined, indicates that the memcmp routine is available
  *     to compare blocks of memory.  If undefined, roll your own.
  */
-#$d_memcmp     MEMCMP          /**/
+#$d_memcmp     HAS_MEMCMP              /**/
 
-/* MEMCPY:
+/* HAS_MEMCPY
  *     This symbol, if defined, indicates that the memcpy routine is available
  *     to copy blocks of memory.  Otherwise you should probably use bcopy().
  *     If neither is defined, roll your own.
  */
-#$d_memcpy     MEMCPY          /**/
+#$d_memcpy     HAS_MEMCPY              /**/
 
-/* MKDIR:
+/* HAS_MKDIR
  *     This symbol, if defined, indicates that the mkdir routine is available
  *     to create directories.  Otherwise you should fork off a new process to
  *     exec /bin/mkdir.
  */
-#$d_mkdir      MKDIR           /**/
+#$d_mkdir      HAS_MKDIR               /**/
+
+/* HAS_MSG
+ *     This symbol, if defined, indicates that the entire msg*(2) library is
+ *     supported.
+ */
+#$d_msg        HAS_MSG         /**/
+
+/* HAS_MSGCTL
+ *     This symbol, if defined, indicates that the msgctl() routine is
+ *     available to stat symbolic links.
+ */
+#$d_msgctl     HAS_MSGCTL              /**/
 
-/* NDBM:
+/* HAS_MSGGET
+ *     This symbol, if defined, indicates that the msgget() routine is
+ *     available to stat symbolic links.
+ */
+#$d_msgget     HAS_MSGGET              /**/
+
+/* HAS_MSGRCV
+ *     This symbol, if defined, indicates that the msgrcv() routine is
+ *     available to stat symbolic links.
+ */
+#$d_msgrcv     HAS_MSGRCV              /**/
+
+/* HAS_MSGSND
+ *     This symbol, if defined, indicates that the msgsnd() routine is
+ *     available to stat symbolic links.
+ */
+#$d_msgsnd     HAS_MSGSND              /**/
+
+/* HAS_NDBM
  *     This symbol, if defined, indicates that ndbm.h exists and should
  *     be included.
  */
-#$d_ndbm       NDBM            /**/
+#$d_ndbm       HAS_NDBM                /**/
 
-/* ODBM:
+/* HAS_ODBM
  *     This symbol, if defined, indicates that dbm.h exists and should
  *     be included.
  */
-#$d_odbm       ODBM            /**/
+#$d_odbm       HAS_ODBM                /**/
 
-/* READDIR:
+/* HAS_OPEN3
+ *     This manifest constant lets the C program know that the three
+ *     argument form of open(2) is available.
+ */
+#$d_open3      HAS_OPEN3               /**/
+
+/* HAS_READDIR
  *     This symbol, if defined, indicates that the readdir routine is available
- *     from the C library to create directories.
+ *     from the C library to read directories.
  */
-#$d_readdir    READDIR         /**/
+#$d_readdir    HAS_READDIR             /**/
 
-/* RENAME:
+/* HAS_RENAME
  *     This symbol, if defined, indicates that the rename routine is available
  *     to rename files.  Otherwise you should do the unlink(), link(), unlink()
  *     trick.
  */
-#$d_rename     RENAME          /**/
+#$d_rename     HAS_RENAME              /**/
 
-/* RMDIR:
+/* HAS_RMDIR
  *     This symbol, if defined, indicates that the rmdir routine is available
  *     to remove directories.  Otherwise you should fork off a new process to
  *     exec /bin/rmdir.
  */
-#$d_rmdir      RMDIR           /**/
+#$d_rmdir      HAS_RMDIR               /**/
+
+/* HAS_SELECT
+ *     This symbol, if defined, indicates that the select() subroutine
+ *     exists.
+ */
+#$d_select     HAS_SELECT      /**/
 
-/* SELECT:
- *     This symbol, if defined, indicates that the select routine is available
- *     to select active file descriptors.
+/* HAS_SEM
+ *     This symbol, if defined, indicates that the entire sem*(2) library is
+ *     supported.
+ */
+#$d_sem        HAS_SEM         /**/
+
+/* HAS_SEMCTL
+ *     This symbol, if defined, indicates that the semctl() routine is
+ *     available to stat symbolic links.
  */
-#$d_select     SELECT          /**/
+#$d_semctl     HAS_SEMCTL              /**/
 
-/* SETEGID:
+/* HAS_SEMGET
+ *     This symbol, if defined, indicates that the semget() routine is
+ *     available to stat symbolic links.
+ */
+#$d_semget     HAS_SEMGET              /**/
+
+/* HAS_SEMOP
+ *     This symbol, if defined, indicates that the semop() routine is
+ *     available to stat symbolic links.
+ */
+#$d_semop      HAS_SEMOP               /**/
+
+/* HAS_SETEGID
  *     This symbol, if defined, indicates that the setegid routine is available
  *     to change the effective gid of the current program.
  */
-#$d_setegid    SETEGID         /**/
+#$d_setegid    HAS_SETEGID             /**/
 
-/* SETEUID:
+/* HAS_SETEUID
  *     This symbol, if defined, indicates that the seteuid routine is available
  *     to change the effective uid of the current program.
  */
-#$d_seteuid    SETEUID         /**/
+#$d_seteuid    HAS_SETEUID             /**/
 
-/* SETPGRP:
+/* HAS_SETPGRP
  *     This symbol, if defined, indicates that the setpgrp() routine is
  *     available to set the current process group.
  */
-#$d_setpgrp    SETPGRP         /**/
+#$d_setpgrp    HAS_SETPGRP             /**/
 
-/* SETPGRP2:
+/* HAS_SETPGRP2
  *     This symbol, if defined, indicates that the setpgrp2() (as in DG/UX)
  *     routine is available to set the current process group.
  */
-#$d_setpgrp2   SETPGRP2                /**/
+#$d_setpgrp2   HAS_SETPGRP2            /**/
 
-/* SETPRIORITY:
+/* HAS_SETPRIORITY
  *     This symbol, if defined, indicates that the setpriority() routine is
  *     available to set a process's priority.
  */
-#$d_setprior   SETPRIORITY             /**/
+#$d_setprior   HAS_SETPRIORITY         /**/
 
-/* SETREGID:
+/* HAS_SETREGID
  *     This symbol, if defined, indicates that the setregid routine is
  *     available to change the real and effective gid of the current program.
  */
-/* SETRESGID:
+/* HAS_SETRESGID
  *     This symbol, if defined, indicates that the setresgid routine is
  *     available to change the real, effective and saved gid of the current
  *     program.
  */
-#$d_setregid   SETREGID                /**/
-#$d_setresgid  SETRESGID               /**/
+#$d_setregid   HAS_SETREGID            /**/
+#$d_setresgid  HAS_SETRESGID           /**/
 
-/* SETREUID:
+/* HAS_SETREUID
  *     This symbol, if defined, indicates that the setreuid routine is
  *     available to change the real and effective uid of the current program.
  */
-/* SETRESUID:
+/* HAS_SETRESUID
  *     This symbol, if defined, indicates that the setresuid routine is
  *     available to change the real, effective and saved uid of the current
  *     program.
  */
-#$d_setreuid   SETREUID                /**/
-#$d_setresuid  SETRESUID               /**/
+#$d_setreuid   HAS_SETREUID            /**/
+#$d_setresuid  HAS_SETRESUID           /**/
 
-/* SETRGID:
+/* HAS_SETRGID
  *     This symbol, if defined, indicates that the setrgid routine is available
  *     to change the real gid of the current program.
  */
-#$d_setrgid    SETRGID         /**/
+#$d_setrgid    HAS_SETRGID             /**/
 
-/* SETRUID:
+/* HAS_SETRUID
  *     This symbol, if defined, indicates that the setruid routine is available
  *     to change the real uid of the current program.
  */
-#$d_setruid    SETRUID         /**/
+#$d_setruid    HAS_SETRUID             /**/
+
+/* HAS_SHM
+ *     This symbol, if defined, indicates that the entire shm*(2) library is
+ *     supported.
+ */
+#$d_shm        HAS_SHM         /**/
+
+/* HAS_SHMAT
+ *     This symbol, if defined, indicates that the shmat() routine is
+ *     available to stat symbolic links.
+ */
+#$d_shmat      HAS_SHMAT               /**/
+
+/* HAS_SHMCTL
+ *     This symbol, if defined, indicates that the shmctl() routine is
+ *     available to stat symbolic links.
+ */
+#$d_shmctl     HAS_SHMCTL              /**/
 
-/* SOCKET:
+/* HAS_SHMDT
+ *     This symbol, if defined, indicates that the shmdt() routine is
+ *     available to stat symbolic links.
+ */
+#$d_shmdt      HAS_SHMDT               /**/
+
+/* HAS_SHMGET
+ *     This symbol, if defined, indicates that the shmget() routine is
+ *     available to stat symbolic links.
+ */
+#$d_shmget     HAS_SHMGET              /**/
+
+/* HAS_SOCKET
  *     This symbol, if defined, indicates that the BSD socket interface is
  *     supported.
  */
-/* SOCKETPAIR:
+/* HAS_SOCKETPAIR
  *     This symbol, if defined, indicates that the BSD socketpair call is
  *     supported.
  */
-/* OLDSOCKET:
+/* OLDSOCKET
  *     This symbol, if defined, indicates that the 4.1c BSD socket interface
  *     is supported instead of the 4.2/4.3 BSD socket interface.
  */
-#$d_socket     SOCKET          /**/
+#$d_socket     HAS_SOCKET              /**/
 
-#$d_sockpair   SOCKETPAIR      /**/
+#$d_sockpair   HAS_SOCKETPAIR  /**/
 
 #$d_oldsock    OLDSOCKET       /**/
 
-/* STATBLOCKS:
+/* STATBLOCKS
  *     This symbol is defined if this system has a stat structure declaring
  *     st_blksize and st_blocks.
  */
 #$d_statblks   STATBLOCKS      /**/
 
-/* STDSTDIO:
+/* STDSTDIO
  *     This symbol is defined if this system has a FILE structure declaring
  *     _ptr and _cnt in stdio.h.
  */
 #$d_stdstdio   STDSTDIO        /**/
 
-/* STRUCTCOPY:
+/* STRUCTCOPY
  *     This symbol, if defined, indicates that this C compiler knows how
  *     to copy structures.  If undefined, you'll need to use a block copy
  *     routine of some sort instead.
  */
 #$d_strctcpy   STRUCTCOPY      /**/
 
-/* STRERROR:
+/* HAS_STRERROR
  *     This symbol, if defined, indicates that the strerror() routine is
  *     available to translate error numbers to strings.
  */
-#$d_strerror   STRERROR                /**/
+#$d_strerror   HAS_STRERROR            /**/
 
-/* SYMLINK:
+/* HAS_SYMLINK
  *     This symbol, if defined, indicates that the symlink routine is available
  *     to create symbolic links.
  */
-#$d_symlink    SYMLINK         /**/
+#$d_symlink    HAS_SYMLINK             /**/
 
-/* SYSCALL:
+/* HAS_SYSCALL
  *     This symbol, if defined, indicates that the syscall routine is available
  *     to call arbitrary system calls.  If undefined, that's tough.
  */
-#$d_syscall    SYSCALL         /**/
-
-/* SYSVIPC:
- *     This symbol, if defined, indicates that System V IPC exists.
- */
-/* IPCMSG:
- *     This symbol, if defined, indicates that System V IPC messages exist.
- */
-/* IPCSEM:
- *     This symbol, if defined, indicates that System V IPC semaphores exist.
- */
-/* IPCSHM:
- *     This symbol, if defined, indicates that System V IPC shared memory
- *     exists.
- */
-#$d_sysvipc    SYSVIPC /**/
-
-#$d_ipcmsg     IPCMSG  /**/
+#$d_syscall    HAS_SYSCALL             /**/
 
-#$d_ipcsem     IPCSEM  /**/
-
-#$d_ipcshm     IPCSHM  /**/
-
-/* TRUNCATE:
+/* HAS_TRUNCATE
  *     This symbol, if defined, indicates that the truncate routine is
  *     available to truncate files.
  */
-#$d_truncate   TRUNCATE                /**/
+#$d_truncate   HAS_TRUNCATE            /**/
 
-/* VARARGS:
- *     This symbol, if defined, indicates to the C program that it should
- *     include varargs.h.
- */
-#$d_varargs    VARARGS         /**/
-
-/* VFORK:
+/* HAS_VFORK
  *     This symbol, if defined, indicates that vfork() exists.
  */
-#$d_vfork      VFORK   /**/
+#$d_vfork      HAS_VFORK       /**/
 
-/* VOIDSIG:
+/* VOIDSIG
  *     This symbol is defined if this system declares "void (*signal())()" in
  *     signal.h.  The old way was to declare it as "int (*signal())()".  It
  *     is up to the package author to declare things correctly based on the
  *     symbol.
  */
+/* TO_SIGNAL
+ *     This symbol's value is either "void" or "int", corresponding to the
+ *     appropriate return "type" of a signal handler.  Thus, one can declare
+ *     a signal handler using "TO_SIGNAL (*handler())()", and define the
+ *     handler using "TO_SIGNAL handler(sig)".
+ */
 #$d_voidsig    VOIDSIG         /**/
+#$define       TO_SIGNAL       $d_tosignal     /**/
 
-/* HASVOLATILE:
+/* HASVOLATILE
  *     This symbol, if defined, indicates that this C compiler knows about
  *     the volatile declaration.
  */
 #$d_volatile   HASVOLATILE     /**/
 
-/* VPRINTF:
+/* HAS_VPRINTF
  *     This symbol, if defined, indicates that the vprintf routine is available
  *     to printf with a pointer to an argument list.  If unavailable, you
  *     may need to write your own, probably in terms of _doprnt().
  */
-/* CHARVSPRINTF:
+/* CHARVSPRINTF
  *     This symbol is defined if this system has vsprintf() returning type
  *     (char*).  The trend seems to be to declare it as "int vsprintf()".  It
  *     is up to the package author to declare vsprintf correctly based on the
  *     symbol.
  */
-#$d_vprintf    VPRINTF         /**/
+#$d_vprintf    HAS_VPRINTF     /**/
 #$d_charvspr   CHARVSPRINTF    /**/
 
-/* WAIT4:
+/* HAS_WAIT4
  *     This symbol, if defined, indicates that wait4() exists.
  */
-#$d_wait4      WAIT4   /**/
+#$d_wait4      HAS_WAIT4       /**/
 
-/* WAITPID:
+/* HAS_WAITPID
  *     This symbol, if defined, indicates that waitpid() exists.
  */
-#$d_waitpid    WAITPID /**/
+#$d_waitpid    HAS_WAITPID     /**/
 
-/* GIDTYPE:
+/* GIDTYPE
  *     This symbol has a value like gid_t, int, ushort, or whatever type is
  *     used to declare group ids in the kernel.
  */
 #define GIDTYPE $gidtype               /**/
 
-/* I_DIRENT:
- *     This symbol, if defined, indicates to the C program that it should
- *     include dirent.h.
+/* I_FCNTL
+ *     This manifest constant tells the C program to include <fcntl.h>.
  */
-/* DIRNAMLEN:
- *     This symbol, if defined, indicates to the C program that the length
- *     of directory entry names is provided by a d_namlen field.  Otherwise
- *     you need to do strlen() on the d_name field.
- */
-#$i_dirent     I_DIRENT                /**/
-#$d_dirnamlen  DIRNAMLEN               /**/
+#$i_fcntl      I_FCNTL /**/
 
-/* I_FCNTL:
- *     This symbol, if defined, indicates to the C program that it should
- *     include fcntl.h.
+/* I_GDBM
+ *     This symbol, if defined, indicates that gdbm.h exists and should
+ *     be included.
  */
-#$i_fcntl      I_FCNTL         /**/
+#$i_gdbm       I_GDBM          /**/
 
-/* I_GRP:
+/* I_GRP
  *     This symbol, if defined, indicates to the C program that it should
  *     include grp.h.
  */
 #$i_grp        I_GRP           /**/
 
-/* I_NETINET_IN:
+/* I_NETINET_IN
  *     This symbol, if defined, indicates to the C program that it should
  *     include netinet/in.h.
  */
+/* I_SYS_IN
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include sys/in.h.
+ */
 #$i_niin       I_NETINET_IN            /**/
+#$i_sysin      I_SYS_IN                /**/
 
-/* I_PWD:
+/* I_PWD
  *     This symbol, if defined, indicates to the C program that it should
  *     include pwd.h.
  */
-/* PWCOMMENT:
- *     This symbol, if defined, indicates to the C program that struct passwd
- *     contains pw_comment.
- */
-/* PWQUOTA:
+/* PWQUOTA
  *     This symbol, if defined, indicates to the C program that struct passwd
  *     contains pw_quota.
  */
-/* PWAGE:
+/* PWAGE
  *     This symbol, if defined, indicates to the C program that struct passwd
  *     contains pw_age.
  */
-/* PWCHANGE:
+/* PWCHANGE
  *     This symbol, if defined, indicates to the C program that struct passwd
  *     contains pw_change.
  */
-/* PWCLASS:
+/* PWCLASS
  *     This symbol, if defined, indicates to the C program that struct passwd
  *     contains pw_class.
  */
-/* PWEXPIRE:
+/* PWEXPIRE
  *     This symbol, if defined, indicates to the C program that struct passwd
  *     contains pw_expire.
  */
+/* PWCOMMENT
+ *     This symbol, if defined, indicates to the C program that struct passwd
+ *     contains pw_comment.
+ */
 #$i_pwd        I_PWD           /**/
-#$d_pwcomment  PWCOMMENT       /**/
 #$d_pwquota    PWQUOTA         /**/
 #$d_pwage      PWAGE           /**/
 #$d_pwchange   PWCHANGE        /**/
 #$d_pwclass    PWCLASS         /**/
 #$d_pwexpire   PWEXPIRE        /**/
+#$d_pwcomment  PWCOMMENT       /**/
 
-/* I_SYSDIR:
- *     This symbol, if defined, indicates to the C program that it should
- *     include sys/dir.h.
+/* I_SYS_FILE
+ *     This manifest constant tells the C program to include <sys/file.h>.
  */
-#$i_sysdir     I_SYSDIR                /**/
+#$i_sys_file   I_SYS_FILE      /**/
 
-/* I_SYSIOCTL:
+/* I_SYSIOCTL
  *     This symbol, if defined, indicates that sys/ioctl.h exists and should
  *     be included.
  */
 #$i_sysioctl   I_SYSIOCTL              /**/
 
-/* I_SYSNDIR:
- *     This symbol, if defined, indicates to the C program that it should
- *     include sys/ndir.h.
- */
-#$i_sysndir    I_SYSNDIR               /**/
-
-/* I_TIME:
+/* I_TIME
  *     This symbol is defined if the program should include <time.h>.
  */
-/* I_SYSTIME:
+/* I_SYS_TIME
  *     This symbol is defined if the program should include <sys/time.h>.
  */
-/* I_SYSTIMEKERNEL:
+/* SYSTIMEKERNEL
  *     This symbol is defined if the program should include <sys/time.h>
  *     with KERNEL defined.
  */
-#$i_time               I_TIME          /**/
-#$i_systime    I_SYSTIME       /**/
+/* I_SYS_SELECT
+ *     This symbol is defined if the program should include <sys/select.h>.
+ */
+#$i_time       I_TIME          /**/
+#$i_sys_time   I_SYS_TIME      /**/
 #$d_systimekernel      SYSTIMEKERNEL   /**/
+#$i_sys_select I_SYS_SELECT    /**/
 
-/* I_UTIME:
+/* I_UTIME
  *     This symbol, if defined, indicates to the C program that it should
  *     include utime.h.
  */
 #$i_utime      I_UTIME         /**/
 
-/* I_VARARGS:
+/* I_VARARGS
  *     This symbol, if defined, indicates to the C program that it should
  *     include varargs.h.
  */
 #$i_varargs    I_VARARGS               /**/
 
-/* I_VFORK:
+/* I_VFORK
  *     This symbol, if defined, indicates to the C program that it should
  *     include vfork.h.
  */
 #$i_vfork      I_VFORK         /**/
 
-/* INTSIZE:
+/* INTSIZE
  *     This symbol contains the size of an int, so that the C preprocessor
  *     can make decisions based on it.
  */
 #define INTSIZE $intsize               /**/
 
-/* RANDBITS:
+/* I_DIRENT
+ *     This symbol, if defined, indicates that the program should use the
+ *     P1003-style directory routines, and include <dirent.h>.
+ */
+/* I_SYS_DIR
+ *     This symbol, if defined, indicates that the program should use the
+ *     directory functions by including <sys/dir.h>.
+ */
+/* I_NDIR
+ *     This symbol, if defined, indicates that the program should include the
+ *     system's version of ndir.h, rather than the one with this package.
+ */
+/* I_SYS_NDIR
+ *     This symbol, if defined, indicates that the program should include the
+ *     system's version of sys/ndir.h, rather than the one with this package.
+ */
+/* I_MY_DIR
+ *     This symbol, if defined, indicates that the program should compile
+ *     the ndir.c code provided with the package.
+ */
+/* DIRNAMLEN
+ *     This symbol, if defined, indicates to the C program that the length
+ *     of directory entry names is provided by a d_namlen field.  Otherwise
+ *     you need to do strlen() on the d_name field.
+ */
+#$i_dirent     I_DIRENT        /**/
+#$i_sys_dir    I_SYS_DIR       /**/
+#$i_ndir       I_NDIR          /**/
+#$i_sys_ndir   I_SYS_NDIR      /**/
+#$i_my_dir     I_MY_DIR        /**/
+#$d_dirnamlen  DIRNAMLEN       /**/
+
+
+/* RANDBITS
  *     This symbol contains the number of bits of random number the rand()
  *     function produces.  Usual values are 15, 16, and 31.
  */
 #define RANDBITS $randbits             /**/
 
-/* SCRIPTDIR:
+/* SCRIPTDIR
  *     This symbol holds the name of the directory in which the user wants
  *     to put publicly executable scripts for the package in question.  It
  *     is often a directory that is mounted across diverse architectures.
  */
 #define SCRIPTDIR "$scriptdir"             /**/
 
-/* SIG_NAME:
+/* SIG_NAME
  *     This symbol contains an list of signal names in order.
  */
 #define SIG_NAME "`echo $sig_name | sed 's/ /","/g'`"          /**/
 
-/* STDCHAR:
+/* STDCHAR
  *     This symbol is defined to be the type of char used in stdio.h.
  *     It has the values "unsigned char" or "char".
  */
 #define STDCHAR $stdchar       /**/
 
-/* UIDTYPE:
+/* UIDTYPE
  *     This symbol has a value like uid_t, int, ushort, or whatever type is
  *     used to declare user ids in the kernel.
  */
 #define UIDTYPE $uidtype               /**/
 
-/* VOIDFLAGS:
+/* VOIDHAVE
  *     This symbol indicates how much support of the void type is given by this
  *     compiler.  What various bits mean:
  *
@@ -683,22 +780,43 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef!/\*#undef!'
  *         4 = supports comparisons between pointers to void functions and
  *                 addresses of void functions
  *
- *     The package designer should define VOIDUSED to indicate the requirements
- *     of the package.  This can be done either by #defining VOIDUSED before
- *     including config.h, or by defining defvoidused in Myinit.U.  If the
- *     latter approach is taken, only those flags will be tested.  If the
- *     level of void support necessary is not present, defines void to int.
- */
-#ifndef VOIDUSED
-#define VOIDUSED $defvoidused
+ *     The package designer should define VOIDWANT to indicate the requirements
+ *     of the package.  This can be done either by #defining VOIDWANT before
+ *     including config.h, or by defining voidwant in Myinit.U.  If the level
+ *     of void support necessary is not present, config.h defines void to "int",
+ *     VOID to the empty string, and VOIDP to "char *".
+ */
+/* void
+ *     This symbol is used for void casts.  On implementations which support
+ *     void appropriately, its value is "void".  Otherwise, its value maps
+ *     to "int".
+ */
+/* VOID
+ *     This symbol's value is "void" if the implementation supports void
+ *     appropriately.  Otherwise, its value is the empty string.  The primary
+ *     use of this symbol is in specifying void parameter lists for function
+ *     prototypes.
+ */
+/* VOIDP
+ *     This symbol is used for casting generic pointers.  On implementations
+ *     which support void appropriately, its value is "void *".  Otherwise,
+ *     its value is "char *".
+ */
+#ifndef VOIDWANT
+#define VOIDWANT $voidwant
 #endif
-#define VOIDFLAGS $voidflags
-#if (VOIDFLAGS & VOIDUSED) != VOIDUSED
-#$define void int              /* is void to be avoided? */
-#$define M_VOID                /* Xenix strikes again */
+#define VOIDHAVE $voidhave
+#if (VOIDHAVE & VOIDWANT) != VOIDWANT
+#define void int               /* is void to be avoided? */
+#define VOID
+#define VOIDP (char *)
+#define M_VOID         /* Xenix strikes again */
+#else
+#define VOID void
+#define VOIDP (void *)
 #endif
 
-/* PRIVLIB:
+/* PRIVLIB
  *     This symbol contains the name of the private library for this package.
  *     The library is private in the sense that it needn't be in anyone's
  *     execution path, but it should be accessible by the world.  The program
@@ -706,4 +824,5 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef!/\*#undef!'
  */
 #define PRIVLIB "$privlib"             /**/
 
+#endif
 !GROK!THIS!
diff --git a/cons.c b/cons.c
index e71f1f7..c1d8f93 100644 (file)
--- a/cons.c
+++ b/cons.c
@@ -1,4 +1,4 @@
-/* $Header: cons.c,v 3.0.1.10 91/01/11 17:33:33 lwall Locked $
+/* $Header: cons.c,v 4.0 91/03/20 01:05:51 lwall Locked $
  *
  *    Copyright (c) 1989, Larry Wall
  *
@@ -6,50 +6,8 @@
  *    as specified in the README file that comes with the perl 3.0 kit.
  *
  * $Log:       cons.c,v $
- * Revision 3.0.1.10  91/01/11  17:33:33  lwall
- * patch42: the perl debugger was dumping core frequently
- * patch42: the postincrement to preincrement optimizer was overzealous
- * patch42: foreach didn't localize its temp array properly
- * 
- * Revision 3.0.1.9  90/11/10  01:10:50  lwall
- * patch38: random cleanup
- * 
- * Revision 3.0.1.8  90/10/15  15:41:09  lwall
- * patch29: added caller
- * patch29: scripts now run at almost full speed under the debugger
- * patch29: the debugger now understands packages and evals
- * patch29: package behavior is now more consistent
- * 
- * Revision 3.0.1.7  90/08/09  02:35:52  lwall
- * patch19: did preliminary work toward debugging packages and evals
- * patch19: Added support for linked-in C subroutines
- * patch19: Numeric literals are now stored only in floating point
- * patch19: Added -c switch to do compilation only
- * 
- * Revision 3.0.1.6  90/03/27  15:35:21  lwall
- * patch16: formats didn't work inside eval
- * patch16: $foo++ now optimized to ++$foo where value not required
- * 
- * Revision 3.0.1.5  90/03/12  16:23:10  lwall
- * patch13: perl -d coredumped on scripts with subs that did explicit return
- * 
- * Revision 3.0.1.4  90/02/28  16:44:00  lwall
- * patch9: subs which return by both mechanisms can clobber local return data
- * patch9: changed internal SUB label to _SUB_
- * patch9: line numbers were bogus during certain portions of foreach evaluation
- * 
- * Revision 3.0.1.3  89/12/21  19:20:25  lwall
- * patch7: made nested or recursive foreach work right
- * 
- * Revision 3.0.1.2  89/11/17  15:08:53  lwall
- * patch5: nested foreach on same array didn't work
- * 
- * Revision 3.0.1.1  89/10/26  23:09:01  lwall
- * patch1: numeric switch optimization was broken
- * patch1: unless was broken when run under the debugger
- * 
- * Revision 3.0  89/10/18  15:10:23  lwall
- * 3.0 baseline
+ * Revision 4.0  91/03/20  01:05:51  lwall
+ * 4.0 baseline.
  * 
  */
 
@@ -86,10 +44,12 @@ CMD *cmd;
        }
        if (stab_sub(stab)->cmd) {
            cmd_free(stab_sub(stab)->cmd);
+           stab_sub(stab)->cmd = Nullcmd;
            afree(stab_sub(stab)->tosave);
        }
        Safefree(stab_sub(stab));
     }
+    stab_sub(stab) = sub;
     sub->filestab = curcmd->c_filestab;
     saw_return = FALSE;
     tosave = anew(Nullstab);
@@ -106,10 +66,9 @@ CMD *cmd;
        cmd->c_flags |= CF_TERM;
     }
     sub->cmd = cmd;
-    stab_sub(stab) = sub;
     if (perldb) {
        STR *str;
-       STR *tmpstr = str_static(&str_undef);
+       STR *tmpstr = str_mortal(&str_undef);
 
        sprintf(buf,"%s:%ld",stab_val(curcmd->c_filestab)->str_ptr,
          (long)subline);
@@ -137,21 +96,22 @@ char *filename;
     STAB *stab = stabent(name,allstabs);
 
     if (!stab)                         /* unused function */
-       return;
+       return Null(SUBR*);
     Newz(101,sub,1,SUBR);
     if (stab_sub(stab)) {
        if (dowarn)
            warn("Subroutine %s redefined",name);
        if (stab_sub(stab)->cmd) {
            cmd_free(stab_sub(stab)->cmd);
+           stab_sub(stab)->cmd = Nullcmd;
            afree(stab_sub(stab)->tosave);
        }
        Safefree(stab_sub(stab));
     }
+    stab_sub(stab) = sub;
     sub->filestab = fstab(filename);
     sub->usersub = subaddr;
     sub->userindex = ix;
-    stab_sub(stab) = sub;
     return sub;
 }
 
@@ -698,10 +658,12 @@ int acmd;
        else if ((arg[flp].arg_type & A_MASK) == A_STAB ||
          (arg[flp].arg_type & A_MASK) == A_LVAL) {
            cmd->c_stab  = arg[flp].arg_ptr.arg_stab;
+           if (!context)
+               arg[flp].arg_ptr.arg_stab = Nullstab;
            opt = CFT_REG;
          literal:
            if (!context) {     /* no && or ||? */
-               free_arg(arg);
+               arg_free(arg);
                cmd->c_expr = Nullarg;
            }
            if (!(context & 1))
@@ -754,6 +716,8 @@ int acmd;
                    spat_free(arg[2].arg_ptr.arg_spat);
                    arg[2].arg_ptr.arg_spat = Nullspat; /* don't do twice */
                }
+               else
+                   cmd->c_spat = arg[2].arg_ptr.arg_spat;
                cmd->c_flags |= sure;
            }
        }
@@ -836,6 +800,7 @@ int acmd;
            cmd->c_stab = arg2[1].arg_ptr.arg_stab;
            if (!(stab_io(arg2[1].arg_ptr.arg_stab)->flags & IOF_ARGV)) {
                free_arg(arg2);
+               arg[2].arg_ptr.arg_arg = Nullarg;
                free_arg(arg);
                cmd->c_expr = Nullarg;
            }
@@ -908,7 +873,8 @@ register ARG *arg;
        arg = cmd->ucmd.acmd.ac_expr;
        if (arg && arg->arg_type == O_ITEM && arg[1].arg_type == A_CMD)
            cmd->c_flags &= ~CF_COND;  /* "do {} while" happens at least once */
-       if (arg && arg->arg_type == O_SUBR)
+       if (arg && (arg->arg_flags & AF_DEPR) &&
+         (arg->arg_type == O_SUBR || arg->arg_type == O_DBSUBR) )
            cmd->c_flags &= ~CF_COND;  /* likewise for "do subr() while" */
     }
     return cmd;
@@ -1045,6 +1011,7 @@ register CMD *cmd;
                    tail->ucmd.acmd.ac_expr[1].arg_ptr.arg_str->str_ptr) )))
        {
            arg_free(tail->ucmd.acmd.ac_expr);
+           tail->ucmd.acmd.ac_expr = Nullarg;
            tail->c_type = C_NEXT;
            if (cmd->ucmd.ccmd.cc_alt != Nullcmd)
                tail->ucmd.ccmd.cc_alt = cmd->ucmd.ccmd.cc_alt;
@@ -1092,6 +1059,7 @@ register CMD *cmd;
                        tail->ucmd.acmd.ac_expr[1].arg_ptr.arg_str->str_ptr) )))
            {
                arg_free(tail->ucmd.acmd.ac_expr);
+               tail->ucmd.acmd.ac_expr = Nullarg;
                tail->c_type = C_NEXT;
                tail->ucmd.ccmd.cc_alt = newtail;
                tail->ucmd.ccmd.cc_true = Nullcmd;
@@ -1158,26 +1126,34 @@ register CMD *cmd;
 
     while (cmd) {
        if (cmd->c_type != C_WHILE) {   /* WHILE block is duplicated */
-           if (cmd->c_label)
+           if (cmd->c_label) {
                Safefree(cmd->c_label);
-           if (cmd->c_short)
+               cmd->c_label = Nullch;
+           }
+           if (cmd->c_short) {
                str_free(cmd->c_short);
-           if (cmd->c_spat)
-               spat_free(cmd->c_spat);
-           if (cmd->c_expr)
+               cmd->c_short = Nullstr;
+           }
+           if (cmd->c_expr) {
                arg_free(cmd->c_expr);
+               cmd->c_expr = Nullarg;
+           }
        }
        switch (cmd->c_type) {
        case C_WHILE:
        case C_BLOCK:
        case C_ELSE:
        case C_IF:
-           if (cmd->ucmd.ccmd.cc_true)
+           if (cmd->ucmd.ccmd.cc_true) {
                cmd_free(cmd->ucmd.ccmd.cc_true);
+               cmd->ucmd.ccmd.cc_true = Nullcmd;
+           }
            break;
        case C_EXPR:
-           if (cmd->ucmd.acmd.ac_expr)
+           if (cmd->ucmd.acmd.ac_expr) {
                arg_free(cmd->ucmd.acmd.ac_expr);
+               cmd->ucmd.acmd.ac_expr = Nullarg;
+           }
            break;
        }
        tofree = cmd;
@@ -1198,6 +1174,10 @@ register ARG *arg;
     for (i = 1; i <= arg->arg_len; i++) {
        switch (arg[i].arg_type & A_MASK) {
        case A_NULL:
+           if (arg->arg_type == O_TRANS) {
+               Safefree(arg[i].arg_ptr.arg_cval);
+               arg[i].arg_ptr.arg_cval = Nullch;
+           }
            break;
        case A_LEXPR:
            if (arg->arg_type == O_AASSIGN &&
@@ -1211,9 +1191,11 @@ register ARG *arg;
            /* FALL THROUGH */
        case A_EXPR:
            arg_free(arg[i].arg_ptr.arg_arg);
+           arg[i].arg_ptr.arg_arg = Nullarg;
            break;
        case A_CMD:
            cmd_free(arg[i].arg_ptr.arg_cmd);
+           arg[i].arg_ptr.arg_cmd = Nullcmd;
            break;
        case A_WORD:
        case A_STAB:
@@ -1229,9 +1211,11 @@ register ARG *arg;
        case A_DOUBLE:
        case A_BACKTICK:
            str_free(arg[i].arg_ptr.arg_str);
+           arg[i].arg_ptr.arg_str = Nullstr;
            break;
        case A_SPAT:
            spat_free(arg[i].arg_ptr.arg_spat);
+           arg[i].arg_ptr.arg_spat = Nullspat;
            break;
        }
     }
@@ -1244,16 +1228,21 @@ register SPAT *spat;
     register SPAT *sp;
     HENT *entry;
 
-    if (spat->spat_runtime)
+    if (spat->spat_runtime) {
        arg_free(spat->spat_runtime);
+       spat->spat_runtime = Nullarg;
+    }
     if (spat->spat_repl) {
        arg_free(spat->spat_repl);
+       spat->spat_repl = Nullarg;
     }
     if (spat->spat_short) {
        str_free(spat->spat_short);
+       spat->spat_short = Nullstr;
     }
     if (spat->spat_regexp) {
        regfree(spat->spat_regexp);
+       spat->spat_regexp = Null(REGEXP*);
     }
 
     /* now unlink from spat list */
@@ -1296,8 +1285,6 @@ int willsave;                             /* willsave passes down the tree */
     register CMD *lastcmd = Nullcmd;
 
     while (cmd) {
-       if (cmd->c_spat)
-           shouldsave |= spat_tosave(cmd->c_spat);
        if (cmd->c_expr)
            shouldsave |= arg_tosave(cmd->c_expr,willsave);
        switch (cmd->c_type) {
index 890ab7e..e6886f2 100644 (file)
--- a/consarg.c
+++ b/consarg.c
@@ -1,4 +1,4 @@
-/* $Header: consarg.c,v 3.0.1.8 91/01/11 17:37:31 lwall Locked $
+/* $Header: consarg.c,v 4.0 91/03/20 01:06:15 lwall Locked $
  *
  *    Copyright (c) 1989, Larry Wall
  *
@@ -6,38 +6,8 @@
  *    as specified in the README file that comes with the perl 3.0 kit.
  *
  * $Log:       consarg.c,v $
- * Revision 3.0.1.8  91/01/11  17:37:31  lwall
- * patch42: assignment to a slice didn't supply an array context to RHS
- * patch42: suppressed variable suicide on local($a,$b) = @_
- * 
- * Revision 3.0.1.7  90/10/15  15:55:28  lwall
- * patch29: defined @foo was behaving inconsistently
- * patch29: -5 % 5 was wrong
- * patch29: package behavior is now more consistent
- * 
- * Revision 3.0.1.6  90/08/09  02:38:51  lwall
- * patch19: fixed problem with % of negative number
- * 
- * Revision 3.0.1.5  90/03/27  15:36:45  lwall
- * patch16: support for machines that can't cast negative floats to unsigned ints
- * 
- * Revision 3.0.1.4  90/03/12  16:24:40  lwall
- * patch13: return (@array) did counter-intuitive things
- * 
- * Revision 3.0.1.3  90/02/28  16:47:54  lwall
- * patch9: the x operator is now up to 10 times faster
- * patch9: @_ clobbered by ($foo,$bar) = split
- * 
- * Revision 3.0.1.2  89/11/17  15:11:34  lwall
- * patch5: defined $foo{'bar'} should not create element
- * 
- * Revision 3.0.1.1  89/11/11  04:14:30  lwall
- * patch2: '-' x 26 made warnings about undefined value
- * patch2: eval with no args caused strangeness
- * patch2: local(@foo) didn't work, but local(@foo,$bar) did
- * 
- * Revision 3.0  89/10/18  15:10:30  lwall
- * 3.0 baseline
+ * Revision 4.0  91/03/20  01:06:15  lwall
+ * 4.0 baseline.
  * 
  */
 
@@ -135,14 +105,16 @@ register ARG *pat;
        if (pat->arg_len >= 2) {
            newarg[2].arg_type = pat[2].arg_type;
            newarg[2].arg_ptr = pat[2].arg_ptr;
+           newarg[2].arg_len = pat[2].arg_len;
            newarg[2].arg_flags = pat[2].arg_flags;
            if (pat->arg_len >= 3) {
                newarg[3].arg_type = pat[3].arg_type;
                newarg[3].arg_ptr = pat[3].arg_ptr;
+               newarg[3].arg_len = pat[3].arg_len;
                newarg[3].arg_flags = pat[3].arg_flags;
            }
        }
-       Safefree(pat);
+       free_arg(pat);
     }
     else {
        Newz(202,spat,1,SPAT);
@@ -303,7 +275,7 @@ register ARG *arg;
        return;
 
     if ((arg[1].arg_type == A_SINGLE || arg->arg_type == O_AELEM) &&
-        (arg->arg_len == 1 || arg[2].arg_type == A_SINGLE) ) {
+       (arg->arg_len == 1 || arg[2].arg_type == A_SINGLE) ) {
        str = Str_new(20,0);
        s1 = arg[1].arg_ptr.arg_str;
        if (arg->arg_len > 1)
@@ -319,6 +291,8 @@ register ARG *arg;
                arg[1].arg_type = A_ARYSTAB;    /* $abc[123] is hoistable now */
                arg[1].arg_len = i;
                str_free(s2);
+               arg[2].arg_type = A_NULL;
+               arg[2].arg_ptr.arg_str = Nullstr;
            }
            /* FALL THROUGH */
        default:
@@ -347,7 +321,24 @@ register ARG *arg;
            if (value == 0.0)
                yyerror("Illegal division by constant zero");
            else
-               str_numset(str,str_gnum(s1) / value);
+#ifdef cray
+           /* insure that 20./5. == 4. */
+           {
+               double x;
+               int    k;
+               x =  str_gnum(s1);
+               if ((double)(int)x     == x &&
+                   (double)(int)value == value &&
+                   (k = (int)x/(int)value)*(int)value == (int)x) {
+                   value = k;
+               } else {
+                   value = x/value;
+               }
+               str_numset(str,value);
+           }
+#else
+           str_numset(str,str_gnum(s1) / value);
+#endif
            break;
        case O_MODULO:
            tmplong = (unsigned long)str_gnum(s2);
@@ -466,6 +457,7 @@ register ARG *arg;
                else
                    str_sset(str,arg[3].arg_ptr.arg_str);
                str_free(arg[3].arg_ptr.arg_str);
+               arg[3].arg_ptr.arg_str = Nullstr;
            }
            break;
        case O_NEGATE:
@@ -518,7 +510,7 @@ register ARG *arg;
            str_numset(str,(double)(str_cmp(s1,s2)));
            break;
        case O_CRYPT:
-#ifdef CRYPT
+#ifdef HAS_CRYPT
            tmps = str_get(s1);
            str_set(str,crypt(tmps,str_get(s2)));
 #else
@@ -565,6 +557,8 @@ register ARG *arg;
            str_free(s1);
            str_free(s2);
            arg[1].arg_ptr.arg_str = str;
+           arg[2].arg_ptr.arg_str = Nullstr;
+           arg[2].arg_type = A_NULL;
        }
     }
 }
@@ -686,8 +680,10 @@ register ARG *arg;
                      nothing_in_common(arg1,spat->spat_repl)) {
                        spat->spat_repl[1].arg_ptr.arg_stab =
                            arg1[1].arg_ptr.arg_stab;
+                       arg1[1].arg_ptr.arg_stab = Nullstab;
                        spat->spat_flags |= SPAT_ONCE;
                        arg_free(arg1); /* recursive */
+                       arg[1].arg_ptr.arg_arg = Nullarg;
                        free_arg(arg);  /* non-recursive */
                        return arg2;    /* split has builtin assign */
                    }
@@ -748,7 +744,7 @@ register ARG *arg;
                        /* grow string struct to hold an lstring struct */
        }
        else if (arg1->arg_type == O_ASSIGN) {
-