perl 5.0 alpha 8
Andy Dougherty [Mon, 4 Apr 1994 00:00:00 +0000 (00:00 +0000)]
[the last one taken from the September '94 InfoMagic CD; a similar
style of cleanup as the previous commits was performed]

136 files changed:
.config/README [new file with mode: 0644]
.config/instruct [new file with mode: 0644]
Bugs/arraynotok [new file with mode: 0755]
Bugs/clearmyarray [new file with mode: 0644]
Bugs/clobberref [new file with mode: 0644]
Bugs/delete_env [new file with mode: 0644]
Bugs/formatsub [new file with mode: 0755]
Bugs/lcsort [new file with mode: 0644]
Bugs/lcsortdump [new file with mode: 0644]
Bugs/mig [new file with mode: 0755]
Bugs/myforeach [new file with mode: 0644]
Bugs/numkey [new file with mode: 0644]
Bugs/signedbits [new file with mode: 0644]
Bugs/splitdump [new file with mode: 0644]
Bugs/splitscalar [new file with mode: 0644]
Bugs/subform [new file with mode: 0644]
Bugs/substrdump [new file with mode: 0644]
Bugs/zeroanonref [new file with mode: 0644]
Configure [new file with mode: 0755]
HelpWanted [new file with mode: 0644]
MANIFEST
MANIFEST.new [new file with mode: 0644]
Makefile
Makefile.SH [new file with mode: 0644]
NDBM_File.c
ODBM_File.c
Obsolete [new file with mode: 0644]
POSIX.c
README
README.Conf [new file with mode: 0644]
SDBM_File.c
TCL [new file with mode: 0644]
Todo
U/Extensions.U [new file with mode: 0644]
U/Loc.U [new file with mode: 0644]
U/Oldconfig.U [new file with mode: 0644]
U/README.U [new file with mode: 0644]
U/cc.U [new file with mode: 0644]
U/ccflags.U [new file with mode: 0644]
U/d_casti32.U [new file with mode: 0644]
U/d_isascii.U [new file with mode: 0644]
U/d_setlocale.U [new file with mode: 0644]
U/d_strerror.U [new file with mode: 0644]
U/dlsrc.U [new file with mode: 0644]
U/gidtype.U [new file with mode: 0644]
U/groupstype.U [new file with mode: 0644]
U/i_dlfcn.U [new file with mode: 0644]
U/libc.U [new file with mode: 0644]
U/libpth.U [new file with mode: 0644]
U/libs.U [new file with mode: 0644]
U/libyacc.U [new file with mode: 0644]
U/mallocsrc.U [new file with mode: 0644]
U/prototype.U [new file with mode: 0644]
U/voidflags.U [new file with mode: 0644]
U/yacc.U [new file with mode: 0644]
Wanted [new file with mode: 0644]
autosplit [new file with mode: 0755]
bar
bar.out [new file with mode: 0644]
cflags
cflags.SH
config.h
config.sh
config_h.SH
configpm
cppstdin [new file with mode: 0755]
deb.c
dl.c
doio.c
dump.c
embed.h
eval.c.save [new file with mode: 0644]
ext/dbm/SDBM_File.c.bak [new file with mode: 0644]
ext/dbm/typemap
ext/dl/dl.c
ext/posix/POSIX.xs
ext/posix/typemap
ext/typemap
ext/xsubpp
ext/xsubpp.bak [new file with mode: 0755]
ext/xvarpp
foo
gv.c
h2ph
handy.h
hints/isc_3_2_2.sh
hints/isc_3_2_3.sh
hints/solaris_2_2.sh [new file with mode: 0644]
hints/solaris_2_3.sh [new file with mode: 0644]
hints/sunos_4_1_2.sh [new file with mode: 0644]
hints/sunos_4_1_3.sh [new file with mode: 0644]
hvdbm.h
internals
interp.sym
lib/Config.pm
lib/English.pm
lib/FileHandle.pm
lib/POSIX.pm
lib/auto/POSIX/_exit [new file with mode: 0644]
lib/auto/README [new file with mode: 0644]
lib/dotsh.pl.art [new file with mode: 0644]
lib/quotewords.pl.art [new file with mode: 0644]
lib/soundex.pl.art [new file with mode: 0644]
main.c
make.out
makedepend
makedepend.SH
makedir
makefile
malloc.c
mg.c
miniperlmain.c [new file with mode: 0644]
op.c
perl.c
perl.h
perl.man
perlmain.c [new file with mode: 0644]
perlmain.x [new file with mode: 0644]
perly.y.save [new file with mode: 0644]
pp.c
proto.h
regcomp.h
regexec.c
sv.c
sv.h
t/SDBM_File.so [new file with mode: 0755]
t/lib/english.t
toke.c
unobsolete [new file with mode: 0644]
util.c
writemain [new file with mode: 0755]
x2p/Makefile
x2p/a2p.y
x2p/find2perl
x2p/makefile
x2p/malloc.c

diff --git a/.config/README b/.config/README
new file mode 100644 (file)
index 0000000..943361f
--- /dev/null
@@ -0,0 +1,4 @@
+This directory created by Configure to save information that should
+persist across sessions.
+
+You may safely delete it if you wish.
diff --git a/.config/instruct b/.config/instruct
new file mode 100644 (file)
index 0000000..13027a5
--- /dev/null
@@ -0,0 +1 @@
+lwall
diff --git a/Bugs/arraynotok b/Bugs/arraynotok
new file mode 100755 (executable)
index 0000000..dd1b053
--- /dev/null
@@ -0,0 +1,72 @@
+#!/usr/bin/perl
+
+#
+# I thought that I would try out some perl 5 features for the first time.
+# So I wrote a small program, included below.  It died, and the partial
+# output looks very much like what I wanted to accompish.  Even if the program
+# had not died, there is still the problem that no output was given under the
+# label "sonia:".
+#
+# Since the output is close, perhaps a bug lurks within...(?)  I'm using the
+# compiled binary provided in the perl5a6 tar file.  I tried to write this
+# post so it could be given to perl with the -x flag.  You should get the
+# output I describe here --
+#                                                      James Bence
+#                                                      jbence@math.ucla.edu
+#
+# Output:
+#
+# Pushed ege into @sonia
+# Pushed caflisch into @joshua
+# Pushed catalina into @julia
+# Pushed lunnon into @sonia
+# Pushed m270alg into @redwood
+# Pushed harten into @joshua
+# Pushed ycc into @joshua
+# Pushed m270wsc into @redwood
+# 
+# 
+# joshua:
+#     caflisch harten ycc 
+# 
+# sonia:
+#     
+# 
+# redwood:
+#     m270alg m270wsc 
+# 
+# julia:
+#     Segmentation fault
+# 
+#
+
+require 5.000;
+
+while (<DATA>) {
+    ($login,$host) = split;
+    push(@{$hostref{$host}},$login);  # t/op/ref.t (22) suggests this is ok.
+    print "Pushed $login into \@$host\n";
+}
+
+print"\n\n";
+
+while ( ($host,$ref) = each(%hostref)) {
+    print "$host:\n    ";
+    $count = 0;
+    foreach $person (@{$ref}) {
+        print $person, " ";
+        $count++;
+        if ($count % 5 == 0) { print "\n    "; }
+    }
+    print "\n\n";
+}
+
+__END__
+ege         sonia
+caflisch    joshua
+catalina    julia
+lunnon      sonia
+m270alg     redwood
+harten      joshua
+ycc         joshua
+m270wsc     redwood
diff --git a/Bugs/clearmyarray b/Bugs/clearmyarray
new file mode 100644 (file)
index 0000000..e4aecb3
--- /dev/null
@@ -0,0 +1,4 @@
+@a = ( 5, 6, 7, 8);
+&foo(1, 2, @a);
+
+sub foo { my($a, $b, @c) = @_;  print scalar(@c), "\n"; }
diff --git a/Bugs/clobberref b/Bugs/clobberref
new file mode 100644 (file)
index 0000000..4cba683
--- /dev/null
@@ -0,0 +1 @@
+$B = [X, Y]; $B = 1; print $B
diff --git a/Bugs/delete_env b/Bugs/delete_env
new file mode 100644 (file)
index 0000000..a4bf8ef
--- /dev/null
@@ -0,0 +1,2 @@
+delete $ENV{TERM};
+system "env";
diff --git a/Bugs/formatsub b/Bugs/formatsub
new file mode 100755 (executable)
index 0000000..e995846
--- /dev/null
@@ -0,0 +1,7 @@
+#!./perl
+
+format STDOUT {
+    formline "@<<<<<<<<<<<<< @>>>>>>>>>>>\n", "foo", "bar";
+}
+
+write;
diff --git a/Bugs/lcsort b/Bugs/lcsort
new file mode 100644 (file)
index 0000000..2cbe861
--- /dev/null
@@ -0,0 +1,37 @@
+Article 20341 of comp.lang.perl:
+Path: netlabs!news.cerf.net!mvb.saic.com!MathWorks.Com!news.kei.com!hookup!swrinde!gatech!taco.cc.ncsu.edu!taco.cc.ncsu.edu!setzer
+From: setzer@math.ncsu.edu (William Setzer)
+Newsgroups: comp.lang.perl
+Subject: perl5a6 bug: sort sub @ary
+Date: 30 Mar 94 13:49:20
+Organization: The Chebychev Church of Probability
+Lines: 23
+Distribution: world
+Message-ID: <SETZER.94Mar30134920@math.math.ncsu.edu>
+NNTP-Posting-Host: math.ncsu.edu
+
+Ok, here's a weird one.  Using the precompiled perl5a6 binary for the
+sun, the following dumps core:
+----
+@S = (0, 1, 2, 3);
+for ("A", "D", "b", "c") { $foo{$i++} = $_; }
+# for (sort { lc($foo{$a}) cmp  lc($foo{$b}) } @S) { print $foo{$_}, "\n"; }
+for (sort Alpha @S)      { print $foo{$_}, "\n"; }
+
+sub Alpha { lc($foo{$a}) cmp  lc($foo{$b}); }
+----
+[Output]
+Segmentation fault (core dumped)
+----
+However, if you comment out the "sort Alpha" and uncomment the "sort
+{lc(...) cmp lc(...) }" line, everything works as expected.  Also note
+that if you uncomment both "sort"s, everything also works as expected.
+Do-do-do-do [twilight zone music :-].
+
+William
+
+PS: Does anyone actually care about these bug reports?  I thought I
+    remember Larry saying that he preferred them in c.l.p., but it
+    wouldn't be the first time my memory has fritzed.
+
+
diff --git a/Bugs/lcsortdump b/Bugs/lcsortdump
new file mode 100644 (file)
index 0000000..4254305
--- /dev/null
@@ -0,0 +1,6 @@
+@S = (0, 1, 2, 3);
+for ("A", "D", "b", "c") { $foo{$i++} = $_; }
+# for (sort { lc($foo{$a}) cmp  lc($foo{$b}) } @S) { print $foo{$_}, "\n"; }
+for (sort Alpha @S)      { print $foo{$_}, "\n"; }
+
+sub Alpha { lc($foo{$a}) cmp  lc($foo{$b}); }
diff --git a/Bugs/mig b/Bugs/mig
new file mode 100755 (executable)
index 0000000..a00a8e8
--- /dev/null
+++ b/Bugs/mig
@@ -0,0 +1,17 @@
+#!./perl
+
+$foo = <<EOF;
+Subject: foobar
+From: baz
+EOF
+
+$* = 1;
+
+$pat = '^([*+&!]*)(Subject:)';
+#$pat =~ s/([a-zA-Z])/[\u$1\l$1]/g;
+#print $pat;
+
+$foo =~ /$pat/g;
+
+print $', "\n";
+
diff --git a/Bugs/myforeach b/Bugs/myforeach
new file mode 100644 (file)
index 0000000..2ebb663
--- /dev/null
@@ -0,0 +1 @@
+sub foo { my $i; for $i (@bar) { } }
diff --git a/Bugs/numkey b/Bugs/numkey
new file mode 100644 (file)
index 0000000..8d94cba
--- /dev/null
@@ -0,0 +1,12 @@
+$zz = { 1, 9 };
+print %$zz;                     # wrong; outputs 9
+
+print "\n";
+
+$zz = { "1", 9 };
+print %$zz;                     # ok; outputs 19
+
+print "\n";
+
+%xx = ( 1, 9 );
+print %xx;                      # ok; outputs 19
diff --git a/Bugs/signedbits b/Bugs/signedbits
new file mode 100644 (file)
index 0000000..2141249
--- /dev/null
@@ -0,0 +1,2 @@
+printf "%x\n", 0x40000000 | 0x00000010;
+printf "%x\n", 0x80000000 | 0x00000010;
diff --git a/Bugs/splitdump b/Bugs/splitdump
new file mode 100644 (file)
index 0000000..36d5c9d
--- /dev/null
@@ -0,0 +1 @@
+0 + split
diff --git a/Bugs/splitscalar b/Bugs/splitscalar
new file mode 100644 (file)
index 0000000..6da6d41
--- /dev/null
@@ -0,0 +1 @@
+$_ = "a b c" ; $a = ( @b = split ) ; print "$a\n@b\n"
diff --git a/Bugs/subform b/Bugs/subform
new file mode 100644 (file)
index 0000000..b27b8ad
--- /dev/null
@@ -0,0 +1,107 @@
+Replied: Wed, 02 Mar 94 09:29:46 -0800
+Replied: brad_figg@rainbow.mentorg.com ("Brad Figg")
+Return-Path: brad_figg@rainbow.mentorg.com
+Return-Path: <brad_figg@rainbow.mentorg.com>
+Received: from mgc.mentorg.com by netlabs.com (4.1/SMI-4.1)
+       id AA15524; Wed, 2 Mar 94 09:17:50 PST
+Received: from rainbow.mentorg.com by mgc.mentorg.com with SMTP
+       (16.6/15.5+MGC-TD 2.20) id AA04359; Wed, 2 Mar 94 09:16:55 -0800
+Received: from wv.mentorg.com by rainbow.mentorg.com with SMTP
+       (15.11.1.6/15.5+MGC-TD 2.08) id AA22830; Wed, 2 Mar 94 09:16:53 -0800
+Received: from em-wv02.MENTORG.COM by wv.mentorg.com (8.6.4/CF5.11R)
+       id JAA18865; Wed, 2 Mar 1994 09:16:51 -0800
+Received: from cynic.MENTORG.COM by em-wv02.MENTORG.COM (4.1/CF3.4)
+       id AA23300; Wed, 2 Mar 94 09:16:50 PST
+Received: by cynic.MENTORG.COM (4.1/CF3.4)
+       id AA24503; Wed, 2 Mar 94 09:16:50 PST
+From: brad_figg@rainbow.mentorg.com ("Brad Figg")
+Message-Id: <9403020916.ZM24501@cynic>
+Date: Wed, 2 Mar 1994 09:16:50 -0800
+X-Mailer: Z-Mail (3.0.0 15dec93)
+To: lwall@netlabs.com
+Subject: Perl5 Alpha 6 bug (subs & formats)
+Content-Type: text/plain; charset=us-ascii
+Mime-Version: 1.0
+
+
+The following works just fine as is with Perl 4 but doesn't work with
+Perl5 Alpha 6 unless the format lines are moved outside the sub block.
+
+
+Brad
+
+p.s.  I'm not currently at a point where I can make the actual offer
+      but I'm just asking if you have any interest.  I have access to
+      'Purify' and 'Quantify' from Pure Software. I was thinking of
+      building Perl5 with these just to see what I'd get. Would you
+      be interested in the results?
+
+
+-----------------------Error.pl---------------------------------
+######################################################################
+##  Package Variables
+##
+
+package Error;
+
+push( @main'Versions, '$Id: Error.pl,v 1.3 1994/02/13 00:26:00 bradf Exp $' );
+
+$Strings[ ($None               =  0) ] =
+    "Everythings OK";
+$Strings[ ($BadFileOpen        =  0) ] =
+    "I was unable to open the file \'%s\' due to:\n$!";
+$Strings[ ($NoVersion          =  0) ] =
+    "Unable to read the first four bytes from the file." .
+    "  This probably means it is an empty file.";
+
+######################################################################
+##
+##  Emsg
+##
+##    Print a formatted error message to STDERR.
+##
+##    Args: 2
+##       1. An error message that may contain printf formatting strings.
+##       2. A list of arguments to be used for the format string
+##          expansions.
+##
+##    Returns:
+##
+##         if successful: none
+##       if unsuccessful: none
+##
+##    Calls:
+##
+##    Requires:
+##
+##    Notes:
+##
+
+sub Emsg
+  {
+    local( $String, @Args ) = @_;
+    local( $Err );
+
+format EFIRSTLINE =
+    *** Error: ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+$_
+               ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<~~
+$_
+.
+
+format EBODY =
+               ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<~~
+$_
+.
+
+
+    $~ = 'EFIRSTLINE';
+    $Err = sprintf( $String, @Args );
+    foreach (split( "\n", $Err )) {
+        if ( $_ eq '' ) { print( "\n" ); }
+        write;
+        $~ = 'EBODY';
+      }
+  }
+[Acked]
+
diff --git a/Bugs/substrdump b/Bugs/substrdump
new file mode 100644 (file)
index 0000000..aef3fe5
--- /dev/null
@@ -0,0 +1,2 @@
+    $a="abc";
+    substr(\$a,1,0)='a';
diff --git a/Bugs/zeroanonref b/Bugs/zeroanonref
new file mode 100644 (file)
index 0000000..fd6def9
--- /dev/null
@@ -0,0 +1 @@
+$z = \'23'
diff --git a/Configure b/Configure
new file mode 100755 (executable)
index 0000000..bfa8fb3
--- /dev/null
+++ b/Configure
@@ -0,0 +1,5689 @@
+#! /bin/sh
+#
+# If these # comments don't work, trim them. Don't worry about any other
+# shell scripts, Configure will trim # comments from them for you.
+#
+# (If you are trying to port this package to a machine without sh,
+# I would suggest you have a look at the prototypical config_h.SH file
+# 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.)
+#
+# Yes, you may rip this off to use in other distribution packages. This
+# script belongs to the public domain and cannot be copyrighted.
+#
+# (Note: this Configure script was generated automatically. Rather than
+# working with this copy of Configure, you may wish to get metaconfig.
+# The dist-3.0 package (which contains metaconfig) was posted in
+# comp.sources.misc so you may fetch it yourself from your nearest
+# archive site. Check with Archie if you don't know where that can be.)
+#
+
+# $Id: Head.U,v 3.0.1.3 1993/12/15 08:15:07 ram Exp $
+#
+# Generated on Sat Apr  2 17:29:14 EST 1994 [metaconfig 3.0 PL22]
+
+cat >/tmp/c1$$ <<EOF
+ARGGGHHHH!!!!!
+
+SCO csh still thinks true is false.  Write to SCO today and tell them that next
+year Configure ought to "rm /bin/csh" unless they fix their blasted shell. :-)
+
+(Actually, Configure ought to just patch csh in place.  Hmm.  Hmmmmm.  All
+we'd have to do is go in and swap the && and || tokens, wherever they are.)
+
+[End of diatribe. We now return you to your regularly scheduled programming...]
+EOF
+cat >/tmp/c2$$ <<EOF
+
+OOPS!  You naughty creature!  You didn't run Configure with sh!
+I will attempt to remedy the situation by running sh for you...
+EOF
+
+true || cat /tmp/c1$$ /tmp/c2$$
+true || exec sh $0 $argv:q
+
+(exit $?0) || cat /tmp/c2$$
+(exit $?0) || exec sh $0 $argv:q
+rm -f /tmp/c1$$ /tmp/c2$$
+
+: Sanity checks
+PATH=".:$PATH:/bin:/usr/bin:/usr/local/bin:/usr/ucb:/usr/local:/usr/lbin"
+PATH=$PATH:'/usr/5bin:/etc:/usr/gnu/bin:/usr/new:/usr/new/bin:/usr/nbin'
+PATH=$PATH:'/sys5.3/bin:/sys5.3/usr/bin:/bsd4.3/bin:/bsd4.3/usr/ucb'
+PATH=$PATH:'/bsd4.3/usr/bin:/usr/bsd:/bsd43/bin:/usr/ccs/bin'
+PATH=$PATH:'/etc:/usr/lib:/usr/ucblib:/lib:/usr/ccs/lib'
+PATH=$PATH:'/sbin:/usr/sbin:/usr/libexec'
+export PATH
+
+if test ! -t 0; then
+       echo "Say 'sh Configure', not 'sh <Configure'"
+       exit 1
+fi
+
+: On HP-UX, large Configure scripts may exercise a bug in /bin/sh
+if test -f /hp-ux -a -f /bin/ksh; then
+       if (PATH=.; alias -x) >/dev/null 2>&1; then
+               : already under /bin/ksh
+       else
+               cat <<'EOM'
+(Feeding myself to ksh to avoid nasty sh bug in "here document" expansion.)
+EOM
+               exec /bin/ksh $0 "$@"
+       fi
+else
+       : Warn them if they use ksh on other systems
+       (PATH=.; alias -x) >/dev/null 2>&1 && \
+               cat <<'EOM'
+(I see you are using the Korn shell.  Some ksh's blow up on Configure,
+especially on exotic machines.  If yours does, try the Bourne shell instead.)
+EOM
+fi
+
+: Configure runs within the UU subdirectory
+test -d UU || mkdir UU
+cd UU && rm -f *
+
+extensions=''
+d_bsd=''
+d_eunice=''
+d_xenix=''
+eunicefix=''
+Mcc=''
+awk=''
+bash=''
+bison=''
+byacc=''
+cat=''
+chgrp=''
+chmod=''
+chown=''
+compress=''
+cp=''
+cpio=''
+cpp=''
+csh=''
+date=''
+echo=''
+egrep=''
+emacs=''
+expr=''
+find=''
+flex=''
+gcc=''
+grep=''
+inews=''
+ksh=''
+less=''
+line=''
+lint=''
+ln=''
+lp=''
+lpr=''
+ls=''
+mail=''
+mailx=''
+make=''
+mkdir=''
+more=''
+mv=''
+nroff=''
+perl=''
+pg=''
+pmake=''
+pr=''
+rm=''
+rmail=''
+sed=''
+sendmail=''
+sh=''
+shar=''
+sleep=''
+smail=''
+sort=''
+submit=''
+tail=''
+tar=''
+tbl=''
+test=''
+touch=''
+tr=''
+troff=''
+uname=''
+uniq=''
+uuname=''
+vi=''
+zcat=''
+hint=''
+myuname=''
+Author=''
+Date=''
+Header=''
+Id=''
+Locker=''
+Log=''
+RCSfile=''
+Revision=''
+Source=''
+State=''
+afs=''
+alignbytes=''
+bin=''
+binexp=''
+installbin=''
+byteorder=''
+cc=''
+gccversion=''
+ccflags=''
+cppflags=''
+ldflags=''
+lkflags=''
+optimize=''
+cf_by=''
+cf_time=''
+contains=''
+cpplast=''
+cppminus=''
+cpprun=''
+cppstdin=''
+d_access=''
+d_bcmp=''
+d_bcopy=''
+d_bzero=''
+d_casti32=''
+castflags=''
+d_castneg=''
+d_charsprf=''
+d_chsize=''
+d_const=''
+cryptlib=''
+d_crypt=''
+d_csh=''
+d_dosuid=''
+d_dup2=''
+d_fchmod=''
+d_fchown=''
+d_fcntl=''
+d_flexfnam=''
+d_flock=''
+d_getgrps=''
+d_gethent=''
+aphostname=''
+d_gethname=''
+d_phostname=''
+d_uname=''
+d_getpgrp2=''
+d_getpgrp=''
+d_getprior=''
+d_htonl=''
+d_isascii=''
+d_killpg=''
+d_link=''
+d_lstat=''
+d_memcmp=''
+d_memcpy=''
+d_memmove=''
+d_memset=''
+d_mkdir=''
+d_msg=''
+d_msgctl=''
+d_msgget=''
+d_msgrcv=''
+d_msgsnd=''
+d_open3=''
+d_portable=''
+d_readdir=''
+d_rename=''
+d_rmdir=''
+d_safebcpy=''
+d_safemcpy=''
+d_select=''
+d_sem=''
+d_semctl=''
+d_semget=''
+d_semop=''
+d_setegid=''
+d_seteuid=''
+d_setlocale=''
+d_setpgid=''
+d_setpgrp2=''
+d_bsdpgrp=''
+d_setpgrp=''
+d_setprior=''
+d_setregid=''
+d_setresgid=''
+d_setresuid=''
+d_setreuid=''
+d_setrgid=''
+d_setruid=''
+d_setsid=''
+d_shm=''
+d_shmat=''
+d_shmctl=''
+d_shmdt=''
+d_shmget=''
+d_oldsock=''
+d_socket=''
+d_sockpair=''
+sockethdr=''
+socketlib=''
+d_statblks=''
+d_stdstdio=''
+d_index=''
+d_strchr=''
+d_strctcpy=''
+d_strerrm=''
+d_strerror=''
+d_sysernlst=''
+d_syserrlst=''
+d_symlink=''
+d_syscall=''
+d_system=''
+clocktype=''
+d_times=''
+d_truncate=''
+d_usendir=''
+i_ndir=''
+ndirc=''
+ndirlib=''
+ndiro=''
+d_vfork=''
+d_voidsig=''
+signal_t=''
+d_volatile=''
+d_charvspr=''
+d_vprintf=''
+d_wait4=''
+d_waitpid=''
+dlobj=''
+dlsrc=''
+usedl=''
+gidtype=''
+groupstype=''
+h_fcntl=''
+h_sysfile=''
+i_dbm=''
+d_dirnamlen=''
+i_dirent=''
+i_dlfcn=''
+i_fcntl=''
+i_gdbm=''
+i_grp=''
+i_ndbm=''
+i_niin=''
+i_sysin=''
+d_pwage=''
+d_pwchange=''
+d_pwclass=''
+d_pwcomment=''
+d_pwexpire=''
+d_pwquota=''
+i_pwd=''
+i_stdarg=''
+i_stddef=''
+i_string=''
+strings=''
+i_sysdir=''
+i_sysfile=''
+d_voidtty=''
+i_bsdioctl=''
+i_sysioctl=''
+i_syssockio=''
+i_sysndir=''
+i_sysselct=''
+i_sgtty=''
+i_termio=''
+i_termios=''
+i_systime=''
+i_systimek=''
+i_time=''
+timeincl=''
+i_utime=''
+i_varargs=''
+i_varhdr=''
+i_vfork=''
+intsize=''
+lib=''
+libexp=''
+libc=''
+libpth=''
+plibpth=''
+xlibpth=''
+libs=''
+mallocobj=''
+mallocsrc=''
+malloctype=''
+usemymalloc=''
+installmansrc=''
+manext=''
+mansrc=''
+mansrcexp=''
+huge=''
+large=''
+medium=''
+models=''
+small=''
+split=''
+mydomain=''
+myhostname=''
+phostname=''
+c=''
+n=''
+groupcat=''
+hostcat=''
+passcat=''
+package=''
+spackage=''
+installprivlib=''
+privlib=''
+privlibexp=''
+prototype=''
+randbits=''
+installscript=''
+scriptdir=''
+scriptdirexp=''
+sig_name=''
+sharpbang=''
+shsharp=''
+spitshell=''
+startsh=''
+stdchar=''
+sysman=''
+uidtype=''
+nm_opt=''
+runnm=''
+usenm=''
+incpath=''
+mips=''
+mips_type=''
+usrinc=''
+defvoidused=''
+voidflags=''
+yacc=''
+yaccflags=''
+CONFIG=''
+
+: script used to extract .SH files with variable substitutions
+cat >extract <<'EOS'
+CONFIG=true
+echo "Doing variable substitutions on .SH files..."
+if test -f MANIFEST; then
+       set x `awk '{print $1}' <MANIFEST | grep '\.SH'`
+else
+       echo "(Looking for .SH files under the current directory.)"
+       set x `find . -name "*.SH" -print`
+fi
+shift
+case $# in
+0) set x *.SH; shift;;
+esac
+if test ! -f $1; then
+       shift
+fi
+for file in $*; do
+       case "$file" in
+       */*)
+               dir=`expr X$file : 'X\(.*\)/'`
+               file=`expr X$file : 'X.*/\(.*\)'`
+               (cd $dir && . ./$file)
+               ;;
+       *)
+               . ./$file
+               ;;
+       esac
+done
+if test -f config_h.SH; then
+       if test ! -f config.h; then
+       : oops, they left it out of MANIFEST, probably, so do it anyway.
+       . ./config_h.SH
+       fi
+fi
+EOS
+
+: produce awk script to parse command line options
+cat >options.awk <<'EOF'
+BEGIN {
+       optstr = "deEf:hrsSV";  # getopt-style specification
+
+       len = length(optstr);
+       for (i = 1; i <= len; i++) {
+               c = substr(optstr, i, 1);
+               if (i < len) a = substr(optstr, i + 1, 1); else a = "";
+               if (a == ":") {
+                       arg[c] = 1;
+                       i++;
+               }
+               opt[c] = 1;
+       }
+}
+{
+       expect = 0;
+       str = $0;
+       if (substr(str, 1, 1) != "-") {
+               printf("'%s'\n", str);
+               next;
+       }
+       len = length($0);
+       for (i = 2; i <= len; i++) {
+               c = substr(str, i, 1);
+               if (!opt[c]) {
+                       printf("-%s\n", substr(str, i));
+                       next;
+               }
+               printf("-%s\n", c);
+               if (arg[c]) {
+                       if (i < len)
+                               printf("'%s'\n", substr(str, i + 1));
+                       else
+                               expect = 1;
+                       next;
+               }
+       }
+}
+END {
+       if (expect)
+               print "?";
+}
+EOF
+
+: process the command line options
+set X `for arg in "$@"; do echo $arg; done | awk -f options.awk`
+eval "set $*"
+shift
+rm -f options.awk
+
+: set up default values
+fastread=''
+reuseval=false
+config_sh=''
+alldone=''
+error=''
+silent=''
+extractsh=''
+
+: option parsing
+while test $# -gt 0; do
+       case "$1" in
+       -d) shift; fastread=yes;;
+       -e) shift; alldone=cont;;
+       -f)
+               shift
+               cd ..
+               if test -r "$1"; then
+                       config_sh="$1"
+               else
+                       echo "Configure: cannot read config file $1." >&2
+                       error=true
+               fi
+               cd UU
+               shift;;
+       -h) shift; error=true;;
+       -r) shift; reuseval=true;;
+       -s) shift; silent=true;;
+       -E) shift; alldone=exit;;
+       -S) shift; extractsh=true;;
+       -V) echo "Configure generated by metaconfig 3.0 PL22." >&2
+               exit 0;;
+       --) break;;
+       -*) echo "Configure: unknown option $1" >&2; shift; error=true;;
+       *) break;;
+       esac
+done
+
+case "$error" in
+true)
+       cat >&2 <<EOM
+Usage: Configure [-dehrESV] [-f config.sh]
+  -d : use defaults for all answers.
+  -e : go on without questioning past the production of config.sh.
+  -f : specify an alternate default configuration file.
+  -h : print this help message and exit (with an error status).
+  -r : reuse C symbols value if possible (skips costly nm extraction).
+  -s : silent mode, only echoes questions and essential information.
+  -E : stop at the end of questions, after having produced config.sh.
+  -S : perform variable substitutions on all .SH files (can mix with -f)
+  -V : print version number and exit (with a zero status).
+EOM
+       exit 1
+       ;;
+esac
+
+exec 4>&1
+case "$silent" in
+true) exec 1>/dev/null;;
+esac
+
+case "$extractsh" in
+true)
+       case "$config_sh" in
+       '') config_sh='config.sh'; config='./config.sh';;
+       /*) config="$config_sh";;
+       *) config="./$config_sh";;
+       esac
+       echo " "
+       echo "Fetching answers from $config_sh..."
+       cd ..
+       . $config
+       echo " "
+       . ./UU/extract
+       rm -rf UU
+       echo "Done."
+       exit 0
+       ;;
+esac
+
+: set package name
+package=perl
+
+: Eunice requires " " instead of "", can you believe it
+echo " "
+: Here we go...
+echo "Beginning of configuration questions for $package."
+
+define='define'
+undef='undef'
+smallmach='pdp11 i8086 z8000 i80286 iAPX286'
+rmlist=''
+
+trap 'echo " "; rm -rf $rmlist; exit 1' 1 2 3 15
+
+: We must find out about Eunice early
+eunicefix=':'
+if test -f /etc/unixtovms; then
+       eunicefix=/etc/unixtovms
+fi
+if test -f /etc/unixtovms.exe; then
+       eunicefix=/etc/unixtovms.exe
+fi
+
+: list of known cpp symbols
+attrlist="__alpha __bsdi__ BSD_NET2 DGUX M_I186 M_I286 M_I386"
+attrlist="$attrlist M_I8086 M_XENIX UTS __DGUX__"
+attrlist="$attrlist _AIX __STDC__ __m88k__ ansi bsd4_2 gcos gimpel"
+attrlist="$attrlist hp9000s300 hp9000s400 hp9000s500 hp9000s700"
+attrlist="$attrlist hp9000s800 hpux"
+attrlist="$attrlist i186 i386 i486 i8086 iAPX286 ibm interdata"
+attrlist="$attrlist m88k mc300 mc500 mc68000 mc68k mc700 mert"
+attrlist="$attrlist mips NeXT ns16000 ns32000 nsc32000 os"
+attrlist="$attrlist __osf__ pdp11 posix"
+attrlist="$attrlist pyr sinix sony sparc sun tower tower32 tower32_600"
+attrlist="$attrlist tower32_800 tss u3b2 u3b20 u3b200 u3b5 ultrix unix"
+attrlist="$attrlist __unix__ vax venix xenix z8000"
+
+i_whoami=''
+: List of extensions we want:
+extensions=''
+gccversion=''
+: no include file wanted by default
+inclwanted=''
+
+ usedl=''
+groupstype=''
+: change the next line if compiling for Xenix/286 on Xenix/386
+xlibpth='/usr/lib/386 /lib/386'
+
+: general looking path for locating libraries
+libpth="/usr/lib/large /lib /usr/lib $xlibpth /lib/large"
+libpth="$libpth /usr/lib/small /lib/small"
+libpth="$libpth /usr/ccs/lib /usr/ucblib /usr/local/lib"
+
+: Private path used by Configure to find libraries.  Its value
+: is prepend to libpth. This variable takes care of special
+: machines, like the mips.  Usually, it should be empty.
+plibpth=''
+
+libswanted="net socket nsl inet nm sdbm gdbm ndbm dbm malloc dl dld sun m c_s posix cposix ndir dir ucb bsd BSD PW x"
+
+: full support for void wanted by default
+defvoidused=15
+
+
+: Some greps do not return status, grrr.
+echo "grimblepritz" >grimble
+if grep blurfldyick grimble >/dev/null 2>&1 ; then
+       contains=contains
+elif grep grimblepritz grimble >/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*)
+       echo " "
+       echo "AGH!  Grep doesn't return a status.  Attempting remedial action."
+       cat >contains <<'EOSS'
+grep "$1" "$2" >.greptmp && cat .greptmp && test -s .greptmp
+EOSS
+chmod +x contains
+esac
+
+: first determine how to suppress newline on echo command
+echo " "
+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 "...using -n."
+       n='-n'
+       c=''
+else
+       cat <<'EOM'
+...using \c
+EOM
+       n=''
+       c='\c'
+fi
+echo $n "The star should be here-->$c"
+echo '*'
+rm -f .echotmp
+
+: Now test for existence of everything in MANIFEST
+echo " "
+if test -f ../MANIFEST; then
+       echo "First let's make sure your kit is complete.  Checking..." >&4
+       awk '$1 !~ /PACK[A-Z]+/ {print $1}' ../MANIFEST | split -50
+       rm -f missing
+       for filelist in x??; do
+               (cd ..; ls `cat UU/$filelist` >/dev/null 2>>UU/missing)
+       done
+       if test -s missing; then
+               cat missing >&4
+               cat >&4 <<'EOM'
+
+THIS PACKAGE SEEMS TO BE INCOMPLETE.
+
+You have the option of continuing the configuration process, despite the
+distinct possibility that your kit is damaged, by typing 'y'es.  If you
+do, don't blame me if something goes wrong.  I advise you to type 'n'o
+and contact the author (lwall@netlabs.com).
+
+EOM
+               echo $n "Continue? [n] $c" >&4
+               read ans
+               case "$ans" in
+               y*)
+                       echo "Continuing..." >&4
+                       rm -f missing
+                       ;;
+               *)
+                       echo "ABORTING..." >&4
+                       kill $$
+                       ;;
+               esac
+       else
+               echo "Looks good..." >&4
+       fi
+else
+       echo "There is no MANIFEST file.  I hope your kit is complete !"
+fi
+rm -f missing x??
+
+: compute the number of columns on the terminal for proper question formatting
+case "$COLUMNS" in
+'') COLUMNS='80';;
+esac
+
+: set up the echo used in my read
+myecho="case \"\$xxxm\" in
+'') echo $n \"\$rp $c\" >&4;;
+*) case \"\$rp\" in
+       '') echo $n \"[\$xxxm] $c\";;
+       *)
+               if test \`echo \"\$rp [\$xxxm]  \" | wc -c\` -ge $COLUMNS; then
+                       echo \"\$rp\" >&4
+                       echo $n \"[\$xxxm] $c\" >&4
+               else
+                       echo $n \"\$rp [\$xxxm] $c\" >&4
+               fi
+               ;;
+       esac;;
+esac"
+
+: now set up to do reads with possible shell escape and default assignment
+cat <<EOSC >myread
+xxxm=\$dflt
+$myecho
+ans='!'
+case "\$fastread" in
+yes) case "\$dflt" in
+       '') ;;
+       *) ans='';
+               case "\$silent-\$rp" in
+               true-) ;;
+               *) echo " " >&4;;
+               esac;;
+       esac;;
+*) case "\$silent" in
+       true) case "\$rp" in
+               '') ans='';;
+               esac;;
+       esac;;
+esac
+while expr "X\$ans" : "X!" >/dev/null; do
+       read answ
+       set x \$xxxm
+       shift
+       aok=''; eval "ans=\"\$answ\"" && aok=y
+       case  "\$answ" in
+       "\$ans")
+               case "\$ans" in
+               "!")
+                       sh 1>&4
+                       echo " "
+                       $myecho
+                       ;;
+               !*)
+                       set x \`expr "X\$ans" : "X!\(.*\)\$"\`
+                       shift
+                       sh 1>&4 -c "\$*"
+                       echo " "
+                       $myecho
+                       ;;
+               esac;;
+       *)
+               case "\$aok" in
+               y)
+                       echo "*** Substitution done -- please confirm."
+                       xxxm="\$ans"
+                       ans=\`echo $n "\$ans$c" | tr '\012' ' '\`
+                       xxxm="\$ans"
+                       ans=!
+                       ;;
+               *)
+                       echo "*** Error -- try again."
+                       ans=!
+                       ;;
+               esac
+               $myecho
+               ;;
+       esac
+       case "\$ans\$xxxm\$nostick" in
+       '')
+               ans=!
+               $myecho
+               ;;
+       esac
+done
+case "\$ans" in
+'') ans="\$xxxm";;
+esac
+EOSC
+
+: create .config dir to save info across Configure sessions
+test -d ../.config || mkdir ../.config
+cat >../.config/README <<EOF
+This directory created by Configure to save information that should
+persist across sessions.
+
+You may safely delete it if you wish.
+EOF
+
+: general instructions
+needman=true
+firsttime=true
+user=`( (logname) 2>/dev/null || whoami) 2>&1`
+if $contains "^$user\$" ../.config/instruct >/dev/null 2>&1; then
+       firsttime=false
+       echo " "
+       rp='Would you like to see the instructions?'
+       dflt=n
+       . ./myread
+       case "$ans" in
+       [yY]*) ;;
+       *) needman=false;;
+       esac
+fi
+if $needman; then
+       cat <<EOH
+This installation shell script will examine your system and ask you questions
+to determine how the perl package should be installed. If you get
+stuck on a question, you may use a ! shell escape to start a subshell or
+execute a command.  Many of the questions will have default answers in square
+brackets; typing carriage return will give you the default.
+
+On some of the questions which ask for file or directory names you are allowed
+to use the ~name construct to specify the login directory belonging to "name",
+even if you don't have a shell which knows about that.  Questions where this is
+allowed will be marked "(~name ok)".
+
+EOH
+       rp=''
+       dflt='Type carriage return to continue'
+       . ./myread
+       cat <<'EOH'
+
+The prompter used in this script allows you to use shell variables and
+backticks in your answers.  You may use $1, $2, etc...  to refer to the words
+in the default answer, as if the default line was a set of arguments given to a
+script shell.  This means you may also use $* to repeat the whole default line,
+so you do not have to re-type everything to add something to the default.
+
+Everytime there is a substitution, you will have to confirm.  If there is an
+error (e.g. an unmatched backtick), the default answer will remain unchanged
+and you will be prompted again.
+
+If you are in a hurry, you may run 'Configure -d'.  This will bypass nearly all
+the questions and use the computed defaults (or the previous answers if there
+was already a config.sh file). Type 'Configure -h' for a list of options.
+
+EOH
+       . ./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 yours, your best bet is to edit
+Configure and run it again.  Also, let me (lwall@netlabs.com)
+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.
+
+This installation script affects things in two ways:
+
+1) it may do direct variable substitutions on some of the files included
+   in this kit.
+2) it builds a config.h file for inclusion in C programs.  You may edit
+   any of these files as the need arises after running this script.
+
+If you make a mistake on a question, there is no easy way to back up to it
+currently.  The easiest thing to do is to edit config.sh and rerun all the SH
+files.  Configure will offer to let you do this before it runs the SH files.
+
+EOH
+       dflt='Type carriage return to continue'
+       . ./myread
+       case "$firsttime" in
+       true) echo $user >>../.config/instruct;;
+       esac
+fi
+
+: see if sh knows # comments
+echo " "
+echo "Checking your sh to see if it knows about # comments..." >&4
+if sh -c '#' >/dev/null 2>&1 ; then
+       echo "Your sh handles # comments correctly."
+       shsharp=true
+       spitshell=cat
+       echo " "
+       echo "Okay, let's see if #! works on this system..."
+       echo "#!/bin/cat" >try
+       $eunicefix try
+       chmod +x try
+       ./try > today
+       if test -s today; then
+               echo "It does."
+               sharpbang='#!'
+       else
+               echo "#! /bin/cat" > try
+               $eunicefix try
+               chmod +x try
+               ./try > today
+               if test -s today; then
+                       echo "It does."
+                       sharpbang='#! '
+               else
+                       echo "It's just a comment."
+                       sharpbang=': use '
+               fi
+       fi
+else
+       echo "Your sh doesn't grok # comments--I will strip them later on."
+       shsharp=false
+       echo "exec grep -v '^[  ]*#'" >spitshell
+       chmod +x spitshell
+       $eunicefix spitshell
+       spitshell=`pwd`/spitshell
+       echo "I presume that if # doesn't work, #! won't work either!"
+       sharpbang=': use '
+fi
+rm -f try today
+
+: figure out how to guarantee sh startup
+echo " "
+echo "Checking out how to guarantee sh startup..." >&4
+case "$SYSTYPE" in
+*bsd*|sys5*) startsh=$sharpbang"/$SYSTYPE/bin/sh";;
+*) startsh=$sharpbang'/bin/sh';;
+esac
+echo "Let's see if '$startsh' works..."
+cat >try <<EOSS
+$startsh
+set abc
+test "$?abc" != 1
+EOSS
+
+chmod +x try
+$eunicefix try
+if ./try; then
+       echo "Yup, it does."
+else
+echo "Nope.  You may have to fix up the shell scripts to make sure sh runs them."
+fi
+rm -f try
+
+: find out where common programs are
+echo " "
+echo "Locating common programs..." >&4
+cat <<EOSC >loc
+$startsh
+case \$# in
+0) exit 1;;
+esac
+thing=\$1
+shift
+dflt=\$1
+shift
+for dir in \$*; do
+       case "\$thing" in
+       .)
+       if test -d \$dir/\$thing; then
+               echo \$dir
+               exit 0
+       fi
+       ;;
+       *)
+       if test -f \$dir/\$thing; then
+               echo \$dir/\$thing
+               exit 0
+       elif test -f \$dir/\$thing.exe; then
+               : on Eunice apparently
+               echo \$dir/\$thing
+               exit 0
+       fi
+       ;;
+       esac
+done
+echo \$dflt
+exit 1
+EOSC
+chmod +x loc
+$eunicefix loc
+loclist="
+awk
+cat
+cp
+echo
+expr
+grep
+mkdir
+mv
+rm
+sed
+sort
+tr
+uniq
+"
+trylist="
+Mcc
+bison
+byacc
+cpp
+csh
+date
+egrep
+find
+line
+nroff
+perl
+test
+uname
+"
+pth=`echo $PATH | sed -e 's/:/ /g'`
+pth="$pth /lib /usr/lib"
+for file in $loclist; do
+       xxx=`./loc $file $file $pth`
+       eval $file=$xxx
+       eval _$file=$xxx
+       case "$xxx" in
+       /*)
+               echo $file is in $xxx.
+               ;;
+       *)
+               echo "I don't know where $file is.  I hope it's in everyone's PATH."
+               ;;
+       esac
+done
+echo " "
+echo "Don't worry if any of the following aren't found..."
+say=offhand
+for file in $trylist; do
+       xxx=`./loc $file $file $pth`
+       eval $file=$xxx
+       eval _$file=$xxx
+       case "$xxx" in
+       /*)
+               echo $file is in $xxx.
+               ;;
+       *)
+               echo "I don't see $file out there, $say."
+               say=either
+               ;;
+       esac
+done
+case "$egrep" in
+egrep)
+       echo "Substituting grep for egrep."
+       egrep=$grep
+       ;;
+esac
+case "$test" in
+test)
+       echo "Hopefully test is built into your sh."
+       ;;
+*)
+       if sh -c "PATH= test true" >/dev/null 2>&1; then
+               echo "Using the test built into your sh."
+               test=test
+               _test=test
+       fi
+       ;;
+esac
+case "$echo" in
+echo)
+       echo "Hopefully echo is built into your sh."
+       ;;
+'') ;;
+*)
+       echo " "
+echo "Checking compatibility between $echo and builtin echo (if any)..." >&4
+       $echo $n "hi there$c" >foo1
+       echo $n "hi there$c" >foo2
+       if cmp foo1 foo2 >/dev/null 2>&1; then
+               echo "They are compatible.  In fact, they may be identical."
+       else
+               case "$n" in
+               '-n') n='' c='\c';;
+               *) n='-n' c='';;
+               esac
+               cat <<FOO
+They are not compatible!  You are probably running ksh on a non-USG system.
+I'll have to use $echo instead of the builtin, since Bourne shell doesn't
+have echo built in and we may have to run some Bourne shell scripts.  That
+means I'll have to use '$n$c' to suppress newlines now.  Life is ridiculous.
+
+FOO
+               $echo $n "The star should be here-->$c"
+               $echo "*"
+       fi
+       $rm -f foo1 foo2
+       ;;
+esac
+
+: Try to determine whether config.sh was made on this system
+case "$config_sh" in
+'')
+myuname=`( ($uname -a) 2>/dev/null || hostname) 2>&1`
+myuname=`echo $myuname | $sed -e 's/^[^=]*=//' | \
+       tr '[A-Z]' '[a-z]' | tr '\012' ' '`
+dflt=n
+if test "$fastread" = yes; then
+       dflt=y
+elif test -f ../config.sh; then
+       oldmyuname=''
+       if $contains myuname= ../config.sh >/dev/null 2>&1; then
+               eval "old`grep myuname= ../config.sh`"
+       fi
+       if test "X$myuname" = "X$oldmyuname"; then
+               dflt=y
+       fi
+fi
+
+: Get old answers from old config file if Configure was run on the
+: same system, otherwise use the hints.
+hint=default
+cd ..
+if test -f config.sh; then
+       echo " "
+       rp="I see a config.sh file.  Shall I use it to set the defaults?"
+       . UU/myread
+       case "$ans" in
+       n*|N*) echo "OK, I'll ignore it."; mv config.sh config.sh.old;;
+       *)  echo "Fetching default answers from your old config.sh file..." >&4
+               tmp="$n"
+               tans="$c"
+               . ./config.sh
+               cp config.sh UU
+               n="$tmp"
+               c="$tans"
+               hint=previous
+               ;;
+       esac
+fi
+if test ! -f config.sh; then
+       $cat <<EOM
+
+First time through, eh?  I have some defaults handy for the following systems:
+
+EOM
+       cd hints; ls -C *.sh | $sed 's/\.sh/   /g' >&4
+       dflt=''
+       : Half the following guesses are probably wrong... If you have better
+       : tests or hints, please send them to lwall@netlabs.com
+       : The metaconfig authors would also appreciate a copy...
+       $test -f /irix && dflt="$dflt sgi"
+       $test -f /xenix && dflt="$dflt sco_xenix"
+       $test -f /dynix && dflt="$dflt dynix"
+       $test -f /dnix && dflt="$dflt dnix"
+       $test -f /bin/mips && /bin/mips && dflt="$dflt mips"
+       $test -d /NextApps && test -f /usr/adm/software_version && dflt="$dflt next"
+       $test -d /usr/include/minix && dflt="$dflt minix"
+       if $test -f $uname; then
+               set X $myuname
+               shift
+
+               $test -f $5.sh && dflt="$dflt $5"
+
+               case "$5" in
+               fps*) dflt="$dflt fps";;
+               mips*)
+                       case "$4" in
+                       umips) dflt="$dflt umips";;
+                       *) dflt="$dflt mips";;
+                       esac;;
+               [23]100) dflt="$dflt mips";;
+               next*) dflt="$dflt next" ;;
+               news*) dflt="$dflt news" ;;
+               i386*) if $test -f /etc/kconfig; then
+                               if $contains _SYSV3 /usr/include/stdio.h > /dev/null 2>&1 ; then
+                                       dflt="$dflt isc_3_2_3"
+                               elif $contains _POSIX_SOURCE /usr/include/stdio.h > /dev/null 2>&1 ; then
+                                       dflt="$dflt isc_3_2_2"
+                           fi
+                               : i386.sh hint is wrong for Interactive.
+                               dflt=`echo $dflt | $sed 's/i386//'`
+                      fi
+                      ;;
+               esac
+
+               case "$1" in
+               aix) dflt="$dflt aix_rs" ;;
+               sun[Oo][Ss]) case "$3" in
+                       [34]*) vers=`echo $3 | $sed 's/\./_/g'`
+                               dflt="$dflt sunos_$vers" ;;
+                       5*) vers=`echo $3 | $sed 's/^5/2/g'`
+                               dflt="$dflt solaris_$vers" ;;
+                       esac
+                       ;;
+               [sS]olaris) case "$3" in
+                       5*) vers=`echo $3 | $sed 's/^5/2/g'`
+                               dflt="$dflt solaris_$vers" ;;
+                       esac
+                       ;;
+               dnix) dflt="$dflt dnix" ;;
+               dgux) dflt="$dflt dgux" ;;
+               genix) dflt="$dflt genix" ;;
+               hp*ux) dflt="$dflt hpux" ;;
+               next) dflt="$dflt next" ;;
+               irix) dflt="$dflt sgi" ;;
+               ultrix) case "$3" in
+                       3*) dflt="$dflt ultrix_3" ;;
+                       4*) dflt="$dflt ultrix_4" ;;
+                       esac
+                       ;;
+               uts) dflt="$dflt uts" ;;
+               $2) case "$dflt" in
+                       *isc*) ;;
+                       *)      if test -f /etc/systemid; then
+                               set `echo $3 | $sed 's/\./ /g'` $4
+                                       if $test -f sco_$1_$2_$3.sh; then
+                                               dflt="$dflt sco_$1_$2_$3"
+                                       elif $test -f sco_$1_$2.sh; then
+                                               dflt="$dflt sco_$1_$2"
+                                       elif $test -f sco_$1.sh; then
+                                               dflt="$dflt sco_$1"
+                                       fi
+                               fi
+                               ;;
+                       esac
+                       ;;
+               esac
+       else
+               if test -f /vmunix -a -f news_os.sh; then
+                       (what /vmunix | tr '[A-Z]' '[a-z]') > ../UU/kernel.what 2>&1
+                       if $contains news-os ../UU/kernel.what >/dev/null 2>&1; then
+                               dflt="$dflt news_os"
+                       fi
+                       $rm -f ../UU/kernel.what
+               fi
+       fi
+       set X `echo $dflt | tr ' ' '\012' | sort | uniq`
+       shift
+       dflt=''
+       for file in $*; do
+               if $test -f "$file.sh"; then
+                       dflt="$dflt $file"
+               fi
+       done
+       set X $dflt
+       shift
+       dflt=${1+"$@"}
+       case "$dflt" in
+       '') dflt=none;;
+       esac
+       $cat <<EOM
+
+You may give one or more space-separated answers, or "none" if appropriate.
+If your OS version has no hints, DO NOT give a wrong version -- say "none".
+
+EOM
+       rp="Which of these apply, if any?"
+       . ../UU/myread
+       for file in $ans; do
+               if $test -f $file.sh; then
+                       . ./$file.sh
+                       $cat $file.sh >> ../UU/config.sh
+               elif $test X$ans = X -o X$ans = Xnone ; then
+                       : nothing
+               else
+                       echo "$file.sh does not exist -- ignored"
+               fi
+       done
+       hint=recommended
+       cd ..
+fi
+cd UU
+;;
+*)
+       echo " "
+       echo "Fetching default answers from $config_sh..." >&4
+       tmp="$n"
+       tans="$c"
+       cd ..
+       cp $config_sh config.sh 2>/dev/null
+       . ./config.sh
+       cd UU
+       cp ../config.sh .
+       n="$tmp"
+       c="$tans"
+       hint=previous
+       ;;
+esac
+
+: Restore computed paths
+for file in $loclist $trylist; do
+       eval $file="\$_$file"
+done
+
+: who configured the system
+cf_time=`$date 2>&1`
+cf_by=`( (logname) 2>/dev/null || whoami) 2>&1`
+
+: determine where manual pages are on this system
+echo " "
+case "$sysman" in
+'') 
+       syspath='/usr/man/man1 /usr/man/man1 /usr/man/mann'
+       syspath="$syspath /usr/man/manl /usr/man/local/man1"
+       syspath="$syspath /usr/man/u_man/man1 /usr/share/man/man1"
+       syspath="$syspath /usr/catman/u_man/man1 /usr/man/l_man/man1"
+       syspath="$syspath /usr/local/man/u_man/man1 /usr/local/man/l_man/man1"
+       syspath="$syspath /usr/man/man.L /local/man/man1"
+       sysman=`./loc . $syspath`
+       ;;
+esac
+if $test -d "$sysman"; then
+       echo "System manual is in $sysman." >&4
+else
+       echo "Could not find manual pages in source form." >&4
+fi
+
+: see what memory models we can support
+case "$models" in
+'')
+       $cat >pdp11.c <<'EOP'
+main() {
+#ifdef pdp11
+       exit(0);
+#else
+       exit(1);
+#endif
+}
+EOP
+       cc -o pdp11 pdp11.c >/dev/null 2>&1
+       if ./pdp11 2>/dev/null; then
+               dflt='unsplit split'
+       else
+               tans=`./loc . X /lib/small /lib/large /usr/lib/small /usr/lib/large /lib/medium /usr/lib/medium /lib/huge`
+               case "$tans" in
+               X) dflt='none';;
+               *) if $test -d /lib/small || $test -d /usr/lib/small; then
+                               dflt='small'
+                       else
+                               dflt=''
+                       fi
+                       if $test -d /lib/medium || $test -d /usr/lib/medium; then
+                               dflt="$dflt medium"
+                       fi
+                       if $test -d /lib/large || $test -d /usr/lib/large; then
+                               dflt="$dflt large"
+                       fi
+                       if $test -d /lib/huge || $test -d /usr/lib/huge; then
+                               dflt="$dflt huge"
+                       fi
+               esac
+       fi;;
+*) dflt="$models";;
+esac
+$cat <<EOM
+Some systems have different model sizes.  On most systems they are called
+small, medium, large, and huge.  On the PDP11 they are called unsplit and
+split.  If your system doesn't support different memory models, say "none".
+If you wish to force everything to one memory model, say "none" here and
+put the appropriate flags later when it asks you for other cc and ld flags.
+Venix systems may wish to put "none" and let the compiler figure things out.
+(In the following question multiple model names should be space separated.)
+
+EOM
+rp="Which memory models are supported?"
+. ./myread
+models="$ans"
+
+case "$models" in
+none)
+       small=''
+       medium=''
+       large=''
+       huge=''
+       unsplit=''
+       split=''
+       ;;
+*split)
+       case "$split" in
+       '') if $contains '\-i' $sysman/ld.1 >/dev/null 2>&1 || \
+                        $contains '\-i' $sysman/cc.1 >/dev/null 2>&1; then
+                       dflt='-i'
+               else
+                       dflt='none'
+               fi;;
+       *) dflt="$split";;
+       esac
+       rp="What flag indicates separate I and D space?"
+       . ./myread
+       tans="$ans"
+       case "$tans" in
+       none) tans='';;
+       esac
+       split="$tans"
+       unsplit='';;
+*large*|*small*|*medium*|*huge*)
+       case "$models" in
+       *large*)
+               case "$large" in
+               '') dflt='-Ml';;
+               *) dflt="$large";;
+               esac
+       rp="What flag indicates large model?"
+       . ./myread
+       tans="$ans"
+       case "$tans" in
+       none) tans='';
+       esac
+       large="$tans";;
+       *) large='';;
+       esac
+       case "$models" in
+       *huge*) case "$huge" in
+               '') dflt='-Mh';;
+               *) dflt="$huge";;
+               esac
+               rp="What flag indicates huge model?"
+               . ./myread
+               tans="$ans"
+               case "$tans" in
+               none) tans='';
+               esac
+               huge="$tans";;
+       *) huge="$large";;
+       esac
+       case "$models" in
+       *medium*) case "$medium" in
+               '') dflt='-Mm';;
+               *) dflt="$medium";;
+               esac
+               rp="What flag indicates medium model?"
+               . ./myread
+               tans="$ans"
+               case "$tans" in
+               none) tans='';
+               esac
+               medium="$tans";;
+       *) medium="$large";;
+       esac
+       case "$models" in
+       *small*) case "$small" in
+               '') dflt='none';;
+               *) dflt="$small";;
+               esac
+               rp="What flag indicates small model?"
+               . ./myread
+               tans="$ans"
+               case "$tans" in
+               none) tans='';
+               esac
+               small="$tans";;
+       *) small='';;
+       esac
+       ;;
+*)
+       echo "Unrecognized memory models--you may have to edit Makefile.SH" >&4
+       ;;
+esac
+
+: make some quick guesses about what we are up against
+echo " "
+$echo $n "Hmm...  $c"
+echo exit 1 >bsd
+echo exit 1 >usg
+echo exit 1 >v7
+echo exit 1 >osf1
+echo exit 1 >eunice
+echo exit 1 >xenix
+echo exit 1 >venix
+d_bsd="$undef"
+$cat /usr/include/signal.h /usr/include/sys/signal.h >foo 2>/dev/null
+if test -f /osf_boot || $contains 'OSF/1' /usr/include/ctype.h >/dev/null 2>&1
+then
+       echo "Looks kind of like an OSF/1 system, but we'll see..."
+       echo exit 0 >osf1
+elif test `echo abc | tr a-z A-Z` = Abc ; then
+       xxx=`./loc addbib blurfl $pth`
+       if $test -f $xxx; then
+       echo "Looks kind of like a USG system with BSD features, but we'll see..."
+               echo exit 0 >bsd
+               echo exit 0 >usg
+       else
+               if $contains SIGTSTP foo >/dev/null 2>&1 ; then
+                       echo "Looks kind of like an extended USG system, but we'll see..."
+               else
+                       echo "Looks kind of like a USG system, but we'll see..."
+               fi
+               echo exit 0 >usg
+       fi
+elif $contains SIGTSTP foo >/dev/null 2>&1 ; then
+       echo "Looks kind of like a BSD system, but we'll see..."
+       d_bsd="$define"
+       echo exit 0 >bsd
+else
+       echo "Looks kind of like a Version 7 system, but we'll see..."
+       echo exit 0 >v7
+fi
+case "$eunicefix" in
+*unixtovms*)
+       $cat <<'EOI'
+There is, however, a strange, musty smell in the air that reminds me of
+something...hmm...yes...I've got it...there's a VMS nearby, or I'm a Blit.
+EOI
+       echo exit 0 >eunice
+       d_eunice="$define"
+: it so happens the Eunice I know will not run shell scripts in Unix format
+       ;;
+*)
+       echo " "
+       echo "Congratulations.  You aren't running Eunice."
+       d_eunice="$undef"
+       ;;
+esac
+if test -f /xenix; then
+       echo "Actually, this looks more like a XENIX system..."
+       echo exit 0 >xenix
+       d_xenix="$define"
+else
+       echo " "
+       echo "It's not Xenix..."
+       d_xenix="$undef"
+fi
+chmod +x xenix
+$eunicefix xenix
+if test -f /venix; then
+       echo "Actually, this looks more like a VENIX system..."
+       echo exit 0 >venix
+else
+       echo " "
+       if xenix; then
+               : null
+       else
+               echo "Nor is it Venix..."
+       fi
+fi
+chmod +x bsd usg v7 osf1 eunice xenix venix
+$eunicefix bsd usg v7 osf1 eunice xenix venix
+$rm -f foo
+
+: see if we need a special compiler
+echo " "
+if usg; then
+       case "$cc" in
+       '') case "$Mcc" in
+               /*) dflt='Mcc';;
+               *) case "$large" in
+                       -M*) dflt='cc';;
+                       *)      if $contains '\-M' $sysman/cc.1 >/dev/null 2>&1 ; then
+                                       if $contains '\-M' $sysman/cpp.1 >/dev/null 2>&1; then
+                                               dflt='cc'
+                                       else
+                                               dflt='cc -M'
+                                       fi
+                               else
+                                       dflt='cc'
+                               fi;;
+                       esac;;
+               esac;;
+       *)  dflt="$cc";;
+       esac
+       $cat <<'EOM'
+On some systems the default C compiler will not resolve multiple global
+references that happen to have the same name.  On some such systems the "Mcc"
+command may be used to force these to be resolved.  On other systems a "cc -M"
+command is required.  (Note that the -M flag on other systems indicates a
+memory model to use!) If you have the Gnu C compiler, you might wish to use
+that instead.
+
+EOM
+       rp="What command will force resolution on this system?"
+       . ./myread
+       cc="$ans"
+else
+       case "$cc" in
+       '') dflt=cc;;
+       *) dflt="$cc";;
+       esac
+       rp="Use which C compiler?"
+       . ./myread
+       cc="$ans"
+fi
+case "$cc" in
+gcc*)   echo "Checking out which version of gcc"
+$cat >gccvers.c <<EOM
+#include <stdio.h>
+int main()
+{
+char *v;
+v = "unknown";
+#ifdef __GNUC__
+#  ifdef __VERSION__
+       v = __VERSION__;
+#  endif
+#endif
+switch((int) v[0])
+  {
+    case '1':  printf("1\n"); break;
+    case '2':  printf("2\n"); break;
+    case '3':  printf("3\n"); break;
+    default:   break;
+  }
+#ifdef __GNUC__
+return 0;
+#else
+return 1;
+#endif
+}
+EOM
+       if $cc -o gccvers $ccflags gccvers.c >/dev/null 2>&1; then
+           gccversion=`./gccvers`
+               echo "You appear to have version $gccversion."
+       else
+               echo "Doesn't appear to be GNU cc."
+       fi
+       $rm -f gccvers*
+       if $test "$gccversion" = '1'; then
+               cpp=`./loc gcc-cpp $cpp $pth`
+       fi
+       ;;
+esac
+: decide how portable to be
+case "$d_portable" in
+"$define") dflt=y;;
+*)     dflt=n;;
+esac
+$cat <<'EOH'
+I can set things up so that your shell scripts and binaries are more portable,
+at what may be a noticable cost in performance.  In particular, if you
+ask to be portable, the following happens:
+
+     1) Shell scripts will rely on the PATH variable rather than using
+       the paths derived above.
+     2) ~username interpretations will be done at run time rather than
+       by Configure.
+
+EOH
+rp="Do you expect to run these scripts and binaries on multiple machines?"
+. ./myread
+case "$ans" in
+       y*) d_portable="$define"
+       for file in $loclist $trylist; do
+               eval $file="\$file"
+       done
+       ;;
+       *)  d_portable="$undef" ;;
+esac
+
+: set up shell script to do ~ expansion
+cat >filexp <<EOSS
+$startsh
+: expand filename
+case "\$1" in
+ ~/*|~)
+       echo \$1 | $sed "s|~|\${HOME-\$LOGDIR}|"
+       ;;
+ ~*)
+       if $test -f /bin/csh; then
+               /bin/csh -f -c "glob \$1"
+               failed=$?
+               echo ""
+               exit \$failed
+       else
+               name=\`$expr x\$1 : '..\([^/]*\)'\`
+               dir=\`$sed -n -e "/^\${name}:/{s/^[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:\([^:]*\).*"'\$'"/\1/" -e p -e q -e '}' </etc/passwd\`
+               if $test ! -d "\$dir"; then
+                       me=\`basename \$0\`
+                       echo "\$me: can't locate home directory for: \$name" >&2
+                       exit 1
+               fi
+               case "\$1" in
+               */*)
+                       echo \$dir/\`$expr x\$1 : '..[^/]*/\(.*\)'\`
+                       ;;
+               *)
+                       echo \$dir
+                       ;;
+               esac
+       fi
+       ;;
+*)
+       echo \$1
+       ;;
+esac
+EOSS
+chmod +x filexp
+$eunicefix filexp
+
+: now set up to get a file name
+cat <<'EOSC' >getfile
+tilde=''
+fullpath=''
+already=''
+skip=''
+none_ok=''
+exp_file=''
+orig_rp="$rp"
+orig_dflt="$dflt"
+
+case "$fn" in
+*~*) tilde=true;;
+esac
+case "$fn" in
+*/*) fullpath=true;;
+esac
+case "$fn" in
+*+*) skip=true;;
+esac
+case "$fn" in
+*n*) none_ok=true;;
+esac
+case "$fn" in
+*e*) exp_file=true;;
+esac
+
+case "$fn" in
+*f*) type='File';;
+*d*) type='Directory';;
+*l*) type='Locate'; fn=`expr $fn : '.*:\(.*\)'`;;
+esac
+
+what="$type"
+case "$what" in
+Locate) what='File';;
+esac
+
+case "$exp_file" in
+'')
+       case "$d_portable" in
+       "$define") ;;
+       *) exp_file=true;;
+       esac
+       ;;
+esac
+
+cd ..
+while test "$type"; do
+       redo=''
+       rp="$orig_rp"
+       dflt="$orig_dflt"
+       case "$tilde" in
+       true) rp="$rp (~name ok)";;
+       esac
+       . UU/myread
+       case "$ans" in
+       none)
+               value=''
+               ansexp=''
+               case "$none_ok" in
+               true) type='';;
+               esac
+               ;;
+       *)
+               case "$tilde" in
+               '') value="$ans"
+                       ansexp="$ans";;
+               *)
+                       value=`UU/filexp $ans`
+                       case $? in
+                       0)
+                               if test "$ans" != "$value"; then
+                                       echo "(That is $value on this particular system.)"
+                               fi
+                               ;;
+                       *) value="$ans";;
+                       esac
+                       ansexp="$value"
+                       case "$exp_file" in
+                       '') value="$ans";;
+                       esac
+                       ;;
+               esac
+               case "$fullpath" in
+               true)
+                       case "$ansexp" in
+                       /*) value="$ansexp" ;;
+                       *)
+                               redo=true
+                               case "$already" in
+                               true)
+                               echo "I shall only accept a full path name, as in /bin/ls." >&4
+                               echo "Use a ! shell escape if you wish to check pathnames." >&4
+                                       ;;
+                               *)
+                               echo "Please give a full path name, starting with slash." >&4
+                                       case "$tilde" in
+                                       true)
+                               echo "Note that using ~name is ok provided it expands well." >&4
+                                               already=true
+                                               ;;
+                                       esac
+                               esac
+                               ;;
+                       esac
+                       ;;
+               esac
+               case "$redo" in
+               '')
+                       case "$type" in
+                       File)
+                               if test -f "$ansexp"; then
+                                       type=''
+                               elif test -r "$ansexp" || (test -h "$ansexp") >/dev/null 2>&1
+                               then
+                                       echo "($value is not a plain file, but that's ok.)"
+                                       type=''
+                               fi
+                               ;;
+                       Directory)
+                               if test -d "$ansexp"; then
+                                       type=''
+                               fi
+                               ;;
+                       Locate)
+                               if test -d "$value"; then
+                                       echo "(Looking for $fn in directory $value.)"
+                                       value="$value/$fn"
+                               fi
+                               if test -f "$value"; then
+                                       type=''
+                               fi
+                               ;;
+                       esac
+
+                       case "$skip" in
+                       true) type='';
+                       esac
+
+                       case "$type" in
+                       '') ;;
+                       *)
+                               if test "$fastread" = yes; then
+                                       dflt=y
+                               else
+                                       dflt=n
+                               fi
+                               rp="$what $value doesn't exist.  Use that name anyway?"
+                               . UU/myread
+                               dflt=''
+                               case "$ans" in
+                               y*) type='';;
+                               *) echo " ";;
+                               esac
+                               ;;
+                       esac
+                       ;;
+               esac
+               ;;
+       esac
+done
+cd UU
+ans="$value"
+rp="$orig_rp"
+dflt="$orig_dflt"
+EOSC
+
+: What should the include directory be ?
+echo " "
+$echo $n "Hmm...  $c"
+case "$usrinc" in
+'') dflt='/usr/include';;
+*) dflt=$usrinc;;
+esac
+incpath=''
+mips_type=''
+if $test -f /bin/mips && /bin/mips; then
+       echo "Looks like a MIPS system..."
+       $cat >usr.c <<'EOCP'
+#ifdef SYSTYPE_BSD43
+/bsd43
+#endif
+EOCP
+       if $cc -E usr.c > usr.out && $contains / usr.out >/dev/null 2>&1; then
+               dflt='/bsd43/usr/include'
+               incpath='/bsd43'
+               mips_type='BSD 4.3'
+       else
+               mips_type='System V'
+       fi
+       $rm -f usr.c usr.out
+       echo "and you're compiling with the $mips_type compiler and libraries."
+else
+       echo "Doesn't look like a MIPS system."
+       echo "exit 1" >mips
+       chmod +x mips
+       $eunicefix mips
+fi
+echo " "
+fn=d/
+rp='Where are the include files you want to use?'
+. ./getfile
+usrinc="$ans"
+
+: determine optimize, if desired, or use for debug flag also
+case "$optimize" in
+' ') dflt="none";;
+'') dflt="-g";;
+*) dflt="$optimize";;
+esac
+$cat <<EOH
+
+Some C compilers have problems with their optimizers, by default, $package
+compiles with the -O flag to use the optimizer.  Alternately, you might want
+to use the symbolic debugger, which uses the -g flag (on traditional Unix
+systems).  Either flag can be specified here.  To use neither flag, specify
+the word "none".
+
+EOH
+rp="What optimizer/debugger flag should be used?"
+. ./myread
+optimize="$ans"
+case "$optimize" in
+'none') optimize=" ";;
+esac
+
+case "$ccflags" in
+'')    case "$cc" in
+       *gcc*) if $test "$gccversion" = "1"; then
+                       dflt='-fpcc-struct-return'
+                  fi ;;
+       *) dflt='';;
+       esac
+       case "$optimize" in
+       *-g*) dflt="$dflt -DDEBUGGING";;
+       esac
+       case "$cc" in
+       *gcc*)  if test -d /etc/conf/kconfig.d &&
+                 $contains _POSIX_VERSION $usrinc/sys/unistd.h >/dev/null 2>&1
+               then
+                       dflt="$dflt -posix"
+               fi
+               ;;
+       esac
+       ;;
+*) dflt="$ccflags" ;;
+esac
+
+case "$mips_type" in
+*BSD*) ;;
+'') ;;
+*) inclwanted="$inclwanted $usrinc/bsd";;
+esac
+for thisincl in $inclwanted; do
+       if $test -d $thisincl; then
+               if $test x$thisincl != x$usrinc; then
+                       case "$dflt" in
+                       *$thisincl*);;
+                       *) dflt="$dflt -I$thisincl";;
+                       esac
+               fi
+       fi
+done
+
+inctest='if $contains $2 $usrinc/$1 >/dev/null 2>&1; then
+       xxx=true;
+elif $contains $2 $usrinc/sys/$1 >/dev/null 2>&1; then
+       xxx=true;
+else
+       xxx=false;
+fi;
+if $xxx; then
+       case "$dflt" in
+       *$2*);;
+       *) dflt="$dflt -D$2";;
+       esac;
+fi'
+
+if ./osf1; then
+       set signal.h __LANGUAGE_C__; eval $inctest
+else
+       set signal.h LANGUAGE_C; eval $inctest
+fi
+set signal.h NO_PROTOTYPE; eval $inctest
+set signal.h _NO_PROTO; eval $inctest
+
+case "$dflt" in
+'') dflt=none;;
+esac
+$cat <<EOH
+
+Your C compiler may want other flags.  For this question you should include
+-I/whatever and -DWHATEVER flags and any other flags used by the C compiler,
+but you should NOT include libraries or ld flags like -lwhatever.  If you
+want $package to honor its debug switch, you should include -DDEBUGGING here.
+To use no flags, specify the word "none".
+
+Your C compiler might also need additional flags, such as -DJMPCLOBBER
+or -DCRIPPLED_CC.
+EOH
+set X $dflt
+shift
+dflt=${1+"$@"}
+rp="Any additional cc flags?"
+. ./myread
+case "$ans" in
+none) ccflags='';;
+*) ccflags="$ans";;
+esac
+
+: the following weeds options from ccflags that are of no interest to cpp
+cppflags="$ccflags"
+case "$cc" in
+*gcc*) if $test "$gccversion" = "1"; then
+               cppflags="$cppflags -D__GNUC__"
+           fi ;;
+esac
+case "$mips_type" in
+'');;
+*BSD*) cppflags="$cppflags -DSYSTYPE_BSD43";;
+esac
+case "$cppflags" in
+'');;
+*)  set X $cppflags
+       cppflags=''
+       for flag
+       do
+               case $flag in
+               -D*|-I*|-traditional|-ansi|-nostdinc) cppflags="$cppflags $flag";;
+               esac
+       done
+       case "$cppflags" in
+       *-*)  echo "(C preprocessor flags: $cppflags)";;
+       esac
+       ;;
+esac
+
+: flags used in final linking phase
+case "$ldflags" in
+'') if venix; then
+               dflt='-i -z'
+       else
+               dflt='none'
+       fi
+       ;;
+*) dflt="$ldflags";;
+esac
+echo " "
+rp="Any additional ld flags (NOT including libraries)?"
+. ./myread
+case "$ans" in
+none) ldflags='';;
+*) ldflags="$ans";;
+esac
+rmlist="$rmlist pdp11"
+
+: Initialize h_fcntl
+h_fcntl=false
+
+: Initialize h_sysfile
+h_sysfile=false
+
+: Set private lib path
+case "$plibpth" in
+'') if mips; then
+               plibpth="$incpath/usr/lib /usr/local/lib /usr/ccs/lib"
+       fi;;
+esac
+libpth="$plibpth $libpth"
+: Now check and see which directories actually exist.
+xxx=''
+for yyy in $libpth
+do
+    if $test -d $yyy; then
+               xxx="$xxx $yyy"
+    fi
+done
+libpth="$xxx"
+$cat <<EOM
+Some systems have incompatible or broken versions of libraries.  Where
+should I look for libraries?
+EOM
+
+dflt="$libpth"
+echo " "
+rp="Directories to use for library searches?"
+. ./myread
+case "$ans" in
+none) libpth=' ';;
+*) libpth="$ans";;
+esac
+: Looking for optional libraries
+echo " "
+echo "Checking for optional libraries..." >&4
+case "$libs" in
+' '|'') dflt='';;
+*) dflt="$libs";;
+esac
+case "$libswanted" in
+'') libswanted='c_s';;
+esac
+for thislib in $libswanted; do
+       case "$thislib" in
+       dbm) thatlib=ndbm;;
+       *_s) thatlib=NONE;;
+       *) thatlib="${thislib}_s";;
+       esac
+       xxx=`./loc lib$thislib.a X $libpth`
+       yyy=`./loc lib$thatlib.a X $libpth`
+       zzz=`./loc lib$thislib.so.[0-9]'*' $libpth`
+       if $test -f $xxx; then
+               echo "Found -l$thislib."
+               case "$dflt" in
+               "*-l$thislib *.*"|"*-l$thatlib *.*") ;;
+               *) dflt="$dflt -l$thislib";;
+               esac
+       elif $test -f $yyy; then
+               echo "Found -l$thatlib."
+               case "$dflt" in
+               "*-l$thislib *.*"|"*-l$thatlib *.*") ;;
+               *) dflt="$dflt -l$thatlib";;
+               esac
+       elif $test -f $zzz; then
+               echo "Found -$thislib."
+               case "$dflt" in
+               "*-l$thislib *.*"|"*-l$thatlib *.*") ;;
+               *) dflt="$dflt -l$thislib";;
+               esac
+       else
+               xxx=`./loc Slib$thislib.a X $xlibpth`
+               yyy=`./loc Slib$thatlib.a X $xlibpth`
+               if $test -f $xxx; then
+                       echo "Found -l$thislib."
+                       case "$dflt" in
+                       "*-l$thislib *.*"|"*-l$thatlib *.*") ;;
+                       *) dflt="$dflt -l$thislib";;
+                       esac
+               elif $test -f $yyy; then
+                       echo "Found -l$thatlib."
+                       case "$dflt" in
+                       "*-l$thislib *.*"|"*-l$thatlib *.*") ;;
+                       *) dflt="$dflt -l$thatlib";;
+                       esac
+               else
+                       echo "No -l$thislib."
+               fi
+       fi
+done
+set X $dflt
+shift
+dflt="$*"
+case "$libs" in
+'') dflt="$dflt";;
+*) dflt="$libs";;
+esac
+case "$dflt" in
+' '|'') dflt='none';;
+esac
+
+$cat <<EOM
+Some versions of Unix support shared libraries, which make executables smaller
+but make load time slightly longer.
+
+On some systems, mostly newer Unix System V's, the shared library is included
+by putting the option "-lc_s" as the last thing on the cc command line when
+linking.  Other systems use shared libraries by default.  There may be other
+libraries needed to compile $package on your machine as well.  If your system
+needs the "-lc_s" option, include it here.  Include any other special libraries
+here as well.  Say "none" for none.
+EOM
+
+echo " "
+rp="Any additional libraries?"
+. ./myread
+case "$ans" in
+none) libs=' ';;
+*) libs="$ans";;
+esac
+
+: see if nm is to be used to determine whether a symbol is defined or not
+case "$usenm" in
+'')
+       dflt=`egrep 'inlibc|csym' ../Configure | wc -l 2>/dev/null`
+       if $test $dflt -gt 20; then
+               dflt=y
+       else
+               dflt=n
+       fi
+       ;;
+*)
+       case "$usenm" in
+       true) dflt=y;;
+       *) dflt=n;;
+       esac
+       ;;
+esac
+$cat <<EOM
+
+I can use 'nm' to extract the symbols from your C libraries. This is a time
+consuming task which may generate huge output on the disk (up to 3 megabytes)
+but that should make the symbols extraction faster. The alternative is to skip
+the 'nm' extraction part and to compile a small test program instead to
+determine whether each symbol is present. If you have a fast C compiler and/or
+if your 'nm' output cannot be parsed, this may be the best solution.
+
+EOM
+rp='Shall I use nm to extract C symbols from the libraries?'
+. ./myread
+case "$ans" in
+n|N) usenm=false;;
+*) usenm=true;;
+esac
+
+runnm=$usenm
+case "$reuseval" in
+true) runnm=false;;
+esac
+
+: nm options which may be necessary
+case "$nm_opt" in
+'') if $test -f /mach_boot; then
+               nm_opt=''
+       elif $test -d /usr/ccs/lib; then
+               nm_opt='-p'
+       elif $test -f /dgux; then
+               nm_opt='-p'
+       else
+               nm_opt=''
+       fi;;
+esac
+
+case "$runnm" in
+true)
+: get list of predefined functions in a handy place
+echo " "
+case "$libc" in
+'') libc=unknown
+       case "$libs" in
+       *-lc_s*) libc=`./loc libc_s.a $libc $libpth`
+       esac
+       ;;
+esac
+libpth="$plibpth $libpth"
+libnames='';
+case "$libs" in
+'') ;;
+*)  for thislib in $libs; do
+       case "$thislib" in
+       -l*)
+               thislib=`expr X$thislib : 'X-l\(.*\)'`
+               try=`./loc lib$thislib.a blurfl/dyick $libpth`
+               if test ! -f $try; then
+                       try=`./loc lib$thislib blurfl/dyick $libpth`
+                       if test ! -f $try; then
+                               try=`./loc lib$thislib.so.'*' blurfl/dyick $libpth`
+                               if test ! -f $try; then
+                                       try=`./loc $thislib blurfl/dyick $libpth`
+                                       if test ! -f $try; then
+                                               try=`./loc Slib$thislib.a blurfl/dyick $xlibpth`
+                                               if test ! -f $try; then
+                                                       try=''
+                                               fi
+                                       fi
+                               fi
+                       fi
+               fi
+               libnames="$libnames $try"
+               ;;
+       *) libnames="$libnames $thislib" ;;
+       esac
+       done
+       ;;
+esac
+xxx=normal
+case "$libc" in
+unknown)
+       set /usr/ccs/lib/libc.so
+       $test -r $1 || set /usr/lib/libc.so
+       $test -r $1 || set /usr/shlib/libc.so
+       $test -r $1 || set /usr/lib/libc.so.[0-9]*
+       $test -r $1 || set /lib/libsys_s.a
+       eval set \$$#
+       ;;
+*)
+       set blurfl
+       ;;
+esac
+if $test -r "$1"; then
+       echo "Your (shared) C library seems to be in $1."
+       libc="$1"
+elif $test -r /lib/libc && $test -r /lib/clib; then
+       echo "Your C library seems to be in both /lib/clib and /lib/libc."
+       xxx=apollo
+       libc='/lib/clib /lib/libc'
+       if $test -r /lib/syslib; then
+               echo "(Your math library is in /lib/syslib.)"
+               libc="$libc /lib/syslib"
+       fi
+elif $test -r "$libc" || (test -h "$libc") >/dev/null 2>&1; then
+       echo "Your C library seems to be in $libc, as you said before."
+elif $test -r $incpath/usr/lib/libc.a; then
+       libc=$incpath/usr/lib/libc.a;
+       echo "Your C library seems to be in $libc.  That's fine."
+elif $test -r /lib/libc.a; then
+       libc=/lib/libc.a;
+       echo "Your C library seems to be in $libc.  You're normal."
+else
+       if tans=`./loc libc.a blurfl/dyick $libpth`; $test -r "$tans"; then
+               :
+       elif tans=`./loc libc blurfl/dyick $libpth`; $test -r "$tans"; then
+               libnames="$libnames "`./loc clib blurfl/dyick $libpth`
+       elif tans=`./loc clib blurfl/dyick $libpth`; $test -r "$tans"; then
+               :
+       elif tans=`./loc Slibc.a blurfl/dyick $xlibpth`; $test -r "$tans"; then
+               :
+       elif tans=`./loc Mlibc.a blurfl/dyick $xlibpth`; $test -r "$tans"; then
+               :
+       else
+               tans=`./loc Llibc.a blurfl/dyick $xlibpth`
+       fi
+       if $test -r "$tans"; then
+               echo "Your C library seems to be in $tans, of all places."
+               libc=$tans
+       else
+               libc='blurfl'
+       fi
+fi
+if $test $xxx = apollo -o -r "$libc" || (test -h "$libc") >/dev/null 2>&1; then
+       dflt="$libc"
+       cat <<EOM
+
+If the guess above is wrong (which it might be if you're using a strange
+compiler, or your machine supports multiple models), you can override it here.
+
+EOM
+else
+       dflt=''
+       echo $libpth | tr ' ' '\012' | sort | uniq > libpath
+       cat >&4 <<EOM
+I can't seem to find your C library.  I've looked in the following places:
+
+EOM
+       $sed 's/^/      /' libpath
+       cat <<EOM
+
+None of these seems to contain your C library. I need to get its name...
+
+EOM
+fi
+fn=f
+rp='Where is your C library?'
+. ./getfile
+libc="$ans"
+
+echo " "
+echo $libc $libnames | tr ' ' '\012' | sort | uniq > libnames
+set X `cat libnames`
+shift
+xxx=files
+case $# in 1) xxx=file; esac
+echo "Extracting names from the following $xxx for later perusal:" >&4
+echo " "
+$sed 's/^/     /' libnames >&4
+echo " "
+$echo $n "This may take a while...$c" >&4
+
+nm $nm_opt $* 2>/dev/null >libc.tmp
+$echo $n ".$c"
+$grep fprintf libc.tmp > libc.ptf
+xscan='eval "<libc.ptf $com >libc.list"; $echo $n ".$c" >&4'
+xrun='eval "<libc.tmp $com >libc.list"; echo "done" >&4'
+if com="$sed -n -e 's/^.* [ADTS]  *_[_.]*//p' -e 's/^.* [ADTS] //p'";\
+       eval $xscan;\
+       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
+               eval $xrun
+elif com="$sed -n -e 's/^__*//' -e 's/^\([a-zA-Z_0-9$]*\).*xtern.*/\1/p'";\
+       eval $xscan;\
+       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
+               eval $xrun
+elif com="$sed -n -e '/|UNDEF/d' -e '/FUNC..GL/s/^.*|__*//p'";\
+       eval $xscan;\
+       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
+               eval $xrun
+elif com="$sed -n -e 's/^.* D __*//p' -e 's/^.* D //p'";\
+       eval $xscan;\
+       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
+               eval $xrun
+elif com="$sed -n -e 's/^_//' -e 's/^\([a-zA-Z_0-9]*\).*xtern.*text.*/\1/p'";\
+       eval $xscan;\
+       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
+               eval $xrun
+elif com="$sed -n -e 's/^.*|FUNC |GLOB .*|//p'";\
+       eval $xscan;\
+       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
+               eval $xrun
+elif com="$grep '|' | $sed -n -e '/|COMMON/d' -e '/|DATA/d' \
+                               -e '/ file/d' -e 's/^\([^       ]*\).*/\1/p'";\
+       eval $xscan;\
+       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
+               eval $xrun
+elif com="$sed -n -e 's/^.*|FUNC |GLOB .*|//p' -e 's/^.*|FUNC |WEAK .*|//p'";\
+       eval $xscan;\
+       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
+               eval $xrun
+elif com="$sed -n -e 's/^__//' -e '/|Undef/d' -e '/|Proc/s/ .*//p'";\
+       eval $xscan;\
+       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
+               eval $xrun
+else
+       nm -p $* 2>/dev/null >libc.tmp
+       com="$sed -n -e 's/^.* [ADTS]  *_[_.]*//p' -e 's/^.* [ADTS] //p'";\
+       eval "<libc.tmp $com >libc.list"
+       if $contains '^fprintf$' libc.list >/dev/null 2>&1; then
+               nm_opt='-p'
+               echo "done" >&4
+       else
+               echo " "
+               echo "nm didn't seem to work right. Trying ar instead..." >&4
+               com=''
+               if ar t $libc > libc.tmp; then
+                       for thisname in $libnames; do
+                               ar t $thisname >>libc.tmp
+                       done
+                       $sed -e 's/\.o$//' < libc.tmp > libc.list
+                       echo "Ok." >&4
+               else
+                       echo "ar didn't seem to work right." >&4
+                       echo "Maybe this is a Cray...trying bld instead..." >&4
+                       if bld t $libc | $sed -e 's/.*\///' -e 's/\.o:.*$//' > libc.list; then
+                               for thisname in $libnames; do
+                                       bld t $libnames | \
+                                       $sed -e 's/.*\///' -e 's/\.o:.*$//' >>libc.list
+                                       ar t $thisname >>libc.tmp
+                               done
+                               echo "Ok." >&4
+                       else
+                               echo "That didn't work either.  Giving up." >&4
+                               exit 1
+                       fi
+               fi
+       fi
+fi
+nm_extract="$com"
+if $test -f /lib/syscalls.exp; then
+       echo " "
+       echo "Also extracting names from /lib/syscalls.exp for good ole AIX..." >&4
+       $sed -n 's/^\([^        ]*\)[   ]*syscall$/\1/p' /lib/syscalls.exp >>libc.list
+fi
+;;
+esac
+$rm -f libnames libpath
+
+: is a C symbol defined?
+csym='tlook=$1;
+case "$3" in
+-v) tf=libc.tmp; tc=""; tdc="";;
+-a) tf=libc.tmp; tc="[0]"; tdc=[];;
+*) tlook="^$1\$"; tf=libc.list; tc="()"; tdc="()";;
+esac;
+tx=yes;
+case "$reuseval-$4" in
+true-) ;;
+true-*) tx=no; eval "tval=\$$4"; case "$tval" in "") tx=yes;; esac;;
+esac;
+case "$tx" in
+yes)
+       case "$runnm" in
+       true)
+               if $contains $tlook $tf >/dev/null 2>&1;
+               then tval=true;
+               else tval=false;
+               fi;;
+       *)
+               echo "main() { extern int $1$tdc; printf(\"%d\", $1$tc); }" > t.c;
+               if $cc $ccflags -o t t.c $ldflags $libs >/dev/null 2>&1;
+               then tval=true;
+               else tval=false;
+               fi;
+               $rm -f t t.c;;
+       esac;;
+*)
+       case "$tval" in
+       $define) tval=true;;
+       *) tval=false;;
+       esac;;
+esac;
+eval "$2=$tval"'
+
+: set up the script used to warn in case of inconsistency
+cat <<'EOSC' >whoa
+dflt=y
+echo " "
+echo "*** WHOA THERE!!! ***" >&4
+echo "    The $hint value for \$$var on this machine was \"$was\"!" >&4
+rp="    Keep the $hint value?"
+. ./myread
+case "$ans" in
+y) td=$was; tu=$was;;
+esac
+EOSC
+
+: define an is-in-libc? function
+inlibc='echo " "; td=$define; tu=$undef;
+sym=$1; var=$2; eval "was=\$$2";
+tx=yes;
+case "$reuseval$was" in
+true) ;;
+true*) tx=no;;
+esac;
+case "$tx" in
+yes)
+       set $sym tres -f;
+       eval $csym;
+       case "$tres" in
+       true)
+               echo "$sym() found." >&4;
+               case "$was" in $undef) . whoa; esac; eval "$var=\$td";;
+       *)
+               echo "$sym() NOT found." >&4;
+               case "$was" in $define) . whoa; esac; eval "$var=\$tu";;
+       esac;;
+*)
+       case "$was" in
+       $define) echo "$sym() found." >&4;;
+       *) echo "$sym() NOT found." >&4;;
+       esac;;
+esac'
+
+: see how we invoke the C preprocessor
+echo " "
+echo "Now, how can we feed standard input to your C preprocessor..." >&4
+cat <<'EOT' >testcpp.c
+#define ABC abc
+#define XYZ xyz
+ABC.XYZ
+EOT
+cd ..
+echo 'cat >.$$.c; '"$cc"' -E ${1+"$@"} .$$.c; rm .$$.c' >cppstdin
+chmod 755 cppstdin
+wrapper=`pwd`/cppstdin
+ok='false'
+cd UU
+
+if $test "X$cppstdin" != "X" && \
+       $cppstdin $cppminus <testcpp.c >testcpp.out 2>&1 && \
+       $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1
+then
+       echo "You used to use $cppstdin $cppminus so we'll use that again."
+       case "$cpprun" in
+       '') echo "But let's see if we can live without a wrapper..." ;;
+       *)
+               if $cpprun $cpplast <testcpp.c >testcpp.out 2>&1 && \
+                       $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1
+               then
+                       echo "(And we'll use $cpprun $cpplast to preprocess directly.)"
+                       ok='true'
+               else
+                       echo "(However, $cpprun $cpplast does not work, let's see...)"
+               fi
+               ;;
+       esac
+else
+       case "$cppstdin" in
+       '') ;;
+       *)
+               echo "Good old $cppstdin $cppminus does not seem to be of any help..."
+               ;;
+       esac
+fi
+
+if $ok; then
+       : nothing
+elif echo 'Maybe "'"$cc"' -E" will work...'; \
+       $cc -E <testcpp.c >testcpp.out 2>&1; \
+       $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then
+       echo "Yup, it does."
+       x_cpp="$cc -E"
+       x_minus='';
+elif echo 'Nope...maybe "'"$cc"' -E -" will work...'; \
+       $cc -E - <testcpp.c >testcpp.out 2>&1; \
+       $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then
+       echo "Yup, it does."
+       x_cpp="$cc -E"
+       x_minus='-';
+elif echo 'Nope...maybe "'"$cc"' -P" will work...'; \
+       $cc -P <testcpp.c >testcpp.out 2>&1; \
+       $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then
+       echo "Yipee, that works!"
+       x_cpp="$cc -P"
+       x_minus='';
+elif echo 'Nope...maybe "'"$cc"' -P -" will work...'; \
+       $cc -P - <testcpp.c >testcpp.out 2>&1; \
+       $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then
+       echo "At long last!"
+       x_cpp="$cc -P"
+       x_minus='-';
+elif echo 'No such luck, maybe "'$cpp'" will work...'; \
+       $cpp <testcpp.c >testcpp.out 2>&1; \
+       $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then
+       echo "It works!"
+       x_cpp="$cpp"
+       x_minus='';
+elif echo 'Nixed again...maybe "'$cpp' -" will work...'; \
+       $cpp - <testcpp.c >testcpp.out 2>&1; \
+       $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then
+       echo "Hooray, it works!  I was beginning to wonder."
+       x_cpp="$cpp"
+       x_minus='-';
+elif echo 'Uh-uh.  Time to get fancy.  Trying a wrapper...'; \
+       $wrapper <testcpp.c >testcpp.out 2>&1; \
+       $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then
+       x_cpp="$wrapper"
+       x_minus=''
+       echo "Eureka!"
+else
+       dflt=''
+       rp="No dice.  I can't find a C preprocessor.  Name one:"
+       . ./myread
+       x_cpp="$ans"
+       x_minus=''
+       $x_cpp <testcpp.c >testcpp.out 2>&1
+       if $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then
+               echo "OK, that will do." >&4
+       else
+echo "Sorry, I can't get that to work.  Go find one and rerun Configure." >&4
+               exit 1
+       fi
+fi
+
+case "$ok" in
+false)
+       cppstdin="$x_cpp"
+       cppminus="$x_minus"
+       cpprun="$x_cpp"
+       cpplast="$x_minus"
+       set X $x_cpp
+       shift
+       case "$1" in
+       "$cpp")
+               echo "Perhaps can we force $cc -E using a wrapper..."
+               if $wrapper <testcpp.c >testcpp.out 2>&1; \
+                       $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1
+               then
+                       echo "Yup, we can."
+                       cppstdin="$wrapper"
+                       cppminus='';
+               else
+                       echo "Nope, we'll have to live without it..."
+               fi
+               ;;
+       esac
+       case "$cpprun" in
+       "$wrapper")
+               cpprun=''
+               cpplast=''
+               ;;
+       esac
+       ;;
+esac
+
+case "$cppstdin" in
+"$wrapper") ;;
+*) $rm -f $wrapper;;
+esac
+$rm -f testcpp.c testcpp.out
+
+: determine filename position in cpp output
+echo " "
+echo "Computing filename position in cpp output for #include directives..." >&4
+echo '#include <stdio.h>' > foo.c
+$cat >fieldn <<EOF
+$startsh
+$cppstdin $cppminus $cppflags <foo.c 2>/dev/null | \
+$grep '^[      ]*#.*stdio\.h' | \
+while read cline; do
+       pos=1
+       set \$cline
+       while $test \$# -gt 0; do
+               if $test -r \`echo \$1 | $tr -d '"'\`; then
+                       echo "\$pos"
+                       exit 0
+               fi
+               shift
+               pos=\`expr \$pos + 1\`
+       done
+done
+EOF
+chmod +x fieldn
+fieldn=`./fieldn`
+$rm -f foo.c fieldn
+case $fieldn in
+'') pos='???';;
+1) pos=first;;
+2) pos=second;;
+3) pos=third;;
+*) pos="${fieldn}th";;
+esac
+echo "Your cpp writes the filename in the $pos field of the line."
+
+: locate header file
+$cat >findhdr <<EOF
+$startsh
+wanted=\$1
+name=''
+if test -f $usrinc/\$wanted; then
+       echo "$usrinc/\$wanted"
+       exit 0
+fi
+awkprg='{ print \$$fieldn }'
+echo "#include <\$wanted>" > foo\$\$.c
+$cppstdin $cppminus $cppflags < foo\$\$.c 2>/dev/null | \
+$grep "^[      ]*#.*\$wanted" | \
+while read cline; do
+       name=\`echo \$cline | $awk "\$awkprg" | $tr -d '"'\`
+       case "\$name" in
+       */\$wanted) echo "\$name"; exit 0;;
+       *) name='';;
+       esac;
+done;
+$rm -f foo\$\$.c;
+case "\$name" in
+'') exit 1;;
+esac
+EOF
+chmod +x findhdr
+
+: access call always available on UNIX
+set access d_access
+eval $inlibc
+
+: locate the flags for 'access()'
+case "$d_access" in
+"$define")
+       echo " "
+       $cat >access.c <<'EOCP'
+#include <sys/types.h>
+#ifdef I_FCNTL
+#include <fcntl.h>
+#endif
+#ifdef I_SYS_FILE
+#include <sys/file.h>
+#endif
+#ifdef I_UNISTD
+#include <unistd.h>
+#endif
+main() {
+       exit(R_OK);
+}
+EOCP
+       : check sys/file.h first, no particular reason here
+       if $test `./findhdr sys/file.h` && \
+               $cc $cppflags -DI_SYS_FILE access.c -o access >/dev/null 2>&1 ; then
+               h_sysfile=true;
+               echo "<sys/file.h> defines the *_OK access constants." >&4
+       elif $test `./findhdr fcntl.h` && \
+               $cc $cppflags -DI_FCNTL access.c -o access >/dev/null 2>&1 ; then
+               h_fcntl=true;
+               echo "<fcntl.h> defines the *_OK access constants." >&4
+       else
+               echo "I can't find the four *_OK access constants--I'll use mine." >&4
+       fi
+       ;;
+esac
+$rm -f access*
+
+: see if bcmp exists
+set bcmp d_bcmp
+eval $inlibc
+
+: see if bcopy exists
+set bcopy d_bcopy
+eval $inlibc
+
+: see if bzero exists
+set bzero d_bzero
+eval $inlibc
+
+: check for length of integer
+echo " "
+case "$intsize" in
+'')
+       echo "Checking to see how big your integers are..." >&4
+       $cat >try.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`
+       else
+               dflt='4'
+               echo "(I can't seem to compile the test program.  Guessing...)"
+       fi
+       ;;
+*)
+       dflt="$intsize"
+       ;;
+esac
+rp="What is the size of an integer (in bytes)?"
+. ./myread
+intsize="$ans"
+$rm -f try.c try
+
+: function used to set $1 to $val
+setvar='var=$1; eval "was=\$$1"; td=$define; tu=$undef;
+case "$val$was" in
+$define$undef) . whoa; eval "$var=\$td";;
+$undef$define) . whoa; eval "$var=\$tu";;
+*) eval "$var=$val";;
+esac'
+
+: check for ability to cast large floats to 32-bit ints.
+echo " "
+echo 'Checking whether your C compiler can cast large floats to int32.' >&4
+if $test "$intsize" -ge 4; then
+    xxx=int
+else
+    xxx=long
+fi
+
+$cat >try.c <<EOCP
+#include <sys/types.h>
+#include <signal.h>
+blech() { exit(3); }
+main()
+{
+        $xxx i32;
+       double f;
+       int result = 0;
+       signal(SIGFPE, blech);
+
+       f = (double) 0x7fffffff;
+       f = 10 * f;
+       i32  = ( $xxx )f;
+
+       if (i32 != ( $xxx )f)
+               result |= 1;
+       exit(result);
+}
+EOCP
+if $cc -o try $ccflags try.c >/dev/null 2>&1; then
+       ./try
+       yyy=$?
+else
+       yyy=1
+fi
+case "$yyy" in
+0)     val="$define"
+       echo "Yup, it can."
+       ;;
+*)     val="$undef"
+       echo "Nope, it can't."
+       ;;
+esac
+set d_casti32
+eval $setvar
+$rm -f try.*
+: check for ability to cast negative floats to unsigned
+echo " "
+echo 'Checking whether your C compiler can cast negative float to unsigned.' >&4
+$cat >try.c <<'EOCP'
+#include <signal.h>
+blech() { exit(3); }
+main()
+{
+       double f = -123;
+       unsigned long along;
+       unsigned int aint;
+       unsigned short ashort;
+       int result = 0;
+
+       signal(SIGFPE, blech);
+       along = (unsigned long)f;
+       aint = (unsigned int)f;
+       ashort = (unsigned short)f;
+       if (along != (unsigned long)-123)
+               result |= 1;
+       if (aint != (unsigned int)-123)
+               result |= 1;
+       if (ashort != (unsigned short)-123)
+               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
+if $cc -o try $ccflags try.c >/dev/null 2>&1; then
+       ./try
+       castflags=$?
+else
+       castflags=3
+fi
+case "$castflags" in
+0)     val="$define"
+       echo "Yup, it can."
+       ;;
+*)     val="$undef"
+       echo "Nope, it can't."
+       ;;
+esac
+set d_castneg
+eval $setvar
+$rm -f try.*
+
+: see if sprintf is declared as int or pointer to char
+echo " "
+$cat >ucbsprf.c <<'EOF'
+main()
+{
+       int sprintf();
+       char buf[10];
+       exit((unsigned long)sprintf(buf,"%s","foo") > 10L);
+}
+EOF
+if $cc ucbsprf.c -o ucbsprf >/dev/null 2>&1 && ./ucbsprf; then
+       echo "Your sprintf() returns (int)." >&4
+       val="$undef"
+else
+       echo "Your sprintf() returns (char*)." >&4
+       val="$define"
+fi
+set d_charsprf
+eval $setvar
+$rm -f ucbsprf*
+
+: see if vprintf exists
+echo " "
+if set vprintf val -f d_vprintf; eval $csym; $val; then
+       echo 'vprintf() found.' >&4
+       val="$define"
+       $cat >vprintf.c <<'EOF'
+#include <varargs.h>
+
+main() { xxx("foo"); }
+
+xxx(va_alist)
+va_dcl
+{
+       va_list args;
+       char buf[10];
+
+       va_start(args);
+       exit((unsigned long)vsprintf(buf,"%s",args) > 10L);
+}
+EOF
+       if $cc $ccflags vprintf.c -o vprintf >/dev/null 2>&1 && ./vprintf; then
+               echo "Your vsprintf() returns (int)." >&4
+               val2="$undef"
+       else
+               echo "Your vsprintf() returns (char*)." >&4
+               val2="$define"
+       fi
+else
+       echo 'vprintf() NOT found.' >&4
+               val="$undef"
+               val2="$undef"
+fi
+set d_vprintf
+eval $setvar
+val=$val2
+set d_charvspr
+eval $setvar
+
+: see if chsize exists
+set chsize d_chsize
+eval $inlibc
+
+: check for const keyword
+echo " "
+echo 'Checking to see if your C compiler knows about "const"...' >&4
+$cat >const.c <<'EOCP'
+typedef struct spug { int drokk; } spug;
+main()
+{
+       const char *foo;
+       const spug y;
+}
+EOCP
+if $cc -c $ccflags const.c >/dev/null 2>&1 ; then
+       val="$define"
+       echo "Yup, it does."
+else
+       val="$undef"
+       echo "Nope, it doesn't."
+fi
+set d_const
+eval $setvar
+
+: see if crypt exists
+echo " "
+if set crypt val -f d_crypt; eval $csym; $val; then
+       echo 'crypt() found.' >&4
+       val="$define"
+       cryptlib=''
+else
+       cryptlib=`./loc Slibcrypt.a "" $xlibpth`
+       if $test -z "$cryptlib"; then
+               cryptlib=`./loc Mlibcrypt.a "" $xlibpth`
+       else
+               cryptlib=-lcrypt
+       fi
+       if $test -z "$cryptlib"; then
+               cryptlib=`./loc Llibcrypt.a "" $xlibpth`
+       else
+               cryptlib=-lcrypt
+       fi
+       if $test -z "$cryptlib"; then
+               cryptlib=`./loc libcrypt.a "" $libpth`
+       else
+               cryptlib=-lcrypt
+       fi
+       if $test -z "$cryptlib"; then
+               echo 'crypt() NOT found.' >&4
+               val="$undef"
+       else
+               val="$define"
+       fi
+fi
+set d_crypt
+eval $setvar
+
+: get csh whereabouts
+case "$csh" in
+'csh') val="$undef" ;;
+*) val="$define" ;;
+esac
+set d_csh
+eval $setvar
+
+: see if this is a dirent system
+echo " "
+if xinc=`./findhdr dirent.h`; $test "$xinc"; then
+       val="$define"
+       echo "<dirent.h> found." >&4
+else
+       val="$undef"
+       if xinc=`./findhdr sys/dir.h`; $test "$xinc"; then
+               echo "<sys/dir.h> found." >&4
+               echo " "
+       else
+               xinc=`./findhdr sys/ndir.h`
+       fi
+       echo "<dirent.h> NOT found." >&4
+fi
+set i_dirent
+eval $setvar
+
+: see if the directory entry stores field length
+echo " "
+if $contains 'd_namlen' $xinc >/dev/null 2>&1; then
+       echo "Good, your directory entry keeps length information in d_namlen." >&4
+       val="$define"
+else
+       echo "Your directory entry does not know about the d_namlen field." >&4
+       val="$undef"
+fi
+set d_dirnamlen
+eval $setvar
+
+: now see if they want to do setuid emulation
+case "$d_dosuid" in
+'') dflt=n;;
+"$undef") dflt=n;;
+*) dflt=y;;
+esac
+cat <<EOM
+Some sites have disabled setuid #! scripts because of a bug in the kernel
+that prevents them from being secure.  If you are on such a system, the
+setuid/setgid bits on scripts are currently useless.  It is possible for
+$package to detect those bits and emulate setuid/setgid in a secure fashion
+until a better solution is devised for the kernel problem.
+
+EOM
+rp="Do you want to do setuid/setgid emulation?"
+. ./myread
+case "$ans" in
+y*)  d_dosuid="$define";;
+*) d_dosuid="$undef";;
+esac
+
+: see if dup2 exists
+set dup2 d_dup2
+eval $inlibc
+
+: see if fchmod exists
+set fchmod d_fchmod
+eval $inlibc
+
+: see if fchown exists
+set fchown d_fchown
+eval $inlibc
+
+: see if this is an fcntl system
+set fcntl d_fcntl
+eval $inlibc
+
+: see if we can have long filenames
+echo " "
+rmlist="$rmlist /tmp/cf$$"
+$test -d /tmp/cf$$ || mkdir /tmp/cf$$
+first=123456789abcdef
+second=/tmp/cf$$/$first
+$rm -f $first $second
+if (echo hi >$first) 2>/dev/null; then
+       if $test -f 123456789abcde; then
+               echo 'You cannot have filenames longer than 14 characters.  Sigh.' >&4
+               val="$undef"
+       else
+               if (echo hi >$second) 2>/dev/null; then
+                       if $test -f /tmp/cf$$/123456789abcde; then
+                               $cat <<'EOM'
+That's peculiar... You can have filenames longer than 14 characters, but only
+on some of the filesystems.  Maybe you are using NFS.  Anyway, to avoid problems
+I shall consider your system cannot support long filenames at all.
+EOM
+                               val="$undef"
+                       else
+                               echo 'You can have filenames longer than 14 characters.' >&4
+                               val="$define"
+                       fi
+               else
+                       $cat <<'EOM'
+How confusing! Some of your filesystems are sane enough to allow filenames
+longer than 14 characters but some others like /tmp can't even think about them.
+So, for now on, I shall assume your kernel does not allow them at all.
+EOM
+                       val="$undef"
+               fi
+       fi
+else
+       $cat <<'EOM'
+You can't have filenames longer than 14 chars.  You can't even think about them!
+EOM
+       val="$undef"
+fi 
+set d_flexfnam
+eval $setvar
+$rm -rf /tmp/cf$$ 123456789abcde*
+
+: see if flock exists
+set flock d_flock
+eval $inlibc
+
+: see if gethostent exists
+set gethostent d_gethent
+eval $inlibc
+
+: see if getpgrp exists
+set getpgrp d_getpgrp
+eval $inlibc
+
+: see if getpgrp2 exists
+set getpgrp2 d_getpgrp2
+eval $inlibc
+
+: see if getpriority exists
+set getpriority d_getprior
+eval $inlibc
+
+: see if htonl --and friends-- exists
+set htonl d_htonl
+eval $inlibc
+
+: Look for isascii
+echo " "
+$cat >isascii.c <<'EOCP'
+#include <stdio.h>
+#include <ctype.h>
+main() {
+        int c = 'A';
+       if (isascii(c))
+           exit(0);
+       else
+           exit(1);
+}
+EOCP
+if $cc $cppflags -o isascii isascii.c >/dev/null 2>&1 ; then
+    echo "isascii() found."
+    val="$define"
+else
+    echo "isascii() NOT found."
+    val="$undef"
+fi
+set d_isascii
+eval $setvar
+$rm -f isascii*
+: see if killpg exists
+set killpg d_killpg
+eval $inlibc
+
+: see if link exists
+set link d_link
+eval $inlibc
+
+: see if lstat exists
+set lstat d_lstat
+eval $inlibc
+
+: see if memcmp exists
+set memcmp d_memcmp
+eval $inlibc
+
+: see if memcpy exists
+set memcpy d_memcpy
+eval $inlibc
+
+: see if memmove exists
+set memmove d_memmove
+eval $inlibc
+
+: see if memset exists
+set memset d_memset
+eval $inlibc
+
+: see if mkdir exists
+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 `./findhdr sys/msg.h`; then
+       echo "You have the full msg*(2) library." >&4
+       val="$define"
+else
+       echo "You don't have the full msg*(2) library." >&4
+       val="$undef"
+fi
+set d_msg
+eval $setvar
+
+socketlib=''
+sockethdr=''
+: see whether socket exists
+echo " "
+$echo $n "Hmm... $c" >&4
+if set socket val -f d_socket; eval $csym; $val; then
+       echo "Looks like you have Berkeley networking support." >&4
+       d_socket="$define"
+       if set setsockopt val -f; eval $csym; $val; then
+               d_oldsock="$undef"
+       else
+               echo "...but it uses the old 4.1c interface, rather than 4.2" >&4
+               d_oldsock="$define"
+       fi
+else
+       if $contains socklib libc.list >/dev/null 2>&1; then
+               echo "Looks like you have Berkeley networking support." >&4
+               d_socket="$define"
+               : we will have to assume that it supports the 4.2 BSD interface
+               d_oldsock="$undef"
+       else
+               echo "You don't have Berkeley networking in libc.a..." >&4
+               if test -f /usr/lib/libnet.a; then
+                       ( (nm $nm_opt /usr/lib/libnet.a | eval $nm_extract) ||  \
+                       ar t /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." >&4
+                               socketlib="-lnet"
+                               sockethdr="-I/usr/netinclude"
+                               d_socket="$define"
+                               if $contains setsockopt libc.list >/dev/null 2>&1; then
+                                       d_oldsock="$undef"
+                               else
+                                       echo "...using the old 4.1c interface, rather than 4.2" >&4
+                                       d_oldsock="$define"
+                               fi
+                       else
+                               echo "or even in libnet.a, which is peculiar." >&4
+                               d_socket="$undef"
+                               d_oldsock="$undef"
+                       fi
+               else
+                       echo "or anywhere else I see." >&4
+                       d_socket="$undef"
+                       d_oldsock="$undef"
+               fi
+       fi
+fi
+
+: see if socketpair exists
+set socketpair d_sockpair
+eval $inlibc
+
+: Locate the flags for 'open()'
+echo " "
+$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 `./findhdr sys/file.h` && \
+               $cc $cppflags "-DI_SYS_FILE" open3.c -o open3 >/dev/null 2>&1 ; then
+       h_sysfile=true;
+       echo "<sys/file.h> defines the O_* constants..." >&4
+       if ./open3; then
+               echo "and you have the 3 argument form of open()." >&4
+               val="$define"
+       else
+               echo "but not the 3 argument form of open().  Oh, well." >&4
+               val="$undef"
+       fi
+elif $test `./findhdr fcntl.h` && \
+               $cc "-DI_FCNTL" open3.c -o open3 >/dev/null 2>&1 ; then
+       h_fcntl=true;
+       echo "<fcntl.h> defines the O_* constants..." >&4
+       if ./open3; then
+               echo "and you have the 3 argument form of open()." >&4
+               val="$define"
+       else
+               echo "but not the 3 argument form of open().  Oh, well." >&4
+               val="$undef"
+       fi
+else
+       val="$undef"
+       echo "I can't find the O_* constant definitions!  You got problems." >&4
+fi
+set d_open3
+eval $setvar
+$rm -f open3*
+
+: see if this is a pwd system
+echo " "
+xxx=`./findhdr pwd.h`
+if $test "$xxx"; then
+       i_pwd="$define"
+       echo "<pwd.h> found." >&4
+       $cppstdin $cppflags < $xxx >$$.h
+       if $contains 'pw_quota' $$.h >/dev/null 2>&1; then
+               d_pwquota="$define"
+       else
+               d_pwquota="$undef"
+       fi
+       if $contains 'pw_age' $$.h >/dev/null 2>&1; then
+               d_pwage="$define"
+       else
+               d_pwage="$undef"
+       fi
+       if $contains 'pw_change' $$.h >/dev/null 2>&1; then
+               d_pwchange="$define"
+       else
+               d_pwchange="$undef"
+       fi
+       if $contains 'pw_class' $$.h >/dev/null 2>&1; then
+               d_pwclass="$define"
+       else
+               d_pwclass="$undef"
+       fi
+       if $contains 'pw_expire' $$.h >/dev/null 2>&1; then
+               d_pwexpire="$define"
+       else
+               d_pwexpire="$undef"
+       fi
+       if $contains 'pw_comment' $$.h >/dev/null 2>&1; then
+               d_pwcomment="$define"
+       else
+               d_pwcomment="$undef"
+       fi
+       $rm -f $$.h
+else
+       i_pwd="$undef"
+       d_pwquota="$undef"
+       d_pwage="$undef"
+       d_pwchange="$undef"
+       d_pwclass="$undef"
+       d_pwexpire="$undef"
+       d_pwcomment="$undef"
+       echo "<pwd.h> NOT found." >&4
+fi
+
+: see if readdir exists
+set readdir d_readdir
+eval $inlibc
+
+: see if rename exists
+set rename d_rename
+eval $inlibc
+
+: see if rmdir exists
+set rmdir d_rmdir
+eval $inlibc
+
+: can bcopy handle overlapping blocks?
+val="$undef"
+case "$d_bcopy" in
+"$define")
+       echo " "
+       echo "Checking to see if your bcopy() can do overlapping copies..." >&4
+       $cat >foo.c <<'EOCP'
+main()
+{
+char buf[128];
+register char *b;
+register int len;
+register int off;
+register int align;
+
+for (align = 7; align >= 0; align--) {
+       for (len = 36; len; len--) {
+               b = buf+align;
+               bcopy("abcdefghijklmnopqrstuvwxyz0123456789", b, len);
+               for (off = 1; off <= len; off++) {
+                       bcopy(b, b+off, len);
+                       bcopy(b+off, b, len);
+                       if (bcmp(b, "abcdefghijklmnopqrstuvwxyz0123456789", len))
+                               exit(1);
+               }
+       }
+}
+exit(0);
+}
+EOCP
+       if $cc foo.c -o safebcpy $ccflags $libs >/dev/null 2>&1 ; then
+               if ./safebcpy 2>/dev/null; then
+                       echo "Yes, it can."
+                       val="$define"
+               else
+                       echo "It can't, sorry."
+               fi
+       else
+               echo "(I can't compile the test program, so we'll assume not...)"
+       fi
+       ;;
+esac
+$rm -f foo.* safebcpy core
+set d_safebcpy
+eval $setvar
+
+: can memcpy handle overlapping blocks?
+val="$undef"
+case "$d_memcpy" in
+"$define")
+       echo " "
+       echo "Checking to see if your memcpy() can do overlapping copies..." >&4
+       $cat >foo.c <<'EOCP'
+main()
+{
+char buf[128];
+register char *b;
+register int len;
+register int off;
+register int align;
+
+for (align = 7; align >= 0; align--) {
+       for (len = 36; len; len--) {
+               b = buf+align;
+               memcpy("abcdefghijklmnopqrstuvwxyz0123456789", b, len);
+               for (off = 1; off <= len; off++) {
+                       memcpy(b, b+off, len);
+                       memcpy(b+off, b, len);
+                       if (memcmp(b, "abcdefghijklmnopqrstuvwxyz0123456789", len))
+                               exit(1);
+               }
+       }
+}
+exit(0);
+}
+EOCP
+       if $cc foo.c -o safemcpy $ccflags $libs >/dev/null 2>&1 ; then
+               if ./safemcpy 2>/dev/null; then
+                       echo "Yes, it can."
+                       val="$define"
+               else
+                       echo "It can't, sorry."
+               fi
+       else
+               echo "(I can't compile the test program, so we'll assume not...)"
+       fi
+       ;;
+esac
+$rm -f foo.* safemcpy core
+set d_safemcpy
+eval $setvar
+
+: see if select exists
+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 `./findhdr sys/sem.h`; then
+       echo "You have the full sem*(2) library." >&4
+       val="$define"
+else
+       echo "You don't have the full sem*(2) library." >&4
+       val="$undef"
+fi
+set d_sem
+eval $setvar
+
+: see if setegid exists
+set setegid d_setegid
+eval $inlibc
+
+: see if seteuid exists
+set seteuid d_seteuid
+eval $inlibc
+
+: see if setlocale exists
+set setlocale d_setlocale
+eval $inlibc
+: see if setpgid exists
+set setpgid d_setpgid
+eval $inlibc
+
+: see if setpgrp exists
+set setpgrp d_setpgrp
+eval $inlibc
+
+: see if setpgrp2 exists
+set setpgrp2 d_setpgrp2
+eval $inlibc
+
+: see if setpriority exists
+set setpriority d_setprior
+eval $inlibc
+
+: see if setregid exists
+set setregid d_setregid
+eval $inlibc
+set setresgid d_setresgid
+eval $inlibc
+
+: see if setreuid exists
+set setreuid d_setreuid
+eval $inlibc
+set setresuid d_setresuid
+eval $inlibc
+
+: see if setrgid exists
+set setrgid d_setrgid
+eval $inlibc
+
+: see if setruid exists
+set setruid d_setruid
+eval $inlibc
+
+: see if setsid exists
+set setsid d_setsid
+eval $inlibc
+
+: 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 " "
+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 `./findhdr sys/shm.h`; then
+       echo "You have the full shm*(2) library." >&4
+       val="$define"
+else
+       echo "You don't have the full shm*(2) library." >&4
+       val="$undef"
+fi
+set d_shm
+eval $setvar
+
+: see if stat knows about block sizes
+echo " "
+xxx=`./findhdr sys/stat.h`
+if $contains 'st_blocks;' "$xxx" >/dev/null 2>&1 ; then
+       if $contains 'st_blksize;' "$xxx" >/dev/null 2>&1 ; then
+               echo "Your stat() knows about block sizes." >&4
+               val="$define"
+       else
+               echo "Your stat() doesn't know about block sizes." >&4
+               val="$undef"
+       fi
+else
+       echo "Your stat() doesn't know about block sizes." >&4
+       val="$undef"
+fi
+set d_statblks
+eval $setvar
+
+: see if stdio is really std
+echo " "
+xxx=`./findhdr stdio.h`
+if $contains 'char.*_ptr;' "$xxx" >/dev/null 2>&1 ; then
+       if $contains '_cnt;' "$xxx" >/dev/null 2>&1 ; then
+               echo "Your stdio is pretty std." >&4
+               val="$define"
+       else
+               echo "Your stdio isn't very std." >&4
+               val="$undef"
+       fi
+else
+       echo "Your stdio isn't very std." >&4
+       val="$undef"
+fi
+set d_stdstdio
+eval $setvar
+
+: see which of string.h or strings.h is needed
+echo " "
+strings=`./findhdr string.h`
+if $test "$strings" && $test -r "$strings"; then
+       echo "Using <string.h> instead of <strings.h>." >&4
+       val="$define"
+else
+       val="$undef"
+       strings=`./findhdr strings.h`
+       if $test "$strings" && $test -r "$strings"; then
+               echo "Using <strings.h> instead of <string.h>." >&4
+       else
+               echo "No string header found -- You'll surely have problems." >&4
+       fi
+fi
+set i_string
+eval $setvar
+case "$i_string" in
+"$undef") strings=`./findhdr strings.h`;;
+*)       strings=`./findhdr string.h`;;
+esac
+
+: index or strchr
+echo " "
+if set index val -f; eval $csym; $val; then
+       if set strchr val -f d_strchr; eval $csym; $val; then
+               if $contains strchr "$strings" >/dev/null 2>&1 ; then
+                       val="$define"
+                       vali="$undef"
+                       echo "strchr() found." >&4
+               else
+                       val="$undef"
+                       vali="$define"
+                       echo "index() found." >&4
+               fi
+       else
+               val="$undef"
+               vali="$define"
+               echo "index() found." >&4
+       fi
+else
+       if set strchr val -f d_strchr; eval $csym; $val; then
+               val="$define"
+               vali="$undef"
+               echo "strchr() found." >&4
+       else
+               echo "No index() or strchr() found!" >&4
+               val="$undef"
+               vali="$undef"
+       fi
+fi
+set d_strchr; eval $setvar
+val="$vali"
+set d_index; eval $setvar
+
+: check for structure copying
+echo " "
+echo "Checking to see if your C compiler can copy structs..." >&4
+$cat >try.c <<'EOCP'
+main()
+{
+       struct blurfl {
+               int dyick;
+       } foo, bar;
+
+       foo = bar;
+}
+EOCP
+if $cc -c try.c >/dev/null 2>&1 ; then
+       val="$define"
+       echo "Yup, it can."
+else
+       val="$undef"
+       echo "Nope, it can't."
+fi
+set d_strctcpy
+eval $setvar
+$rm -f try.*
+
+: see if strerror and/or sys_errlist[] exist
+echo " "
+if set strerror val -f d_strerror; eval $csym; $val; then
+       echo 'strerror() found.' >&4
+       d_strerror="$define"
+       d_strerrm="$undef"
+       if set sys_errlist val -a d_syserrlst; eval $csym; $val; then   
+               echo "(You also have sys_errlist[], so we could roll our own strerror.)" 
+               d_syserrlst="$define"
+       else
+       echo "(Since you don't have sys_errlist[], sterror() is welcome.)"
+               d_syserrlst="$undef"
+       fi
+elif xxx=`./findhdr string.h`; test "$xxx" || xxx=`./findhdr strings.h`; \
+       $contains '#[   ]*define.*strerror' "$xxx" >/dev/null 2>&1; then
+       echo 'strerror() found in string header.' >&4
+       d_strerror="$define"
+       d_strerrm="$undef"
+       if set sys_errlist val -a d_syserrlst; eval $csym; $val; then   
+               echo "(Most probably, strerror() uses sys_errlist[] for descriptions.)"
+               d_syserrlst="$define"
+       else
+               echo "(You don't appear to have any sys_errlist[], how can this be?)"
+               d_syserrlst="$undef"
+       fi
+elif set sys_errlist val -a d_syserrlst; eval $csym; $val; then
+echo "strerror() not found, but you have sys_errlist[] so we'll use that." >&4
+       d_strerror="$undef"
+       d_syserrlst="$define"
+       d_strerrm="$define"
+else
+       echo 'strerror() and sys_errlist[] NOT found.' >&4
+       d_strerror="$undef"
+       d_syserrlst="$undef"
+       d_strerrm="$undef"
+fi
+
+: see if symlink exists
+set symlink d_symlink
+eval $inlibc
+
+: see if syscall exists
+set syscall d_syscall
+eval $inlibc
+
+: see if system exists
+set system d_system
+eval $inlibc
+
+: see if times exists
+echo " "
+if set times val -f d_times; eval $csym; $val; then
+       echo 'times() found.' >&4
+       d_times="$define"
+       case "$clocktype" in
+       '')
+               if $contains 'clock_t;' `./findhdr sys/types.h` >/dev/null 2>&1 ; then
+                       dflt='clock_t';
+               elif $contains 'clock_t;' `./findhdr sys/times.h` >/dev/null 2>&1; then
+                       dflt='clock_t';
+               else
+                       dflt='long';
+               fi
+               ;;
+       *)  dflt="$clocktype"
+               ;;
+       esac
+       echo " "
+       rp="What type is returned by times() on this sytem?"
+       . ./myread
+       clocktype="$ans"
+else
+       echo 'times() not found, hope that will do.' >&4
+       d_times="$undef"
+       clocktype='int'
+fi
+
+: see if truncate exists
+set truncate d_truncate
+eval $inlibc
+
+: see if we have to deal with yellow pages, now NIS.
+if $test -d /usr/etc/yp || $test -d /etc/yp; then
+       if $test -f /usr/etc/nibindd; then
+               echo " "
+               echo "I'm fairly confident you're on a NeXT."
+               echo " "
+               rp='Do you get the hosts file via NetInfo?'
+               dflt=y
+               case "$hostcat" in
+               nidump*) ;;
+               '') ;;
+               *) dflt=n;;
+               esac
+               . ./myread
+               case "$ans" in
+               y*) hostcat='nidump hosts .';;
+               *) hostcat='cat /etc/hosts';;
+               esac
+       fi
+       case "$hostcat" in
+       nidump*) ;;
+       *)
+               case "$hostcat" in
+               *ypcat*) dflt=y;;
+               '') if $contains '^\+' /etc/passwd >/dev/null 2>&1; then
+                               dflt=y
+                       else
+                               dflt=n
+                       fi;;
+               *) dflt=n;;
+               esac
+               echo " "
+               rp='Are you getting the hosts file via yellow pages?'
+               . ./myread
+               case "$ans" in
+               y*) hostcat='ypcat hosts';;
+               *) hostcat='cat /etc/hosts';;
+               esac
+               ;;
+       esac
+fi
+
+: now get the host name
+echo " "
+echo "Figuring out host name..." >&4
+case "$myhostname" in
+'') cont=true
+       echo 'Maybe "hostname" will work...'
+       if tans=`sh -c hostname 2>&1` ; then
+               myhostname=$tans
+               phostname=hostname
+               cont=''
+       fi
+       ;;
+*) cont='';;
+esac
+if $test "$cont"; then
+       if xenix; then
+               echo 'Oh, dear.  Maybe "/etc/systemid" is the key...'
+               if tans=`cat /etc/systemid 2>&1` ; then
+                       myhostname=$tans
+                       phostname='cat /etc/systemid'
+                       echo "Whadyaknow.  Xenix always was a bit strange..."
+                       cont=''
+               fi
+       elif $test -r /etc/systemid; then
+               echo "(What is a non-Xenix system doing with /etc/systemid?)"
+       fi
+fi
+if $test "$cont"; then
+       echo 'No, maybe "uuname -l" will work...'
+       if tans=`sh -c 'uuname -l' 2>&1` ; then
+               myhostname=$tans
+               phostname='uuname -l'
+       else
+               echo 'Strange.  Maybe "uname -n" will work...'
+               if tans=`sh -c 'uname -n' 2>&1` ; then
+                       myhostname=$tans
+                       phostname='uname -n'
+               else
+                       echo 'Oh well, maybe I can mine it out of whoami.h...'
+                       if tans=`sh -c $contains' sysname $usrinc/whoami.h' 2>&1` ; then
+                               myhostname=`echo "$tans" | $sed 's/^.*"\(.*\)"/\1/'`
+                               phostname="sed -n -e '"'/sysname/s/^.*\"\\(.*\\)\"/\1/{'"' -e p -e q -e '}' <$usrinc/whoami.h"
+                       else
+                               case "$myhostname" in
+                               '') echo "Does this machine have an identity crisis or something?"
+                                       phostname='';;
+                               *)
+                                       echo "Well, you said $myhostname before..."
+                                       phostname='echo $myhostname';;
+                               esac
+                       fi
+               fi
+       fi
+fi
+: you do not want to know about this
+set $myhostname
+myhostname=$1
+
+: translate upper to lower if necessary
+case "$myhostname" in
+*[A-Z]*)
+       myhostname=`echo $myhostname | tr '[A-Z]' '[a-z]'`
+       echo "(Normalizing case in your host name)"
+       ;;
+esac
+
+: verify guess
+if $test "$myhostname" ; then
+       dflt=y
+       rp='Your host name appears to be "'$myhostname'".'" Right?"
+       . ./myread
+       case "$ans" in
+       y*) ;;
+       *) myhostname='';;
+       esac
+fi
+
+: bad guess or no guess
+while $test "X$myhostname" = X ; do
+       dflt=''
+       rp="Please type the (one word) name of your host:"
+       . ./myread
+       myhostname="$ans"
+done
+
+: a little sanity check here
+case "$phostname" in
+'') ;;
+*)
+       case `$phostname` in
+       $myhostname$mydomain|$myhostname) ;;
+       *)
+               case "$phostname" in
+               sed*)
+                       echo "(That doesn't agree with your whoami.h file, by the way.)"
+                       ;;
+               *)
+                       echo "(That doesn't agree with your $phostname command, by the way.)"
+                       ;;
+               esac
+       ;;
+       esac
+       ;;
+esac
+
+: see how we will look up host name
+echo " "
+if false; then
+       : dummy stub to allow use of elif
+elif set uname val -f d_uname; eval $csym; $val; then
+       if xenix; then
+               $cat <<'EOM'
+uname() was found, but you're running xenix, and older versions of xenix
+have a broken uname(). If you don't really know whether your xenix is old
+enough to have a broken system call, use the default answer.
+
+EOM
+               dflt=y
+               case "$d_uname" in
+               "$define") dflt=n;;
+               esac
+               rp='Is your uname() broken?'
+               . ./myread
+               case "$ans" in
+               n*) d_uname="$define"; call=uname;;
+               esac
+       else
+               echo 'uname() found.' >&4
+               d_uname="$define"
+               call=uname
+       fi
+fi
+case "$d_gethname" in
+'') d_gethname="$undef";;
+esac
+case "$d_uname" in
+'') d_uname="$undef";;
+esac
+case "$d_phostname" in
+'') d_phostname="$undef";;
+esac
+
+: backward compatibility for d_hvfork
+if test X$d_hvfork != X; then
+       d_vfork="$d_hvfork"
+       d_hvfork=''
+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 " "
+xxx=`./findhdr signal.h`
+$test "$xxx" && $cppstdin $cppminus $cppflags < $xxx >$$.tmp 2>/dev/null
+if $contains 'int.*\*[         ]*signal' $$.tmp >/dev/null 2>&1 ; then
+       echo "You have int (*signal())() instead of void." >&4
+       val="$undef"
+       signal_t="int"
+elif $contains 'void.*\*[      ]*signal' $$.tmp >/dev/null 2>&1 ; then
+       echo "You have void (*signal())() instead of int." >&4
+       val="$define"
+       signal_t="void"
+elif $contains 'extern[        ]*[(\*]*signal' $$.tmp >/dev/null 2>&1 ; then
+       echo "You have int (*signal())() instead of void." >&4
+       val="$undef"
+       signal_t="int"
+else
+       case "$d_voidsig" in
+       '')
+       echo "I can't determine whether signal handler returns void or int..." >&4
+               dflt=void
+               rp="What type does your signal handler returns?"
+               . ./myread
+               case "$ans" in
+               void) val="$define"; signal_t="void";;
+               *) val="$undef"; signal_t="int";;
+               esac;;
+       *) echo "As you already told me, signal handler returns $signal_t." >&4;;
+       esac
+fi
+set d_voidsig
+eval $setvar
+$rm -f $$.tmp
+
+: check for volatile keyword
+echo " "
+echo 'Checking to see if your C compiler knows about "volatile"...' >&4
+$cat >try.c <<'EOCP'
+main()
+{
+       typedef struct _goo_struct goo_struct;
+       goo_struct * volatile goo = ((goo_struct *)0);
+       struct _goo_struct {
+               long long_int;
+               int reg_int;
+               char char_var;
+       };
+       typedef unsigned short foo_t;
+       char *volatile foo;
+       volatile int bar;
+       volatile foo_t blech;
+       foo = foo;
+}
+EOCP
+if $cc -c $ccflags try.c >/dev/null 2>&1 ; then
+       val="$define"
+       echo "Yup, it does."
+else
+       val="$undef"
+       echo "Nope, it doesn't."
+fi
+set d_volatile
+eval $setvar
+$rm -f try.*
+
+: see if there is a wait4
+set wait4 d_wait4
+eval $inlibc
+
+: see if waitpid exists
+set waitpid d_waitpid
+eval $inlibc
+
+: preserve RCS keywords in files with variable substitution, grrr
+Date='$Date'
+Id='$Id'
+Log='$Log'
+RCSfile='$RCSfile'
+Revision='$Revision'
+
+: check for alignment requirements
+echo " "
+case "$alignbytes" in
+'') echo "Checking alignment constraints..." >&4
+       $cat >try.c <<'EOCP'
+struct foobar {
+       char foo;
+       double bar;
+} try;
+main()
+{
+       printf("%d\n", (char *)&try.bar - (char *)&try.foo);
+}
+EOCP
+       if $cc $ccflags try.c -o try >/dev/null 2>&1; then
+               dflt=`./try`
+       else
+               dflt='8'
+               echo"(I can't seem to compile the test program...)"
+       fi
+       ;;
+*) dflt="$alignbytes"
+       ;;
+esac
+rp="Doubles must be aligned on a how-many-byte boundary?"
+. ./myread
+alignbytes="$ans"
+$rm -f try.c try
+
+: is AFS running?
+echo " "
+if test -d /afs; then
+       echo "AFS may be running... I'll be extra cautious then..." >&4
+       afs=true
+else
+       echo "AFS does not seem to be running..." >&4
+       afs=false
+fi
+
+: determine where public executables go
+echo " "
+case "$bin" in
+'')
+       dflt=`./loc . /bin /usr/local/bin /usr/lbin /usr/local /usr/bin`
+       ;;
+*)
+       dflt="$bin"
+       ;;
+esac
+fn=d~
+rp='Pathname where the public executables will reside?'
+. ./getfile
+bin="$ans"
+binexp="$ansexp"
+if $afs; then
+       $cat <<EOM
+
+Since you are running AFS, I need to 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).
+
+EOM
+       case "$installbin" in
+       '') dflt=`echo $binexp | sed 's#^/afs/#/afs/.#'`;;
+       *) dflt="$installbin";;
+       esac
+       fn=de~
+       rp='Where will public executables be installed?'
+       . ./getfile
+       installbin="$ans"
+else
+       installbin="$binexp"
+fi
+
+: check for ordering of bytes in a long
+case "$byteorder" in
+'')
+       $cat <<'EOM'
+  
+In the following, larger digits indicate more significance.  A big-endian
+machine like a Pyramid or a Motorola 680?0 chip will come out to 4321. A
+little-endian machine like a Vax or an Intel 80?86 chip would be 1234. Other
+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'
+#include <stdio.h>
+main()
+{
+       int i;
+       union {
+               unsigned long l;
+               char c[sizeof(long)];
+       } u;
+
+       if (sizeof(long) > 4)
+               u.l = (0x08070605L << 32) | 0x04030201L;
+       else
+               u.l = 0x04030201L;
+       for (i = 0; i < sizeof(long); i++)
+               printf("%c", u.c[i]+'0');
+       printf("\n");
+}
+EOCP
+       if $cc $ccflags try.c -o try >/dev/null 2>&1 ; then
+               dflt=`./try`
+               case "$dflt" in
+               ????|????????) echo "(The test program ran ok.)";;
+               *) echo "(The test program didn't run right for some reason.)";;
+               esac
+       else
+               dflt='4321'
+               cat <<'EOM'
+(I can't seem to compile the test program.  Guessing big-endian...)
+EOM
+       fi
+       ;;
+*)
+       echo " "
+       dflt="$byteorder"
+       ;;
+esac
+rp="What is the order of bytes in a long?"
+. ./myread
+byteorder="$ans"
+$rm -f try.c try
+
+: define an alternate in-header-list? function
+inhdr='echo " "; td=$define; tu=$undef; yyy=$@;
+cont=true; xxf="echo \"<\$1> found.\" >&4";
+case $# in 2) xxnf="echo \"<\$1> NOT found.\" >&4";;
+*) xxnf="echo \"<\$1> NOT found, ...\" >&4";;
+esac;
+case $# in 4) instead=instead;; *) instead="at last";; esac;
+while $test "$cont"; do
+       xxx=`./findhdr $1`
+       var=$2; eval "was=\$$2";
+       if $test "$xxx" && $test -r "$xxx";
+       then eval $xxf;
+               eval "case \"\$$var\" in $undef) . whoa; esac"; eval "$var=\$td";
+               cont="";
+       else eval $xxnf;
+               eval "case \"\$$var\" in $define) . whoa; esac"; eval "$var=\$tu"; fi;
+       set $yyy; shift; shift; yyy=$@;
+       case $# in 0) cont="";;
+       2) xxf="echo \"but I found <\$1> $instead.\" >&4";
+               xxnf="echo \"and I did not find <\$1> either.\" >&4";;
+       *) xxf="echo \"but I found <\$1\> instead.\" >&4";
+               xxnf="echo \"there is no <\$1>, ...\" >&4";;
+       esac;
+done;
+while $test "$yyy";
+do set $yyy; var=$2; eval "was=\$$2";
+       eval "case \"\$$var\" in $define) . whoa; esac"; eval "$var=\$tu";
+       set $yyy; shift; shift; yyy=$@;
+done'
+
+: see if dlfcn is available
+set dlfcn.h i_dlfcn
+eval $inhdr
+
+: determine which dynamic loading, if any, to compile in
+echo " "
+case "$usedl" in
+'')
+       case "$i_dlfcn" in
+       'define') dflt='y' ;;
+       *)        dflt='n' ;;
+       esac
+       ;;
+'define') dflt='y' ;;
+'y') dflt='y'
+     usedl='define' ;;
+*)  dflt='n' ;;
+esac
+rp="Do you wish to attempt to use dynamic loading?"
+. ./myread
+usedl="$ans"
+case "$ans" in
+y*) usedl='define'; dlsrc='dl.c'; dlobj='dl.o';;
+*) usedl='undef'; dlsrc=''; dlobj='';;
+esac
+echo " "
+case "$extensions" in
+' '|'') echo "Looking for extensions..."
+       case "$find" in
+               *find*) 
+               cd ..
+               dflt="`$find ext -type f -name \*.xs -print`"
+               cd UU
+               ;;
+       *)      dflt='ext/dbm/NDBM_File.xs ext/dbm/ODBM_File.xs ext/dbm/GDBM_File.xs ext/dbm/SDBM_File.xs ext/posix/POSIX.xs'
+               ;;
+       esac
+       ;;
+none)  dflt='' ;;
+*)     dflt="$extensions" ;;
+esac
+rp="What extensions do you wish to include?"
+. ./myread
+extensions="$ans"
+
+: see what type gids are declared as in the kernel
+case "$gidtype" in
+'')
+       if $contains 'gid_t;' `./findhdr sys/types.h` >/dev/null 2>&1 ; then
+               dflt='gid_t';
+       else
+               xxx=`./findhdr sys/user.h`
+               set `grep 'groups\[NGROUPS\];' "$xxx" 2>/dev/null` unsigned short
+               case $1 in
+               unsigned) dflt="$1 $2" ;;
+               *) dflt="$1" ;;
+               esac
+       fi
+       ;;
+*)  dflt="$gidtype";;
+esac
+echo " "
+rp="What is the type for group ids returned by getgid()?"
+. ./myread
+gidtype="$ans"
+: see if getgroups exists
+set getgroups d_getgrps
+eval $inlibc
+
+case "$d_getgrps" in
+'define')
+    case "$groupstype" in
+       '') dflt="$gidtype" ;;
+       *)  dflt="$groupstype" ;;
+    esac
+    echo " "
+    $cat <<EOM
+What is the type of the second argument to getgroups()?  Usually this
+is the same as group ids, "$gidtype", but not always.
+EOM
+    rp="What type is the second arguement to getgroups()?"
+    . ./myread
+    groupstype="$ans"
+    ;;
+*)  groupstype="$gidtype";;
+esac
+: determine where private executables go
+case "$privlib" in
+'')
+       dflt=/usr/lib/$package
+       $test -d /usr/local/lib && dflt=/usr/local/lib/$package
+       $test -d /local/lib && dflt=/local/lib/$package
+       ;;
+*)  dflt="$privlib"
+       ;;
+esac
+$cat <<EOM
+
+There are some auxiliary files for $package that need to be put into a
+private library directory that is accessible by everyone.
+
+EOM
+fn=d~+
+rp='Pathname where private library files will reside?'
+. ./getfile
+privlib="$ans"
+privlibexp="$ansexp"
+if $afs; then
+       $cat <<EOM
+
+Since you are running AFS, I need to distinguish the directory in which
+private files reside from the directory in which they are installed (and from
+which they are presumably copied to the former directory by occult means).
+
+EOM
+       case "$installprivlib" in
+       '') dflt=`echo $privlibexp | sed 's#^/afs/#/afs/.#'`;;
+       *) dflt="$installprivlib";;
+       esac
+       fn=de~
+       rp='Where will private files be installed?'
+       . ./getfile
+       installprivlib="$ans"
+else
+       installprivlib="$privlibexp"
+fi
+
+: determine where public libraries go
+case "$lib" in
+'') dflt=`./loc . "." /usr/local/lib /usr/lib /lib`;;
+*)  dflt="$lib";;
+esac
+echo " "
+fn=d~
+rp='Where do you want to put the public libraries?'
+. ./getfile
+lib="$ans"
+libexp="$ansexp"
+
+: determine which malloc to compile in
+:  Old versions had dflt='y' only for bsd or v7.
+echo " "
+case "$usemymalloc" in
+'')
+       if bsd || v7; then
+               dflt='y'
+       else
+               dflt='y'
+       fi
+       ;;
+*)  dflt="$usemymalloc"
+       ;;
+esac
+rp="Do you wish to attempt to use the malloc that comes with $package?"
+. ./myread
+usemymalloc="$ans"
+case "$ans" in
+y*) mallocsrc='malloc.c'; mallocobj='malloc.o';;
+*) mallocsrc=''; mallocobj='';;
+esac
+
+: compute the type returned by malloc
+echo " "
+case "$malloctype" in
+'')
+       if $test `./findhdr malloc.h`; then
+               echo "#include <malloc.h>" > malloc.c
+       fi
+#include <malloc.h>
+       $cat >>malloc.c <<'END'
+void *malloc();
+END
+       if $cc $ccflags -c malloc.c >/dev/null 2>&1; then
+               malloctype='void *'
+       else
+               malloctype='char *'
+       fi
+       $rm -f malloc.[co]
+       ;;
+esac
+echo "Your system wants malloc to return '$malloctype', it would seem." >&4
+
+: determine where manual pages go
+$cat <<EOM
+
+$package has manual pages available in source form.
+EOM
+case "$_nroff" in
+nroff)
+       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
+'')
+       lookpath='/usr/local/man/man1 /usr/local/man/man1 /usr/man/manl'
+       lookpath="$lookpath /usr/man/local/man1 /usr/man/l_man/man1"
+       lookpath="$lookpath /usr/local/man/u_man/man1 /usr/local/man/l_man/man1"
+       lookpath="$lookpath /usr/man/man.L"
+       mansrc=`./loc . $lookpath`
+       if $test -d "$mansrc"; then
+               dflt="$mansrc"
+       else
+               dflt="$sysman"
+       fi
+       ;;
+*)  dflt="$mansrc"
+       ;;
+esac
+echo " "
+fn=dn~
+rp='Where do the manual pages (source) go?'
+. ./getfile
+mansrc="$ans"
+mansrcexp="$ansexp"
+if $afs; then
+       $cat <<EOM
+
+Since you are running AFS, I need to distinguish the directory in which
+manual pages reside from the directory in which they are installed (and from
+which they are presumably copied to the former directory by occult means).
+
+EOM
+       case "$installmansrc" in
+       '') dflt=`echo $mansrcexp | sed 's#^/afs/#/afs/.#'`;;
+       *) dflt="$installmansrc";;
+       esac
+       fn=de~
+       rp='Where will man pages be installed?'
+       . ./getfile
+       installmansrc="$ans"
+else
+       installmansrc="$mansrcexp"
+fi
+
+
+case "$mansrc" in
+'') manext='0';;
+*l) manext=l;;
+*n) manext=n;;
+*o) manext=l;;
+*p) manext=n;;
+*C) manext=C;;
+*L) manext=L;;
+*L1) manext=L1;;
+*) manext=1;;
+esac
+
+: Cruising for prototypes
+echo " "
+echo "Checking out function prototypes..." >&4
+$cat >prototype.c <<'EOCP'
+main(int argc, char *argv[]) {
+       exit(0);}
+EOCP
+if $cc -c prototype.c >prototype.out 2>&1 ; then
+       echo "Your C compiler appears to support function prototypes."
+       val="$define"
+else
+       echo "Your C compiler doesn't seem to understand function prototypes."
+       val="$undef"
+fi
+set prototype
+eval $setvar
+$rm -f prototype*
+
+: check for size of random number generator
+echo " "
+case "$randbits" in
+'')
+       echo "Checking to see how many bits your rand function produces..." >&4
+       $cat >try.c <<'EOCP'
+#include <stdio.h>
+main()
+{
+       register int i;
+       register unsigned long tmp;
+       register unsigned long max = 0L;
+
+       for (i = 1000; i; i--) {
+               tmp = (unsigned long)rand();
+               if (tmp > max) max = tmp;
+       }
+       for (i = 0; max; i++)
+               max /= 2;
+       printf("%d\n",i);
+}
+EOCP
+       if $cc try.c -o try >/dev/null 2>&1 ; then
+               dflt=`try`
+       else
+               dflt='?'
+               echo "(I can't seem to compile the test program...)"
+       fi
+       ;;
+*)
+       dflt="$randbits"
+       ;;
+esac
+rp='How many bits does your rand() function produce?'
+. ./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
+       $test -d /usr/local/script && dflt=/usr/local/script
+       ;;
+*)  dflt="$scriptdir"
+       ;;
+esac
+$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
+fn=d~
+rp='Where do you keep publicly executable scripts?'
+. ./getfile
+scriptdir="$ans"
+scriptdirexp="$ansexp"
+if $afs; then
+       $cat <<EOM
+
+Since you are running AFS, I need to distinguish the directory in which
+scripts reside from the directory in which they are installed (and from
+which they are presumably copied to the former directory by occult means).
+
+EOM
+       case "$installscript" in
+       '') dflt=`echo $scriptdirexp | sed 's#^/afs/#/afs/.#'`;;
+       *) dflt="$installscript";;
+       esac
+       fn=de~
+       rp='Where will public scripts be installed?'
+       . ./getfile
+       installscript="$ans"
+else
+       installscript="$scriptdirexp"
+fi
+
+: generate list of signal names
+echo " "
+case "$sig_name" in
+'')
+       echo "Generating a list of signal names..." >&4
+       xxx=`./findhdr signal.h`" "`./findhdr sys/signal.h`
+       set X `cat $xxx 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) {
+               max = $3
+       }
+}
+
+END {
+       for (i = 1; i <= max; i++) {
+               if (sig[i] == "")
+                       printf "%d", i
+               else
+                       printf "%s", sig[i]
+               if (i < max)
+                       printf " "
+       }
+       printf "\n"
+}
+'`
+       shift
+       case $# in
+       0)
+               echo 'kill -l' >/tmp/foo$$
+               set X `csh -f </tmp/foo$$`
+               $rm -f /tmp/foo$$
+               shift
+               case $# in
+               0)set HUP INT QUIT ILL TRAP IOT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM
+               ;;
+               esac
+               ;;
+       esac
+       sig_name="ZERO $*"
+       ;;
+esac
+echo "The following signals are available:"
+echo $sig_name | tr ' ' '\012' | $sed 's/^/    SIG/'
+
+: see what type of char stdio uses.
+echo " "
+if $contains 'unsigned.*char.*_ptr;' `./findhdr stdio.h` >/dev/null 2>&1 ; then
+       echo "Your stdio uses unsigned chars." >&4
+       stdchar="unsigned char"
+else
+       echo "Your stdio uses signed chars." >&4
+       stdchar="char"
+fi
+
+: see what type uids are declared as in the kernel
+case "$uidtype" in
+'')
+       if $contains 'uid_t;' `./findhdr sys/types.h` >/dev/null 2>&1 ; then
+               dflt='uid_t';
+       else
+               xxx=`./findhdr sys/user.h`
+               set `grep '_ruid;' "$xxx" 2>/dev/null` unsigned short
+               case $1 in
+               unsigned) dflt="$1 $2" ;;
+               *) dflt="$1" ;;
+               esac
+       fi
+       ;;
+*)  dflt="$uidtype";;
+esac
+echo " "
+rp="What type are user ids on this system declared as?"
+. ./myread
+uidtype="$ans"
+
+: check for void type
+echo " "
+$cat >&4 <<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.
+    8: generic void pointers.
+
+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 & 8
+       void *hue;              /* generic ptr */
+#endif
+#if TRY & 2
+       void (*foo[10])();
+#endif
+
+#if TRY & 4
+       if(goo == moo) {
+               exit(0);
+       }
+#endif
+       exit(0);
+}
+EOCP
+       if $cc -c -DTRY=$defvoidused try.c >.out 2>&1 ; then
+               voidflags=$defvoidused
+       echo "It appears to support void to the level $package wants ($defvoidused)."
+               if $contains warning .out >/dev/null 2>&1; then
+                       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..." >&4
+               if $cc -c -DTRY=1 try.c >/dev/null 2>&1 ; then
+                       echo "It supports 1..."
+                       if $cc -c -DTRY=3 try.c >/dev/null 2>&1 ; then
+                               echo "It also supports 2..."
+                               if $cc -c -DTRY=7 try.c >/dev/null 2>&1 ; then
+                                       voidflags=7
+                                       echo "And it supports 4 but not 8 definitely."
+                               else
+                                       echo "It doesn't support 4..."
+                                       if $cc -c -DTRY=11 try.c >/dev/null 2>&1 ; then
+                                               voidflags=11
+                                               echo "But it supports 8."
+                                       else
+                                               voidflags=3
+                                               echo "Neither does it support 8."
+                                       fi
+                               fi
+                       else
+                               echo "It does not support 2..."
+                               if $cc -c -DTRY=13 try.c >/dev/null 2>&1 ; then
+                                       voidflags=13
+                                       echo "But it supports 4 and 8."
+                               else
+                                       if $cc -c -DTRY=5 try.c >/dev/null 2>&1 ; then
+                                               voidflags=5
+                                               echo "And it supports 4 but has not heard about 8."
+                                       else
+                                               echo "However it supports 8 but not 4."
+                                       fi
+                               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?"
+. ./myread
+voidflags="$ans"
+$rm -f try.* .out
+
+: determine compiler compiler
+case "$yacc" in
+'')
+       dflt=yacc;;
+*)
+       dflt="$yacc";;
+esac
+echo " "
+rp="yacc"
+if $test -f "$byacc"; then
+       dflt="$byacc"
+       rp="byacc or $rp"
+fi
+if $test -f "$bison"; then
+       rp="$rp or bison -y"
+fi
+$cat <<EOM
+$package no longer requires a compiler compiler, so the following is
+optional.
+EOM
+rp="Which compiler compiler ($rp) shall I use?"
+. ./myread
+yacc="$ans"
+case "$yacc" in
+*bis*)
+       case "$yacc" in
+       *-y*) ;;
+       *)
+               yacc="$yacc -y"
+               echo "(Adding -y option to bison to get yacc-compatible behaviour.)"
+               ;;
+       esac
+       ;;
+esac
+
+: see if we have the old dbm
+set dbm.h i_dbm
+eval $inhdr
+
+: see if this is a sys/file.h system
+val=''
+set sys/file.h val
+eval $inhdr
+
+: do we need to #include <sys/file.h> ?
+case "$val" in
+"$define")
+       echo " "
+       if $h_sysfile; then
+               val="$define"
+               echo "We'll be including <sys/file.h>." >&4
+       else
+               val="$undef"
+               echo "We won't be including <sys/file.h>." >&4
+       fi
+       ;;
+*)
+       h_sysfile=false
+       ;;
+esac
+set i_sysfile
+eval $setvar
+
+: see if fcntl.h is there
+val=''
+set fcntl.h val
+eval $inhdr
+
+: see if we can include fcntl.h
+case "$val" in
+"$define")
+       echo " "
+       if $h_fcntl; then
+               val="$define"
+               echo "We'll be including <fcntl.h>." >&4
+       else
+               val="$undef"
+               if $h_sysfile; then
+       echo "We don't need to include <fcntl.h> if we include <sys/file.h>." >&4
+               else
+                       echo "We won't be including <fcntl.h>." >&4
+               fi
+       fi
+       ;;
+*)
+       h_fcntl=false
+       val="$undef"
+       ;;
+esac
+set i_fcntl
+eval $setvar
+
+: see if gdbm.h is available
+set gdbm.h i_gdbm
+eval $inhdr
+
+: see if this is an grp system
+set grp.h i_grp
+eval $inhdr
+
+: see if ndbm.h is available
+set ndbm.h i_ndbm
+eval $inhdr
+
+: see if there are directory access routines out there
+echo " "
+if $test `./findhdr ndir.h` && \
+         ( $test -r /usr/lib/libndir.a || $test -r /usr/local/lib/libndir.a ); then
+       echo "Ndir library found." >&4
+       if $test -r /usr/lib/libndir.a; then
+               ndirlib='-lndir'
+       else
+               ndirlib="/usr/local/lib/libndir.a"
+       fi
+       i_ndir="$define"
+       d_usendir="$undef"
+       ndirc=''
+       ndiro=''
+else
+       ndirlib=''
+       i_ndir="$undef"
+       if set readdir val -f; eval $csym; $val; then
+       echo "No ndir library found, but you have readdir() so we'll use that." >&4
+               d_usendir="$undef"
+               ndirc=''
+               ndiro=''
+       else
+               echo "No ndir library found--using ./ndir.c." >&4
+               d_usendir="$define"
+               ndirc='ndir.c'
+               ndiro='ndir.o'
+       fi
+fi
+
+: see if this is a netinet/in.h or sys/in.h system
+set netinet/in.h i_niin sys/in.h i_sysin
+eval $inhdr
+
+: see if stdarg is available
+set stdarg.h i_stdarg
+eval $inhdr
+
+: see if stddef is available
+set stddef.h i_stddef
+eval $inhdr
+
+: see if this is an sysdir system
+set sys/dir.h i_sysdir
+eval $inhdr
+
+: get C preprocessor symbols handy
+echo " "
+echo $attrlist | $tr ' ' '\012' >Cppsym.know
+$cat <<EOSS >Cppsym
+$startsh
+case "\$1" in
+-l) list=true
+       shift
+       ;;
+esac
+unknown=''
+case "\$list\$#" in
+1|2)
+       for sym do
+               if $contains "^\$1$" Cppsym.true >/dev/null 2>&1; then
+                       exit 0
+               elif $contains "^\$1$" Cppsym.know >/dev/null 2>&1; then
+                       :
+               else
+                       unknown="\$unknown \$sym"
+               fi
+       done
+       set X \$unknown
+       shift
+       ;;
+esac
+case \$# in
+0) exit 1;;
+esac
+echo \$* | $tr ' ' '\012' | $sed -e 's/\(.*\)/\\
+#ifdef \1\\
+exit 0; _ _ _ _\1\\     \1\\
+#endif\\
+/' >Cppsym\$\$
+echo "exit 1; _ _ _" >>Cppsym\$\$
+$cppstdin $cppminus <Cppsym\$\$ | $grep '^exit [01]; _ _'  >Cppsym2\$\$
+case "\$list" in
+true) $awk 'NF > 5 {print substr(\$6,2,100)}' <Cppsym2\$\$ ;;
+*)
+       sh Cppsym2\$\$
+       status=\$?
+       ;;
+esac
+$rm -f Cppsym\$\$ Cppsym2\$\$
+exit \$status
+EOSS
+chmod +x Cppsym
+$eunicefix Cppsym
+echo "Your C preprocessor defines the following symbols:"
+Cppsym -l $attrlist >Cppsym.true
+$cat Cppsym.true
+
+: see if this is a termio system
+val="$undef"
+val2="$undef"
+val3="$undef"
+if $test `./findhdr termios.h`; then
+       set tcsetattr i_termios
+       eval $inlibc
+       val3="$i_termios"
+fi
+echo " "
+case "$val3" in
+"$define") echo "You have POSIX termios.h... good!" >&4;;
+*) if Cppsym pyr; then
+               case "`/bin/universe`" in
+               ucb) if $test `./findhdr sgtty.h`; then
+                               val2="$define"
+                               echo "<sgtty.h> found." >&4
+                       else
+                               echo "System is pyramid with BSD universe."
+                               echo "<sgtty.h> not found--you could have problems." >&4
+                       fi;;
+               *) if $test `./findhdr termio.h`; then
+                               val="$define"
+                               echo "<termio.h> found." >&4
+                       else
+                               echo "System is pyramid with USG universe."
+                               echo "<termio.h> not found--you could have problems." >&4
+                       fi;;
+               esac
+       elif usg; then
+               if $test `./findhdr termio.h`; then
+                       echo "<termio.h> found." >&4
+                       val="$define"
+               elif $test `./findhdr sgtty.h`; then
+                       echo "<sgtty.h> found." >&4
+                       val2="$define"
+               else
+echo "Neither <termio.h> nor <sgtty.h> found--you could have problems." >&4
+               fi
+       else
+               if $test `./findhdr sgtty.h`; then
+                       echo "<sgtty.h> found." >&4
+                       val2="$define"
+               elif $test `./findhdr termio.h`; then
+                       echo "<termio.h> found." >&4
+                       val="$define"
+               else
+echo "Neither <sgtty.h> nor <termio.h> found--you could have problems." >&4
+               fi
+       fi;;
+esac
+set i_termio; eval $setvar
+val=$val2; set i_sgtty; eval $setvar
+val=$val3; set i_termios; eval $setvar
+
+: see if ioctl defs are in sgtty/termio or sys/ioctl
+echo " "
+if $test `./findhdr sys/ioctl.h`; then
+       val="$define"
+       echo "<sys/ioctl.h> found." >&4
+else
+       val="$undef"
+       $test $i_termio = "$define" && xxx="termio.h"
+       $test $i_termios = "$define" && xxx="termios.h"
+       $test $i_sgtty = "$define" && xxx="sgtty.h"
+echo "No <sys/ioctl.h> found, assuming ioctl args are defined in <$xxx>." >&4
+fi
+set i_sysioctl
+eval $setvar
+
+: see if this is an sysndir system
+set sys/ndir.h i_sysndir
+eval $inhdr
+
+: see if sys/select.h has to be included
+set sys/select.h i_sysselct
+eval $inhdr
+
+: see if we should include time.h, sys/time.h, or both
+echo " "
+echo "Testing to see if we should include <time.h>, <sys/time.h> or both." >&4
+$echo $n "I'm now running the test program...$c"
+$cat >try.c <<'EOCP'
+#include <sys/types.h>
+#ifdef I_TIME
+#include <time.h>
+#endif
+#ifdef I_SYSTIME
+#ifdef SYSTIMEKERNEL
+#define KERNEL
+#endif
+#include <sys/time.h>
+#endif
+#ifdef I_SYSSELECT
+#include <sys/select.h>
+#endif
+main()
+{
+       struct tm foo;
+#ifdef S_TIMEVAL
+       struct timeval bar;
+#endif
+#ifdef S_TIMEZONE
+       struct timezone tzp;
+#endif
+       if (foo.tm_sec == foo.tm_sec)
+               exit(0);
+#ifdef S_TIMEVAL
+       if (bar.tv_sec == bar.tv_sec)
+               exit(0);
+#endif
+       exit(1);
+}
+EOCP
+flags=''
+s_timezone=''
+sysselect=''
+for s_timeval in '-DS_TIMEVAL' ''; do
+for i_systimek in '' '-DSYSTIMEKERNEL'; do
+for i_time in '' '-DI_TIME'; do
+for i_systime in '-DI_SYSTIME' ''; do
+       case "$flags" in
+       '') $echo $n ".$c"
+               if $cc $ccflags \
+               $i_time $i_systime $i_systimek $sysselect $s_timeval $s_timezone \
+               try.c -o try >/dev/null 2>&1 ; then
+                       set X $i_time $i_systime $i_systimek $sysselect $s_timeval
+                       shift
+                       flags="$*"
+                       echo " "
+                       $echo $n "Succeeded with $flags$c"
+               fi
+               ;;
+       esac
+done
+done
+done
+done
+timeincl=''
+echo " "
+case "$flags" in
+*SYSTIMEKERNEL*) i_systimek="$define"
+       timeincl=`./findhdr sys/time.h`
+       echo "We'll include <sys/time.h> with KERNEL defined." >&4;;
+*) i_systimek="$undef";;
+esac
+case "$flags" in
+*I_TIME*) i_time="$define"
+       timeincl=`./findhdr time.h`" $timeincl"
+       echo "We'll include <time.h>." >&4;;
+*) i_time="$undef";;
+esac
+case "$flags" in
+*I_SYSTIME*) i_systime="$define"
+       timeincl=`./findhdr sys/time.h`" $timeincl"
+       echo "We'll include <sys/time.h>." >&4;;
+*) i_systime="$undef";;
+esac
+$rm -f try.c try
+
+: see if this is an utime system
+set utime.h i_utime
+eval $inhdr
+
+: see if this is a varargs system
+echo " "
+if $test `./findhdr varargs.h`; then
+       val="$define"
+       echo "<varargs.h> found." >&4
+else
+       val="$undef"
+       echo "<varargs.h> NOT found, but that's ok (I hope)." >&4
+fi
+set i_varargs
+eval $setvar
+
+: set up the varargs testing programs
+$cat > varargs.c <<EOP
+#ifdef I_STDARG
+#include <stdarg.h>
+#endif
+#ifdef I_VARARGS
+#include <varargs.h>
+#endif
+
+#ifdef I_STDARG
+int f(char *p, ...)
+#else
+int f(va_alist)
+va_dcl
+#endif
+{
+       va_list ap;
+#ifndef I_STDARG
+       char *p;
+#endif
+#ifdef I_STDARG
+       va_start(ap,p);
+#else
+       va_start(ap);
+       p = va_arg(ap, char *);
+#endif
+       va_end(ap);
+}
+EOP
+$cat > varargs <<EOP
+if $cc -c $ccflags -D\$1 varargs.c >/dev/null 2>&1; then
+       echo "true"
+else
+       echo "false"
+fi
+$rm -f varargs.o
+EOP
+chmod +x varargs
+
+: now check which varargs header should be included
+echo " "
+i_varhdr=''
+case "$i_stdarg" in
+"$define")
+       if `./varargs I_STDARG`; then
+               i_varhdr='stdarg.h'
+               i_varargs="$undef"
+       elif `./varargs I_VARARGS`; then
+               i_varhdr='varargs.h'
+               i_stdarg="$undef"
+       fi
+       ;;
+*)
+       if `./varargs I_VARARGS`; then
+               i_varhdr='varargs.h'
+       fi
+       ;;
+esac
+case "$i_varhdr" in
+'')
+echo "I could not find the definition for va_dcl... You have problems..." >&4
+       ;;
+*) echo "We'll include <$i_varhdr> to get va_dcl definition." >&4;;
+esac
+$rm -f varargs*
+
+: see if this is a vfork system
+set vfork.h i_vfork
+eval $inhdr
+
+: end of configuration questions
+echo " "
+echo "End of configuration questions."
+echo " "
+
+: back to where it started
+if test -d ../UU; then
+       cd ..
+fi
+
+: configuration may be patched via a 'config.over' file
+if $test -f config.over; then
+       echo " "
+       dflt=y
+       rp='I see a config.over file.  Do you wish to load it?'
+       . UU/myread
+       case "$ans" in
+       n*) echo "OK, I'll ignore it.";;
+       *)      . ./config.over
+               echo "Configuration override changes have been loaded."
+               ;;
+       esac
+fi
+
+: create config.sh file
+echo " "
+echo "Creating config.sh..." >&4
+$spitshell <<EOT >config.sh
+$startsh
+#
+# This file was produced by running the Configure script. It holds all the
+# definitions figured out by Configure. Should you modify one of these values,
+# do not forget to propagate your changes by running "Configure -der". You may
+# instead choose to run each of the .SH files by yourself, or "Configure -S".
+#
+
+# Configuration time: $cf_time
+# Configured by: $cf_by
+# Target system: $myuname
+
+extensions='$extensions'
+d_bsd='$d_bsd'
+d_eunice='$d_eunice'
+d_xenix='$d_xenix'
+eunicefix='$eunicefix'
+Mcc='$Mcc'
+awk='$awk'
+bash='$bash'
+bison='$bison'
+byacc='$byacc'
+cat='$cat'
+chgrp='$chgrp'
+chmod='$chmod'
+chown='$chown'
+compress='$compress'
+cp='$cp'
+cpio='$cpio'
+cpp='$cpp'
+csh='$csh'
+date='$date'
+echo='$echo'
+egrep='$egrep'
+emacs='$emacs'
+expr='$expr'
+find='$find'
+flex='$flex'
+gcc='$gcc'
+grep='$grep'
+inews='$inews'
+ksh='$ksh'
+less='$less'
+line='$line'
+lint='$lint'
+ln='$ln'
+lp='$lp'
+lpr='$lpr'
+ls='$ls'
+mail='$mail'
+mailx='$mailx'
+make='$make'
+mkdir='$mkdir'
+more='$more'
+mv='$mv'
+nroff='$nroff'
+perl='$perl'
+pg='$pg'
+pmake='$pmake'
+pr='$pr'
+rm='$rm'
+rmail='$rmail'
+sed='$sed'
+sendmail='$sendmail'
+sh='$sh'
+shar='$shar'
+sleep='$sleep'
+smail='$smail'
+sort='$sort'
+submit='$submit'
+tail='$tail'
+tar='$tar'
+tbl='$tbl'
+test='$test'
+touch='$touch'
+tr='$tr'
+troff='$troff'
+uname='$uname'
+uniq='$uniq'
+uuname='$uuname'
+vi='$vi'
+zcat='$zcat'
+hint='$hint'
+myuname='$myuname'
+Author='$Author'
+Date='$Date'
+Header='$Header'
+Id='$Id'
+Locker='$Locker'
+Log='$Log'
+RCSfile='$RCSfile'
+Revision='$Revision'
+Source='$Source'
+State='$State'
+afs='$afs'
+alignbytes='$alignbytes'
+bin='$bin'
+binexp='$binexp'
+installbin='$installbin'
+byteorder='$byteorder'
+cc='$cc'
+gccversion='$gccversion'
+ccflags='$ccflags'
+cppflags='$cppflags'
+ldflags='$ldflags'
+lkflags='$lkflags'
+optimize='$optimize'
+cf_by='$cf_by'
+cf_time='$cf_time'
+contains='$contains'
+cpplast='$cpplast'
+cppminus='$cppminus'
+cpprun='$cpprun'
+cppstdin='$cppstdin'
+d_access='$d_access'
+d_bcmp='$d_bcmp'
+d_bcopy='$d_bcopy'
+d_bzero='$d_bzero'
+d_casti32='$d_casti32'
+castflags='$castflags'
+d_castneg='$d_castneg'
+d_charsprf='$d_charsprf'
+d_chsize='$d_chsize'
+d_const='$d_const'
+cryptlib='$cryptlib'
+d_crypt='$d_crypt'
+d_csh='$d_csh'
+d_dosuid='$d_dosuid'
+d_dup2='$d_dup2'
+d_fchmod='$d_fchmod'
+d_fchown='$d_fchown'
+d_fcntl='$d_fcntl'
+d_flexfnam='$d_flexfnam'
+d_flock='$d_flock'
+d_getgrps='$d_getgrps'
+d_gethent='$d_gethent'
+aphostname='$aphostname'
+d_gethname='$d_gethname'
+d_phostname='$d_phostname'
+d_uname='$d_uname'
+d_getpgrp2='$d_getpgrp2'
+d_getpgrp='$d_getpgrp'
+d_getprior='$d_getprior'
+d_htonl='$d_htonl'
+d_isascii='$d_isascii'
+d_killpg='$d_killpg'
+d_link='$d_link'
+d_lstat='$d_lstat'
+d_memcmp='$d_memcmp'
+d_memcpy='$d_memcpy'
+d_memmove='$d_memmove'
+d_memset='$d_memset'
+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_open3='$d_open3'
+d_portable='$d_portable'
+d_readdir='$d_readdir'
+d_rename='$d_rename'
+d_rmdir='$d_rmdir'
+d_safebcpy='$d_safebcpy'
+d_safemcpy='$d_safemcpy'
+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_setlocale='$d_setlocale'
+d_setpgid='$d_setpgid'
+d_setpgrp2='$d_setpgrp2'
+d_bsdpgrp='$d_bsdpgrp'
+d_setpgrp='$d_setpgrp'
+d_setprior='$d_setprior'
+d_setregid='$d_setregid'
+d_setresgid='$d_setresgid'
+d_setresuid='$d_setresuid'
+d_setreuid='$d_setreuid'
+d_setrgid='$d_setrgid'
+d_setruid='$d_setruid'
+d_setsid='$d_setsid'
+d_shm='$d_shm'
+d_shmat='$d_shmat'
+d_shmctl='$d_shmctl'
+d_shmdt='$d_shmdt'
+d_shmget='$d_shmget'
+d_oldsock='$d_oldsock'
+d_socket='$d_socket'
+d_sockpair='$d_sockpair'
+sockethdr='$sockethdr'
+socketlib='$socketlib'
+d_statblks='$d_statblks'
+d_stdstdio='$d_stdstdio'
+d_index='$d_index'
+d_strchr='$d_strchr'
+d_strctcpy='$d_strctcpy'
+d_strerrm='$d_strerrm'
+d_strerror='$d_strerror'
+d_sysernlst='$d_sysernlst'
+d_syserrlst='$d_syserrlst'
+d_symlink='$d_symlink'
+d_syscall='$d_syscall'
+d_system='$d_system'
+clocktype='$clocktype'
+d_times='$d_times'
+d_truncate='$d_truncate'
+d_usendir='$d_usendir'
+i_ndir='$i_ndir'
+ndirc='$ndirc'
+ndirlib='$ndirlib'
+ndiro='$ndiro'
+d_vfork='$d_vfork'
+d_voidsig='$d_voidsig'
+signal_t='$signal_t'
+d_volatile='$d_volatile'
+d_charvspr='$d_charvspr'
+d_vprintf='$d_vprintf'
+d_wait4='$d_wait4'
+d_waitpid='$d_waitpid'
+dlobj='$dlobj'
+dlsrc='$dlsrc'
+usedl='$usedl'
+gidtype='$gidtype'
+groupstype='$groupstype'
+h_fcntl='$h_fcntl'
+h_sysfile='$h_sysfile'
+i_dbm='$i_dbm'
+d_dirnamlen='$d_dirnamlen'
+i_dirent='$i_dirent'
+i_dlfcn='$i_dlfcn'
+i_fcntl='$i_fcntl'
+i_gdbm='$i_gdbm'
+i_grp='$i_grp'
+i_ndbm='$i_ndbm'
+i_niin='$i_niin'
+i_sysin='$i_sysin'
+d_pwage='$d_pwage'
+d_pwchange='$d_pwchange'
+d_pwclass='$d_pwclass'
+d_pwcomment='$d_pwcomment'
+d_pwexpire='$d_pwexpire'
+d_pwquota='$d_pwquota'
+i_pwd='$i_pwd'
+i_stdarg='$i_stdarg'
+i_stddef='$i_stddef'
+i_string='$i_string'
+strings='$strings'
+i_sysdir='$i_sysdir'
+i_sysfile='$i_sysfile'
+d_voidtty='$d_voidtty'
+i_bsdioctl='$i_bsdioctl'
+i_sysioctl='$i_sysioctl'
+i_syssockio='$i_syssockio'
+i_sysndir='$i_sysndir'
+i_sysselct='$i_sysselct'
+i_sgtty='$i_sgtty'
+i_termio='$i_termio'
+i_termios='$i_termios'
+i_systime='$i_systime'
+i_systimek='$i_systimek'
+i_time='$i_time'
+timeincl='$timeincl'
+i_utime='$i_utime'
+i_varargs='$i_varargs'
+i_varhdr='$i_varhdr'
+i_vfork='$i_vfork'
+intsize='$intsize'
+lib='$lib'
+libexp='$libexp'
+libc='$libc'
+libpth='$libpth'
+plibpth='$plibpth'
+xlibpth='$xlibpth'
+libs='$libs'
+mallocobj='$mallocobj'
+mallocsrc='$mallocsrc'
+malloctype='$malloctype'
+usemymalloc='$usemymalloc'
+installmansrc='$installmansrc'
+manext='$manext'
+mansrc='$mansrc'
+mansrcexp='$mansrcexp'
+huge='$huge'
+large='$large'
+medium='$medium'
+models='$models'
+small='$small'
+split='$split'
+mydomain='$mydomain'
+myhostname='$myhostname'
+phostname='$phostname'
+c='$c'
+n='$n'
+groupcat='$groupcat'
+hostcat='$hostcat'
+passcat='$passcat'
+package='$package'
+spackage='$spackage'
+installprivlib='$installprivlib'
+privlib='$privlib'
+privlibexp='$privlibexp'
+prototype='$prototype'
+randbits='$randbits'
+installscript='$installscript'
+scriptdir='$scriptdir'
+scriptdirexp='$scriptdirexp'
+sig_name='$sig_name'
+sharpbang='$sharpbang'
+shsharp='$shsharp'
+spitshell='$spitshell'
+startsh='$startsh'
+stdchar='$stdchar'
+sysman='$sysman'
+uidtype='$uidtype'
+nm_opt='$nm_opt'
+runnm='$runnm'
+usenm='$usenm'
+incpath='$incpath'
+mips='$mips'
+mips_type='$mips_type'
+usrinc='$usrinc'
+defvoidused='$defvoidused'
+voidflags='$voidflags'
+yacc='$yacc'
+yaccflags='$yaccflags'
+EOT
+
+: add special variables
+$test -f patchlevel.h && \
+awk '/^#define/ {printf "%s=%s\n",$2,$3}' patchlevel.h >>config.sh
+echo "CONFIG=true" >>config.sh
+
+: propagate old symbols
+if $test -f UU/config.sh; then
+       <UU/config.sh sort | uniq >UU/oldconfig.sh
+       sed -n 's/^\([a-zA-Z_0-9]*\)=.*/\1/p' config.sh config.sh UU/oldconfig.sh |\
+       sort | uniq -u >UU/oldsyms
+       set X `cat UU/oldsyms`
+       shift
+       case $# in
+       0) ;;
+       *)
+               cat <<EOM
+Hmm...You had some extra variables I don't know about...I'll try to keep 'em...
+EOM
+               echo "# Variables propagated from previous config.sh file." >>config.sh
+               for sym in `cat UU/oldsyms`; do
+                       echo "    Propagating $hint variable "'$'"$sym..."
+                       eval 'tmp="$'"${sym}"'"'
+                       echo "$tmp" | \
+                               sed -e "s/'/'\"'\"'/g" -e "s/^/$sym='/" -e "s/$/'/" >>config.sh
+               done
+               ;;
+       esac
+fi
+
+: Finish up by extracting the .SH files
+case "$alldone" in
+exit)
+       $rm -rf UU
+       echo "Done."
+       exit 0
+       ;;
+cont)
+       ;;
+'')
+       echo " "
+       dflt=''
+       nostick=true
+echo "If you didn't make any mistakes, then just type a carriage return here."
+       rp="If you need to edit config.sh, do it as a shell escape here:"
+       . UU/myread
+       nostick=''
+       case "$ans" in
+       '') ;;
+       *) : in case they cannot read
+               sh 1>&4 -c "$ans";;
+       esac
+       ;;
+esac
+
+: if this fails, just run all the .SH files by hand
+. ./config.sh
+
+echo " "
+exec 1>&4
+. ./UU/extract
+
+if $contains '^depend:' [Mm]akefile >/dev/null 2>&1; then
+       dflt=y
+       case "$silent" in
+       true) ;;
+       *)
+               $cat <<EOM
+
+Now you need to generate make dependencies by running "make depend".
+You might prefer to run it in background: "make depend > makedepend.out &"
+It can take a while, so you might not want to run it right now.
+
+EOM
+               ;;
+       esac
+       rp="Run make depend now?"
+       . UU/myread
+       case "$ans" in
+       y*)
+               make depend && echo "Now you must run a make."
+               ;;
+       *)
+               echo "You must run 'make depend' then 'make'."
+               ;;
+       esac
+elif test -f [Mm]akefile; then
+       echo " "
+       echo "Now you must run a make."
+else
+       echo "Done."
+fi
+
+$rm -f kit*isdone ark*isdone
+$rm -rf UU
+: End of Configure
diff --git a/HelpWanted b/HelpWanted
new file mode 100644 (file)
index 0000000..d4dcca9
--- /dev/null
@@ -0,0 +1,13 @@
+Anything in Todo that strikes your fancy and I agree to the design of
+
+Configure support
+    Dynamic loading
+    libperl.so
+    Drop-in module directories
+
+Test suite enhancement
+    POSIX
+
+Extension interface
+    Documentation
+    xvarpp
index d0efb2e..39ad1e4 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -1,19 +1,18 @@
 Artistic               The "Artistic License"
-Configure              Run this first
 Copying                        The GNU General Public License
 EXTERN.h               Included before foreign .h files
 INTERN.h               Included before domestic .h files
+Makefile.SH            A script that generates Makefile
 MANIFEST               This list of files
-Makefile.SH            Precursor to Makefile
-PACKINGLIST            Which files came from which kits
+NDBM_File.c
+ODBM_File.c
+POSIX.c
 README                 The Instructions
 README.ncr             Special instructions for NCR
 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
-array.h                        Public declarations for the above
+SDBM_File.c
+XSUB.h
 atarist/FILES
 atarist/README.ST
 atarist/RESULTS
@@ -45,19 +44,23 @@ atarist/usub/acurses.mus
 atarist/usub/makefile.st
 atarist/usub/usersub.c
 atarist/wildmat.c
+av.c
+av.h
+bar.pm
 c2ph.SH                        program to translate dbx stabs to perl
 c2ph.doc               documentation for c2ph
 cflags.SH              A script that emits C compilation flags per file
 client                 A client to test sockets
-cmd.c                  Command interpreter
-cmd.h                  Public declarations for the above
 config.H               Sample config.h
-config_h.SH            Produces config.h
 config_c++.h           TEMP FILE
-cons.c                 Routines to construct cmd nodes of a parse tree
-consarg.c              Routines to construct arg nodes of a parse tree
+config_h.SH            Produces config.h
+cop.h
+cv.h
+deb.c
+dl.c
+dlperl/dlperl.c
+dlperl/usersub.c
 doSH                   Script to run all the *.SH files
-doarg.c                        Scalar expression evaluation
 doio.c                 I/O operations
 doop.c                 Support code for various operations
 dosish.h
@@ -96,6 +99,7 @@ eg/sysvipc/ipcmsg     Example of SYS V IPC message queues
 eg/sysvipc/ipcsem      Example of Sys V IPC semaphores
 eg/sysvipc/ipcshm      Example of Sys V IPC shared memory
 eg/travesty            A program to print travesties of its input text
+eg/unuc.pats
 eg/van/empty           A program to empty the trashcan
 eg/van/unvanish                A program to undo what vanish does
 eg/van/vanexp          A program to expire vanished files
@@ -106,11 +110,35 @@ emacs/perldb.el           Emacs debugging
 emacs/perldb.pl                Emacs debugging
 emacs/tedstuff         Some optional patches
 embed_h.SH
-eval.c                 The expression evaluator
-form.c                 Format processing
+ext/dbm/GDBM_File.c
+ext/dbm/NDBM_File.c
+ext/dbm/ODBM_File.c
+ext/dbm/SDBM_File.c
+ext/dbm/sdbm/.pure
+ext/dbm/sdbm/README.too
+ext/dbm/sdbm/dba.c
+ext/dbm/sdbm/dbd.c
+ext/dbm/sdbm/dbe.c
+ext/dbm/sdbm/dbm.c
+ext/dbm/sdbm/dbm.h
+ext/dbm/sdbm/dbu.c
+ext/dbm/sdbm/hash.c
+ext/dbm/sdbm/linux.patches
+ext/dbm/sdbm/pair.c
+ext/dbm/sdbm/pair.h
+ext/dbm/sdbm/readme.ps
+ext/dbm/sdbm/sdbm.c
+ext/dbm/sdbm/sdbm.h
+ext/dbm/sdbm/tune.h
+ext/dbm/sdbm/util.c
+ext/dl/dl.c
+ext/dl/eg/main.c
+ext/dl/eg/test.c
+ext/dl/eg/test1.c
 form.h                 Public declarations for the above
 gettest                        A little script to test the get* routines
-global.var
+gv.c
+gv.h
 h2ph.SH                        A thing to turn C .h file into perl .ph files
 h2pl/README            How to turn .ph files into .pl files
 h2pl/cbreak.pl         cbreak routines using .ph
@@ -125,8 +153,6 @@ h2pl/mkvars         Program to make .pl from .ph files
 h2pl/tcbreak           cbreak test routine using .ph
 h2pl/tcbreak2          cbreak test routine using .pl
 handy.h                        Handy definitions
-hash.c                 Associative arrays
-hash.h                 Public declarations for the above
 hints/3b1.sh
 hints/3b1cc
 hints/3b2.sh
@@ -181,10 +207,21 @@ hints/unisysdynix.sh
 hints/utekv.sh
 hints/uts.sh
 hints/vax.sh
+hv.c
+hv.h
+hvdbm.h
 installperl            Perl script to do "make install" dirty work
-interp.var
 ioctl.pl               Sample ioctl.pl
 keywords.h
+lib/AutoLoader.pm
+lib/Config.pm
+lib/English.pm
+lib/Exporter.pm
+lib/FOOBAR.pm
+lib/FileHandle.pm
+lib/Hostname.pm
+lib/POSIX.pm
+lib/SDBM_File.pm
 lib/abbrev.pl          An abbreviation table builder
 lib/assert.pl          assertion and panic with stack trace
 lib/bigfloat.pl                An arbitrary precision floating point package
@@ -194,24 +231,31 @@ lib/cacheout.pl           Manages output filehandles when you need too many
 lib/chat2.pl           Randal's famous expect-ish routines
 lib/complete.pl                A command completion subroutine
 lib/ctime.pl           A ctime workalike
+lib/dotsh.pl.art
 lib/dumpvar.pl         A variable dumper
 lib/exceptions.pl      catch and throw routines
 lib/fastcwd.pl         a faster but more dangerous getcwd
 lib/find.pl            A find emulator--used by find2perl
 lib/finddepth.pl       A depth-first find emulator--used by find2perl
 lib/flush.pl           Routines to do single flush
+lib/ftp.pl
 lib/getcwd.pl          a getcwd() emulator
 lib/getopt.pl          Perl library supporting option parsing
 lib/getopts.pl         Perl library supporting option parsing
+lib/hostname.pl
 lib/importenv.pl       Perl routine to get environment into variables
 lib/look.pl            A "look" equivalent
 lib/newgetopt.pl       A perl library supporting long option parsing
 lib/open2.pl
+lib/open3.pl
 lib/perldb.pl          Perl debugging routines
 lib/pwd.pl             Routines to keep track of PWD environment variable
+lib/quotewords.pl.art
 lib/shellwords.pl      Perl library to split into words with shell quoting
+lib/soundex.pl.art
 lib/stat.pl            Perl library supporting stat function
 lib/syslog.pl          Perl library supporting syslogging
+lib/tainted.pl
 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
@@ -220,6 +264,8 @@ makedepend.SH               Precursor to makedepend
 makedir.SH             Precursor to makedir
 makefile.lib           make libperl.a
 malloc.c               A version of malloc you might not want
+mg.c
+mg.h
 msdos/Changes.dds      Expanation of MS-DOS patches by Diomidis Spinellis
 msdos/Makefile         MS-DOS makefile
 msdos/README.msdos     Compiling and usage information
@@ -235,6 +281,8 @@ 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
+opcode.h
+opcode.pl
 os2/Makefile           Makefile for OS/2
 os2/README.OS2         Notes for OS/2
 os2/a2p.cs             Compiler script for a2p
@@ -271,21 +319,27 @@ perl.c                    main()
 perl.h                 Global declarations
 perl.man               The manual page(s)
 perlsh                 A poor man's perl shell
+perly.c
+perly.c.byacc
+perly.c.diff
+perly.c.yacc
 perly.fixer            A program to remove yacc stack limitations
+perly.h
+perly.h.yacc
 perly.y                        Yacc grammar for perl
-pp.h                   Push/Pop code defs
+perly.y.save
 pp.c                   Push/Pop code
+pp.h                   Push/Pop code defs
 proto.h
 regcomp.c              Regular expression compiler
 regcomp.h              Private declarations for above
 regexec.c              Regular expression evaluator
 regexp.h               Public declarations for the above
+scope.c
+scope.h
 server                 A server to test sockets
-spat.h                 Search pattern declarations
-stab.c                 Symbol table stuff
-stab.h                 Public declarations for the above
-str.c                  String handling package
-str.h                  Public declarations for the above
+sv.c
+sv.h
 t/README               Instructions for regression tests
 t/TEST                 The regression tester
 t/base/cond.t          See if conditionals work
@@ -313,13 +367,14 @@ 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/lib/bigint.t
+t/lib/english.t
+t/lib/sdbm.t
 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
@@ -338,6 +393,7 @@ 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/my.t
 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
@@ -347,32 +403,27 @@ t/op/range.t              See if .. works
 t/op/re_tests          Input file for op.regexp
 t/op/read.t            See if read() works
 t/op/readdir.t         See if readdir() works
+t/op/ref.t
 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/subst.t
 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
+taint.c
+test.pl
 toke.c                 The tokener
 unixish.h
 usersub.c              User supplied (possibly proprietary) subroutines
-usub/Makefile          Makefile for curseperl
-usub/README            Instructions for user supplied subroutines
-usub/bsdcurses.mus     what used to be curses.mus
-usub/curses.mus                Glue routines for BSD curses
-usub/man2mus           A manual page to .mus translator
-usub/mus               A .mus to .c translator
-usub/pager             A sample pager in curseperl
-usub/usersub.c         An initialization file to call curses glue routines
 util.c                 Utility routines
 util.h                 Public declarations for the above
 x2p/EXTERN.h           Same as above
@@ -387,6 +438,7 @@ 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
+x2p/malloc.c
 x2p/s2p.SH             Sed to perl translator
 x2p/s2p.man            Manual page for sed to perl translator
 x2p/str.c              String handling package
@@ -394,3 +446,4 @@ x2p/str.h           Public declarations for the above
 x2p/util.c             Utility routines
 x2p/util.h             Public declarations for the above
 x2p/walk.c             Parse tree walker
+Configure                    Portability tool
diff --git a/MANIFEST.new b/MANIFEST.new
new file mode 100644 (file)
index 0000000..1b3394e
--- /dev/null
@@ -0,0 +1,449 @@
+Artistic               The "Artistic License"
+Copying                        The GNU General Public License
+EXTERN.h               Included before foreign .h files
+INTERN.h               Included before domestic .h files
+Makefile.SH            A script that generates Makefile
+MANIFEST               This list of files
+NDBM_File.c
+ODBM_File.c
+POSIX.c
+README                 The Instructions
+README.ncr             Special instructions for NCR
+README.uport           Special instructions for Microports
+README.xenix           Special instructions for Xenix
+SDBM_File.c
+XSUB.h
+atarist/FILES
+atarist/README.ST
+atarist/RESULTS
+atarist/atarist.c
+atarist/config.h
+atarist/echo.c
+atarist/explain
+atarist/makefile.sm
+atarist/makefile.st
+atarist/osbind.pl
+atarist/perldb.diff
+atarist/perlglob.c
+atarist/test/binhandl
+atarist/test/ccon
+atarist/test/dbm
+atarist/test/err
+atarist/test/gdbm
+atarist/test/gdbm.t
+atarist/test/glob
+atarist/test/osexample.pl
+atarist/test/pi.pl
+atarist/test/printenv
+atarist/test/readme
+atarist/test/sig
+atarist/test/tbinmode
+atarist/usersub.c
+atarist/usub/README.ATARI
+atarist/usub/acurses.mus
+atarist/usub/makefile.st
+atarist/usub/usersub.c
+atarist/wildmat.c
+av.c
+av.h
+bar.pm
+c2ph.SH                        program to translate dbx stabs to perl
+c2ph.doc               documentation for c2ph
+cflags.SH              A script that emits C compilation flags per file
+client                 A client to test sockets
+config.H               Sample config.h
+config_c++.h           TEMP FILE
+cop.h
+cv.h
+deb.c
+dl.c
+dlperl/dlperl.c
+dlperl/usersub.c
+doSH                   Script to run all the *.SH files
+doio.c                 I/O operations
+doop.c                 Support code for various operations
+dosish.h
+dump.c                 Debugging output
+eg/ADB                 An adb wrapper to put in your crash dir
+eg/README              Intro to example perl scripts
+eg/changes             A program to list recently changed files
+eg/down                        A program to do things to subdirectories
+eg/dus                 A program to do du -s on non-mounted dirs
+eg/findcp              A find wrapper that implements a -cp switch
+eg/findtar             A find wrapper that pumps out a tar file
+eg/g/gcp               A program to do a global rcp
+eg/g/gcp.man           Manual page for gcp
+eg/g/ged               A program to do a global edit
+eg/g/ghosts            A sample /etc/ghosts file
+eg/g/gsh               A program to do a global rsh
+eg/g/gsh.man           Manual page for gsh
+eg/muck                        A program to find missing make dependencies
+eg/muck.man            Manual page for muck
+eg/myrup               A program to find lightly loaded machines
+eg/nih                 Script to insert #! workaround
+eg/relink              A program to change symbolic links
+eg/rename              A program to rename files
+eg/rmfrom              A program to feed doomed filenames to
+eg/scan/scan_df                Scan for filesystem anomalies
+eg/scan/scan_last      Scan for login anomalies
+eg/scan/scan_messages  Scan for console message anomalies
+eg/scan/scan_passwd    Scan for passwd file anomalies
+eg/scan/scan_ps                Scan for process anomalies
+eg/scan/scan_sudo      Scan for sudo anomalies
+eg/scan/scan_suid      Scan for setuid anomalies
+eg/scan/scanner                An anomaly reporter
+eg/shmkill             A program to remove unused shared memory
+eg/sysvipc/README      Intro to Sys V IPC examples
+eg/sysvipc/ipcmsg      Example of SYS V IPC message queues
+eg/sysvipc/ipcsem      Example of Sys V IPC semaphores
+eg/sysvipc/ipcshm      Example of Sys V IPC shared memory
+eg/travesty            A program to print travesties of its input text
+eg/unuc.pats
+eg/van/empty           A program to empty the trashcan
+eg/van/unvanish                A program to undo what vanish does
+eg/van/vanexp          A program to expire vanished files
+eg/van/vanish          A program to put files in a trashcan
+eg/who                 A sample who program
+emacs/perl-mode.el     Emacs major mode for perl
+emacs/perldb.el                Emacs debugging
+emacs/perldb.pl                Emacs debugging
+emacs/tedstuff         Some optional patches
+embed_h.SH
+ext/dbm/GDBM_File.c
+ext/dbm/NDBM_File.c
+ext/dbm/ODBM_File.c
+ext/dbm/SDBM_File.c
+ext/dbm/sdbm/.pure
+ext/dbm/sdbm/README.too
+ext/dbm/sdbm/dba.c
+ext/dbm/sdbm/dbd.c
+ext/dbm/sdbm/dbe.c
+ext/dbm/sdbm/dbm.c
+ext/dbm/sdbm/dbm.h
+ext/dbm/sdbm/dbu.c
+ext/dbm/sdbm/hash.c
+ext/dbm/sdbm/linux.patches
+ext/dbm/sdbm/pair.c
+ext/dbm/sdbm/pair.h
+ext/dbm/sdbm/readme.ps
+ext/dbm/sdbm/sdbm.c
+ext/dbm/sdbm/sdbm.h
+ext/dbm/sdbm/tune.h
+ext/dbm/sdbm/util.c
+ext/dl/dl.c
+ext/dl/eg/main.c
+ext/dl/eg/test.c
+ext/dl/eg/test1.c
+form.h                 Public declarations for the above
+gettest                        A little script to test the get* routines
+gv.c
+gv.h
+h2ph.SH                        A thing to turn C .h file into perl .ph files
+h2pl/README            How to turn .ph files into .pl files
+h2pl/cbreak.pl         cbreak routines using .ph
+h2pl/cbreak2.pl                cbreak routines using .pl
+h2pl/eg/sizeof.ph      Sample sizeof array initialization
+h2pl/eg/sys/errno.pl   Sample translated errno.pl
+h2pl/eg/sys/ioctl.pl   Sample translated ioctl.pl
+h2pl/eg/sysexits.pl    Sample translated sysexits.pl
+h2pl/getioctlsizes     Program to extract types from ioctl.h
+h2pl/mksizes           Program to make %sizeof array.
+h2pl/mkvars            Program to make .pl from .ph files
+h2pl/tcbreak           cbreak test routine using .ph
+h2pl/tcbreak2          cbreak test routine using .pl
+handy.h                        Handy definitions
+hints/3b1.sh
+hints/3b1cc
+hints/3b2.sh
+hints/aix_rs.sh
+hints/aix_rt.sh
+hints/altos486.sh      
+hints/apollo_C6_7.sh
+hints/apollo_C6_8.sh   
+hints/aux.sh
+hints/cray.sh
+hints/dgux.sh
+hints/dnix.sh
+hints/dynix.sh
+hints/fps.sh
+hints/genix.sh
+hints/greenhills.sh    
+hints/hp9000_300.sh
+hints/hp9000_400.sh
+hints/hp9000_700.sh
+hints/hp9000_800.sh    
+hints/hpux.sh
+hints/i386.sh
+hints/isc_3_2_2.sh
+hints/isc_3_2_3.sh
+hints/mc6000.sh
+hints/mips.sh
+hints/mpc.sh   
+hints/ncr_tower.sh
+hints/next.sh
+hints/opus.sh  
+hints/osf1.sh
+hints/sco_2_3_0.sh
+hints/sco_2_3_1.sh
+hints/sco_2_3_2.sh
+hints/sco_2_3_3.sh
+hints/sco_2_3_4.sh
+hints/sco_3.sh
+hints/sgi.sh
+hints/solaris_2_0.sh
+hints/stellar.sh       
+hints/sunos_3_4.sh
+hints/sunos_3_5.sh
+hints/sunos_4_0_1.sh
+hints/sunos_4_0_2.sh
+hints/svr4.sh
+hints/ti1500.sh        
+hints/titan.sh
+hints/ultrix_1.sh
+hints/ultrix_3.sh
+hints/ultrix_4.sh
+hints/unisysdynix.sh
+hints/utekv.sh
+hints/uts.sh
+hints/vax.sh
+hv.c
+hv.h
+hvdbm.h
+installperl            Perl script to do "make install" dirty work
+ioctl.pl               Sample ioctl.pl
+keywords.h
+lib/AutoLoader.pm
+lib/Config.pm
+lib/English.pm
+lib/Exporter.pm
+lib/FOOBAR.pm
+lib/FileHandle.pm
+lib/Hostname.pm
+lib/POSIX.pm
+lib/SDBM_File.pm
+lib/abbrev.pl          An abbreviation table builder
+lib/assert.pl          assertion and panic with stack trace
+lib/bigfloat.pl                An arbitrary precision floating point package
+lib/bigint.pl          An arbitrary precision integer arithmetic package
+lib/bigrat.pl          An arbitrary precision rational arithmetic package
+lib/cacheout.pl                Manages output filehandles when you need too many
+lib/chat2.pl           Randal's famous expect-ish routines
+lib/complete.pl                A command completion subroutine
+lib/ctime.pl           A ctime workalike
+lib/dotsh.pl.art
+lib/dumpvar.pl         A variable dumper
+lib/exceptions.pl      catch and throw routines
+lib/fastcwd.pl         a faster but more dangerous getcwd
+lib/find.pl            A find emulator--used by find2perl
+lib/finddepth.pl       A depth-first find emulator--used by find2perl
+lib/flush.pl           Routines to do single flush
+lib/ftp.pl
+lib/getcwd.pl          a getcwd() emulator
+lib/getopt.pl          Perl library supporting option parsing
+lib/getopts.pl         Perl library supporting option parsing
+lib/hostname.pl
+lib/importenv.pl       Perl routine to get environment into variables
+lib/look.pl            A "look" equivalent
+lib/newgetopt.pl       A perl library supporting long option parsing
+lib/open2.pl
+lib/open3.pl
+lib/perldb.pl          Perl debugging routines
+lib/pwd.pl             Routines to keep track of PWD environment variable
+lib/quotewords.pl.art
+lib/shellwords.pl      Perl library to split into words with shell quoting
+lib/soundex.pl.art
+lib/stat.pl            Perl library supporting stat function
+lib/syslog.pl          Perl library supporting syslogging
+lib/tainted.pl
+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
+main.c
+makedepend.SH          Precursor to makedepend
+makedir.SH             Precursor to makedir
+makefile.lib           make libperl.a
+malloc.c               A version of malloc you might not want
+mg.c
+mg.h
+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/chdir.c          A chdir that can change drives
+msdos/config.h         Definitions for msdos
+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
+msdos/eg/drives.bat    List the system drives and their characteristics
+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
+opcode.h
+opcode.pl
+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/crypt.c
+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
+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
+os2/tests.dif
+patchlevel.h           The current patch level of perl
+perl.c                 main()
+perl.h                 Global declarations
+perl.man               The manual page(s)
+perlsh                 A poor man's perl shell
+perly.c
+perly.c.byacc
+perly.c.diff
+perly.c.yacc
+perly.fixer            A program to remove yacc stack limitations
+perly.h
+perly.h.yacc
+perly.y                        Yacc grammar for perl
+perly.y.save
+pp.c                   Push/Pop code
+pp.h                   Push/Pop code defs
+proto.h
+regcomp.c              Regular expression compiler
+regcomp.h              Private declarations for above
+regexec.c              Regular expression evaluator
+regexp.h               Public declarations for the above
+scope.c
+scope.h
+server                 A server to test sockets
+sv.c
+sv.h
+t/README               Instructions for regression tests
+t/TEST                 The regression tester
+t/base/cond.t          See if conditionals work
+t/base/if.t            See if if works
+t/base/lex.t           See if lexical items work
+t/base/pat.t           See if pattern matching works
+t/base/term.t          See if various terms work
+t/cmd/elsif.t          See if else-if works
+t/cmd/for.t            See if for loops work
+t/cmd/mod.t            See if statement modifiers work
+t/cmd/subval.t         See if subroutine values work
+t/cmd/switch.t         See if switch optimizations work
+t/cmd/while.t          See if while loops work
+t/comp/cmdopt.t                See if command optimization works
+t/comp/cpp.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/bigint.t
+t/lib/english.t
+t/lib/sdbm.t
+t/op/append.t          See if . works
+t/op/array.t           See if array operations work
+t/op/auto.t            See if autoincrement et all work
+t/op/chop.t            See if chop works
+t/op/cond.t            See if conditional expressions work
+t/op/delete.t          See if delete works
+t/op/do.t              See if subroutines work
+t/op/each.t            See if associative iterators work
+t/op/eval.t            See if eval operator works
+t/op/exec.t            See if exec and system work
+t/op/exp.t             See if math functions work
+t/op/flip.t            See if range operator works
+t/op/fork.t            See if fork works
+t/op/glob.t            See if <*> works
+t/op/goto.t            See if goto works
+t/op/groups.t          See if $( works
+t/op/index.t           See if index works
+t/op/int.t             See if int works
+t/op/join.t            See if join works
+t/op/list.t            See if array lists work
+t/op/local.t           See if local works
+t/op/magic.t           See if magic variables work
+t/op/mkdir.t           See if mkdir works
+t/op/my.t
+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/re_tests          Input file for op.regexp
+t/op/read.t            See if read() works
+t/op/readdir.t         See if readdir() works
+t/op/ref.t
+t/op/regexp.t          See if regular expressions work
+t/op/repeat.t          See if x operator works
+t/op/sleep.t           See if sleep works
+t/op/sort.t            See if sort works
+t/op/split.t           See if split works
+t/op/sprintf.t         See if sprintf works
+t/op/stat.t            See if stat works
+t/op/study.t           See if study works
+t/op/subst.t
+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
+taint.c
+test.pl
+toke.c                 The tokener
+unixish.h
+usersub.c              User supplied (possibly proprietary) subroutines
+util.c                 Utility routines
+util.h                 Public declarations for the above
+x2p/EXTERN.h           Same as above
+x2p/INTERN.h           Same as above
+x2p/Makefile.SH                Precursor to Makefile
+x2p/a2p.h              Global declarations
+x2p/a2p.man            Manual page for awk to perl translator
+x2p/a2p.y              A yacc grammer for awk
+x2p/a2py.c             Awk compiler, sort of
+x2p/cflags.SH          A script that emits C compilation flags per file
+x2p/find2perl.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
+x2p/malloc.c
+x2p/s2p.SH             Sed to perl translator
+x2p/s2p.man            Manual page for sed to perl translator
+x2p/str.c              String handling package
+x2p/str.h              Public declarations for the above
+x2p/util.c             Utility routines
+x2p/util.h             Public declarations for the above
+x2p/walk.c             Parse tree walker
+Configure                    Portability tool
+config_h.SH                  Produces config.h
index 867f56d..0babdb1 100644 (file)
--- a/Makefile
+++ b/Makefile
 # 
 # 
 
+# I now supply perly.c with the kits, so don't remake perly.c without byacc
+BYACC = byacc
 CC = cc
-YACC = /bin/yacc
 bin = /usr/local/bin
 scriptdir = /usr/local/bin
 privlib = /usr/local/lib/perl
-mansrc = /usr/man/manl
-manext = l
+mansrc = /usr/local/man/man1
+manext = 1
 LDFLAGS = 
 CLDFLAGS = 
 SMALL = 
 LARGE =  
 mallocsrc = malloc.c
 mallocobj = malloc.o
+dlsrc = dl.c
+dlobj = dl.o
 SLN = ln -s
 RMS = rm -f
 
-libs = -ldbm -lm -lposix 
+libs = -ldbm -ldl -lm -lposix 
 
-public = perl
+public = perl 
 
 shellflags = 
 
 # To use an alternate make, set  in config.sh.
 MAKE = make
 
-
 CCCMD = `sh $(shellflags) cflags $@`
 
 private = 
@@ -67,31 +69,29 @@ sh = Makefile.SH makedepend.SH h2ph.SH
 h1 = EXTERN.h INTERN.h av.h cop.h config.h embed.h form.h handy.h
 h2 = hv.h op.h opcode.h perl.h regcomp.h regexp.h gv.h sv.h util.h
 
-h = $(h1) $(h2)
+h1 = EXTERN.h INTERN.h XSUB.h av.h config.h cop.h cv.h dosish.h 
+h2 = embed.h form.h gv.h handy.h hv.h hvdbm.h keywords.h mg.h op.h
+h3 = opcode.h patchlevel.h perl.h perly.h pp.h proto.h regcomp.h
+h4 = regexp.h scope.h sv.h unixish.h util.h
+h = $(h1) $(h2) $(h3) $(h4)
 
-c1 = av.c cop.c cons.c consop.c doop.c doio.c dolist.c
-c2 = eval.c hv.c main.c $(mallocsrc) perl.c pp.c regcomp.c regexec.c
-c3 = gv.c sv.c toke.c util.c usersub.c
+c1 = av.c scope.c op.c doop.c doio.c dump.c hv.c
+c2 = $(mallocsrc) mg.c perly.c pp.c regcomp.c regexec.c
+c3 = gv.c sv.c taint.c toke.c util.c deb.c run.c
 
 c = $(c1) $(c2) $(c3)
 
-s1 = av.c cop.c cons.c consop.c doop.c doio.c dolist.c
-s2 = eval.c hv.c main.c perl.c pp.c regcomp.c regexec.c
-s3 = gv.c sv.c toke.c util.c usersub.c perly.c
+s1 = av.c scope.c op.c doop.c doio.c dump.c hv.c
+s2 = $(mallocobj) mg.c perly.c pp.c regcomp.c regexec.c
+s3 = gv.c sv.c taint.c toke.c util.c deb.c run.c perly.c
 
 saber = $(s1) $(s2) $(s3)
 
-obj1 = av.o scope.o op.o doop.o doio.o dolist.o dump.o
-obj2 = $(mallocobj) mg.o pp.o regcomp.o regexec.o
-obj3 = gv.o sv.o toke.o util.o deb.o run.o
-
-obj = $(obj1) $(obj2) $(obj3)
-
-tobj1 = tav.o tcop.o tcons.o tconsop.o tdoop.o tdoio.o tdolist.o tdump.o
-tobj2 = teval.o thv.o $(mallocobj) tpp.o tregcomp.o tregexec.o
-tobj3 = tgv.o tsv.o ttoke.o tutil.o
+obj1 = av.o scope.o op.o doop.o doio.o dump.o hv.o
+obj2 = $(mallocobj) mg.o perly.o pp.o regcomp.o regexec.o
+obj3 = gv.o sv.o taint.o toke.o util.o deb.o run.o
 
-tobj = $(tobj1) $(tobj2) $(tobj3)
+obj = $(obj1) $(obj2) $(obj3) $(dlobj)
 
 lintflags = -hbvxac
 
@@ -100,215 +100,129 @@ addedbyconf = Makefile.old bsd eunice filexp loc pdp11 usg v7
 # grrr
 SHELL = /bin/sh
 
+.SUFFIXES: .x
+
 .c.o:
        $(CCCMD) $*.c
 
+.x.c:
+       sh writemain $*.x >$*.c
 
-all: perl
+all: miniperl perl lib/Config.pm
 
-#all: $(public) $(private) $(util) uperl.o $(scripts)
+#all: $(public) $(private) $(util) $(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.
-# The $& notation is tells Sequent machines that it can do a parallel make,
+# NDBM_File extension
+NDBM_File.c:   ext/dbm/NDBM_File.xs ext/xsubpp ext/typemap
+       test -f miniperl || make miniperl
+       ext/xsubpp ext/dbm/NDBM_File.xs >tmp
+       mv tmp NDBM_File.c
+
+NDBM_File.o: NDBM_File.c
+
+# ODBM_File extension
+ODBM_File.c:   ext/dbm/ODBM_File.xs ext/xsubpp ext/typemap
+       test -f miniperl || make miniperl
+       ext/xsubpp ext/dbm/ODBM_File.xs >tmp
+       mv tmp ODBM_File.c
+
+ODBM_File.o: ODBM_File.c
+
+# GDBM_File extension
+GDBM_File.c:   ext/dbm/GDBM_File.xs ext/xsubpp ext/typemap
+       test -f miniperl || make miniperl
+       ext/xsubpp ext/dbm/GDBM_File.xs >tmp
+       mv tmp GDBM_File.c
+
+GDBM_File.o: GDBM_File.c
+
+# SDBM_File extension
+SDBM_File.c:   ext/dbm/SDBM_File.xs ext/xsubpp ext/typemap
+       test -f miniperl || make miniperl
+       ext/xsubpp ext/dbm/SDBM_File.xs >tmp
+       mv tmp SDBM_File.c
+
+SDBM_File.o: SDBM_File.c
+
+lib/auto/SDBM_File/SDBM_File.so: SDBM_File.o ext/dbm/sdbm/libsdbm.a
+       @- mkdir lib/auto/SDBM_File 2>/dev/null
+       ld -o lib/auto/SDBM_File/SDBM_File.so SDBM_File.o ext/dbm/sdbm/libsdbm.a
+
+ext/dbm/sdbm/libsdbm.a: ext/dbm/sdbm/sdbm.c ext/dbm/sdbm/sdbm.h
+       cd ext/dbm/sdbm; $(MAKE) sdbm
+
+# POSIX extension
+POSIX.c:       ext/posix/POSIX.xs ext/xsubpp ext/typemap
+       test -f miniperl || make miniperl
+       ext/xsubpp ext/posix/POSIX.xs >tmp
+       mv tmp POSIX.c
+
+POSIX.o: POSIX.c
+lib/auto/POSIX/POSIX.so: POSIX.o ext/dbm/sdbm/libsdbm.a
+       @- mkdir lib/auto/POSIX 2>/dev/null
+       ld -o lib/auto/POSIX/POSIX.so POSIX.o ext/dbm/sdbm/libsdbm.a
+extobjs=  ext/dbm/NDBM_File.xs.o ext/dbm/ODBM_File.xs.o ext/dbm/GDBM_File.xs.o ext/dbm/SDBM_File.xs.o ext/posix/POSIX.xs.o
+# The $& notation tells Sequent machines that it can do a parallel make,
 # and is harmless otherwise.
 
-perl: $& main.o perly.o perl.o $(obj) hv.o usersub.o
-       $(CC) -Bstatic $(LARGE) $(CLDFLAGS) main.o perly.o perl.o $(obj) hv.o usersub.o $(libs) -o perl
-       echo "\a"
+miniperlmain.c: miniperlmain.x
+miniperlmain.o: miniperlmain.c
+miniperl: $& miniperlmain.o perl.o $(obj)
+       $(CC) $(LARGE) $(CLDFLAGS) -o miniperl miniperlmain.o perl.o $(obj) $(libs)
+
+perlmain.c: perlmain.x
+perlmain.o: perlmain.c
+perl: $& perlmain.o perl.o $(obj) NDBM_File.o ODBM_File.o POSIX.o
+       $(CC) $(LARGE) $(CLDFLAGS) -o perl perlmain.o perl.o $(obj) NDBM_File.o ODBM_File.o POSIX.o $(libs)
 
 libperl.rlb: libperl.a
        ranlib libperl.a
        touch libperl.rlb
 
-libperl.a: $& perly.o perl.o $(obj) hv.o usersub.o
-       ar rcuv libperl.a $(obj) hv.o perly.o usersub.o
+libperl.a: $& perl.o $(obj)
+       ar rcuv libperl.a $(obj)
 
 # 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: $& sperl.o tmain.o libtperl.rlb
-       $(CC) $(LARGE) $(CLDFLAGS) sperl.o tmain.o libtperl.a $(libs) -o suidperl
-
-# This version interprets scripts that are already set-id either via a wrapper
-# or through the kernel allowing set-id scripts (bad idea).  Taintperl must
-# NOT be setuid to root or anything else.  The only difference between it
-# and normal perl is the presence of the "taint" checks.
-
-taintperl: $& tmain.o libtperl.rlb
-       $(CC) $(LARGE) $(CLDFLAGS) tmain.o libtperl.a $(libs) -o taintperl
-
-libtperl.rlb: libtperl.a
-       ranlib libtperl.a
-       touch libtperl.rlb
-
-libtperl.a: $& tperly.o tperl.o $(tobj) thv.o usersub.o
-       ar rcuv libtperl.a $(tobj) thv.o tperly.o usersub.o tperl.o
+suidperl: $& sperl.o main.o libperl.rlb
+       $(CC) $(LARGE) $(CLDFLAGS) sperl.o main.o libperl.a $(libs) -o suidperl
 
-# This command assumes that /usr/include/dbz.h and /usr/lib/dbz.o exist.
-
-dbzperl: $& main.o zhv.o libperl.rlb
-       $(CC) $(LARGE) $(CLDFLAGS) main.o zhv.o /usr/lib/dbz.o libperl.a $(libs) -o dbzperl
-
-zhv.o: hv.c $(h)
-       $(RMS) zhv.c
-       $(SLN) hv.c zhv.c
-       $(CCCMD) -DWANT_DBZ zhv.c
-       $(RMS) zhv.c
-
-uperl.o: $& $(obj) main.o hv.o perly.o
-       -ld $(LARGE) $(LDFLAGS) -r $(obj) main.o hv.o perly.o -o uperl.o
+lib/Config.pm: config.sh
+       ./configpm
 
 saber: $(saber)
        # load $(saber)
        # load /lib/libm.a
 
-# Replicating all this junk is yucky, but I don't see a portable way to fix it.
-
-tperly.o: perly.c perly.h $(h)
-       $(RMS) tperly.c
-       $(SLN) perly.c tperly.c
-       $(CCCMD) -DTAINT tperly.c
-       $(RMS) tperly.c
-
-tperl.o: perl.c perly.h patchlevel.h perl.h $(h)
-       $(RMS) tperl.c
-       $(SLN) perl.c tperl.c
-       $(CCCMD) -DTAINT tperl.c
-       $(RMS) tperl.c
-
 sperl.o: perl.c perly.h patchlevel.h $(h)
        $(RMS) sperl.c
        $(SLN) perl.c sperl.c
-       $(CCCMD) -DTAINT -DIAMSUID sperl.c
+       $(CCCMD) -DIAMSUID sperl.c
        $(RMS) sperl.c
 
-tav.o: av.c $(h)
-       $(RMS) tav.c
-       $(SLN) av.c tav.c
-       $(CCCMD) -DTAINT tav.c
-       $(RMS) tav.c
-
-tcop.o: cop.c $(h)
-       $(RMS) tcop.c
-       $(SLN) cop.c tcop.c
-       $(CCCMD) -DTAINT tcop.c
-       $(RMS) tcop.c
-
-tcons.o: cons.c $(h) perly.h
-       $(RMS) tcons.c
-       $(SLN) cons.c tcons.c
-       $(CCCMD) -DTAINT tcons.c
-       $(RMS) tcons.c
-
-tconsop.o: consop.c $(h)
-       $(RMS) tconsop.c
-       $(SLN) consop.c tconsop.c
-       $(CCCMD) -DTAINT tconsop.c
-       $(RMS) tconsop.c
-
-tdoop.o: doop.c $(h)
-       $(RMS) tdoop.c
-       $(SLN) doop.c tdoop.c
-       $(CCCMD) -DTAINT tdoop.c
-       $(RMS) tdoop.c
-
-tdoio.o: doio.c $(h)
-       $(RMS) tdoio.c
-       $(SLN) doio.c tdoio.c
-       $(CCCMD) -DTAINT tdoio.c
-       $(RMS) tdoio.c
-
-tdolist.o: dolist.c $(h)
-       $(RMS) tdolist.c
-       $(SLN) dolist.c tdolist.c
-       $(CCCMD) -DTAINT tdolist.c
-       $(RMS) tdolist.c
-
-tdump.o: dump.c $(h)
-       $(RMS) tdump.c
-       $(SLN) dump.c tdump.c
-       $(CCCMD) -DTAINT tdump.c
-       $(RMS) tdump.c
-
-teval.o: eval.c $(h)
-       $(RMS) teval.c
-       $(SLN) eval.c teval.c
-       $(CCCMD) -DTAINT teval.c
-       $(RMS) teval.c
-
-thv.o: hv.c $(h)
-       $(RMS) thv.c
-       $(SLN) hv.c thv.c
-       $(CCCMD) -DTAINT thv.c
-       $(RMS) thv.c
-
-tmain.o: main.c $(h)
-       $(RMS) tmain.c
-       $(SLN) main.c tmain.c
-       $(CCCMD) -DTAINT tmain.c
-       $(RMS) tmain.c
-
-tpp.o: pp.c $(h)
-       $(RMS) tpp.c
-       $(SLN) pp.c tpp.c
-       $(CCCMD) -DTAINT tpp.c
-       $(RMS) tpp.c
-
-tregcomp.o: regcomp.c $(h)
-       $(RMS) tregcomp.c
-       $(SLN) regcomp.c tregcomp.c
-       $(CCCMD) -DTAINT tregcomp.c
-       $(RMS) tregcomp.c
-
-tregexec.o: regexec.c $(h)
-       $(RMS) tregexec.c
-       $(SLN) regexec.c tregexec.c
-       $(CCCMD) -DTAINT tregexec.c
-       $(RMS) tregexec.c
-
-tgv.o: gv.c $(h)
-       $(RMS) tgv.c
-       $(SLN) gv.c tgv.c
-       $(CCCMD) -DTAINT tgv.c
-       $(RMS) tgv.c
-
-tsv.o: sv.c $(h) perly.h
-       $(RMS) tsv.c
-       $(SLN) sv.c tsv.c
-       $(CCCMD) -DTAINT tsv.c
-       $(RMS) tsv.c
-
-ttoke.o: toke.c $(h) perly.h
-       $(RMS) ttoke.c
-       $(SLN) toke.c ttoke.c
-       $(CCCMD) -DTAINT ttoke.c
-       $(RMS) ttoke.c
-
-tutil.o: util.c $(h)
-       $(RMS) tutil.c
-       $(SLN) util.c tutil.c
-       $(CCCMD) -DTAINT tutil.c
-       $(RMS) tutil.c
+dl.o: ext/dl/dl.c
+       cp ext/dl/dl.c dl.c
+       $(CC) -c dl.c
 
+    
 perly.h: perly.c
        @ echo Dummy dependency for dumb parallel make
        touch perly.h
 
-embed.h: embed_h.SH global.var interp.var
+opcode.h: opcode.pl
+       - opcode.pl
+
+embed.h: embed_h.SH global.sym interp.sym
        sh embed_h.SH
 
-perly.c: perly.y perly.fixer
-       @ \
-case "$(YACC)" in \
-    *bison*) echo 'Expect' 25 shift/reduce and 53 reduce/reduce conflicts;; \
-    *) echo 'Expect' 27 shift/reduce and 51 reduce/reduce conflicts;; \
-esac
-       $(YACC) -d perly.y
+perly.c:
+       @ echo 'Expect' 80 shift/reduce and 62 reduce/reduce conflicts
+       $(BYACC) -d perly.y
        sh $(shellflags) ./perly.fixer y.tab.c perly.c
        mv y.tab.h perly.h
        echo 'extern YYSTYPE yylval;' >>perly.h
@@ -320,13 +234,13 @@ install: all
        ./perl installperl
 
 clean:
-       rm -f *.o all perl taintperl suidperl perly.c
+       rm -f *.o all perl taintperl suidperl miniperl
        cd x2p; $(MAKE) clean
 
 realclean: clean
        cd x2p; $(MAKE) realclean
        rm -f *.orig */*.orig *~ */*~ core $(addedbyconf) h2ph h2ph.man
-       rm -f perly.c perly.h t/perl Makefile config.h makedepend makedir
+       rm -f perly.h t/perl Makefile config.h makedepend makedir
        rm -f makefile x2p/Makefile x2p/makefile cflags x2p/cflags
        rm -f c2ph pstruct
 
@@ -358,9 +272,4 @@ shlist:
        echo $(sh) | tr ' ' '\012' >.shlist
 
 # AUTOMATICALLY GENERATED MAKE DEPENDENCIES--PUT NOTHING BELOW THIS LINE
-$(obj) hv.o:
-       @ echo "You haven't done a "'"make depend" yet!'; exit 1
-
-makedepend: makedepend.SH
-       /bin/sh $(shellflags) makedepend.SH
-
+# If this runs make out of memory, delete /usr/include lines.
diff --git a/Makefile.SH b/Makefile.SH
new file mode 100644 (file)
index 0000000..fe0549a
--- /dev/null
@@ -0,0 +1,325 @@
+case $CONFIG in
+'')
+       if test -f config.sh; then TOP=.;
+       elif test -f ../config.sh; then TOP=..;
+       elif test -f ../../config.sh; then TOP=../..;
+       elif test -f ../../../config.sh; then TOP=../../..;
+       elif test -f ../../../../config.sh; then TOP=../../../..;
+       else
+               echo "Can't find config.sh."; exit 1
+       fi
+       . $TOP/config.sh
+       ;;
+esac
+: This forces SH files to create target in same directory as SH file.
+: This is so that make depend always knows where to find SH derivatives.
+case "$0" in
+*/*) cd `expr X$0 : 'X\(.*\)/'` ;;
+esac
+
+case "$d_symlink" in
+*define*) sln='ln -s' ;;
+*) sln='ln';;
+esac
+
+case "$d_dosuid" in
+*define*) suidperl='suidperl' ;;
+*) suidperl='';;
+esac
+
+echo "Extracting Makefile (with variable substitutions)"
+: This section of the file will have variable substitutions done on it.
+: Move anything that needs config subs from !NO!SUBS! section to !GROK!THIS!.
+: Protect any dollar signs and backticks that you do not want interpreted
+: by putting a backslash in front.  You may delete these comments.
+$spitshell >Makefile <<!GROK!THIS!
+# : Makefile.SH,v 15738Revision: 4.1 15738Date: 92/08/07 17:18:08 $
+#
+# $Log:        Makefile.SH,v $
+# Revision 4.1  92/08/07  17:18:08  lwall
+# Stage 6 Snapshot
+# 
+# Revision 4.0.1.4  92/06/08  11:40:43  lwall
+# patch20: cray didn't give enough memory to /bin/sh
+# patch20: various and sundry fixes
+# 
+# Revision 4.0.1.3  91/11/05  15:48:11  lwall
+# patch11: saberized perl
+# patch11: added support for dbz
+# 
+# Revision 4.0.1.2  91/06/07  10:14:43  lwall
+# patch4: cflags now emits entire cc command except for the filename
+# patch4: alternate make programs are now semi-supported
+# patch4: uperl.o no longer tries to link in libraries prematurely
+# patch4: installperl now installs x2p stuff too
+# 
+# Revision 4.0.1.1  91/04/11  17:30:39  lwall
+# patch1: C flags are now settable on a per-file basis
+# 
+# Revision 4.0  91/03/20  00:58:54  lwall
+# 4.0 baseline.
+# 
+# 
+
+# I now supply perly.c with the kits, so don't remake perly.c without byacc
+BYACC = $byacc
+CC = $cc
+bin = $installbin
+scriptdir = $scriptdir
+privlib = $installprivlib
+mansrc = $mansrc
+manext = $manext
+LDFLAGS = $ldflags
+CLDFLAGS = $ldflags
+SMALL = $small
+LARGE = $large $split
+mallocsrc = $mallocsrc
+mallocobj = $mallocobj
+dlsrc = $dlsrc
+dlobj = $dlobj
+SLN = $sln
+RMS = rm -f
+
+libs = $libs $cryptlib
+
+public = perl $suidperl
+
+shellflags = $shellflags
+
+# To use an alternate make, set $altmake in config.sh.
+MAKE = ${altmake-make}
+!GROK!THIS!
+
+: In the following dollars and backticks do not need the extra backslash.
+$spitshell >>Makefile <<'!NO!SUBS!'
+
+CCCMD = `sh $(shellflags) cflags $@`
+
+private = 
+
+scripts = h2ph
+
+manpages = perl.man h2ph.man
+
+util =
+
+sh = Makefile.SH makedepend.SH h2ph.SH
+
+h1 = EXTERN.h INTERN.h av.h cop.h config.h embed.h form.h handy.h
+h2 = hv.h op.h opcode.h perl.h regcomp.h regexp.h gv.h sv.h util.h
+
+h1 = EXTERN.h INTERN.h XSUB.h av.h config.h cop.h cv.h dosish.h 
+h2 = embed.h form.h gv.h handy.h hv.h hvdbm.h keywords.h mg.h op.h
+h3 = opcode.h patchlevel.h perl.h perly.h pp.h proto.h regcomp.h
+h4 = regexp.h scope.h sv.h unixish.h util.h
+h = $(h1) $(h2) $(h3) $(h4)
+
+c1 = av.c scope.c op.c doop.c doio.c dump.c hv.c
+c2 = $(mallocsrc) mg.c perly.c pp.c regcomp.c regexec.c
+c3 = gv.c sv.c taint.c toke.c util.c deb.c run.c
+
+c = $(c1) $(c2) $(c3)
+
+s1 = av.c scope.c op.c doop.c doio.c dump.c hv.c
+s2 = $(mallocobj) mg.c perly.c pp.c regcomp.c regexec.c
+s3 = gv.c sv.c taint.c toke.c util.c deb.c run.c perly.c
+
+saber = $(s1) $(s2) $(s3)
+
+obj1 = av.o scope.o op.o doop.o doio.o dump.o hv.o
+obj2 = $(mallocobj) mg.o perly.o pp.o regcomp.o regexec.o
+obj3 = gv.o sv.o taint.o toke.o util.o deb.o run.o
+
+obj = $(obj1) $(obj2) $(obj3) $(dlobj)
+
+lintflags = -hbvxac
+
+addedbyconf = Makefile.old bsd eunice filexp loc pdp11 usg v7
+
+# grrr
+SHELL = /bin/sh
+
+.SUFFIXES: .x
+
+.c.o:
+       $(CCCMD) $*.c
+
+.x.c:
+       sh writemain $*.x >$*.c
+
+all: miniperl perl lib/Config.pm
+
+#all: $(public) $(private) $(util) $(scripts)
+#      cd x2p; $(MAKE) all
+#      touch all
+!NO!SUBS!
+###
+### Boilerplate for all the .xs files in the ext directory.  
+### XXX FIXME:  At some point we also need to copy .pm files out of 
+### XXX the ext directory into lib.
+#  Configure sets extensions to a string like
+# "ext/dbm/NDBM_File.xs ext/dbm/ODBM_File.xs ext/dbm/GDBM_File.xs \
+#  ext/dbm/SDBM_File.xs ext/posix/POSIX.xs"
+extobjs=" "
+for f in $extensions
+do
+    base=`basename $f .xs`
+    dir=`dirname $f`
+    extobjs="$extobjs $f.o"
+    $spitshell >>Makefile <<!GROK!THIS!
+
+# $base extension
+$base.c:       $f ext/xsubpp ext/typemap
+       test -f miniperl || make miniperl
+       ext/xsubpp $f >tmp
+       mv tmp $base.c
+
+$base.o: $base.c
+!GROK!THIS!
+
+    case $base in
+    SDBM_File) $spitshell >>Makefile <<'!NO!SUBS!'
+
+lib/auto/SDBM_File/SDBM_File.so: SDBM_File.o ext/dbm/sdbm/libsdbm.a
+       @- mkdir lib/auto/SDBM_File 2>/dev/null
+       ld -o lib/auto/SDBM_File/SDBM_File.so SDBM_File.o ext/dbm/sdbm/libsdbm.a
+
+ext/dbm/sdbm/libsdbm.a: ext/dbm/sdbm/sdbm.c ext/dbm/sdbm/sdbm.h
+       cd ext/dbm/sdbm; $(MAKE) sdbm
+!NO!SUBS!
+    ;;
+    POSIX) $spitshell >>Makefile <<'!NO!SUBS!'
+lib/auto/POSIX/POSIX.so: POSIX.o ext/dbm/sdbm/libsdbm.a
+       @- mkdir lib/auto/POSIX 2>/dev/null
+       ld -o lib/auto/POSIX/POSIX.so POSIX.o ext/dbm/sdbm/libsdbm.a
+!NO!SUBS!
+    ;;
+    esac
+done
+
+echo "extobjs=$extobjs" >> Makefile
+
+$spitshell >>Makefile <<'!NO!SUBS!'
+# The $& notation tells Sequent machines that it can do a parallel make,
+# and is harmless otherwise.
+
+miniperlmain.c: miniperlmain.x
+miniperlmain.o: miniperlmain.c
+miniperl: $& miniperlmain.o perl.o $(obj)
+       $(CC) $(LARGE) $(CLDFLAGS) -o miniperl miniperlmain.o perl.o $(obj) $(libs)
+
+perlmain.c: perlmain.x
+perlmain.o: perlmain.c
+perl: $& perlmain.o perl.o $(obj) NDBM_File.o ODBM_File.o POSIX.o
+       $(CC) $(LARGE) $(CLDFLAGS) -o perl perlmain.o perl.o $(obj) NDBM_File.o ODBM_File.o POSIX.o $(libs)
+
+libperl.rlb: libperl.a
+       ranlib libperl.a
+       touch libperl.rlb
+
+libperl.a: $& perl.o $(obj)
+       ar rcuv libperl.a $(obj)
+
+# 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: $& sperl.o main.o libperl.rlb
+       $(CC) $(LARGE) $(CLDFLAGS) sperl.o main.o libperl.a $(libs) -o suidperl
+
+lib/Config.pm: config.sh
+       ./configpm
+
+saber: $(saber)
+       # load $(saber)
+       # load /lib/libm.a
+
+sperl.o: perl.c perly.h patchlevel.h $(h)
+       $(RMS) sperl.c
+       $(SLN) perl.c sperl.c
+       $(CCCMD) -DIAMSUID sperl.c
+       $(RMS) sperl.c
+
+dl.o: ext/dl/dl.c
+       cp ext/dl/dl.c dl.c
+       $(CC) -c dl.c
+
+!NO!SUBS!
+
+### Now on to the rest of the Makefile.
+$spitshell >>Makefile <<'!NO!SUBS!'
+    
+perly.h: perly.c
+       @ echo Dummy dependency for dumb parallel make
+       touch perly.h
+
+opcode.h: opcode.pl
+       - opcode.pl
+
+embed.h: embed_h.SH global.sym interp.sym
+       sh embed_h.SH
+
+perly.c:
+       @ echo 'Expect' 80 shift/reduce and 62 reduce/reduce conflicts
+       $(BYACC) -d perly.y
+       sh $(shellflags) ./perly.fixer y.tab.c perly.c
+       mv y.tab.h perly.h
+       echo 'extern YYSTYPE yylval;' >>perly.h
+
+perly.o: perly.c perly.h $(h)
+       $(CCCMD) perly.c
+
+install: all
+       ./perl installperl
+
+clean:
+       rm -f *.o all perl taintperl suidperl miniperl
+       cd x2p; $(MAKE) clean
+
+realclean: clean
+       cd x2p; $(MAKE) realclean
+       rm -f *.orig */*.orig *~ */*~ core $(addedbyconf) h2ph h2ph.man
+       rm -f perly.h t/perl Makefile config.h makedepend makedir
+       rm -f makefile x2p/Makefile x2p/makefile cflags x2p/cflags
+       rm -f c2ph pstruct
+
+# The following lint has practically everything turned on.  Unfortunately,
+# you have to wade through a lot of mumbo jumbo that can't be suppressed.
+# If the source file has a /*NOSTRICT*/ somewhere, ignore the lint message
+# for that spot.
+
+lint: perly.c $(c)
+       lint $(lintflags) $(defs) perly.c $(c) > perl.fuzz
+
+depend: makedepend
+       - test -f perly.h || cp /dev/null perly.h
+       ./makedepend
+       - test -s perly.h || /bin/rm -f perly.h
+       cd x2p; $(MAKE) depend
+
+test: perl
+       - cd t && chmod +x TEST */*.t
+       - cd t && (rm -f perl; $(SLN) ../perl perl) && ./perl TEST </dev/tty
+
+clist:
+       echo $(c) | tr ' ' '\012' >.clist
+
+hlist:
+       echo $(h) | tr ' ' '\012' >.hlist
+
+shlist:
+       echo $(sh) | tr ' ' '\012' >.shlist
+
+# AUTOMATICALLY GENERATED MAKE DEPENDENCIES--PUT NOTHING BELOW THIS LINE
+# If this runs make out of memory, delete /usr/include lines.
+!NO!SUBS!
+
+$eunicefix Makefile4
+case `pwd` in
+*SH)
+    $rm -f ../Makefile4
+    ln Makefile4 ../Makefile4
+    ;;
+esac
+rm -f makefile
index 5f29958..9d5897e 100644 (file)
@@ -70,7 +70,8 @@ register int items;
        else
            croak("db is not of type NDBM_File");
 
-       key.dptr = SvPV(ST(2), key.dsize);;
+       key.dptr = SvPV(ST(2), na);
+       key.dsize = (int)na;;
 
        RETVAL = dbm_fetch(db, key);
        ST(0) = sv_newmortal();
@@ -100,9 +101,11 @@ register int items;
        else
            croak("db is not of type NDBM_File");
 
-       key.dptr = SvPV(ST(2), key.dsize);;
+       key.dptr = SvPV(ST(2), na);
+       key.dsize = (int)na;;
 
-       value.dptr = SvPV(ST(3), value.dsize);;
+       value.dptr = SvPV(ST(3), na);
+       value.dsize = (int)na;;
 
        if (items < 4)
            flags = DBM_REPLACE;
@@ -136,7 +139,8 @@ register int items;
        else
            croak("db is not of type NDBM_File");
 
-       key.dptr = SvPV(ST(2), key.dsize);;
+       key.dptr = SvPV(ST(2), na);
+       key.dsize = (int)na;;
 
        RETVAL = dbm_delete(db, key);
        ST(0) = sv_newmortal();
@@ -189,7 +193,8 @@ register int items;
        else
            croak("db is not of type NDBM_File");
 
-       key.dptr = SvPV(ST(2), key.dsize);;
+       key.dptr = SvPV(ST(2), na);
+       key.dsize = (int)na;;
 
        RETVAL = nextkey(db, key);
        ST(0) = sv_newmortal();
index 27e5dee..61849e3 100644 (file)
@@ -101,7 +101,8 @@ register int items;
        else
            croak("db is not of type ODBM_File");
 
-       key.dptr = SvPV(ST(2), key.dsize);;
+       key.dptr = SvPV(ST(2), na);
+       key.dsize = (int)na;;
 
        RETVAL = odbm_fetch(db, key);
        ST(0) = sv_newmortal();
@@ -131,9 +132,11 @@ register int items;
        else
            croak("db is not of type ODBM_File");
 
-       key.dptr = SvPV(ST(2), key.dsize);;
+       key.dptr = SvPV(ST(2), na);
+       key.dsize = (int)na;;
 
-       value.dptr = SvPV(ST(3), value.dsize);;
+       value.dptr = SvPV(ST(3), na);
+       value.dsize = (int)na;;
 
        if (items < 4)
            flags = DBM_REPLACE;
@@ -167,7 +170,8 @@ register int items;
        else
            croak("db is not of type ODBM_File");
 
-       key.dptr = SvPV(ST(2), key.dsize);;
+       key.dptr = SvPV(ST(2), na);
+       key.dsize = (int)na;;
 
        RETVAL = odbm_delete(db, key);
        ST(0) = sv_newmortal();
@@ -220,7 +224,8 @@ register int items;
        else
            croak("db is not of type ODBM_File");
 
-       key.dptr = SvPV(ST(2), key.dsize);;
+       key.dptr = SvPV(ST(2), na);
+       key.dsize = (int)na;;
 
        RETVAL = odbm_nextkey(db, key);
        ST(0) = sv_newmortal();
diff --git a/Obsolete b/Obsolete
new file mode 100644 (file)
index 0000000..c8dbdd0
--- /dev/null
+++ b/Obsolete
@@ -0,0 +1,25 @@
+
+              File                 |      Old symbol      |      New symbol
+-----------------------------------+----------------------+---------------------
+atarist/config.h                   | GIDTYPE              | Gid_t
+atarist/config.h                   | HAS_GDBM             | I_GDBM
+atarist/config.h                   | UIDTYPE              | Uid_t
+doio.c                             | STDSTDIO             | USE_STD_STDIO
+hvdbm.h                            | HAS_GDBM             | I_GDBM
+mg.c                               | GIDTYPE              | Gid_t
+mg.c                               | UIDTYPE              | Uid_t
+msdos/config.h                     | GIDTYPE              | Gid_t
+msdos/config.h                     | UIDTYPE              | Uid_t
+os2/config.h                       | GIDTYPE              | Gid_t
+os2/config.h                       | HAS_GDBM             | I_GDBM
+os2/config.h                       | UIDTYPE              | Uid_t
+perl.c                             | GIDTYPE              | Gid_t
+perl.c                             | UIDTYPE              | Uid_t
+perl.h                             | GIDTYPE              | Gid_t
+perl.h                             | UIDTYPE              | Uid_t
+pp.c                               | STATBLOCKS           | USE_STAT_BLOCKS
+pp.c                               | STDSTDIO             | USE_STD_STDIO
+sv.c                               | STDSTDIO             | USE_STD_STDIO
+usersub.c                          | STDSTDIO             | USE_STD_STDIO
+util.c                             | CHARVSPRINTF         | USE_CHAR_VSPRINTF
+util.c                             | SAFE_BCOPY           | HAS_SAFE_BCOPY
diff --git a/POSIX.c b/POSIX.c
index cf3ada3..bfd6ac3 100644 (file)
--- a/POSIX.c
+++ b/POSIX.c
 #include "EXTERN.h"
 #include "perl.h"
 #include "XSUB.h"
+
+#include <ctype.h>
+#include <dirent.h>
+#include <errno.h>
+#include <fcntl.h>
+#ifdef I_FLOAT
+#include <float.h>
+#endif
+#include <grp.h>
+#include <limits.h>
+#include <locale.h>
+#include <math.h>
+#include <pwd.h>
+#include <setjmp.h>
+#include <signal.h>
+#ifdef I_STDARG
+#include <stdarg.h>
+#endif
+#ifdef I_STDDEF
+#include <stddef.h>
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/times.h>
+#include <sys/types.h>
 #include <sys/utsname.h>
+#include <sys/wait.h>
+#ifndef CR3
+#include <termios.h>
+#endif
+#include <time.h>
+#include <unistd.h>
+#include <utime.h>
+
+typedef int SysRet;
+typedef sigset_t* POSIX__SigSet;
+typedef HV* POSIX__SigAction;
+
+#define HAS_UNAME
+
+#ifndef HAS_GETPGRP
+#define getpgrp(a,b) not_here("getpgrp")
+#endif
+#ifndef HAS_NICE
+#define nice(a) not_here("nice")
+#endif
+#ifndef HAS_READLINK
+#define readlink(a,b,c) not_here("readlink")
+#endif
+#ifndef HAS_SETPGID
+#define setpgid(a,b) not_here("setpgid")
+#endif
+#ifndef HAS_SETPGRP
+#define setpgrp(a,b) not_here("setpgrp")
+#endif
+#ifndef HAS_SETSID
+#define setsid() not_here("setsid")
+#endif
+#ifndef HAS_SYMLINK
+#define symlink(a,b) not_here("symlink")
+#endif
+#ifndef HAS_TCGETPGRP
+#define tcgetpgrp(a) not_here("tcgetpgrp")
+#endif
+#ifndef HAS_TCSETPGRP
+#define tcsetpgrp(a,b) not_here("tcsetpgrp")
+#endif
+#ifndef HAS_TIMES
+#define times(a) not_here("times")
+#endif
+#ifndef HAS_UNAME
+#define uname(a) not_here("uname")
+#endif
+#ifndef HAS_WAITPID
+#define waitpid(a,b,c) not_here("waitpid")
+#endif
+
+static int
+not_here(s)
+char *s;
+{
+    croak("POSIX::%s not implemented on this architecture", s);
+    return -1;
+}
+
+int constant(name, arg)
+char *name;
+int arg;
+{
+    errno = 0;
+    switch (*name) {
+    case 'A':
+       if (strEQ(name, "ARG_MAX"))
+#ifdef ARG_MAX
+           return ARG_MAX;
+#else
+           goto not_there;
+#endif
+       break;
+    case 'B':
+       if (strEQ(name, "BUFSIZ"))
+#ifdef BUFSIZ
+           return BUFSIZ;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "BRKINT"))
+#ifdef BRKINT
+           return BRKINT;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "B9600"))
+#ifdef B9600
+           return B9600;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "B19200"))
+#ifdef B19200
+           return B19200;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "B38400"))
+#ifdef B38400
+           return B38400;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "B0"))
+#ifdef B0
+           return B0;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "B110"))
+#ifdef B110
+           return B110;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "B1200"))
+#ifdef B1200
+           return B1200;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "B134"))
+#ifdef B134
+           return B134;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "B150"))
+#ifdef B150
+           return B150;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "B1800"))
+#ifdef B1800
+           return B1800;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "B200"))
+#ifdef B200
+           return B200;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "B2400"))
+#ifdef B2400
+           return B2400;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "B300"))
+#ifdef B300
+           return B300;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "B4800"))
+#ifdef B4800
+           return B4800;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "B50"))
+#ifdef B50
+           return B50;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "B600"))
+#ifdef B600
+           return B600;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "B75"))
+#ifdef B75
+           return B75;
+#else
+           goto not_there;
+#endif
+       break;
+    case 'C':
+       if (strEQ(name, "CHAR_BIT"))
+#ifdef CHAR_BIT
+           return CHAR_BIT;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "CHAR_MAX"))
+#ifdef CHAR_MAX
+           return CHAR_MAX;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "CHAR_MIN"))
+#ifdef CHAR_MIN
+           return CHAR_MIN;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "CHILD_MAX"))
+#ifdef CHILD_MAX
+           return CHILD_MAX;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "CLK_TCK"))
+#ifdef CLK_TCK
+           return CLK_TCK;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "CLOCAL"))
+#ifdef CLOCAL
+           return CLOCAL;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "CLOCKS_PER_SEC"))
+#ifdef CLOCKS_PER_SEC
+           return CLOCKS_PER_SEC;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "CREAD"))
+#ifdef CREAD
+           return CREAD;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "CS5"))
+#ifdef CS5
+           return CS5;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "CS6"))
+#ifdef CS6
+           return CS6;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "CS7"))
+#ifdef CS7
+           return CS7;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "CS8"))
+#ifdef CS8
+           return CS8;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "CSIZE"))
+#ifdef CSIZE
+           return CSIZE;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "CSTOPB"))
+#ifdef CSTOPB
+           return CSTOPB;
+#else
+           goto not_there;
+#endif
+       break;
+    case 'D':
+       if (strEQ(name, "DBL_MAX"))
+#ifdef DBL_MAX
+           return DBL_MAX;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "DBL_MIN"))
+#ifdef DBL_MIN
+           return DBL_MIN;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "DBL_DIG"))
+#ifdef DBL_DIG
+           return DBL_DIG;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "DBL_EPSILON"))
+#ifdef DBL_EPSILON
+           return DBL_EPSILON;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "DBL_MANT_DIG"))
+#ifdef DBL_MANT_DIG
+           return DBL_MANT_DIG;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "DBL_MAX_10_EXP"))
+#ifdef DBL_MAX_10_EXP
+           return DBL_MAX_10_EXP;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "DBL_MAX_EXP"))
+#ifdef DBL_MAX_EXP
+           return DBL_MAX_EXP;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "DBL_MIN_10_EXP"))
+#ifdef DBL_MIN_10_EXP
+           return DBL_MIN_10_EXP;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "DBL_MIN_EXP"))
+#ifdef DBL_MIN_EXP
+           return DBL_MIN_EXP;
+#else
+           goto not_there;
+#endif
+       break;
+    case 'E':
+       switch (name[1]) {
+       case 'A':
+           if (strEQ(name, "EACCES"))
+#ifdef EACCES
+               return EACCES;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "EAGAIN"))
+#ifdef EAGAIN
+               return EAGAIN;
+#else
+               goto not_there;
+#endif
+           break;
+       case 'B':
+           if (strEQ(name, "EBADF"))
+#ifdef EBADF
+               return EBADF;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "EBUSY"))
+#ifdef EBUSY
+               return EBUSY;
+#else
+               goto not_there;
+#endif
+           break;
+       case 'C':
+           if (strEQ(name, "ECHILD"))
+#ifdef ECHILD
+               return ECHILD;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "ECHO"))
+#ifdef ECHO
+               return ECHO;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "ECHOE"))
+#ifdef ECHOE
+               return ECHOE;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "ECHOK"))
+#ifdef ECHOK
+               return ECHOK;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "ECHONL"))
+#ifdef ECHONL
+               return ECHONL;
+#else
+               goto not_there;
+#endif
+           break;
+       case 'D':
+           if (strEQ(name, "EDEADLK"))
+#ifdef EDEADLK
+               return EDEADLK;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "EDOM"))
+#ifdef EDOM
+               return EDOM;
+#else
+               goto not_there;
+#endif
+           break;
+       case 'E':
+           if (strEQ(name, "EEXIST"))
+#ifdef EEXIST
+               return EEXIST;
+#else
+               goto not_there;
+#endif
+           break;
+       case 'F':
+           if (strEQ(name, "EFAULT"))
+#ifdef EFAULT
+               return EFAULT;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "EFBIG"))
+#ifdef EFBIG
+               return EFBIG;
+#else
+               goto not_there;
+#endif
+           break;
+       case 'I':
+           if (strEQ(name, "EINTR"))
+#ifdef EINTR
+               return EINTR;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "EINVAL"))
+#ifdef EINVAL
+               return EINVAL;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "EIO"))
+#ifdef EIO
+               return EIO;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "EISDIR"))
+#ifdef EISDIR
+               return EISDIR;
+#else
+               goto not_there;
+#endif
+           break;
+       case 'M':
+           if (strEQ(name, "EMFILE"))
+#ifdef EMFILE
+               return EMFILE;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "EMLINK"))
+#ifdef EMLINK
+               return EMLINK;
+#else
+               goto not_there;
+#endif
+           break;
+       case 'N':
+           if (strEQ(name, "ENOMEM"))
+#ifdef ENOMEM
+               return ENOMEM;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "ENOSPC"))
+#ifdef ENOSPC
+               return ENOSPC;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "ENOEXEC"))
+#ifdef ENOEXEC
+               return ENOEXEC;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "ENOTTY"))
+#ifdef ENOTTY
+               return ENOTTY;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "ENOTDIR"))
+#ifdef ENOTDIR
+               return ENOTDIR;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "ENOTEMPTY"))
+#ifdef ENOTEMPTY
+               return ENOTEMPTY;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "ENFILE"))
+#ifdef ENFILE
+               return ENFILE;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "ENODEV"))
+#ifdef ENODEV
+               return ENODEV;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "ENOENT"))
+#ifdef ENOENT
+               return ENOENT;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "ENOLCK"))
+#ifdef ENOLCK
+               return ENOLCK;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "ENOSYS"))
+#ifdef ENOSYS
+               return ENOSYS;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "ENXIO"))
+#ifdef ENXIO
+               return ENXIO;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "ENAMETOOLONG"))
+#ifdef ENAMETOOLONG
+               return ENAMETOOLONG;
+#else
+               goto not_there;
+#endif
+           break;
+       case 'O':
+           if (strEQ(name, "EOF"))
+#ifdef EOF
+               return EOF;
+#else
+               goto not_there;
+#endif
+           break;
+       case 'P':
+           if (strEQ(name, "EPERM"))
+#ifdef EPERM
+               return EPERM;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "EPIPE"))
+#ifdef EPIPE
+               return EPIPE;
+#else
+               goto not_there;
+#endif
+           break;
+       case 'R':
+           if (strEQ(name, "ERANGE"))
+#ifdef ERANGE
+               return ERANGE;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "EROFS"))
+#ifdef EROFS
+               return EROFS;
+#else
+               goto not_there;
+#endif
+           break;
+       case 'S':
+           if (strEQ(name, "ESPIPE"))
+#ifdef ESPIPE
+               return ESPIPE;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "ESRCH"))
+#ifdef ESRCH
+               return ESRCH;
+#else
+               goto not_there;
+#endif
+           break;
+       case 'X':
+           if (strEQ(name, "EXIT_FAILURE"))
+#ifdef EXIT_FAILURE
+               return EXIT_FAILURE;
+#else
+               return 1;
+#endif
+           if (strEQ(name, "EXIT_SUCCESS"))
+#ifdef EXIT_SUCCESS
+               return EXIT_SUCCESS;
+#else
+               return 0;
+#endif
+           if (strEQ(name, "EXDEV"))
+#ifdef EXDEV
+               return EXDEV;
+#else
+               goto not_there;
+#endif
+           break;
+       }
+       if (strEQ(name, "E2BIG"))
+#ifdef E2BIG
+           return E2BIG;
+#else
+           goto not_there;
+#endif
+       break;
+    case 'F':
+       if (strnEQ(name, "FLT_", 4)) {
+           if (strEQ(name, "FLT_MAX"))
+#ifdef FLT_MAX
+               return FLT_MAX;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "FLT_MIN"))
+#ifdef FLT_MIN
+               return FLT_MIN;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "FLT_ROUNDS"))
+#ifdef FLT_ROUNDS
+               return FLT_ROUNDS;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "FLT_DIG"))
+#ifdef FLT_DIG
+               return FLT_DIG;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "FLT_EPSILON"))
+#ifdef FLT_EPSILON
+               return FLT_EPSILON;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "FLT_MANT_DIG"))
+#ifdef FLT_MANT_DIG
+               return FLT_MANT_DIG;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "FLT_MAX_10_EXP"))
+#ifdef FLT_MAX_10_EXP
+               return FLT_MAX_10_EXP;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "FLT_MAX_EXP"))
+#ifdef FLT_MAX_EXP
+               return FLT_MAX_EXP;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "FLT_MIN_10_EXP"))
+#ifdef FLT_MIN_10_EXP
+               return FLT_MIN_10_EXP;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "FLT_MIN_EXP"))
+#ifdef FLT_MIN_EXP
+               return FLT_MIN_EXP;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "FLT_RADIX"))
+#ifdef FLT_RADIX
+               return FLT_RADIX;
+#else
+               goto not_there;
+#endif
+           break;
+       }
+       if (strnEQ(name, "F_", 2)) {
+           if (strEQ(name, "F_DUPFD"))
+#ifdef F_DUPFD
+               return F_DUPFD;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "F_GETFD"))
+#ifdef F_GETFD
+               return F_GETFD;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "F_GETFL"))
+#ifdef F_GETFL
+               return F_GETFL;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "F_GETLK"))
+#ifdef F_GETLK
+               return F_GETLK;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "F_OK"))
+#ifdef F_OK
+               return F_OK;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "F_RDLCK"))
+#ifdef F_RDLCK
+               return F_RDLCK;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "F_SETFD"))
+#ifdef F_SETFD
+               return F_SETFD;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "F_SETFL"))
+#ifdef F_SETFL
+               return F_SETFL;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "F_SETLK"))
+#ifdef F_SETLK
+               return F_SETLK;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "F_SETLKW"))
+#ifdef F_SETLKW
+               return F_SETLKW;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "F_UNLCK"))
+#ifdef F_UNLCK
+               return F_UNLCK;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "F_WRLCK"))
+#ifdef F_WRLCK
+               return F_WRLCK;
+#else
+               goto not_there;
+#endif
+           break;
+       }
+       if (strEQ(name, "FD_CLOEXEC")) return FD_CLOEXEC;
+       if (strEQ(name, "FILENAME_MAX"))
+#ifdef FILENAME_MAX
+           return FILENAME_MAX;
+#else
+           goto not_there;
+#endif
+       break;
+    case 'H':
+       if (strEQ(name, "HUGE_VAL"))
+#ifdef HUGE_VAL
+           return HUGE_VAL;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "HUPCL"))
+#ifdef HUPCL
+           return HUPCL;
+#else
+           goto not_there;
+#endif
+       break;
+    case 'I':
+       if (strEQ(name, "INT_MAX"))
+#ifdef INT_MAX
+           return INT_MAX;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "INT_MIN"))
+#ifdef INT_MIN
+           return INT_MIN;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "ICANON"))
+#ifdef ICANON
+           return ICANON;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "ICRNL"))
+#ifdef ICRNL
+           return ICRNL;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "IEXTEN"))
+#ifdef IEXTEN
+           return IEXTEN;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "IGNBRK"))
+#ifdef IGNBRK
+           return IGNBRK;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "IGNCR"))
+#ifdef IGNCR
+           return IGNCR;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "IGNPAR"))
+#ifdef IGNPAR
+           return IGNPAR;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "INLCR"))
+#ifdef INLCR
+           return INLCR;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "INPCK"))
+#ifdef INPCK
+           return INPCK;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "ISIG"))
+#ifdef ISIG
+           return ISIG;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "ISTRIP"))
+#ifdef ISTRIP
+           return ISTRIP;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "IXOFF"))
+#ifdef IXOFF
+           return IXOFF;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "IXON"))
+#ifdef IXON
+           return IXON;
+#else
+           goto not_there;
+#endif
+       break;
+    case 'L':
+       if (strnEQ(name, "LC_", 3)) {
+           if (strEQ(name, "LC_ALL"))
+#ifdef LC_ALL
+               return LC_ALL;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "LC_COLLATE"))
+#ifdef LC_COLLATE
+               return LC_COLLATE;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "LC_CTYPE"))
+#ifdef LC_CTYPE
+               return LC_CTYPE;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "LC_MONETARY"))
+#ifdef LC_MONETARY
+               return LC_MONETARY;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "LC_NUMERIC"))
+#ifdef LC_NUMERIC
+               return LC_NUMERIC;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "LC_TIME"))
+#ifdef LC_TIME
+               return LC_TIME;
+#else
+               goto not_there;
+#endif
+           break;
+       }
+       if (strnEQ(name, "LDBL_", 5)) {
+           if (strEQ(name, "LDBL_MAX"))
+#ifdef LDBL_MAX
+               return LDBL_MAX;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "LDBL_MIN"))
+#ifdef LDBL_MIN
+               return LDBL_MIN;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "LDBL_DIG"))
+#ifdef LDBL_DIG
+               return LDBL_DIG;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "LDBL_EPSILON"))
+#ifdef LDBL_EPSILON
+               return LDBL_EPSILON;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "LDBL_MANT_DIG"))
+#ifdef LDBL_MANT_DIG
+               return LDBL_MANT_DIG;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "LDBL_MAX_10_EXP"))
+#ifdef LDBL_MAX_10_EXP
+               return LDBL_MAX_10_EXP;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "LDBL_MAX_EXP"))
+#ifdef LDBL_MAX_EXP
+               return LDBL_MAX_EXP;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "LDBL_MIN_10_EXP"))
+#ifdef LDBL_MIN_10_EXP
+               return LDBL_MIN_10_EXP;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "LDBL_MIN_EXP"))
+#ifdef LDBL_MIN_EXP
+               return LDBL_MIN_EXP;
+#else
+               goto not_there;
+#endif
+           break;
+       }
+       if (strnEQ(name, "L_", 2)) {
+           if (strEQ(name, "L_ctermid"))
+#ifdef L_ctermid
+               return L_ctermid;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "L_cuserid"))
+#ifdef L_cuserid
+               return L_cuserid;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "L_tmpname"))
+#ifdef L_tmpname
+               return L_tmpname;
+#else
+               goto not_there;
+#endif
+           break;
+       }
+       if (strEQ(name, "LONG_MAX"))
+#ifdef LONG_MAX
+           return LONG_MAX;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "LONG_MIN"))
+#ifdef LONG_MIN
+           return LONG_MIN;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "LINK_MAX"))
+#ifdef LINK_MAX
+           return LINK_MAX;
+#else
+           goto not_there;
+#endif
+       break;
+    case 'M':
+       if (strEQ(name, "MAX_CANON"))
+#ifdef MAX_CANON
+           return MAX_CANON;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "MAX_INPUT"))
+#ifdef MAX_INPUT
+           return MAX_INPUT;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "MB_CUR_MAX"))
+#ifdef MB_CUR_MAX
+           return MB_CUR_MAX;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "MB_LEN_MAX"))
+#ifdef MB_LEN_MAX
+           return MB_LEN_MAX;
+#else
+           goto not_there;
+#endif
+       break;
+    case 'N':
+       if (strEQ(name, "NULL")) return NULL;
+       if (strEQ(name, "NAME_MAX"))
+#ifdef NAME_MAX
+           return NAME_MAX;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "NCCS"))
+#ifdef NCCS
+           return NCCS;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "NGROUPS_MAX"))
+#ifdef NGROUPS_MAX
+           return NGROUPS_MAX;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "NOFLSH"))
+#ifdef NOFLSH
+           return NOFLSH;
+#else
+           goto not_there;
+#endif
+       break;
+    case 'O':
+       if (strnEQ(name, "O_", 2)) {
+           if (strEQ(name, "O_APPEND"))
+#ifdef O_APPEND
+               return O_APPEND;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "O_CREAT"))
+#ifdef O_CREAT
+               return O_CREAT;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "O_TRUNC"))
+#ifdef O_TRUNC
+               return O_TRUNC;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "O_RDONLY"))
+#ifdef O_RDONLY
+               return O_RDONLY;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "O_RDWR"))
+#ifdef O_RDWR
+               return O_RDWR;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "O_WRONLY"))
+#ifdef O_WRONLY
+               return O_WRONLY;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "O_EXCL"))
+#ifdef O_EXCL
+               return O_EXCL;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "O_NOCTTY"))
+#ifdef O_NOCTTY
+               return O_NOCTTY;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "O_NONBLOCK"))
+#ifdef O_NONBLOCK
+               return O_NONBLOCK;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "O_ACCMODE"))
+#ifdef O_ACCMODE
+               return O_ACCMODE;
+#else
+               goto not_there;
+#endif
+           break;
+       }
+       if (strEQ(name, "OPEN_MAX"))
+#ifdef OPEN_MAX
+           return OPEN_MAX;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "OPOST"))
+#ifdef OPOST
+           return OPOST;
+#else
+           goto not_there;
+#endif
+       break;
+    case 'P':
+       if (strEQ(name, "PATH_MAX"))
+#ifdef PATH_MAX
+           return PATH_MAX;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "PARENB"))
+#ifdef PARENB
+           return PARENB;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "PARMRK"))
+#ifdef PARMRK
+           return PARMRK;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "PARODD"))
+#ifdef PARODD
+           return PARODD;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "PIPE_BUF"))
+#ifdef PIPE_BUF
+           return PIPE_BUF;
+#else
+           goto not_there;
+#endif
+       break;
+    case 'R':
+       if (strEQ(name, "RAND_MAX"))
+#ifdef RAND_MAX
+           return RAND_MAX;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "R_OK"))
+#ifdef R_OK
+           return R_OK;
+#else
+           goto not_there;
+#endif
+       break;
+    case 'S':
+       if (strnEQ(name, "SIG", 3)) {
+           if (name[3] == '_') {
+               if (strEQ(name, "SIG_BLOCK"))
+#ifdef SIG_BLOCK
+                   return SIG_BLOCK;
+#else
+                   goto not_there;
+#endif
+#ifdef SIG_DFL
+               if (strEQ(name, "SIG_DFL")) return (int)SIG_DFL;
+#endif
+#ifdef SIG_ERR
+               if (strEQ(name, "SIG_ERR")) return (int)SIG_ERR;
+#endif
+#ifdef SIG_IGN
+               if (strEQ(name, "SIG_IGN")) return (int)SIG_IGN;
+#endif
+               if (strEQ(name, "SIG_SETMASK"))
+#ifdef SIG_SETMASK
+                   return SIG_SETMASK;
+#else
+                   goto not_there;
+#endif
+               if (strEQ(name, "SIG_UNBLOCK"))
+#ifdef SIG_UNBLOCK
+                   return SIG_UNBLOCK;
+#else
+                   goto not_there;
+#endif
+               break;
+           }
+           if (strEQ(name, "SIGABRT"))
+#ifdef SIGABRT
+               return SIGABRT;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "SIGALRM"))
+#ifdef SIGALRM
+               return SIGALRM;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "SIGCHLD"))
+#ifdef SIGCHLD
+               return SIGCHLD;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "SIGCONT"))
+#ifdef SIGCONT
+               return SIGCONT;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "SIGFPE"))
+#ifdef SIGFPE
+               return SIGFPE;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "SIGHUP"))
+#ifdef SIGHUP
+               return SIGHUP;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "SIGILL"))
+#ifdef SIGILL
+               return SIGILL;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "SIGINT"))
+#ifdef SIGINT
+               return SIGINT;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "SIGKILL"))
+#ifdef SIGKILL
+               return SIGKILL;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "SIGPIPE"))
+#ifdef SIGPIPE
+               return SIGPIPE;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "SIGQUIT"))
+#ifdef SIGQUIT
+               return SIGQUIT;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "SIGSEGV"))
+#ifdef SIGSEGV
+               return SIGSEGV;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "SIGSTOP"))
+#ifdef SIGSTOP
+               return SIGSTOP;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "SIGTERM"))
+#ifdef SIGTERM
+               return SIGTERM;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "SIGTSTP"))
+#ifdef SIGTSTP
+               return SIGTSTP;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "SIGTTIN"))
+#ifdef SIGTTIN
+               return SIGTTIN;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "SIGTTOU"))
+#ifdef SIGTTOU
+               return SIGTTOU;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "SIGUSR1"))
+#ifdef SIGUSR1
+               return SIGUSR1;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "SIGUSR2"))
+#ifdef SIGUSR2
+               return SIGUSR2;
+#else
+               goto not_there;
+#endif
+           break;
+       }
+       if (name[1] == '_') {
+#ifdef S_ISBLK
+           if (strEQ(name, "S_ISBLK")) return S_ISBLK(arg);
+#endif
+#ifdef S_ISCHR
+           if (strEQ(name, "S_ISCHR")) return S_ISCHR(arg);
+#endif
+#ifdef S_ISDIR
+           if (strEQ(name, "S_ISDIR")) return S_ISDIR(arg);
+#endif
+#ifdef S_ISFIFO
+           if (strEQ(name, "S_ISFIFO")) return S_ISFIFO(arg);
+#endif
+#ifdef S_ISREG
+           if (strEQ(name, "S_ISREG")) return S_ISREG(arg);
+#endif
+           if (strEQ(name, "S_ISGID"))
+#ifdef S_ISGID
+               return S_ISGID;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "S_ISUID"))
+#ifdef S_ISUID
+               return S_ISUID;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "S_IRGRP"))
+#ifdef S_IRGRP
+               return S_IRGRP;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "S_IROTH"))
+#ifdef S_IROTH
+               return S_IROTH;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "S_IRUSR"))
+#ifdef S_IRUSR
+               return S_IRUSR;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "S_IRWXG"))
+#ifdef S_IRWXG
+               return S_IRWXG;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "S_IRWXO"))
+#ifdef S_IRWXO
+               return S_IRWXO;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "S_IRWXU"))
+#ifdef S_IRWXU
+               return S_IRWXU;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "S_IWGRP"))
+#ifdef S_IWGRP
+               return S_IWGRP;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "S_IWOTH"))
+#ifdef S_IWOTH
+               return S_IWOTH;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "S_IWUSR"))
+#ifdef S_IWUSR
+               return S_IWUSR;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "S_IXGRP"))
+#ifdef S_IXGRP
+               return S_IXGRP;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "S_IXOTH"))
+#ifdef S_IXOTH
+               return S_IXOTH;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "S_IXUSR"))
+#ifdef S_IXUSR
+               return S_IXUSR;
+#else
+               goto not_there;
+#endif
+           break;
+       }
+       if (strEQ(name, "SEEK_CUR"))
+#ifdef SEEK_CUR
+           return SEEK_CUR;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "SEEK_END"))
+#ifdef SEEK_END
+           return SEEK_END;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "SEEK_SET"))
+#ifdef SEEK_SET
+           return SEEK_SET;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "STREAM_MAX"))
+#ifdef STREAM_MAX
+           return STREAM_MAX;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "SHRT_MAX"))
+#ifdef SHRT_MAX
+           return SHRT_MAX;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "SHRT_MIN"))
+#ifdef SHRT_MIN
+           return SHRT_MIN;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "SA_NOCLDSTOP"))
+#ifdef SA_NOCLDSTOP
+           return SA_NOCLDSTOP;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "SCHAR_MAX"))
+#ifdef SCHAR_MAX
+           return SCHAR_MAX;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "SCHAR_MIN"))
+#ifdef SCHAR_MIN
+           return SCHAR_MIN;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "SSIZE_MAX"))
+#ifdef SSIZE_MAX
+           return SSIZE_MAX;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "STDIN_FILENO"))
+#ifdef STDIN_FILENO
+           return STDIN_FILENO;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "STDOUT_FILENO"))
+#ifdef STDOUT_FILENO
+           return STDOUT_FILENO;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "STRERR_FILENO"))
+#ifdef STRERR_FILENO
+           return STRERR_FILENO;
+#else
+           goto not_there;
+#endif
+       break;
+    case 'T':
+       if (strEQ(name, "TCIFLUSH"))
+#ifdef TCIFLUSH
+           return TCIFLUSH;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "TCIOFF"))
+#ifdef TCIOFF
+           return TCIOFF;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "TCIOFLUSH"))
+#ifdef TCIOFLUSH
+           return TCIOFLUSH;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "TCION"))
+#ifdef TCION
+           return TCION;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "TCOFLUSH"))
+#ifdef TCOFLUSH
+           return TCOFLUSH;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "TCOOFF"))
+#ifdef TCOOFF
+           return TCOOFF;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "TCOON"))
+#ifdef TCOON
+           return TCOON;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "TCSADRAIN"))
+#ifdef TCSADRAIN
+           return TCSADRAIN;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "TCSAFLUSH"))
+#ifdef TCSAFLUSH
+           return TCSAFLUSH;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "TCSANOW"))
+#ifdef TCSANOW
+           return TCSANOW;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "TMP_MAX"))
+#ifdef TMP_MAX
+           return TMP_MAX;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "TOSTOP"))
+#ifdef TOSTOP
+           return TOSTOP;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "TZNAME_MAX"))
+#ifdef TZNAME_MAX
+           return TZNAME_MAX;
+#else
+           goto not_there;
+#endif
+       break;
+    case 'U':
+       if (strEQ(name, "UCHAR_MAX"))
+#ifdef UCHAR_MAX
+           return UCHAR_MAX;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "UINT_MAX"))
+#ifdef UINT_MAX
+           return UINT_MAX;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "ULONG_MAX"))
+#ifdef ULONG_MAX
+           return ULONG_MAX;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "USHRT_MAX"))
+#ifdef USHRT_MAX
+           return USHRT_MAX;
+#else
+           goto not_there;
+#endif
+       break;
+    case 'V':
+       if (strEQ(name, "VEOF"))
+#ifdef VEOF
+           return VEOF;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "VEOL"))
+#ifdef VEOL
+           return VEOL;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "VERASE"))
+#ifdef VERASE
+           return VERASE;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "VINTR"))
+#ifdef VINTR
+           return VINTR;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "VKILL"))
+#ifdef VKILL
+           return VKILL;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "VMIN"))
+#ifdef VMIN
+           return VMIN;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "VQUIT"))
+#ifdef VQUIT
+           return VQUIT;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "VSTART"))
+#ifdef VSTART
+           return VSTART;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "VSTOP"))
+#ifdef VSTOP
+           return VSTOP;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "VSUSP"))
+#ifdef VSUSP
+           return VSUSP;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "VTIME"))
+#ifdef VTIME
+           return VTIME;
+#else
+           goto not_there;
+#endif
+       break;
+    case 'W':
+       if (strEQ(name, "W_OK"))
+#ifdef W_OK
+           return W_OK;
+#else
+           goto not_there;
+#endif
+#ifdef WEXITSTATUS
+       if (strEQ(name, "WEXITSTATUS")) return WEXITSTATUS(arg);
+#endif
+#ifdef WIFEXITED
+       if (strEQ(name, "WIFEXITED")) return WIFEXITED(arg);
+#endif
+#ifdef WIFSIGNALED
+       if (strEQ(name, "WIFSIGNALED")) return WIFSIGNALED(arg);
+#endif
+#ifdef WIFSTOPPED
+       if (strEQ(name, "WIFSTOPPED")) return WIFSTOPPED(arg);
+#endif
+       if (strEQ(name, "WNOHANG"))
+#ifdef WNOHANG
+           return WNOHANG;
+#else
+           goto not_there;
+#endif
+#ifdef WSTOPSIG
+       if (strEQ(name, "WSTOPSIG")) return WSTOPSIG(arg);
+#endif
+#ifdef WTERMSIG
+       if (strEQ(name, "WTERMSIG")) return WTERMSIG(arg);
+#endif
+       if (strEQ(name, "WUNTRACED"))
+#ifdef WUNTRACED
+           return WUNTRACED;
+#else
+           goto not_there;
+#endif
+       break;
+    case 'X':
+       if (strEQ(name, "X_OK"))
+#ifdef X_OK
+           return X_OK;
+#else
+           goto not_there;
+#endif
+       break;
+    case '_':
+       if (strnEQ(name, "_PC_", 4)) {
+           if (strEQ(name, "_PC_CHOWN_RESTRICTED"))
+#ifdef _PC_CHOWN_RESTRICTED
+               return _PC_CHOWN_RESTRICTED;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "_PC_LINK_MAX"))
+#ifdef _PC_LINK_MAX
+               return _PC_LINK_MAX;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "_PC_MAX_CANON"))
+#ifdef _PC_MAX_CANON
+               return _PC_MAX_CANON;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "_PC_MAX_INPUT"))
+#ifdef _PC_MAX_INPUT
+               return _PC_MAX_INPUT;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "_PC_NAME_MAX"))
+#ifdef _PC_NAME_MAX
+               return _PC_NAME_MAX;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "_PC_NO_TRUNC"))
+#ifdef _PC_NO_TRUNC
+               return _PC_NO_TRUNC;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "_PC_PATH_MAX"))
+#ifdef _PC_PATH_MAX
+               return _PC_PATH_MAX;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "_PC_PIPE_BUF"))
+#ifdef _PC_PIPE_BUF
+               return _PC_PIPE_BUF;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "_PC_VDISABLE"))
+#ifdef _PC_VDISABLE
+               return _PC_VDISABLE;
+#else
+               goto not_there;
+#endif
+           break;
+       }
+       if (strnEQ(name, "_POSIX_", 7)) {
+           if (strEQ(name, "_POSIX_ARG_MAX"))
+#ifdef _POSIX_ARG_MAX
+               return _POSIX_ARG_MAX;
+#else
+               return 0;
+#endif
+           if (strEQ(name, "_POSIX_CHILD_MAX"))
+#ifdef _POSIX_CHILD_MAX
+               return _POSIX_CHILD_MAX;
+#else
+               return 0;
+#endif
+           if (strEQ(name, "_POSIX_CHOWN_RESTRICTED"))
+#ifdef _POSIX_CHOWN_RESTRICTED
+               return _POSIX_CHOWN_RESTRICTED;
+#else
+               return 0;
+#endif
+           if (strEQ(name, "_POSIX_JOB_CONTROL"))
+#ifdef _POSIX_JOB_CONTROL
+               return _POSIX_JOB_CONTROL;
+#else
+               return 0;
+#endif
+           if (strEQ(name, "_POSIX_LINK_MAX"))
+#ifdef _POSIX_LINK_MAX
+               return _POSIX_LINK_MAX;
+#else
+               return 0;
+#endif
+           if (strEQ(name, "_POSIX_MAX_CANON"))
+#ifdef _POSIX_MAX_CANON
+               return _POSIX_MAX_CANON;
+#else
+               return 0;
+#endif
+           if (strEQ(name, "_POSIX_MAX_INPUT"))
+#ifdef _POSIX_MAX_INPUT
+               return _POSIX_MAX_INPUT;
+#else
+               return 0;
+#endif
+           if (strEQ(name, "_POSIX_NAME_MAX"))
+#ifdef _POSIX_NAME_MAX
+               return _POSIX_NAME_MAX;
+#else
+               return 0;
+#endif
+           if (strEQ(name, "_POSIX_NGROUPS_MAX"))
+#ifdef _POSIX_NGROUPS_MAX
+               return _POSIX_NGROUPS_MAX;
+#else
+               return 0;
+#endif
+           if (strEQ(name, "_POSIX_NO_TRUNC"))
+#ifdef _POSIX_NO_TRUNC
+               return _POSIX_NO_TRUNC;
+#else
+               return 0;
+#endif
+           if (strEQ(name, "_POSIX_OPEN_MAX"))
+#ifdef _POSIX_OPEN_MAX
+               return _POSIX_OPEN_MAX;
+#else
+               return 0;
+#endif
+           if (strEQ(name, "_POSIX_PATH_MAX"))
+#ifdef _POSIX_PATH_MAX
+               return _POSIX_PATH_MAX;
+#else
+               return 0;
+#endif
+           if (strEQ(name, "_POSIX_PIPE_BUF"))
+#ifdef _POSIX_PIPE_BUF
+               return _POSIX_PIPE_BUF;
+#else
+               return 0;
+#endif
+           if (strEQ(name, "_POSIX_SAVED_IDS"))
+#ifdef _POSIX_SAVED_IDS
+               return _POSIX_SAVED_IDS;
+#else
+               return 0;
+#endif
+           if (strEQ(name, "_POSIX_SSIZE_MAX"))
+#ifdef _POSIX_SSIZE_MAX
+               return _POSIX_SSIZE_MAX;
+#else
+               return 0;
+#endif
+           if (strEQ(name, "_POSIX_STREAM_MAX"))
+#ifdef _POSIX_STREAM_MAX
+               return _POSIX_STREAM_MAX;
+#else
+               return 0;
+#endif
+           if (strEQ(name, "_POSIX_TZNAME_MAX"))
+#ifdef _POSIX_TZNAME_MAX
+               return _POSIX_TZNAME_MAX;
+#else
+               return 0;
+#endif
+           if (strEQ(name, "_POSIX_VDISABLE"))
+#ifdef _POSIX_VDISABLE
+               return _POSIX_VDISABLE;
+#else
+               return 0;
+#endif
+           if (strEQ(name, "_POSIX_VERSION"))
+#ifdef _POSIX_VERSION
+               return _POSIX_VERSION;
+#else
+               return 0;
+#endif
+           break;
+       }
+       if (strnEQ(name, "_SC_", 4)) {
+           if (strEQ(name, "_SC_ARG_MAX"))
+#ifdef _SC_ARG_MAX
+               return _SC_ARG_MAX;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "_SC_CHILD_MAX"))
+#ifdef _SC_CHILD_MAX
+               return _SC_CHILD_MAX;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "_SC_CLK_TCK"))
+#ifdef _SC_CLK_TCK
+               return _SC_CLK_TCK;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "_SC_JOB_CONTROL"))
+#ifdef _SC_JOB_CONTROL
+               return _SC_JOB_CONTROL;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "_SC_NGROUPS_MAX"))
+#ifdef _SC_NGROUPS_MAX
+               return _SC_NGROUPS_MAX;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "_SC_OPEN_MAX"))
+#ifdef _SC_OPEN_MAX
+               return _SC_OPEN_MAX;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "_SC_SAVED_IDS"))
+#ifdef _SC_SAVED_IDS
+               return _SC_SAVED_IDS;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "_SC_STREAM_MAX"))
+#ifdef _SC_STREAM_MAX
+               return _SC_STREAM_MAX;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "_SC_TZNAME_MAX"))
+#ifdef _SC_TZNAME_MAX
+               return _SC_TZNAME_MAX;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "_SC_VERSION"))
+#ifdef _SC_VERSION
+               return _SC_VERSION;
+#else
+               goto not_there;
+#endif
+           break;
+       }
+       if (strEQ(name, "_IOFBF"))
+#ifdef _IOFBF
+           return _IOFBF;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "_IOLBF"))
+#ifdef _IOLBF
+           return _IOLBF;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "_IONBF"))
+#ifdef _IONBF
+           return _IONBF;
+#else
+           goto not_there;
+#endif
+       break;
+    }
+    errno = EINVAL;
+    return 0;
+
+not_there:
+    errno = ENOENT;
+    return 0;
+}
+
+static int
+XS_POSIX__SigSet_new(ix, ax, items)
+register int ix;
+register int ax;
+register int items;
+{
+    if (items < 0) {
+       croak("Usage: POSIX::SigSet::new(packname = \"POSIX::SigSet\", ...)");
+    }
+    {
+       char *  packname;
+       POSIX__SigSet   RETVAL;
+
+       if (items < 1)
+           packname = "POSIX::SigSet";
+       else {
+           packname = SvPV(ST(1),na);
+       }
+       {
+           int i;
+           RETVAL = (sigset_t*)safemalloc(sizeof(sigset_t));
+           sigemptyset(RETVAL);
+           for (i = 2; i <= items; i++)
+               sigaddset(RETVAL, SvIV(ST(i)));
+       }
+       ST(0) = sv_newmortal();
+       sv_setptrobj(ST(0), RETVAL, "POSIX::SigSet");
+    }
+    return ax;
+}
+
+static int
+XS_POSIX__SigSet_DESTROY(ix, ax, items)
+register int ix;
+register int ax;
+register int items;
+{
+    if (items != 1) {
+       croak("Usage: POSIX::SigSet::DESTROY(sigset)");
+    }
+    {
+       POSIX__SigSet   sigset;
+
+       if (SvROK(ST(1)))
+           sigset = (POSIX__SigSet)(unsigned long)SvNV((SV*)SvRV(ST(1)));
+       else
+           croak("sigset is not a reference");
+       safefree(sigset);
+    }
+    return ax;
+}
+
+static int
+XS_POSIX__SigSet_sigaddset(ix, ax, items)
+register int ix;
+register int ax;
+register int items;
+{
+    if (items != 2) {
+       croak("Usage: POSIX::SigSet::addset(sigset, sig)");
+    }
+    {
+       POSIX__SigSet   sigset;
+       int     sig = (int)SvIV(ST(2));
+       SysRet  RETVAL;
+
+       if (sv_isa(ST(1), "POSIX::SigSet"))
+           sigset = (POSIX__SigSet)(unsigned long)SvNV((SV*)SvRV(ST(1)));
+       else
+           croak("sigset is not of type POSIX::SigSet");
+
+       RETVAL = sigaddset(sigset, sig);
+       ST(0) = sv_newmortal();
+       if (RETVAL != -1) {
+           if (RETVAL == 0)
+               sv_setpvn(ST(0), "0 but true", 10);
+           else
+               sv_setiv(ST(0), (I32)RETVAL);
+       }
+    }
+    return ax;
+}
+
+static int
+XS_POSIX__SigSet_sigdelset(ix, ax, items)
+register int ix;
+register int ax;
+register int items;
+{
+    if (items != 2) {
+       croak("Usage: POSIX::SigSet::delset(sigset, sig)");
+    }
+    {
+       POSIX__SigSet   sigset;
+       int     sig = (int)SvIV(ST(2));
+       SysRet  RETVAL;
+
+       if (sv_isa(ST(1), "POSIX::SigSet"))
+           sigset = (POSIX__SigSet)(unsigned long)SvNV((SV*)SvRV(ST(1)));
+       else
+           croak("sigset is not of type POSIX::SigSet");
+
+       RETVAL = sigdelset(sigset, sig);
+       ST(0) = sv_newmortal();
+       if (RETVAL != -1) {
+           if (RETVAL == 0)
+               sv_setpvn(ST(0), "0 but true", 10);
+           else
+               sv_setiv(ST(0), (I32)RETVAL);
+       }
+    }
+    return ax;
+}
+
+static int
+XS_POSIX__SigSet_sigemptyset(ix, ax, items)
+register int ix;
+register int ax;
+register int items;
+{
+    if (items != 1) {
+       croak("Usage: POSIX::SigSet::emptyset(sigset)");
+    }
+    {
+       POSIX__SigSet   sigset;
+       SysRet  RETVAL;
+
+       if (sv_isa(ST(1), "POSIX::SigSet"))
+           sigset = (POSIX__SigSet)(unsigned long)SvNV((SV*)SvRV(ST(1)));
+       else
+           croak("sigset is not of type POSIX::SigSet");
+
+       RETVAL = sigemptyset(sigset);
+       ST(0) = sv_newmortal();
+       if (RETVAL != -1) {
+           if (RETVAL == 0)
+               sv_setpvn(ST(0), "0 but true", 10);
+           else
+               sv_setiv(ST(0), (I32)RETVAL);
+       }
+    }
+    return ax;
+}
+
+static int
+XS_POSIX__SigSet_sigfillset(ix, ax, items)
+register int ix;
+register int ax;
+register int items;
+{
+    if (items != 1) {
+       croak("Usage: POSIX::SigSet::fillset(sigset)");
+    }
+    {
+       POSIX__SigSet   sigset;
+       SysRet  RETVAL;
+
+       if (sv_isa(ST(1), "POSIX::SigSet"))
+           sigset = (POSIX__SigSet)(unsigned long)SvNV((SV*)SvRV(ST(1)));
+       else
+           croak("sigset is not of type POSIX::SigSet");
+
+       RETVAL = sigfillset(sigset);
+       ST(0) = sv_newmortal();
+       if (RETVAL != -1) {
+           if (RETVAL == 0)
+               sv_setpvn(ST(0), "0 but true", 10);
+           else
+               sv_setiv(ST(0), (I32)RETVAL);
+       }
+    }
+    return ax;
+}
+
+static int
+XS_POSIX__SigSet_sigismember(ix, ax, items)
+register int ix;
+register int ax;
+register int items;
+{
+    if (items != 2) {
+       croak("Usage: POSIX::SigSet::ismember(sigset, sig)");
+    }
+    {
+       POSIX__SigSet   sigset;
+       int     sig = (int)SvIV(ST(2));
+       int     RETVAL;
+
+       if (sv_isa(ST(1), "POSIX::SigSet"))
+           sigset = (POSIX__SigSet)(unsigned long)SvNV((SV*)SvRV(ST(1)));
+       else
+           croak("sigset is not of type POSIX::SigSet");
+
+       RETVAL = sigismember(sigset, sig);
+       ST(0) = sv_newmortal();
+       sv_setiv(ST(0), (I32)RETVAL);
+    }
+    return ax;
+}
+
+static int
+XS_POSIX_constant(ix, ax, items)
+register int ix;
+register int ax;
+register int items;
+{
+    if (items != 2) {
+       croak("Usage: POSIX::constant(name,arg)");
+    }
+    {
+       char *  name = SvPV(ST(1),na);
+       int     arg = (int)SvIV(ST(2));
+       int     RETVAL;
+
+       RETVAL = constant(name, arg);
+       ST(0) = sv_newmortal();
+       sv_setiv(ST(0), (I32)RETVAL);
+    }
+    return ax;
+}
+
+static int
+XS_POSIX_isalnum(ix, ax, items)
+register int ix;
+register int ax;
+register int items;
+{
+    if (items != 1) {
+       croak("Usage: POSIX::isalnum(charstring)");
+    }
+    {
+       char *  charstring = SvPV(ST(1),na);
+       int     RETVAL;
+       char *s;
+       RETVAL = 1;
+       for (s = charstring; *s; s++)
+           if (!isalnum(*s))
+               RETVAL = 0;
+       ST(0) = sv_newmortal();
+       sv_setiv(ST(0), (I32)RETVAL);
+    }
+    return ax;
+}
+
+static int
+XS_POSIX_isalpha(ix, ax, items)
+register int ix;
+register int ax;
+register int items;
+{
+    if (items != 1) {
+       croak("Usage: POSIX::isalpha(charstring)");
+    }
+    {
+       char *  charstring = SvPV(ST(1),na);
+       int     RETVAL;
+       char *s;
+       RETVAL = 1;
+       for (s = charstring; *s; s++)
+           if (!isalpha(*s))
+               RETVAL = 0;
+       ST(0) = sv_newmortal();
+       sv_setiv(ST(0), (I32)RETVAL);
+    }
+    return ax;
+}
+
+static int
+XS_POSIX_iscntrl(ix, ax, items)
+register int ix;
+register int ax;
+register int items;
+{
+    if (items != 1) {
+       croak("Usage: POSIX::iscntrl(charstring)");
+    }
+    {
+       char *  charstring = SvPV(ST(1),na);
+       int     RETVAL;
+       char *s;
+       RETVAL = 1;
+       for (s = charstring; *s; s++)
+           if (!iscntrl(*s))
+               RETVAL = 0;
+       ST(0) = sv_newmortal();
+       sv_setiv(ST(0), (I32)RETVAL);
+    }
+    return ax;
+}
+
+static int
+XS_POSIX_isdigit(ix, ax, items)
+register int ix;
+register int ax;
+register int items;
+{
+    if (items != 1) {
+       croak("Usage: POSIX::isdigit(charstring)");
+    }
+    {
+       char *  charstring = SvPV(ST(1),na);
+       int     RETVAL;
+       char *s;
+       RETVAL = 1;
+       for (s = charstring; *s; s++)
+           if (!isdigit(*s))
+               RETVAL = 0;
+       ST(0) = sv_newmortal();
+       sv_setiv(ST(0), (I32)RETVAL);
+    }
+    return ax;
+}
+
+static int
+XS_POSIX_isgraph(ix, ax, items)
+register int ix;
+register int ax;
+register int items;
+{
+    if (items != 1) {
+       croak("Usage: POSIX::isgraph(charstring)");
+    }
+    {
+       char *  charstring = SvPV(ST(1),na);
+       int     RETVAL;
+       char *s;
+       RETVAL = 1;
+       for (s = charstring; *s; s++)
+           if (!isgraph(*s))
+               RETVAL = 0;
+       ST(0) = sv_newmortal();
+       sv_setiv(ST(0), (I32)RETVAL);
+    }
+    return ax;
+}
+
+static int
+XS_POSIX_islower(ix, ax, items)
+register int ix;
+register int ax;
+register int items;
+{
+    if (items != 1) {
+       croak("Usage: POSIX::islower(charstring)");
+    }
+    {
+       char *  charstring = SvPV(ST(1),na);
+       int     RETVAL;
+       char *s;
+       RETVAL = 1;
+       for (s = charstring; *s; s++)
+           if (!islower(*s))
+               RETVAL = 0;
+       ST(0) = sv_newmortal();
+       sv_setiv(ST(0), (I32)RETVAL);
+    }
+    return ax;
+}
+
+static int
+XS_POSIX_isprint(ix, ax, items)
+register int ix;
+register int ax;
+register int items;
+{
+    if (items != 1) {
+       croak("Usage: POSIX::isprint(charstring)");
+    }
+    {
+       char *  charstring = SvPV(ST(1),na);
+       int     RETVAL;
+       char *s;
+       RETVAL = 1;
+       for (s = charstring; *s; s++)
+           if (!isprint(*s))
+               RETVAL = 0;
+       ST(0) = sv_newmortal();
+       sv_setiv(ST(0), (I32)RETVAL);
+    }
+    return ax;
+}
+
+static int
+XS_POSIX_ispunct(ix, ax, items)
+register int ix;
+register int ax;
+register int items;
+{
+    if (items != 1) {
+       croak("Usage: POSIX::ispunct(charstring)");
+    }
+    {
+       char *  charstring = SvPV(ST(1),na);
+       int     RETVAL;
+       char *s;
+       RETVAL = 1;
+       for (s = charstring; *s; s++)
+           if (!ispunct(*s))
+               RETVAL = 0;
+       ST(0) = sv_newmortal();
+       sv_setiv(ST(0), (I32)RETVAL);
+    }
+    return ax;
+}
+
+static int
+XS_POSIX_isspace(ix, ax, items)
+register int ix;
+register int ax;
+register int items;
+{
+    if (items != 1) {
+       croak("Usage: POSIX::isspace(charstring)");
+    }
+    {
+       char *  charstring = SvPV(ST(1),na);
+       int     RETVAL;
+       char *s;
+       RETVAL = 1;
+       for (s = charstring; *s; s++)
+           if (!isspace(*s))
+               RETVAL = 0;
+       ST(0) = sv_newmortal();
+       sv_setiv(ST(0), (I32)RETVAL);
+    }
+    return ax;
+}
+
+static int
+XS_POSIX_isupper(ix, ax, items)
+register int ix;
+register int ax;
+register int items;
+{
+    if (items != 1) {
+       croak("Usage: POSIX::isupper(charstring)");
+    }
+    {
+       char *  charstring = SvPV(ST(1),na);
+       int     RETVAL;
+       char *s;
+       RETVAL = 1;
+       for (s = charstring; *s; s++)
+           if (!isupper(*s))
+               RETVAL = 0;
+       ST(0) = sv_newmortal();
+       sv_setiv(ST(0), (I32)RETVAL);
+    }
+    return ax;
+}
+
+static int
+XS_POSIX_isxdigit(ix, ax, items)
+register int ix;
+register int ax;
+register int items;
+{
+    if (items != 1) {
+       croak("Usage: POSIX::isxdigit(charstring)");
+    }
+    {
+       char *  charstring = SvPV(ST(1),na);
+       int     RETVAL;
+       char *s;
+       RETVAL = 1;
+       for (s = charstring; *s; s++)
+           if (!isxdigit(*s))
+               RETVAL = 0;
+       ST(0) = sv_newmortal();
+       sv_setiv(ST(0), (I32)RETVAL);
+    }
+    return ax;
+}
+
+static int
+XS_POSIX_open(ix, ax, items)
+register int ix;
+register int ax;
+register int items;
+{
+    if (items < 1 || items > 3) {
+       croak("Usage: POSIX::open(filename, flags = O_RDONLY, mode = 0666)");
+    }
+    {
+       char *  filename = SvPV(ST(1),na);
+       int     flags;
+       int     mode;
+       SysRet  RETVAL;
+
+       if (items < 2)
+           flags = O_RDONLY;
+       else {
+           flags = (int)SvIV(ST(2));
+       }
+
+       if (items < 3)
+           mode = 0666;
+       else {
+           mode = (int)SvIV(ST(3));
+       }
+
+       RETVAL = open(filename, flags, mode);
+       ST(0) = sv_newmortal();
+       if (RETVAL != -1) {
+           if (RETVAL == 0)
+               sv_setpvn(ST(0), "0 but true", 10);
+           else
+               sv_setiv(ST(0), (I32)RETVAL);
+       }
+    }
+    return ax;
+}
+
+static int
+XS_POSIX_localeconv(ix, ax, items)
+register int ix;
+register int ax;
+register int items;
+{
+    if (items != 0) {
+       croak("Usage: POSIX::localeconv()");
+    }
+    {
+       HV *    RETVAL;
+       struct lconv *lcbuf;
+       RETVAL = newHV();
+       if (lcbuf = localeconv()) {
+           /* the strings */
+           if (lcbuf->decimal_point && *lcbuf->decimal_point)
+               hv_store(RETVAL, "decimal_point", 13,
+                   newSVpv(lcbuf->decimal_point, 0), 0);
+           if (lcbuf->thousands_sep && *lcbuf->thousands_sep)
+               hv_store(RETVAL, "thousands_sep", 13,
+                   newSVpv(lcbuf->thousands_sep, 0), 0);
+           if (lcbuf->grouping && *lcbuf->grouping)
+               hv_store(RETVAL, "grouping", 8,
+                   newSVpv(lcbuf->grouping, 0), 0);
+           if (lcbuf->int_curr_symbol && *lcbuf->int_curr_symbol)
+               hv_store(RETVAL, "int_curr_symbol", 15,
+                   newSVpv(lcbuf->int_curr_symbol, 0), 0);
+           if (lcbuf->currency_symbol && *lcbuf->currency_symbol)
+               hv_store(RETVAL, "currency_symbol", 15,
+                   newSVpv(lcbuf->currency_symbol, 0), 0);
+           if (lcbuf->mon_decimal_point && *lcbuf->mon_decimal_point)
+               hv_store(RETVAL, "mon_decimal_point", 17,
+                   newSVpv(lcbuf->mon_decimal_point, 0), 0);
+           if (lcbuf->mon_thousands_sep && *lcbuf->mon_thousands_sep)
+               hv_store(RETVAL, "mon_thousands_sep", 17,
+                   newSVpv(lcbuf->mon_thousands_sep, 0), 0);
+           if (lcbuf->mon_grouping && *lcbuf->mon_grouping)
+               hv_store(RETVAL, "mon_grouping", 12,
+                   newSVpv(lcbuf->mon_grouping, 0), 0);
+           if (lcbuf->positive_sign && *lcbuf->positive_sign)
+               hv_store(RETVAL, "positive_sign", 13,
+                   newSVpv(lcbuf->positive_sign, 0), 0);
+           if (lcbuf->negative_sign && *lcbuf->negative_sign)
+               hv_store(RETVAL, "negative_sign", 13,
+                   newSVpv(lcbuf->negative_sign, 0), 0);
+           /* the integers */
+           if (lcbuf->int_frac_digits != CHAR_MAX)
+               hv_store(RETVAL, "int_frac_digits", 15,
+                   newSViv(lcbuf->int_frac_digits), 0);
+           if (lcbuf->frac_digits != CHAR_MAX)
+               hv_store(RETVAL, "frac_digits", 11,
+                   newSViv(lcbuf->frac_digits), 0);
+           if (lcbuf->p_cs_precedes != CHAR_MAX)
+               hv_store(RETVAL, "p_cs_precedes", 13,
+                   newSViv(lcbuf->p_cs_precedes), 0);
+           if (lcbuf->p_sep_by_space != CHAR_MAX)
+               hv_store(RETVAL, "p_sep_by_space", 14,
+                   newSViv(lcbuf->p_sep_by_space), 0);
+           if (lcbuf->n_cs_precedes != CHAR_MAX)
+               hv_store(RETVAL, "n_cs_precedes", 13,
+                   newSViv(lcbuf->n_cs_precedes), 0);
+           if (lcbuf->n_sep_by_space != CHAR_MAX)
+               hv_store(RETVAL, "n_sep_by_space", 14,
+                   newSViv(lcbuf->n_sep_by_space), 0);
+           if (lcbuf->p_sign_posn != CHAR_MAX)
+               hv_store(RETVAL, "p_sign_posn", 11,
+                   newSViv(lcbuf->p_sign_posn), 0);
+           if (lcbuf->n_sign_posn != CHAR_MAX)
+               hv_store(RETVAL, "n_sign_posn", 11,
+                   newSViv(lcbuf->n_sign_posn), 0);
+       }
+       ST(0) = newRV((SV*)RETVAL);
+       sv_2mortal(ST(0));
+    }
+    return ax;
+}
+
+static int
+XS_POSIX_setlocale(ix, ax, items)
+register int ix;
+register int ax;
+register int items;
+{
+    if (items != 2) {
+       croak("Usage: POSIX::setlocale(category, locale)");
+    }
+    {
+       int     category = (int)SvIV(ST(1));
+       char *  locale = SvPV(ST(2),na);
+       char *  RETVAL;
+
+       RETVAL = setlocale(category, locale);
+       ST(0) = sv_newmortal();
+       sv_setpv(ST(0), RETVAL);
+    }
+    return ax;
+}
+
+static int
+XS_POSIX_acos(ix, ax, items)
+register int ix;
+register int ax;
+register int items;
+{
+    if (items != 1) {
+       croak("Usage: POSIX::acos(x)");
+    }
+    {
+       double  x = SvNV(ST(1));
+       double  RETVAL;
+
+       RETVAL = acos(x);
+       ST(0) = sv_newmortal();
+       sv_setnv(ST(0), RETVAL);
+    }
+    return ax;
+}
+
+static int
+XS_POSIX_asin(ix, ax, items)
+register int ix;
+register int ax;
+register int items;
+{
+    if (items != 1) {
+       croak("Usage: POSIX::asin(x)");
+    }
+    {
+       double  x = SvNV(ST(1));
+       double  RETVAL;
+
+       RETVAL = asin(x);
+       ST(0) = sv_newmortal();
+       sv_setnv(ST(0), RETVAL);
+    }
+    return ax;
+}
+
+static int
+XS_POSIX_atan(ix, ax, items)
+register int ix;
+register int ax;
+register int items;
+{
+    if (items != 1) {
+       croak("Usage: POSIX::atan(x)");
+    }
+    {
+       double  x = SvNV(ST(1));
+       double  RETVAL;
+
+       RETVAL = atan(x);
+       ST(0) = sv_newmortal();
+       sv_setnv(ST(0), RETVAL);
+    }
+    return ax;
+}
+
+static int
+XS_POSIX_ceil(ix, ax, items)
+register int ix;
+register int ax;
+register int items;
+{
+    if (items != 1) {
+       croak("Usage: POSIX::ceil(x)");
+    }
+    {
+       double  x = SvNV(ST(1));
+       double  RETVAL;
+
+       RETVAL = ceil(x);
+       ST(0) = sv_newmortal();
+       sv_setnv(ST(0), RETVAL);
+    }
+    return ax;
+}
+
+static int
+XS_POSIX_cosh(ix, ax, items)
+register int ix;
+register int ax;
+register int items;
+{
+    if (items != 1) {
+       croak("Usage: POSIX::cosh(x)");
+    }
+    {
+       double  x = SvNV(ST(1));
+       double  RETVAL;
 
-#define HAS_UNAME
+       RETVAL = cosh(x);
+       ST(0) = sv_newmortal();
+       sv_setnv(ST(0), RETVAL);
+    }
+    return ax;
+}
 
-#ifndef HAS_GETPGRP
-#define getpgrp(a,b) not_here("getpgrp")
-#endif
-#ifndef HAS_NICE
-#define nice(a) not_here("nice")
-#endif
-#ifndef HAS_READLINK
-#define readlink(a,b,c) not_here("readlink")
-#endif
-#ifndef HAS_SETPGID
-#define setpgid(a,b) not_here("setpgid")
-#endif
-#ifndef HAS_SETPGRP
-#define setpgrp(a,b) not_here("setpgrp")
-#endif
-#ifndef HAS_SETSID
-#define setsid() not_here("setsid")
-#endif
-#ifndef HAS_SYMLINK
-#define symlink(a,b) not_here("symlink")
-#endif
-#ifndef HAS_TCGETPGRP
-#define tcgetpgrp(a) not_here("tcgetpgrp")
-#endif
-#ifndef HAS_TCSETPGRP
-#define tcsetpgrp(a,b) not_here("tcsetpgrp")
-#endif
-#ifndef HAS_TIMES
-#define times(a) not_here("times")
-#endif
-#ifndef HAS_UNAME
-#define uname(a) not_here("uname")
-#endif
-#ifndef HAS_WAITPID
-#define waitpid(a,b,c) not_here("waitpid")
-#endif
+static int
+XS_POSIX_floor(ix, ax, items)
+register int ix;
+register int ax;
+register int items;
+{
+    if (items != 1) {
+       croak("Usage: POSIX::floor(x)");
+    }
+    {
+       double  x = SvNV(ST(1));
+       double  RETVAL;
+
+       RETVAL = floor(x);
+       ST(0) = sv_newmortal();
+       sv_setnv(ST(0), RETVAL);
+    }
+    return ax;
+}
 
 static int
-not_here(s)
-char *s;
+XS_POSIX_fmod(ix, ax, items)
+register int ix;
+register int ax;
+register int items;
 {
-    croak("POSIX::%s not implemented on this architecture", s);
-    return -1;
+    if (items != 2) {
+       croak("Usage: POSIX::fmod(x,y)");
+    }
+    {
+       double  x = SvNV(ST(1));
+       double  y = SvNV(ST(2));
+       double  RETVAL;
+
+       RETVAL = fmod(x, y);
+       ST(0) = sv_newmortal();
+       sv_setnv(ST(0), RETVAL);
+    }
+    return ax;
 }
 
 static int
-XS_POSIX__exit(ix, ax, items)
+XS_POSIX_frexp(ix, ax, items)
 register int ix;
 register int ax;
 register int items;
 {
     if (items != 1) {
-       croak("Usage: POSIX::_exit(status)");
+       croak("Usage: POSIX::frexp(x)");
     }
     {
-       int     status = (int)SvIV(ST(1));
+       double  x = SvNV(ST(1));
+       dSP;
+       int expvar;
+       sp--;
+       /* (We already know stack is long enough.) */
+       PUSHs(sv_2mortal(newSVnv(frexp(x,&expvar))));
+       PUSHs(sv_2mortal(newSViv(expvar)));
+       ax = sp - stack_base;
+    }
+    return ax;
+}
 
-       _exit(status);
+static int
+XS_POSIX_ldexp(ix, ax, items)
+register int ix;
+register int ax;
+register int items;
+{
+    if (items != 2) {
+       croak("Usage: POSIX::ldexp(x,exp)");
+    }
+    {
+       double  x = SvNV(ST(1));
+       int     exp = (int)SvIV(ST(2));
+       double  RETVAL;
+
+       RETVAL = ldexp(x, exp);
+       ST(0) = sv_newmortal();
+       sv_setnv(ST(0), RETVAL);
     }
     return ax;
 }
 
 static int
-XS_POSIX_chdir(ix, ax, items)
+XS_POSIX_log10(ix, ax, items)
 register int ix;
 register int ax;
 register int items;
 {
     if (items != 1) {
-       croak("Usage: POSIX::chdir(path)");
+       croak("Usage: POSIX::log10(x)");
     }
     {
-       char *  path = SvPV(ST(1),na);
-       int     RETVAL;
+       double  x = SvNV(ST(1));
+       double  RETVAL;
 
-       RETVAL = chdir(path);
+       RETVAL = log10(x);
        ST(0) = sv_newmortal();
-       sv_setiv(ST(0), (I32)RETVAL);
+       sv_setnv(ST(0), RETVAL);
     }
     return ax;
 }
 
 static int
-XS_POSIX_chmod(ix, ax, items)
+XS_POSIX_modf(ix, ax, items)
 register int ix;
 register int ax;
 register int items;
 {
-    if (items != 2) {
-       croak("Usage: POSIX::chmod(path, mode)");
+    if (items != 1) {
+       croak("Usage: POSIX::modf(x)");
     }
     {
-       char *  path = SvPV(ST(1),na);
-       mode_t  mode = (int)SvIV(ST(2));
-       int     RETVAL;
+       double  x = SvNV(ST(1));
+       dSP;
+       double intvar;
+       sp--;
+       /* (We already know stack is long enough.) */
+       PUSHs(sv_2mortal(newSVnv(modf(x,&intvar))));
+       PUSHs(sv_2mortal(newSVnv(intvar)));
+       ax = sp - stack_base;
+    }
+    return ax;
+}
+
+static int
+XS_POSIX_sinh(ix, ax, items)
+register int ix;
+register int ax;
+register int items;
+{
+    if (items != 1) {
+       croak("Usage: POSIX::sinh(x)");
+    }
+    {
+       double  x = SvNV(ST(1));
+       double  RETVAL;
 
-       RETVAL = chmod(path, mode);
+       RETVAL = sinh(x);
        ST(0) = sv_newmortal();
-       sv_setiv(ST(0), (I32)RETVAL);
+       sv_setnv(ST(0), RETVAL);
+    }
+    return ax;
+}
+
+static int
+XS_POSIX_tanh(ix, ax, items)
+register int ix;
+register int ax;
+register int items;
+{
+    if (items != 1) {
+       croak("Usage: POSIX::tanh(x)");
+    }
+    {
+       double  x = SvNV(ST(1));
+       double  RETVAL;
+
+       RETVAL = tanh(x);
+       ST(0) = sv_newmortal();
+       sv_setnv(ST(0), RETVAL);
+    }
+    return ax;
+}
+
+static int
+XS_POSIX_sigaction(ix, ax, items)
+register int ix;
+register int ax;
+register int items;
+{
+    if (items < 2 || items > 3) {
+       croak("Usage: POSIX::sigaction(sig, action, oldaction = 0)");
+    }
+    {
+       int     sig = (int)SvIV(ST(1));
+       POSIX__SigAction        action;
+       POSIX__SigAction        oldaction;
+       SysRet  RETVAL;
+
+       if (sv_isa(ST(2), "POSIX::SigAction"))
+           action = (HV*)SvRV(ST(2));
+       else
+           croak("action is not of type POSIX::SigAction");
+
+       if (items < 3)
+           oldaction = 0;
+       else {
+           if (sv_isa(ST(3), "POSIX::SigAction"))
+               oldaction = (HV*)SvRV(ST(3));
+           else
+               croak("oldaction is not of type POSIX::SigAction");
+       }
+
+
+       if (!siggv)
+           gv_fetchpv("SIG", TRUE);
+
+       {
+           struct sigaction act;
+           struct sigaction oact;
+           POSIX__SigSet sigset;
+           SV** svp;
+           SV** sigsvp = hv_fetch(GvHVn(siggv),
+                                sig_name[sig],
+                                strlen(sig_name[sig]),
+                                TRUE);
+
+           /* Remember old handler name if desired. */
+           if (oldaction) {
+               char *hand = SvPVx(*sigsvp, na);
+               svp = hv_fetch(oldaction, "HANDLER", 7, TRUE);
+               sv_setpv(*svp, *hand ? hand : "DEFAULT");
+           }
+
+           if (action) {
+               /* Vector new handler through %SIG.  (We always use sighandler
+                  for the C signal handler, which reads %SIG to dispatch.) */
+               svp = hv_fetch(action, "HANDLER", 7, FALSE);
+               if (!svp)
+                   croak("Can't supply an action without a HANDLER");
+               sv_setpv(*sigsvp, SvPV(*svp, na));
+               mg_set(*sigsvp);        /* handles DEFAULT and IGNORE */
+               act.sa_handler = sighandler;
+
+               /* Set up any desired mask. */
+               svp = hv_fetch(action, "MASK", 4, FALSE);
+               if (svp && sv_isa(*svp, "POSIX::SigSet")) {
+                   sigset = (sigset_t*)(unsigned long)SvNV((SV*)SvRV(*svp));
+                   act.sa_mask = *sigset;
+               }
+               else
+                   sigemptyset(act.sa_mask);
+
+               /* Set up any desired flags. */
+               svp = hv_fetch(action, "FLAGS", 5, FALSE);
+               act.sa_flags = svp ? SvIV(*svp) : 0;
+           }
+
+           /* Now work around sigaction oddities */
+           if (action && oldaction)
+               RETVAL = sigaction(sig, act, oact);
+           else if (action)
+               RETVAL = sigaction(sig, act, (struct sigaction*)0);
+           else if (oldaction)
+               RETVAL = sigaction(sig, (struct sigaction*)0, oact);
+
+           if (oldaction) {
+               /* Get back the mask. */
+               svp = hv_fetch(oldaction, "MASK", 4, TRUE);
+               if (sv_isa(*svp, "POSIX::SigSet"))
+                   sigset = (sigset_t*)(unsigned long)SvNV((SV*)SvRV(*svp));
+               else {
+                   sigset = (sigset_t*)safemalloc(sizeof(sigset_t));
+                   sv_setptrobj(*svp, sigset, "POSIX::SigSet");
+               }
+               *sigset = oact.sa_mask;
+
+               /* Get back the flags. */
+               svp = hv_fetch(oldaction, "FLAGS", 5, TRUE);
+               sv_setiv(*svp, oact.sa_flags);
+           }
+       }
+       ST(0) = sv_newmortal();
+       if (RETVAL != -1) {
+           if (RETVAL == 0)
+               sv_setpvn(ST(0), "0 but true", 10);
+           else
+               sv_setiv(ST(0), (I32)RETVAL);
+       }
+    }
+    return ax;
+}
+
+static int
+XS_POSIX_sigpending(ix, ax, items)
+register int ix;
+register int ax;
+register int items;
+{
+    if (items != 1) {
+       croak("Usage: POSIX::sigpending(sigset)");
+    }
+    {
+       POSIX__SigSet   sigset;
+       SysRet  RETVAL;
+
+       if (sv_isa(ST(1), "POSIX::SigSet"))
+           sigset = (POSIX__SigSet)(unsigned long)SvNV((SV*)SvRV(ST(1)));
+       else
+           croak("sigset is not of type POSIX::SigSet");
+
+       RETVAL = sigpending(sigset);
+       ST(0) = sv_newmortal();
+       if (RETVAL != -1) {
+           if (RETVAL == 0)
+               sv_setpvn(ST(0), "0 but true", 10);
+           else
+               sv_setiv(ST(0), (I32)RETVAL);
+       }
+    }
+    return ax;
+}
+
+static int
+XS_POSIX_sigprocmask(ix, ax, items)
+register int ix;
+register int ax;
+register int items;
+{
+    if (items < 2 || items > 3) {
+       croak("Usage: POSIX::sigprocmask(how, sigset, oldsigset = 0)");
+    }
+    {
+       int     how = (int)SvIV(ST(1));
+       POSIX__SigSet   sigset;
+       POSIX__SigSet   oldsigset;
+       SysRet  RETVAL;
+
+       if (sv_isa(ST(2), "POSIX::SigSet"))
+           sigset = (POSIX__SigSet)(unsigned long)SvNV((SV*)SvRV(ST(2)));
+       else
+           croak("sigset is not of type POSIX::SigSet");
+
+       if (items < 3)
+           oldsigset = 0;
+       else {
+           if (sv_isa(ST(3), "POSIX::SigSet"))
+               oldsigset = (POSIX__SigSet)(unsigned long)SvNV((SV*)SvRV(ST(3)));
+           else
+               croak("oldsigset is not of type POSIX::SigSet");
+       }
+
+       RETVAL = sigprocmask(how, sigset, oldsigset);
+       ST(0) = sv_newmortal();
+       if (RETVAL != -1) {
+           if (RETVAL == 0)
+               sv_setpvn(ST(0), "0 but true", 10);
+           else
+               sv_setiv(ST(0), (I32)RETVAL);
+       }
+    }
+    return ax;
+}
+
+static int
+XS_POSIX_sigsuspend(ix, ax, items)
+register int ix;
+register int ax;
+register int items;
+{
+    if (items != 1) {
+       croak("Usage: POSIX::sigsuspend(signal_mask)");
+    }
+    {
+       POSIX__SigSet   signal_mask;
+       SysRet  RETVAL;
+
+       if (sv_isa(ST(1), "POSIX::SigSet"))
+           signal_mask = (POSIX__SigSet)(unsigned long)SvNV((SV*)SvRV(ST(1)));
+       else
+           croak("signal_mask is not of type POSIX::SigSet");
+
+       RETVAL = sigsuspend(signal_mask);
+       ST(0) = sv_newmortal();
+       if (RETVAL != -1) {
+           if (RETVAL == 0)
+               sv_setpvn(ST(0), "0 but true", 10);
+           else
+               sv_setiv(ST(0), (I32)RETVAL);
+       }
+    }
+    return ax;
+}
+
+static int
+XS_POSIX__exit(ix, ax, items)
+register int ix;
+register int ax;
+register int items;
+{
+    if (items != 1) {
+       croak("Usage: POSIX::_exit(status)");
+    }
+    {
+       int     status = (int)SvIV(ST(1));
+
+       _exit(status);
     }
     return ax;
 }
@@ -170,27 +3197,6 @@ register int items;
 }
 
 static int
-XS_POSIX_fdopen(ix, ax, items)
-register int ix;
-register int ax;
-register int items;
-{
-    if (items != 2) {
-       croak("Usage: POSIX::fdopen(fd, type)");
-    }
-    {
-       int     fd = (int)SvIV(ST(1));
-       char *  type = SvPV(ST(2),na);
-       FILE *  RETVAL;
-
-       RETVAL = fdopen(fd, type);
-       ST(0) = sv_newmortal();
-       sv_setnv(ST(0), (double)(unsigned long)RETVAL);
-    }
-    return ax;
-}
-
-static int
 XS_POSIX_fstat(ix, ax, items)
 register int ix;
 register int ax;
@@ -329,25 +3335,6 @@ register int items;
 }
 
 static int
-XS_POSIX_open(ix, ax, items)
-register int ix;
-register int ax;
-register int items;
-{
-    if (items != 0) {
-       croak("Usage: POSIX::open()");
-    }
-    {
-       int     RETVAL;
-
-       RETVAL = open();
-       ST(0) = sv_newmortal();
-       sv_setiv(ST(0), (I32)RETVAL);
-    }
-    return ax;
-}
-
-static int
 XS_POSIX_pipe(ix, ax, items)
 register int ix;
 register int ax;
@@ -386,28 +3373,6 @@ register int items;
 }
 
 static int
-XS_POSIX_readlink(ix, ax, items)
-register int ix;
-register int ax;
-register int items;
-{
-    if (items != 3) {
-       croak("Usage: POSIX::readlink(path, buf, bufsiz)");
-    }
-    {
-       char *  path = SvPV(ST(1),na);
-       char * buf = sv_grow(ST(2), SvIV(ST(3)));
-       int     bufsiz = (int)SvIV(ST(3));
-       int     RETVAL;
-
-       RETVAL = readlink(path, buf, bufsiz);
-       ST(0) = sv_newmortal();
-       sv_setiv(ST(0), (I32)RETVAL);
-    }
-    return ax;
-}
-
-static int
 XS_POSIX_rename(ix, ax, items)
 register int ix;
 register int ax;
@@ -692,7 +3657,6 @@ register int items;
        croak("Usage: POSIX::uname()");
     }
     {
-       int     RETVAL;
        dSP;
        struct utsname utsname;
        sp--;
@@ -704,7 +3668,7 @@ register int items;
            PUSHs(sv_2mortal(newSVpv(utsname.version, 0)));
            PUSHs(sv_2mortal(newSVpv(utsname.machine, 0)));
        }
-       return sp - stack_base;
+       ax = sp - stack_base;
     }
     return ax;
 }
@@ -784,7 +3748,6 @@ register int items;
        RETVAL = waitpid(pid, &statusp, options);
        ST(0) = sv_newmortal();
        sv_setiv(ST(0), (I32)RETVAL);
-       sv_setiv(ST(2), (I32)statusp);
     }
     return ax;
 }
@@ -815,13 +3778,49 @@ int items;
 {
     char* file = __FILE__;
 
+    newXSUB("POSIX::SigSet::new", 0, XS_POSIX__SigSet_new, file);
+    newXSUB("POSIX::SigSet::DESTROY", 0, XS_POSIX__SigSet_DESTROY, file);
+    newXSUB("POSIX::SigSet::addset", 0, XS_POSIX__SigSet_sigaddset, file);
+    newXSUB("POSIX::SigSet::delset", 0, XS_POSIX__SigSet_sigdelset, file);
+    newXSUB("POSIX::SigSet::emptyset", 0, XS_POSIX__SigSet_sigemptyset, file);
+    newXSUB("POSIX::SigSet::fillset", 0, XS_POSIX__SigSet_sigfillset, file);
+    newXSUB("POSIX::SigSet::ismember", 0, XS_POSIX__SigSet_sigismember, file);
+    newXSUB("POSIX::constant", 0, XS_POSIX_constant, file);
+    newXSUB("POSIX::isalnum", 0, XS_POSIX_isalnum, file);
+    newXSUB("POSIX::isalpha", 0, XS_POSIX_isalpha, file);
+    newXSUB("POSIX::iscntrl", 0, XS_POSIX_iscntrl, file);
+    newXSUB("POSIX::isdigit", 0, XS_POSIX_isdigit, file);
+    newXSUB("POSIX::isgraph", 0, XS_POSIX_isgraph, file);
+    newXSUB("POSIX::islower", 0, XS_POSIX_islower, file);
+    newXSUB("POSIX::isprint", 0, XS_POSIX_isprint, file);
+    newXSUB("POSIX::ispunct", 0, XS_POSIX_ispunct, file);
+    newXSUB("POSIX::isspace", 0, XS_POSIX_isspace, file);
+    newXSUB("POSIX::isupper", 0, XS_POSIX_isupper, file);
+    newXSUB("POSIX::isxdigit", 0, XS_POSIX_isxdigit, file);
+    newXSUB("POSIX::open", 0, XS_POSIX_open, file);
+    newXSUB("POSIX::localeconv", 0, XS_POSIX_localeconv, file);
+    newXSUB("POSIX::setlocale", 0, XS_POSIX_setlocale, file);
+    newXSUB("POSIX::acos", 0, XS_POSIX_acos, file);
+    newXSUB("POSIX::asin", 0, XS_POSIX_asin, file);
+    newXSUB("POSIX::atan", 0, XS_POSIX_atan, file);
+    newXSUB("POSIX::ceil", 0, XS_POSIX_ceil, file);
+    newXSUB("POSIX::cosh", 0, XS_POSIX_cosh, file);
+    newXSUB("POSIX::floor", 0, XS_POSIX_floor, file);
+    newXSUB("POSIX::fmod", 0, XS_POSIX_fmod, file);
+    newXSUB("POSIX::frexp", 0, XS_POSIX_frexp, file);
+    newXSUB("POSIX::ldexp", 0, XS_POSIX_ldexp, file);
+    newXSUB("POSIX::log10", 0, XS_POSIX_log10, file);
+    newXSUB("POSIX::modf", 0, XS_POSIX_modf, file);
+    newXSUB("POSIX::sinh", 0, XS_POSIX_sinh, file);
+    newXSUB("POSIX::tanh", 0, XS_POSIX_tanh, file);
+    newXSUB("POSIX::sigaction", 0, XS_POSIX_sigaction, file);
+    newXSUB("POSIX::sigpending", 0, XS_POSIX_sigpending, file);
+    newXSUB("POSIX::sigprocmask", 0, XS_POSIX_sigprocmask, file);
+    newXSUB("POSIX::sigsuspend", 0, XS_POSIX_sigsuspend, file);
     newXSUB("POSIX::_exit", 0, XS_POSIX__exit, file);
-    newXSUB("POSIX::chdir", 0, XS_POSIX_chdir, file);
-    newXSUB("POSIX::chmod", 0, XS_POSIX_chmod, file);
     newXSUB("POSIX::close", 0, XS_POSIX_close, file);
     newXSUB("POSIX::dup", 0, XS_POSIX_dup, file);
     newXSUB("POSIX::dup2", 0, XS_POSIX_dup2, file);
-    newXSUB("POSIX::fdopen", 0, XS_POSIX_fdopen, file);
     newXSUB("POSIX::fstat", 0, XS_POSIX_fstat, file);
     newXSUB("POSIX::getpgrp", 0, XS_POSIX_getpgrp, file);
     newXSUB("POSIX::link", 0, XS_POSIX_link, file);
@@ -829,10 +3828,8 @@ int items;
     newXSUB("POSIX::lstat", 0, XS_POSIX_lstat, file);
     newXSUB("POSIX::mkdir", 0, XS_POSIX_mkdir, file);
     newXSUB("POSIX::nice", 0, XS_POSIX_nice, file);
-    newXSUB("POSIX::open", 0, XS_POSIX_open, file);
     newXSUB("POSIX::pipe", 0, XS_POSIX_pipe, file);
     newXSUB("POSIX::read", 0, XS_POSIX_read, file);
-    newXSUB("POSIX::readlink", 0, XS_POSIX_readlink, file);
     newXSUB("POSIX::rename", 0, XS_POSIX_rename, file);
     newXSUB("POSIX::rmdir", 0, XS_POSIX_rmdir, file);
     newXSUB("POSIX::setgid", 0, XS_POSIX_setgid, file);
diff --git a/README b/README
index 4c39a20..beec54a 100644 (file)
--- a/README
+++ b/README
@@ -1,11 +1,4 @@
-This is an unsupported, pre-release version of Perl 5.0.  It is expected
-to work only on a Sparc architecture machine.  NO CONFIGURE SUPPORT IS
-PROVIDED, despite what it says below.  In fact, if you succeed in
-configuring and making a new makefile, you'll probably overwrite the
-only makefile that works.  Note that a SunOS executable comes with the
-kit, so you may not need to compile at all.  See file Changes for a
-list of new features.  If you look at t/op/ref.t you'll see some of
-them in use.  perl -Dxst is also fun.
+[This is an unsupported, pre-release version of Perl 5.0.]
 
                           Perl Kit, Version 5.0
 
diff --git a/README.Conf b/README.Conf
new file mode 100644 (file)
index 0000000..0ceab96
--- /dev/null
@@ -0,0 +1,64 @@
+From: doughera@lafcol.lafayette.edu (Andy Dougherty
+Subject: First stab at Configure Support for perl5alpha
+Date: Mon Apr  4 15:13:50 EDT 1994
+
+I've updated Configure to support perl5alpha7.  Consider this a
+first attempt.  I am willing to continue to develop and coordinate 
+improvement on this.  I've included the metaconfig units (in the U/
+directory) that I developed for this.  New units, or fixes to these,
+are welcome.
+
+Here's what should work:
+   -You should be able to Configure and run miniperl on any platform
+    that supported perl4.
+
+   -Configure should be more amenable to hints.  In particular,
+    you can remove directories from the library search path with
+    a hints file.  See hints/solaris_2_3.sh for an example.
+
+Here's what needs improvement:
+   -Including dynamic loading on works on SunOS 4.1.x, as far as I
+    know, but nowhere else.  I don't understand enough about what's
+    going on to put in stub functions for those who might want/have to
+    use another dynamic linking package or static linking.  Configure
+    assumes you want to use the dl.c source file if you try to use
+    dynamic linking.  Still, you should be able to get miniperl up and
+    running.
+
+   -I haven't made any changes to installperl.
+
+   -Makefile.SH (and hence makefile) should arrange to pick up the
+    appropriate .pm modules from the extensions directory and install
+    them.  I haven't done anything about that.
+
+   -I didn't incorporate any of the Configure changes into the
+    extension files, partly because I couldn't get past the dynamic
+    loading problem on my main machine, but mostly because I haven't
+    had the time yet.  That's near the top of the ToDo list.
+
+   -I made no changes to the x2p/ subdirectory, though some might
+    be probably needed.
+
+   -Lots of the hints files are probably now out of date.
+    The solaris_2_[23].sh ones are completely untested guesses.
+    Fixed/updated version are welcome.
+
+   -The defaults are to use perl's malloc and compile with
+    -g -DDEBUGGING.  I was unable to get perl to pass all tests
+    with anything else.  Part of the problem may be the stupid stub
+    functions I inserted in dump.c and sv.c, but there may be other
+    malloc/free problems elsewhere.
+
+   -Whatever else I broke to get this to work.
+
+Thanks to 
+    Tim Bunce <timbo@ig.co.uk>, 
+    Manoj Srivastava <srivasta@pilgrim.umass.edu>, and
+    Bill Hertzing <wgh@fns.com> 
+for various suggestions and help.  Thanks to Raphael Manfredi for
+much work on dist-3.0.
+
+    Andy Dougherty             doughera@lafcol.lafayette.edu
+    Dept. of Physics           Phone: (610) 250-5212
+    Lafayette College          FAX:   (610) 250-9263
+    Easton, PA  18042-1782
index 459cfa2..631a01b 100644 (file)
@@ -8,12 +8,12 @@ typedef DBM* SDBM_File;
 #define nextkey(db,key) sdbm_nextkey(db)
 
 static int
-XS_SDBM_File_sdbm_new(ix, sp, items)
+XS_SDBM_File_sdbm_new(ix, ax, items)
 register int ix;
-register int sp;
+register int ax;
 register int items;
 {
-    if (items < 4 || items > 4) {
+    if (items != 4) {
        croak("Usage: SDBM_File::new(dbtype, filename, flags, mode)");
     }
     {
@@ -27,16 +27,16 @@ register int items;
        ST(0) = sv_newmortal();
        sv_setptrobj(ST(0), RETVAL, "SDBM_File");
     }
-    return sp;
+    return ax;
 }
 
 static int
-XS_SDBM_File_sdbm_DESTROY(ix, sp, items)
+XS_SDBM_File_sdbm_DESTROY(ix, ax, items)
 register int ix;
-register int sp;
+register int ax;
 register int items;
 {
-    if (items < 1 || items > 1) {
+    if (items != 1) {
        croak("Usage: SDBM_File::DESTROY(db)");
     }
     {
@@ -48,16 +48,16 @@ register int items;
            croak("db is not a reference");
        sdbm_close(db);
     }
-    return sp;
+    return ax;
 }
 
 static int
-XS_SDBM_File_sdbm_fetch(ix, sp, items)
+XS_SDBM_File_sdbm_fetch(ix, ax, items)
 register int ix;
-register int sp;
+register int ax;
 register int items;
 {
-    if (items < 2 || items > 2) {
+    if (items != 2) {
        croak("Usage: SDBM_File::fetch(db, key)");
     }
     {
@@ -70,19 +70,20 @@ register int items;
        else
            croak("db is not of type SDBM_File");
 
-       key.dptr = SvPV(ST(2), key.dsize);;
+       key.dptr = SvPV(ST(2), na);
+       key.dsize = (int)na;;
 
        RETVAL = sdbm_fetch(db, key);
        ST(0) = sv_newmortal();
        sv_setpvn(ST(0), RETVAL.dptr, RETVAL.dsize);
     }
-    return sp;
+    return ax;
 }
 
 static int
-XS_SDBM_File_sdbm_store(ix, sp, items)
+XS_SDBM_File_sdbm_store(ix, ax, items)
 register int ix;
-register int sp;
+register int ax;
 register int items;
 {
     if (items < 3 || items > 4) {
@@ -100,9 +101,11 @@ register int items;
        else
            croak("db is not of type SDBM_File");
 
-       key.dptr = SvPV(ST(2), key.dsize);;
+       key.dptr = SvPV(ST(2), na);
+       key.dsize = (int)na;;
 
-       value.dptr = SvPV(ST(3), value.dsize);;
+       value.dptr = SvPV(ST(3), na);
+       value.dsize = (int)na;;
 
        if (items < 4)
            flags = DBM_REPLACE;
@@ -114,16 +117,16 @@ register int items;
        ST(0) = sv_newmortal();
        sv_setiv(ST(0), (I32)RETVAL);
     }
-    return sp;
+    return ax;
 }
 
 static int
-XS_SDBM_File_sdbm_delete(ix, sp, items)
+XS_SDBM_File_sdbm_delete(ix, ax, items)
 register int ix;
-register int sp;
+register int ax;
 register int items;
 {
-    if (items < 2 || items > 2) {
+    if (items != 2) {
        croak("Usage: SDBM_File::delete(db, key)");
     }
     {
@@ -136,22 +139,23 @@ register int items;
        else
            croak("db is not of type SDBM_File");
 
-       key.dptr = SvPV(ST(2), key.dsize);;
+       key.dptr = SvPV(ST(2), na);
+       key.dsize = (int)na;;
 
        RETVAL = sdbm_delete(db, key);
        ST(0) = sv_newmortal();
        sv_setiv(ST(0), (I32)RETVAL);
     }
-    return sp;
+    return ax;
 }
 
 static int
-XS_SDBM_File_sdbm_firstkey(ix, sp, items)
+XS_SDBM_File_sdbm_firstkey(ix, ax, items)
 register int ix;
-register int sp;
+register int ax;
 register int items;
 {
-    if (items < 1 || items > 1) {
+    if (items != 1) {
        croak("Usage: SDBM_File::firstkey(db)");
     }
     {
@@ -167,16 +171,16 @@ register int items;
        ST(0) = sv_newmortal();
        sv_setpvn(ST(0), RETVAL.dptr, RETVAL.dsize);
     }
-    return sp;
+    return ax;
 }
 
 static int
-XS_SDBM_File_nextkey(ix, sp, items)
+XS_SDBM_File_nextkey(ix, ax, items)
 register int ix;
-register int sp;
+register int ax;
 register int items;
 {
-    if (items < 2 || items > 2) {
+    if (items != 2) {
        croak("Usage: SDBM_File::nextkey(db, key)");
     }
     {
@@ -189,22 +193,23 @@ register int items;
        else
            croak("db is not of type SDBM_File");
 
-       key.dptr = SvPV(ST(2), key.dsize);;
+       key.dptr = SvPV(ST(2), na);
+       key.dsize = (int)na;;
 
        RETVAL = nextkey(db, key);
        ST(0) = sv_newmortal();
        sv_setpvn(ST(0), RETVAL.dptr, RETVAL.dsize);
     }
-    return sp;
+    return ax;
 }
 
 static int
-XS_SDBM_File_sdbm_error(ix, sp, items)
+XS_SDBM_File_sdbm_error(ix, ax, items)
 register int ix;
-register int sp;
+register int ax;
 register int items;
 {
-    if (items < 1 || items > 1) {
+    if (items != 1) {
        croak("Usage: SDBM_File::error(db)");
     }
     {
@@ -220,16 +225,16 @@ register int items;
        ST(0) = sv_newmortal();
        sv_setiv(ST(0), (I32)RETVAL);
     }
-    return sp;
+    return ax;
 }
 
 static int
-XS_SDBM_File_sdbm_clearerr(ix, sp, items)
+XS_SDBM_File_sdbm_clearerr(ix, ax, items)
 register int ix;
-register int sp;
+register int ax;
 register int items;
 {
-    if (items < 1 || items > 1) {
+    if (items != 1) {
        croak("Usage: SDBM_File::clearerr(db)");
     }
     {
@@ -245,12 +250,12 @@ register int items;
        ST(0) = sv_newmortal();
        sv_setiv(ST(0), (I32)RETVAL);
     }
-    return sp;
+    return ax;
 }
 
-int boot_SDBM_File(ix,sp,items)
+int boot_SDBM_File(ix,ax,items)
 int ix;
-int sp;
+int ax;
 int items;
 {
     char* file = __FILE__;
diff --git a/TCL b/TCL
new file mode 100644 (file)
index 0000000..5409bbf
--- /dev/null
+++ b/TCL
@@ -0,0 +1,169 @@
+Article 1475 of comp.lang.tcl:
+Path: netlabs!news!usc!cs.utexas.edu!sun-barr!ames!agate!sprite.Berkeley.EDU!ouster
+From: ouster@sprite.Berkeley.EDU (John Ousterhout)
+Newsgroups: comp.lang.tcl
+Subject: Planning for Tcl 7.0
+Message-ID: <1avu22INN5ao@agate.berkeley.edu>
+Date: 8 Oct 92 00:06:26 GMT
+Organization: U.C. Berkeley Sprite Project
+Lines: 156
+NNTP-Posting-Host: tyranny.berkeley.edu
+
+
+For the last year I've made only small changes to Tcl while focussing
+on the canvas and text widgets for Tk.  I'm now making plans to catch
+up on a bunch of much-needed bug fixes and enhancements to Tcl.  Some
+of the changes I'm considering are not backwards-compatible.  The
+purpose of this message is to let know know what changes I'm considering
+for Tcl 7.0 and to solicit feedback.  I'm particularly interested in
+comments on the changes that are incompatible:  I'll probably drop
+the changes for which I get lots of negative feedback and not much
+positive feedback.  If there are other changes that you think are
+important but aren't contained on this list, let me know and I may add
+them.
+
+Incompatible changes:
+---------------------
+
+The changes listed below are likely to require changes to existing
+scripts and/or C code.  Each change includes an explanation of why the
+change might be useful.  I'd like to know whether or not you think the change
+is useful enough to justify the incompatibility.
+
+1. Eliminate the "|" option in the "open" command.  Instead, add a
+"popen" command that does the same thing. Rationale: in the current
+implementation you can't open a file whose name begins with "|".
+Also, I think the "popen" command would be more logical.
+
+2. Eliminate the Tcl_WaitPids procedure and use the waitpid POSIX call
+instead.  Also change the wait code to periodically poll for dead
+child processes so that zombie processes don't get left around forever.
+Rationale: the current code tends to leave zombies around in some
+situations.  Switching to waitpid should solve this problem in a
+relatively portable fashion.  The only incompatibility will be for
+C procedures that call Tcl_WaitPids;  they'll have to switch to call
+waitpid instead.  I'll provide a compatibility version of waitpid for
+use on systems that don't have it yet.
+
+3. Clean up backslash processing in several ways:
+    - Change backslash-newline to eat up all the whitespace following the
+      newline and replace the sequence with a single whitespace character.
+      Right now it only eats up the newline character and replaces it
+      with an empty string.  Rationale:  this would be more consistent
+      with other programs that process backslash-newline sequences.
+    - Eliminate the sequences \Mxx, \Cxxx, and \e.
+      Rationale: these sequences are left around from ancient times.
+      They're not particular compatible with any other program.  I
+      should have removed them in Tcl 6.0 but didn't.  They did get
+      removed from the documentation, however, so no-one should be
+      using them (?).
+    - Change \x (where x is not one of the characters that gets special
+      backslash treatment) to expand to x, not \x.
+      Rationale: the current behavior is inconsistent with all other
+      programs I know of that handle backslashes, and I think it's
+      confusing.
+    - Change "format" so it doesn't do an additional layer of backslash
+      processing on its format string.
+      Rationale:  I don't know why it currently behaves as it does, and
+      I think it's confusing.
+
+4. Change "regsub" so that when no match occurs it sets the result
+variable to the original string, rather than leaving it unmodified.
+Rationale:  the current behavior results in extra tests of the regsub
+result that could sometimes be avoided with the proposed new behavior.
+I doubt that there's much code that will break with the change (this
+would have to be code that depends on the result variable *not* being
+modified).
+
+5. Change the name "UNIX" in the "errorCode" variable to "POSIX".
+Rationale:  I suspect that I'm eventually going to get a call from the
+USL lawyers on this one if I don't change it.  Better to change it now
+in an orderly fashion so I don't have change it hastily in the future.
+
+6. Change glob to return only the names of existing files.
+Rationale:  at present "glob */foo" expands * and generates a result
+without checking to see if each directory has a "foo" file in it.  This
+makes the current behavior incompatible with csh, for example.  One
+question is whether constructs like "glob {a,b}.c" should also check for
+the existence of each of the files.  At present they don't (i.e. a.c and
+b.c will be returned even if they don't exist), but neither does csh.  My
+inclination is to make the behavior match csh (names containing *?[] are
+checked for existence, others aren't).  I'd be interested to hear
+opinions on this one:  check all names for existence, check only names
+including *?[] (for csh compatibility), or keep it as it is?
+
+7. Change "gets" so it returns 1 for success and 0 for failure.  At present
+it returns the line length for success and -1 for failure.
+Rationale: this would allow slightly simple Tcl scripts:  you could just
+say
+    while [gets $f line] {...}
+instead of
+    while {[gets $f line] >= 0} {...}
+I'm not really convinced that this one is important enough to justify the
+incompatibility, so it won't take much negative feedback to kill it.
+
+Other changes:
+--------------
+
+The changes listed below shouldn't introduce substantial compatibility
+problems.  Of course, any change can potentially cause scripts to stop
+working (e.g. almost any change will break the test suite), but very
+few if any people should be affected by these changes.
+
+8. Implement Tcl_CreateExternVar() procedure along lines proposed by
+Andreas Stolcke to tie a C variable to a Tcl variable with automatic
+updates between them.
+
+9. Changes to exec:
+    - Allow redirection to an existing file descriptor in "exec",
+      with a mechanism like >&1 or >& stdout.
+    - Allow file names immediately after ">" and "<" without
+      intervening spaces.
+
+10. Changes related to files:
+    - Fix Scott Bolte bug (closing stdin and stdout).
+    - Move TclGetOpenFile and OpenFile stuff to tcl.h so that they're
+      accessible to applications.
+    - Extend access modes in open to include the complete set of POSIX
+      access modes (such as O_EXCL and O_NONBLOCK).
+
+11. Re-instate Tcl_WatchInterp to notify application when an interpreter
+is deleted.
+
+12. Add "elseif" mechanism to "if" command for chaining "else {if ..."
+constructs more cleanly.  Require exact matches on "then" and "else"
+keywords.
+
+13. Remove UNIX system call declarations from tclUnix.h.  Use them from
+unistd.h instead, and provide a default version of unistd.h for systems
+that don't have one.
+
+14. Changes in the expr command, mostly following suggestions made by
+George Howlett a long time ago:
+    - Increase precision of floating-point results.
+    - Make floating-point numbers always print with a point.
+    - Add transcendental functions like sin and exp.
+    - Add explicit integer and floating conversion operations.
+    - Don't promote large integers to floating-point automatically.
+    - Allow multiple arguments to expr command.
+
+15. Extend lsort to allow alternate sorting mechanisms, like numeric,
+or client-supplied.
+
+16. Allow alternate pattern-matching forms (e.g. exact or regexp) for
+lsearch and case.
+
+17. Add XPG/3 positional argument specifiers to format (code contributed
+by Mark Diekhans).
+
+18. Change "file readlink" to return an error on systems that don't
+support it rather than removing the option entirely.
+
+19. Add a mechanism for scheduling a Tcl command to be executed when the
+interpreter reaches a clean point.  This is needed for things like
+signal support.
+
+20. Change upvar so that you can refer to an element of an array as
+well as a whole array.
+
+
diff --git a/Todo b/Todo
index d8badae..16255ea 100755 (executable)
--- a/Todo
+++ b/Todo
@@ -12,6 +12,8 @@ Bugs
        Make yyparse recursion longjmp() proof.
        Make "delete $array{$key} while ($key) = each %array" safe
        Wrong line reported for runtime elsif condition error
+       TOOSTRICT is not too strict
+       recv and sysread should taint
 
 Regexp extensions
        /m  for multiline
@@ -35,8 +37,11 @@ Would be nice to have
        format BOTTOM
        willcall()
        -iprefix.
+       -i rename file only when successfully changed
        All ARGV input should act like <>
        Multiple levels of warning
+       .= shouldn't complain about undefined under -w
+       report HANDLE [formats].
 
 Pragmas ("assume" maybe?)
        integer, float
@@ -55,11 +60,11 @@ Optimizations
        Optimize away @_ where possible
        sfio?
        "one pass" global destruction
+       Optimize sort by { $a <=> $b }
 
 Need to think more about
        ref function in list context
        Populate %SIG at startup if appropriate
-       write HANDLE [formats].
 
 Vague possibilities
        sub mysplice(@, $, $, ...)
diff --git a/U/Extensions.U b/U/Extensions.U
new file mode 100644 (file)
index 0000000..3e10a38
--- /dev/null
@@ -0,0 +1,48 @@
+?X:  These units are based on the ones supplied with dist-3.0
+?X:  patchlevel 22.  They have been changed or enhanced to work with
+?X:  perl5alpha.  I would appreciate hearing about any changes,
+?X:  corrections, or enhancements.
+?X:    Andy Dougherty                  doughera@lafcol.lafayette.edu
+?X:    Dept. of Physics                
+?X:    Lafayette College       
+?X:    Easton, PA  18042-1782
+?X:     Sat Apr  2 15:45:17 EST 1994
+?RCS: $Id: Extensions.U,v$
+?RCS:
+?RCS: You may redistribute only under the terms of the Artistic Licence,
+?RCS: as specified in the README file that comes with the distribution.
+?RCS: You may reuse parts of this distribution only within the terms of
+?RCS: that same Artistic Licence; a copy of which may be found at the root
+?RCS: of the source tree for dist 3.0.
+?RCS:
+?RCS: $Log: Extensions.U,v $
+?RCS:
+?MAKE:extensions : find package 
+?MAKE: -pick add $@ %<
+?S:extensions:
+?S:    This variable holds a list of extension files we want to
+?S:    include in perl.  
+?S:.
+?INIT:: List of extensions we want:
+?INIT:extensions=''
+?X: 
+echo " "
+case "$extensions" in
+' '|'') echo "Looking for extensions..."
+       case "$find" in
+               *find*) 
+               cd ..
+               dflt="`$find ext -type f -name \*.xs -print`"
+               cd UU
+               ;;
+       *)      dflt='ext/dbm/NDBM_File.xs ext/dbm/ODBM_File.xs ext/dbm/GDBM_File.xs ext/dbm/SDBM_File.xs ext/posix/POSIX.xs'
+               ;;
+       esac
+       ;;
+none)  dflt='' ;;
+*)     dflt="$extensions" ;;
+esac
+rp="What extensions do you wish to include?"
+. ./myread
+extensions="$ans"
+
diff --git a/U/Loc.U b/U/Loc.U
new file mode 100644 (file)
index 0000000..79096ef
--- /dev/null
+++ b/U/Loc.U
@@ -0,0 +1,260 @@
+?X:  These units are based on the ones supplied with dist-3.0
+?X:  patchlevel 22.  They have been changed or enhanced to work with
+?X:  perl5alpha.  I would appreciate hearing about any changes,
+?X:  corrections, or enhancements.
+?X:    Andy Dougherty                  doughera@lafcol.lafayette.edu
+?X:    Dept. of Physics                
+?X:    Lafayette College       
+?X:    Easton, PA  18042-1782
+?X:     Sat Apr  2 15:45:17 EST 1994
+?RCS: $Id: Loc.U,v 3.0.1.3 1994/01/24 14:01:44 ram Exp $
+?RCS:
+?RCS: Copyright (c) 1991-1993, Raphael Manfredi
+?RCS: 
+?RCS: You may redistribute only under the terms of the Artistic Licence,
+?RCS: as specified in the README file that comes with the distribution.
+?RCS: You may reuse parts of this distribution only within the terms of
+?RCS: that same Artistic Licence; a copy of which may be found at the root
+?RCS: of the source tree for dist 3.0.
+?RCS: $Log: Loc.U,v $
+?RCS: Revision 3.0.1.3  1994/01/24  14:01:44  ram
+?RCS: patch16: added metalint hint on changed PATH variable
+?RCS:
+?RCS: Revision 3.0.1.2  1993/12/15  08:16:52  ram
+?RCS: patch15: now set _test variable when test is built-in
+?RCS: patch15: fixed rare cases where echo is not needed
+?RCS:
+?RCS: Revision 3.0.1.1  1993/09/13  15:47:13  ram
+?RCS: patch10: test program not always in /bin/test (WAD)
+?RCS:
+?RCS: Revision 3.0  1993/08/18  12:05:05  ram
+?RCS: Baseline for dist 3.0 netwide release.
+?RCS:
+?X: 
+?X: This unit produces a shell script "loc" which can be used to find out
+?X: where in a list of directories something is.  It then uses loc to
+?X: determine the location of commonly used programs.  It leaves loc sitting
+?X: around for other Configure units to use, but arranges for its demise
+?X: at the end of Configure.
+?X: 
+?X: To add a new program to find, add it both to the ?MAKE: line and to either
+?X: the loclist or trylist variable.
+?X: 
+?X: I put startsh at the end of the dependency list, in order to avoid the
+?X: loading of the spitshell unit before the instructions.
+?X:
+?MAKE:Loc Mcc awk bash bison byacc cat chgrp chmod chown compress cp cpio \
+       cpp csh date echo egrep emacs expr find flex gcc grep inews ksh \
+       less line lint ln lp lpr ls mail mailx make mkdir more mv nroff \
+       perl pg pmake pr rm rmail sed sendmail sh shar sleep smail sort \
+       submit tail tar tbl test touch tr troff uname uniq uuname vi \
+       zcat: eunicefix n c Instruct Myread startsh
+?MAKE: -pick weed $@ %<
+?LINT:describe Loc Mcc awk bash bison byacc cat chgrp chmod chown compress \
+       cp cpio cpp csh date echo egrep emacs expr find flex gcc grep \
+       inews ksh less line lint ln lp lpr ls mail mailx make mkdir more \
+       mv nroff perl pg pmake pr rm rmail sed sendmail sh shar sleep \
+       smail sort submit tail tar tbl test touch tr troff uname uniq \
+       uuname vi zcat
+?V::pth loclist trylist
+?T:thing xxx dir file say _test
+?LINT:change PATH
+: find out where common programs are
+echo " "
+echo "Locating common programs..." >&4
+cat <<EOSC >loc
+$startsh
+case \$# in
+0) exit 1;;
+esac
+thing=\$1
+shift
+dflt=\$1
+shift
+for dir in \$*; do
+       case "\$thing" in
+       .)
+       if test -d \$dir/\$thing; then
+               echo \$dir
+               exit 0
+       fi
+       ;;
+       *)
+       if test -f \$dir/\$thing; then
+               echo \$dir/\$thing
+               exit 0
+       elif test -f \$dir/\$thing.exe; then
+               : on Eunice apparently
+               echo \$dir/\$thing
+               exit 0
+       fi
+       ;;
+       esac
+done
+echo \$dflt
+exit 1
+EOSC
+chmod +x loc
+$eunicefix loc
+loclist="
+?awk:awk
+?cat:cat
+?chgrp:chgrp
+?chmod:chmod
+?chown:chown
+?cp:cp
+?echo:echo
+?expr:expr
+?grep:grep
+?ln:ln
+?ls:ls
+?make:make
+?mkdir:mkdir
+?mv:mv
+?rm:rm
+?sed:sed
+?sleep:sleep
+?sort:sort
+?tail:tail
+?touch:touch
+?tr:tr
+?uniq:uniq
+"
+trylist="
+?Mcc:Mcc
+?bash:bash
+?bison:bison
+?byacc:byacc
+?compress:compress
+?cpio:cpio
+?cpp:cpp
+?csh:csh
+?date:date
+?egrep:egrep
+?emacs:emacs
+?find:find
+?flex:flex
+?gcc:gcc
+?inews:inews
+?ksh:ksh
+?less:less
+?line:line
+?lint:lint
+?lp:lp
+?lpr:lpr
+?mail:mail
+?mailx:mailx
+?more:more
+?nroff:nroff
+?perl:perl
+?pg:pg
+?pmake:pmake
+?pr:pr
+?rmail:rmail
+?sendmail:sendmail
+?sh:sh
+?shar:shar
+?smail:smail
+?submit:submit
+?tar:tar
+?tbl:tbl
+?test:test
+?troff:troff
+?uname:uname
+?uuname:uuname
+?vi:vi
+?zcat:zcat
+"
+?LINT:set Loc Mcc awk bash bison byacc cat chgrp chmod chown compress cp cpio cpp \
+       csh date echo egrep emacs expr flex gcc grep inews ksh less line lint ln \
+       lp lpr ls mail mailx make mkdir more mv nroff perl pg pmake pr rm rmail \
+       sed sendmail sh shar sleep smail sort submit tail tar tbl test touch tr \
+       troff uname uniq uuname vi zcat
+pth=`echo $PATH | sed -e 's/:/ /g'`
+pth="$pth /lib /usr/lib"
+for file in $loclist; do
+       xxx=`./loc $file $file $pth`
+       eval $file=$xxx
+       eval _$file=$xxx
+       case "$xxx" in
+       /*)
+               echo $file is in $xxx.
+               ;;
+       *)
+               echo "I don't know where $file is.  I hope it's in everyone's PATH."
+               ;;
+       esac
+done
+echo " "
+echo "Don't worry if any of the following aren't found..."
+say=offhand
+for file in $trylist; do
+       xxx=`./loc $file $file $pth`
+       eval $file=$xxx
+       eval _$file=$xxx
+       case "$xxx" in
+       /*)
+               echo $file is in $xxx.
+               ;;
+       *)
+               echo "I don't see $file out there, $say."
+               say=either
+               ;;
+       esac
+done
+case "$egrep" in
+egrep)
+       echo "Substituting grep for egrep."
+       egrep=$grep
+       ;;
+esac
+case "$test" in
+test)
+       echo "Hopefully test is built into your sh."
+       ;;
+*)
+       if sh -c "PATH= test true" >/dev/null 2>&1; then
+               echo "Using the test built into your sh."
+?X:
+?X: We need to set both test and _test, since Oldconfig.U will use the _test
+?X: value to systematically restore computed paths, which may be wrong if
+?X: we choose to load an old config.sh generated on another platform.
+?X:
+               test=test
+               _test=test
+       fi
+       ;;
+esac
+?LINT:change n c
+case "$echo" in
+echo)
+       echo "Hopefully echo is built into your sh."
+       ;;
+?X: For those rare cases where we don't need $echo...
+'') ;;
+*)
+       echo " "
+echo "Checking compatibility between $echo and builtin echo (if any)..." >&4
+       $echo $n "hi there$c" >foo1
+       echo $n "hi there$c" >foo2
+       if cmp foo1 foo2 >/dev/null 2>&1; then
+               echo "They are compatible.  In fact, they may be identical."
+       else
+               case "$n" in
+               '-n') n='' c='\c';;
+               *) n='-n' c='';;
+               esac
+               cat <<FOO
+They are not compatible!  You are probably running ksh on a non-USG system.
+I'll have to use $echo instead of the builtin, since Bourne shell doesn't
+have echo built in and we may have to run some Bourne shell scripts.  That
+means I'll have to use '$n$c' to suppress newlines now.  Life is ridiculous.
+
+FOO
+               $echo $n "The star should be here-->$c"
+               $echo "*"
+       fi
+       $rm -f foo1 foo2
+       ;;
+esac
+
diff --git a/U/Oldconfig.U b/U/Oldconfig.U
new file mode 100644 (file)
index 0000000..18c2a81
--- /dev/null
@@ -0,0 +1,284 @@
+?X:  These units are based on the ones supplied with dist-3.0
+?X:  patchlevel 22.  They have been changed or enhanced to work with
+?X:  perl5alpha.  I would appreciate hearing about any changes,
+?X:  corrections, or enhancements.
+?X:    Andy Dougherty                  doughera@lafcol.lafayette.edu
+?X:    Dept. of Physics                
+?X:    Lafayette College       
+?X:    Easton, PA  18042-1782
+?X:     Sat Apr  2 15:45:17 EST 1994
+?RCS: $Id: Oldconfig.U,v 3.0.1.2 1994/01/24 14:05:02 ram Exp $
+?RCS:
+?RCS: Copyright (c) 1991-1993, Raphael Manfredi
+?RCS: 
+?RCS: You may redistribute only under the terms of the Artistic Licence,
+?RCS: as specified in the README file that comes with the distribution.
+?RCS: You may reuse parts of this distribution only within the terms of
+?RCS: that same Artistic Licence; a copy of which may be found at the root
+?RCS: of the source tree for dist 3.0.
+?RCS:
+?RCS: $Log: Oldconfig.U,v $
+?RCS: Revision 3.0.1.2  1994/01/24  14:05:02  ram
+?RCS: patch16: added post-processing on myuname for Xenix targets
+?RCS: patch16: message proposing config.sh defaults made consistent
+?RCS:
+?RCS: Revision 3.0.1.1  1993/09/13  15:56:32  ram
+?RCS: patch10: force use of config.sh when -d option is used (WAD)
+?RCS: patch10: complain about non-existent hint files (WAD)
+?RCS: patch10: added Options dependency for fastread variable
+?RCS:
+?RCS: Revision 3.0  1993/08/18  12:05:12  ram
+?RCS: Baseline for dist 3.0 netwide release.
+?RCS:
+?X: 
+?X: This unit tries to remember what we did last time we ran Configure, mostly
+?X: for the sake of setting defaults.
+?X: 
+?MAKE:Oldconfig hint myuname: Instruct Myread uname sed test cat rm n c \
+       contains Loc Options
+?MAKE: -pick wipe $@ %<
+?S:myuname:
+?S:    The output of 'uname -a' if available, otherwise the hostname. On Xenix,
+?S:    pseudo variables assignments in the output are stripped, thank you. The
+?S:    whole thing is then lower-cased.
+?S:.
+?S:hint:
+?S:    Gives the type of hints used for previous answers. May be one of
+?S:    "default", "recommended" or "previous".
+?S:.
+?T:tmp file oldmyuname tans _
+?LINT:change n c
+: Try to determine whether config.sh was made on this system
+case "$config_sh" in
+'')
+?X: indentation wrong on purpose--RAM
+?X: Leave a white space between first two '(' for ksh. The sub-shell is needed
+?X: on some machines to avoid the error message when uname is not found; e.g.
+?X: old SUN-OS 3.2 would not execute hostname in (uname -a || hostname). Sigh!
+myuname=`( ($uname -a) 2>/dev/null || hostname) 2>&1`
+?X: Special mention for Xenix, whose 'uname -a' gives us output like this:
+?X:  sysname=XENIX
+?X:  nodename=whatever
+?X:  release=2.3.2 .. etc...
+?X: Therefore, we strip all this variable assignment junk and remove all the
+?X: new lines to keep the myuname variable sane... --RAM
+myuname=`echo $myuname | $sed -e 's/^[^=]*=//' | \
+       tr '[A-Z]' '[a-z]' | tr '\012' ' '`
+dflt=n
+if test "$fastread" = yes; then
+       dflt=y
+elif test -f ../config.sh; then
+?X: The value from config.sh will superseed the one we've just computed
+?X: ... but not if we choose to ignore config.sh, so eval oldmyuname here.
+       oldmyuname=''
+       if $contains myuname= ../config.sh >/dev/null 2>&1; then
+               eval "old`grep myuname= ../config.sh`"
+       fi
+       if test "X$myuname" = "X$oldmyuname"; then
+               dflt=y
+       fi
+fi
+
+@if {test -d ../hints}
+: Get old answers from old config file if Configure was run on the
+: same system, otherwise use the hints.
+hint=default
+cd ..
+if test -f config.sh; then
+       echo " "
+       rp="I see a config.sh file.  Shall I use it to set the defaults?"
+       . UU/myread
+       case "$ans" in
+       n*|N*) echo "OK, I'll ignore it."; mv config.sh config.sh.old;;
+       *)  echo "Fetching default answers from your old config.sh file..." >&4
+               tmp="$n"
+               tans="$c"
+               . ./config.sh
+               cp config.sh UU
+               n="$tmp"
+               c="$tans"
+               hint=previous
+               ;;
+       esac
+fi
+if test ! -f config.sh; then
+       $cat <<EOM
+
+First time through, eh?  I have some defaults handy for the following systems:
+
+EOM
+       cd hints; ls -C *.sh | $sed 's/\.sh/   /g' >&4
+       dflt=''
+       : Half the following guesses are probably wrong... If you have better
+       : tests or hints, please send them to <MAINTLOC>
+       : The metaconfig authors would also appreciate a copy...
+       $test -f /irix && dflt="$dflt sgi"
+       $test -f /xenix && dflt="$dflt sco_xenix"
+       $test -f /dynix && dflt="$dflt dynix"
+       $test -f /dnix && dflt="$dflt dnix"
+       $test -f /bin/mips && /bin/mips && dflt="$dflt mips"
+       $test -d /NextApps && test -f /usr/adm/software_version && dflt="$dflt next"
+       $test -d /usr/include/minix && dflt="$dflt minix"
+?X: If we have uname, we already computed a suitable uname -a output, correctly
+?X: formatted for Xenix, and it lies in $myuname.
+       if $test -f $uname; then
+               set X $myuname
+               shift
+
+               $test -f $5.sh && dflt="$dflt $5"
+
+               case "$5" in
+               fps*) dflt="$dflt fps";;
+               mips*)
+                       case "$4" in
+                       umips) dflt="$dflt umips";;
+                       *) dflt="$dflt mips";;
+                       esac;;
+               [23]100) dflt="$dflt mips";;
+               next*) dflt="$dflt next" ;;
+               news*) dflt="$dflt news" ;;
+               i386*) if $test -f /etc/kconfig; then
+                               if $contains _SYSV3 /usr/include/stdio.h > /dev/null 2>&1 ; then
+                                       dflt="$dflt isc_3_2_3"
+                               elif $contains _POSIX_SOURCE /usr/include/stdio.h > /dev/null 2>&1 ; then
+                                       dflt="$dflt isc_3_2_2"
+                           fi
+                               : i386.sh hint is wrong for Interactive.
+                               dflt=`echo $dflt | $sed 's/i386//'`
+                      fi
+                      ;;
+               esac
+
+               case "$1" in
+               aix) dflt="$dflt aix_rs" ;;
+               sun[Oo][Ss]) case "$3" in
+                       [34]*) vers=`echo $3 | $sed 's/\./_/g'`
+                               dflt="$dflt sunos_$vers" ;;
+                       5*) vers=`echo $3 | $sed 's/^5/2/g'`
+                               dflt="$dflt solaris_$vers" ;;
+                       esac
+                       ;;
+               [sS]olaris) case "$3" in
+                       5*) vers=`echo $3 | $sed 's/^5/2/g'`
+                               dflt="$dflt solaris_$vers" ;;
+                       esac
+                       ;;
+               dnix) dflt="$dflt dnix" ;;
+               dgux) dflt="$dflt dgux" ;;
+               genix) dflt="$dflt genix" ;;
+               hp*ux) dflt="$dflt hpux" ;;
+               next) dflt="$dflt next" ;;
+               irix) dflt="$dflt sgi" ;;
+               ultrix) case "$3" in
+                       3*) dflt="$dflt ultrix_3" ;;
+                       4*) dflt="$dflt ultrix_4" ;;
+                       esac
+                       ;;
+               uts) dflt="$dflt uts" ;;
+               $2) case "$dflt" in
+                       *isc*) ;;
+                       *)      if test -f /etc/systemid; then
+                               set `echo $3 | $sed 's/\./ /g'` $4
+                                       if $test -f sco_$1_$2_$3.sh; then
+                                               dflt="$dflt sco_$1_$2_$3"
+                                       elif $test -f sco_$1_$2.sh; then
+                                               dflt="$dflt sco_$1_$2"
+                                       elif $test -f sco_$1.sh; then
+                                               dflt="$dflt sco_$1"
+                                       fi
+                               fi
+                               ;;
+                       esac
+                       ;;
+               esac
+       else
+?X: Try to identify sony's NEWS-OS (BSD unix)
+               if test -f /vmunix -a -f news_os.sh; then
+                       (what /vmunix | tr '[A-Z]' '[a-z]') > ../UU/kernel.what 2>&1
+                       if $contains news-os ../UU/kernel.what >/dev/null 2>&1; then
+                               dflt="$dflt news_os"
+                       fi
+                       $rm -f ../UU/kernel.what
+               fi
+       fi
+       set X `echo $dflt | tr ' ' '\012' | sort | uniq`
+       shift
+       dflt=''
+       for file in $*; do
+               if $test -f "$file.sh"; then
+                       dflt="$dflt $file"
+               fi
+       done
+       set X $dflt
+       shift
+       dflt=${1+"$@"}
+       case "$dflt" in
+       '') dflt=none;;
+       esac
+       $cat <<EOM
+
+You may give one or more space-separated answers, or "none" if appropriate.
+If your OS version has no hints, DO NOT give a wrong version -- say "none".
+
+EOM
+       rp="Which of these apply, if any?"
+       . ../UU/myread
+       for file in $ans; do
+               if $test -f $file.sh; then
+                       . ./$file.sh
+                       $cat $file.sh >> ../UU/config.sh
+               elif $test X$ans = X -o X$ans = Xnone ; then
+                       : nothing
+               else
+                       echo "$file.sh does not exist -- ignored"
+               fi
+       done
+       hint=recommended
+       cd ..
+fi
+cd UU
+@else
+: Get old answers, if there is a config file out there
+hint=default
+if test -f ../config.sh; then
+       echo " "
+       rp="I see a config.sh file.  Shall I use it to set the defaults?"
+       . ./myread
+       case "$ans" in
+       n*|N*) echo "OK, I'll ignore it.";;
+       *)  echo "Fetching default answers from your old config.sh file..." >&4
+               tmp="$n"
+               tans="$c"
+               . ../config.sh
+               cp ../config.sh .
+               n="$tmp"
+               c="$tans"
+               hint=previous
+               ;;
+       esac
+fi
+@end
+?X: remember, indentation is wrong--RAM
+;;
+*)
+       echo " "
+       echo "Fetching default answers from $config_sh..." >&4
+       tmp="$n"
+       tans="$c"
+       cd ..
+?X: preserve symbolic links, if any
+       cp $config_sh config.sh 2>/dev/null
+       . ./config.sh
+       cd UU
+       cp ../config.sh .
+       n="$tmp"
+       c="$tans"
+       hint=previous
+       ;;
+esac
+
+: Restore computed paths
+for file in $loclist $trylist; do
+       eval $file="\$_$file"
+done
+
diff --git a/U/README.U b/U/README.U
new file mode 100644 (file)
index 0000000..4d4f964
--- /dev/null
@@ -0,0 +1,15 @@
+?X:  These units are based on the ones supplied with dist-3.0
+?X:  patchlevel 22.  They have been changed or enhanced to work with
+?X:  perl5alpha.  I would appreciate hearing about any changes,
+?X:  corrections, or enhancements.
+?X:    Andy Dougherty                  doughera@lafcol.lafayette.edu
+?X:    Dept. of Physics                
+?X:    Lafayette College       
+?X:    Easton, PA  18042-1782
+?X:     Sat Apr  2 15:45:17 EST 1994
+?RCS: 
+?RCS: You may redistribute only under the terms of the Artistic Licence,
+?RCS: as specified in the README file that comes with the distribution.
+?RCS: You may reuse parts of this distribution only within the terms of
+?RCS: that same Artistic Licence; a copy of which may be found at the root
+?RCS: of the source tree for dist 3.0, or in the perl distribution.
diff --git a/U/cc.U b/U/cc.U
new file mode 100644 (file)
index 0000000..63a621b
--- /dev/null
+++ b/U/cc.U
@@ -0,0 +1,119 @@
+?X:  These units are based on the ones supplied with dist-3.0
+?X:  patchlevel 22.  They have been changed or enhanced to work with
+?X:  perl5alpha.  I would appreciate hearing about any changes,
+?X:  corrections, or enhancements.
+?X:    Andy Dougherty                  doughera@lafcol.lafayette.edu
+?X:    Dept. of Physics                
+?X:    Lafayette College       
+?X:    Easton, PA  18042-1782
+?X:     Sat Apr  2 15:45:17 EST 1994
+?RCS: $Id: cc.U,v 3.0 1993/08/18 12:05:30 ram Exp $
+?RCS:
+?RCS: Copyright (c) 1991-1993, Raphael Manfredi
+?RCS: 
+?RCS: You may redistribute only under the terms of the Artistic Licence,
+?RCS: as specified in the README file that comes with the distribution.
+?RCS: You may reuse parts of this distribution only within the terms of
+?RCS: that same Artistic Licence; a copy of which may be found at the root
+?RCS: of the source tree for dist 3.0.
+?RCS:
+?RCS: $Log: cc.U,v $
+?RCS: Revision 3.0  1993/08/18  12:05:30  ram
+?RCS: Baseline for dist 3.0 netwide release.
+?RCS:
+?MAKE:gccversion cc: cat contains sysman +large cpp \
+       Mcc Myread Guess Oldconfig Loc
+?MAKE: -pick add $@ %<
+?S:cc:
+?S:    This variable holds the name of a command to execute a C compiler which
+?S:    can resolve multiple global references that happen to have the same
+?S:    name.  Usual values are "cc", "Mcc", "cc -M", and "gcc".
+?S:.
+?S:gccversion:
+?S:    If GNU cc (gcc) is used, this variable holds '1' or '2' to 
+?S:    indicate whether the compiler is version 1 or 2.  This is used in
+?S:    setting some of the default cflags.
+?D:cc='cc'
+?INIT:gccversion=''
+?LINT:change cpp
+: see if we need a special compiler
+echo " "
+if usg; then
+       case "$cc" in
+       '') case "$Mcc" in
+               /*) dflt='Mcc';;
+               *) case "$large" in
+                       -M*) dflt='cc';;
+                       *)      if $contains '\-M' $sysman/cc.1 >/dev/null 2>&1 ; then
+                                       if $contains '\-M' $sysman/cpp.1 >/dev/null 2>&1; then
+                                               dflt='cc'
+                                       else
+                                               dflt='cc -M'
+                                       fi
+                               else
+                                       dflt='cc'
+                               fi;;
+                       esac;;
+               esac;;
+       *)  dflt="$cc";;
+       esac
+       $cat <<'EOM'
+On some systems the default C compiler will not resolve multiple global
+references that happen to have the same name.  On some such systems the "Mcc"
+command may be used to force these to be resolved.  On other systems a "cc -M"
+command is required.  (Note that the -M flag on other systems indicates a
+memory model to use!) If you have the Gnu C compiler, you might wish to use
+that instead.
+
+EOM
+       rp="What command will force resolution on this system?"
+       . ./myread
+       cc="$ans"
+else
+       case "$cc" in
+       '') dflt=cc;;
+       *) dflt="$cc";;
+       esac
+       rp="Use which C compiler?"
+       . ./myread
+       cc="$ans"
+fi
+case "$cc" in
+gcc*)   echo "Checking out which version of gcc"
+$cat >gccvers.c <<EOM
+#include <stdio.h>
+int main()
+{
+char *v;
+v = "unknown";
+#ifdef __GNUC__
+#  ifdef __VERSION__
+       v = __VERSION__;
+#  endif
+#endif
+switch((int) v[0])
+  {
+    case '1':  printf("1\n"); break;
+    case '2':  printf("2\n"); break;
+    case '3':  printf("3\n"); break;
+    default:   break;
+  }
+#ifdef __GNUC__
+return 0;
+#else
+return 1;
+#endif
+}
+EOM
+       if $cc -o gccvers $ccflags gccvers.c >/dev/null 2>&1; then
+           gccversion=`./gccvers`
+               echo "You appear to have version $gccversion."
+       else
+               echo "Doesn't appear to be GNU cc."
+       fi
+       $rm -f gccvers*
+       if $test "$gccversion" = '1'; then
+               cpp=`./loc gcc-cpp $cpp $pth`
+       fi
+       ;;
+esac
diff --git a/U/ccflags.U b/U/ccflags.U
new file mode 100644 (file)
index 0000000..e9e3304
--- /dev/null
@@ -0,0 +1,241 @@
+?X:  These units are based on the ones supplied with dist-3.0
+?X:  patchlevel 22.  They have been changed or enhanced to work with
+?X:  perl5alpha.  I would appreciate hearing about any changes,
+?X:  corrections, or enhancements.
+?X:    Andy Dougherty                  doughera@lafcol.lafayette.edu
+?X:    Dept. of Physics                
+?X:    Lafayette College       
+?X:    Easton, PA  18042-1782
+?X:     Sat Apr  2 15:45:17 EST 1994
+?RCS: $Id: ccflags.U,v 3.0.1.3 1993/09/13 15:58:29 ram Exp $
+?RCS:
+?RCS: Copyright (c) 1991-1993, Raphael Manfredi
+?RCS: 
+?RCS: You may redistribute only under the terms of the Artistic Licence,
+?RCS: as specified in the README file that comes with the distribution.
+?RCS: You may reuse parts of this distribution only within the terms of
+?RCS: that same Artistic Licence; a copy of which may be found at the root
+?RCS: of the source tree for dist 3.0.
+?RCS:
+?RCS: $Log: ccflags.U,v $
+?RCS: Revision 3.0.1.3  1993/09/13  15:58:29  ram
+?RCS: patch10: explicitely mention -DDEBUG just in case they need it (WAD)
+?RCS: patch10: removed all the "tans" variable usage (WAD)
+?RCS:
+?RCS: Revision 3.0.1.2  1993/08/27  14:39:38  ram
+?RCS: patch7: added support for OSF/1 machines
+?RCS:
+?RCS: Revision 3.0.1.1  1993/08/25  14:00:24  ram
+?RCS: patch6: added defaults for cppflags, ccflags and ldflags
+?RCS:
+?RCS: Revision 3.0  1993/08/18  12:05:31  ram
+?RCS: Baseline for dist 3.0 netwide release.
+?RCS:
+?MAKE:ccflags ldflags lkflags cppflags optimize: test cat Myread Guess \
+       Oldconfig cc gccversion mips_type +usrinc package contains
+?MAKE: -pick add $@ %<
+?S:ccflags:
+?S:    This variable contains any additional C compiler flags desired by
+?S:    the user.  It is up to the Makefile to use this.
+?S:.
+?S:cppflags:
+?S:    This variable holds the flags that will be passed to the C pre-
+?S:    processor. It is up to the Makefile to use it.
+?S:.
+?S:optimize:
+?S:    This variable contains any optimizer/debugger flag that should be used.
+?S:    It is up to the Makefile to use it.
+?S:.
+?S:ldflags:
+?S:    This variable contains any additional C loader flags desired by
+?S:    the user.  It is up to the Makefile to use this.
+?S:.
+?S:lkflags:
+?S:    This variable contains any additional C partial linker flags desired by
+?S:    the user.  It is up to the Makefile to use this.
+?S:.
+?T:inctest thisincl xxx flag inclwanted
+?D:cppflags=''
+?D:ccflags=''
+?D:ldflags=''
+?INIT:: no include file wanted by default
+?INIT:inclwanted=''
+?INIT:
+: determine optimize, if desired, or use for debug flag also
+case "$optimize" in
+' ') dflt="none";;
+'') dflt="-g";;
+*) dflt="$optimize";;
+esac
+$cat <<EOH
+
+Some C compilers have problems with their optimizers, by default, $package
+compiles with the -O flag to use the optimizer.  Alternately, you might want
+to use the symbolic debugger, which uses the -g flag (on traditional Unix
+systems).  Either flag can be specified here.  To use neither flag, specify
+the word "none".
+
+EOH
+rp="What optimizer/debugger flag should be used?"
+. ./myread
+optimize="$ans"
+case "$optimize" in
+'none') optimize=" ";;
+esac
+
+case "$ccflags" in
+'')    case "$cc" in
+       *gcc*) if $test "$gccversion" = "1"; then
+                       dflt='-fpcc-struct-return'
+                  fi ;;
+       *) dflt='';;
+       esac
+       case "$optimize" in
+       *-g*) dflt="$dflt -DDEBUGGING";;
+       esac
+?X: check for POSIXized ISC
+       case "$cc" in
+       *gcc*)  if test -d /etc/conf/kconfig.d &&
+                 $contains _POSIX_VERSION $usrinc/sys/unistd.h >/dev/null 2>&1
+               then
+                       dflt="$dflt -posix"
+               fi
+               ;;
+       esac
+       ;;
+*) dflt="$ccflags" ;;
+esac
+
+?X: In USG mode, a MIPS system may need some BSD includes
+case "$mips_type" in
+*BSD*) ;;
+'') ;;
+*) inclwanted="$inclwanted $usrinc/bsd";;
+esac
+for thisincl in $inclwanted; do
+       if $test -d $thisincl; then
+               if $test x$thisincl != x$usrinc; then
+                       case "$dflt" in
+                       *$thisincl*);;
+                       *) dflt="$dflt -I$thisincl";;
+                       esac
+               fi
+       fi
+done
+
+?X: Include test function (header, symbol)
+inctest='if $contains $2 $usrinc/$1 >/dev/null 2>&1; then
+       xxx=true;
+elif $contains $2 $usrinc/sys/$1 >/dev/null 2>&1; then
+       xxx=true;
+else
+       xxx=false;
+fi;
+if $xxx; then
+       case "$dflt" in
+       *$2*);;
+       *) dflt="$dflt -D$2";;
+       esac;
+fi'
+
+?X:
+?X: SCO unix uses NO_PROTOTYPE instead of _NO_PROTO
+?X: OSF/1 uses __LANGUAGE_C__ instead of LANGUAGE_C
+?X:
+if ./osf1; then
+       set signal.h __LANGUAGE_C__; eval $inctest
+else
+       set signal.h LANGUAGE_C; eval $inctest
+fi
+set signal.h NO_PROTOTYPE; eval $inctest
+set signal.h _NO_PROTO; eval $inctest
+
+case "$dflt" in
+'') dflt=none;;
+esac
+$cat <<EOH
+
+Your C compiler may want other flags.  For this question you should include
+-I/whatever and -DWHATEVER flags and any other flags used by the C compiler,
+but you should NOT include libraries or ld flags like -lwhatever.  If you
+want $package to honor its debug switch, you should include -DDEBUGGING here.
+To use no flags, specify the word "none".
+
+Your C compiler might also need additional flags, such as -DJMPCLOBBER
+or -DCRIPPLED_CC.
+EOH
+?X: strip leading space
+set X $dflt
+shift
+dflt=${1+"$@"}
+rp="Any additional cc flags?"
+. ./myread
+case "$ans" in
+none) ccflags='';;
+*) ccflags="$ans";;
+esac
+
+: the following weeds options from ccflags that are of no interest to cpp
+cppflags="$ccflags"
+case "$cc" in
+*gcc*) if $test "$gccversion" = "1"; then
+               cppflags="$cppflags -D__GNUC__"
+           fi ;;
+esac
+case "$mips_type" in
+'');;
+*BSD*) cppflags="$cppflags -DSYSTYPE_BSD43";;
+esac
+case "$cppflags" in
+'');;
+*)  set X $cppflags
+       cppflags=''
+       for flag
+       do
+               case $flag in
+               -D*|-I*|-traditional|-ansi|-nostdinc) cppflags="$cppflags $flag";;
+               esac
+       done
+       case "$cppflags" in
+       *-*)  echo "(C preprocessor flags: $cppflags)";;
+       esac
+       ;;
+esac
+
+: flags used in final linking phase
+case "$ldflags" in
+'') if venix; then
+               dflt='-i -z'
+       else
+               dflt='none'
+       fi
+       ;;
+*) dflt="$ldflags";;
+esac
+echo " "
+rp="Any additional ld flags (NOT including libraries)?"
+. ./myread
+case "$ans" in
+none) ldflags='';;
+*) ldflags="$ans";;
+esac
+rmlist="$rmlist pdp11"
+
+@if lkflags
+: partial linking may need other flags
+case "$lkflags" in
+'') case "$ldflags" in
+       '') dflt='none';;
+       *) dflt="$ldflags";;
+       esac;;
+*) dflt="$lkflags";;
+esac
+echo " "
+rp="Partial linking flags to be used (NOT including -r)?"
+. ./myread
+case "$ans" in
+none) lkflags='';;
+*)    lkflags="$ans";;
+esac
+
+@end
diff --git a/U/d_casti32.U b/U/d_casti32.U
new file mode 100644 (file)
index 0000000..efcfd07
--- /dev/null
@@ -0,0 +1,86 @@
+?X:  These units are based on the ones supplied with dist-3.0
+?X:  patchlevel 22.  They have been changed or enhanced to work with
+?X:  perl5alpha.  I would appreciate hearing about any changes,
+?X:  corrections, or enhancements.
+?X:    Andy Dougherty                  doughera@lafcol.lafayette.edu
+?X:    Dept. of Physics                
+?X:    Lafayette College       
+?X:    Easton, PA  18042-1782
+?X:     Sat Apr  2 15:45:17 EST 1994
+?RCS: $Id: d_casti32.U,v 3.0 1993/08/18 12:05:47 ram Exp $
+?RCS:
+?RCS: Copyright (c) 1991-1993, Raphael Manfredi
+?RCS: 
+?RCS: You may redistribute only under the terms of the Artistic Licence,
+?RCS: as specified in the README file that comes with the distribution.
+?RCS: You may reuse parts of this distribution only within the terms of
+?RCS: that same Artistic Licence; a copy of which may be found at the root
+?RCS: of the source tree for dist 3.0.
+?RCS:
+?RCS: $Log: d_casti32.U,v $
+?RCS: Revision 3.0  1993/08/18  12:05:47  ram
+?RCS: Baseline for dist 3.0 netwide release.
+?RCS:
+?X:
+?X:    Can the compiler cast large floats to 32-bit integers?
+?X:
+?MAKE:d_casti32: cat cc ccflags rm intsize Setvar
+?MAKE: -pick add $@ %<
+?S:d_casti32:
+?S:    This variable conditionally defines CASTI32, which indicates
+?S:    wether the C compiler can cast large floats to 32-bit ints.
+?S:.
+?T:xxx yyy
+?C:CASTI32:
+?C:    This symbol is defined if the C compiler can cast negative
+?C:    or large floating point numbers to 32-bit ints.
+?C:.
+?H:#$d_casti32 CASTI32         /**/
+?H:.
+?LINT:set d_casti32
+: check for ability to cast large floats to 32-bit ints.
+echo " "
+echo 'Checking whether your C compiler can cast large floats to int32.' >&4
+if $test "$intsize" -ge 4; then
+    xxx=int
+else
+    xxx=long
+fi
+
+$cat >try.c <<EOCP
+#include <sys/types.h>
+#include <signal.h>
+blech() { exit(3); }
+main()
+{
+        $xxx i32;
+       double f;
+       int result = 0;
+       signal(SIGFPE, blech);
+
+       f = (double) 0x7fffffff;
+       f = 10 * f;
+       i32  = ( $xxx )f;
+
+       if (i32 != ( $xxx )f)
+               result |= 1;
+       exit(result);
+}
+EOCP
+if $cc -o try $ccflags try.c >/dev/null 2>&1; then
+       ./try
+       yyy=$?
+else
+       yyy=1
+fi
+case "$yyy" in
+0)     val="$define"
+       echo "Yup, it can."
+       ;;
+*)     val="$undef"
+       echo "Nope, it can't."
+       ;;
+esac
+set d_casti32
+eval $setvar
+$rm -f try.*
diff --git a/U/d_isascii.U b/U/d_isascii.U
new file mode 100644 (file)
index 0000000..6a461c3
--- /dev/null
@@ -0,0 +1,59 @@
+?X:  These units are based on the ones supplied with dist-3.0
+?X:  patchlevel 22.  They have been changed or enhanced to work with
+?X:  perl5alpha.  I would appreciate hearing about any changes,
+?X:  corrections, or enhancements.
+?X:    Andy Dougherty                  doughera@lafcol.lafayette.edu
+?X:    Dept. of Physics                
+?X:    Lafayette College       
+?X:    Easton, PA  18042-1782
+?X:     Sat Apr  2 15:45:17 EST 1994
+?RCS: $Id: d_isascii.U,v 3.0 1993/08/18 12:06:44 ram Exp $
+?RCS:
+?RCS: Copyright (c) 1991-1993, Raphael Manfredi
+?RCS: 
+?RCS: You may redistribute only under the terms of the Artistic Licence,
+?RCS: as specified in the README file that comes with the distribution.
+?RCS: You may reuse parts of this distribution only within the terms of
+?RCS: that same Artistic Licence; a copy of which may be found at the root
+?RCS: of the source tree for dist 3.0.
+?RCS:
+?RCS: $Log: d_isascii.U,v $
+?RCS: Revision 3.0  1993/08/18  12:06:44  ram
+?RCS: Baseline for dist 3.0 netwide release.
+?RCS:
+?MAKE:d_isascii: test cc cat cppflags libs rm Setvar Findhdr
+?MAKE: -pick add $@ %<
+?S:d_isascii:
+?S:    This variable conditionally defines the HAS_ISASCII manifest constant,
+?S:    which indicates to the C program that isascii() is available.
+?S:.
+?C:HAS_ISASCII (ISASCII):
+?C:    This manifest constant lets the C program know that the
+?C:    isascii is available.
+?C:.
+?H:#$d_isascii HAS_ISASCII             /**/
+?H:.
+?LINT:set d_isascii
+: Look for isascii
+echo " "
+$cat >isascii.c <<'EOCP'
+#include <stdio.h>
+#include <ctype.h>
+main() {
+        int c = 'A';
+       if (isascii(c))
+           exit(0);
+       else
+           exit(1);
+}
+EOCP
+if $cc $cppflags -o isascii isascii.c >/dev/null 2>&1 ; then
+    echo "isascii() found."
+    val="$define"
+else
+    echo "isascii() NOT found."
+    val="$undef"
+fi
+set d_isascii
+eval $setvar
+$rm -f isascii*
diff --git a/U/d_setlocale.U b/U/d_setlocale.U
new file mode 100644 (file)
index 0000000..81b2d61
--- /dev/null
@@ -0,0 +1,39 @@
+?X:  These units are based on the ones supplied with dist-3.0
+?X:  patchlevel 22.  They have been changed or enhanced to work with
+?X:  perl5alpha.  I would appreciate hearing about any changes,
+?X:  corrections, or enhancements.
+?X:    Andy Dougherty                  doughera@lafcol.lafayette.edu
+?X:    Dept. of Physics                
+?X:    Lafayette College       
+?X:    Easton, PA  18042-1782
+?X:     Sat Apr  2 15:45:17 EST 1994
+?RCS: $Id: d_setlocale.U,v 3.0 1993/08/18 12:07:36 ram Exp $
+?RCS:
+?RCS: Copyright (c) 1991-1993, Raphael Manfredi
+?RCS: 
+?RCS: You may redistribute only under the terms of the Artistic Licence,
+?RCS: as specified in the README file that comes with the distribution.
+?RCS: You may reuse parts of this distribution only within the terms of
+?RCS: that same Artistic Licence; a copy of which may be found at the root
+?RCS: of the source tree for dist 3.0.
+?RCS:
+?RCS: $Log: d_setlocale.U,v $
+?RCS: Revision 3.0  1993/08/18  12:07:36  ram
+?RCS: Baseline for dist 3.0 netwide release.
+?RCS:
+?MAKE:d_setlocale: Inlibc
+?MAKE: -pick add $@ %<
+?S:d_setlocale:
+?S:    This variable conditionally defines HAS_SETLOCALE if setlocale() is
+?S:    available to handle locale-specific ctype implementations.
+?S:.
+?C:HAS_SETLOCALE:
+?C:    This symbol, if defined, indicates that the setlocale routine is
+?C:    available to handle locale-specific ctype implementations.
+?C:.
+?H:#$d_setlocale HAS_SETLOCALE /**/
+?H:.
+?LINT:set d_setlocale
+: see if setlocale exists
+set setlocale d_setlocale
+eval $inlibc
diff --git a/U/d_strerror.U b/U/d_strerror.U
new file mode 100644 (file)
index 0000000..4a4a618
--- /dev/null
@@ -0,0 +1,122 @@
+?X:  These units are based on the ones supplied with dist-3.0
+?X:  patchlevel 22.  They have been changed or enhanced to work with
+?X:  perl5alpha.  I would appreciate hearing about any changes,
+?X:  corrections, or enhancements.
+?X:    Andy Dougherty                  doughera@lafcol.lafayette.edu
+?X:    Dept. of Physics                
+?X:    Lafayette College       
+?X:    Easton, PA  18042-1782
+?X:     Sat Apr  2 15:45:17 EST 1994
+?RCS: $Id: d_strerror.U,v 3.0.1.1 1994/01/24 14:08:56 ram Exp $
+?RCS:
+?RCS: Copyright (c) 1991-1993, Raphael Manfredi
+?RCS: 
+?RCS: You may redistribute only under the terms of the Artistic Licence,
+?RCS: as specified in the README file that comes with the distribution.
+?RCS: You may reuse parts of this distribution only within the terms of
+?RCS: that same Artistic Licence; a copy of which may be found at the root
+?RCS: of the source tree for dist 3.0.
+?RCS:
+?RCS: $Log: d_strerror.U,v $
+?RCS: Revision 3.0.1.1  1994/01/24  14:08:56  ram
+?RCS: patch16: protected code looking for sys_errnolist[] with @if
+?RCS: patch16: added default value for d_sysernlst
+?RCS:
+?RCS: Revision 3.0  1993/08/18  12:07:35  ram
+?RCS: Baseline for dist 3.0 netwide release.
+?RCS:
+?MAKE:d_strerror d_syserrlst d_sysernlst d_strerrm: contains Csym Findhdr
+?MAKE: -pick add $@ %<
+?S:d_strerror:
+?S:    This variable conditionally defines HAS_STRERROR if strerror() is
+?S:    available to translate error numbers to strings.
+?S:.
+?S:d_syserrlst:
+?S:    This variable conditionally defines HAS_SYS_ERRLIST if sys_errlist[] is
+?S:    available to translate error numbers to strings.
+?S:.
+?S:d_sysernlst:
+?S:    This variable conditionally defines HAS_SYS_ERRNOLIST if sys_errnolist[]
+?S:    is available to translate error numbers to the symbolic name.
+?S:.
+?S:d_strerrm:
+?S:    This variable conditionally defines strerrr as a macro if the
+?S:    sys_errlist[] array is defined.
+?S:.
+?C:HAS_STRERROR (STRERROR):
+?C:    This symbol, if defined, indicates that the strerror routine is
+?C:    available to translate error numbers to strings. See the writeup
+?C:    of Strerror() in this file before you try to define your own.
+?C:.
+?C:HAS_SYS_ERRLIST (SYSERRLIST):
+?C:    This symbol, if defined, indicates that the sys_errlist array is
+?C:    available to translate error numbers to strings. The extern int
+?C:    sys_nerr gives the size of that table.
+?C:.
+?C:HAS_SYS_ERRNOLIST (SYSERRNOLIST):
+?C:    This symbol, if defined, indicates that the sys_errnolist array is
+?C:    available to translate an errno code into its symbolic name (e.g.
+?C: ENOENT). The extern int sys_nerrno gives the size of that table.
+?C:.
+?C:Strerror:
+?C:    This preprocessor symbol is defined as a macro if strerror() is
+?C:    not available to translate error numbers to strings but sys_errlist[]
+?C:    array is there.
+?C:.
+?H:#$d_strerror HAS_STRERROR           /**/
+?H:#$d_syserrlst HAS_SYS_ERRLIST       /**/
+?H:#$d_sysernlst HAS_SYS_ERRNOLIST     /**/
+?H:?%<:#ifdef HAS_STRERROR
+?H:?%<:#  define Strerror strerror
+?H:?%<:#else
+?H:#$d_strerrm Strerror(e) ((e)<0||(e)>=sys_nerr?"unknown":sys_errlist[e]) /**/
+?H:?%<:#endif
+?H:.
+?D:d_sysernlst=''
+?T:xxx val
+: see if strerror and/or sys_errlist[] exist
+echo " "
+if set strerror val -f d_strerror; eval $csym; $val; then
+       echo 'strerror() found.' >&4
+       d_strerror="$define"
+       d_strerrm="$undef"
+       if set sys_errlist val -a d_syserrlst; eval $csym; $val; then   
+               echo "(You also have sys_errlist[], so we could roll our own strerror.)" 
+               d_syserrlst="$define"
+       else
+       echo "(Since you don't have sys_errlist[], sterror() is welcome.)"
+               d_syserrlst="$undef"
+       fi
+elif xxx=`./findhdr string.h`; test "$xxx" || xxx=`./findhdr strings.h`; \
+       $contains '#[   ]*define.*strerror' "$xxx" >/dev/null 2>&1; then
+       echo 'strerror() found in string header.' >&4
+       d_strerror="$define"
+       d_strerrm="$undef"
+       if set sys_errlist val -a d_syserrlst; eval $csym; $val; then   
+               echo "(Most probably, strerror() uses sys_errlist[] for descriptions.)"
+               d_syserrlst="$define"
+       else
+               echo "(You don't appear to have any sys_errlist[], how can this be?)"
+               d_syserrlst="$undef"
+       fi
+elif set sys_errlist val -a d_syserrlst; eval $csym; $val; then
+echo "strerror() not found, but you have sys_errlist[] so we'll use that." >&4
+       d_strerror="$undef"
+       d_syserrlst="$define"
+       d_strerrm="$define"
+else
+       echo 'strerror() and sys_errlist[] NOT found.' >&4
+       d_strerror="$undef"
+       d_syserrlst="$undef"
+       d_strerrm="$undef"
+fi
+@if d_sysernlst || HAS_SYS_ERRNOLIST
+if set sys_errnolist val -a d_sysernlst; eval $csym; $val; then
+       echo "(Symbolic error codes can be fetched via the sys_errnolist[] array.)"
+       d_sysernlst="$define"
+else
+       echo "(However, I can't extract the symbolic error code out of errno.)"
+       d_sysernlst="$undef"
+fi
+@end
+
diff --git a/U/dlsrc.U b/U/dlsrc.U
new file mode 100644 (file)
index 0000000..e67e1fd
--- /dev/null
+++ b/U/dlsrc.U
@@ -0,0 +1,66 @@
+?X:  These units are based on the ones supplied with dist-3.0
+?X:  patchlevel 22.  They have been changed or enhanced to work with
+?X:  perl5alpha.  I would appreciate hearing about any changes,
+?X:  corrections, or enhancements.
+?X:    Andy Dougherty                  doughera@lafcol.lafayette.edu
+?X:    Dept. of Physics                
+?X:    Lafayette College       
+?X:    Easton, PA  18042-1782
+?X:     Sat Apr  2 15:45:17 EST 1994
+?RCS: $Id: dlsrc.U,v$
+?RCS:
+?RCS: You may redistribute only under the terms of the Artistic Licence,
+?RCS: as specified in the README file that comes with the distribution.
+?RCS: You may reuse parts of this distribution only within the terms of
+?RCS: that same Artistic Licence; a copy of which may be found at the root
+?RCS: of the source tree for dist 3.0.
+?RCS:
+?RCS: $Log: dlsrc.U,v $
+?RCS:
+?MAKE:dlsrc dlobj usedl: Myread Oldconfig package \
+       Guess test rm cat i_dlfcn cc ccflags Findhdr
+?MAKE: -pick add $@ %<
+?S:usedl:
+?S:    This variable contains indicates if the the system supports dynamic
+?S:    loading of some sort.  See also dlsrc and dlobj.
+?S:.
+?S:dlsrc:
+?S:    This variable contains the name of the dynamic loading file that 
+?S:    will be used with the package.
+?S:.
+?S:dlobj:
+?S:    This variable contains the name of the dynamic loading object
+?S:    file that will be used with the package.
+?S:.
+?C:USE_DYNAMIC_LOADING~%<:
+?C:    This symbol, if defined, indicates that dynamic loading of
+?C:    some sort is available.
+?C:.
+?H:?%<:#$usedl USE_DYNAMIC_LOADING             /**/
+?H:.
+?W:%<:dlopen
+?INIT: usedl=''
+?X: 
+?X:  Can anyone suggest a test for whether this works on a given system?
+?X: 
+: determine which dynamic loading, if any, to compile in
+echo " "
+case "$usedl" in
+'')
+       case "$i_dlfcn" in
+       'define') dflt='y' ;;
+       *)        dflt='n' ;;
+       esac
+       ;;
+'define') dflt='y' ;;
+'y') dflt='y'
+     usedl='define' ;;
+*)  dflt='n' ;;
+esac
+rp="Do you wish to attempt to use dynamic loading?"
+. ./myread
+usedl="$ans"
+case "$ans" in
+y*) usedl='define'; dlsrc='dl.c'; dlobj='dl.o';;
+*) usedl='undef'; dlsrc=''; dlobj='';;
+esac
diff --git a/U/gidtype.U b/U/gidtype.U
new file mode 100644 (file)
index 0000000..870fce8
--- /dev/null
@@ -0,0 +1,60 @@
+?X:  These units are based on the ones supplied with dist-3.0
+?X:  patchlevel 22.  They have been changed or enhanced to work with
+?X:  perl5alpha.  I would appreciate hearing about any changes,
+?X:  corrections, or enhancements.
+?X:    Andy Dougherty                  doughera@lafcol.lafayette.edu
+?X:    Dept. of Physics                
+?X:    Lafayette College       
+?X:    Easton, PA  18042-1782
+?X:     Sat Apr  2 15:45:17 EST 1994
+?RCS: $Id: gidtype.U,v 3.0 1993/08/18 12:08:11 ram Exp $
+?RCS:
+?RCS: Copyright (c) 1991-1993, Raphael Manfredi
+?RCS: 
+?RCS: You may redistribute only under the terms of the Artistic Licence,
+?RCS: as specified in the README file that comes with the distribution.
+?RCS: You may reuse parts of this distribution only within the terms of
+?RCS: that same Artistic Licence; a copy of which may be found at the root
+?RCS: of the source tree for dist 3.0.
+?RCS:
+?RCS: $Log: gidtype.U,v $
+?RCS: Revision 3.0  1993/08/18  12:08:11  ram
+?RCS: Baseline for dist 3.0 netwide release.
+?RCS:
+?MAKE:gidtype: Myread Oldconfig contains Findhdr
+?MAKE: -pick add $@ %<
+?S:gidtype:
+?S:    This variable defines Gid_t to be something like gid_t, int, 
+?S:    ushort, or whatever type is used to declare the return type
+?S:    of getgid().  Typically, it is the type of group ids in the kernel.
+?S:.
+?C:Gid_t (GIDTYPE):
+?C:    This symbol holds the return type of getgid() and the type of
+?C:    argument to setrgid() and related functions.  Typically,
+?C:    it is the type of group ids in the kernel.
+?C:    It can be int, ushort, uid_t, etc... It may be necessary to include
+?C:    <sys/types.h> to get any typedef'ed information.
+?C:.
+?H:#define Gid_t $gidtype              /* Type for getgid(), etc... */
+?H:.
+?T:xxx
+: see what type gids are declared as in the kernel
+case "$gidtype" in
+'')
+       if $contains 'gid_t;' `./findhdr sys/types.h` >/dev/null 2>&1 ; then
+               dflt='gid_t';
+       else
+               xxx=`./findhdr sys/user.h`
+               set `grep 'groups\[NGROUPS\];' "$xxx" 2>/dev/null` unsigned short
+               case $1 in
+               unsigned) dflt="$1 $2" ;;
+               *) dflt="$1" ;;
+               esac
+       fi
+       ;;
+*)  dflt="$gidtype";;
+esac
+echo " "
+rp="What is the type for group ids returned by getgid()?"
+. ./myread
+gidtype="$ans"
diff --git a/U/groupstype.U b/U/groupstype.U
new file mode 100644 (file)
index 0000000..f8ebab4
--- /dev/null
@@ -0,0 +1,58 @@
+?X:  These units are based on the ones supplied with dist-3.0
+?X:  patchlevel 22.  They have been changed or enhanced to work with
+?X:  perl5alpha.  I would appreciate hearing about any changes,
+?X:  corrections, or enhancements.
+?X:    Andy Dougherty                  doughera@lafcol.lafayette.edu
+?X:    Dept. of Physics                
+?X:    Lafayette College       
+?X:    Easton, PA  18042-1782
+?X:     Sat Apr  2 15:45:17 EST 1994
+?RCS: $Id: groupstype.U,v$
+?RCS:
+?RCS: You may redistribute only under the terms of the Artistic Licence,
+?RCS: as specified in the README file that comes with the distribution.
+?RCS: You may reuse parts of this distribution only within the terms of
+?RCS: that same Artistic Licence; a copy of which may be found at the root
+?RCS: of the source tree for dist 3.0.
+?RCS:
+?RCS: $Log: groupstype.U,v $
+?RCS:
+?MAKE:groupstype: gidtype d_getgrps Myread Oldconfig contains Findhdr
+?MAKE: -pick add $@ %<
+?INIT:groupstype=''
+?S:groupstype:
+?S:    This variable defines GROUPSTYPE to be something like gid_t, int, 
+?S:    ushort, or whatever type is used for the second argument to
+?S:    getgroups().  Usually, this is the same of gidtype, but
+?S:    sometimes it isn't.
+?S:.
+?C:GROUPSTYPE:
+?C:    This symbol holds the type used for the second argument to
+?C:    getgroups().  Usually, this is the same of gidtype, but
+?C:    sometimes it isn't.  It can be int, ushort, uid_t, etc... 
+?C:    It may be necessary to include <sys/types.h> to get any 
+?C:    typedef'ed information.  This is only required if you have
+?C:    getgroups().
+?C:.
+?H:?%<:#ifdef HAS_GETGROUPS
+?H:?%<:#define GROUPSTYPE $groupstype  /* Type for 2nd arg to getgroups() */
+?H:?%<:#endif
+?H:.
+?W:%<:getgroups HAS_GETGROUPS
+case "$d_getgrps" in
+'define')
+    case "$groupstype" in
+       '') dflt="$gidtype" ;;
+       *)  dflt="$groupstype" ;;
+    esac
+    echo " "
+    $cat <<EOM
+What is the type of the second argument to getgroups()?  Usually this
+is the same as group ids, "$gidtype", but not always.
+EOM
+    rp="What type is the second arguement to getgroups()?"
+    . ./myread
+    groupstype="$ans"
+    ;;
+*)  groupstype="$gidtype";;
+esac
diff --git a/U/i_dlfcn.U b/U/i_dlfcn.U
new file mode 100644 (file)
index 0000000..0f0f9c1
--- /dev/null
@@ -0,0 +1,37 @@
+?X:  These units are based on the ones supplied with dist-3.0
+?X:  patchlevel 22.  They have been changed or enhanced to work with
+?X:  perl5alpha.  I would appreciate hearing about any changes,
+?X:  corrections, or enhancements.
+?X:    Andy Dougherty                  doughera@lafcol.lafayette.edu
+?X:    Dept. of Physics                
+?X:    Lafayette College       
+?X:    Easton, PA  18042-1782
+?X:     Sat Apr  2 15:45:17 EST 1994
+?RCS: $Id: i_dlfcn.U,v $
+?RCS:
+?RCS: You may redistribute only under the terms of the Artistic Licence,
+?RCS: as specified in the README file that comes with the distribution.
+?RCS: You may reuse parts of this distribution only within the terms of
+?RCS: that same Artistic Licence; a copy of which may be found at the root
+?RCS: of the source tree for dist 3.0.
+?RCS:
+?RCS: $Log: i_dlfcn.U,v $
+?RCS:
+?MAKE:i_dlfcn: Inhdr
+?MAKE: -pick add $@ %<
+?S:i_dlfcn:
+?S:    This variable conditionally defines the I_DLFCN symbol, which
+?S:    indicates to the C program that <dlfcn.h> exists and should
+?S:    be included.
+?S:.
+?C:I_DLFCN:
+?C:    This symbol, if defined, indicates that <dlfcn.h> exists and should
+?C:    be included.
+?C:.
+?H:#$i_dlfcn I_DLFCN           /**/
+?H:.
+?LINT:set i_dlfcn
+: see if dlfcn is available
+set dlfcn.h i_dlfcn
+eval $inhdr
+
diff --git a/U/libc.U b/U/libc.U
new file mode 100644 (file)
index 0000000..54879b1
--- /dev/null
+++ b/U/libc.U
@@ -0,0 +1,297 @@
+?X:  These units are based on the ones supplied with dist-3.0
+?X:  patchlevel 22.  They have been changed or enhanced to work with
+?X:  perl5alpha.  I would appreciate hearing about any changes,
+?X:  corrections, or enhancements.
+?X:    Andy Dougherty                  doughera@lafcol.lafayette.edu
+?X:    Dept. of Physics                
+?X:    Lafayette College       
+?X:    Easton, PA  18042-1782
+?X:     Sat Apr  2 15:45:17 EST 1994
+?RCS: $Id: libc.U,v 3.0.1.3 1994/01/24 14:12:17 ram Exp $
+?RCS:
+?RCS: Copyright (c) 1991-1993, Raphael Manfredi
+?RCS: 
+?RCS: You may redistribute only under the terms of the Artistic Licence,
+?RCS: as specified in the README file that comes with the distribution.
+?RCS: You may reuse parts of this distribution only within the terms of
+?RCS: that same Artistic Licence; a copy of which may be found at the root
+?RCS: of the source tree for dist 3.0.
+?RCS:
+?RCS: $Log: libc.U,v $
+?RCS: Revision 3.0.1.3  1994/01/24  14:12:17  ram
+?RCS: patch16: can now export nm_extract as an internal-use only variable
+?RCS:
+?RCS: Revision 3.0.1.2  1993/09/13  16:09:03  ram
+?RCS: patch10: added special handling for Apollo systems (WAD)
+?RCS:
+?RCS: Revision 3.0.1.1  1993/08/27  14:40:03  ram
+?RCS: patch7: added entry for /usr/shlib/libc.so (OSF/1 machines)
+?RCS:
+?RCS: Revision 3.0  1993/08/18  12:08:57  ram
+?RCS: Baseline for dist 3.0 netwide release.
+?RCS:
+?MAKE:libc +nm_extract: echo n c rm test grep Getfile Myread Oldconfig Loc \
+       sed libs incpath libpth runnm nm_opt contains plibpth xlibpth
+?MAKE: -pick add $@ %<
+?S:libc:
+?S:    This variable contains the location of the C library.
+?S:.
+?S:nm_extract:
+?S:    This variable holds the name of the extraction command used to process
+?S:    the output of nm and yield the list of defined symbols. It is used
+?S:    internally by Configure.
+?S:.
+?T:thislib try libnames xxx xscan xrun thisname com tans
+?LINT:change libpth nm_opt
+case "$runnm" in
+true)
+?X: indentation is wrong on purpose--RAM
+: get list of predefined functions in a handy place
+echo " "
+case "$libc" in
+'') libc=unknown
+       case "$libs" in
+       *-lc_s*) libc=`./loc libc_s.a $libc $libpth`
+       esac
+       ;;
+esac
+libpth="$plibpth $libpth"
+libnames='';
+case "$libs" in
+'') ;;
+*)  for thislib in $libs; do
+       case "$thislib" in
+       -l*)
+               thislib=`expr X$thislib : 'X-l\(.*\)'`
+               try=`./loc lib$thislib.a blurfl/dyick $libpth`
+               if test ! -f $try; then
+                       try=`./loc lib$thislib blurfl/dyick $libpth`
+                       if test ! -f $try; then
+                               try=`./loc lib$thislib.so.'*' blurfl/dyick $libpth`
+                               if test ! -f $try; then
+                                       try=`./loc $thislib blurfl/dyick $libpth`
+                                       if test ! -f $try; then
+                                               try=`./loc Slib$thislib.a blurfl/dyick $xlibpth`
+                                               if test ! -f $try; then
+                                                       try=''
+                                               fi
+                                       fi
+                               fi
+                       fi
+               fi
+               libnames="$libnames $try"
+               ;;
+       *) libnames="$libnames $thislib" ;;
+       esac
+       done
+       ;;
+esac
+?X:
+?X: Some systems (e.g. DG/UX) use "environmental" links, which make the test
+?X: -f fail. Ditto for symbolic links. So in order to reliably check the
+?X: existence of a file, we use test -r. It will still fail with DG/UX links 
+?X: though, but at least it will detect symbolic links. At some strategic
+?X: points, we make use of (test -h), using a sub-shell in case builtin test
+?X: does not implement the -h check for symbolic links. This makes it
+?X: possible to preset libc in a hint file for instance and have it show up
+?X: as-is in the question.
+?X:
+xxx=normal
+case "$libc" in
+unknown)
+       set /usr/ccs/lib/libc.so
+       $test -r $1 || set /usr/lib/libc.so
+       $test -r $1 || set /usr/shlib/libc.so
+       $test -r $1 || set /usr/lib/libc.so.[0-9]*
+       $test -r $1 || set /lib/libsys_s.a
+       eval set \$$#
+       ;;
+*)
+?X: ensure the test below for the (shared) C library will fail
+       set blurfl
+       ;;
+esac
+if $test -r "$1"; then
+       echo "Your (shared) C library seems to be in $1."
+       libc="$1"
+elif $test -r /lib/libc && $test -r /lib/clib; then
+?X:
+?X: Apollo has its C library in /lib/clib AND /lib/libc
+?X: not to mention its math library in /lib/syslib...
+?X:
+       echo "Your C library seems to be in both /lib/clib and /lib/libc."
+       xxx=apollo
+       libc='/lib/clib /lib/libc'
+       if $test -r /lib/syslib; then
+               echo "(Your math library is in /lib/syslib.)"
+?X: Put syslib in libc -- not quite right, but won't hurt
+               libc="$libc /lib/syslib"
+       fi
+elif $test -r "$libc" || (test -h "$libc") >/dev/null 2>&1; then
+       echo "Your C library seems to be in $libc, as you said before."
+?X: For mips, and...
+elif $test -r $incpath/usr/lib/libc.a; then
+       libc=$incpath/usr/lib/libc.a;
+       echo "Your C library seems to be in $libc.  That's fine."
+elif $test -r /lib/libc.a; then
+       libc=/lib/libc.a;
+       echo "Your C library seems to be in $libc.  You're normal."
+else
+       if tans=`./loc libc.a blurfl/dyick $libpth`; $test -r "$tans"; then
+               :
+       elif tans=`./loc libc blurfl/dyick $libpth`; $test -r "$tans"; then
+               libnames="$libnames "`./loc clib blurfl/dyick $libpth`
+       elif tans=`./loc clib blurfl/dyick $libpth`; $test -r "$tans"; then
+               :
+       elif tans=`./loc Slibc.a blurfl/dyick $xlibpth`; $test -r "$tans"; then
+               :
+       elif tans=`./loc Mlibc.a blurfl/dyick $xlibpth`; $test -r "$tans"; then
+               :
+       else
+               tans=`./loc Llibc.a blurfl/dyick $xlibpth`
+       fi
+       if $test -r "$tans"; then
+               echo "Your C library seems to be in $tans, of all places."
+               libc=$tans
+       else
+               libc='blurfl'
+       fi
+fi
+if $test $xxx = apollo -o -r "$libc" || (test -h "$libc") >/dev/null 2>&1; then
+       dflt="$libc"
+       cat <<EOM
+
+If the guess above is wrong (which it might be if you're using a strange
+compiler, or your machine supports multiple models), you can override it here.
+
+EOM
+else
+       dflt=''
+       echo $libpth | tr ' ' '\012' | sort | uniq > libpath
+       cat >&4 <<EOM
+I can't seem to find your C library.  I've looked in the following places:
+
+EOM
+       $sed 's/^/      /' libpath
+       cat <<EOM
+
+None of these seems to contain your C library. I need to get its name...
+
+EOM
+fi
+fn=f
+rp='Where is your C library?'
+. ./getfile
+libc="$ans"
+
+echo " "
+echo $libc $libnames | tr ' ' '\012' | sort | uniq > libnames
+set X `cat libnames`
+shift
+xxx=files
+case $# in 1) xxx=file; esac
+echo "Extracting names from the following $xxx for later perusal:" >&4
+echo " "
+$sed 's/^/     /' libnames >&4
+echo " "
+$echo $n "This may take a while...$c" >&4
+
+nm $nm_opt $* 2>/dev/null >libc.tmp
+$echo $n ".$c"
+?X:
+?X: To accelerate processing, we look at the correct 'sed' command
+?X:    by using a small subset of libc.tmp, i.e. fprintf function.
+?X: When we know which sed command to use, do the name extraction
+?X:
+$grep fprintf libc.tmp > libc.ptf
+?X:
+?X: In order to ehance readability and save some space, we define
+?X:    some variables that will be "eval"ed.
+?X:
+xscan='eval "<libc.ptf $com >libc.list"; $echo $n ".$c" >&4'
+xrun='eval "<libc.tmp $com >libc.list"; echo "done" >&4'
+?X: BSD-like output
+if com="$sed -n -e 's/^.* [ADTS]  *_[_.]*//p' -e 's/^.* [ADTS] //p'";\
+       eval $xscan;\
+       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
+               eval $xrun
+?X: SYSV-like output
+elif com="$sed -n -e 's/^__*//' -e 's/^\([a-zA-Z_0-9$]*\).*xtern.*/\1/p'";\
+       eval $xscan;\
+       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
+               eval $xrun
+elif com="$sed -n -e '/|UNDEF/d' -e '/FUNC..GL/s/^.*|__*//p'";\
+       eval $xscan;\
+       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
+               eval $xrun
+elif com="$sed -n -e 's/^.* D __*//p' -e 's/^.* D //p'";\
+       eval $xscan;\
+       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
+               eval $xrun
+elif com="$sed -n -e 's/^_//' -e 's/^\([a-zA-Z_0-9]*\).*xtern.*text.*/\1/p'";\
+       eval $xscan;\
+       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
+               eval $xrun
+elif com="$sed -n -e 's/^.*|FUNC |GLOB .*|//p'";\
+       eval $xscan;\
+       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
+               eval $xrun
+elif com="$grep '|' | $sed -n -e '/|COMMON/d' -e '/|DATA/d' \
+                               -e '/ file/d' -e 's/^\([^       ]*\).*/\1/p'";\
+       eval $xscan;\
+       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
+               eval $xrun
+elif com="$sed -n -e 's/^.*|FUNC |GLOB .*|//p' -e 's/^.*|FUNC |WEAK .*|//p'";\
+       eval $xscan;\
+       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
+               eval $xrun
+?X: mips nm output (sysV)
+elif com="$sed -n -e 's/^__//' -e '/|Undef/d' -e '/|Proc/s/ .*//p'";\
+       eval $xscan;\
+       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
+               eval $xrun
+else
+       nm -p $* 2>/dev/null >libc.tmp
+       com="$sed -n -e 's/^.* [ADTS]  *_[_.]*//p' -e 's/^.* [ADTS] //p'";\
+       eval "<libc.tmp $com >libc.list"
+       if $contains '^fprintf$' libc.list >/dev/null 2>&1; then
+               nm_opt='-p'
+               echo "done" >&4
+       else
+               echo " "
+               echo "nm didn't seem to work right. Trying ar instead..." >&4
+               com=''
+               if ar t $libc > libc.tmp; then
+                       for thisname in $libnames; do
+                               ar t $thisname >>libc.tmp
+                       done
+                       $sed -e 's/\.o$//' < libc.tmp > libc.list
+                       echo "Ok." >&4
+               else
+                       echo "ar didn't seem to work right." >&4
+                       echo "Maybe this is a Cray...trying bld instead..." >&4
+                       if bld t $libc | $sed -e 's/.*\///' -e 's/\.o:.*$//' > libc.list; then
+                               for thisname in $libnames; do
+                                       bld t $libnames | \
+                                       $sed -e 's/.*\///' -e 's/\.o:.*$//' >>libc.list
+                                       ar t $thisname >>libc.tmp
+                               done
+                               echo "Ok." >&4
+                       else
+                               echo "That didn't work either.  Giving up." >&4
+                               exit 1
+                       fi
+               fi
+       fi
+fi
+nm_extract="$com"
+if $test -f /lib/syscalls.exp; then
+       echo " "
+       echo "Also extracting names from /lib/syscalls.exp for good ole AIX..." >&4
+       $sed -n 's/^\([^        ]*\)[   ]*syscall$/\1/p' /lib/syscalls.exp >>libc.list
+fi
+?X: remember, indentation is wrong on purpose--RAM
+;;
+esac
+$rm -f libnames libpath
+
diff --git a/U/libpth.U b/U/libpth.U
new file mode 100644 (file)
index 0000000..99cf22c
--- /dev/null
@@ -0,0 +1,83 @@
+?X:  These units are based on the ones supplied with dist-3.0
+?X:  patchlevel 22.  They have been changed or enhanced to work with
+?X:  perl5alpha.  I would appreciate hearing about any changes,
+?X:  corrections, or enhancements.
+?X:    Andy Dougherty                  doughera@lafcol.lafayette.edu
+?X:    Dept. of Physics                
+?X:    Lafayette College       
+?X:    Easton, PA  18042-1782
+?X:     Sat Apr  2 15:45:17 EST 1994
+?RCS: $Id: libpth.U,v 3.0 1993/08/18 12:09:02 ram Exp $
+?RCS:
+?RCS: Copyright (c) 1991-1993, Raphael Manfredi
+?RCS: 
+?RCS: You may redistribute only under the terms of the Artistic Licence,
+?RCS: as specified in the README file that comes with the distribution.
+?RCS: You may reuse parts of this distribution only within the terms of
+?RCS: that same Artistic Licence; a copy of which may be found at the root
+?RCS: of the source tree for dist 3.0.
+?RCS:
+?RCS: $Log: libpth.U,v $
+?RCS: Revision 3.0  1993/08/18  12:09:02  ram
+?RCS: Baseline for dist 3.0 netwide release.
+?RCS:
+?X:
+?X:    This unit initializes the path for C library lookup.
+?X:
+?MAKE:libpth xlibpth plibpth: mips incpath test cat Myread
+?MAKE: -pick add $@ %<
+?S:libpth:
+?S:    This variable holds the general path used to find libraries. It is
+?S:    intended to be used by other units.
+?S:.
+?S:plibpth:
+?S:    Holds the private path used by Configure to find out the libraries.
+?S:    Its value is prepend to libpth. This variable takes care of special
+?S:    machines, like the mips.  Usually, it should be empty.
+?S:.
+?T: xxx yyy
+?INIT:: change the next line if compiling for Xenix/286 on Xenix/386
+?INIT:xlibpth='/usr/lib/386 /lib/386'
+?INIT:
+?INIT:: general looking path for locating libraries
+?INIT:libpth="/usr/lib/large /lib /usr/lib $xlibpth /lib/large"
+?INIT:libpth="$libpth /usr/lib/small /lib/small"
+?INIT:libpth="$libpth /usr/ccs/lib /usr/ucblib /usr/local/lib"
+?INIT:
+?INIT:: Private path used by Configure to find libraries.  Its value
+?INIT:: is prepend to libpth. This variable takes care of special
+?INIT:: machines, like the mips.  Usually, it should be empty.
+?INIT:plibpth=''
+?INIT:
+?LINT:describe xlibpth
+?LINT:use mips
+: Set private lib path
+case "$plibpth" in
+'') if mips; then
+?X: on mips, we DO NOT want /lib, and we want $incpath/usr/lib
+               plibpth="$incpath/usr/lib /usr/local/lib /usr/ccs/lib"
+       fi;;
+esac
+libpth="$plibpth $libpth"
+: Now check and see which directories actually exist.
+xxx=''
+for yyy in $libpth
+do
+    if $test -d $yyy; then
+               xxx="$xxx $yyy"
+    fi
+done
+libpth="$xxx"
+$cat <<EOM
+Some systems have incompatible or broken versions of libraries.  Where
+should I look for libraries?
+EOM
+
+dflt="$libpth"
+echo " "
+rp="Directories to use for library searches?"
+. ./myread
+case "$ans" in
+none) libpth=' ';;
+*) libpth="$ans";;
+esac
diff --git a/U/libs.U b/U/libs.U
new file mode 100644 (file)
index 0000000..c1f951a
--- /dev/null
+++ b/U/libs.U
@@ -0,0 +1,132 @@
+?X:  These units are based on the ones supplied with dist-3.0
+?X:  patchlevel 22.  They have been changed or enhanced to work with
+?X:  perl5alpha.  I would appreciate hearing about any changes,
+?X:  corrections, or enhancements.
+?X:    Andy Dougherty                  doughera@lafcol.lafayette.edu
+?X:    Dept. of Physics                
+?X:    Lafayette College       
+?X:    Easton, PA  18042-1782
+?X:     Sat Apr  2 15:45:17 EST 1994
+?RCS: $Id: libs.U,v 3.0.1.1 1993/08/25 14:02:31 ram Exp $
+?RCS:
+?RCS: Copyright (c) 1991-1993, Raphael Manfredi
+?RCS: 
+?RCS: You may redistribute only under the terms of the Artistic Licence,
+?RCS: as specified in the README file that comes with the distribution.
+?RCS: You may reuse parts of this distribution only within the terms of
+?RCS: that same Artistic Licence; a copy of which may be found at the root
+?RCS: of the source tree for dist 3.0.
+?RCS:
+?RCS: $Log: libs.U,v $
+?RCS: Revision 3.0.1.1  1993/08/25  14:02:31  ram
+?RCS: patch6: added default for libs
+?RCS:
+?RCS: Revision 3.0  1993/08/18  12:09:03  ram
+?RCS: Baseline for dist 3.0 netwide release.
+?RCS:
+?MAKE:libs: test cat Myread Oldconfig Loc libpth package xlibpth
+?MAKE: -pick add $@ %<
+?S:libs:
+?S:    This variable holds the additional libraries we want to use.
+?S: It is up to the Makefile to deal with it.
+?S:.
+?T:xxx yyy zzz thislib thatlib libswanted
+?D:libs=''
+?X:
+?X: This order is chosen so that libraries  -lndir, -ldir, -lucb, -lbsd,
+?X: -lBSD, -lPW, and -lx only get used if there are unresolved
+?X: routines at link time.  Usually, these are backwards compatability
+?X: libraries, and may not be as reliable as the standard c library.
+?X: The ordering of c_s, posix, and cposix is a guess and almost
+?X: certainly wrong on about half of all systems.
+?INIT:libswanted="net socket nsl inet nm sdbm gdbm ndbm dbm malloc dl dld sun m c_s posix cposix ndir dir ucb bsd BSD PW x"
+?INIT:
+: Looking for optional libraries
+echo " "
+echo "Checking for optional libraries..." >&4
+case "$libs" in
+' '|'') dflt='';;
+*) dflt="$libs";;
+esac
+case "$libswanted" in
+'') libswanted='c_s';;
+esac
+for thislib in $libswanted; do
+       case "$thislib" in
+       dbm) thatlib=ndbm;;
+       *_s) thatlib=NONE;;
+       *) thatlib="${thislib}_s";;
+       esac
+       xxx=`./loc lib$thislib.a X $libpth`
+       yyy=`./loc lib$thatlib.a X $libpth`
+       zzz=`./loc lib$thislib.so.[0-9]'*' $libpth`
+       if $test -f $xxx; then
+               echo "Found -l$thislib."
+               case "$dflt" in
+               "*-l$thislib *.*"|"*-l$thatlib *.*") ;;
+               *) dflt="$dflt -l$thislib";;
+               esac
+       elif $test -f $yyy; then
+               echo "Found -l$thatlib."
+               case "$dflt" in
+               "*-l$thislib *.*"|"*-l$thatlib *.*") ;;
+               *) dflt="$dflt -l$thatlib";;
+               esac
+       elif $test -f $zzz; then
+               echo "Found -$thislib."
+               case "$dflt" in
+               "*-l$thislib *.*"|"*-l$thatlib *.*") ;;
+               *) dflt="$dflt -l$thislib";;
+               esac
+       else
+               xxx=`./loc Slib$thislib.a X $xlibpth`
+               yyy=`./loc Slib$thatlib.a X $xlibpth`
+               if $test -f $xxx; then
+                       echo "Found -l$thislib."
+                       case "$dflt" in
+                       "*-l$thislib *.*"|"*-l$thatlib *.*") ;;
+                       *) dflt="$dflt -l$thislib";;
+                       esac
+               elif $test -f $yyy; then
+                       echo "Found -l$thatlib."
+                       case "$dflt" in
+                       "*-l$thislib *.*"|"*-l$thatlib *.*") ;;
+                       *) dflt="$dflt -l$thatlib";;
+                       esac
+               else
+                       echo "No -l$thislib."
+               fi
+       fi
+done
+set X $dflt
+shift
+dflt="$*"
+case "$libs" in
+'') dflt="$dflt";;
+*) dflt="$libs";;
+esac
+case "$dflt" in
+' '|'') dflt='none';;
+esac
+
+$cat <<EOM
+Some versions of Unix support shared libraries, which make executables smaller
+but make load time slightly longer.
+
+On some systems, mostly newer Unix System V's, the shared library is included
+by putting the option "-lc_s" as the last thing on the cc command line when
+linking.  Other systems use shared libraries by default.  There may be other
+libraries needed to compile $package on your machine as well.  If your system
+needs the "-lc_s" option, include it here.  Include any other special libraries
+here as well.  Say "none" for none.
+EOM
+
+echo " "
+rp="Any additional libraries?"
+. ./myread
+case "$ans" in
+none) libs=' ';;
+*) libs="$ans";;
+esac
+
diff --git a/U/libyacc.U b/U/libyacc.U
new file mode 100644 (file)
index 0000000..cfee077
--- /dev/null
@@ -0,0 +1,69 @@
+?X:  These units are based on the ones supplied with dist-3.0
+?X:  patchlevel 22.  They have been changed or enhanced to work with
+?X:  perl5alpha.  I would appreciate hearing about any changes,
+?X:  corrections, or enhancements.
+?X:    Andy Dougherty                  doughera@lafcol.lafayette.edu
+?X:    Dept. of Physics                
+?X:    Lafayette College       
+?X:    Easton, PA  18042-1782
+?X:     Sat Apr  2 15:45:17 EST 1994
+?RCS: $Id: libyacc.U,v 3.0.1.1 1994/01/24 14:13:49 ram Exp $
+?RCS:
+?RCS: Copyright (c) 1991-1993, Raphael Manfredi
+?RCS: 
+?RCS: You may redistribute only under the terms of the Artistic Licence,
+?RCS: as specified in the README file that comes with the distribution.
+?RCS: You may reuse parts of this distribution only within the terms of
+?RCS: that same Artistic Licence; a copy of which may be found at the root
+?RCS: of the source tree for dist 3.0.
+?RCS:
+?RCS: $Log: libyacc.U,v $
+?RCS: Revision 3.0.1.1  1994/01/24  14:13:49  ram
+?RCS: patch16: un-obsoleted this unit for smooth yacc compilations
+?RCS:
+?RCS: Revision 3.0  1993/08/18  12:09:04  ram
+?RCS: Baseline for dist 3.0 netwide release.
+?RCS:
+?MAKE:libyacc: Loc yacc libpth test
+?MAKE: -pick add $@ %<
+?S:libyacc:
+?S:    This variable contains the argument to pass to the loader in order
+?S:    to get the yacc library routines.  If there is no yacc or yacc
+?S:    library, it is null.
+?S:.
+?T:xxx
+: see if we should include -ly
+echo " "
+case "$yacc" in
+*byacc*)
+       echo "You are using byacc, so I won't look for a yacc library." >&4
+       libyacc=''
+       ;;
+*yacc)
+       if $test -r /usr/lib/liby.a || $test -r /usr/local/lib/liby.a ; then
+               echo "-ly found." >&4
+               libyacc='-ly'
+       else
+               xxx=`./loc liby.a x $libpth`
+               case "$xxx" in
+               x)
+                       echo "No yacc library found." >&4
+                       libyacc=''
+                       ;;
+               *)
+                       echo "yacc library found in $xxx." >&4
+                       libyacc="$xxx"
+                       ;;
+               esac
+       fi
+       ;;
+*bison*)
+       echo "You are using bison, so I won't look for a yacc library." >&4
+       libyacc=''
+       ;;
+*)
+echo "You don't seem to have yacc, so I won't look for the yacc library." >&4
+       libyacc=''
+       ;;
+esac
+
diff --git a/U/mallocsrc.U b/U/mallocsrc.U
new file mode 100644 (file)
index 0000000..3fc4ee7
--- /dev/null
@@ -0,0 +1,101 @@
+?X:  These units are based on the ones supplied with dist-3.0
+?X:  patchlevel 22.  They have been changed or enhanced to work with
+?X:  perl5alpha.  I would appreciate hearing about any changes,
+?X:  corrections, or enhancements.
+?X:    Andy Dougherty                  doughera@lafcol.lafayette.edu
+?X:    Dept. of Physics                
+?X:    Lafayette College       
+?X:    Easton, PA  18042-1782
+?X:     Sat Apr  2 15:45:17 EST 1994
+?RCS: $Id: mallocsrc.U,v 3.0 1993/08/18 12:09:12 ram Exp $
+?RCS:
+?RCS: Copyright (c) 1991-1993, Raphael Manfredi
+?RCS: 
+?RCS: You may redistribute only under the terms of the Artistic Licence,
+?RCS: as specified in the README file that comes with the distribution.
+?RCS: You may reuse parts of this distribution only within the terms of
+?RCS: that same Artistic Licence; a copy of which may be found at the root
+?RCS: of the source tree for dist 3.0.
+?RCS:
+?RCS: $Log: mallocsrc.U,v $
+?RCS: Revision 3.0  1993/08/18  12:09:12  ram
+?RCS: Baseline for dist 3.0 netwide release.
+?RCS:
+?MAKE:mallocsrc mallocobj usemymalloc malloctype: Myread Oldconfig package \
+       Guess test rm cat +cc +ccflags Findhdr
+?MAKE: -pick add $@ %<
+?S:usemymalloc:
+?S:    This variable contains y if the malloc that comes with this package
+?S:    is desired over the system's version of malloc.  People often include
+?S:    special versions of malloc for effiency, but such versions are often
+?S:    less portable.  See also mallocsrc and mallocobj.
+?S:.
+?S:mallocsrc:
+?S:    This variable contains the name of the malloc.c that comes with
+?S:    the package, if that malloc.c is preferred over the system malloc.
+?S:    Otherwise the value is null.  This variable is intended for generating
+?S:    Makefiles.
+?S:.
+?S:mallocobj:
+?S:    This variable contains the name of the malloc.o that this package
+?S:    generates, if that malloc.o is preferred over the system malloc.
+?S:    Otherwise the value is null.  This variable is intended for generating
+?S:    Makefiles.  See mallocsrc.
+?S:.
+?S:malloctype:
+?S:    This variable contains the kind of ptr returned by malloc and realloc.
+?S:.
+?C:Malloc_t (MALLOCPTRTYPE):
+?C:    This symbol is the type of pointer returned by malloc and realloc.
+?C:.
+?H:#define Malloc_t $malloctype                        /**/
+?H:.
+?X: Cannot test for mallocsrc; it is the unit's name and there is a bug in
+?X: the interpreter which defines all the names, even though they are not used.
+@if mallocobj
+: determine which malloc to compile in
+:  Old versions had dflt='y' only for bsd or v7.
+echo " "
+case "$usemymalloc" in
+'')
+       if bsd || v7; then
+               dflt='y'
+       else
+               dflt='y'
+       fi
+       ;;
+*)  dflt="$usemymalloc"
+       ;;
+esac
+rp="Do you wish to attempt to use the malloc that comes with $package?"
+. ./myread
+usemymalloc="$ans"
+case "$ans" in
+y*) mallocsrc='malloc.c'; mallocobj='malloc.o';;
+*) mallocsrc=''; mallocobj='';;
+esac
+
+@end
+@if MALLOCPTRTYPE || Malloc_t
+: compute the type returned by malloc
+echo " "
+case "$malloctype" in
+'')
+       if $test `./findhdr malloc.h`; then
+               echo "#include <malloc.h>" > malloc.c
+       fi
+#include <malloc.h>
+       $cat >>malloc.c <<'END'
+void *malloc();
+END
+       if $cc $ccflags -c malloc.c >/dev/null 2>&1; then
+               malloctype='void *'
+       else
+               malloctype='char *'
+       fi
+       $rm -f malloc.[co]
+       ;;
+esac
+echo "Your system wants malloc to return '$malloctype', it would seem." >&4
+
+@end
diff --git a/U/prototype.U b/U/prototype.U
new file mode 100644 (file)
index 0000000..8fa80e8
--- /dev/null
@@ -0,0 +1,124 @@
+?X:  These units are based on the ones supplied with dist-3.0
+?X:  patchlevel 22.  They have been changed or enhanced to work with
+?X:  perl5alpha.  I would appreciate hearing about any changes,
+?X:  corrections, or enhancements.
+?X:    Andy Dougherty                  doughera@lafcol.lafayette.edu
+?X:    Dept. of Physics                
+?X:    Lafayette College       
+?X:    Easton, PA  18042-1782
+?X:     Sat Apr  2 15:45:17 EST 1994
+?RCS: $Id: prototype.U,v 3.0.1.2 1994/01/24 14:15:36 ram Exp $
+?RCS:
+?RCS: Copyright (c) 1991-1993, Raphael Manfredi
+?RCS: 
+?RCS: You may redistribute only under the terms of the Artistic Licence,
+?RCS: as specified in the README file that comes with the distribution.
+?RCS: You may reuse parts of this distribution only within the terms of
+?RCS: that same Artistic Licence; a copy of which may be found at the root
+?RCS: of the source tree for dist 3.0.
+?RCS:
+?RCS: $Log: prototype.U,v $
+?RCS: Revision 3.0.1.2  1994/01/24  14:15:36  ram
+?RCS: patch16: prototype handling macros now appear only when needed
+?RCS:
+?RCS: Revision 3.0.1.1  1993/08/25  14:03:12  ram
+?RCS: patch6: defines were referring to non-existent VOID symbol
+?RCS:
+?RCS: Revision 3.0  1993/08/18  12:09:36  ram
+?RCS: Baseline for dist 3.0 netwide release.
+?RCS:
+?MAKE:prototype: Myread Oldconfig cat +cc rm Setvar
+?MAKE: -pick add $@ %<
+?S:prototype:
+?S:    This variable holds the eventual value of CAN_PROTOTYPE, which
+?S:    indicates the C compiler can handle funciton prototypes.
+?S:.
+?C:CAN_PROTOTYPE ~ %<:
+?C:    If defined, this macro indicates that the C compiler can handle
+?C:    function prototypes.
+?C:.
+?C:DOTS:
+?C:    This macro is used to specify the ... in function prototypes which
+?C:    have arbitrary additional arguments.
+?C:.
+?C:NXT_ARG:
+?C:    This macro is used to separate arguments in the declared argument list.
+?C:.
+?C:P_FUNC:
+?C:    This macro is used to declare "private" (static) functions.
+?C:    It takes three arguments: the function type and name, a parenthesized
+?C:    traditional (comma separated) argument list, and the declared argument
+?C:    list (in which arguments are separated with NXT_ARG, and additional
+?C:    arbitrary arguments are specified with DOTS).  For example:
+?C:
+?C:            P_FUNC(int foo, (bar, baz), int bar NXT_ARG char *baz[])
+?C:.
+?C:P_FUNC_VOID:
+?C:    This macro is used to declare "private" (static) functions that have
+?C:    no arguments.  The macro takes one argument: the function type and name.
+?C:    For example:
+?C:
+?C:            P_FUNC_VOID(int subr)
+?C:.
+?C:V_FUNC:
+?C:    This macro is used to declare "public" (non-static) functions.
+?C:    It takes three arguments: the function type and name, a parenthesized
+?C:    traditional (comma separated) argument list, and the declared argument
+?C:    list (in which arguments are separated with NXT_ARG, and additional
+?C:    arbitrary arguments are specified with DOTS).  For example:
+?C:
+?C:            V_FUNC(int main, (argc, argv), int argc NXT_ARG char *argv[])
+?C:.
+?C:V_FUNC_VOID:
+?C:    This macro is used to declare "public" (non-static) functions that have
+?C:    no arguments.  The macro takes one argument: the function type and name.
+?C:    For example:
+?C:
+?C:            V_FUNC_VOID(int fork)
+?C:.
+?C:P:
+?C:    This macro is used to declare function parameters for folks who want
+?C:    to make declarations with prototypes using a different style than
+?C:    the above macros.  Use double parentheses.  For example:
+?C:
+?C:            int main P((int argc, char *argv[]));
+?C:.
+?H:?%<:#$prototype     CAN_PROTOTYPE   /**/
+?H:?%<:#ifdef CAN_PROTOTYPE
+?H:?NXT_ARG:#define    NXT_ARG ,
+?H:?DOTS:#define       DOTS , ...
+?H:?V_FUNC:#define     V_FUNC(name, arglist, args)name(args)
+?H:?P_FUNC:#define     P_FUNC(name, arglist, args)static name(args)
+?H:?V_FUNC_VOID:#define        V_FUNC_VOID(name)name(void)
+?H:?P_FUNC_VOID:#define        P_FUNC_VOID(name)static name(void)
+?H:?P:#define  P(args) args
+?H:?%<:#else
+?H:?NXT_ARG:#define    NXT_ARG ;
+?H:?DOTS:#define       DOTS
+?H:?V_FUNC:#define     V_FUNC(name, arglist, args)name arglist args;
+?H:?P_FUNC:#define     P_FUNC(name, arglist, args)static name arglist args;
+?H:?V_FUNC_VOID:#define        V_FUNC_VOID(name)name()
+?H:?P_FUNC_VOID:#define        P_FUNC_VOID(name)static name()
+?H:?P:#define  P(args) ()
+?H:?%<:#endif
+?H:.
+?W:%<:NXT_ARG DOTS V_FUNC P_FUNC V_FUNC_VOID P_FUNC_VOID _
+?LINT:set prototype
+: Cruising for prototypes
+echo " "
+echo "Checking out function prototypes..." >&4
+$cat >prototype.c <<'EOCP'
+main(int argc, char *argv[]) {
+       exit(0);}
+EOCP
+if $cc -c prototype.c >prototype.out 2>&1 ; then
+       echo "Your C compiler appears to support function prototypes."
+       val="$define"
+else
+       echo "Your C compiler doesn't seem to understand function prototypes."
+       val="$undef"
+fi
+set prototype
+eval $setvar
+$rm -f prototype*
+
diff --git a/U/voidflags.U b/U/voidflags.U
new file mode 100644 (file)
index 0000000..50b5d92
--- /dev/null
@@ -0,0 +1,161 @@
+?X:  These units are based on the ones supplied with dist-3.0
+?X:  patchlevel 22.  They have been changed or enhanced to work with
+?X:  perl5alpha.  I would appreciate hearing about any changes,
+?X:  corrections, or enhancements.
+?X:    Andy Dougherty                  doughera@lafcol.lafayette.edu
+?X:    Dept. of Physics                
+?X:    Lafayette College       
+?X:    Easton, PA  18042-1782
+?X:     Sat Apr  2 15:45:17 EST 1994
+?RCS: $Id: voidflags.U,v 3.0 1993/08/18 12:10:01 ram Exp $
+?RCS:
+?RCS: Copyright (c) 1991-1993, Raphael Manfredi
+?RCS: 
+?RCS: You may redistribute only under the terms of the Artistic Licence,
+?RCS: as specified in the README file that comes with the distribution.
+?RCS: You may reuse parts of this distribution only within the terms of
+?RCS: that same Artistic Licence; a copy of which may be found at the root
+?RCS: of the source tree for dist 3.0.
+?RCS:
+?RCS: $Log: voidflags.U,v $
+?RCS: Revision 3.0  1993/08/18  12:10:01  ram
+?RCS: Baseline for dist 3.0 netwide release.
+?RCS:
+?MAKE:voidflags defvoidused: cat rm contains cc package Oldconfig Myread
+?MAKE: -pick add $@ %<
+?S:voidflags:
+?S:    This variable contains the eventual value of the VOIDFLAGS symbol,
+?S:    which indicates how much support of the void type is given by this
+?S:    compiler.  See VOIDFLAGS for more info.
+?S:.
+?X:    Exceptionally, we have to explicitely alias the symbol name for
+?X: config_h.SH, otherwise the comment would not appear.
+?C:VOIDFLAGS ~ %<:
+?C:    This symbol indicates how much support of the void type is given by this
+?C:    compiler.  What various bits mean:
+?C:
+?C:        1 = supports declaration of void
+?C:        2 = supports arrays of pointers to functions returning void
+?C:        4 = supports comparisons between pointers to void functions and
+?C:                addresses of void functions
+?C:        8 = suports declaration of generic void pointers
+?C:
+?C:    The package designer should define VOIDUSED to indicate the requirements
+?C:    of the package.  This can be done either by #defining VOIDUSED before
+?C:    including config.h, or by defining defvoidused in Myinit.U.  If the
+?C:    latter approach is taken, only those flags will be tested.  If the
+?C:    level of void support necessary is not present, defines void to int.
+?C:.
+?H:?%<:#ifndef VOIDUSED
+?H:?%<:#  ifdef VOIDWANT
+?H:?%<:#    define VOIDUSED VOIDWANT
+?H:?%<:#  else
+?H:?%<:#    define VOIDUSED $defvoidused
+?H:?%<:#  endif
+?H:?%<:#endif
+?H:?%<:#define VOIDFLAGS $voidflags
+?H:?%<:#if (VOIDFLAGS & VOIDUSED) != VOIDUSED
+?H:?%<:#  define void int              /* is void to be avoided? */
+?H:?%<:#  define M_VOID                        /* Xenix strikes again */
+?H:?%<:#  define VOID
+?H:?%<:#else
+?H:?%<:#  define VOID void
+?H:?%<:#endif
+?H:.
+?W:%<:void VOID VOIDWANT
+?INIT:: full support for void wanted by default
+?INIT:defvoidused=15
+?INIT:
+?LINT:describe defvoidused
+?LINT:known void M_VOID VOIDUSED
+: check for void type
+echo " "
+$cat >&4 <<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.
+    8: generic void pointers.
+
+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 & 8
+       void *hue;              /* generic ptr */
+#endif
+#if TRY & 2
+       void (*foo[10])();
+#endif
+
+#if TRY & 4
+       if(goo == moo) {
+               exit(0);
+       }
+#endif
+       exit(0);
+}
+EOCP
+?X: This unit used to use cc -S in those tests to try to speed up things, but
+?X: unfortunately, AIX 3.2 does not support this option.
+       if $cc -c -DTRY=$defvoidused try.c >.out 2>&1 ; then
+               voidflags=$defvoidused
+       echo "It appears to support void to the level $package wants ($defvoidused)."
+               if $contains warning .out >/dev/null 2>&1; then
+                       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..." >&4
+               if $cc -c -DTRY=1 try.c >/dev/null 2>&1 ; then
+                       echo "It supports 1..."
+                       if $cc -c -DTRY=3 try.c >/dev/null 2>&1 ; then
+                               echo "It also supports 2..."
+                               if $cc -c -DTRY=7 try.c >/dev/null 2>&1 ; then
+                                       voidflags=7
+                                       echo "And it supports 4 but not 8 definitely."
+                               else
+                                       echo "It doesn't support 4..."
+                                       if $cc -c -DTRY=11 try.c >/dev/null 2>&1 ; then
+                                               voidflags=11
+                                               echo "But it supports 8."
+                                       else
+                                               voidflags=3
+                                               echo "Neither does it support 8."
+                                       fi
+                               fi
+                       else
+                               echo "It does not support 2..."
+                               if $cc -c -DTRY=13 try.c >/dev/null 2>&1 ; then
+                                       voidflags=13
+                                       echo "But it supports 4 and 8."
+                               else
+                                       if $cc -c -DTRY=5 try.c >/dev/null 2>&1 ; then
+                                               voidflags=5
+                                               echo "And it supports 4 but has not heard about 8."
+                                       else
+                                               echo "However it supports 8 but not 4."
+                                       fi
+                               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?"
+. ./myread
+voidflags="$ans"
+$rm -f try.* .out
+
diff --git a/U/yacc.U b/U/yacc.U
new file mode 100644 (file)
index 0000000..0b777a7
--- /dev/null
+++ b/U/yacc.U
@@ -0,0 +1,91 @@
+?X:  These units are based on the ones supplied with dist-3.0
+?X:  patchlevel 22.  They have been changed or enhanced to work with
+?X:  perl5alpha.  I would appreciate hearing about any changes,
+?X:  corrections, or enhancements.
+?X:    Andy Dougherty                  doughera@lafcol.lafayette.edu
+?X:    Dept. of Physics                
+?X:    Lafayette College       
+?X:    Easton, PA  18042-1782
+?X:     Sat Apr  2 15:45:17 EST 1994
+?RCS: $Id: yacc.U,v 3.0 1993/08/18 12:10:03 ram Exp $
+?RCS:
+?RCS: Copyright (c) 1991-1993, Raphael Manfredi
+?RCS: 
+?RCS: You may redistribute only under the terms of the Artistic Licence,
+?RCS: as specified in the README file that comes with the distribution.
+?RCS: You may reuse parts of this distribution only within the terms of
+?RCS: that same Artistic Licence; a copy of which may be found at the root
+?RCS: of the source tree for dist 3.0.
+?RCS:
+?RCS: $Log: yacc.U,v $
+?RCS: Revision 3.0  1993/08/18  12:10:03  ram
+?RCS: Baseline for dist 3.0 netwide release.
+?RCS:
+?MAKE:yacc yaccflags: Guess Myread Oldconfig byacc bison cat test
+?MAKE: -pick add $@ %<
+?S:yacc:
+?S:    This variable holds the name of the compiler compiler we
+?S:    want to use in the Makefile. It can be yacc, byacc, or bison -y.
+?S:.
+?S:yaccflags:
+?S:    This variable contains any additional yacc flags desired by the
+?S:    user.  It is up to the Makefile to use this.
+?S:.
+: determine compiler compiler
+case "$yacc" in
+'')
+       dflt=yacc;;
+*)
+       dflt="$yacc";;
+esac
+echo " "
+rp="yacc"
+if $test -f "$byacc"; then
+       dflt="$byacc"
+       rp="byacc or $rp"
+fi
+if $test -f "$bison"; then
+       rp="$rp or bison -y"
+fi
+$cat <<EOM
+$package no longer requires a compiler compiler, so the following is
+optional.
+EOM
+rp="Which compiler compiler ($rp) shall I use?"
+. ./myread
+yacc="$ans"
+case "$yacc" in
+*bis*)
+       case "$yacc" in
+       *-y*) ;;
+       *)
+               yacc="$yacc -y"
+               echo "(Adding -y option to bison to get yacc-compatible behaviour.)"
+               ;;
+       esac
+       ;;
+esac
+
+@if yaccflags
+: see if we need extra yacc flags
+dflt="$yaccflags"
+case "$dflt" in
+'') dflt=none;;
+esac
+$cat <<EOH
+
+Your yacc program may need extra flags to normally process the parser sources.
+Do NOT specify any -d or -v flags here, since those are explicitely known
+by the various Makefiles. However, if your machine has strange/undocumented
+options (like -Sr# on SCO to specify the maximum number of grammar rules), then
+please add them here.  To use no flags, specify the word "none".
+
+EOH
+rp="Any additional yacc flags?"
+. ./myread
+case "$ans" in
+none) yaccflags='';;
+*) yaccflags="$ans";;
+esac
+
+@end
diff --git a/Wanted b/Wanted
new file mode 100644 (file)
index 0000000..4bc9551
--- /dev/null
+++ b/Wanted
@@ -0,0 +1,361 @@
+!>CHARVSPRINTF
+!>GIDTYPE
+!>HAS_GDBM
+!>SAFE_BCOPY
+!>STATBLOCKS
+!>STDSTDIO
+!>UIDTYPE
+>ALIGNBYTES
+>BIN
+>BSD
+>BYTEORDER
+>CASTFLAGS
+>CASTI32
+>CASTNEGFLOAT
+>CHARSPRINTF
+>CPPMINUS
+>CPPSTDIN
+>CSH
+>DIRNAMLEN
+>DOSUID
+>EUNICE
+>FLEXFILENAMES
+>F_OK
+>GROUPSTYPE
+>Gid_t
+>HASVOLATILE
+>HAS_BCMP
+>HAS_BCOPY
+>HAS_BZERO
+>HAS_CHSIZE
+>HAS_CRYPT
+>HAS_DUP2
+>HAS_FCHMOD
+>HAS_FCHOWN
+>HAS_FCNTL
+>HAS_FLOCK
+>HAS_GETGROUPS
+>HAS_GETHOSTENT
+>HAS_GETPGRP
+>HAS_GETPGRP2
+>HAS_GETPRIORITY
+>HAS_HTONL
+>HAS_HTONS
+>HAS_ISASCII
+>HAS_KILLPG
+>HAS_LINK
+>HAS_LSTAT
+>HAS_MEMCMP
+>HAS_MEMCPY
+>HAS_MEMMOVE
+>HAS_MEMSET
+>HAS_MKDIR
+>HAS_MSG
+>HAS_MSGCTL
+>HAS_MSGGET
+>HAS_MSGRCV
+>HAS_MSGSND
+>HAS_NTOHL
+>HAS_NTOHS
+>HAS_OPEN3
+>HAS_READDIR
+>HAS_RENAME
+>HAS_RMDIR
+>HAS_SAFE_BCOPY
+>HAS_SAFE_MEMCPY
+>HAS_SELECT
+>HAS_SEM
+>HAS_SEMCTL
+>HAS_SEMGET
+>HAS_SEMOP
+>HAS_SETEGID
+>HAS_SETEUID
+>HAS_SETLOCALE
+>HAS_SETPGID
+>HAS_SETPGRP
+>HAS_SETPGRP2
+>HAS_SETPRIORITY
+>HAS_SETREGID
+>HAS_SETRESGID
+>HAS_SETRESUID
+>HAS_SETREUID
+>HAS_SETRGID
+>HAS_SETRUID
+>HAS_SETSID
+>HAS_SHM
+>HAS_SHMAT
+>HAS_SHMCTL
+>HAS_SHMDT
+>HAS_SHMGET
+>HAS_SOCKET
+>HAS_SOCKETPAIR
+>HAS_STRERROR
+>HAS_SYMLINK
+>HAS_SYSCALL
+>HAS_SYSTEM
+>HAS_SYS_ERRLIST
+>HAS_TIMES
+>HAS_TRUNCATE
+>HAS_UNAME
+>HAS_VFORK
+>HAS_VPRINTF
+>HAS_WAIT4
+>HAS_WAITPID
+>INTSIZE
+>I_DBM
+>I_DIRENT
+>I_FCNTL
+>I_GDBM
+>I_GRP
+>I_NDBM
+>I_NDIR
+>I_NETINET_IN
+>I_PWD
+>I_STDARG
+>I_STDDEF
+>I_SYS_DIR
+>I_SYS_FILE
+>I_SYS_IN
+>I_SYS_IOCTL
+>I_SYS_NDIR
+>I_SYS_SELECT
+>I_SYS_TIME
+>I_TIME
+>I_UTIME
+>I_VARARGS
+>I_VFORK
+>Malloc_t
+>O_APPEND
+>O_CREAT
+>O_EXCL
+>O_RDONLY
+>O_RDWR
+>O_TRUNC
+>O_WRONLY
+>PRIVLIB
+>PWAGE
+>PWCHANGE
+>PWCLASS
+>PWCOMMENT
+>PWEXPIRE
+>PWQUOTA
+>RANDBITS
+>R_OK
+>SCRIPTDIR
+>SIG_NAME
+>STDCHAR
+>Strerror
+>USE_CHAR_VSPRINTF
+>USE_OLDSOCKET
+>USE_STAT_BLOCKS
+>USE_STD_STDIO
+>USE_STRUCT_COPY
+>Uid_t
+>VMS
+>VOID
+>VOIDSIG
+>VOIDWANT
+>W_OK
+>X_OK
+>_
+>bcmp
+>bcopy
+>bzero
+>const
+>dlopen
+>getgroups
+>index
+>rindex
+>va_dcl
+>vfork
+>void
+>volatile
+Date
+Log
+RCSfile
+Revision
+alignbytes
+bin
+byacc
+byteorder
+c
+castflags
+cat
+cc
+ccflags
+cp
+cppflags
+cppminus
+cppstdin
+cryptlib
+csh
+d_access
+d_bcmp
+d_bcopy
+d_bsd
+d_bzero
+d_casti32
+d_castneg
+d_charsprf
+d_charvspr
+d_chsize
+d_const
+d_crypt
+d_csh
+d_dirnamlen
+d_dosuid
+d_dup2
+d_eunice
+d_fchmod
+d_fchown
+d_fcntl
+d_flexfnam
+d_flock
+d_gethent
+d_getpgrp
+d_getpgrp2
+d_getprior
+d_htonl
+d_isascii
+d_killpg
+d_link
+d_lstat
+d_memcmp
+d_memcpy
+d_memmove
+d_memset
+d_mkdir
+d_msg
+d_msgctl
+d_msgget
+d_msgrcv
+d_msgsnd
+d_oldsock
+d_open3
+d_pwage
+d_pwchange
+d_pwclass
+d_pwcomment
+d_pwexpire
+d_pwquota
+d_readdir
+d_rename
+d_rmdir
+d_safebcpy
+d_safemcpy
+d_select
+d_sem
+d_semctl
+d_semget
+d_semop
+d_setegid
+d_seteuid
+d_setlocale
+d_setpgid
+d_setpgrp
+d_setpgrp2
+d_setprior
+d_setregid
+d_setresgid
+d_setresuid
+d_setreuid
+d_setrgid
+d_setruid
+d_setsid
+d_shm
+d_shmat
+d_shmctl
+d_shmdt
+d_shmget
+d_socket
+d_sockpair
+d_statblks
+d_stdstdio
+d_strchr
+d_strctcpy
+d_strerrm
+d_strerror
+d_symlink
+d_syscall
+d_syserrlst
+d_system
+d_times
+d_truncate
+d_uname
+d_vfork
+d_voidsig
+d_volatile
+d_vprintf
+d_wait4
+d_waitpid
+dlobj
+dlsrc
+echo
+egrep
+eunicefix
+expr
+extensions
+find
+gidtype
+groupstype
+i_dbm
+i_dirent
+i_fcntl
+i_gdbm
+i_grp
+i_ndbm
+i_ndir
+i_niin
+i_pwd
+i_stdarg
+i_stddef
+i_sysdir
+i_sysfile
+i_sysin
+i_sysioctl
+i_sysndir
+i_sysselct
+i_systime
+i_time
+i_utime
+i_varargs
+i_varhdr
+i_vfork
+installbin
+installprivlib
+intsize
+large
+ldflags
+lib
+libs
+line
+mallocobj
+mallocsrc
+malloctype
+manext
+mansrc
+mkdir
+mv
+n
+optimize
+perl
+privlib
+prototype
+randbits
+rm
+scriptdir
+sed
+sig_name
+small
+sort
+spitshell
+split
+startsh
+stdchar
+test
+tr
+uidtype
+uname
+uniq
+voidflags
+yacc
diff --git a/autosplit b/autosplit
new file mode 100755 (executable)
index 0000000..a57b6fe
--- /dev/null
+++ b/autosplit
@@ -0,0 +1,29 @@
+#!./miniperl
+
+chdir "lib" if -d "lib";
+
+$package = shift;
+
+$filename = "$package.pm";
+open(IN, $filename) || die "Can't open $filename: $!\n";
+while (<IN>) {
+    last if /^__END__/;
+}
+$_ or die "Can't find __END__ in $filename\n";
+
+mkdir "auto/$package", 0777 unless -d "auto/$package";
+while (<IN>) {
+    if (/^sub ([\w:]+)/) {
+       $name = $1;
+       print OUT "1;\n";
+       $newname = "auto/$package/$name.al";
+       open(OUT, ">$newname") or warn "Can't create $newname: $!\n";
+       print OUT <<"END";
+# NOTE:  Derived from $package.pm.  Changes made here will be lost.
+package $package;
+
+END
+    }
+    print OUT $_;
+}
+print OUT "1;\n";
diff --git a/bar b/bar
index 5288a3e..59bf5cf 100755 (executable)
--- a/bar
+++ b/bar
@@ -2,7 +2,31 @@
 
 require POSIX; import POSIX;
 
-print &getpid, "\n";
+$sigset = new POSIX::SigSet 1,3;
+delset $sigset 1;
+if (ismember $sigset 1) { print "BAD\n" }
+if (ismember $sigset 3) { print "GOOD\n" }
+$mask = new POSIX::SigSet &SIGINT;
+$action = new POSIX::SigAction 'main::SigHUP', $mask, 0;
+sigaction(&SIGHUP, $action);
+kill HUP, $$;
+print "DONE\n";
 
-@uname = &uname;
-print "@uname\n";
+sub SigHUP {
+    print "SigHUP1\n";
+    sleep 10;
+    print "SigHUP2\n";
+}
+
+__END__
+print &_POSIX_OPEN_MAX, "\n";
+
+$x =  setlocale(&LC_NUMERIC, "En_TRY");
+print $x,"\n";
+$! = 12;
+
+print +POSIX::errno(), "\n";
+print 123.45,"\n";
+__END__
+$lconv = localeconv();
+print %$lconv, "\n";
diff --git a/bar.out b/bar.out
new file mode 100644 (file)
index 0000000..4cdb333
--- /dev/null
+++ b/bar.out
@@ -0,0 +1,500 @@
+
+SUB main::BEGIN = {
+8   TYPE = subroutine exit  ===> DONE
+    FLAGS = (UNKNOWN,KIDS)
+    {
+        TYPE = line sequence  ===> (8)
+        FLAGS = (UNKNOWN,KIDS,PARENS)
+        {
+1           TYPE = next statement  ===> 2
+            FLAGS = (SCALAR)
+            LINE = 4
+        }
+        {
+3           TYPE = require  ===> 4
+            FLAGS = (SCALAR,KIDS)
+            {
+                TYPE = scalar  ===> (3)
+                FLAGS = (SCALAR,KIDS)
+                {
+                    TYPE = null operation  ===> (2)
+                      (was pushmark)
+                    FLAGS = (SCALAR)
+                }
+                {
+2                   TYPE = constant item  ===> 3
+                    FLAGS = (SCALAR)
+                    SV = PV("stat.pl")
+                }
+            }
+        }
+        {
+4           TYPE = next statement  ===> 5
+            FLAGS = (SCALAR)
+            LINE = 5
+        }
+        {
+7           TYPE = print  ===> 8
+            FLAGS = (SCALAR,KIDS)
+            {
+5               TYPE = pushmark  ===> 6
+                FLAGS = (SCALAR)
+            }
+            {
+                TYPE = scalar  ===> (7)
+                FLAGS = (SCALAR,KIDS)
+                {
+                    TYPE = null operation  ===> (6)
+                      (was pushmark)
+                    FLAGS = (SCALAR)
+                }
+                {
+6                   TYPE = constant item  ===> 7
+                    FLAGS = (SCALAR)
+                    SV = PV("here
+")
+                }
+            }
+        }
+    }
+}
+{
+111 TYPE = eval exit  ===> DONE
+    FLAGS = (UNKNOWN,KIDS)
+    {
+        TYPE = line sequence  ===> (111)
+        FLAGS = (UNKNOWN,KIDS)
+        {
+31          TYPE = next statement  ===> 32
+            LINE = 8
+        }
+        {
+36          TYPE = scalar assignment  ===> 37
+            FLAGS = (SCALAR,KIDS,STACKED)
+            {
+34              TYPE = addition  ===> 35
+                TARG = 1
+                FLAGS = (SCALAR,KIDS)
+                {
+32                  TYPE = constant item  ===> 33
+                    FLAGS = (SCALAR)
+                    SV = IV(0)
+                }
+                {
+                    TYPE = null operation  ===> (34)
+                      (was ref-to-scalar cast)
+                    FLAGS = (SCALAR,KIDS)
+                    {
+33                      TYPE = scalar variable  ===> 34
+                        FLAGS = (SCALAR)
+                        GV = main::[
+                    }
+                }
+            }
+            {
+                TYPE = null operation  ===> (36)
+                  (was ref-to-scalar cast)
+                FLAGS = (SCALAR,KIDS,LVAL,SPECIAL)
+                {
+35                  TYPE = scalar variable  ===> 36
+                    FLAGS = (SCALAR)
+                    GV = main::ST_DEV
+                }
+            }
+        }
+        {
+37          TYPE = next statement  ===> 38
+            LINE = 9
+        }
+        {
+42          TYPE = scalar assignment  ===> 43
+            FLAGS = (SCALAR,KIDS,STACKED)
+            {
+40              TYPE = addition  ===> 41
+                TARG = 1
+                FLAGS = (SCALAR,KIDS)
+                {
+38                  TYPE = constant item  ===> 39
+                    FLAGS = (SCALAR)
+                    SV = IV(1)
+                }
+                {
+                    TYPE = null operation  ===> (40)
+                      (was ref-to-scalar cast)
+                    FLAGS = (SCALAR,KIDS)
+                    {
+39                      TYPE = scalar variable  ===> 40
+                        FLAGS = (SCALAR)
+                        GV = main::[
+                    }
+                }
+            }
+            {
+                TYPE = null operation  ===> (42)
+                  (was ref-to-scalar cast)
+                FLAGS = (SCALAR,KIDS,LVAL,SPECIAL)
+                {
+41                  TYPE = scalar variable  ===> 42
+                    FLAGS = (SCALAR)
+                    GV = main::ST_INO
+                }
+            }
+        }
+        {
+43          TYPE = next statement  ===> 44
+            LINE = 10
+        }
+        {
+48          TYPE = scalar assignment  ===> 49
+            FLAGS = (SCALAR,KIDS,STACKED)
+            {
+46              TYPE = addition  ===> 47
+                TARG = 1
+                FLAGS = (SCALAR,KIDS)
+                {
+44                  TYPE = constant item  ===> 45
+                    FLAGS = (SCALAR)
+                    SV = IV(2)
+                }
+                {
+                    TYPE = null operation  ===> (46)
+                      (was ref-to-scalar cast)
+                    FLAGS = (SCALAR,KIDS)
+                    {
+45                      TYPE = scalar variable  ===> 46
+                        FLAGS = (SCALAR)
+                        GV = main::[
+                    }
+                }
+            }
+            {
+                TYPE = null operation  ===> (48)
+                  (was ref-to-scalar cast)
+                FLAGS = (SCALAR,KIDS,LVAL,SPECIAL)
+                {
+47                  TYPE = scalar variable  ===> 48
+                    FLAGS = (SCALAR)
+                    GV = main::ST_MODE
+                }
+            }
+        }
+        {
+49          TYPE = next statement  ===> 50
+            LINE = 11
+        }
+        {
+54          TYPE = scalar assignment  ===> 55
+            FLAGS = (SCALAR,KIDS,STACKED)
+            {
+52              TYPE = addition  ===> 53
+                TARG = 1
+                FLAGS = (SCALAR,KIDS)
+                {
+50                  TYPE = constant item  ===> 51
+                    FLAGS = (SCALAR)
+                    SV = IV(3)
+                }
+                {
+                    TYPE = null operation  ===> (52)
+                      (was ref-to-scalar cast)
+                    FLAGS = (SCALAR,KIDS)
+                    {
+51                      TYPE = scalar variable  ===> 52
+                        FLAGS = (SCALAR)
+                        GV = main::[
+                    }
+                }
+            }
+            {
+                TYPE = null operation  ===> (54)
+                  (was ref-to-scalar cast)
+                FLAGS = (SCALAR,KIDS,LVAL,SPECIAL)
+                {
+53                  TYPE = scalar variable  ===> 54
+                    FLAGS = (SCALAR)
+                    GV = main::ST_NLINK
+                }
+            }
+        }
+        {
+55          TYPE = next statement  ===> 56
+            LINE = 12
+        }
+        {
+60          TYPE = scalar assignment  ===> 61
+            FLAGS = (SCALAR,KIDS,STACKED)
+            {
+58              TYPE = addition  ===> 59
+                TARG = 1
+                FLAGS = (SCALAR,KIDS)
+                {
+56                  TYPE = constant item  ===> 57
+                    FLAGS = (SCALAR)
+                    SV = IV(4)
+                }
+                {
+                    TYPE = null operation  ===> (58)
+                      (was ref-to-scalar cast)
+                    FLAGS = (SCALAR,KIDS)
+                    {
+57                      TYPE = scalar variable  ===> 58
+                        FLAGS = (SCALAR)
+                        GV = main::[
+                    }
+                }
+            }
+            {
+                TYPE = null operation  ===> (60)
+                  (was ref-to-scalar cast)
+                FLAGS = (SCALAR,KIDS,LVAL,SPECIAL)
+                {
+59                  TYPE = scalar variable  ===> 60
+                    FLAGS = (SCALAR)
+                    GV = main::ST_UID
+                }
+            }
+        }
+        {
+61          TYPE = next statement  ===> 62
+            LINE = 13
+        }
+        {
+66          TYPE = scalar assignment  ===> 67
+            FLAGS = (SCALAR,KIDS,STACKED)
+            {
+64              TYPE = addition  ===> 65
+                TARG = 1
+                FLAGS = (SCALAR,KIDS)
+                {
+62                  TYPE = constant item  ===> 63
+                    FLAGS = (SCALAR)
+                    SV = IV(5)
+                }
+                {
+                    TYPE = null operation  ===> (64)
+                      (was ref-to-scalar cast)
+                    FLAGS = (SCALAR,KIDS)
+                    {
+63                      TYPE = scalar variable  ===> 64
+                        FLAGS = (SCALAR)
+                        GV = main::[
+                    }
+                }
+            }
+            {
+                TYPE = null operation  ===> (66)
+                  (was ref-to-scalar cast)
+                FLAGS = (SCALAR,KIDS,LVAL,SPECIAL)
+                {
+65                  TYPE = scalar variable  ===> 66
+                    FLAGS = (SCALAR)
+                    GV = main::ST_GID
+                }
+            }
+        }
+        {
+67          TYPE = next statement  ===> 68
+            LINE = 14
+        }
+        {
+72          TYPE = scalar assignment  ===> 73
+            FLAGS = (SCALAR,KIDS,STACKED)
+            {
+70              TYPE = addition  ===> 71
+                TARG = 1
+                FLAGS = (SCALAR,KIDS)
+                {
+68                  TYPE = constant item  ===> 69
+                    FLAGS = (SCALAR)
+                    SV = IV(6)
+                }
+                {
+                    TYPE = null operation  ===> (70)
+                      (was ref-to-scalar cast)
+                    FLAGS = (SCALAR,KIDS)
+                    {
+69                      TYPE = scalar variable  ===> 70
+                        FLAGS = (SCALAR)
+                        GV = main::[
+                    }
+                }
+            }
+            {
+                TYPE = null operation  ===> (72)
+                  (was ref-to-scalar cast)
+                FLAGS = (SCALAR,KIDS,LVAL,SPECIAL)
+                {
+71                  TYPE = scalar variable  ===> 72
+                    FLAGS = (SCALAR)
+                    GV = main::ST_RDEV
+                }
+            }
+        }
+        {
+73          TYPE = next statement  ===> 74
+            LINE = 15
+        }
+        {
+78          TYPE = scalar assignment  ===> 79
+            FLAGS = (SCALAR,KIDS,STACKED)
+            {
+76              TYPE = addition  ===> 77
+                TARG = 1
+                FLAGS = (SCALAR,KIDS)
+                {
+74                  TYPE = constant item  ===> 75
+                    FLAGS = (SCALAR)
+                    SV = IV(7)
+                }
+                {
+                    TYPE = null operation  ===> (76)
+                      (was ref-to-scalar cast)
+                    FLAGS = (SCALAR,KIDS)
+                    {
+75                      TYPE = scalar variable  ===> 76
+                        FLAGS = (SCALAR)
+                        GV = main::[
+                    }
+                }
+            }
+            {
+                TYPE = null operation  ===> (78)
+                  (was ref-to-scalar cast)
+                FLAGS = (SCALAR,KIDS,LVAL,SPECIAL)
+                {
+77                  TYPE = scalar variable  ===> 78
+                    FLAGS = (SCALAR)
+                    GV = main::ST_SIZE
+                }
+            }
+        }
+        {
+79          TYPE = next statement  ===> 80
+            LINE = 16
+        }
+        {
+84          TYPE = scalar assignment  ===> 85
+            FLAGS = (SCALAR,KIDS,STACKED)
+            {
+82              TYPE = addition  ===> 83
+                TARG = 1
+                FLAGS = (SCALAR,KIDS)
+                {
+80                  TYPE = constant item  ===> 81
+                    FLAGS = (SCALAR)
+                    SV = IV(8)
+                }
+                {
+                    TYPE = null operation  ===> (82)
+                      (was ref-to-scalar cast)
+                    FLAGS = (SCALAR,KIDS)
+                    {
+81                      TYPE = scalar variable  ===> 82
+                        FLAGS = (SCALAR)
+                        GV = main::[
+                    }
+                }
+            }
+            {
+                TYPE = null operation  ===> (84)
+                  (was ref-to-scalar cast)
+                FLAGS = (SCALAR,KIDS,LVAL,SPECIAL)
+                {
+83                  TYPE = scalar variable  ===> 84
+                    FLAGS = (SCALAR)
+                    GV = main::ST_ATIME
+                }
+            }
+        }
+        {
+85          TYPE = next statement  ===> 86
+            LINE = 17
+        }
+        {
+90          TYPE = scalar assignment  ===> 91
+            FLAGS = (SCALAR,KIDS,STACKED)
+            {
+88              TYPE = addition  ===> 89
+                TARG = 1
+                FLAGS = (SCALAR,KIDS)
+                {
+86                  TYPE = constant item  ===> 87
+                    FLAGS = (SCALAR)
+                    SV = IV(9)
+                }
+                {
+                    TYPE = null operation  ===> (88)
+                      (was ref-to-scalar cast)
+                    FLAGS = (SCALAR,KIDS)
+                    {
+87                      TYPE = scalar variable  ===> 88
+                        FLAGS = (SCALAR)
+                        GV = main::[
+                    }
+                }
+            }
+            {
+                TYPE = null operation  ===> (90)
+                  (was ref-to-scalar cast)
+                FLAGS = (SCALAR,KIDS,LVAL,SPECIAL)
+                {
+89                  TYPE = scalar variable  ===> 90
+                    FLAGS = (SCALAR)
+                    GV = main::ST_MTIME
+                }
+            }
+        }
+        {
+91          TYPE = next statement  ===> 92
+            LINE = 18
+        }
+        {
+96          TYPE = scalar assignment  ===> 97
+            FLAGS = (SCALAR,KIDS,STACKED)
+            {
+94              TYPE = addition  ===> 95
+                TARG = 1
+                FLAGS = (SCALAR,KIDS)
+                {
+92                  TYPE = constant item  ===> 93
+                    FLAGS = (SCALAR)
+                    SV = IV(10)
+                }
+                {
+                    TYPE = null operation  ===> (94)
+                      (was ref-to-scalar cast)
+                    FLAGS = (SCALAR,KIDS)
+                    {
+93                      TYPE = scalar variable  ===> 94
+                        FLAGS = (SCALAR)
+                        GV = main::[
+                    }
+                }
+            }
+            {
+                TYPE = null operation  ===> (96)
+                  (was ref-to-scalar cast)
+                FLAGS = (SCALAR,KIDS,LVAL,SPECIAL)
+                {
+95                  TYPE = scalar variable  ===> 96
+                    FLAGS = (SCALAR)
+                    GV = main::ST_CTIME
+                }
+            }
+        }
+        {
+97          TYPE = next statement  ===> 98
+            LINE = 19
+        }
+        {
+102         TYPE = scalar assignment  ===> 103
+            FLAGS = (SCALAR,KIDS,STACKED)
+            {
+100             TYPE = addition  ===> 101
+                TARG = 1
+                FLAGS = (SCALAR,KIDS)
+                {
+98                  TYPE = constant item  ===> 99
+                    FLAGS = (SCALAR)
+                    SV = IV(11)
+                }
diff --git a/cflags b/cflags
index a2cbc62..a2ee627 100755 (executable)
--- a/cflags
+++ b/cflags
@@ -38,7 +38,36 @@ for file do
     : or customize here
 
     case "$file" in
-    SDBM*) ccflags="$ccflags -pic";;
+    NDBM_File) ;;
+    ODBM_File) ;;
+    POSIX) ;;
+    SDBM_File) ;;
+    av) ;;
+    deb) ;;
+    dl) ;;
+    doio) ;;
+    doop) ;;
+    dump) ;;
+    gv) ;;
+    hv) ;;
+    main) ;;
+    malloc) ;;
+    mg) ;;
+    miniperlmain) ;;
+    op) ;;
+    perl) ;;
+    perlmain) ;;
+    perly) ;;
+    pp) ;;
+    regcomp) ;;
+    regexec) ;;
+    run) ;;
+    scope) ;;
+    sv) ;;
+    taint) ;;
+    toke) ;;
+    usersub) ;;
+    util) ;;
     *) ;;
     esac
 
index c1510ea..dc1c9de 100755 (executable)
--- a/cflags.SH
+++ b/cflags.SH
@@ -65,48 +65,36 @@ for file do
     : or customize here
 
     case "$file" in
-    array) ;;
-    cmd) ;;
-    cons) ;;
-    consarg) ;;
-    doarg) ;;
+    NDBM_File) ;;
+    ODBM_File) ;;
+    POSIX) ;;
+    SDBM_File) ;;
+    av) ;;
+    deb) ;;
+    dl) ;;
     doio) ;;
-    dolist) ;;
+    doop) ;;
     dump) ;;
-    eval) ;;
-    form) ;;
-    hash) ;;
+    gv) ;;
+    hv) ;;
+    main) ;;
     malloc) ;;
+    mg) ;;
+    miniperlmain) ;;
+    op) ;;
     perl) ;;
+    perlmain) ;;
     perly) ;;
+    pp) ;;
     regcomp) ;;
     regexec) ;;
-    stab) ;;
-    str) ;;
+    run) ;;
+    scope) ;;
+    sv) ;;
+    taint) ;;
     toke) ;;
     usersub) ;;
     util) ;;
-    tarray) ;;
-    tcmd) ;;
-    tcons) ;;
-    tconsarg) ;;
-    tdoarg) ;;
-    tdoio) ;;
-    tdolist) ;;
-    tdump) ;;
-    teval) ;;
-    tform) ;;
-    thash) ;;
-    tmalloc) ;;
-    tperl) ;;
-    tperly) ;;
-    tregcomp) ;;
-    tregexec) ;;
-    tstab) ;;
-    tstr) ;;
-    ttoke) ;;
-    tusersub) ;;
-    tutil) ;;
     *) ;;
     esac
 
index 09dd7ca..be6ef1c 100644 (file)
--- a/config.h
+++ b/config.h
-#ifndef config_h
-#define config_h
-/* config.h
- * This file was produced by running the config.h.SH script, which
+/*
+ * This file was produced by running the config_h.SH script, which
  * gets its values from config.sh, which is generally produced by
  * running Configure.
  *
  * Feel free to modify any of this as the need arises.  Note, however,
  * that running config.h.SH again will wipe out any changes you've made.
  * For a more permanent change edit config.sh and rerun config.h.SH.
+ *
+ * $Id: Config_h.U,v 3.0.1.2 1993/08/24 12:13:20 ram Exp $
+ */
+
+/* Configuration time: Mon Apr  4 15:17:26 PDT 1994
+ * Configured by: lwall
+ * Target system: sunos scalpel 4.1.3 3 sun4c 
  */
- /*SUPPRESS 460*/
 
+#ifndef _config_h_
+#define _config_h_
 
-/* 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             /**/
-
-/* LOC_SED
- *     This symbol holds the complete pathname to the sed program.
+/* BSD:
+ *     This symbol, if defined, indicates that the program is running under
+ *     a BSD system.
  */
-#define LOC_SED "/bin/sed"             /**/
+/*#define EUNICE               /**/
+/*#define VMS          /**/
+#define BSD            /**/
 
-/* ALIGNBYTES
- *     This symbol contains the number of bytes required to align a double.
- *     Usual values are 2, 4, and 8.
+/* ALIGNBYTES:
+ *     This symbol contains the number of bytes required to align a
+ *     double. Usual values are 2, 4 and 8.
  */
-#define ALIGNBYTES 8           /**/
+#define ALIGNBYTES 8   /**/
 
-/* BIN
- *     This symbol holds the name of the directory in which the user wants
- *     to keep publicly executable images for the package in question.  It
- *     is most often a local directory such as /usr/local/bin.
+/* BIN:
+ *     This symbol holds the path of the bin directory where the package will
+ *     be installed. Program must be prepared to deal with ~name substitution.
  */
-#define BIN "/usr/local/bin"             /**/
+#define BIN "/usr/local/bin"   /**/
 
-/* BYTEORDER
- *     This symbol contains an encoding of the order of bytes in a long.
- *     Usual values (in hex) are 0x1234, 0x4321, 0x2143, 0x3412...
+/* BYTEORDER:
+ *     This symbol hold the hexadecimal constant defined in byteorder,
+ *     i.e. 0x1234 or 0x4321, etc...
  */
-#define BYTEORDER 0x4321               /**/
+#define BYTEORDER 0x4321       /* large digits for MSB */
 
-/* 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".
+ *     output.  Typical value of "cc -E" or "/lib/cpp", but it can also
+ *     call a wrapper. See CPPRUN.
  */
-/* 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 "/usr/lib/cpp"
+#define CPPSTDIN "/tmp_mnt/vol/src/local/lwall/perl5/cppstdin"
 #define CPPMINUS ""
 
-/* 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.
+/* HAS_BCMP:
+ *     This symbol is defined if the bcmp() routine is available to
+ *     compare blocks of memory.
  */
-#define        HAS_BCMP                /**/
+#define HAS_BCMP       /**/
 
-/* HAS_BCOPY
- *     This symbol, if defined, indicates that the bcopy routine is available
- *     to copy blocks of memory.  Otherwise you should probably use memcpy().
- *     If neither is defined, roll your own.
- */
-/* SAFE_BCOPY
- *     This symbol, if defined, indicates that the bcopy routine is available
- *     to copy potentially overlapping copy blocks of bcopy.  Otherwise you
- *     should probably use memmove() or memcpy().  If neither is defined,
- *     roll your own.
+/* HAS_BCOPY:
+ *     This symbol is defined if the bcopy() routine is available to
+ *     copy blocks of memory.
  */
-#define        HAS_BCOPY               /**/
-#define        SAFE_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.
+/* HAS_BZERO:
+ *     This symbol is defined if the bzero() routine is available to
+ *     set a memory block to 0.
  */
-#define        HAS_BZERO               /**/
+#define HAS_BZERO      /**/
 
-/* 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.
+/* CASTNEGFLOAT:
+ *     This symbol is defined if the C compiler can cast negative
+ *     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:
+ *             0 = ok
  *             1 = couldn't cast < 0
  *             2 = couldn't cast >= 0x80000000
  */
-#define        CASTNEGFLOAT    /**/
-#define        CASTFLAGS 0     /**/
+#define        CASTNEGFLOAT            /**/
+#define CASTFLAGS 0            /**/
 
-/* CASTI32
- *     This symbol, if defined, indicates that this C compiler knows how to
- *     cast negative or large floating point numbers to 32-bit ints.
- */
-#define CASTI32        /**/
-
-/* 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
  */
 #define        CHARSPRINTF     /**/
 
-/* HAS_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.
  */
-/*#undef       HAS_CHSIZE              /**/
+/*#define      HAS_CHSIZE              /**/
 
-/* HAS_CRYPT
+/* HASCONST:
+ *     This symbol, if defined, indicates that this C compiler knows about
+ *     the const type. There is no need to actually test for that symbol
+ *     within your programs. The mere use of the "const" keyword will
+ *     trigger the necessary tests.
+ */
+/*#define HASCONST     /**/
+#ifndef HASCONST
+#define const
+#endif
+
+/* HAS_CRYPT:
  *     This symbol, if defined, indicates that the crypt routine is available
  *     to encrypt passwords and the like.
  */
-#define        HAS_CRYPT               /**/
+#define HAS_CRYPT              /**/
 
-/* CSH
+/* CSH:
  *     This symbol, if defined, indicates that the C-shell exists.
  *     If defined, contains the full pathname of csh.
  */
-#define CSH "/bin/csh"         /**/
+/*#define 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
  *     subprocesses to which it must pass the filename rather than the
  *     file descriptor of the script to be executed.
  */
-/*#undef DOSUID                /**/
+/*#define DOSUID               /**/
 
-/* HAS_DUP2
- *     This symbol, if defined, indicates that the dup2 routine is available
- *     to dup file descriptors.  Otherwise you should use dup().
+/* HAS_DUP2:
+ *     This symbol, if defined, indicates that the dup2 routine is
+ *     available to duplicate file descriptors.
  */
-#define        HAS_DUP2                /**/
+#define HAS_DUP2       /**/
 
-/* HAS_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        HAS_FCHMOD              /**/
+#define HAS_FCHMOD             /**/
 
-/* HAS_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        HAS_FCHOWN              /**/
+#define HAS_FCHOWN             /**/
 
-/* HAS_FCNTL
+/* HAS_FCNTL:
  *     This symbol, if defined, indicates to the C program that
  *     the fcntl() function exists.
  */
-#define        HAS_FCNTL               /**/
+#define HAS_FCNTL              /**/
 
-/* FLEXFILENAMES
+/* 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
+/* HAS_FLOCK:
+ *     This symbol, if defined, indicates that the flock routine is
  *     available to do file locking.
  */
-#define        HAS_FLOCK               /**/
+#define HAS_FLOCK              /**/
 
-/* HAS_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        HAS_GETGROUPS           /**/
+#define HAS_GETGROUPS          /**/
 
-/* HAS_GETHOSTENT
- *     This symbol, if defined, indicates that the gethostent() routine is
+/* HAS_GETHOSTENT:
+ *     This symbol, if defined, indicates that the gethostent routine is
  *     available to lookup host names in some data base or other.
  */
-/*#undef       HAS_GETHOSTENT          /**/
+/*#define HAS_GETHOSTENT               /**/
+
+/* HAS_UNAME:
+ *     This symbol, if defined, indicates that the C program may use the
+ *     uname() routine to derive the host name.  See also HAS_GETHOSTNAME
+ *     and PHOSTNAME.
+ */
+#define HAS_UNAME              /**/
 
-/* HAS_GETPGRP
- *     This symbol, if defined, indicates that the getpgrp() routine is
+/* HAS_GETPGRP:
+ *     This symbol, if defined, indicates that the getpgrp routine is
  *     available to get the current process group.
  */
-#define        HAS_GETPGRP             /**/
+#define HAS_GETPGRP            /**/
 
-/* HAS_GETPGRP2
+/* 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            /**/
+/*#define HAS_GETPGRP2         /**/
 
-/* HAS_GETPRIORITY
- *     This symbol, if defined, indicates that the getpriority() routine is
+/* HAS_GETPRIORITY:
+ *     This symbol, if defined, indicates that the getpriority routine is
  *     available to get a process's priority.
  */
-#define        HAS_GETPRIORITY         /**/
+#define HAS_GETPRIORITY                /**/
 
-/* HAS_HTONS
- *     This symbol, if defined, indicates that the htons routine (and friends)
- *     are available to do network order byte swapping.
- */
-/* HAS_HTONL
- *     This symbol, if defined, indicates that the htonl routine (and friends)
- *     are available to do network order byte swapping.
+/* HAS_HTONL:
+ *     This symbol, if defined, indicates that the htonl() routine (and
+ *     friends htons() ntohl() ntohs()) are available to do network
+ *     order byte swapping.
  */
-/* HAS_NTOHS
- *     This symbol, if defined, indicates that the ntohs routine (and friends)
- *     are available to do network order byte swapping.
+/* HAS_HTONS:
+ *     This symbol, if defined, indicates that the htons() routine (and
+ *     friends htonl() ntohl() ntohs()) are available to do network
+ *     order byte swapping.
  */
-/* HAS_NTOHL
- *     This symbol, if defined, indicates that the ntohl routine (and friends)
- *     are available to do network order byte swapping.
+/* HAS_NTOHL:
+ *     This symbol, if defined, indicates that the ntohl() routine (and
+ *     friends htonl() htons() ntohs()) are available to do network
+ *     order byte swapping.
  */
-#define        HAS_HTONS       /**/
-#define        HAS_HTONL       /**/
-#define        HAS_NTOHS       /**/
-#define        HAS_NTOHL       /**/
-
-/* index
- *     This preprocessor symbol is defined, along with rindex, if the system
- *     uses the strchr and strrchr routines instead.
- */
-/* rindex
- *     This preprocessor symbol is defined, along with index, if the system
- *     uses the strchr and strrchr routines instead.
+/* HAS_NTOHS:
+ *     This symbol, if defined, indicates that the ntohs() routine (and
+ *     friends htonl() htons() ntohl()) are available to do network
+ *     order byte swapping.
  */
-/*#undef       index strchr    /* cultural */
-/*#undef       rindex strrchr  /*  differences? */
+#define HAS_HTONL              /**/
+#define HAS_HTONS              /**/
+#define HAS_NTOHL              /**/
+#define HAS_NTOHS              /**/
 
-/* HAS_ISASCII
- *     This symbol, if defined, indicates that the isascii routine is available
- *     to test characters for asciiness.
- */
-#define        HAS_ISASCII             /**/
-
-/* HAS_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        HAS_KILLPG              /**/
+#define HAS_KILLPG     /**/
 
-/* HAS_LSTAT
- *     This symbol, if defined, indicates that the lstat() routine is
- *     available to stat symbolic links.
+/* HAS_LINK:
+ *     This symbol, if defined, indicates that the link routine is
+ *     available to create hard links.
  */
-#define        HAS_LSTAT               /**/
+#define HAS_LINK       /**/
 
-/* HAS_MEMCMP
- *     This symbol, if defined, indicates that the memcmp routine is available
- *     to compare blocks of memory.  If undefined, roll your own.
+/* HAS_LSTAT:
+ *     This symbol, if defined, indicates that the lstat routine is
+ *     available to do file stats on symbolic links.
  */
-#define        HAS_MEMCMP              /**/
+#define HAS_LSTAT              /**/
 
-/* 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.
+/* HAS_MEMCMP:
+ *     This symbol, if defined, indicates that the memcmp routine is available
+ *     to compare blocks of memory.
  */
-/* SAFE_MEMCPY
+#define HAS_MEMCMP     /**/
+
+/* HAS_MEMCPY:
  *     This symbol, if defined, indicates that the memcpy routine is available
- *     to copy potentially overlapping copy blocks of memory.  Otherwise you
- *     should probably use memmove() or bcopy().  If neither is defined,
- *     roll your own.
+ *     to copy blocks of memory.
  */
-#define        HAS_MEMCPY              /**/
-/*#undef       SAFE_MEMCPY             /**/
+#define HAS_MEMCPY     /**/
 
-/* HAS_MEMMOVE
+/* HAS_MEMMOVE:
  *     This symbol, if defined, indicates that the memmove routine is available
- *     to move potentially overlapping blocks of memory.  Otherwise you
- *     should use bcopy() or roll your own.
+ *     to copy potentially overlapping blocks of memory. This should be used
+ *     only when HAS_SAFE_BCOPY is not defined. If neither is there, roll your
+ *     own version.
  */
-/*#undef       HAS_MEMMOVE             /**/
+/*#define HAS_MEMMOVE  /**/
 
-/* HAS_MEMSET
+/* HAS_MEMSET:
  *     This symbol, if defined, indicates that the memset routine is available
- *     to set a block of memory to a character.  If undefined, roll your own.
+ *     to set blocks of memory.
  */
-#define        HAS_MEMSET              /**/
+#define HAS_MEMSET     /**/
 
-/* HAS_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        HAS_MKDIR               /**/
+#define HAS_MKDIR              /**/
 
-/* HAS_MSG
+/* HAS_MSG:
  *     This symbol, if defined, indicates that the entire msg*(2) library is
- *     supported.
+ *     supported (IPC mechanism based on message queues).
  */
-#define        HAS_MSG         /**/
+#define HAS_MSG                /**/
 
-/* HAS_MSGCTL
+/* HAS_MSGCTL:
  *     This symbol, if defined, indicates that the msgctl() routine is
- *     available to control message passing.
+ *     available to perform message control operations.
  */
-#define        HAS_MSGCTL              /**/
+#define HAS_MSGCTL             /**/
 
-/* HAS_MSGGET
+/* HAS_MSGGET:
  *     This symbol, if defined, indicates that the msgget() routine is
- *     available to get messages.
+ *     available to get a new message queue.
  */
-#define        HAS_MSGGET              /**/
+#define HAS_MSGGET             /**/
 
-/* HAS_MSGRCV
+/* HAS_MSGRCV:
  *     This symbol, if defined, indicates that the msgrcv() routine is
- *     available to receive messages.
+ *     available to extract a message from the message queue.
  */
-#define        HAS_MSGRCV              /**/
+#define HAS_MSGRCV             /**/
 
-/* HAS_MSGSND
+/* HAS_MSGSND:
  *     This symbol, if defined, indicates that the msgsnd() routine is
- *     available to send messages.
+ *     available to send a message into the message queue.
  */
-#define        HAS_MSGSND              /**/
+#define HAS_MSGSND             /**/
 
-/* HAS_NDBM
- *     This symbol, if defined, indicates that ndbm.h exists and should
- *     be included.
- */
-#define        HAS_NDBM                /**/
-
-/* HAS_ODBM
- *     This symbol, if defined, indicates that dbm.h exists and should
- *     be included.
- */
-#define        HAS_ODBM                /**/
-
-/* HAS_OPEN3
+/* HAS_OPEN3:
  *     This manifest constant lets the C program know that the three
  *     argument form of open(2) is available.
  */
-#define        HAS_OPEN3               /**/
+#define HAS_OPEN3              /**/
 
-/* HAS_READDIR
- *     This symbol, if defined, indicates that the readdir routine is available
- *     from the C library to read directories.
+/* HAS_READDIR:
+ *     This symbol, if defined, indicates that the readdir routine is
+ *     available to read directory entries. You may have to include
+ *     <dirent.h>. See I_DIRENT.
  */
-#define        HAS_READDIR             /**/
+#define HAS_READDIR            /**/
 
-/* HAS_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        HAS_RENAME              /**/
+#define HAS_RENAME     /**/
 
-/* HAS_REWINDDIR
- *     This symbol, if defined, indicates that the rewindir routine is
- *     available to rewind directories.
+/* 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.
  */
-/*#undef       HAS_REWINDDIR           /**/
+#define HAS_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.
+/* HAS_SAFE_BCOPY:
+ *     This symbol, if defined, indicates that the bcopy routine is available
+ *     to copy potentially overlapping memory blocks. Otherwise you should
+ *     probably use memmove() or memcpy(). If neither is defined, roll your
+ *     own version.
  */
-#define        HAS_RMDIR               /**/
+#define HAS_SAFE_BCOPY /**/
 
-/* HAS_SEEKDIR
- *     This symbol, if defined, indicates that the seekdir routine is
- *     available to seek into directories.
+/* HAS_SAFE_MEMCPY:
+ *     This symbol, if defined, indicates that the memcpy routine is available
+ *     to copy potentially overlapping memory blocks. Otherwise you should
+ *     probably use memmove() or memcpy(). If neither is defined, roll your
+ *     own version.
  */
-#define        HAS_SEEKDIR             /**/
+/*#define HAS_SAFE_MEMCPY      /**/
 
-/* HAS_SELECT
- *     This symbol, if defined, indicates that the select() subroutine
- *     exists.
+/* HAS_SELECT:
+ *     This symbol, if defined, indicates that the select routine is
+ *     available to select active file descriptors. If the timeout field
+ *     is used, <sys/time.h> may need to be included.
  */
-#define        HAS_SELECT      /**/
+#define HAS_SELECT     /**/
 
-/* HAS_SEM
+/* HAS_SEM:
  *     This symbol, if defined, indicates that the entire sem*(2) library is
  *     supported.
  */
-#define        HAS_SEM         /**/
+#define HAS_SEM                /**/
 
-/* HAS_SEMCTL
+/* HAS_SEMCTL:
  *     This symbol, if defined, indicates that the semctl() routine is
- *     available to control semaphores.
+ *     available to perform semaphore control operations.
  */
-#define        HAS_SEMCTL              /**/
+#define HAS_SEMCTL     /**/
 
-/* HAS_SEMGET
+/* HAS_SEMGET:
  *     This symbol, if defined, indicates that the semget() routine is
- *     available to get semaphores ids.
+ *     available to get a set of semaphores.
  */
-#define        HAS_SEMGET              /**/
+#define HAS_SEMGET     /**/
 
-/* HAS_SEMOP
+/* HAS_SEMOP:
  *     This symbol, if defined, indicates that the semop() routine is
- *     available to perform semaphore operations.
+ *     available to execute semaphore operations.
  */
-#define        HAS_SEMOP               /**/
+#define HAS_SEMOP              /**/
 
-/* HAS_SETEGID
+/* HAS_SETEGID:
  *     This symbol, if defined, indicates that the setegid routine is available
  *     to change the effective gid of the current program.
  */
-#define        HAS_SETEGID             /**/
+#define HAS_SETEGID            /**/
 
-/* HAS_SETEUID
+/* HAS_SETEUID:
  *     This symbol, if defined, indicates that the seteuid routine is available
  *     to change the effective uid of the current program.
  */
-#define        HAS_SETEUID             /**/
+#define HAS_SETEUID            /**/
 
-/* HAS_SETPGRP
- *     This symbol, if defined, indicates that the setpgrp() routine is
+/* HAS_SETPGID:
+ *     This symbol, if defined, indicates that the setpgid routine is
+ *     available to set process group ID.
+ */
+#define HAS_SETPGID    /**/
+
+/* HAS_SETPGRP:
+ *     This symbol, if defined, indicates that the setpgrp routine is
  *     available to set the current process group.
  */
-#define        HAS_SETPGRP             /**/
+#define HAS_SETPGRP            /**/
 
-/* HAS_SETPGRP2
+/* 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            /**/
+/*#define HAS_SETPGRP2         /**/
 
-/* HAS_SETPRIORITY
- *     This symbol, if defined, indicates that the setpriority() routine is
+/* HAS_SETPRIORITY:
+ *     This symbol, if defined, indicates that the setpriority routine is
  *     available to set a process's priority.
  */
-#define        HAS_SETPRIORITY         /**/
+#define HAS_SETPRIORITY                /**/
 
-/* HAS_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.
+ *     available to change the real and effective gid of the current
+ *     process.
  */
-/* HAS_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.
+ *     process.
  */
-#define        HAS_SETREGID            /**/
-/*#undef       HAS_SETRESGID           /**/
+#define HAS_SETREGID           /**/
+/*#define HAS_SETRESGID                /**/
 
-/* HAS_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.
+ *     available to change the real and effective uid of the current
+ *     process.
  */
-/* HAS_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.
+ *     process.
  */
-#define        HAS_SETREUID            /**/
-/*#undef       HAS_SETRESUID           /**/
+#define HAS_SETREUID           /**/
+/*#define HAS_SETRESUID                /**/
 
-/* HAS_SETRGID
+/* HAS_SETRGID:
  *     This symbol, if defined, indicates that the setrgid routine is available
  *     to change the real gid of the current program.
  */
-#define        HAS_SETRGID             /**/
+#define HAS_SETRGID            /**/
 
-/* HAS_SETRUID
+/* HAS_SETRUID:
  *     This symbol, if defined, indicates that the setruid routine is available
  *     to change the real uid of the current program.
  */
-#define        HAS_SETRUID             /**/
+#define HAS_SETRUID            /**/
 
-/* HAS_SHM
+/* HAS_SETSID:
+ *     This symbol, if defined, indicates that the setsid routine is
+ *     available to set the process group ID.
+ */
+#define HAS_SETSID     /**/
+
+/* HAS_SHM:
  *     This symbol, if defined, indicates that the entire shm*(2) library is
  *     supported.
  */
-#define        HAS_SHM         /**/
+#define HAS_SHM                /**/
 
-/* HAS_SHMAT
+/* HAS_SHMAT:
  *     This symbol, if defined, indicates that the shmat() routine is
- *     available to attach a shared memory segment.
- */
-/* VOID_SHMAT
- *     This symbol, if defined, indicates that the shmat() routine
- *     returns a pointer of type void*.
+ *     available to attach a shared memory segment to the process space.
  */
-#define        HAS_SHMAT               /**/
+#define HAS_SHMAT              /**/
 
-/*#undef       VOIDSHMAT               /**/
-
-/* HAS_SHMCTL
+/* HAS_SHMCTL:
  *     This symbol, if defined, indicates that the shmctl() routine is
- *     available to control a shared memory segment.
+ *     available to perform shared memory control operations.
  */
-#define        HAS_SHMCTL              /**/
+#define HAS_SHMCTL             /**/
 
-/* HAS_SHMDT
+/* HAS_SHMDT:
  *     This symbol, if defined, indicates that the shmdt() routine is
- *     available to detach a shared memory segment.
+ *     available to detach a shared memory segment from the process space.
  */
-#define        HAS_SHMDT               /**/
+#define HAS_SHMDT              /**/
 
-/* HAS_SHMGET
+/* HAS_SHMGET:
  *     This symbol, if defined, indicates that the shmget() routine is
- *     available to get a shared memory segment id.
+ *     available to request a shared memory segment from the kernel.
  */
-#define        HAS_SHMGET              /**/
+#define HAS_SHMGET             /**/
 
-/* HAS_SOCKET
+/* HAS_SOCKET:
  *     This symbol, if defined, indicates that the BSD socket interface is
  *     supported.
  */
-/* HAS_SOCKETPAIR
- *     This symbol, if defined, indicates that the BSD socketpair call is
+/* HAS_SOCKETPAIR:
+ *     This symbol, if defined, indicates that the BSD socketpair() call is
  *     supported.
  */
-/* OLDSOCKET
+/* USE_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.
+ *     is supported instead of the 4.2/4.3 BSD socket interface. For instance,
+ *     there is no setsockopt() call.
  */
-#define        HAS_SOCKET              /**/
-
-#define        HAS_SOCKETPAIR  /**/
+#define HAS_SOCKET             /**/
+#define HAS_SOCKETPAIR /**/
+/*#define USE_OLDSOCKET        /**/
 
-/*#undef       OLDSOCKET       /**/
-
-/* STATBLOCKS
+/* USE_STAT_BLOCKS:
  *     This symbol is defined if this system has a stat structure declaring
  *     st_blksize and st_blocks.
  */
-#define        STATBLOCKS      /**/
+#define USE_STAT_BLOCKS        /**/
 
-/* STDSTDIO
+/* USE_STD_STDIO:
  *     This symbol is defined if this system has a FILE structure declaring
  *     _ptr and _cnt in stdio.h.
  */
-#define        STDSTDIO        /**/
+#define USE_STD_STDIO  /**/
 
-/* STRUCTCOPY
+/* USE_STRUCT_COPY:
  *     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      /**/
-
-/* HAS_STRERROR
- *     This symbol, if defined, indicates that the strerror() routine is
- *     available to translate error numbers to strings.
- */
-/*#undef       HAS_STRERROR            /**/
+#define        USE_STRUCT_COPY /**/
 
-/* HAS_SYMLINK
+/* HAS_SYMLINK:
  *     This symbol, if defined, indicates that the symlink routine is available
  *     to create symbolic links.
  */
-#define        HAS_SYMLINK             /**/
+#define HAS_SYMLINK    /**/
+
+/* HAS_SYSCALL:
+ *     This symbol, if defined, indicates that the syscall routine is
+ *     available to call arbitrary system calls. If undefined, that's tough.
+ */
+#define HAS_SYSCALL    /**/
 
-/* HAS_SYSCALL
- *     This symbol, if defined, indicates that the syscall routine is available
- *     to call arbitrary system calls.  If undefined, that's tough.
+/* HAS_SYSTEM:
+ *     This symbol, if defined, indicates that the system routine is
+ *     available to issue a shell command.
  */
-#define        HAS_SYSCALL             /**/
+#define HAS_SYSTEM     /**/
 
-/* HAS_TELLDIR
- *     This symbol, if defined, indicates that the telldir routine is
- *     available to tell your location in directories.
+/* HAS_TIMES:
+ *     This symbol, if defined, indicates that the times() routine exists.
+ *     Note that this became obsolete on some systems (SUNOS), which now
+ * use getrusage(). It may be necessary to include <sys/times.h>.
  */
-#define        HAS_TELLDIR             /**/
+#define HAS_TIMES              /**/
 
-/* HAS_TRUNCATE
+/* HAS_TRUNCATE:
  *     This symbol, if defined, indicates that the truncate routine is
  *     available to truncate files.
  */
-#define        HAS_TRUNCATE            /**/
+#define HAS_TRUNCATE   /**/
 
-/* HAS_VFORK
+/* 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.
+ */
+/*#define I_NDIR               /**/
+
+/* HAS_VFORK:
  *     This symbol, if defined, indicates that vfork() exists.
  */
-#define        HAS_VFORK       /**/
+#define HAS_VFORK      /**/
 
-/* 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
+/* 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)".
- */
-#define        VOIDSIG         /**/
-#define        TO_SIGNAL       int     /**/
+#define VOIDSIG        /**/
 
-/* HASVOLATILE
+/* HASVOLATILE:
  *     This symbol, if defined, indicates that this C compiler knows about
  *     the volatile declaration.
  */
-/*#undef       HASVOLATILE     /**/
+/*#define      HASVOLATILE     /**/
+#ifndef HASVOLATILE
+#define volatile
+#endif
 
-/* HAS_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
+/* USE_CHAR_VSPRINTF:
  *     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.
  */
-#define        HAS_VPRINTF     /**/
-#define        CHARVSPRINTF    /**/
+#define HAS_VPRINTF    /**/
+#define USE_CHAR_VSPRINTF      /**/
 
-/* HAS_WAIT4
+/* HAS_WAIT4:
  *     This symbol, if defined, indicates that wait4() exists.
  */
-#define        HAS_WAIT4       /**/
+#define HAS_WAIT4      /**/
 
-/* HAS_WAITPID
- *     This symbol, if defined, indicates that waitpid() exists.
+/* HAS_WAITPID:
+ *     This symbol, if defined, indicates that the waitpid routine is
+ *     available to wait for child process.
  */
-#define        HAS_WAITPID     /**/
+#define 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.
+/* I_DBM:
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include <dbm.h>.
  */
-#define GIDTYPE gid_t          /**/
+#define I_DBM  /**/
 
-/* GROUPSTYPE
- *     This symbol has a value like gid_t, int, ushort, or whatever type is
- *     used in the return value of getgroups().
+/* I_DIRENT:
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include <dirent.h>. Using this symbol also triggers the definition
+ *     of the Direntry_t define which ends up being 'struct dirent' or
+ *     'struct direct' depending on the availability of <dirent.h>.
  */
-#define GROUPSTYPE int         /**/
+/* 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               /**/
+/*#define DIRNAMLEN    /**/
+#ifdef I_DIRENT
+#define Direntry_t struct dirent
+#else
+#define Direntry_t struct direct
+#endif
 
-/* I_FCNTL
+/* I_FCNTL:
  *     This manifest constant tells the C program to include <fcntl.h>.
  */
-/*#undef       I_FCNTL /**/
+/*#define I_FCNTL      /**/
 
-/* I_GDBM
+/* I_GDBM:
  *     This symbol, if defined, indicates that gdbm.h exists and should
  *     be included.
  */
-/*#undef       I_GDBM          /**/
+/*#define I_GDBM       /**/
 
-/* I_GRP
+/* I_GRP:
  *     This symbol, if defined, indicates to the C program that it should
- *     include grp.h.
+ *     include <grp.h>.
  */
-#define        I_GRP           /**/
+#define I_GRP          /**/
 
-/* I_NETINET_IN
+/* I_NDBM:
+ *     This symbol, if defined, indicates that ndbm.h exists and should
+ *     be included.
+ */
+#define I_NDBM /**/
+
+/* I_NETINET_IN:
  *     This symbol, if defined, indicates to the C program that it should
- *     include netinet/in.h.
+ *     include <netinet/in.h>. Otherwise, you may try <sys/in.h>.
  */
-/* I_SYS_IN
+/* I_SYS_IN:
  *     This symbol, if defined, indicates to the C program that it should
- *     include sys/in.h.
+ *     include <sys/in.h> instead of <netinet/in.h>.
  */
-#define        I_NETINET_IN            /**/
-/*#undef       I_SYS_IN                /**/
+#define I_NETINET_IN   /**/
+/*#define I_SYS_IN             /**/
 
-/* I_PWD
+/* I_PWD:
  *     This symbol, if defined, indicates to the C program that it should
- *     include pwd.h.
+ *     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
+/* 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
+/* PWCOMMENT:
  *     This symbol, if defined, indicates to the C program that struct passwd
  *     contains pw_comment.
  */
-#define        I_PWD           /**/
-/*#undef       PWQUOTA         /**/
-#define        PWAGE           /**/
-/*#undef       PWCHANGE        /**/
-/*#undef       PWCLASS         /**/
-/*#undef       PWEXPIRE        /**/
-#define        PWCOMMENT       /**/
+#define I_PWD          /**/
+/*#define PWQUOTA      /**/
+#define PWAGE  /**/
+/*#define PWCHANGE     /**/
+/*#define PWCLASS      /**/
+/*#define PWEXPIRE     /**/
+#define PWCOMMENT      /**/
 
-/* I_SYS_FILE
- *     This manifest constant tells the C program to include <sys/file.h>.
+/* I_STDARG:
+ *     This symbol, if defined, indicates that <stdarg.h> exists and should
+ *     be included.
  */
-#define        I_SYS_FILE      /**/
+/*#define I_STDARG             /**/
 
-/* I_SYSIOCTL
- *     This symbol, if defined, indicates that sys/ioctl.h exists and should
+/* I_STDDEF:
+ *     This symbol, if defined, indicates that <stddef.h> exists and should
  *     be included.
  */
-#define        I_SYSIOCTL              /**/
+#define I_STDDEF       /**/
+
+/* I_SYS_DIR:
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include <sys/dir.h>.
+ */
+#define I_SYS_DIR              /**/
+
+/* I_SYS_FILE:
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include <sys/file.h> to get definition of R_OK and friends.
+ */
+#define I_SYS_FILE             /**/
 
-/* I_TIME
- *     This symbol is defined if the program should include <time.h>.
+/* I_SYS_IOCTL:
+ *     This symbol, if defined, indicates that <sys/ioctl.h> exists and should
+ *     be included. Otherwise, include <sgtty.h> or <termio.h>.
  */
-/* I_SYS_TIME
- *     This symbol is defined if the program should include <sys/time.h>.
+#define        I_SYS_IOCTL             /**/
+
+/* I_SYS_NDIR:
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include <sys/ndir.h>.
  */
-/* SYSTIMEKERNEL
- *     This symbol is defined if the program should include <sys/time.h>
- *     with KERNEL defined.
+/*#define I_SYS_NDIR   /**/
+
+/* I_SYS_SELECT:
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include <sys/select.h> in order to get definition of struct timeval.
+ */
+/*#define I_SYS_SELECT /**/
+
+/* I_TIME:
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include <time.h>.
  */
-/* I_SYS_SELECT
- *     This symbol is defined if the program should include <sys/select.h>.
+/* I_SYS_TIME:
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include <sys/time.h>.
  */
-/*#undef       I_TIME          /**/
-#define        I_SYS_TIME      /**/
-/*#undef       SYSTIMEKERNEL   /**/
-/*#undef       I_SYS_SELECT    /**/
+/*#define I_TIME               /**/
+#define I_SYS_TIME             /**/
 
-/* I_UTIME
+/* I_UTIME:
  *     This symbol, if defined, indicates to the C program that it should
- *     include utime.h.
+ *     include <utime.h>.
  */
-#define        I_UTIME         /**/
+#define I_UTIME                /**/
 
-/* I_VARARGS
+/* I_VARARGS:
  *     This symbol, if defined, indicates to the C program that it should
- *     include varargs.h.
+ *     include <varargs.h>.
  */
-#define        I_VARARGS               /**/
+#define I_VARARGS              /**/
 
-/* I_VFORK
+/* I_VFORK:
  *     This symbol, if defined, indicates to the C program that it should
  *     include vfork.h.
  */
-#define        I_VFORK         /**/
+#define 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 4              /**/
 
-/* I_DIRENT
- *     This symbol, if defined, indicates that the program should use the
- *     P1003-style directory routines, and include <dirent.h>.
+/* 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
+ *     should be prepared to do ~ expansion.
  */
-/* I_SYS_DIR
- *     This symbol, if defined, indicates that the program should use the
- *     directory functions by including <sys/dir.h>.
+#define PRIVLIB "/usr/local/lib/perl"          /**/
+
+/* RANDBITS:
+ *     This symbol contains the number of bits of random number the rand()
+ *     function produces.  Usual values are 15, 16, and 31.
  */
-/* 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.
+#define RANDBITS 31            /**/
+
+/* 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.
+ *     Programs must be prepared to deal with ~name expansion.
  */
-/* 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.
+#define SCRIPTDIR "/usr/local/bin"     /**/
+
+/* SIG_NAME:
+ *     This symbol contains a list of signal names in order. This is intended
+ *     to be used as a static array initialization, like this:
+ *             char *sig_name[] = { SIG_NAME };
+ *     The signals in the list are separated with commas, and each signal
+ *     is surrounded by double quotes. There is no leading SIG in the signal
+ *     name, i.e. SIGQUIT is known as "QUIT".
  */
-/* I_MY_DIR
- *     This symbol, if defined, indicates that the program should compile
- *     the ndir.c code provided with the package.
+#define SIG_NAME "ZERO","HUP","INT","QUIT","ILL","TRAP","ABRT","EMT","FPE","KILL","BUS","SEGV","SYS","PIPE","ALRM","TERM","URG","STOP","TSTP","CONT","CLD","TTIN","TTOU","IO","XCPU","XFSZ","VTALRM","PROF","WINCH","LOST","USR1","USR2"       /**/
+
+/* STDCHAR:
+ *     This symbol is defined to be the type of char used in stdio.h.
+ *     It has the values "unsigned char" or "char".
  */
-/* 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 STDCHAR unsigned char  /**/
+
+/* Uid_t:
+ *     This symbol holds the type used to declare user ids in the kernel.
+ *     It can be int, ushort, uid_t, etc... It may be necessary to include
+ *     <sys/types.h> to get any typedef'ed information.
  */
-#define        I_DIRENT        /**/
-/*#undef       I_SYS_DIR       /**/
-/*#undef       I_NDIR          /**/
-/*#undef       I_SYS_NDIR      /**/
-/*#undef       I_MY_DIR        /**/
-/*#undef       DIRNAMLEN       /**/
+#define Uid_t uid_t            /* UID type */
 
-/* MYMALLOC
- *     This symbol, if defined, indicates that we're using our own malloc.
+/* CASTI32:
+ *     This symbol is defined if the C compiler can cast negative
+ *     or large floating point numbers to 32-bit ints.
  */
-/* MALLOCPTRTYPE
- *     This symbol defines the kind of ptr returned by malloc and realloc.
+#define        CASTI32         /**/
+
+/* HAS_ISASCII:
+ *     This manifest constant lets the C program know that the
+ *     isascii is available.
  */
-#define MYMALLOC                       /**/
+#define HAS_ISASCII            /**/
 
-#define MALLOCPTRTYPE char         /**/
+/* HAS_SETLOCALE:
+ *     This symbol, if defined, indicates that the setlocale routine is
+ *     available to handle locale-specific ctype implementations.
+ */
+#define HAS_SETLOCALE  /**/
 
+/* HAS_STRERROR:
+ *     This symbol, if defined, indicates that the strerror routine is
+ *     available to translate error numbers to strings. See the writeup
+ *     of Strerror() in this file before you try to define your own.
+ */
+/* HAS_SYS_ERRLIST:
+ *     This symbol, if defined, indicates that the sys_errlist array is
+ *     available to translate error numbers to strings. The extern int
+ *     sys_nerr gives the size of that table.
+ */
+/* Strerror:
+ *     This preprocessor symbol is defined as a macro if strerror() is
+ *     not available to translate error numbers to strings but sys_errlist[]
+ *     array is there.
+ */
+/*#define HAS_STRERROR         /**/
+#define HAS_SYS_ERRLIST        /**/
+#ifdef HAS_STRERROR
+#  define Strerror strerror
+#else
+#define Strerror(e) ((e)<0||(e)>=sys_nerr?"unknown":sys_errlist[e]) /**/
+#endif
 
-/* RANDBITS
- *     This symbol contains the number of bits of random number the rand()
- *     function produces.  Usual values are 15, 16, and 31.
+/* USE_DYNAMIC_LOADING:
+ *     This symbol, if defined, indicates that dynamic loading of
+ *     some sort is available.
  */
-#define RANDBITS 31            /**/
+#define USE_DYNAMIC_LOADING            /**/
 
-/* SCRIPTDIR
- *     This symbol holds the name of the directory in which the user wants
- *     to keep publicly executable scripts for the package in question.  It
- *     is often a directory that is mounted across diverse architectures.
+/* Gid_t:
+ *     This symbol holds the return type of getgid() and the type of
+ *     argument to setrgid() and related functions.  Typically,
+ *     it is the type of group ids in the kernel.
+ *     It can be int, ushort, uid_t, etc... It may be necessary to include
+ *     <sys/types.h> to get any typedef'ed information.
  */
-#define SCRIPTDIR "/usr/local/bin"             /**/
+#define Gid_t gid_t            /* Type for getgid(), etc... */
 
-/* SIG_NAME
- *     This symbol contains an list of signal names in order.
+/* GROUPSTYPE:
+ *     This symbol holds the type used for the second argument to
+ *     getgroups().  Usually, this is the same of gidtype, but
+ *     sometimes it isn't.  It can be int, ushort, uid_t, etc... 
+ *     It may be necessary to include <sys/types.h> to get any 
+ *     typedef'ed information.  This is only required if you have
+ *     getgroups().
  */
-#define SIG_NAME "ZERO","HUP","INT","QUIT","ILL","TRAP","ABRT","EMT","FPE","KILL","BUS","SEGV","SYS","PIPE","ALRM","TERM","URG","STOP","TSTP","CONT","CLD","TTIN","TTOU","IO","XCPU","XFSZ","VTALRM","PROF","WINCH","LOST","USR1","USR2"               /**/
+#ifdef HAS_GETGROUPS
+#define GROUPSTYPE int /* Type for 2nd arg to getgroups() */
+#endif
 
-/* STDCHAR
- *     This symbol is defined to be the type of char used in stdio.h.
- *     It has the values "unsigned char" or "char".
+/* Malloc_t:
+ *     This symbol is the type of pointer returned by malloc and realloc.
  */
-#define STDCHAR unsigned char  /**/
+#define Malloc_t char *                        /**/
 
-/* UIDTYPE
- *     This symbol has a value like uid_t, int, ushort, or whatever type is
- *     used to declare user ids in the kernel.
+/* CAN_PROTOTYPE:
+ *     If defined, this macro indicates that the C compiler can handle
+ *     function prototypes.
  */
-#define UIDTYPE uid_t          /**/
+/*#define      CAN_PROTOTYPE   /**/
+#ifdef CAN_PROTOTYPE
+#else
+#endif
 
-/* VOIDHAVE
+/* VOIDFLAGS:
  *     This symbol indicates how much support of the void type is given by this
  *     compiler.  What various bits mean:
  *
  *         2 = supports arrays of pointers to functions returning void
  *         4 = supports comparisons between pointers to void functions and
  *                 addresses of void functions
+ *         8 = suports declaration of generic void pointers
  *
- *     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 7
+ *     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
+#  ifdef VOIDWANT
+#    define VOIDUSED VOIDWANT
+#  else
+#    define VOIDUSED 15
+#  endif
 #endif
-#define VOIDHAVE 7
-#if (VOIDHAVE & VOIDWANT) != VOIDWANT
-#define void int               /* is void to be avoided? */
-#define VOID
-#define VOIDP (char *)
-#define M_VOID         /* Xenix strikes again */
+#define VOIDFLAGS 15
+#if (VOIDFLAGS & VOIDUSED) != VOIDUSED
+#  define void int             /* is void to be avoided? */
+#  define M_VOID                       /* Xenix strikes again */
+#  define VOID
 #else
-#define VOID void
-#define VOIDP (void *)
+#  define VOID void
 #endif
 
-/* 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
- *     should be prepared to do ~ expansion.
+/*
+ * The following symbols are obsolete. They are mapped to the the new
+ * symbols only to ease the transition process. The sources should be
+ * updated so as to use the new symbols only, as the support for these
+ * obsolete symbols may end without notice.
  */
-#define PRIVLIB "/usr/local/lib/perl"          /**/
+
+#ifdef USE_CHAR_VSPRINTF
+#define CHARVSPRINTF USE_CHAR_VSPRINTF
+#endif
+
+#ifdef Gid_t
+#define GIDTYPE Gid_t
+#endif
+
+#ifdef I_GDBM
+#define HAS_GDBM I_GDBM
+#endif
+
+#ifdef HAS_SAFE_BCOPY
+#define SAFE_BCOPY HAS_SAFE_BCOPY
+#endif
+
+#ifdef USE_STAT_BLOCKS
+#define STATBLOCKS USE_STAT_BLOCKS
+#endif
+
+#ifdef USE_STD_STDIO
+#define STDSTDIO USE_STD_STDIO
+#endif
+
+#ifdef Uid_t
+#define UIDTYPE Uid_t
+#endif
 
 #endif
index 11f6c80..97429bb 100644 (file)
--- a/config.sh
+++ b/config.sh
 #!/bin/sh
-# config.sh
-# This file was produced by running the Configure script.
+#
+# This file was produced by running the Configure script. It holds all the
+# definitions figured out by Configure. Should you modify one of these values,
+# do not forget to propagate your changes by running "Configure -der". You may
+# instead choose to run each of the .SH files by yourself, or "Configure -S".
+#
+
+# Configuration time: Mon Apr  4 15:17:26 PDT 1994
+# Configured by: lwall
+# Target system: sunos scalpel 4.1.3 3 sun4c 
+
+extensions='ext/dbm/NDBM_File.xs
+ext/dbm/ODBM_File.xs
+ext/dbm/GDBM_File.xs
+ext/dbm/SDBM_File.xs
+ext/posix/POSIX.xs'
+d_bsd='define'
 d_eunice='undef'
-define='define'
+d_xenix='undef'
 eunicefix=':'
-loclist='
-cat
-cp
-echo
-expr
-grep
-mkdir
-mv
-rm
-sed
-sort
-tr
-uniq
-'
-expr='/bin/expr'
-sed='/bin/sed'
-echo='/bin/echo'
-cat='/bin/cat'
-rm='/bin/rm'
-mv='/bin/mv'
-cp='/bin/cp'
-tail=''
-tr='/bin/tr'
-mkdir='/bin/mkdir'
-sort='/bin/sort'
-uniq='/bin/uniq'
-grep='/bin/grep'
-trylist='
-Mcc
-bison
-cpp
-csh
-egrep
-line
-nroff
-perl
-test
-uname
-yacc
-'
-test='test'
-inews=''
-egrep='/bin/egrep'
-more=''
-pg=''
 Mcc='Mcc'
-vi=''
-mailx=''
-mail=''
-cpp='/usr/lib/cpp'
-perl='/home/netlabs1/lwall/pl/perl'
+awk='awk'
+bash=''
+bison='bison'
+byacc='byacc'
+cat='cat'
+chgrp=''
+chmod=''
+chown=''
+compress=''
+cp='cp'
+cpio=''
+cpp='cpp'
+csh='csh'
+date='date'
+echo='echo'
+egrep='egrep'
 emacs=''
+expr='expr'
+find='find'
+flex=''
+gcc=''
+grep='grep'
+inews=''
+ksh=''
+less=''
+line='line'
+lint=''
+ln=''
+lp=''
+lpr=''
 ls=''
+mail=''
+mailx=''
+make=''
+mkdir='mkdir'
+more=''
+mv='mv'
+nroff='nroff'
+perl='perl'
+pg=''
+pmake=''
+pr=''
+rm='rm'
 rmail=''
+sed='sed'
 sendmail=''
+sh=''
 shar=''
+sleep=''
 smail=''
+sort='sort'
+submit=''
+tail=''
+tar=''
 tbl=''
+test='test'
+touch=''
+tr='tr'
 troff=''
-nroff='/bin/nroff'
-uname='/bin/uname'
+uname='uname'
+uniq='uniq'
 uuname=''
-line='/bin/line'
-chgrp=''
-chmod=''
-lint=''
-sleep=''
-pr=''
-tar=''
-ln=''
-lpr=''
-lp=''
-touch=''
-make=''
-date=''
-csh='/bin/csh'
-bash=''
-ksh=''
-lex=''
-flex=''
-bison='/usr/local/bin/bison'
-Log='$Log'
-Header='$Header'
+vi=''
+zcat=''
+hint='recommended'
+myuname='sunos scalpel 4.1.3 3 sun4c '
+Author=''
+Date='$Date'
+Header=''
 Id='$Id'
-lastuname='SunOS scalpel 4.1.2 1 sun4c'
+Locker=''
+Log='$Log'
+RCSfile='$RCSfile'
+Revision='$Revision'
+Source=''
+State=''
+afs='false'
 alignbytes='8'
 bin='/usr/local/bin'
+binexp='/usr/local/bin'
 installbin='/usr/local/bin'
 byteorder='4321'
+cc='cc'
+gccversion=''
+ccflags='-DDEBUGGING'
+cppflags=' -DDEBUGGING'
+ldflags=''
+lkflags=''
+optimize='-g'
+cf_by='lwall'
+cf_time='Mon Apr  4 15:17:26 PDT 1994'
 contains='grep'
-cppstdin='/usr/lib/cpp'
+cpplast=''
 cppminus=''
+cpprun='cpp'
+cppstdin='/tmp_mnt/vol/src/local/lwall/perl5/cppstdin'
+d_access='define'
 d_bcmp='define'
 d_bcopy='define'
-d_safebcpy='define'
 d_bzero='define'
-d_castneg='define'
+d_casti32='define'
 castflags='0'
+d_castneg='define'
 d_charsprf='define'
 d_chsize='undef'
-d_crypt='define'
+d_const='undef'
 cryptlib=''
-d_csh='define'
+d_crypt='define'
+d_csh='undef'
 d_dosuid='undef'
 d_dup2='define'
 d_fchmod='define'
@@ -116,17 +138,20 @@ d_flexfnam='define'
 d_flock='define'
 d_getgrps='define'
 d_gethent='undef'
-d_getpgrp='define'
+aphostname=''
+d_gethname='undef'
+d_phostname='undef'
+d_uname='define'
 d_getpgrp2='undef'
+d_getpgrp='define'
 d_getprior='define'
 d_htonl='define'
-d_index='undef'
 d_isascii='define'
 d_killpg='define'
+d_link='define'
 d_lstat='define'
 d_memcmp='define'
 d_memcpy='define'
-d_safemcpy='undef'
 d_memmove='undef'
 d_memset='define'
 d_mkdir='define'
@@ -135,14 +160,13 @@ d_msgctl='define'
 d_msgget='define'
 d_msgrcv='define'
 d_msgsnd='define'
-d_ndbm='define'
-d_odbm='define'
 d_open3='define'
+d_portable='define'
 d_readdir='define'
 d_rename='define'
-d_rewindir='undef'
 d_rmdir='define'
-d_seekdir='define'
+d_safebcpy='define'
+d_safemcpy='undef'
 d_select='define'
 d_sem='define'
 d_semctl='define'
@@ -150,119 +174,162 @@ d_semget='define'
 d_semop='define'
 d_setegid='define'
 d_seteuid='define'
-d_setpgrp='define'
+d_setlocale='define'
+d_setpgid='define'
 d_setpgrp2='undef'
+d_bsdpgrp=''
+d_setpgrp='define'
 d_setprior='define'
 d_setregid='define'
 d_setresgid='undef'
-d_setreuid='define'
 d_setresuid='undef'
+d_setreuid='define'
 d_setrgid='define'
 d_setruid='define'
+d_setsid='define'
 d_shm='define'
 d_shmat='define'
-d_voidshmat='undef'
 d_shmctl='define'
 d_shmdt='define'
 d_shmget='define'
+d_oldsock='undef'
 d_socket='define'
 d_sockpair='define'
-d_oldsock='undef'
+sockethdr=''
 socketlib=''
 d_statblks='define'
 d_stdstdio='define'
+d_index='undef'
+d_strchr='define'
 d_strctcpy='define'
+d_strerrm='define'
 d_strerror='undef'
+d_sysernlst=''
+d_syserrlst='define'
 d_symlink='define'
 d_syscall='define'
-d_telldir='define'
+d_system='define'
+clocktype='long'
+d_times='define'
 d_truncate='define'
+d_usendir='undef'
+i_ndir='undef'
+ndirc=''
+ndirlib=''
+ndiro=''
 d_vfork='define'
 d_voidsig='define'
-d_tosignal='int'
+signal_t='void'
 d_volatile='undef'
-d_vprintf='define'
 d_charvspr='define'
+d_vprintf='define'
 d_wait4='define'
 d_waitpid='define'
+dlobj='dl.o'
+dlsrc='dl.c'
+usedl='define'
 gidtype='gid_t'
 groupstype='int'
+h_fcntl='false'
+h_sysfile='true'
+i_dbm='define'
+d_dirnamlen='undef'
+i_dirent='define'
+i_dlfcn='define'
 i_fcntl='undef'
 i_gdbm='undef'
 i_grp='define'
+i_ndbm='define'
 i_niin='define'
 i_sysin='undef'
-i_pwd='define'
-d_pwquota='undef'
 d_pwage='define'
 d_pwchange='undef'
 d_pwclass='undef'
-d_pwexpire='undef'
 d_pwcomment='define'
-i_sys_file='define'
+d_pwexpire='undef'
+d_pwquota='undef'
+i_pwd='define'
+i_stdarg='undef'
+i_stddef='define'
+i_string='define'
+strings='/usr/include/string.h'
+i_sysdir='define'
+i_sysfile='define'
+d_voidtty=''
+i_bsdioctl=''
 i_sysioctl='define'
+i_syssockio=''
+i_sysndir='undef'
+i_sysselct='undef'
+i_sgtty='undef'
+i_termio='undef'
+i_termios='define'
+i_systime='define'
+i_systimek='undef'
 i_time='undef'
-i_sys_time='define'
-i_sys_select='undef'
-d_systimekernel='undef'
+timeincl='/usr/include/sys/time.h '
 i_utime='define'
 i_varargs='define'
+i_varhdr='varargs.h'
 i_vfork='define'
 intsize='4'
-libc='/usr/lib/libc.so.1.7'
-nm_opts=''
-libndir=''
-i_my_dir='undef'
-i_ndir='undef'
-i_sys_ndir='undef'
-i_dirent='define'
-i_sys_dir='undef'
-d_dirnamlen='undef'
-ndirc=''
-ndiro=''
-mallocsrc='malloc.c'
+lib='/usr/local/lib'
+libexp='/usr/local/lib'
+libc='/usr/lib/libc.so.1.8.1'
+libpth='  /lib /usr/lib /usr/ucblib /usr/local/lib'
+plibpth=''
+xlibpth='/usr/lib/386 /lib/386'
+libs='-ldbm -ldl -lm -lposix'
 mallocobj='malloc.o'
-d_mymalloc='define'
-mallocptrtype='char'
-mansrc='/usr/man/manl'
-manext='l'
+mallocsrc='malloc.c'
+malloctype='char *'
+usemymalloc='y'
+installmansrc='/usr/local/man/man1'
+manext='1'
+mansrc='/usr/local/man/man1'
+mansrcexp='/usr/local/man/man1'
+huge=''
+large=''
+medium=''
 models='none'
-split=''
 small=''
-medium=''
-large=''
-huge=''
-optimize='-g'
-ccflags='-DDEBUGGING -DHAS_SDBM'
-cppflags='-DDEBUGGING -DHAS_SDBM'
-ldflags=''
-cc='cc'
-nativegcc=''
-libs='-ldbm -lm -lposix'
-n='-n'
+split=''
+mydomain=''
+myhostname='scalpel'
+phostname='hostname'
 c=''
+n='-n'
+groupcat=''
+hostcat='ypcat hosts'
+passcat=''
 package='perl'
+spackage=''
+installprivlib='/usr/local/lib/perl'
+privlib='/usr/local/lib/perl'
+privlibexp='/usr/local/lib/perl'
+prototype='undef'
 randbits='31'
+installscript='/usr/local/bin'
 scriptdir='/usr/local/bin'
-installscr='/usr/local/bin'
+scriptdirexp='/usr/local/bin'
 sig_name='ZERO HUP INT QUIT ILL TRAP ABRT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM URG STOP TSTP CONT CLD TTIN TTOU IO XCPU XFSZ VTALRM PROF WINCH LOST USR1 USR2'
-spitshell='cat'
-shsharp='true'
 sharpbang='#!'
+shsharp='true'
+spitshell='cat'
 startsh='#!/bin/sh'
 stdchar='unsigned char'
+sysman='/usr/man/man1'
 uidtype='uid_t'
-usrinclude='/usr/include'
-inclPath=''
-void=''
-voidhave='7'
-voidwant='7'
-w_localtim='1'
-w_s_timevl='1'
-w_s_tm='1'
-yacc='/bin/yacc'
-lib=''
-privlib='/usr/local/lib/perl'
-installprivlib='/usr/local/lib/perl'
-PATCHLEVEL=34
+nm_opt=''
+runnm='true'
+usenm='true'
+incpath=''
+mips=''
+mips_type=''
+usrinc='/usr/include'
+defvoidused='15'
+voidflags='15'
+yacc='yacc'
+yaccflags=''
+PATCHLEVEL=0
 CONFIG=true
index d1747d4..8c63a9f 100755 (executable)
@@ -1,76 +1,85 @@
-: make config.h.SH
 case $CONFIG in
 '')
-    if test ! -f config.sh; then
-       ln ../config.sh . || \
-       ln ../../config.sh . || \
-       ln ../../../config.sh . || \
-       (echo "Can't find config.sh."; exit 1)
-       echo "Using config.sh from above..."
-    fi 2>/dev/null
-    . ./config.sh
-    ;;
+       if test -f config.sh; then TOP=.;
+       elif test -f ../config.sh; then TOP=..;
+       elif test -f ../../config.sh; then TOP=../..;
+       elif test -f ../../../config.sh; then TOP=../../..;
+       elif test -f ../../../../config.sh; then TOP=../../../..;
+       else
+               echo "Can't find config.sh."; exit 1
+       fi
+       . $TOP/config.sh
+       ;;
+esac
+case "$0" in
+*/*) cd `expr X$0 : 'X\(.*\)/'` ;;
 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
+sed <<!GROK!THIS! >config.h -e 's!^#undef!/\*#define!' -e 's!^#un-def!#undef!'
+/*
+ * This file was produced by running the config_h.SH script, which
  * gets its values from config.sh, which is generally produced by
  * running Configure.
  *
  * Feel free to modify any of this as the need arises.  Note, however,
  * that running config.h.SH again will wipe out any changes you've made.
  * For a more permanent change edit config.sh and rerun config.h.SH.
+ *
+ * \$Id: Config_h.U,v 3.0.1.2 1993/08/24 12:13:20 ram Exp $
  */
- /*SUPPRESS 460*/
 
+/* Configuration time: $cf_time
+ * Configured by: $cf_by
+ * Target system: $myuname
+ */
 
-/* EUNICE
+#ifndef _config_h_
+#define _config_h_
+
+/* 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             /**/
-
-/* LOC_SED
- *     This symbol holds the complete pathname to the sed program.
+/* BSD:
+ *     This symbol, if defined, indicates that the program is running under
+ *     a BSD system.
  */
-#define LOC_SED "$sed"             /**/
+#$d_eunice EUNICE              /**/
+#$d_eunice VMS         /**/
+#$d_bsd BSD            /**/
 
-/* ALIGNBYTES
- *     This symbol contains the number of bytes required to align a double.
- *     Usual values are 2, 4, and 8.
+/* ALIGNBYTES:
+ *     This symbol contains the number of bytes required to align a
+ *     double. Usual values are 2, 4 and 8.
  */
-#define ALIGNBYTES $alignbytes         /**/
+#define ALIGNBYTES $alignbytes /**/
 
-/* BIN
- *     This symbol holds the name of the directory in which the user wants
- *     to keep publicly executable images for the package in question.  It
- *     is most often a local directory such as /usr/local/bin.
+/* BIN:
+ *     This symbol holds the path of the bin directory where the package will
+ *     be installed. Program must be prepared to deal with ~name substitution.
  */
-#define BIN "$bin"             /**/
+#define BIN "$bin"     /**/
 
-/* BYTEORDER
- *     This symbol contains an encoding of the order of bytes in a long.
- *     Usual values (in hex) are 0x1234, 0x4321, 0x2143, 0x3412...
+/* BYTEORDER:
+ *     This symbol hold the hexadecimal constant defined in byteorder,
+ *     i.e. 0x1234 or 0x4321, etc...
  */
-#define BYTEORDER 0x$byteorder         /**/
+#define BYTEORDER 0x$byteorder /* large digits for MSB */
 
-/* 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".
+ *     output.  Typical value of "cc -E" or "/lib/cpp", but it can also
+ *     call a wrapper. See CPPRUN.
  */
-/* 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
@@ -79,55 +88,39 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef!/\*#undef!'
 #define CPPSTDIN "$cppstdin"
 #define CPPMINUS "$cppminus"
 
-/* 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.
+/* HAS_BCMP:
+ *     This symbol is defined if the bcmp() routine is available to
+ *     compare blocks of memory.
  */
-#$d_bcmp       HAS_BCMP                /**/
+#$d_bcmp HAS_BCMP      /**/
 
-/* HAS_BCOPY
- *     This symbol, if defined, indicates that the bcopy routine is available
- *     to copy blocks of memory.  Otherwise you should probably use memcpy().
- *     If neither is defined, roll your own.
- */
-/* SAFE_BCOPY
- *     This symbol, if defined, indicates that the bcopy routine is available
- *     to copy potentially overlapping copy blocks of bcopy.  Otherwise you
- *     should probably use memmove() or memcpy().  If neither is defined,
- *     roll your own.
+/* HAS_BCOPY:
+ *     This symbol is defined if the bcopy() routine is available to
+ *     copy blocks of memory.
  */
-#$d_bcopy      HAS_BCOPY               /**/
-#$d_safebcpy   SAFE_BCOPY              /**/
+#$d_bcopy 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.
+/* HAS_BZERO:
+ *     This symbol is defined if the bzero() routine is available to
+ *     set a memory block to 0.
  */
-#$d_bzero      HAS_BZERO               /**/
+#$d_bzero HAS_BZERO    /**/
 
-/* 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.
+/* CASTNEGFLOAT:
+ *     This symbol is defined if the C compiler can cast negative
+ *     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:
+ *             0 = ok
  *             1 = couldn't cast < 0
  *             2 = couldn't cast >= 0x80000000
  */
-#$d_castneg    CASTNEGFLOAT    /**/
-#define        CASTFLAGS $castflags    /**/
-
-/* CASTI32
- *    This symbol, if defined, indicates that this C compiler knows how to
- *    cast negative or large floating point numbers to 32-bit ints.
- */
-#define CASTI32
+#$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
@@ -135,25 +128,36 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef!/\*#undef!'
  */
 #$d_charsprf   CHARSPRINTF     /**/
 
-/* HAS_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     HAS_CHSIZE              /**/
 
-/* HAS_CRYPT
+/* HASCONST:
+ *     This symbol, if defined, indicates that this C compiler knows about
+ *     the const type. There is no need to actually test for that symbol
+ *     within your programs. The mere use of the "const" keyword will
+ *     trigger the necessary tests.
+ */
+#$d_const HASCONST     /**/
+#ifndef HASCONST
+#define const
+#endif
+
+/* HAS_CRYPT:
  *     This symbol, if defined, indicates that the crypt routine is available
  *     to encrypt passwords and the like.
  */
-#$d_crypt      HAS_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
@@ -168,696 +172,791 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef!/\*#undef!'
  */
 #$d_dosuid DOSUID              /**/
 
-/* HAS_DUP2
- *     This symbol, if defined, indicates that the dup2 routine is available
- *     to dup file descriptors.  Otherwise you should use dup().
+/* HAS_DUP2:
+ *     This symbol, if defined, indicates that the dup2 routine is
+ *     available to duplicate file descriptors.
  */
-#$d_dup2       HAS_DUP2                /**/
+#$d_dup2 HAS_DUP2      /**/
 
-/* HAS_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     HAS_FCHMOD              /**/
+#$d_fchmod HAS_FCHMOD          /**/
 
-/* HAS_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     HAS_FCHOWN              /**/
+#$d_fchown HAS_FCHOWN          /**/
 
-/* HAS_FCNTL
+/* HAS_FCNTL:
  *     This symbol, if defined, indicates to the C program that
  *     the fcntl() function exists.
  */
-#$d_fcntl      HAS_FCNTL               /**/
+#$d_fcntl HAS_FCNTL            /**/
 
-/* FLEXFILENAMES
+/* FLEXFILENAMES:
  *     This symbol, if defined, indicates that the system supports filenames
  *     longer than 14 characters.
  */
 #$d_flexfnam   FLEXFILENAMES           /**/
 
-/* HAS_FLOCK
- *     This symbol, if defined, indicates that the flock() routine is
+/* HAS_FLOCK:
+ *     This symbol, if defined, indicates that the flock routine is
  *     available to do file locking.
  */
-#$d_flock      HAS_FLOCK               /**/
+#$d_flock HAS_FLOCK            /**/
 
-/* HAS_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    HAS_GETGROUPS           /**/
+#$d_getgrps HAS_GETGROUPS              /**/
 
-/* HAS_GETHOSTENT
- *     This symbol, if defined, indicates that the gethostent() routine is
+/* 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    HAS_GETHOSTENT          /**/
+#$d_gethent HAS_GETHOSTENT             /**/
+
+/* HAS_UNAME:
+ *     This symbol, if defined, indicates that the C program may use the
+ *     uname() routine to derive the host name.  See also HAS_GETHOSTNAME
+ *     and PHOSTNAME.
+ */
+#$d_uname HAS_UNAME            /**/
 
-/* HAS_GETPGRP
- *     This symbol, if defined, indicates that the getpgrp() routine is
+/* HAS_GETPGRP:
+ *     This symbol, if defined, indicates that the getpgrp routine is
  *     available to get the current process group.
  */
-#$d_getpgrp    HAS_GETPGRP             /**/
+#$d_getpgrp HAS_GETPGRP                /**/
 
-/* HAS_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   HAS_GETPGRP2            /**/
+#$d_getpgrp2 HAS_GETPGRP2              /**/
 
-/* HAS_GETPRIORITY
- *     This symbol, if defined, indicates that the getpriority() routine is
+/* HAS_GETPRIORITY:
+ *     This symbol, if defined, indicates that the getpriority routine is
  *     available to get a process's priority.
  */
-#$d_getprior   HAS_GETPRIORITY         /**/
+#$d_getprior HAS_GETPRIORITY           /**/
 
-/* HAS_HTONS
- *     This symbol, if defined, indicates that the htons routine (and friends)
- *     are available to do network order byte swapping.
+/* HAS_HTONL:
+ *     This symbol, if defined, indicates that the htonl() routine (and
+ *     friends htons() ntohl() ntohs()) are available to do network
+ *     order byte swapping.
  */
-/* HAS_HTONL
- *     This symbol, if defined, indicates that the htonl routine (and friends)
- *     are available to do network order byte swapping.
+/* HAS_HTONS:
+ *     This symbol, if defined, indicates that the htons() routine (and
+ *     friends htonl() ntohl() ntohs()) are available to do network
+ *     order byte swapping.
  */
-/* HAS_NTOHS
- *     This symbol, if defined, indicates that the ntohs routine (and friends)
- *     are available to do network order byte swapping.
+/* HAS_NTOHL:
+ *     This symbol, if defined, indicates that the ntohl() routine (and
+ *     friends htonl() htons() ntohs()) are available to do network
+ *     order byte swapping.
  */
-/* HAS_NTOHL
- *     This symbol, if defined, indicates that the ntohl routine (and friends)
- *     are available to do network order byte swapping.
+/* HAS_NTOHS:
+ *     This symbol, if defined, indicates that the ntohs() routine (and
+ *     friends htonl() htons() ntohl()) are available to do network
+ *     order byte swapping.
  */
-#$d_htonl      HAS_HTONS       /**/
-#$d_htonl      HAS_HTONL       /**/
-#$d_htonl      HAS_NTOHS       /**/
-#$d_htonl      HAS_NTOHL       /**/
+#$d_htonl HAS_HTONL            /**/
+#$d_htonl HAS_HTONS            /**/
+#$d_htonl HAS_NTOHL            /**/
+#$d_htonl HAS_NTOHS            /**/
 
-/* index
- *     This preprocessor symbol is defined, along with rindex, if the system
- *     uses the strchr and strrchr routines instead.
- */
-/* 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? */
-
-/* HAS_ISASCII
- *     This symbol, if defined, indicates that the isascii routine is available
- *     to test characters for asciiness.
- */
-#$d_isascii    HAS_ISASCII             /**/
-
-/* HAS_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     HAS_KILLPG              /**/
+#$d_killpg HAS_KILLPG  /**/
 
-/* HAS_LSTAT
- *     This symbol, if defined, indicates that the lstat() routine is
- *     available to stat symbolic links.
+/* HAS_LINK:
+ *     This symbol, if defined, indicates that the link routine is
+ *     available to create hard links.
  */
-#$d_lstat      HAS_LSTAT               /**/
+#$d_link HAS_LINK      /**/
 
-/* HAS_MEMCMP
- *     This symbol, if defined, indicates that the memcmp routine is available
- *     to compare blocks of memory.  If undefined, roll your own.
+/* HAS_LSTAT:
+ *     This symbol, if defined, indicates that the lstat routine is
+ *     available to do file stats on symbolic links.
  */
-#$d_memcmp     HAS_MEMCMP              /**/
+#$d_lstat HAS_LSTAT            /**/
 
-/* 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.
+/* HAS_MEMCMP:
+ *     This symbol, if defined, indicates that the memcmp routine is available
+ *     to compare blocks of memory.
  */
-/* SAFE_MEMCPY
+#$d_memcmp HAS_MEMCMP  /**/
+
+/* HAS_MEMCPY:
  *     This symbol, if defined, indicates that the memcpy routine is available
- *     to copy potentially overlapping copy blocks of memory.  Otherwise you
- *     should probably use memmove() or bcopy().  If neither is defined,
- *     roll your own.
+ *     to copy blocks of memory.
  */
-#$d_memcpy     HAS_MEMCPY              /**/
-#$d_safemcpy   SAFE_MEMCPY             /**/
+#$d_memcpy HAS_MEMCPY  /**/
 
-/* HAS_MEMMOVE
+/* HAS_MEMMOVE:
  *     This symbol, if defined, indicates that the memmove routine is available
- *     to move potentially overlapping blocks of memory.  Otherwise you
- *     should use bcopy() or roll your own.
+ *     to copy potentially overlapping blocks of memory. This should be used
+ *     only when HAS_SAFE_BCOPY is not defined. If neither is there, roll your
+ *     own version.
  */
-#$d_memmove    HAS_MEMMOVE             /**/
+#$d_memmove HAS_MEMMOVE        /**/
 
-/* HAS_MEMSET
+/* HAS_MEMSET:
  *     This symbol, if defined, indicates that the memset routine is available
- *     to set a block of memory to a character.  If undefined, roll your own.
+ *     to set blocks of memory.
  */
-#$d_memset     HAS_MEMSET              /**/
+#$d_memset HAS_MEMSET  /**/
 
-/* HAS_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      HAS_MKDIR               /**/
+#$d_mkdir HAS_MKDIR            /**/
 
-/* HAS_MSG
+/* HAS_MSG:
  *     This symbol, if defined, indicates that the entire msg*(2) library is
- *     supported.
+ *     supported (IPC mechanism based on message queues).
  */
-#$d_msg        HAS_MSG         /**/
+#$d_msg HAS_MSG                /**/
 
-/* HAS_MSGCTL
+/* HAS_MSGCTL:
  *     This symbol, if defined, indicates that the msgctl() routine is
- *     available to control message passing.
+ *     available to perform message control operations.
  */
-#$d_msgctl     HAS_MSGCTL              /**/
+#$d_msgctl HAS_MSGCTL          /**/
 
-/* HAS_MSGGET
+/* HAS_MSGGET:
  *     This symbol, if defined, indicates that the msgget() routine is
- *     available to get messages.
+ *     available to get a new message queue.
  */
-#$d_msgget     HAS_MSGGET              /**/
+#$d_msgget HAS_MSGGET          /**/
 
-/* HAS_MSGRCV
+/* HAS_MSGRCV:
  *     This symbol, if defined, indicates that the msgrcv() routine is
- *     available to receive messages.
+ *     available to extract a message from the message queue.
  */
-#$d_msgrcv     HAS_MSGRCV              /**/
+#$d_msgrcv HAS_MSGRCV          /**/
 
-/* HAS_MSGSND
+/* HAS_MSGSND:
  *     This symbol, if defined, indicates that the msgsnd() routine is
- *     available to send messages.
- */
-#$d_msgsnd     HAS_MSGSND              /**/
-
-/* HAS_NDBM
- *     This symbol, if defined, indicates that ndbm.h exists and should
- *     be included.
+ *     available to send a message into the message queue.
  */
-#$d_ndbm       HAS_NDBM                /**/
+#$d_msgsnd HAS_MSGSND          /**/
 
-/* HAS_ODBM
- *     This symbol, if defined, indicates that dbm.h exists and should
- *     be included.
- */
-#$d_odbm       HAS_ODBM                /**/
-
-/* HAS_OPEN3
+/* HAS_OPEN3:
  *     This manifest constant lets the C program know that the three
  *     argument form of open(2) is available.
  */
-#$d_open3      HAS_OPEN3               /**/
+#$d_open3 HAS_OPEN3            /**/
 
-/* HAS_READDIR
- *     This symbol, if defined, indicates that the readdir routine is available
- *     from the C library to read directories.
+/* HAS_READDIR:
+ *     This symbol, if defined, indicates that the readdir routine is
+ *     available to read directory entries. You may have to include
+ *     <dirent.h>. See I_DIRENT.
  */
-#$d_readdir    HAS_READDIR             /**/
+#$d_readdir HAS_READDIR                /**/
 
-/* HAS_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     HAS_RENAME              /**/
+#$d_rename HAS_RENAME  /**/
 
-/* HAS_REWINDDIR
- *     This symbol, if defined, indicates that the rewindir routine is
- *     available to rewind directories.
+/* 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_rewindir   HAS_REWINDDIR           /**/
+#$d_rmdir HAS_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.
+/* HAS_SAFE_BCOPY:
+ *     This symbol, if defined, indicates that the bcopy routine is available
+ *     to copy potentially overlapping memory blocks. Otherwise you should
+ *     probably use memmove() or memcpy(). If neither is defined, roll your
+ *     own version.
  */
-#$d_rmdir      HAS_RMDIR               /**/
+#$d_safebcpy HAS_SAFE_BCOPY    /**/
 
-/* HAS_SEEKDIR
- *     This symbol, if defined, indicates that the seekdir routine is
- *     available to seek into directories.
+/* HAS_SAFE_MEMCPY:
+ *     This symbol, if defined, indicates that the memcpy routine is available
+ *     to copy potentially overlapping memory blocks. Otherwise you should
+ *     probably use memmove() or memcpy(). If neither is defined, roll your
+ *     own version.
  */
-#$d_seekdir    HAS_SEEKDIR             /**/
+#$d_safemcpy HAS_SAFE_MEMCPY   /**/
 
-/* HAS_SELECT
- *     This symbol, if defined, indicates that the select() subroutine
- *     exists.
+/* HAS_SELECT:
+ *     This symbol, if defined, indicates that the select routine is
+ *     available to select active file descriptors. If the timeout field
+ *     is used, <sys/time.h> may need to be included.
  */
-#$d_select     HAS_SELECT      /**/
+#$d_select HAS_SELECT  /**/
 
-/* HAS_SEM
+/* HAS_SEM:
  *     This symbol, if defined, indicates that the entire sem*(2) library is
  *     supported.
  */
-#$d_sem        HAS_SEM         /**/
+#$d_sem HAS_SEM                /**/
 
-/* HAS_SEMCTL
+/* HAS_SEMCTL:
  *     This symbol, if defined, indicates that the semctl() routine is
- *     available to control semaphores.
+ *     available to perform semaphore control operations.
  */
-#$d_semctl     HAS_SEMCTL              /**/
+#$d_semctl HAS_SEMCTL  /**/
 
-/* HAS_SEMGET
+/* HAS_SEMGET:
  *     This symbol, if defined, indicates that the semget() routine is
- *     available to get semaphores ids.
+ *     available to get a set of semaphores.
  */
-#$d_semget     HAS_SEMGET              /**/
+#$d_semget HAS_SEMGET  /**/
 
-/* HAS_SEMOP
+/* HAS_SEMOP:
  *     This symbol, if defined, indicates that the semop() routine is
- *     available to perform semaphore operations.
+ *     available to execute semaphore operations.
  */
-#$d_semop      HAS_SEMOP               /**/
+#$d_semop HAS_SEMOP            /**/
 
-/* HAS_SETEGID
+/* HAS_SETEGID:
  *     This symbol, if defined, indicates that the setegid routine is available
  *     to change the effective gid of the current program.
  */
-#$d_setegid    HAS_SETEGID             /**/
+#$d_setegid HAS_SETEGID                /**/
 
-/* HAS_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    HAS_SETEUID             /**/
+#$d_seteuid HAS_SETEUID                /**/
+
+/* HAS_SETPGID:
+ *     This symbol, if defined, indicates that the setpgid routine is
+ *     available to set process group ID.
+ */
+#$d_setpgid HAS_SETPGID        /**/
 
-/* HAS_SETPGRP
- *     This symbol, if defined, indicates that the setpgrp() routine is
+/* HAS_SETPGRP:
+ *     This symbol, if defined, indicates that the setpgrp routine is
  *     available to set the current process group.
  */
-#$d_setpgrp    HAS_SETPGRP             /**/
+#$d_setpgrp HAS_SETPGRP                /**/
 
-/* HAS_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   HAS_SETPGRP2            /**/
+#$d_setpgrp2 HAS_SETPGRP2              /**/
 
-/* HAS_SETPRIORITY
- *     This symbol, if defined, indicates that the setpriority() routine is
+/* HAS_SETPRIORITY:
+ *     This symbol, if defined, indicates that the setpriority routine is
  *     available to set a process's priority.
  */
-#$d_setprior   HAS_SETPRIORITY         /**/
+#$d_setprior HAS_SETPRIORITY           /**/
 
-/* HAS_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.
+ *     available to change the real and effective gid of the current
+ *     process.
  */
-/* HAS_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.
+ *     process.
  */
-#$d_setregid   HAS_SETREGID            /**/
-#$d_setresgid  HAS_SETRESGID           /**/
+#$d_setregid HAS_SETREGID              /**/
+#$d_setresgid HAS_SETRESGID            /**/
 
-/* HAS_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.
+ *     available to change the real and effective uid of the current
+ *     process.
  */
-/* HAS_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.
+ *     process.
  */
-#$d_setreuid   HAS_SETREUID            /**/
-#$d_setresuid  HAS_SETRESUID           /**/
+#$d_setreuid HAS_SETREUID              /**/
+#$d_setresuid HAS_SETRESUID            /**/
 
-/* HAS_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    HAS_SETRGID             /**/
+#$d_setrgid HAS_SETRGID                /**/
 
-/* HAS_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    HAS_SETRUID             /**/
+#$d_setruid HAS_SETRUID                /**/
+
+/* HAS_SETSID:
+ *     This symbol, if defined, indicates that the setsid routine is
+ *     available to set the process group ID.
+ */
+#$d_setsid HAS_SETSID  /**/
 
-/* HAS_SHM
+/* HAS_SHM:
  *     This symbol, if defined, indicates that the entire shm*(2) library is
  *     supported.
  */
-#$d_shm        HAS_SHM         /**/
+#$d_shm HAS_SHM                /**/
 
-/* HAS_SHMAT
+/* HAS_SHMAT:
  *     This symbol, if defined, indicates that the shmat() routine is
- *     available to attach a shared memory segment.
+ *     available to attach a shared memory segment to the process space.
  */
-/* VOID_SHMAT
- *     This symbol, if defined, indicates that the shmat() routine
- *     returns a pointer of type void*.
- */
-#$d_shmat      HAS_SHMAT               /**/
-
-#$d_voidshmat  VOIDSHMAT               /**/
+#$d_shmat HAS_SHMAT            /**/
 
-/* HAS_SHMCTL
+/* HAS_SHMCTL:
  *     This symbol, if defined, indicates that the shmctl() routine is
- *     available to control a shared memory segment.
+ *     available to perform shared memory control operations.
  */
-#$d_shmctl     HAS_SHMCTL              /**/
+#$d_shmctl HAS_SHMCTL          /**/
 
-/* HAS_SHMDT
+/* HAS_SHMDT:
  *     This symbol, if defined, indicates that the shmdt() routine is
- *     available to detach a shared memory segment.
+ *     available to detach a shared memory segment from the process space.
  */
-#$d_shmdt      HAS_SHMDT               /**/
+#$d_shmdt HAS_SHMDT            /**/
 
-/* HAS_SHMGET
+/* HAS_SHMGET:
  *     This symbol, if defined, indicates that the shmget() routine is
- *     available to get a shared memory segment id.
+ *     available to request a shared memory segment from the kernel.
  */
-#$d_shmget     HAS_SHMGET              /**/
+#$d_shmget HAS_SHMGET          /**/
 
-/* HAS_SOCKET
+/* HAS_SOCKET:
  *     This symbol, if defined, indicates that the BSD socket interface is
  *     supported.
  */
-/* HAS_SOCKETPAIR
- *     This symbol, if defined, indicates that the BSD socketpair call is
+/* HAS_SOCKETPAIR:
+ *     This symbol, if defined, indicates that the BSD socketpair() call is
  *     supported.
  */
-/* OLDSOCKET
+/* USE_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.
+ *     is supported instead of the 4.2/4.3 BSD socket interface. For instance,
+ *     there is no setsockopt() call.
  */
-#$d_socket     HAS_SOCKET              /**/
-
-#$d_sockpair   HAS_SOCKETPAIR  /**/
-
-#$d_oldsock    OLDSOCKET       /**/
+#$d_socket HAS_SOCKET          /**/
+#$d_sockpair HAS_SOCKETPAIR    /**/
+#$d_oldsock USE_OLDSOCKET      /**/
 
-/* STATBLOCKS
+/* USE_STAT_BLOCKS:
  *     This symbol is defined if this system has a stat structure declaring
  *     st_blksize and st_blocks.
  */
-#$d_statblks   STATBLOCKS      /**/
+#$d_statblks USE_STAT_BLOCKS   /**/
 
-/* STDSTDIO
+/* USE_STD_STDIO:
  *     This symbol is defined if this system has a FILE structure declaring
  *     _ptr and _cnt in stdio.h.
  */
-#$d_stdstdio   STDSTDIO        /**/
+#$d_stdstdio USE_STD_STDIO     /**/
 
-/* STRUCTCOPY
+/* USE_STRUCT_COPY:
  *     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      /**/
+#$d_strctcpy   USE_STRUCT_COPY /**/
 
-/* HAS_STRERROR
- *     This symbol, if defined, indicates that the strerror() routine is
- *     available to translate error numbers to strings.
- */
-#$d_strerror   HAS_STRERROR            /**/
-
-/* HAS_SYMLINK
+/* HAS_SYMLINK:
  *     This symbol, if defined, indicates that the symlink routine is available
  *     to create symbolic links.
  */
-#$d_symlink    HAS_SYMLINK             /**/
+#$d_symlink HAS_SYMLINK        /**/
 
-/* HAS_SYSCALL
- *     This symbol, if defined, indicates that the syscall routine is available
- *     to call arbitrary system calls.  If undefined, that's tough.
+/* 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    HAS_SYSCALL             /**/
+#$d_syscall HAS_SYSCALL        /**/
 
-/* HAS_TELLDIR
- *     This symbol, if defined, indicates that the telldir routine is
- *     available to tell your location in directories.
+/* HAS_SYSTEM:
+ *     This symbol, if defined, indicates that the system routine is
+ *     available to issue a shell command.
  */
-#$d_telldir    HAS_TELLDIR             /**/
+#$d_system HAS_SYSTEM  /**/
 
-/* HAS_TRUNCATE
+/* HAS_TIMES:
+ *     This symbol, if defined, indicates that the times() routine exists.
+ *     Note that this became obsolete on some systems (SUNOS), which now
+ * use getrusage(). It may be necessary to include <sys/times.h>.
+ */
+#$d_times HAS_TIMES            /**/
+
+/* HAS_TRUNCATE:
  *     This symbol, if defined, indicates that the truncate routine is
  *     available to truncate files.
  */
-#$d_truncate   HAS_TRUNCATE            /**/
+#$d_truncate HAS_TRUNCATE      /**/
 
-/* HAS_VFORK
+/* 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_ndir I_NDIR                /**/
+
+/* HAS_VFORK:
  *     This symbol, if defined, indicates that vfork() exists.
  */
-#$d_vfork      HAS_VFORK       /**/
+#$d_vfork HAS_VFORK    /**/
 
-/* 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
+/* 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     /**/
+#$d_voidsig VOIDSIG    /**/
 
-/* HASVOLATILE
+/* HASVOLATILE:
  *     This symbol, if defined, indicates that this C compiler knows about
  *     the volatile declaration.
  */
 #$d_volatile   HASVOLATILE     /**/
+#ifndef HASVOLATILE
+#define volatile
+#endif
 
-/* HAS_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
+/* USE_CHAR_VSPRINTF:
  *     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    HAS_VPRINTF     /**/
-#$d_charvspr   CHARVSPRINTF    /**/
+#$d_vprintf HAS_VPRINTF        /**/
+#$d_charvspr USE_CHAR_VSPRINTF         /**/
 
-/* HAS_WAIT4
+/* HAS_WAIT4:
  *     This symbol, if defined, indicates that wait4() exists.
  */
-#$d_wait4      HAS_WAIT4       /**/
+#$d_wait4 HAS_WAIT4    /**/
 
-/* HAS_WAITPID
- *     This symbol, if defined, indicates that waitpid() exists.
+/* HAS_WAITPID:
+ *     This symbol, if defined, indicates that the waitpid routine is
+ *     available to wait for child process.
  */
-#$d_waitpid    HAS_WAITPID     /**/
+#$d_waitpid 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.
+/* I_DBM:
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include <dbm.h>.
  */
-#define GIDTYPE $gidtype               /**/
+#$i_dbm I_DBM  /**/
 
-/* GROUPSTYPE
- *     This symbol has a value like gid_t, int, ushort, or whatever type is
- *     used in the return value of getgroups().
+/* I_DIRENT:
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include <dirent.h>. Using this symbol also triggers the definition
+ *     of the Direntry_t define which ends up being 'struct dirent' or
+ *     'struct direct' depending on the availability of <dirent.h>.
  */
-#define GROUPSTYPE $groupstype         /**/
+/* 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        /**/
+#ifdef I_DIRENT
+#define Direntry_t struct dirent
+#else
+#define Direntry_t struct direct
+#endif
 
-/* I_FCNTL
+/* I_FCNTL:
  *     This manifest constant tells the C program to include <fcntl.h>.
  */
-#$i_fcntl      I_FCNTL /**/
+#$i_fcntl I_FCNTL      /**/
 
-/* I_GDBM
+/* I_GDBM:
  *     This symbol, if defined, indicates that gdbm.h exists and should
  *     be included.
  */
-#$i_gdbm       I_GDBM          /**/
+#$i_gdbm I_GDBM        /**/
 
-/* I_GRP
+/* I_GRP:
  *     This symbol, if defined, indicates to the C program that it should
- *     include grp.h.
+ *     include <grp.h>.
  */
-#$i_grp        I_GRP           /**/
+#$i_grp I_GRP          /**/
 
-/* I_NETINET_IN
+/* I_NDBM:
+ *     This symbol, if defined, indicates that ndbm.h exists and should
+ *     be included.
+ */
+#$i_ndbm I_NDBM        /**/
+
+/* I_NETINET_IN:
  *     This symbol, if defined, indicates to the C program that it should
- *     include netinet/in.h.
+ *     include <netinet/in.h>. Otherwise, you may try <sys/in.h>.
  */
-/* I_SYS_IN
+/* I_SYS_IN:
  *     This symbol, if defined, indicates to the C program that it should
- *     include sys/in.h.
+ *     include <sys/in.h> instead of <netinet/in.h>.
  */
-#$i_niin       I_NETINET_IN            /**/
-#$i_sysin      I_SYS_IN                /**/
+#$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.
+ *     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
+/* 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
+/* PWCOMMENT:
  *     This symbol, if defined, indicates to the C program that struct passwd
  *     contains pw_comment.
  */
-#$i_pwd        I_PWD           /**/
-#$d_pwquota    PWQUOTA         /**/
-#$d_pwage      PWAGE           /**/
-#$d_pwchange   PWCHANGE        /**/
-#$d_pwclass    PWCLASS         /**/
-#$d_pwexpire   PWEXPIRE        /**/
-#$d_pwcomment  PWCOMMENT       /**/
+#$i_pwd I_PWD          /**/
+#$d_pwquota PWQUOTA    /**/
+#$d_pwage PWAGE        /**/
+#$d_pwchange PWCHANGE  /**/
+#$d_pwclass PWCLASS    /**/
+#$d_pwexpire PWEXPIRE  /**/
+#$d_pwcomment PWCOMMENT        /**/
 
-/* I_SYS_FILE
- *     This manifest constant tells the C program to include <sys/file.h>.
+/* I_STDARG:
+ *     This symbol, if defined, indicates that <stdarg.h> exists and should
+ *     be included.
  */
-#$i_sys_file   I_SYS_FILE      /**/
+#$i_stdarg I_STDARG            /**/
 
-/* I_SYSIOCTL
- *     This symbol, if defined, indicates that sys/ioctl.h exists and should
+/* I_STDDEF:
+ *     This symbol, if defined, indicates that <stddef.h> exists and should
  *     be included.
  */
-#$i_sysioctl   I_SYSIOCTL              /**/
+#$i_stddef I_STDDEF    /**/
 
-/* I_TIME
- *     This symbol is defined if the program should include <time.h>.
+/* I_SYS_DIR:
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include <sys/dir.h>.
  */
-/* I_SYS_TIME
- *     This symbol is defined if the program should include <sys/time.h>.
+#$i_sysdir I_SYS_DIR           /**/
+
+/* I_SYS_FILE:
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include <sys/file.h> to get definition of R_OK and friends.
  */
-/* SYSTIMEKERNEL
- *     This symbol is defined if the program should include <sys/time.h>
- *     with KERNEL defined.
+#$i_sysfile I_SYS_FILE         /**/
+
+/* I_SYS_IOCTL:
+ *     This symbol, if defined, indicates that <sys/ioctl.h> exists and should
+ *     be included. Otherwise, include <sgtty.h> or <termio.h>.
  */
-/* I_SYS_SELECT
- *     This symbol is defined if the program should include <sys/select.h>.
+#$i_sysioctl   I_SYS_IOCTL             /**/
+
+/* I_SYS_NDIR:
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include <sys/ndir.h>.
+ */
+#$i_sysndir I_SYS_NDIR /**/
+
+/* I_SYS_SELECT:
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include <sys/select.h> in order to get definition of struct timeval.
+ */
+#$i_sysselct I_SYS_SELECT      /**/
+
+/* I_TIME:
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include <time.h>.
+ */
+/* I_SYS_TIME:
+ *     This symbol, if defined, indicates to the C program that it should
+ *     include <sys/time.h>.
  */
-#$i_time       I_TIME          /**/
-#$i_sys_time   I_SYS_TIME      /**/
-#$d_systimekernel      SYSTIMEKERNEL   /**/
-#$i_sys_select I_SYS_SELECT    /**/
+#$i_time I_TIME                /**/
+#$i_systime I_SYS_TIME         /**/
 
-/* I_UTIME
+/* I_UTIME:
  *     This symbol, if defined, indicates to the C program that it should
- *     include utime.h.
+ *     include <utime.h>.
  */
-#$i_utime      I_UTIME         /**/
+#$i_utime I_UTIME              /**/
 
-/* I_VARARGS
+/* I_VARARGS:
  *     This symbol, if defined, indicates to the C program that it should
- *     include varargs.h.
+ *     include <varargs.h>.
  */
-#$i_varargs    I_VARARGS               /**/
+#$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         /**/
+#$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               /**/
 
-/* I_DIRENT
- *     This symbol, if defined, indicates that the program should use the
- *     P1003-style directory routines, and include <dirent.h>.
+/* 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
+ *     should be prepared to do ~ expansion.
  */
-/* I_SYS_DIR
- *     This symbol, if defined, indicates that the program should use the
- *     directory functions by including <sys/dir.h>.
+#define PRIVLIB "$privlib"             /**/
+
+/* RANDBITS:
+ *     This symbol contains the number of bits of random number the rand()
+ *     function produces.  Usual values are 15, 16, and 31.
  */
-/* 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.
+#define RANDBITS $randbits             /**/
+
+/* 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.
+ *     Programs must be prepared to deal with ~name expansion.
  */
-/* 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.
+#define SCRIPTDIR "$scriptdir" /**/
+
+/* SIG_NAME:
+ *     This symbol contains a list of signal names in order. This is intended
+ *     to be used as a static array initialization, like this:
+ *             char *sig_name[] = { SIG_NAME };
+ *     The signals in the list are separated with commas, and each signal
+ *     is surrounded by double quotes. There is no leading SIG in the signal
+ *     name, i.e. SIGQUIT is known as "QUIT".
  */
-/* I_MY_DIR
- *     This symbol, if defined, indicates that the program should compile
- *     the ndir.c code provided with the package.
+#define SIG_NAME "`echo $sig_name | sed 's/ /","/g'`"  /**/
+
+/* STDCHAR:
+ *     This symbol is defined to be the type of char used in stdio.h.
+ *     It has the values "unsigned char" or "char".
  */
-/* 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 STDCHAR $stdchar       /**/
+
+/* Uid_t:
+ *     This symbol holds the type used to declare user ids in the kernel.
+ *     It can be int, ushort, uid_t, etc... It may be necessary to include
+ *     <sys/types.h> to get any typedef'ed information.
  */
-#$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       /**/
+#define Uid_t $uidtype         /* UID type */
 
-/* MYMALLOC
- *     This symbol, if defined, indicates that we're using our own malloc.
+/* CASTI32:
+ *     This symbol is defined if the C compiler can cast negative
+ *     or large floating point numbers to 32-bit ints.
  */
-/* MALLOCPTRTYPE
- *     This symbol defines the kind of ptr returned by malloc and realloc.
+#$d_casti32    CASTI32         /**/
+
+/* HAS_ISASCII:
+ *     This manifest constant lets the C program know that the
+ *     isascii is available.
  */
-#$d_mymalloc MYMALLOC                  /**/
+#$d_isascii HAS_ISASCII                /**/
 
-#define MALLOCPTRTYPE $mallocptrtype         /**/
+/* HAS_SETLOCALE:
+ *     This symbol, if defined, indicates that the setlocale routine is
+ *     available to handle locale-specific ctype implementations.
+ */
+#$d_setlocale HAS_SETLOCALE    /**/
 
+/* HAS_STRERROR:
+ *     This symbol, if defined, indicates that the strerror routine is
+ *     available to translate error numbers to strings. See the writeup
+ *     of Strerror() in this file before you try to define your own.
+ */
+/* HAS_SYS_ERRLIST:
+ *     This symbol, if defined, indicates that the sys_errlist array is
+ *     available to translate error numbers to strings. The extern int
+ *     sys_nerr gives the size of that table.
+ */
+/* Strerror:
+ *     This preprocessor symbol is defined as a macro if strerror() is
+ *     not available to translate error numbers to strings but sys_errlist[]
+ *     array is there.
+ */
+#$d_strerror HAS_STRERROR              /**/
+#$d_syserrlst HAS_SYS_ERRLIST  /**/
+#ifdef HAS_STRERROR
+#  define Strerror strerror
+#else
+#$d_strerrm Strerror(e) ((e)<0||(e)>=sys_nerr?"unknown":sys_errlist[e]) /**/
+#endif
 
-/* RANDBITS
- *     This symbol contains the number of bits of random number the rand()
- *     function produces.  Usual values are 15, 16, and 31.
+/* USE_DYNAMIC_LOADING:
+ *     This symbol, if defined, indicates that dynamic loading of
+ *     some sort is available.
  */
-#define RANDBITS $randbits             /**/
+#$usedl USE_DYNAMIC_LOADING            /**/
 
-/* SCRIPTDIR
- *     This symbol holds the name of the directory in which the user wants
- *     to keep publicly executable scripts for the package in question.  It
- *     is often a directory that is mounted across diverse architectures.
+/* Gid_t:
+ *     This symbol holds the return type of getgid() and the type of
+ *     argument to setrgid() and related functions.  Typically,
+ *     it is the type of group ids in the kernel.
+ *     It can be int, ushort, uid_t, etc... It may be necessary to include
+ *     <sys/types.h> to get any typedef'ed information.
  */
-#define SCRIPTDIR "$scriptdir"             /**/
+#define Gid_t $gidtype         /* Type for getgid(), etc... */
 
-/* SIG_NAME
- *     This symbol contains an list of signal names in order.
+/* GROUPSTYPE:
+ *     This symbol holds the type used for the second argument to
+ *     getgroups().  Usually, this is the same of gidtype, but
+ *     sometimes it isn't.  It can be int, ushort, uid_t, etc... 
+ *     It may be necessary to include <sys/types.h> to get any 
+ *     typedef'ed information.  This is only required if you have
+ *     getgroups().
  */
-#define SIG_NAME "`echo $sig_name | sed 's/ /","/g'`"          /**/
+#ifdef HAS_GETGROUPS
+#define GROUPSTYPE $groupstype /* Type for 2nd arg to getgroups() */
+#endif
 
-/* STDCHAR
- *     This symbol is defined to be the type of char used in stdio.h.
- *     It has the values "unsigned char" or "char".
+/* Malloc_t:
+ *     This symbol is the type of pointer returned by malloc and realloc.
  */
-#define STDCHAR $stdchar       /**/
+#define Malloc_t $malloctype                   /**/
 
-/* UIDTYPE
- *     This symbol has a value like uid_t, int, ushort, or whatever type is
- *     used to declare user ids in the kernel.
+/* CAN_PROTOTYPE:
+ *     If defined, this macro indicates that the C compiler can handle
+ *     function prototypes.
  */
-#define UIDTYPE $uidtype               /**/
+#$prototype    CAN_PROTOTYPE   /**/
+#ifdef CAN_PROTOTYPE
+#else
+#endif
 
-/* VOIDHAVE
+/* VOIDFLAGS:
  *     This symbol indicates how much support of the void type is given by this
  *     compiler.  What various bits mean:
  *
@@ -865,50 +964,64 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef!/\*#undef!'
  *         2 = supports arrays of pointers to functions returning void
  *         4 = supports comparisons between pointers to void functions and
  *                 addresses of void functions
+ *         8 = suports declaration of generic void pointers
  *
- *     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
+ *     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
+#  ifdef VOIDWANT
+#    define VOIDUSED VOIDWANT
+#  else
+#    define VOIDUSED $defvoidused
+#  endif
 #endif
-#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 */
+#define VOIDFLAGS $voidflags
+#if (VOIDFLAGS & VOIDUSED) != VOIDUSED
+#  define void int             /* is void to be avoided? */
+#  define M_VOID                       /* Xenix strikes again */
+#  define VOID
 #else
-#define VOID void
-#define VOIDP (void *)
+#  define VOID void
 #endif
 
-/* 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
- *     should be prepared to do ~ expansion.
+/*
+ * The following symbols are obsolete. They are mapped to the the new
+ * symbols only to ease the transition process. The sources should be
+ * updated so as to use the new symbols only, as the support for these
+ * obsolete symbols may end without notice.
  */
-#define PRIVLIB "$privlib"             /**/
+
+#ifdef USE_CHAR_VSPRINTF
+#define CHARVSPRINTF USE_CHAR_VSPRINTF
+#endif
+
+#ifdef Gid_t
+#define GIDTYPE Gid_t
+#endif
+
+#ifdef I_GDBM
+#define HAS_GDBM I_GDBM
+#endif
+
+#ifdef HAS_SAFE_BCOPY
+#define SAFE_BCOPY HAS_SAFE_BCOPY
+#endif
+
+#ifdef USE_STAT_BLOCKS
+#define STATBLOCKS USE_STAT_BLOCKS
+#endif
+
+#ifdef USE_STD_STDIO
+#define STDSTDIO USE_STD_STDIO
+#endif
+
+#ifdef Uid_t
+#define UIDTYPE Uid_t
+#endif
 
 #endif
 !GROK!THIS!
index 8900d86..31585c4 100755 (executable)
--- a/configpm
+++ b/configpm
@@ -1,4 +1,4 @@
-#!./perl
+#!./miniperl
 
 @ARGV = "./config.sh";
 
diff --git a/cppstdin b/cppstdin
new file mode 100755 (executable)
index 0000000..908d494
--- /dev/null
+++ b/cppstdin
@@ -0,0 +1 @@
+cat >.$$.c; cc -E ${1+"$@"} .$$.c; rm .$$.c
diff --git a/deb.c b/deb.c
index d052db3..f1b375f 100644 (file)
--- a/deb.c
+++ b/deb.c
 #include "EXTERN.h"
 #include "perl.h"
 
-#ifdef STANDARD_C
-#  include <stdarg.h>
-#else
-#  ifdef I_VARARGS
-#    include <varargs.h>
-#  endif
-#endif
-
 void deb_growlevel();
 
 #if !defined(STANDARD_C) && !defined(I_VARARGS)
diff --git a/dl.c b/dl.c
index 38a798c..d514f81 100644 (file)
--- a/dl.c
+++ b/dl.c
@@ -5,9 +5,9 @@
 #include "XSUB.h"
 
 static int
-XS_DynamicLoader_bootstrap(ix, sp, items)
+XS_DynamicLoader_bootstrap(ix, ax, items)
 register int ix;
-register int sp;
+register int ax;
 register int items;
 {
     if (items < 1 || items > 1) {
@@ -39,7 +39,7 @@ register int items;
 
        ST(0) = sv_mortalcopy(&sv_yes);
     }
-    return sp;
+    return ax;
 }
 
 int
diff --git a/doio.c b/doio.c
index 64093bc..3d94e17 100644 (file)
--- a/doio.c
+++ b/doio.c
@@ -389,7 +389,7 @@ register GV *gv;
 #ifndef DOSISH
                    if (rename(oldname,SvPVX(sv)) < 0) {
                        warn("Can't rename %s to %s: %s, skipping file",
-                         oldname, SvPVX(sv), strerror(errno) );
+                         oldname, SvPVX(sv), Strerror(errno) );
                        do_close(gv,FALSE);
                        continue;
                    }
@@ -403,7 +403,7 @@ register GV *gv;
                    (void)UNLINK(SvPVX(sv));
                    if (link(oldname,SvPVX(sv)) < 0) {
                        warn("Can't rename %s to %s: %s, skipping file",
-                         oldname, SvPVX(sv), strerror(errno) );
+                         oldname, SvPVX(sv), Strerror(errno) );
                        do_close(gv,FALSE);
                        continue;
                    }
@@ -414,7 +414,7 @@ register GV *gv;
 #ifndef DOSISH
                    if (UNLINK(oldname) < 0) {
                        warn("Can't rename %s to %s: %s, skipping file",
-                         oldname, SvPVX(sv), strerror(errno) );
+                         oldname, SvPVX(sv), Strerror(errno) );
                        do_close(gv,FALSE);
                        continue;
                    }
@@ -428,7 +428,7 @@ register GV *gv;
                errno = 0;              /* in case sprintf set errno */
                if (!do_open(argvoutgv,SvPVX(sv),SvCUR(sv))) {
                    warn("Can't do inplace edit on %s: %s",
-                     oldname, strerror(errno) );
+                     oldname, Strerror(errno) );
                    do_close(gv,FALSE);
                    continue;
                }
@@ -453,7 +453,7 @@ register GV *gv;
            return IoIFP(GvIO(gv));
        }
        else
-           fprintf(stderr,"Can't open %s: %s\n",SvPV(sv, na), strerror(errno));
+           fprintf(stderr,"Can't open %s: %s\n",SvPV(sv, na), Strerror(errno));
     }
     if (inplace) {
        (void)do_close(argvoutgv,FALSE);
diff --git a/dump.c b/dump.c
index 5d80a70..19633dc 100644 (file)
--- a/dump.c
+++ b/dump.c
 #include "EXTERN.h"
 #include "perl.h"
 
-#ifdef DEBUGGING
+#ifndef DEBUGGING
+void
+dump_all()
+{
+}
+#else  /* Rest of file is for DEBUGGING */
 
 static void dump();
 
 void
 dump_all()
 {
+#ifdef HAS_SETLINEBUF
     setlinebuf(stderr);
+#else
+    setvbuf(stderr, Nullch, _IOLBF, 0);
+#endif
     if (main_root)
        dump_op(main_root);
     dump_packsubs(defstash);
diff --git a/embed.h b/embed.h
index 50078b5..d94649d 100644 (file)
--- a/embed.h
+++ b/embed.h
 #define mainstack      (curinterp->Imainstack)
 #define maxscream      (curinterp->Imaxscream)
 #define maxsysfd       (curinterp->Imaxsysfd)
+#define minus_F                (curinterp->Iminus_F)
 #define minus_a                (curinterp->Iminus_a)
 #define minus_c                (curinterp->Iminus_c)
 #define minus_l                (curinterp->Iminus_l)
 #define sortcop                (curinterp->Isortcop)
 #define sortstack      (curinterp->Isortstack)
 #define sortstash      (curinterp->Isortstash)
+#define splitstr       (curinterp->Isplitstr)
 #define stack          (curinterp->Istack)
 #define statcache      (curinterp->Istatcache)
 #define statgv         (curinterp->Istatgv)
 #define Imainstack     mainstack
 #define Imaxscream     maxscream
 #define Imaxsysfd      maxsysfd
+#define Iminus_F       minus_F
 #define Iminus_a       minus_a
 #define Iminus_c       minus_c
 #define Iminus_l       minus_l
 #define Isortcop       sortcop
 #define Isortstack     sortstack
 #define Isortstash     sortstash
+#define Isplitstr      splitstr
 #define Istack         stack
 #define Istatcache     statcache
 #define Istatgv                statgv
diff --git a/eval.c.save b/eval.c.save
new file mode 100644 (file)
index 0000000..964bc03
--- /dev/null
@@ -0,0 +1,3048 @@
+/* $RCSfile: eval.c,v $$Revision: 4.1 $$Date: 92/08/07 18:20:29 $
+ *
+ *    Copyright (c) 1991, Larry Wall
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ * $Log:       eval.c,v $
+ * Revision 4.1  92/08/07  18:20:29  lwall
+ * 
+ * Revision 4.0.1.4  92/06/08  13:20:20  lwall
+ * patch20: added explicit time_t support
+ * patch20: fixed confusion between a *var's real name and its effective name
+ * patch20: added Atari ST portability
+ * patch20: new warning for use of x with non-numeric right operand
+ * patch20: modulus with highest bit in left operand set didn't always work
+ * patch20: dbmclose(%array) didn't work
+ * patch20: added ... as variant on ..
+ * patch20: O_PIPE conflicted with Atari
+ * 
+ * Revision 4.0.1.3  91/11/05  17:15:21  lwall
+ * patch11: prepared for ctype implementations that don't define isascii()
+ * patch11: various portability fixes
+ * patch11: added sort {} LIST
+ * patch11: added eval {}
+ * patch11: sysread() in socket was substituting recv()
+ * patch11: a last statement outside any block caused occasional core dumps
+ * patch11: missing arguments caused core dump in -D8 code
+ * patch11: eval 'stuff' now optimized to eval {stuff}
+ * 
+ * Revision 4.0.1.2  91/06/07  11:07:23  lwall
+ * patch4: new copyright notice
+ * patch4: length($`), length($&), length($') now optimized to avoid string copy
+ * patch4: assignment wasn't correctly de-tainting the assigned variable.
+ * patch4: default top-of-form format is now FILEHANDLE_TOP
+ * patch4: added $^P variable to control calling of perldb routines
+ * patch4: taintchecks could improperly modify parent in vfork()
+ * patch4: many, many itty-bitty portability fixes
+ * 
+ * Revision 4.0.1.1  91/04/11  17:43:48  lwall
+ * patch1: fixed failed fork to return undef as documented
+ * patch1: reduced maximum branch distance in eval.c
+ * 
+ * Revision 4.0  91/03/20  01:16:48  lwall
+ * 4.0 baseline.
+ * 
+ */
+
+#include "EXTERN.h"
+#include "perl.h"
+
+extern int (*ppaddr[])();
+extern int mark[];
+
+#if !defined(NSIG) || defined(M_UNIX) || defined(M_XENIX)
+#include <signal.h>
+#endif
+
+#ifdef I_FCNTL
+#include <fcntl.h>
+#endif
+#ifdef MSDOS
+/* I_FCNTL *MUST* not be defined for MS-DOS and OS/2
+   but fcntl.h is required for O_BINARY */
+#include <fcntl.h>
+#endif
+#ifdef I_SYS_FILE
+#include <sys/file.h>
+#endif
+#ifdef I_VFORK
+#   include <vfork.h>
+#endif
+
+double sin(), cos(), atan2(), pow();
+
+char *getlogin();
+
+int
+eval(arg,gimme,sp)
+register ARG *arg;
+int gimme;
+register int sp;
+{
+    register STR *str;
+    register int anum;
+    register int optype;
+    register STR **st;
+    int maxarg;
+    double value;
+    register char *tmps;
+    char *tmps2;
+    int argflags;
+    int argtype;
+    union argptr argptr;
+    int arglast[8];    /* highest sp for arg--valid only for non-O_LIST args */
+    unsigned long tmpulong;
+    long tmplong;
+    time_t when;
+    STRLEN tmplen;
+    FILE *fp;
+    STR *tmpstr;
+    FCMD *form;
+    STAB *stab;
+    STAB *stab2;
+    STIO *stio;
+    ARRAY *ary;
+    int old_rslen;
+    int old_rschar;
+    VOIDRET (*ihand)();     /* place to save signal during system() */
+    VOIDRET (*qhand)();     /* place to save signal during system() */
+    bool assigning = FALSE;
+    int mymarkbase = savestack->ary_fill;
+
+    if (!arg)
+       goto say_undef;
+    optype = arg->arg_type;
+    maxarg = arg->arg_len;
+    arglast[0] = sp;
+    str = arg->arg_ptr.arg_str;
+    if (sp + maxarg > stack->ary_max)
+       astore(stack, sp + maxarg, Nullstr);
+    st = stack->ary_array;
+
+#ifdef DEBUGGING
+    if (debug) {
+       if (debug & 8) {
+           deb("%s (%lx) %d args:\n",opname[optype],arg,maxarg);
+       }
+       debname[dlevel] = opname[optype][0];
+       debdelim[dlevel] = ':';
+       if (++dlevel >= dlmax)
+           grow_dlevel();
+    }
+#endif
+
+    if (mark[optype]) {
+       saveint(&markbase);
+       markbase = mymarkbase;
+       saveint(&stack_mark);
+       stack_mark = sp;
+    }
+    for (anum = 1; anum <= maxarg; anum++) {
+       argflags = arg[anum].arg_flags;
+       argtype = arg[anum].arg_type;
+       argptr = arg[anum].arg_ptr;
+      re_eval:
+       switch (argtype) {
+       default:
+           if (!ppaddr[optype] || optype == O_SUBR || optype == O_DBSUBR) {
+               st[++sp] = &str_undef;
+           }
+#ifdef DEBUGGING
+           tmps = "NULL";
+#endif
+           break;
+       case A_EXPR:
+#ifdef DEBUGGING
+           if (debug & 8) {
+               tmps = "EXPR";
+               deb("%d.EXPR =>\n",anum);
+           }
+#endif
+           sp = eval(argptr.arg_arg,
+               (argflags & AF_ARYOK) ? G_ARRAY : G_SCALAR, sp);
+           if (sp + (maxarg - anum) > stack->ary_max)
+               astore(stack, sp + (maxarg - anum), Nullstr);
+           st = stack->ary_array;      /* possibly reallocated */
+           break;
+       case A_CMD:
+#ifdef DEBUGGING
+           if (debug & 8) {
+               tmps = "CMD";
+               deb("%d.CMD (%lx) =>\n",anum,argptr.arg_cmd);
+           }
+#endif
+           sp = cmd_exec(argptr.arg_cmd, gimme, sp);
+           if (sp + (maxarg - anum) > stack->ary_max)
+               astore(stack, sp + (maxarg - anum), Nullstr);
+           st = stack->ary_array;      /* possibly reallocated */
+           break;
+       case A_LARYSTAB:
+           ++sp;
+           switch (optype) {
+               case O_ITEM2: argtype = 2; break;
+               case O_ITEM3: argtype = 3; break;
+               default:      argtype = anum; break;
+           }
+           str = afetch(stab_array(argptr.arg_stab),
+               arg[argtype].arg_len - arybase, TRUE);
+#ifdef DEBUGGING
+           if (debug & 8) {
+               (void)sprintf(buf,"LARYSTAB $%s[%d]",stab_name(argptr.arg_stab),
+                   arg[argtype].arg_len);
+               tmps = buf;
+           }
+#endif
+           goto do_crement;
+       case A_ARYSTAB:
+           switch (optype) {
+               case O_ITEM2: argtype = 2; break;
+               case O_ITEM3: argtype = 3; break;
+               default:      argtype = anum; break;
+           }
+           st[++sp] = afetch(stab_array(argptr.arg_stab),
+               arg[argtype].arg_len - arybase, FALSE);
+#ifdef DEBUGGING
+           if (debug & 8) {
+               (void)sprintf(buf,"ARYSTAB $%s[%d]",stab_name(argptr.arg_stab),
+                   arg[argtype].arg_len);
+               tmps = buf;
+           }
+#endif
+           break;
+       case A_STAR:
+           stab = argptr.arg_stab;
+           st[++sp] = (STR*)stab;
+           if (!stab_xarray(stab))
+               aadd(stab);
+           if (!stab_xhash(stab))
+               hadd(stab);
+           if (!stab_io(stab))
+               stab_io(stab) = stio_new();
+#ifdef DEBUGGING
+           if (debug & 8) {
+               (void)sprintf(buf,"STAR *%s -> *%s",
+                   stab_name(argptr.arg_stab), stab_ename(argptr.arg_stab));
+               tmps = buf;
+           }
+#endif
+           break;
+       case A_LSTAR:
+           str = st[++sp] = (STR*)argptr.arg_stab;
+#ifdef DEBUGGING
+           if (debug & 8) {
+               (void)sprintf(buf,"LSTAR *%s -> *%s",
+               stab_name(argptr.arg_stab), stab_ename(argptr.arg_stab));
+               tmps = buf;
+           }
+#endif
+           break;
+       case A_STAB:
+           st[++sp] = STAB_STR(argptr.arg_stab);
+#ifdef DEBUGGING
+           if (debug & 8) {
+               (void)sprintf(buf,"STAB $%s",stab_name(argptr.arg_stab));
+               tmps = buf;
+           }
+#endif
+           break;
+       case A_LENSTAB:
+           str_numset(str, (double)STAB_LEN(argptr.arg_stab));
+           st[++sp] = str;
+#ifdef DEBUGGING
+           if (debug & 8) {
+               (void)sprintf(buf,"LENSTAB $%s",stab_name(argptr.arg_stab));
+               tmps = buf;
+           }
+#endif
+           break;
+       case A_LEXPR:
+#ifdef DEBUGGING
+           if (debug & 8) {
+               tmps = "LEXPR";
+               deb("%d.LEXPR =>\n",anum);
+           }
+#endif
+           if (argflags & AF_ARYOK) {
+               sp = eval(argptr.arg_arg, G_ARRAY, sp);
+               if (sp + (maxarg - anum) > stack->ary_max)
+                   astore(stack, sp + (maxarg - anum), Nullstr);
+               st = stack->ary_array;  /* possibly reallocated */
+           }
+           else {
+               sp = eval(argptr.arg_arg, G_SCALAR, sp);
+               st = stack->ary_array;  /* possibly reallocated */
+               str = st[sp];
+               goto do_crement;
+           }
+           break;
+       case A_LVAL:
+#ifdef DEBUGGING
+           if (debug & 8) {
+               (void)sprintf(buf,"LVAL $%s",stab_name(argptr.arg_stab));
+               tmps = buf;
+           }
+#endif
+           ++sp;
+           str = STAB_STR(argptr.arg_stab);
+           if (!str)
+               fatal("panic: A_LVAL");
+         do_crement:
+           assigning = TRUE;
+           if (argflags & AF_PRE) {
+               if (argflags & AF_UP)
+                   str_inc(str);
+               else
+                   str_dec(str);
+               STABSET(str);
+               st[sp] = str;
+               str = arg->arg_ptr.arg_str;
+           }
+           else if (argflags & AF_POST) {
+               st[sp] = str_mortal(str);
+               if (argflags & AF_UP)
+                   str_inc(str);
+               else
+                   str_dec(str);
+               STABSET(str);
+               str = arg->arg_ptr.arg_str;
+           }
+           else
+               st[sp] = str;
+           break;
+       case A_LARYLEN:
+           ++sp;
+           stab = argptr.arg_stab;
+           str = stab_array(argptr.arg_stab)->ary_magic;
+           if (optype != O_SASSIGN || argflags & (AF_PRE|AF_POST))
+               str_numset(str,(double)(stab_array(stab)->ary_fill+arybase));
+#ifdef DEBUGGING
+           tmps = "LARYLEN";
+#endif
+           if (!str)
+               fatal("panic: A_LEXPR");
+           goto do_crement;
+       case A_ARYLEN:
+           stab = argptr.arg_stab;
+           st[++sp] = stab_array(stab)->ary_magic;
+           str_numset(st[sp],(double)(stab_array(stab)->ary_fill+arybase));
+#ifdef DEBUGGING
+           tmps = "ARYLEN";
+#endif
+           break;
+       case A_SINGLE:
+           st[++sp] = argptr.arg_str;
+#ifdef DEBUGGING
+           tmps = "SINGLE";
+#endif
+           break;
+       case A_DOUBLE:
+           (void) interp(str,argptr.arg_str,sp);
+           st = stack->ary_array;
+           st[++sp] = str;
+#ifdef DEBUGGING
+           tmps = "DOUBLE";
+#endif
+           break;
+       case A_BACKTICK:
+           tmps = str_get(interp(str,argptr.arg_str,sp));
+           st = stack->ary_array;
+#ifdef TAINT
+           TAINT_PROPER("``");
+#endif
+           fp = mypopen(tmps,"r");
+           str_set(str,"");
+           if (fp) {
+               if (gimme == G_SCALAR) {
+                   while (str_gets(str,fp,str->str_cur) != Nullch)
+                       /*SUPPRESS 530*/
+                       ;
+               }
+               else {
+                   for (;;) {
+                       if (++sp > stack->ary_max) {
+                           astore(stack, sp, Nullstr);
+                           st = stack->ary_array;
+                       }
+                       str = st[sp] = Str_new(56,80);
+                       if (str_gets(str,fp,0) == Nullch) {
+                           sp--;
+                           break;
+                       }
+                       if (str->str_len - str->str_cur > 20) {
+                           str->str_len = str->str_cur+1;
+                           Renew(str->str_ptr, str->str_len, char);
+                       }
+                       str_2mortal(str);
+                   }
+               }
+               statusvalue = mypclose(fp);
+           }
+           else
+               statusvalue = -1;
+
+           if (gimme == G_SCALAR)
+               st[++sp] = str;
+#ifdef DEBUGGING
+           tmps = "BACK";
+#endif
+           break;
+       case A_WANTARRAY:
+           {
+               if (curcsv->wantarray == G_ARRAY)
+                   st[++sp] = &str_yes;
+               else
+                   st[++sp] = &str_no;
+           }
+#ifdef DEBUGGING
+           tmps = "WANTARRAY";
+#endif
+           break;
+       case A_INDREAD:
+           last_in_stab = stabent(str_get(STAB_STR(argptr.arg_stab)),TRUE);
+           old_rschar = rschar;
+           old_rslen = rslen;
+           goto do_read;
+       case A_GLOB:
+           argflags |= AF_POST;        /* enable newline chopping */
+           last_in_stab = argptr.arg_stab;
+           old_rschar = rschar;
+           old_rslen = rslen;
+           rslen = 1;
+#ifdef DOSISH
+           rschar = 0;
+#else
+#ifdef CSH
+           rschar = 0;
+#else
+           rschar = '\n';
+#endif /* !CSH */
+#endif /* !MSDOS */
+           goto do_read;
+       case A_READ:
+           last_in_stab = argptr.arg_stab;
+           old_rschar = rschar;
+           old_rslen = rslen;
+         do_read:
+           if (anum > 1)               /* assign to scalar */
+               gimme = G_SCALAR;       /* force context to scalar */
+           if (gimme == G_ARRAY)
+               str = Str_new(57,0);
+           ++sp;
+           fp = Nullfp;
+           if (stab_io(last_in_stab)) {
+               fp = stab_io(last_in_stab)->ifp;
+               if (!fp) {
+                   if (stab_io(last_in_stab)->flags & IOF_ARGV) {
+                       if (stab_io(last_in_stab)->flags & IOF_START) {
+                           stab_io(last_in_stab)->flags &= ~IOF_START;
+                           stab_io(last_in_stab)->lines = 0;
+                           if (alen(stab_array(last_in_stab)) < 0) {
+                               tmpstr = str_make("-",1); /* assume stdin */
+                               (void)apush(stab_array(last_in_stab), tmpstr);
+                           }
+                       }
+                       fp = nextargv(last_in_stab);
+                       if (!fp) { /* Note: fp != stab_io(last_in_stab)->ifp */
+                           (void)do_close(last_in_stab,FALSE); /* now it does*/
+                           stab_io(last_in_stab)->flags |= IOF_START;
+                       }
+                   }
+                   else if (argtype == A_GLOB) {
+                       (void) interp(str,stab_val(last_in_stab),sp);
+                       st = stack->ary_array;
+                       tmpstr = Str_new(55,0);
+#ifdef DOSISH
+                       str_set(tmpstr, "perlglob ");
+                       str_scat(tmpstr,str);
+                       str_cat(tmpstr," |");
+#else
+#ifdef CSH
+                       str_nset(tmpstr,cshname,cshlen);
+                       str_cat(tmpstr," -cf 'set nonomatch; glob ");
+                       str_scat(tmpstr,str);
+                       str_cat(tmpstr,"'|");
+#else
+                       str_set(tmpstr, "echo ");
+                       str_scat(tmpstr,str);
+                       str_cat(tmpstr,
+                         "|tr -s ' \t\f\r' '\\012\\012\\012\\012'|");
+#endif /* !CSH */
+#endif /* !MSDOS */
+                       (void)do_open(last_in_stab,tmpstr->str_ptr,
+                         tmpstr->str_cur);
+                       fp = stab_io(last_in_stab)->ifp;
+                       str_free(tmpstr);
+                   }
+               }
+           }
+           if (!fp && dowarn)
+               warn("Read on closed filehandle <%s>",stab_ename(last_in_stab));
+           tmplen = str->str_len;      /* remember if already alloced */
+           if (!tmplen)
+               Str_Grow(str,80);       /* try short-buffering it */
+         keepgoing:
+           if (!fp)
+               st[sp] = &str_undef;
+           else if (!str_gets(str,fp, optype == O_RCAT ? str->str_cur : 0)) {
+               clearerr(fp);
+               if (stab_io(last_in_stab)->flags & IOF_ARGV) {
+                   fp = nextargv(last_in_stab);
+                   if (fp)
+                       goto keepgoing;
+                   (void)do_close(last_in_stab,FALSE);
+                   stab_io(last_in_stab)->flags |= IOF_START;
+               }
+               else if (argflags & AF_POST) {
+                   (void)do_close(last_in_stab,FALSE);
+               }
+               st[sp] = &str_undef;
+               rschar = old_rschar;
+               rslen = old_rslen;
+               if (gimme == G_ARRAY) {
+                   --sp;
+                   str_2mortal(str);
+                   goto array_return;
+               }
+               break;
+           }
+           else {
+               stab_io(last_in_stab)->lines++;
+               st[sp] = str;
+#ifdef TAINT
+               str->str_tainted = 1; /* Anything from the outside world...*/
+#endif
+               if (argflags & AF_POST) {
+                   if (str->str_cur > 0)
+                       str->str_cur--;
+                   if (str->str_ptr[str->str_cur] == rschar)
+                       str->str_ptr[str->str_cur] = '\0';
+                   else
+                       str->str_cur++;
+                   for (tmps = str->str_ptr; *tmps; tmps++)
+                       if (!isALPHA(*tmps) && !isDIGIT(*tmps) &&
+                           index("$&*(){}[]'\";\\|?<>~`",*tmps))
+                               break;
+                   if (*tmps && stat(str->str_ptr,&statbuf) < 0)
+                       goto keepgoing;         /* unmatched wildcard? */
+               }
+               if (gimme == G_ARRAY) {
+                   if (str->str_len - str->str_cur > 20) {
+                       str->str_len = str->str_cur+1;
+                       Renew(str->str_ptr, str->str_len, char);
+                   }
+                   str_2mortal(str);
+                   if (++sp > stack->ary_max) {
+                       astore(stack, sp, Nullstr);
+                       st = stack->ary_array;
+                   }
+                   str = Str_new(58,80);
+                   goto keepgoing;
+               }
+               else if (!tmplen && str->str_len - str->str_cur > 80) {
+                   /* try to reclaim a bit of scalar space on 1st alloc */
+                   if (str->str_cur < 60)
+                       str->str_len = 80;
+                   else
+                       str->str_len = str->str_cur+40; /* allow some slop */
+                   Renew(str->str_ptr, str->str_len, char);
+               }
+           }
+           rschar = old_rschar;
+           rslen = old_rslen;
+#ifdef DEBUGGING
+           tmps = "READ";
+#endif
+           break;
+       }
+#ifdef DEBUGGING
+       if (debug & 8) {
+           if (strEQ(tmps, "NULL"))
+               deb("%d.%s\n",anum,tmps);
+           else
+               deb("%d.%s = '%s'\n",anum,tmps,str_peek(st[sp]));
+       }
+#endif
+       if (anum < 8)
+           arglast[anum] = sp;
+    }
+
+    if (ppaddr[optype]) {
+       int status;
+
+       /* pretend like we've been maintaining stack_* all along */
+       stack_ary = stack->ary_array;
+       stack_sp = stack_ary + sp;
+       if (mark[optype] && stack_mark != arglast[0])
+           warn("Inconsistent stack mark %d != %d", stack_mark, arglast[0]);
+       stack_max = stack_ary + stack->ary_max;
+
+       status = (*ppaddr[optype])(str, arg, gimme);
+
+       if (savestack->ary_fill > mymarkbase) {
+           warn("Inconsistent stack base");
+           restorelist(mymarkbase);
+       }
+       sp = stack_sp - stack_ary;
+       if (sp < arglast[0])
+           warn("TOO MANY POPS");
+       st += arglast[0];
+       goto array_return;
+    }
+
+    st += arglast[0];
+
+#ifdef SMALLSWITCHES
+    if (optype < O_CHOWN)
+#endif
+    switch (optype) {
+    case O_RCAT:
+       STABSET(str);
+       break;
+    case O_ITEM:
+       if (gimme == G_ARRAY)
+           goto array_return;
+       /* FALL THROUGH */
+    case O_SCALAR:
+       STR_SSET(str,st[1]);
+       STABSET(str);
+       break;
+    case O_ITEM2:
+       if (gimme == G_ARRAY)
+           goto array_return;
+       --anum;
+       STR_SSET(str,st[arglast[anum]-arglast[0]]);
+       STABSET(str);
+       break;
+    case O_ITEM3:
+       if (gimme == G_ARRAY)
+       goto array_return;
+       --anum;
+       STR_SSET(str,st[arglast[anum]-arglast[0]]);
+       STABSET(str);
+       break;
+    case O_CONCAT:
+       STR_SSET(str,st[1]);
+       str_scat(str,st[2]);
+       STABSET(str);
+       break;
+    case O_REPEAT:
+       if (gimme == G_ARRAY && arg[1].arg_flags & AF_ARYOK) {
+           sp = do_repeatary(arglast);
+           goto array_return;
+       }
+       STR_SSET(str,st[1]);
+       anum = (int)str_gnum(st[2]);
+       if (anum >= 1) {
+           tmpstr = Str_new(50, 0);
+           tmps = str_get(str);
+           str_nset(tmpstr,tmps,str->str_cur);
+           tmps = str_get(tmpstr);     /* force to be string */
+           STR_GROW(str, (anum * str->str_cur) + 1);
+           repeatcpy(str->str_ptr, tmps, tmpstr->str_cur, anum);
+           str->str_cur *= anum;
+           str->str_ptr[str->str_cur] = '\0';
+           str->str_nok = 0;
+           str_free(tmpstr);
+       }
+       else {
+           if (dowarn && st[2]->str_pok && !looks_like_number(st[2]))
+               warn("Right operand of x is not numeric");
+           str_sset(str,&str_no);
+       }
+       STABSET(str);
+       break;
+    case O_MATCH:
+       sp = do_match(str,arg,
+         gimme,arglast);
+       if (gimme == G_ARRAY)
+           goto array_return;
+       STABSET(str);
+       break;
+    case O_NMATCH:
+       sp = do_match(str,arg,
+         G_SCALAR,arglast);
+       str_sset(str, str_true(str) ? &str_no : &str_yes);
+       STABSET(str);
+       break;
+    case O_SUBST:
+       sp = do_subst(str,arg,arglast[0]);
+       goto array_return;
+    case O_NSUBST:
+       sp = do_subst(str,arg,arglast[0]);
+       str = arg->arg_ptr.arg_str;
+       str_set(str, str_true(str) ? No : Yes);
+       goto array_return;
+    case O_ASSIGN:
+       if (arg[1].arg_flags & AF_ARYOK) {
+           if (arg->arg_len == 1) {
+               arg->arg_type = O_LOCAL;
+               goto local;
+           }
+           else {
+               arg->arg_type = O_AASSIGN;
+               goto aassign;
+           }
+       }
+       else {
+           arg->arg_type = O_SASSIGN;
+           goto sassign;
+       }
+    case O_LOCAL:
+      local:
+       arglast[2] = arglast[1];        /* push a null array */
+       /* FALL THROUGH */
+    case O_AASSIGN:
+      aassign:
+       sp = do_assign(arg,
+         gimme,arglast);
+       goto array_return;
+    case O_SASSIGN:
+      sassign:
+#ifdef TAINT
+       if (tainted && !st[2]->str_tainted)
+           tainted = 0;
+#endif
+       STR_SSET(str, st[2]);
+       STABSET(str);
+       break;
+    case O_CHOP:
+       st -= arglast[0];
+       str = arg->arg_ptr.arg_str;
+       for (sp = arglast[0] + 1; sp <= arglast[1]; sp++)
+           do_chop(str,st[sp]);
+       st += arglast[0];
+       break;
+    case O_DEFINED:
+       if (arg[1].arg_type & A_DONT) {
+           sp = do_defined(str,arg,
+                 gimme,arglast);
+           goto array_return;
+       }
+       else if (str->str_pok || str->str_nok)
+           goto say_yes;
+       goto say_no;
+    case O_UNDEF:
+       if (arg[1].arg_type & A_DONT) {
+           sp = do_undef(str,arg,
+             gimme,arglast);
+           goto array_return;
+       }
+       else if (str != stab_val(defstab)) {
+           if (str->str_len) {
+               if (str->str_state == SS_INCR)
+                   Str_Grow(str,0);
+               Safefree(str->str_ptr);
+               str->str_ptr = Nullch;
+               str->str_len = 0;
+           }
+           str->str_pok = str->str_nok = 0;
+           STABSET(str);
+       }
+       goto say_undef;
+    case O_STUDY:
+       sp = do_study(str,arg,
+         gimme,arglast);
+       goto array_return;
+    case O_POW:
+       value = str_gnum(st[1]);
+       value = pow(value,str_gnum(st[2]));
+       goto donumset;
+    case O_MULTIPLY:
+       value = str_gnum(st[1]);
+       value *= str_gnum(st[2]);
+       goto donumset;
+    case O_DIVIDE:
+       if ((value = str_gnum(st[2])) == 0.0)
+           fatal("Illegal division by zero");
+#ifdef SLOPPYDIVIDE
+       /* insure that 20./5. == 4. */
+       {
+           double x;
+           int    k;
+           x =  str_gnum(st[1]);
+           if ((double)(int)x     == x &&
+               (double)(int)value == value &&
+               (k = (int)x/(int)value)*(int)value == (int)x) {
+               value = k;
+           } else {
+               value = x/value;
+           }
+       }
+#else
+       value = str_gnum(st[1]) / value;
+#endif
+       goto donumset;
+    case O_MODULO:
+       tmpulong = (unsigned long) str_gnum(st[2]);
+       if (tmpulong == 0L)
+           fatal("Illegal modulus zero");
+#ifndef lint
+       value = str_gnum(st[1]);
+       if (value >= 0.0)
+           value = (double)(((unsigned long)value) % tmpulong);
+       else {
+           tmplong = (long)value;
+           value = (double)(tmpulong - ((-tmplong - 1) % tmpulong)) - 1;
+       }
+#endif
+       goto donumset;
+    case O_ADD:
+       value = str_gnum(st[1]);
+       value += str_gnum(st[2]);
+       goto donumset;
+    case O_SUBTRACT:
+       value = str_gnum(st[1]);
+       value -= str_gnum(st[2]);
+       goto donumset;
+    case O_LEFT_SHIFT:
+       value = str_gnum(st[1]);
+       anum = (int)str_gnum(st[2]);
+#ifndef lint
+       value = (double)(U_L(value) << anum);
+#endif
+       goto donumset;
+    case O_RIGHT_SHIFT:
+       value = str_gnum(st[1]);
+       anum = (int)str_gnum(st[2]);
+#ifndef lint
+       value = (double)(U_L(value) >> anum);
+#endif
+       goto donumset;
+    case O_LT:
+       value = str_gnum(st[1]);
+       value = (value < str_gnum(st[2])) ? 1.0 : 0.0;
+       goto donumset;
+    case O_GT:
+       value = str_gnum(st[1]);
+       value = (value > str_gnum(st[2])) ? 1.0 : 0.0;
+       goto donumset;
+    case O_LE:
+       value = str_gnum(st[1]);
+       value = (value <= str_gnum(st[2])) ? 1.0 : 0.0;
+       goto donumset;
+    case O_GE:
+       value = str_gnum(st[1]);
+       value = (value >= str_gnum(st[2])) ? 1.0 : 0.0;
+       goto donumset;
+    case O_EQ:
+       if (dowarn) {
+           if ((!st[1]->str_nok && !looks_like_number(st[1])) ||
+               (!st[2]->str_nok && !looks_like_number(st[2])) )
+               warn("Possible use of == on string value");
+       }
+       value = str_gnum(st[1]);
+       value = (value == str_gnum(st[2])) ? 1.0 : 0.0;
+       goto donumset;
+    case O_NE:
+       value = str_gnum(st[1]);
+       value = (value != str_gnum(st[2])) ? 1.0 : 0.0;
+       goto donumset;
+    case O_NCMP:
+       value = str_gnum(st[1]);
+       value -= str_gnum(st[2]);
+       if (value > 0.0)
+           value = 1.0;
+       else if (value < 0.0)
+           value = -1.0;
+       goto donumset;
+    case O_BIT_AND:
+       if (!sawvec || st[1]->str_nok || st[2]->str_nok) {
+           value = str_gnum(st[1]);
+#ifndef lint
+           value = (double)(U_L(value) & U_L(str_gnum(st[2])));
+#endif
+           goto donumset;
+       }
+       else
+           do_vop(optype,str,st[1],st[2]);
+       break;
+    case O_XOR:
+       if (!sawvec || st[1]->str_nok || st[2]->str_nok) {
+           value = str_gnum(st[1]);
+#ifndef lint
+           value = (double)(U_L(value) ^ U_L(str_gnum(st[2])));
+#endif
+           goto donumset;
+       }
+       else
+           do_vop(optype,str,st[1],st[2]);
+       break;
+    case O_BIT_OR:
+       if (!sawvec || st[1]->str_nok || st[2]->str_nok) {
+           value = str_gnum(st[1]);
+#ifndef lint
+           value = (double)(U_L(value) | U_L(str_gnum(st[2])));
+#endif
+           goto donumset;
+       }
+       else
+           do_vop(optype,str,st[1],st[2]);
+       break;
+/* use register in evaluating str_true() */
+    case O_AND:
+       if (str_true(st[1])) {
+           anum = 2;
+           optype = O_ITEM2;
+           argflags = arg[anum].arg_flags;
+           if (gimme == G_ARRAY)
+               argflags |= AF_ARYOK;
+           argtype = arg[anum].arg_type & A_MASK;
+           argptr = arg[anum].arg_ptr;
+           maxarg = anum = 1;
+           sp = arglast[0];
+           st -= sp;
+           goto re_eval;
+       }
+       else {
+           if (assigning) {
+               str_sset(str, st[1]);
+               STABSET(str);
+           }
+           else
+               str = st[1];
+           break;
+       }
+    case O_OR:
+       if (str_true(st[1])) {
+           if (assigning) {
+               str_sset(str, st[1]);
+               STABSET(str);
+           }
+           else
+               str = st[1];
+           break;
+       }
+       else {
+           anum = 2;
+           optype = O_ITEM2;
+           argflags = arg[anum].arg_flags;
+           if (gimme == G_ARRAY)
+               argflags |= AF_ARYOK;
+           argtype = arg[anum].arg_type & A_MASK;
+           argptr = arg[anum].arg_ptr;
+           maxarg = anum = 1;
+           sp = arglast[0];
+           st -= sp;
+           goto re_eval;
+       }
+    case O_COND_EXPR:
+       anum = (str_true(st[1]) ? 2 : 3);
+       optype = (anum == 2 ? O_ITEM2 : O_ITEM3);
+       argflags = arg[anum].arg_flags;
+       if (gimme == G_ARRAY)
+           argflags |= AF_ARYOK;
+       argtype = arg[anum].arg_type & A_MASK;
+       argptr = arg[anum].arg_ptr;
+       maxarg = anum = 1;
+       sp = arglast[0];
+       st -= sp;
+       goto re_eval;
+    case O_COMMA:
+       if (gimme == G_ARRAY)
+           goto array_return;
+       str = st[2];
+       break;
+    case O_NEGATE:
+       value = -str_gnum(st[1]);
+       goto donumset;
+    case O_NOT:
+#ifdef NOTNOT
+       { char xxx = str_true(st[1]); value = (double) !xxx; }
+#else
+       value = (double) !str_true(st[1]);
+#endif
+       goto donumset;
+    case O_COMPLEMENT:
+       if (!sawvec || st[1]->str_nok) {
+#ifndef lint
+           value = (double) ~U_L(str_gnum(st[1]));
+#endif
+           goto donumset;
+       }
+       else {
+           STR_SSET(str,st[1]);
+           tmps = str_get(str);
+           for (anum = str->str_cur; anum; anum--, tmps++)
+               *tmps = ~*tmps;
+       }
+       break;
+    case O_SELECT:
+       stab_efullname(str,defoutstab);
+       if (maxarg > 0) {
+           if ((arg[1].arg_type & A_MASK) == A_WORD)
+               defoutstab = arg[1].arg_ptr.arg_stab;
+           else
+               defoutstab = stabent(str_get(st[1]),TRUE);
+           if (!stab_io(defoutstab))
+               stab_io(defoutstab) = stio_new();
+           curoutstab = defoutstab;
+       }
+       STABSET(str);
+       break;
+    case O_WRITE:
+       if (maxarg == 0)
+           stab = defoutstab;
+       else if ((arg[1].arg_type & A_MASK) == A_WORD) {
+           if (!(stab = arg[1].arg_ptr.arg_stab))
+               stab = defoutstab;
+       }
+       else
+           stab = stabent(str_get(st[1]),TRUE);
+       if (!stab_io(stab)) {
+           str_set(str, No);
+           STABSET(str);
+           break;
+       }
+       curoutstab = stab;
+       fp = stab_io(stab)->ofp;
+       if (stab_io(stab)->fmt_stab)
+           form = stab_form(stab_io(stab)->fmt_stab);
+       else
+           form = stab_form(stab);
+       if (!form || !fp) {
+           if (dowarn) {
+               if (form)
+                   warn("No format for filehandle");
+               else {
+                   if (stab_io(stab)->ifp)
+                       warn("Filehandle only opened for input");
+                   else
+                       warn("Write on closed filehandle");
+               }
+           }
+           str_set(str, No);
+           STABSET(str);
+           break;
+       }
+       format(&outrec,form,sp);
+       do_write(&outrec,stab,sp);
+       if (stab_io(stab)->flags & IOF_FLUSH)
+           (void)fflush(fp);
+       str_set(str, Yes);
+       STABSET(str);
+       break;
+    case O_DBMOPEN:
+#ifdef SOME_DBM
+       anum = arg[1].arg_type & A_MASK;
+       if (anum == A_WORD || anum == A_STAB)
+           stab = arg[1].arg_ptr.arg_stab;
+       else
+           stab = stabent(str_get(st[1]),TRUE);
+       if (st[3]->str_nok || st[3]->str_pok)
+           anum = (int)str_gnum(st[3]);
+       else
+           anum = -1;
+       value = (double)hdbmopen(stab_hash(stab),str_get(st[2]),anum);
+       goto donumset;
+#else
+       fatal("No dbm or ndbm on this machine");
+#endif
+    case O_DBMCLOSE:
+#ifdef SOME_DBM
+       anum = arg[1].arg_type & A_MASK;
+       if (anum == A_WORD || anum == A_STAB)
+           stab = arg[1].arg_ptr.arg_stab;
+       else
+           stab = stabent(str_get(st[1]),TRUE);
+       hdbmclose(stab_hash(stab));
+       goto say_yes;
+#else
+       fatal("No dbm or ndbm on this machine");
+#endif
+    case O_OPEN:
+       if ((arg[1].arg_type & A_MASK) == A_WORD)
+           stab = arg[1].arg_ptr.arg_stab;
+       else
+           stab = stabent(str_get(st[1]),TRUE);
+       tmps = str_get(st[2]);
+       if (do_open(stab,tmps,st[2]->str_cur)) {
+           value = (double)forkprocess;
+           stab_io(stab)->lines = 0;
+           goto donumset;
+       }
+       else if (forkprocess == 0)              /* we are a new child */
+           goto say_zero;
+       else
+           goto say_undef;
+       /* break; */
+    case O_TRANS:
+       value = (double) do_trans(str,arg);
+       str = arg->arg_ptr.arg_str;
+       goto donumset;
+    case O_NTRANS:
+       str_set(arg->arg_ptr.arg_str, do_trans(str,arg) == 0 ? Yes : No);
+       str = arg->arg_ptr.arg_str;
+       break;
+    case O_CLOSE:
+       if (maxarg == 0)
+           stab = defoutstab;
+       else if ((arg[1].arg_type & A_MASK) == A_WORD)
+           stab = arg[1].arg_ptr.arg_stab;
+       else
+           stab = stabent(str_get(st[1]),TRUE);
+       str_set(str, do_close(stab,TRUE) ? Yes : No );
+       STABSET(str);
+       break;
+    case O_EACH:
+       sp = do_each(str,stab_hash(arg[1].arg_ptr.arg_stab),
+         gimme,arglast);
+       goto array_return;
+    case O_VALUES:
+    case O_KEYS:
+       sp = do_kv(str,stab_hash(arg[1].arg_ptr.arg_stab), optype,
+         gimme,arglast);
+       goto array_return;
+    case O_LARRAY:
+       str->str_nok = str->str_pok = 0;
+       str->str_u.str_stab = arg[1].arg_ptr.arg_stab;
+       str->str_state = SS_ARY;
+       break;
+    case O_ARRAY:
+       ary = stab_array(arg[1].arg_ptr.arg_stab);
+       maxarg = ary->ary_fill + 1;
+       if (gimme == G_ARRAY) { /* array wanted */
+           sp = arglast[0];
+           st -= sp;
+           if (maxarg > 0 && sp + maxarg > stack->ary_max) {
+               astore(stack,sp + maxarg, Nullstr);
+               st = stack->ary_array;
+           }
+           st += sp;
+           Copy(ary->ary_array, &st[1], maxarg, STR*);
+           sp += maxarg;
+           goto array_return;
+       }
+       else {
+           value = (double)maxarg;
+           goto donumset;
+       }
+    case O_AELEM:
+       anum = ((int)str_gnum(st[2])) - arybase;
+       str = afetch(stab_array(arg[1].arg_ptr.arg_stab),anum,FALSE);
+       break;
+    case O_DELETE:
+       tmpstab = arg[1].arg_ptr.arg_stab;
+       tmps = str_get(st[2]);
+       str = hdelete(stab_hash(tmpstab),tmps,st[2]->str_cur);
+       if (tmpstab == envstab)
+           my_setenv(tmps,Nullch);
+       if (!str)
+           goto say_undef;
+       break;
+    case O_LHASH:
+       str->str_nok = str->str_pok = 0;
+       str->str_u.str_stab = arg[1].arg_ptr.arg_stab;
+       str->str_state = SS_HASH;
+       break;
+    case O_HASH:
+       if (gimme == G_ARRAY) { /* array wanted */
+           sp = do_kv(str,stab_hash(arg[1].arg_ptr.arg_stab), optype,
+               gimme,arglast);
+           goto array_return;
+       }
+       else {
+           tmpstab = arg[1].arg_ptr.arg_stab;
+           if (!stab_hash(tmpstab)->tbl_fill)
+               goto say_zero;
+           sprintf(buf,"%d/%d",stab_hash(tmpstab)->tbl_fill,
+               stab_hash(tmpstab)->tbl_max+1);
+           str_set(str,buf);
+       }
+       break;
+    case O_HELEM:
+       tmpstab = arg[1].arg_ptr.arg_stab;
+       tmps = str_get(st[2]);
+       str = hfetch(stab_hash(tmpstab),tmps,st[2]->str_cur,FALSE);
+       break;
+    case O_LAELEM:
+       anum = ((int)str_gnum(st[2])) - arybase;
+       str = afetch(stab_array(arg[1].arg_ptr.arg_stab),anum,TRUE);
+       if (!str || str == &str_undef)
+           fatal("Assignment to non-creatable value, subscript %d",anum);
+       break;
+    case O_LHELEM:
+       tmpstab = arg[1].arg_ptr.arg_stab;
+       tmps = str_get(st[2]);
+       anum = st[2]->str_cur;
+       str = hfetch(stab_hash(tmpstab),tmps,anum,TRUE);
+       if (!str || str == &str_undef)
+           fatal("Assignment to non-creatable value, subscript \"%s\"",tmps);
+       if (tmpstab == envstab)         /* heavy wizardry going on here */
+           str_magic(str, tmpstab, 'E', tmps, anum);   /* str is now magic */
+                                       /* he threw the brick up into the air */
+       else if (tmpstab == sigstab)
+           str_magic(str, tmpstab, 'S', tmps, anum);
+#ifdef SOME_DBM
+       else if (stab_hash(tmpstab)->tbl_dbm)
+           str_magic(str, tmpstab, 'D', tmps, anum);
+#endif
+       else if (tmpstab == DBline)
+           str_magic(str, tmpstab, 'L', tmps, anum);
+       break;
+    case O_LSLICE:
+       anum = 2;
+       argtype = FALSE;
+       goto do_slice_already;
+    case O_ASLICE:
+       anum = 1;
+       argtype = FALSE;
+       goto do_slice_already;
+    case O_HSLICE:
+       anum = 0;
+       argtype = FALSE;
+       goto do_slice_already;
+    case O_LASLICE:
+       anum = 1;
+       argtype = TRUE;
+       goto do_slice_already;
+    case O_LHSLICE:
+       anum = 0;
+       argtype = TRUE;
+      do_slice_already:
+       sp = do_slice(arg[1].arg_ptr.arg_stab,str,anum,argtype,
+           gimme,arglast);
+       goto array_return;
+    case O_SPLICE:
+       sp = do_splice(stab_array(arg[1].arg_ptr.arg_stab),gimme,arglast);
+       goto array_return;
+    case O_PUSH:
+       if (arglast[2] - arglast[1] != 1)
+           str = do_push(stab_array(arg[1].arg_ptr.arg_stab),arglast);
+       else {
+           str = Str_new(51,0);                /* must copy the STR */
+           str_sset(str,st[2]);
+           (void)apush(stab_array(arg[1].arg_ptr.arg_stab),str);
+       }
+       break;
+    case O_POP:
+       str = apop(ary = stab_array(arg[1].arg_ptr.arg_stab));
+       goto staticalization;
+    case O_SHIFT:
+       str = ashift(ary = stab_array(arg[1].arg_ptr.arg_stab));
+      staticalization:
+       if (!str)
+           goto say_undef;
+       if (ary->ary_flags & ARF_REAL)
+           (void)str_2mortal(str);
+       break;
+    case O_UNPACK:
+       sp = do_unpack(str,gimme,arglast);
+       goto array_return;
+    case O_SPLIT:
+       value = str_gnum(st[3]);
+       sp = do_split(str, arg[2].arg_ptr.arg_spat, (int)value,
+         gimme,arglast);
+       goto array_return;
+    case O_LENGTH:
+       if (maxarg < 1)
+           value = (double)str_len(stab_val(defstab));
+       else
+           value = (double)str_len(st[1]);
+       goto donumset;
+    case O_SPRINTF:
+       do_sprintf(str, sp-arglast[0], st+1);
+       break;
+    case O_SUBSTR:
+       anum = ((int)str_gnum(st[2])) - arybase;        /* anum=where to start*/
+       tmps = str_get(st[1]);          /* force conversion to string */
+       /*SUPPRESS 560*/
+       if (argtype = (str == st[1]))
+           str = arg->arg_ptr.arg_str;
+       if (anum < 0)
+           anum += st[1]->str_cur + arybase;
+       if (anum < 0 || anum > st[1]->str_cur)
+           str_nset(str,"",0);
+       else {
+           optype = maxarg < 3 ? st[1]->str_cur : (int)str_gnum(st[3]);
+           if (optype < 0)
+               optype = 0;
+           tmps += anum;
+           anum = st[1]->str_cur - anum;       /* anum=how many bytes left*/
+           if (anum > optype)
+               anum = optype;
+           str_nset(str, tmps, anum);
+           if (argtype) {                      /* it's an lvalue! */
+               Lstring *lstr = (Lstring*)str;
+
+               str->str_magic = st[1];
+               st[1]->str_rare = 's';
+               lstr->lstr_offset = tmps - str_get(st[1]); 
+               lstr->lstr_len = anum; 
+           }
+       }
+       break;
+    case O_PACK:
+       /*SUPPRESS 701*/
+       (void)do_pack(str,arglast);
+       break;
+    case O_GREP:
+       sp = do_grep(arg,str,gimme,arglast);
+       goto array_return;
+    case O_JOIN:
+       do_join(str,arglast);
+       break;
+    case O_SLT:
+       tmps = str_get(st[1]);
+       value = (double) (str_cmp(st[1],st[2]) < 0);
+       goto donumset;
+    case O_SGT:
+       tmps = str_get(st[1]);
+       value = (double) (str_cmp(st[1],st[2]) > 0);
+       goto donumset;
+    case O_SLE:
+       tmps = str_get(st[1]);
+       value = (double) (str_cmp(st[1],st[2]) <= 0);
+       goto donumset;
+    case O_SGE:
+       tmps = str_get(st[1]);
+       value = (double) (str_cmp(st[1],st[2]) >= 0);
+       goto donumset;
+    case O_SEQ:
+       tmps = str_get(st[1]);
+       value = (double) str_eq(st[1],st[2]);
+       goto donumset;
+    case O_SNE:
+       tmps = str_get(st[1]);
+       value = (double) !str_eq(st[1],st[2]);
+       goto donumset;
+    case O_SCMP:
+       tmps = str_get(st[1]);
+       value = (double) str_cmp(st[1],st[2]);
+       goto donumset;
+    case O_SUBR:
+       sp = do_subr(arg,gimme,arglast);
+       st = stack->ary_array + arglast[0];             /* maybe realloced */
+       goto array_return;
+    case O_DBSUBR:
+       sp = do_subr(arg,gimme,arglast);
+       st = stack->ary_array + arglast[0];             /* maybe realloced */
+       goto array_return;
+    case O_CALLER:
+       sp = do_caller(arg,maxarg,gimme,arglast);
+       st = stack->ary_array + arglast[0];             /* maybe realloced */
+       goto array_return;
+    case O_SORT:
+       sp = do_sort(str,arg,
+         gimme,arglast);
+       goto array_return;
+    case O_REVERSE:
+       if (gimme == G_ARRAY)
+           sp = do_reverse(arglast);
+       else
+           sp = do_sreverse(str, arglast);
+       goto array_return;
+    case O_WARN:
+       if (arglast[2] - arglast[1] != 1) {
+           do_join(str,arglast);
+           tmps = str_get(str);
+       }
+       else {
+           str = st[2];
+           tmps = str_get(st[2]);
+       }
+       if (!tmps || !*tmps)
+           tmps = "Warning: something's wrong";
+       warn("%s",tmps);
+       goto say_yes;
+    case O_DIE:
+       if (arglast[2] - arglast[1] != 1) {
+           do_join(str,arglast);
+           tmps = str_get(str);
+       }
+       else {
+           str = st[2];
+           tmps = str_get(st[2]);
+       }
+       if (!tmps || !*tmps)
+           tmps = "Died";
+       fatal("%s",tmps);
+       goto say_zero;
+    case O_PRTF:
+    case O_PRINT:
+       if ((arg[1].arg_type & A_MASK) == A_WORD)
+           stab = arg[1].arg_ptr.arg_stab;
+       else
+           stab = stabent(str_get(st[1]),TRUE);
+       if (!stab)
+           stab = defoutstab;
+       if (!stab_io(stab)) {
+           if (dowarn)
+               warn("Filehandle never opened");
+           goto say_zero;
+       }
+       if (!(fp = stab_io(stab)->ofp)) {
+           if (dowarn)  {
+               if (stab_io(stab)->ifp)
+                   warn("Filehandle opened only for input");
+               else
+                   warn("Print on closed filehandle");
+           }
+           goto say_zero;
+       }
+       else {
+           if (optype == O_PRTF || arglast[2] - arglast[1] != 1)
+               value = (double)do_aprint(arg,fp,arglast);
+           else {
+               value = (double)do_print(st[2],fp);
+               if (orslen && optype == O_PRINT)
+                   if (fwrite(ors, 1, orslen, fp) == 0)
+                       goto say_zero;
+           }
+           if (stab_io(stab)->flags & IOF_FLUSH)
+               if (fflush(fp) == EOF)
+                   goto say_zero;
+       }
+       goto donumset;
+    case O_CHDIR:
+       if (maxarg < 1)
+           tmps = Nullch;
+       else
+           tmps = str_get(st[1]);
+       if (!tmps || !*tmps) {
+           tmpstr = hfetch(stab_hash(envstab),"HOME",4,FALSE);
+           tmps = str_get(tmpstr);
+       }
+       if (!tmps || !*tmps) {
+           tmpstr = hfetch(stab_hash(envstab),"LOGDIR",6,FALSE);
+           tmps = str_get(tmpstr);
+       }
+#ifdef TAINT
+       TAINT_PROPER("chdir");
+#endif
+       value = (double)(chdir(tmps) >= 0);
+       goto donumset;
+    case O_EXIT:
+       if (maxarg < 1)
+           anum = 0;
+       else
+           anum = (int)str_gnum(st[1]);
+       my_exit(anum);
+       goto say_zero;
+    case O_RESET:
+       if (maxarg < 1)
+           tmps = "";
+       else
+           tmps = str_get(st[1]);
+       str_reset(tmps,curcmd->c_stash);
+       value = 1.0;
+       goto donumset;
+    case O_LIST:
+       if (gimme == G_ARRAY)
+           goto array_return;
+       if (maxarg > 0)
+           str = st[sp - arglast[0]];  /* unwanted list, return last item */
+       else
+           str = &str_undef;
+       break;
+    case O_EOF:
+       if (maxarg <= 0)
+           stab = last_in_stab;
+       else if ((arg[1].arg_type & A_MASK) == A_WORD)
+           stab = arg[1].arg_ptr.arg_stab;
+       else
+           stab = stabent(str_get(st[1]),TRUE);
+       str_set(str, do_eof(stab) ? Yes : No);
+       STABSET(str);
+       break;
+    case O_GETC:
+       if (maxarg <= 0)
+           stab = stdinstab;
+       else if ((arg[1].arg_type & A_MASK) == A_WORD)
+           stab = arg[1].arg_ptr.arg_stab;
+       else
+           stab = stabent(str_get(st[1]),TRUE);
+       if (!stab)
+           stab = argvstab;
+       if (!stab || do_eof(stab)) /* make sure we have fp with something */
+           goto say_undef;
+       else {
+#ifdef TAINT
+           tainted = 1;
+#endif
+           str_set(str," ");
+           *str->str_ptr = getc(stab_io(stab)->ifp); /* should never be EOF */
+       }
+       STABSET(str);
+       break;
+    case O_TELL:
+       if (maxarg <= 0)
+           stab = last_in_stab;
+       else if ((arg[1].arg_type & A_MASK) == A_WORD)
+           stab = arg[1].arg_ptr.arg_stab;
+       else
+           stab = stabent(str_get(st[1]),TRUE);
+#ifndef lint
+       value = (double)do_tell(stab);
+#else
+       (void)do_tell(stab);
+#endif
+       goto donumset;
+    case O_RECV:
+    case O_READ:
+    case O_SYSREAD:
+       if ((arg[1].arg_type & A_MASK) == A_WORD)
+           stab = arg[1].arg_ptr.arg_stab;
+       else
+           stab = stabent(str_get(st[1]),TRUE);
+       tmps = str_get(st[2]);
+       anum = (int)str_gnum(st[3]);
+       errno = 0;
+       maxarg = sp - arglast[0];
+       if (maxarg > 4)
+           warn("Too many args on read");
+       if (maxarg == 4)
+           maxarg = (int)str_gnum(st[4]);
+       else
+           maxarg = 0;
+       if (!stab_io(stab) || !stab_io(stab)->ifp)
+           goto say_undef;
+#ifdef HAS_SOCKET
+       if (optype == O_RECV) {
+           argtype = sizeof buf;
+           STR_GROW(st[2], anum+1), (tmps = str_get(st[2]));  /* sneaky */
+           anum = recvfrom(fileno(stab_io(stab)->ifp), tmps, anum, maxarg,
+               buf, &argtype);
+           if (anum >= 0) {
+               st[2]->str_cur = anum;
+               st[2]->str_ptr[anum] = '\0';
+               str_nset(str,buf,argtype);
+           }
+           else
+               str_sset(str,&str_undef);
+           break;
+       }
+#else
+       if (optype == O_RECV)
+           goto badsock;
+#endif
+       STR_GROW(st[2], anum+maxarg+1), (tmps = str_get(st[2]));  /* sneaky */
+       if (optype == O_SYSREAD) {
+           anum = read(fileno(stab_io(stab)->ifp), tmps+maxarg, anum);
+       }
+       else
+#ifdef HAS_SOCKET
+       if (stab_io(stab)->type == 's') {
+           argtype = sizeof buf;
+           anum = recvfrom(fileno(stab_io(stab)->ifp), tmps+maxarg, anum, 0,
+               buf, &argtype);
+       }
+       else
+#endif
+           anum = fread(tmps+maxarg, 1, anum, stab_io(stab)->ifp);
+       if (anum < 0)
+           goto say_undef;
+       st[2]->str_cur = anum+maxarg;
+       st[2]->str_ptr[anum+maxarg] = '\0';
+       value = (double)anum;
+       goto donumset;
+    case O_SYSWRITE:
+    case O_SEND:
+       if ((arg[1].arg_type & A_MASK) == A_WORD)
+           stab = arg[1].arg_ptr.arg_stab;
+       else
+           stab = stabent(str_get(st[1]),TRUE);
+       tmps = str_get(st[2]);
+       anum = (int)str_gnum(st[3]);
+       errno = 0;
+       stio = stab_io(stab);
+       maxarg = sp - arglast[0];
+       if (!stio || !stio->ifp) {
+           anum = -1;
+           if (dowarn) {
+               if (optype == O_SYSWRITE)
+                   warn("Syswrite on closed filehandle");
+               else
+                   warn("Send on closed socket");
+           }
+       }
+       else if (optype == O_SYSWRITE) {
+           if (maxarg > 4)
+               warn("Too many args on syswrite");
+           if (maxarg == 4)
+               optype = (int)str_gnum(st[4]);
+           else
+               optype = 0;
+           anum = write(fileno(stab_io(stab)->ifp), tmps+optype, anum);
+       }
+#ifdef HAS_SOCKET
+       else if (maxarg >= 4) {
+           if (maxarg > 4)
+               warn("Too many args on send");
+           tmps2 = str_get(st[4]);
+           anum = sendto(fileno(stab_io(stab)->ifp), tmps, st[2]->str_cur,
+             anum, tmps2, st[4]->str_cur);
+       }
+       else
+           anum = send(fileno(stab_io(stab)->ifp), tmps, st[2]->str_cur, anum);
+#else
+       else
+           goto badsock;
+#endif
+       if (anum < 0)
+           goto say_undef;
+       value = (double)anum;
+       goto donumset;
+    case O_SEEK:
+       if ((arg[1].arg_type & A_MASK) == A_WORD)
+           stab = arg[1].arg_ptr.arg_stab;
+       else
+           stab = stabent(str_get(st[1]),TRUE);
+       value = str_gnum(st[2]);
+       str_set(str, do_seek(stab,
+         (long)value, (int)str_gnum(st[3]) ) ? Yes : No);
+       STABSET(str);
+       break;
+    case O_RETURN:
+       tmps = "_SUB_";         /* just fake up a "last _SUB_" */
+       optype = O_LAST;
+       if (curcsv && curcsv->wantarray == G_ARRAY) {
+           lastretstr = Nullstr;
+           lastspbase = arglast[1];
+           lastsize = arglast[2] - arglast[1];
+       }
+       else
+           lastretstr = str_mortal(st[arglast[2] - arglast[0]]);
+       goto dopop;
+    case O_REDO:
+    case O_NEXT:
+    case O_LAST:
+       tmps = Nullch;
+       if (maxarg > 0) {
+           tmps = str_get(arg[1].arg_ptr.arg_str);
+         dopop:
+           while (loop_ptr >= 0 && (!loop_stack[loop_ptr].loop_label ||
+             strNE(tmps,loop_stack[loop_ptr].loop_label) )) {
+#ifdef DEBUGGING
+               if (debug & 4) {
+                   deb("(Skipping label #%d %s)\n",loop_ptr,
+                       loop_stack[loop_ptr].loop_label);
+               }
+#endif
+               loop_ptr--;
+           }
+#ifdef DEBUGGING
+           if (debug & 4) {
+               deb("(Found label #%d %s)\n",loop_ptr,
+                   loop_stack[loop_ptr].loop_label);
+           }
+#endif
+       }
+       if (loop_ptr < 0) {
+           if (tmps && strEQ(tmps, "_SUB_"))
+               fatal("Can't return outside a subroutine");
+           fatal("Bad label: %s", maxarg > 0 ? tmps : "<null>");
+       }
+       if (!lastretstr && optype == O_LAST && lastsize) {
+           st -= arglast[0];
+           st += lastspbase + 1;
+           optype = loop_stack[loop_ptr].loop_sp - lastspbase; /* negative */
+           if (optype) {
+               for (anum = lastsize; anum > 0; anum--,st++)
+                   st[optype] = str_mortal(st[0]);
+           }
+           longjmp(loop_stack[loop_ptr].loop_env, O_LAST);
+       }
+       longjmp(loop_stack[loop_ptr].loop_env, optype);
+    case O_DUMP:
+    case O_GOTO:/* shudder */
+       goto_targ = str_get(arg[1].arg_ptr.arg_str);
+       if (!*goto_targ)
+           goto_targ = Nullch;         /* just restart from top */
+       if (optype == O_DUMP) {
+           do_undump = TRUE;
+           my_unexec();
+       }
+       longjmp(top_env, 1);
+    case O_INDEX:
+       tmps = str_get(st[1]);
+       if (maxarg < 3)
+           anum = 0;
+       else {
+           anum = (int) str_gnum(st[3]) - arybase;
+           if (anum < 0)
+               anum = 0;
+           else if (anum > st[1]->str_cur)
+               anum = st[1]->str_cur;
+       }
+#ifndef lint
+       if (!(tmps2 = fbminstr((unsigned char*)tmps + anum,
+         (unsigned char*)tmps + st[1]->str_cur, st[2])))
+#else
+       if (tmps2 = fbminstr(Null(unsigned char*),Null(unsigned char*),Nullstr))
+#endif
+           value = (double)(-1 + arybase);
+       else
+           value = (double)(tmps2 - tmps + arybase);
+       goto donumset;
+    case O_RINDEX:
+       tmps = str_get(st[1]);
+       tmps2 = str_get(st[2]);
+       if (maxarg < 3)
+           anum = st[1]->str_cur;
+       else {
+           anum = (int) str_gnum(st[3]) - arybase + st[2]->str_cur;
+           if (anum < 0)
+               anum = 0;
+           else if (anum > st[1]->str_cur)
+               anum = st[1]->str_cur;
+       }
+#ifndef lint
+       if (!(tmps2 = rninstr(tmps,  tmps  + anum,
+                             tmps2, tmps2 + st[2]->str_cur)))
+#else
+       if (tmps2 = rninstr(Nullch,Nullch,Nullch,Nullch))
+#endif
+           value = (double)(-1 + arybase);
+       else
+           value = (double)(tmps2 - tmps + arybase);
+       goto donumset;
+    case O_TIME:
+#ifndef lint
+       value = (double) time(Null(long*));
+#endif
+       goto donumset;
+    case O_TMS:
+       sp = do_tms(str,gimme,arglast);
+       goto array_return;
+    case O_LOCALTIME:
+       if (maxarg < 1)
+           (void)time(&when);
+       else
+           when = (time_t)str_gnum(st[1]);
+       sp = do_time(str,localtime(&when),
+         gimme,arglast);
+       goto array_return;
+    case O_GMTIME:
+       if (maxarg < 1)
+           (void)time(&when);
+       else
+           when = (time_t)str_gnum(st[1]);
+       sp = do_time(str,gmtime(&when),
+         gimme,arglast);
+       goto array_return;
+    case O_TRUNCATE:
+       sp = do_truncate(str,arg,
+         gimme,arglast);
+       goto array_return;
+    case O_LSTAT:
+    case O_STAT:
+       sp = do_stat(str,arg,
+         gimme,arglast);
+       goto array_return;
+    case O_CRYPT:
+#ifdef HAS_CRYPT
+       tmps = str_get(st[1]);
+#ifdef FCRYPT
+       str_set(str,fcrypt(tmps,str_get(st[2])));
+#else
+       str_set(str,crypt(tmps,str_get(st[2])));
+#endif
+#else
+       fatal(
+         "The crypt() function is unimplemented due to excessive paranoia.");
+#endif
+       break;
+    case O_ATAN2:
+       value = str_gnum(st[1]);
+       value = atan2(value,str_gnum(st[2]));
+       goto donumset;
+    case O_SIN:
+       if (maxarg < 1)
+           value = str_gnum(stab_val(defstab));
+       else
+           value = str_gnum(st[1]);
+       value = sin(value);
+       goto donumset;
+    case O_COS:
+       if (maxarg < 1)
+           value = str_gnum(stab_val(defstab));
+       else
+           value = str_gnum(st[1]);
+       value = cos(value);
+       goto donumset;
+    case O_RAND:
+       if (maxarg < 1)
+           value = 1.0;
+       else
+           value = str_gnum(st[1]);
+       if (value == 0.0)
+           value = 1.0;
+#if RANDBITS == 31
+       value = rand() * value / 2147483648.0;
+#else
+#if RANDBITS == 16
+       value = rand() * value / 65536.0;
+#else
+#if RANDBITS == 15
+       value = rand() * value / 32768.0;
+#else
+       value = rand() * value / (double)(((unsigned long)1) << RANDBITS);
+#endif
+#endif
+#endif
+       goto donumset;
+    case O_SRAND:
+       if (maxarg < 1) {
+           (void)time(&when);
+           anum = when;
+       }
+       else
+           anum = (int)str_gnum(st[1]);
+       (void)srand(anum);
+       goto say_yes;
+    case O_EXP:
+       if (maxarg < 1)
+           value = str_gnum(stab_val(defstab));
+       else
+           value = str_gnum(st[1]);
+       value = exp(value);
+       goto donumset;
+    case O_LOG:
+       if (maxarg < 1)
+           value = str_gnum(stab_val(defstab));
+       else
+           value = str_gnum(st[1]);
+       if (value <= 0.0)
+           fatal("Can't take log of %g\n", value);
+       value = log(value);
+       goto donumset;
+    case O_SQRT:
+       if (maxarg < 1)
+           value = str_gnum(stab_val(defstab));
+       else
+           value = str_gnum(st[1]);
+       if (value < 0.0)
+           fatal("Can't take sqrt of %g\n", value);
+       value = sqrt(value);
+       goto donumset;
+    case O_INT:
+       if (maxarg < 1)
+           value = str_gnum(stab_val(defstab));
+       else
+           value = str_gnum(st[1]);
+       if (value >= 0.0)
+           (void)modf(value,&value);
+       else {
+           (void)modf(-value,&value);
+           value = -value;
+       }
+       goto donumset;
+    case O_ORD:
+       if (maxarg < 1)
+           tmps = str_get(stab_val(defstab));
+       else
+           tmps = str_get(st[1]);
+#ifndef I286
+       value = (double) (*tmps & 255);
+#else
+       anum = (int) *tmps;
+       value = (double) (anum & 255);
+#endif
+       goto donumset;
+    case O_ALARM:
+#ifdef HAS_ALARM
+       if (maxarg < 1)
+           tmps = str_get(stab_val(defstab));
+       else
+           tmps = str_get(st[1]);
+       if (!tmps)
+           tmps = "0";
+       anum = alarm((unsigned int)atoi(tmps));
+       if (anum < 0)
+           goto say_undef;
+       value = (double)anum;
+       goto donumset;
+#else
+       fatal("Unsupported function alarm");
+       break;
+#endif
+    case O_SLEEP:
+       if (maxarg < 1)
+           tmps = Nullch;
+       else
+           tmps = str_get(st[1]);
+       (void)time(&when);
+       if (!tmps || !*tmps)
+           sleep((32767<<16)+32767);
+       else
+           sleep((unsigned int)atoi(tmps));
+#ifndef lint
+       value = (double)when;
+       (void)time(&when);
+       value = ((double)when) - value;
+#endif
+       goto donumset;
+    case O_RANGE:
+       sp = do_range(gimme,arglast);
+       goto array_return;
+    case O_F_OR_R:
+       if (gimme == G_ARRAY) {         /* it's a range */
+           /* can we optimize to constant array? */
+           if ((arg[1].arg_type & A_MASK) == A_SINGLE &&
+             (arg[2].arg_type & A_MASK) == A_SINGLE) {
+               st[2] = arg[2].arg_ptr.arg_str;
+               sp = do_range(gimme,arglast);
+               st = stack->ary_array;
+               maxarg = sp - arglast[0];
+               str_free(arg[1].arg_ptr.arg_str);
+               arg[1].arg_ptr.arg_str = Nullstr;
+               str_free(arg[2].arg_ptr.arg_str);
+               arg[2].arg_ptr.arg_str = Nullstr;
+               arg->arg_type = O_ARRAY;
+               arg[1].arg_type = A_STAB|A_DONT;
+               arg->arg_len = 1;
+               stab = arg[1].arg_ptr.arg_stab = aadd(genstab());
+               ary = stab_array(stab);
+               afill(ary,maxarg - 1);
+               anum = maxarg;
+               st += arglast[0]+1;
+               while (maxarg-- > 0)
+                   ary->ary_array[maxarg] = str_smake(st[maxarg]);
+               st -= arglast[0]+1;
+               goto array_return;
+           }
+           arg->arg_type = optype = O_RANGE;
+           maxarg = arg->arg_len = 2;
+           anum = 2;
+           arg[anum].arg_flags &= ~AF_ARYOK;
+           argflags = arg[anum].arg_flags;
+           argtype = arg[anum].arg_type & A_MASK;
+           arg[anum].arg_type = argtype;
+           argptr = arg[anum].arg_ptr;
+           sp = arglast[0];
+           st -= sp;
+           sp++;
+           goto re_eval;
+       }
+       arg->arg_type = O_FLIP;
+       /* FALL THROUGH */
+    case O_FLIP:
+       if ((arg[1].arg_type & A_MASK) == A_SINGLE ?
+         last_in_stab && (int)str_gnum(st[1]) == stab_io(last_in_stab)->lines
+         :
+         str_true(st[1]) ) {
+           arg[2].arg_type &= ~A_DONT;
+           arg[1].arg_type |= A_DONT;
+           arg->arg_type = optype = O_FLOP;
+           if (arg->arg_flags & AF_COMMON) {
+               str_numset(str,0.0);
+               anum = 2;
+               argflags = arg[2].arg_flags;
+               argtype = arg[2].arg_type & A_MASK;
+               argptr = arg[2].arg_ptr;
+               sp = arglast[0];
+               st -= sp++;
+               goto re_eval;
+           }
+           else {
+               str_numset(str,1.0);
+               break;
+           }
+       }
+       str_set(str,"");
+       break;
+    case O_FLOP:
+       str_inc(str);
+       if ((arg[2].arg_type & A_MASK) == A_SINGLE ?
+         last_in_stab && (int)str_gnum(st[2]) == stab_io(last_in_stab)->lines
+         :
+         str_true(st[2]) ) {
+           arg->arg_type = O_FLIP;
+           arg[1].arg_type &= ~A_DONT;
+           arg[2].arg_type |= A_DONT;
+           str_cat(str,"E0");
+       }
+       break;
+    case O_FORK:
+#ifdef HAS_FORK
+       anum = fork();
+       if (anum < 0)
+           goto say_undef;
+       if (!anum) {
+           /*SUPPRESS 560*/
+           if (tmpstab = stabent("$",allstabs))
+               str_numset(STAB_STR(tmpstab),(double)getpid());
+           hclear(pidstatus, FALSE);   /* no kids, so don't wait for 'em */
+       }
+       value = (double)anum;
+       goto donumset;
+#else
+       fatal("Unsupported function fork");
+       break;
+#endif
+    case O_WAIT:
+#ifdef HAS_WAIT
+#ifndef lint
+       anum = wait(&argflags);
+       if (anum > 0)
+           pidgone(anum,argflags);
+       value = (double)anum;
+#endif
+       statusvalue = (unsigned short)argflags;
+       goto donumset;
+#else
+       fatal("Unsupported function wait");
+       break;
+#endif
+    case O_WAITPID:
+#ifdef HAS_WAIT
+#ifndef lint
+       anum = (int)str_gnum(st[1]);
+       optype = (int)str_gnum(st[2]);
+       anum = wait4pid(anum, &argflags,optype);
+       value = (double)anum;
+#endif
+       statusvalue = (unsigned short)argflags;
+       goto donumset;
+#else
+       fatal("Unsupported function wait");
+       break;
+#endif
+    case O_SYSTEM:
+#ifdef HAS_FORK
+#ifdef TAINT
+       if (arglast[2] - arglast[1] == 1) {
+           taintenv();
+           tainted |= st[2]->str_tainted;
+           TAINT_PROPER("system");
+       }
+#endif
+       while ((anum = vfork()) == -1) {
+           if (errno != EAGAIN) {
+               value = -1.0;
+               goto donumset;
+           }
+           sleep(5);
+       }
+       if (anum > 0) {
+#ifndef lint
+           ihand = signal(SIGINT, SIG_IGN);
+           qhand = signal(SIGQUIT, SIG_IGN);
+           argtype = wait4pid(anum, &argflags, 0);
+#else
+           ihand = qhand = 0;
+#endif
+           (void)signal(SIGINT, ihand);
+           (void)signal(SIGQUIT, qhand);
+           statusvalue = (unsigned short)argflags;
+           if (argtype < 0)
+               value = -1.0;
+           else {
+               value = (double)((unsigned int)argflags & 0xffff);
+           }
+           do_execfree();      /* free any memory child malloced on vfork */
+           goto donumset;
+       }
+       if ((arg[1].arg_type & A_MASK) == A_STAB)
+           value = (double)do_aexec(st[1],arglast);
+       else if (arglast[2] - arglast[1] != 1)
+           value = (double)do_aexec(Nullstr,arglast);
+       else {
+           value = (double)do_exec(str_get(str_mortal(st[2])));
+       }
+       _exit(-1);
+#else /* ! FORK */
+       if ((arg[1].arg_type & A_MASK) == A_STAB)
+           value = (double)do_aspawn(st[1],arglast);
+       else if (arglast[2] - arglast[1] != 1)
+           value = (double)do_aspawn(Nullstr,arglast);
+       else {
+           value = (double)do_spawn(str_get(str_mortal(st[2])));
+       }
+       goto donumset;
+#endif /* FORK */
+    case O_EXEC_OP:
+       if ((arg[1].arg_type & A_MASK) == A_STAB)
+           value = (double)do_aexec(st[1],arglast);
+       else if (arglast[2] - arglast[1] != 1)
+           value = (double)do_aexec(Nullstr,arglast);
+       else {
+#ifdef TAINT
+           taintenv();
+           tainted |= st[2]->str_tainted;
+           TAINT_PROPER("exec");
+#endif
+           value = (double)do_exec(str_get(str_mortal(st[2])));
+       }
+       goto donumset;
+    case O_HEX:
+       if (maxarg < 1)
+           tmps = str_get(stab_val(defstab));
+       else
+           tmps = str_get(st[1]);
+       value = (double)scanhex(tmps, 99, &argtype);
+       goto donumset;
+
+    case O_OCT:
+       if (maxarg < 1)
+           tmps = str_get(stab_val(defstab));
+       else
+           tmps = str_get(st[1]);
+       while (*tmps && (isSPACE(*tmps) || *tmps == '0'))
+           tmps++;
+       if (*tmps == 'x')
+           value = (double)scanhex(++tmps, 99, &argtype);
+       else
+           value = (double)scanoct(tmps, 99, &argtype);
+       goto donumset;
+
+/* These common exits are hidden here in the middle of the switches for the
+   benefit of those machines with limited branch addressing.  Sigh.  */
+
+array_return:
+#ifdef DEBUGGING
+    if (debug) {
+       dlevel--;
+       if (debug & 8) {
+           anum = sp - arglast[0];
+           switch (anum) {
+           case 0:
+               deb("%s RETURNS ()\n",opname[optype]);
+               break;
+           case 1:
+               deb("%s RETURNS (\"%s\")\n",opname[optype],
+                   st[1] ? str_get(st[1]) : "");
+               break;
+           default:
+               tmps = st[1] ? str_get(st[1]) : "";
+               deb("%s RETURNS %d ARGS (\"%s\",%s\"%s\")\n",opname[optype],
+                 anum,tmps,anum==2?"":"...,",
+                       st[anum] ? str_get(st[anum]) : "");
+               break;
+           }
+       }
+    }
+#endif
+    stack_ary = stack->ary_array;
+    stack_max = stack_ary + stack->ary_max;
+    stack_sp = stack_ary + sp;
+    return sp;
+
+say_yes:
+    str = &str_yes;
+    goto normal_return;
+
+say_no:
+    str = &str_no;
+    goto normal_return;
+
+say_undef:
+    str = &str_undef;
+    goto normal_return;
+
+say_zero:
+    value = 0.0;
+    /* FALL THROUGH */
+
+donumset:
+    str_numset(str,value);
+    STABSET(str);
+    st[1] = str;
+#ifdef DEBUGGING
+    if (debug) {
+       dlevel--;
+       if (debug & 8)
+           deb("%s RETURNS \"%f\"\n",opname[optype],value);
+    }
+#endif
+    stack_ary = stack->ary_array;
+    stack_max = stack_ary + stack->ary_max;
+    stack_sp = stack_ary + arglast[0] + 1;
+    return arglast[0] + 1;
+#ifdef SMALLSWITCHES
+    }
+    else
+    switch (optype) {
+#endif
+    case O_CHOWN:
+#ifdef HAS_CHOWN
+       value = (double)apply(optype,arglast);
+       goto donumset;
+#else
+       fatal("Unsupported function chown");
+       break;
+#endif
+    case O_KILL:
+#ifdef HAS_KILL
+       value = (double)apply(optype,arglast);
+       goto donumset;
+#else
+       fatal("Unsupported function kill");
+       break;
+#endif
+    case O_UNLINK:
+    case O_CHMOD:
+    case O_UTIME:
+       value = (double)apply(optype,arglast);
+       goto donumset;
+    case O_UMASK:
+#ifdef HAS_UMASK
+       if (maxarg < 1) {
+           anum = umask(0);
+           (void)umask(anum);
+       }
+       else
+           anum = umask((int)str_gnum(st[1]));
+       value = (double)anum;
+#ifdef TAINT
+       TAINT_PROPER("umask");
+#endif
+       goto donumset;
+#else
+       fatal("Unsupported function umask");
+       break;
+#endif
+#if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
+    case O_MSGGET:
+    case O_SHMGET:
+    case O_SEMGET:
+       if ((anum = do_ipcget(optype, arglast)) == -1)
+           goto say_undef;
+       value = (double)anum;
+       goto donumset;
+    case O_MSGCTL:
+    case O_SHMCTL:
+    case O_SEMCTL:
+       anum = do_ipcctl(optype, arglast);
+       if (anum == -1)
+           goto say_undef;
+       if (anum != 0) {
+           value = (double)anum;
+           goto donumset;
+       }
+       str_set(str,"0 but true");
+       STABSET(str);
+       break;
+    case O_MSGSND:
+       value = (double)(do_msgsnd(arglast) >= 0);
+       goto donumset;
+    case O_MSGRCV:
+       value = (double)(do_msgrcv(arglast) >= 0);
+       goto donumset;
+    case O_SEMOP:
+       value = (double)(do_semop(arglast) >= 0);
+       goto donumset;
+    case O_SHMREAD:
+    case O_SHMWRITE:
+       value = (double)(do_shmio(optype, arglast) >= 0);
+       goto donumset;
+#else /* not SYSVIPC */
+    case O_MSGGET:
+    case O_MSGCTL:
+    case O_MSGSND:
+    case O_MSGRCV:
+    case O_SEMGET:
+    case O_SEMCTL:
+    case O_SEMOP:
+    case O_SHMGET:
+    case O_SHMCTL:
+    case O_SHMREAD:
+    case O_SHMWRITE:
+       fatal("System V IPC is not implemented on this machine");
+#endif /* not SYSVIPC */
+    case O_RENAME:
+       tmps = str_get(st[1]);
+       tmps2 = str_get(st[2]);
+#ifdef TAINT
+       TAINT_PROPER("rename");
+#endif
+#ifdef HAS_RENAME
+       value = (double)(rename(tmps,tmps2) >= 0);
+#else
+       if (same_dirent(tmps2, tmps))   /* can always rename to same name */
+           anum = 1;
+       else {
+           if (euid || stat(tmps2,&statbuf) < 0 || !S_ISDIR(statbuf.st_mode))
+               (void)UNLINK(tmps2);
+           if (!(anum = link(tmps,tmps2)))
+               anum = UNLINK(tmps);
+       }
+       value = (double)(anum >= 0);
+#endif
+       goto donumset;
+    case O_LINK:
+#ifdef HAS_LINK
+       tmps = str_get(st[1]);
+       tmps2 = str_get(st[2]);
+#ifdef TAINT
+       TAINT_PROPER("link");
+#endif
+       value = (double)(link(tmps,tmps2) >= 0);
+       goto donumset;
+#else
+       fatal("Unsupported function link");
+       break;
+#endif
+    case O_MKDIR:
+       tmps = str_get(st[1]);
+       anum = (int)str_gnum(st[2]);
+#ifdef TAINT
+       TAINT_PROPER("mkdir");
+#endif
+#ifdef HAS_MKDIR
+       value = (double)(mkdir(tmps,anum) >= 0);
+       goto donumset;
+#else
+       (void)strcpy(buf,"mkdir ");
+#endif
+#if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
+      one_liner:
+       for (tmps2 = buf+6; *tmps; ) {
+           *tmps2++ = '\\';
+           *tmps2++ = *tmps++;
+       }
+       (void)strcpy(tmps2," 2>&1");
+       rsfp = mypopen(buf,"r");
+       if (rsfp) {
+           *buf = '\0';
+           tmps2 = fgets(buf,sizeof buf,rsfp);
+           (void)mypclose(rsfp);
+           if (tmps2 != Nullch) {
+               for (errno = 1; errno < sys_nerr; errno++) {
+                   if (instr(buf,sys_errlist[errno]))  /* you don't see this */
+                       goto say_zero;
+               }
+               errno = 0;
+#ifndef EACCES
+#define EACCES EPERM
+#endif
+               if (instr(buf,"cannot make"))
+                   errno = EEXIST;
+               else if (instr(buf,"existing file"))
+                   errno = EEXIST;
+               else if (instr(buf,"ile exists"))
+                   errno = EEXIST;
+               else if (instr(buf,"non-exist"))
+                   errno = ENOENT;
+               else if (instr(buf,"does not exist"))
+                   errno = ENOENT;
+               else if (instr(buf,"not empty"))
+                   errno = EBUSY;
+               else if (instr(buf,"cannot access"))
+                   errno = EACCES;
+               else
+                   errno = EPERM;
+               goto say_zero;
+           }
+           else {      /* some mkdirs return no failure indication */
+               tmps = str_get(st[1]);
+               anum = (stat(tmps,&statbuf) >= 0);
+               if (optype == O_RMDIR)
+                   anum = !anum;
+               if (anum)
+                   errno = 0;
+               else
+                   errno = EACCES;     /* a guess */
+               value = (double)anum;
+           }
+           goto donumset;
+       }
+       else
+           goto say_zero;
+#endif
+    case O_RMDIR:
+       if (maxarg < 1)
+           tmps = str_get(stab_val(defstab));
+       else
+           tmps = str_get(st[1]);
+#ifdef TAINT
+       TAINT_PROPER("rmdir");
+#endif
+#ifdef HAS_RMDIR
+       value = (double)(rmdir(tmps) >= 0);
+       goto donumset;
+#else
+       (void)strcpy(buf,"rmdir ");
+       goto one_liner;         /* see above in HAS_MKDIR */
+#endif
+    case O_GETPPID:
+#ifdef HAS_GETPPID
+       value = (double)getppid();
+       goto donumset;
+#else
+       fatal("Unsupported function getppid");
+       break;
+#endif
+    case O_GETPGRP:
+#ifdef HAS_GETPGRP
+       if (maxarg < 1)
+           anum = 0;
+       else
+           anum = (int)str_gnum(st[1]);
+#ifdef _POSIX_SOURCE
+       if (anum != 0)
+           fatal("POSIX getpgrp can't take an argument");
+       value = (double)getpgrp();
+#else
+       value = (double)getpgrp(anum);
+#endif
+       goto donumset;
+#else
+       fatal("The getpgrp() function is unimplemented on this machine");
+       break;
+#endif
+    case O_SETPGRP:
+#ifdef HAS_SETPGRP
+       argtype = (int)str_gnum(st[1]);
+       anum = (int)str_gnum(st[2]);
+#ifdef TAINT
+       TAINT_PROPER("setpgrp");
+#endif
+       value = (double)(setpgrp(argtype,anum) >= 0);
+       goto donumset;
+#else
+       fatal("The setpgrp() function is unimplemented on this machine");
+       break;
+#endif
+    case O_GETPRIORITY:
+#ifdef HAS_GETPRIORITY
+       argtype = (int)str_gnum(st[1]);
+       anum = (int)str_gnum(st[2]);
+       value = (double)getpriority(argtype,anum);
+       goto donumset;
+#else
+       fatal("The getpriority() function is unimplemented on this machine");
+       break;
+#endif
+    case O_SETPRIORITY:
+#ifdef HAS_SETPRIORITY
+       argtype = (int)str_gnum(st[1]);
+       anum = (int)str_gnum(st[2]);
+       optype = (int)str_gnum(st[3]);
+#ifdef TAINT
+       TAINT_PROPER("setpriority");
+#endif
+       value = (double)(setpriority(argtype,anum,optype) >= 0);
+       goto donumset;
+#else
+       fatal("The setpriority() function is unimplemented on this machine");
+       break;
+#endif
+    case O_CHROOT:
+#ifdef HAS_CHROOT
+       if (maxarg < 1)
+           tmps = str_get(stab_val(defstab));
+       else
+           tmps = str_get(st[1]);
+#ifdef TAINT
+       TAINT_PROPER("chroot");
+#endif
+       value = (double)(chroot(tmps) >= 0);
+       goto donumset;
+#else
+       fatal("Unsupported function chroot");
+       break;
+#endif
+    case O_FCNTL:
+    case O_IOCTL:
+       if (maxarg <= 0)
+           stab = last_in_stab;
+       else if ((arg[1].arg_type & A_MASK) == A_WORD)
+           stab = arg[1].arg_ptr.arg_stab;
+       else
+           stab = stabent(str_get(st[1]),TRUE);
+       argtype = U_I(str_gnum(st[2]));
+#ifdef TAINT
+       TAINT_PROPER("ioctl");
+#endif
+       anum = do_ctl(optype,stab,argtype,st[3]);
+       if (anum == -1)
+           goto say_undef;
+       if (anum != 0) {
+           value = (double)anum;
+           goto donumset;
+       }
+       str_set(str,"0 but true");
+       STABSET(str);
+       break;
+    case O_FLOCK:
+#ifdef HAS_FLOCK
+       if (maxarg <= 0)
+           stab = last_in_stab;
+       else if ((arg[1].arg_type & A_MASK) == A_WORD)
+           stab = arg[1].arg_ptr.arg_stab;
+       else
+           stab = stabent(str_get(st[1]),TRUE);
+       if (stab && stab_io(stab))
+           fp = stab_io(stab)->ifp;
+       else
+           fp = Nullfp;
+       if (fp) {
+           argtype = (int)str_gnum(st[2]);
+           value = (double)(flock(fileno(fp),argtype) >= 0);
+       }
+       else
+           value = 0;
+       goto donumset;
+#else
+       fatal("The flock() function is unimplemented on this machine");
+       break;
+#endif
+    case O_UNSHIFT:
+       ary = stab_array(arg[1].arg_ptr.arg_stab);
+       if (arglast[2] - arglast[1] != 1)
+           do_unshift(ary,arglast);
+       else {
+           STR *tmpstr = Str_new(52,0);        /* must copy the STR */
+           str_sset(tmpstr,st[2]);
+           aunshift(ary,1);
+           (void)astore(ary,0,tmpstr);
+       }
+       value = (double)(ary->ary_fill + 1);
+       goto donumset;
+
+    case O_TRY:
+       sp = do_try(arg[1].arg_ptr.arg_cmd,
+           gimme,arglast);
+       goto array_return;
+
+    case O_EVALONCE:
+       sp = do_eval(st[1], O_EVAL, curcmd->c_stash, TRUE,
+           gimme,arglast);
+       if (eval_root) {
+           str_free(arg[1].arg_ptr.arg_str);
+           arg[1].arg_ptr.arg_cmd = eval_root;
+           arg[1].arg_type = (A_CMD|A_DONT);
+           arg[0].arg_type = O_TRY;
+       }
+       goto array_return;
+
+    case O_REQUIRE:
+    case O_DOFILE:
+    case O_EVAL:
+       if (maxarg < 1)
+           tmpstr = stab_val(defstab);
+       else
+           tmpstr =
+             (arg[1].arg_type & A_MASK) != A_NULL ? st[1] : stab_val(defstab);
+#ifdef TAINT
+       tainted |= tmpstr->str_tainted;
+       TAINT_PROPER("eval");
+#endif
+       sp = do_eval(tmpstr, optype, curcmd->c_stash, FALSE,
+           gimme,arglast);
+       goto array_return;
+
+    case O_FTRREAD:
+       argtype = 0;
+       anum = S_IRUSR;
+       goto check_perm;
+    case O_FTRWRITE:
+       argtype = 0;
+       anum = S_IWUSR;
+       goto check_perm;
+    case O_FTREXEC:
+       argtype = 0;
+       anum = S_IXUSR;
+       goto check_perm;
+    case O_FTEREAD:
+       argtype = 1;
+       anum = S_IRUSR;
+       goto check_perm;
+    case O_FTEWRITE:
+       argtype = 1;
+       anum = S_IWUSR;
+       goto check_perm;
+    case O_FTEEXEC:
+       argtype = 1;
+       anum = S_IXUSR;
+      check_perm:
+       if (mystat(arg,st[1]) < 0)
+           goto say_undef;
+       if (cando(anum,argtype,&statcache))
+           goto say_yes;
+       goto say_no;
+
+    case O_FTIS:
+       if (mystat(arg,st[1]) < 0)
+           goto say_undef;
+       goto say_yes;
+    case O_FTEOWNED:
+    case O_FTROWNED:
+       if (mystat(arg,st[1]) < 0)
+           goto say_undef;
+       if (statcache.st_uid == (optype == O_FTEOWNED ? euid : uid) )
+           goto say_yes;
+       goto say_no;
+    case O_FTZERO:
+       if (mystat(arg,st[1]) < 0)
+           goto say_undef;
+       if (!statcache.st_size)
+           goto say_yes;
+       goto say_no;
+    case O_FTSIZE:
+       if (mystat(arg,st[1]) < 0)
+           goto say_undef;
+       value = (double)statcache.st_size;
+       goto donumset;
+
+    case O_FTMTIME:
+       if (mystat(arg,st[1]) < 0)
+           goto say_undef;
+       value = (double)(basetime - statcache.st_mtime) / 86400.0;
+       goto donumset;
+    case O_FTATIME:
+       if (mystat(arg,st[1]) < 0)
+           goto say_undef;
+       value = (double)(basetime - statcache.st_atime) / 86400.0;
+       goto donumset;
+    case O_FTCTIME:
+       if (mystat(arg,st[1]) < 0)
+           goto say_undef;
+       value = (double)(basetime - statcache.st_ctime) / 86400.0;
+       goto donumset;
+
+    case O_FTSOCK:
+       if (mystat(arg,st[1]) < 0)
+           goto say_undef;
+       if (S_ISSOCK(statcache.st_mode))
+           goto say_yes;
+       goto say_no;
+    case O_FTCHR:
+       if (mystat(arg,st[1]) < 0)
+           goto say_undef;
+       if (S_ISCHR(statcache.st_mode))
+           goto say_yes;
+       goto say_no;
+    case O_FTBLK:
+       if (mystat(arg,st[1]) < 0)
+           goto say_undef;
+       if (S_ISBLK(statcache.st_mode))
+           goto say_yes;
+       goto say_no;
+    case O_FTFILE:
+       if (mystat(arg,st[1]) < 0)
+           goto say_undef;
+       if (S_ISREG(statcache.st_mode))
+           goto say_yes;
+       goto say_no;
+    case O_FTDIR:
+       if (mystat(arg,st[1]) < 0)
+           goto say_undef;
+       if (S_ISDIR(statcache.st_mode))
+           goto say_yes;
+       goto say_no;
+    case O_FTPIPE:
+       if (mystat(arg,st[1]) < 0)
+           goto say_undef;
+       if (S_ISFIFO(statcache.st_mode))
+           goto say_yes;
+       goto say_no;
+    case O_FTLINK:
+       if (mylstat(arg,st[1]) < 0)
+           goto say_undef;
+       if (S_ISLNK(statcache.st_mode))
+           goto say_yes;
+       goto say_no;
+    case O_SYMLINK:
+#ifdef HAS_SYMLINK
+       tmps = str_get(st[1]);
+       tmps2 = str_get(st[2]);
+#ifdef TAINT
+       TAINT_PROPER("symlink");
+#endif
+       value = (double)(symlink(tmps,tmps2) >= 0);
+       goto donumset;
+#else
+       fatal("Unsupported function symlink");
+#endif
+    case O_READLINK:
+#ifdef HAS_SYMLINK
+       if (maxarg < 1)
+           tmps = str_get(stab_val(defstab));
+       else
+           tmps = str_get(st[1]);
+       anum = readlink(tmps,buf,sizeof buf);
+       if (anum < 0)
+           goto say_undef;
+       str_nset(str,buf,anum);
+       break;
+#else
+       goto say_undef;         /* just pretend it's a normal file */
+#endif
+    case O_FTSUID:
+#ifdef S_ISUID
+       anum = S_ISUID;
+       goto check_xid;
+#else
+       goto say_no;
+#endif
+    case O_FTSGID:
+#ifdef S_ISGID
+       anum = S_ISGID;
+       goto check_xid;
+#else
+       goto say_no;
+#endif
+    case O_FTSVTX:
+#ifdef S_ISVTX
+       anum = S_ISVTX;
+#else
+       goto say_no;
+#endif
+      check_xid:
+       if (mystat(arg,st[1]) < 0)
+           goto say_undef;
+       if (statcache.st_mode & anum)
+           goto say_yes;
+       goto say_no;
+    case O_FTTTY:
+       if (arg[1].arg_type & A_DONT) {
+           stab = arg[1].arg_ptr.arg_stab;
+           tmps = "";
+       }
+       else
+           stab = stabent(tmps = str_get(st[1]),FALSE);
+       if (stab && stab_io(stab) && stab_io(stab)->ifp)
+           anum = fileno(stab_io(stab)->ifp);
+       else if (isDIGIT(*tmps))
+           anum = atoi(tmps);
+       else
+           goto say_undef;
+       if (isatty(anum))
+           goto say_yes;
+       goto say_no;
+    case O_FTTEXT:
+    case O_FTBINARY:
+       str = do_fttext(arg,st[1]);
+       break;
+#ifdef HAS_SOCKET
+    case O_SOCKET:
+       if ((arg[1].arg_type & A_MASK) == A_WORD)
+           stab = arg[1].arg_ptr.arg_stab;
+       else
+           stab = stabent(str_get(st[1]),TRUE);
+#ifndef lint
+       value = (double)do_socket(stab,arglast);
+#else
+       (void)do_socket(stab,arglast);
+#endif
+       goto donumset;
+    case O_BIND:
+       if ((arg[1].arg_type & A_MASK) == A_WORD)
+           stab = arg[1].arg_ptr.arg_stab;
+       else
+           stab = stabent(str_get(st[1]),TRUE);
+#ifndef lint
+       value = (double)do_bind(stab,arglast);
+#else
+       (void)do_bind(stab,arglast);
+#endif
+       goto donumset;
+    case O_CONNECT:
+       if ((arg[1].arg_type & A_MASK) == A_WORD)
+           stab = arg[1].arg_ptr.arg_stab;
+       else
+           stab = stabent(str_get(st[1]),TRUE);
+#ifndef lint
+       value = (double)do_connect(stab,arglast);
+#else
+       (void)do_connect(stab,arglast);
+#endif
+       goto donumset;
+    case O_LISTEN:
+       if ((arg[1].arg_type & A_MASK) == A_WORD)
+           stab = arg[1].arg_ptr.arg_stab;
+       else
+           stab = stabent(str_get(st[1]),TRUE);
+#ifndef lint
+       value = (double)do_listen(stab,arglast);
+#else
+       (void)do_listen(stab,arglast);
+#endif
+       goto donumset;
+    case O_ACCEPT:
+       if ((arg[1].arg_type & A_MASK) == A_WORD)
+           stab = arg[1].arg_ptr.arg_stab;
+       else
+           stab = stabent(str_get(st[1]),TRUE);
+       if ((arg[2].arg_type & A_MASK) == A_WORD)
+           stab2 = arg[2].arg_ptr.arg_stab;
+       else
+           stab2 = stabent(str_get(st[2]),TRUE);
+       do_accept(str,stab,stab2);
+       STABSET(str);
+       break;
+    case O_GHBYNAME:
+       if (maxarg < 1)
+           goto say_undef;
+    case O_GHBYADDR:
+    case O_GHOSTENT:
+       sp = do_ghent(optype,
+         gimme,arglast);
+       goto array_return;
+    case O_GNBYNAME:
+       if (maxarg < 1)
+           goto say_undef;
+    case O_GNBYADDR:
+    case O_GNETENT:
+       sp = do_gnent(optype,
+         gimme,arglast);
+       goto array_return;
+    case O_GPBYNAME:
+       if (maxarg < 1)
+           goto say_undef;
+    case O_GPBYNUMBER:
+    case O_GPROTOENT:
+       sp = do_gpent(optype,
+         gimme,arglast);
+       goto array_return;
+    case O_GSBYNAME:
+       if (maxarg < 1)
+           goto say_undef;
+    case O_GSBYPORT:
+    case O_GSERVENT:
+       sp = do_gsent(optype,
+         gimme,arglast);
+       goto array_return;
+    case O_SHOSTENT:
+       value = (double) sethostent((int)str_gnum(st[1]));
+       goto donumset;
+    case O_SNETENT:
+       value = (double) setnetent((int)str_gnum(st[1]));
+       goto donumset;
+    case O_SPROTOENT:
+       value = (double) setprotoent((int)str_gnum(st[1]));
+       goto donumset;
+    case O_SSERVENT:
+       value = (double) setservent((int)str_gnum(st[1]));
+       goto donumset;
+    case O_EHOSTENT:
+       value = (double) endhostent();
+       goto donumset;
+    case O_ENETENT:
+       value = (double) endnetent();
+       goto donumset;
+    case O_EPROTOENT:
+       value = (double) endprotoent();
+       goto donumset;
+    case O_ESERVENT:
+       value = (double) endservent();
+       goto donumset;
+    case O_SOCKPAIR:
+       if ((arg[1].arg_type & A_MASK) == A_WORD)
+           stab = arg[1].arg_ptr.arg_stab;
+       else
+           stab = stabent(str_get(st[1]),TRUE);
+       if ((arg[2].arg_type & A_MASK) == A_WORD)
+           stab2 = arg[2].arg_ptr.arg_stab;
+       else
+           stab2 = stabent(str_get(st[2]),TRUE);
+#ifndef lint
+       value = (double)do_spair(stab,stab2,arglast);
+#else
+       (void)do_spair(stab,stab2,arglast);
+#endif
+       goto donumset;
+    case O_SHUTDOWN:
+       if ((arg[1].arg_type & A_MASK) == A_WORD)
+           stab = arg[1].arg_ptr.arg_stab;
+       else
+           stab = stabent(str_get(st[1]),TRUE);
+#ifndef lint
+       value = (double)do_shutdown(stab,arglast);
+#else
+       (void)do_shutdown(stab,arglast);
+#endif
+       goto donumset;
+    case O_GSOCKOPT:
+    case O_SSOCKOPT:
+       if ((arg[1].arg_type & A_MASK) == A_WORD)
+           stab = arg[1].arg_ptr.arg_stab;
+       else
+           stab = stabent(str_get(st[1]),TRUE);
+       sp = do_sopt(optype,stab,arglast);
+       goto array_return;
+    case O_GETSOCKNAME:
+    case O_GETPEERNAME:
+       if ((arg[1].arg_type & A_MASK) == A_WORD)
+           stab = arg[1].arg_ptr.arg_stab;
+       else
+           stab = stabent(str_get(st[1]),TRUE);
+       if (!stab)
+           goto say_undef;
+       sp = do_getsockname(optype,stab,arglast);
+       goto array_return;
+
+#else /* HAS_SOCKET not defined */
+    case O_SOCKET:
+    case O_BIND:
+    case O_CONNECT:
+    case O_LISTEN:
+    case O_ACCEPT:
+    case O_SOCKPAIR:
+    case O_GHBYNAME:
+    case O_GHBYADDR:
+    case O_GHOSTENT:
+    case O_GNBYNAME:
+    case O_GNBYADDR:
+    case O_GNETENT:
+    case O_GPBYNAME:
+    case O_GPBYNUMBER:
+    case O_GPROTOENT:
+    case O_GSBYNAME:
+    case O_GSBYPORT:
+    case O_GSERVENT:
+    case O_SHOSTENT:
+    case O_SNETENT:
+    case O_SPROTOENT:
+    case O_SSERVENT:
+    case O_EHOSTENT:
+    case O_ENETENT:
+    case O_EPROTOENT:
+    case O_ESERVENT:
+    case O_SHUTDOWN:
+    case O_GSOCKOPT:
+    case O_SSOCKOPT:
+    case O_GETSOCKNAME:
+    case O_GETPEERNAME:
+      badsock:
+       fatal("Unsupported socket function");
+#endif /* HAS_SOCKET */
+    case O_SSELECT:
+#ifdef HAS_SELECT
+       sp = do_select(gimme,arglast);
+       goto array_return;
+#else
+       fatal("select not implemented");
+#endif
+    case O_FILENO:
+       if (maxarg < 1)
+           goto say_undef;
+       if ((arg[1].arg_type & A_MASK) == A_WORD)
+           stab = arg[1].arg_ptr.arg_stab;
+       else
+           stab = stabent(str_get(st[1]),TRUE);
+       if (!stab || !(stio = stab_io(stab)) || !(fp = stio->ifp))
+           goto say_undef;
+       value = fileno(fp);
+       goto donumset;
+    case O_BINMODE:
+       if (maxarg < 1)
+           goto say_undef;
+       if ((arg[1].arg_type & A_MASK) == A_WORD)
+           stab = arg[1].arg_ptr.arg_stab;
+       else
+           stab = stabent(str_get(st[1]),TRUE);
+       if (!stab || !(stio = stab_io(stab)) || !(fp = stio->ifp))
+           goto say_undef;
+#ifdef DOSISH
+#ifdef atarist
+       if(fflush(fp))
+          str_set(str, No);
+       else
+       {
+           fp->_flag |= _IOBIN;
+           str_set(str, Yes);
+       }
+#else
+       str_set(str, (setmode(fileno(fp), O_BINARY) != -1) ? Yes : No);
+#endif
+#else
+       str_set(str, Yes);
+#endif
+       STABSET(str);
+       break;
+    case O_VEC:
+       sp = do_vec(str == st[1], arg->arg_ptr.arg_str, arglast);
+       goto array_return;
+    case O_GPWNAM:
+    case O_GPWUID:
+    case O_GPWENT:
+#ifdef HAS_PASSWD
+       sp = do_gpwent(optype,
+         gimme,arglast);
+       goto array_return;
+    case O_SPWENT:
+       value = (double) setpwent();
+       goto donumset;
+    case O_EPWENT:
+       value = (double) endpwent();
+       goto donumset;
+#else
+    case O_EPWENT:
+    case O_SPWENT:
+       fatal("Unsupported password function");
+       break;
+#endif
+    case O_GGRNAM:
+    case O_GGRGID:
+    case O_GGRENT:
+#ifdef HAS_GROUP
+       sp = do_ggrent(optype,
+         gimme,arglast);
+       goto array_return;
+    case O_SGRENT:
+       value = (double) setgrent();
+       goto donumset;
+    case O_EGRENT:
+       value = (double) endgrent();
+       goto donumset;
+#else
+    case O_EGRENT:
+    case O_SGRENT:
+       fatal("Unsupported group function");
+       break;
+#endif
+    case O_GETLOGIN:
+#ifdef HAS_GETLOGIN
+       if (!(tmps = getlogin()))
+           goto say_undef;
+       str_set(str,tmps);
+#else
+       fatal("Unsupported function getlogin");
+#endif
+       break;
+    case O_OPEN_DIR:
+    case O_READDIR:
+    case O_TELLDIR:
+    case O_SEEKDIR:
+    case O_REWINDDIR:
+    case O_CLOSEDIR:
+       if (maxarg < 1)
+           goto say_undef;
+       if ((arg[1].arg_type & A_MASK) == A_WORD)
+           stab = arg[1].arg_ptr.arg_stab;
+       else
+           stab = stabent(str_get(st[1]),TRUE);
+       if (!stab)
+           goto say_undef;
+       sp = do_dirop(optype,stab,gimme,arglast);
+       goto array_return;
+    case O_SYSCALL:
+       value = (double)do_syscall(arglast);
+       goto donumset;
+    case O_PIPE_OP:
+#ifdef HAS_PIPE
+       if ((arg[1].arg_type & A_MASK) == A_WORD)
+           stab = arg[1].arg_ptr.arg_stab;
+       else
+           stab = stabent(str_get(st[1]),TRUE);
+       if ((arg[2].arg_type & A_MASK) == A_WORD)
+           stab2 = arg[2].arg_ptr.arg_stab;
+       else
+           stab2 = stabent(str_get(st[2]),TRUE);
+       do_pipe(str,stab,stab2);
+       STABSET(str);
+#else
+       fatal("Unsupported function pipe");
+#endif
+       break;
+    }
+
+  normal_return:
+    st[1] = str;
+#ifdef DEBUGGING
+    if (debug) {
+       dlevel--;
+       if (debug & 8)
+           deb("%s RETURNS \"%s\"\n",opname[optype],str_get(str));
+    }
+#endif
+    stack_ary = stack->ary_array;
+    stack_max = stack_ary + stack->ary_max;
+    stack_sp = stack_ary + arglast[0] + 1;
+    return arglast[0] + 1;
+}
diff --git a/ext/dbm/SDBM_File.c.bak b/ext/dbm/SDBM_File.c.bak
new file mode 100644 (file)
index 0000000..06fedb3
--- /dev/null
@@ -0,0 +1,267 @@
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+#include "ext/dbm/sdbm/sdbm.h"
+
+typedef DBM* SDBM_File;
+#define sdbm_new(dbtype,filename,flags,mode) sdbm_open(filename,flags,mode)
+#define nextkey(db,key) sdbm_nextkey(db)
+
+static int
+XS_SDBM_File_sdbm_new(ix, sp, items)
+register int ix;
+register int sp;
+register int items;
+{
+    if (items < 4 || items > 4) {
+       croak("Usage: SDBM_File::new(dbtype, filename, flags, mode)");
+    }
+    {
+       char *  dbtype = SvPV(ST(1),na);
+       char *  filename = SvPV(ST(2),na);
+       int     flags = (int)SvIV(ST(3));
+       int     mode = (int)SvIV(ST(4));
+       SDBM_File       RETVAL;
+
+       RETVAL = sdbm_new(dbtype, filename, flags, mode);
+       ST(0) = sv_mortalcopy(&sv_undef);
+       sv_setptrobj(ST(0), RETVAL, "SDBM_File");
+    }
+    return sp;
+}
+
+static int
+XS_SDBM_File_sdbm_DESTROY(ix, sp, items)
+register int ix;
+register int sp;
+register int items;
+{
+    if (items < 1 || items > 1) {
+       croak("Usage: SDBM_File::DESTROY(db)");
+    }
+    {
+       SDBM_File       db;
+
+       if (SvROK(ST(1)))
+           db = (SDBM_File)(unsigned long)SvNV((SV*)SvRV(ST(1)));
+       else
+           croak("db is not a reference");
+       sdbm_close(db);
+    }
+    return sp;
+}
+
+static int
+XS_SDBM_File_sdbm_fetch(ix, sp, items)
+register int ix;
+register int sp;
+register int items;
+{
+    if (items < 2 || items > 2) {
+       croak("Usage: SDBM_File::fetch(db, key)");
+    }
+    {
+       SDBM_File       db;
+       datum   key;
+       datum   RETVAL;
+
+       if (sv_isa(ST(1), "SDBM_File"))
+           db = (SDBM_File)(unsigned long)SvNV((SV*)SvRV(ST(1)));
+       else
+           croak("db is not of type SDBM_File");
+
+       key.dptr = SvPV(ST(2), key.dsize);;
+
+       RETVAL = sdbm_fetch(db, key);
+       ST(0) = sv_mortalcopy(&sv_undef);
+       sv_setpvn(ST(0), RETVAL.dptr, RETVAL.dsize);
+    }
+    return sp;
+}
+
+static int
+XS_SDBM_File_sdbm_store(ix, sp, items)
+register int ix;
+register int sp;
+register int items;
+{
+    if (items < 3 || items > 4) {
+       croak("Usage: SDBM_File::store(db, key, value, flags = DBM_REPLACE)");
+    }
+    {
+       SDBM_File       db;
+       datum   key;
+       datum   value;
+       int     flags;
+       int     RETVAL;
+
+       if (sv_isa(ST(1), "SDBM_File"))
+           db = (SDBM_File)(unsigned long)SvNV((SV*)SvRV(ST(1)));
+       else
+           croak("db is not of type SDBM_File");
+
+       key.dptr = SvPV(ST(2), key.dsize);;
+
+       value.dptr = SvPV(ST(3), value.dsize);;
+
+       if (items < 4)
+           flags = DBM_REPLACE;
+       else {
+           flags = (int)SvIV(ST(4));
+       }
+
+       RETVAL = sdbm_store(db, key, value, flags);
+       ST(0) = sv_mortalcopy(&sv_undef);
+       sv_setiv(ST(0), (I32)RETVAL);
+    }
+    return sp;
+}
+
+static int
+XS_SDBM_File_sdbm_delete(ix, sp, items)
+register int ix;
+register int sp;
+register int items;
+{
+    if (items < 2 || items > 2) {
+       croak("Usage: SDBM_File::delete(db, key)");
+    }
+    {
+       SDBM_File       db;
+       datum   key;
+       int     RETVAL;
+
+       if (sv_isa(ST(1), "SDBM_File"))
+           db = (SDBM_File)(unsigned long)SvNV((SV*)SvRV(ST(1)));
+       else
+           croak("db is not of type SDBM_File");
+
+       key.dptr = SvPV(ST(2), key.dsize);;
+
+       RETVAL = sdbm_delete(db, key);
+       ST(0) = sv_mortalcopy(&sv_undef);
+       sv_setiv(ST(0), (I32)RETVAL);
+    }
+    return sp;
+}
+
+static int
+XS_SDBM_File_sdbm_firstkey(ix, sp, items)
+register int ix;
+register int sp;
+register int items;
+{
+    if (items < 1 || items > 1) {
+       croak("Usage: SDBM_File::firstkey(db)");
+    }
+    {
+       SDBM_File       db;
+       datum   RETVAL;
+
+       if (sv_isa(ST(1), "SDBM_File"))
+           db = (SDBM_File)(unsigned long)SvNV((SV*)SvRV(ST(1)));
+       else
+           croak("db is not of type SDBM_File");
+
+       RETVAL = sdbm_firstkey(db);
+       ST(0) = sv_mortalcopy(&sv_undef);
+       sv_setpvn(ST(0), RETVAL.dptr, RETVAL.dsize);
+    }
+    return sp;
+}
+
+static int
+XS_SDBM_File_nextkey(ix, sp, items)
+register int ix;
+register int sp;
+register int items;
+{
+    if (items < 2 || items > 2) {
+       croak("Usage: SDBM_File::nextkey(db, key)");
+    }
+    {
+       SDBM_File       db;
+       datum   key;
+       datum   RETVAL;
+
+       if (sv_isa(ST(1), "SDBM_File"))
+           db = (SDBM_File)(unsigned long)SvNV((SV*)SvRV(ST(1)));
+       else
+           croak("db is not of type SDBM_File");
+
+       key.dptr = SvPV(ST(2), key.dsize);;
+
+       RETVAL = nextkey(db, key);
+       ST(0) = sv_mortalcopy(&sv_undef);
+       sv_setpvn(ST(0), RETVAL.dptr, RETVAL.dsize);
+    }
+    return sp;
+}
+
+static int
+XS_SDBM_File_sdbm_error(ix, sp, items)
+register int ix;
+register int sp;
+register int items;
+{
+    if (items < 1 || items > 1) {
+       croak("Usage: SDBM_File::error(db)");
+    }
+    {
+       SDBM_File       db;
+       int     RETVAL;
+
+       if (sv_isa(ST(1), "SDBM_File"))
+           db = (SDBM_File)(unsigned long)SvNV((SV*)SvRV(ST(1)));
+       else
+           croak("db is not of type SDBM_File");
+
+       RETVAL = sdbm_error(db);
+       ST(0) = sv_mortalcopy(&sv_undef);
+       sv_setiv(ST(0), (I32)RETVAL);
+    }
+    return sp;
+}
+
+static int
+XS_SDBM_File_sdbm_clearerr(ix, sp, items)
+register int ix;
+register int sp;
+register int items;
+{
+    if (items < 1 || items > 1) {
+       croak("Usage: SDBM_File::clearerr(db)");
+    }
+    {
+       SDBM_File       db;
+       int     RETVAL;
+
+       if (sv_isa(ST(1), "SDBM_File"))
+           db = (SDBM_File)(unsigned long)SvNV((SV*)SvRV(ST(1)));
+       else
+           croak("db is not of type SDBM_File");
+
+       RETVAL = sdbm_clearerr(db);
+       ST(0) = sv_mortalcopy(&sv_undef);
+       sv_setiv(ST(0), (I32)RETVAL);
+    }
+    return sp;
+}
+
+int boot_SDBM_File(ix,sp,items)
+int ix;
+int sp;
+int items;
+{
+    char* file = __FILE__;
+
+    newXSUB("SDBM_File::new", 0, XS_SDBM_File_sdbm_new, file);
+    newXSUB("SDBM_File::DESTROY", 0, XS_SDBM_File_sdbm_DESTROY, file);
+    newXSUB("SDBM_File::fetch", 0, XS_SDBM_File_sdbm_fetch, file);
+    newXSUB("SDBM_File::store", 0, XS_SDBM_File_sdbm_store, file);
+    newXSUB("SDBM_File::delete", 0, XS_SDBM_File_sdbm_delete, file);
+    newXSUB("SDBM_File::firstkey", 0, XS_SDBM_File_sdbm_firstkey, file);
+    newXSUB("SDBM_File::nextkey", 0, XS_SDBM_File_nextkey, file);
+    newXSUB("SDBM_File::error", 0, XS_SDBM_File_sdbm_error, file);
+    newXSUB("SDBM_File::clearerr", 0, XS_SDBM_File_sdbm_clearerr, file);
+}
index 13147fa..a6b0e5f 100644 (file)
@@ -14,7 +14,8 @@ FATALFUNC             T_OPAQUEPTR
 
 INPUT
 T_DATUM
-       $var.dptr = SvPV($arg, $var.dsize);
+       $var.dptr = SvPV($arg, na);
+       $var.dsize = (int)na;
 T_GDATUM
        UNIMPLEMENTED
 OUTPUT
index 38a798c..d514f81 100644 (file)
@@ -5,9 +5,9 @@
 #include "XSUB.h"
 
 static int
-XS_DynamicLoader_bootstrap(ix, sp, items)
+XS_DynamicLoader_bootstrap(ix, ax, items)
 register int ix;
-register int sp;
+register int ax;
 register int items;
 {
     if (items < 1 || items > 1) {
@@ -39,7 +39,7 @@ register int items;
 
        ST(0) = sv_mortalcopy(&sv_yes);
     }
-    return sp;
+    return ax;
 }
 
 int
index 7981f88..0c48b9e 100644 (file)
@@ -1,7 +1,45 @@
 #include "EXTERN.h"
 #include "perl.h"
 #include "XSUB.h"
+
+#include <ctype.h>
+#include <dirent.h>
+#include <errno.h>
+#include <fcntl.h>
+#ifdef I_FLOAT
+#include <float.h>
+#endif
+#include <grp.h>
+#include <limits.h>
+#include <locale.h>
+#include <math.h>
+#include <pwd.h>
+#include <setjmp.h>
+#include <signal.h>
+#ifdef I_STDARG
+#include <stdarg.h>
+#endif
+#ifdef I_STDDEF
+#include <stddef.h>
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/times.h>
+#include <sys/types.h>
 #include <sys/utsname.h>
+#include <sys/wait.h>
+#ifndef CR3
+#include <termios.h>
+#endif
+#include <time.h>
+#include <unistd.h>
+#include <utime.h>
+
+typedef int SysRet;
+typedef sigset_t* POSIX__SigSet;
+typedef HV* POSIX__SigAction;
 
 #define HAS_UNAME
 
@@ -50,20 +88,2390 @@ char *s;
     return -1;
 }
 
-MODULE = POSIX PACKAGE = POSIX
+int constant(name, arg)
+char *name;
+int arg;
+{
+    errno = 0;
+    switch (*name) {
+    case 'A':
+       if (strEQ(name, "ARG_MAX"))
+#ifdef ARG_MAX
+           return ARG_MAX;
+#else
+           goto not_there;
+#endif
+       break;
+    case 'B':
+       if (strEQ(name, "BUFSIZ"))
+#ifdef BUFSIZ
+           return BUFSIZ;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "BRKINT"))
+#ifdef BRKINT
+           return BRKINT;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "B9600"))
+#ifdef B9600
+           return B9600;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "B19200"))
+#ifdef B19200
+           return B19200;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "B38400"))
+#ifdef B38400
+           return B38400;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "B0"))
+#ifdef B0
+           return B0;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "B110"))
+#ifdef B110
+           return B110;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "B1200"))
+#ifdef B1200
+           return B1200;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "B134"))
+#ifdef B134
+           return B134;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "B150"))
+#ifdef B150
+           return B150;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "B1800"))
+#ifdef B1800
+           return B1800;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "B200"))
+#ifdef B200
+           return B200;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "B2400"))
+#ifdef B2400
+           return B2400;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "B300"))
+#ifdef B300
+           return B300;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "B4800"))
+#ifdef B4800
+           return B4800;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "B50"))
+#ifdef B50
+           return B50;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "B600"))
+#ifdef B600
+           return B600;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "B75"))
+#ifdef B75
+           return B75;
+#else
+           goto not_there;
+#endif
+       break;
+    case 'C':
+       if (strEQ(name, "CHAR_BIT"))
+#ifdef CHAR_BIT
+           return CHAR_BIT;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "CHAR_MAX"))
+#ifdef CHAR_MAX
+           return CHAR_MAX;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "CHAR_MIN"))
+#ifdef CHAR_MIN
+           return CHAR_MIN;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "CHILD_MAX"))
+#ifdef CHILD_MAX
+           return CHILD_MAX;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "CLK_TCK"))
+#ifdef CLK_TCK
+           return CLK_TCK;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "CLOCAL"))
+#ifdef CLOCAL
+           return CLOCAL;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "CLOCKS_PER_SEC"))
+#ifdef CLOCKS_PER_SEC
+           return CLOCKS_PER_SEC;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "CREAD"))
+#ifdef CREAD
+           return CREAD;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "CS5"))
+#ifdef CS5
+           return CS5;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "CS6"))
+#ifdef CS6
+           return CS6;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "CS7"))
+#ifdef CS7
+           return CS7;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "CS8"))
+#ifdef CS8
+           return CS8;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "CSIZE"))
+#ifdef CSIZE
+           return CSIZE;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "CSTOPB"))
+#ifdef CSTOPB
+           return CSTOPB;
+#else
+           goto not_there;
+#endif
+       break;
+    case 'D':
+       if (strEQ(name, "DBL_MAX"))
+#ifdef DBL_MAX
+           return DBL_MAX;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "DBL_MIN"))
+#ifdef DBL_MIN
+           return DBL_MIN;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "DBL_DIG"))
+#ifdef DBL_DIG
+           return DBL_DIG;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "DBL_EPSILON"))
+#ifdef DBL_EPSILON
+           return DBL_EPSILON;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "DBL_MANT_DIG"))
+#ifdef DBL_MANT_DIG
+           return DBL_MANT_DIG;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "DBL_MAX_10_EXP"))
+#ifdef DBL_MAX_10_EXP
+           return DBL_MAX_10_EXP;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "DBL_MAX_EXP"))
+#ifdef DBL_MAX_EXP
+           return DBL_MAX_EXP;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "DBL_MIN_10_EXP"))
+#ifdef DBL_MIN_10_EXP
+           return DBL_MIN_10_EXP;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "DBL_MIN_EXP"))
+#ifdef DBL_MIN_EXP
+           return DBL_MIN_EXP;
+#else
+           goto not_there;
+#endif
+       break;
+    case 'E':
+       switch (name[1]) {
+       case 'A':
+           if (strEQ(name, "EACCES"))
+#ifdef EACCES
+               return EACCES;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "EAGAIN"))
+#ifdef EAGAIN
+               return EAGAIN;
+#else
+               goto not_there;
+#endif
+           break;
+       case 'B':
+           if (strEQ(name, "EBADF"))
+#ifdef EBADF
+               return EBADF;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "EBUSY"))
+#ifdef EBUSY
+               return EBUSY;
+#else
+               goto not_there;
+#endif
+           break;
+       case 'C':
+           if (strEQ(name, "ECHILD"))
+#ifdef ECHILD
+               return ECHILD;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "ECHO"))
+#ifdef ECHO
+               return ECHO;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "ECHOE"))
+#ifdef ECHOE
+               return ECHOE;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "ECHOK"))
+#ifdef ECHOK
+               return ECHOK;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "ECHONL"))
+#ifdef ECHONL
+               return ECHONL;
+#else
+               goto not_there;
+#endif
+           break;
+       case 'D':
+           if (strEQ(name, "EDEADLK"))
+#ifdef EDEADLK
+               return EDEADLK;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "EDOM"))
+#ifdef EDOM
+               return EDOM;
+#else
+               goto not_there;
+#endif
+           break;
+       case 'E':
+           if (strEQ(name, "EEXIST"))
+#ifdef EEXIST
+               return EEXIST;
+#else
+               goto not_there;
+#endif
+           break;
+       case 'F':
+           if (strEQ(name, "EFAULT"))
+#ifdef EFAULT
+               return EFAULT;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "EFBIG"))
+#ifdef EFBIG
+               return EFBIG;
+#else
+               goto not_there;
+#endif
+           break;
+       case 'I':
+           if (strEQ(name, "EINTR"))
+#ifdef EINTR
+               return EINTR;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "EINVAL"))
+#ifdef EINVAL
+               return EINVAL;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "EIO"))
+#ifdef EIO
+               return EIO;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "EISDIR"))
+#ifdef EISDIR
+               return EISDIR;
+#else
+               goto not_there;
+#endif
+           break;
+       case 'M':
+           if (strEQ(name, "EMFILE"))
+#ifdef EMFILE
+               return EMFILE;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "EMLINK"))
+#ifdef EMLINK
+               return EMLINK;
+#else
+               goto not_there;
+#endif
+           break;
+       case 'N':
+           if (strEQ(name, "ENOMEM"))
+#ifdef ENOMEM
+               return ENOMEM;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "ENOSPC"))
+#ifdef ENOSPC
+               return ENOSPC;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "ENOEXEC"))
+#ifdef ENOEXEC
+               return ENOEXEC;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "ENOTTY"))
+#ifdef ENOTTY
+               return ENOTTY;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "ENOTDIR"))
+#ifdef ENOTDIR
+               return ENOTDIR;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "ENOTEMPTY"))
+#ifdef ENOTEMPTY
+               return ENOTEMPTY;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "ENFILE"))
+#ifdef ENFILE
+               return ENFILE;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "ENODEV"))
+#ifdef ENODEV
+               return ENODEV;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "ENOENT"))
+#ifdef ENOENT
+               return ENOENT;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "ENOLCK"))
+#ifdef ENOLCK
+               return ENOLCK;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "ENOSYS"))
+#ifdef ENOSYS
+               return ENOSYS;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "ENXIO"))
+#ifdef ENXIO
+               return ENXIO;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "ENAMETOOLONG"))
+#ifdef ENAMETOOLONG
+               return ENAMETOOLONG;
+#else
+               goto not_there;
+#endif
+           break;
+       case 'O':
+           if (strEQ(name, "EOF"))
+#ifdef EOF
+               return EOF;
+#else
+               goto not_there;
+#endif
+           break;
+       case 'P':
+           if (strEQ(name, "EPERM"))
+#ifdef EPERM
+               return EPERM;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "EPIPE"))
+#ifdef EPIPE
+               return EPIPE;
+#else
+               goto not_there;
+#endif
+           break;
+       case 'R':
+           if (strEQ(name, "ERANGE"))
+#ifdef ERANGE
+               return ERANGE;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "EROFS"))
+#ifdef EROFS
+               return EROFS;
+#else
+               goto not_there;
+#endif
+           break;
+       case 'S':
+           if (strEQ(name, "ESPIPE"))
+#ifdef ESPIPE
+               return ESPIPE;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "ESRCH"))
+#ifdef ESRCH
+               return ESRCH;
+#else
+               goto not_there;
+#endif
+           break;
+       case 'X':
+           if (strEQ(name, "EXIT_FAILURE"))
+#ifdef EXIT_FAILURE
+               return EXIT_FAILURE;
+#else
+               return 1;
+#endif
+           if (strEQ(name, "EXIT_SUCCESS"))
+#ifdef EXIT_SUCCESS
+               return EXIT_SUCCESS;
+#else
+               return 0;
+#endif
+           if (strEQ(name, "EXDEV"))
+#ifdef EXDEV
+               return EXDEV;
+#else
+               goto not_there;
+#endif
+           break;
+       }
+       if (strEQ(name, "E2BIG"))
+#ifdef E2BIG
+           return E2BIG;
+#else
+           goto not_there;
+#endif
+       break;
+    case 'F':
+       if (strnEQ(name, "FLT_", 4)) {
+           if (strEQ(name, "FLT_MAX"))
+#ifdef FLT_MAX
+               return FLT_MAX;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "FLT_MIN"))
+#ifdef FLT_MIN
+               return FLT_MIN;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "FLT_ROUNDS"))
+#ifdef FLT_ROUNDS
+               return FLT_ROUNDS;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "FLT_DIG"))
+#ifdef FLT_DIG
+               return FLT_DIG;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "FLT_EPSILON"))
+#ifdef FLT_EPSILON
+               return FLT_EPSILON;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "FLT_MANT_DIG"))
+#ifdef FLT_MANT_DIG
+               return FLT_MANT_DIG;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "FLT_MAX_10_EXP"))
+#ifdef FLT_MAX_10_EXP
+               return FLT_MAX_10_EXP;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "FLT_MAX_EXP"))
+#ifdef FLT_MAX_EXP
+               return FLT_MAX_EXP;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "FLT_MIN_10_EXP"))
+#ifdef FLT_MIN_10_EXP
+               return FLT_MIN_10_EXP;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "FLT_MIN_EXP"))
+#ifdef FLT_MIN_EXP
+               return FLT_MIN_EXP;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "FLT_RADIX"))
+#ifdef FLT_RADIX
+               return FLT_RADIX;
+#else
+               goto not_there;
+#endif
+           break;
+       }
+       if (strnEQ(name, "F_", 2)) {
+           if (strEQ(name, "F_DUPFD"))
+#ifdef F_DUPFD
+               return F_DUPFD;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "F_GETFD"))
+#ifdef F_GETFD
+               return F_GETFD;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "F_GETFL"))
+#ifdef F_GETFL
+               return F_GETFL;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "F_GETLK"))
+#ifdef F_GETLK
+               return F_GETLK;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "F_OK"))
+#ifdef F_OK
+               return F_OK;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "F_RDLCK"))
+#ifdef F_RDLCK
+               return F_RDLCK;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "F_SETFD"))
+#ifdef F_SETFD
+               return F_SETFD;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "F_SETFL"))
+#ifdef F_SETFL
+               return F_SETFL;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "F_SETLK"))
+#ifdef F_SETLK
+               return F_SETLK;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "F_SETLKW"))
+#ifdef F_SETLKW
+               return F_SETLKW;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "F_UNLCK"))
+#ifdef F_UNLCK
+               return F_UNLCK;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "F_WRLCK"))
+#ifdef F_WRLCK
+               return F_WRLCK;
+#else
+               goto not_there;
+#endif
+           break;
+       }
+       if (strEQ(name, "FD_CLOEXEC")) return FD_CLOEXEC;
+       if (strEQ(name, "FILENAME_MAX"))
+#ifdef FILENAME_MAX
+           return FILENAME_MAX;
+#else
+           goto not_there;
+#endif
+       break;
+    case 'H':
+       if (strEQ(name, "HUGE_VAL"))
+#ifdef HUGE_VAL
+           return HUGE_VAL;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "HUPCL"))
+#ifdef HUPCL
+           return HUPCL;
+#else
+           goto not_there;
+#endif
+       break;
+    case 'I':
+       if (strEQ(name, "INT_MAX"))
+#ifdef INT_MAX
+           return INT_MAX;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "INT_MIN"))
+#ifdef INT_MIN
+           return INT_MIN;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "ICANON"))
+#ifdef ICANON
+           return ICANON;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "ICRNL"))
+#ifdef ICRNL
+           return ICRNL;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "IEXTEN"))
+#ifdef IEXTEN
+           return IEXTEN;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "IGNBRK"))
+#ifdef IGNBRK
+           return IGNBRK;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "IGNCR"))
+#ifdef IGNCR
+           return IGNCR;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "IGNPAR"))
+#ifdef IGNPAR
+           return IGNPAR;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "INLCR"))
+#ifdef INLCR
+           return INLCR;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "INPCK"))
+#ifdef INPCK
+           return INPCK;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "ISIG"))
+#ifdef ISIG
+           return ISIG;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "ISTRIP"))
+#ifdef ISTRIP
+           return ISTRIP;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "IXOFF"))
+#ifdef IXOFF
+           return IXOFF;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "IXON"))
+#ifdef IXON
+           return IXON;
+#else
+           goto not_there;
+#endif
+       break;
+    case 'L':
+       if (strnEQ(name, "LC_", 3)) {
+           if (strEQ(name, "LC_ALL"))
+#ifdef LC_ALL
+               return LC_ALL;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "LC_COLLATE"))
+#ifdef LC_COLLATE
+               return LC_COLLATE;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "LC_CTYPE"))
+#ifdef LC_CTYPE
+               return LC_CTYPE;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "LC_MONETARY"))
+#ifdef LC_MONETARY
+               return LC_MONETARY;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "LC_NUMERIC"))
+#ifdef LC_NUMERIC
+               return LC_NUMERIC;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "LC_TIME"))
+#ifdef LC_TIME
+               return LC_TIME;
+#else
+               goto not_there;
+#endif
+           break;
+       }
+       if (strnEQ(name, "LDBL_", 5)) {
+           if (strEQ(name, "LDBL_MAX"))
+#ifdef LDBL_MAX
+               return LDBL_MAX;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "LDBL_MIN"))
+#ifdef LDBL_MIN
+               return LDBL_MIN;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "LDBL_DIG"))
+#ifdef LDBL_DIG
+               return LDBL_DIG;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "LDBL_EPSILON"))
+#ifdef LDBL_EPSILON
+               return LDBL_EPSILON;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "LDBL_MANT_DIG"))
+#ifdef LDBL_MANT_DIG
+               return LDBL_MANT_DIG;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "LDBL_MAX_10_EXP"))
+#ifdef LDBL_MAX_10_EXP
+               return LDBL_MAX_10_EXP;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "LDBL_MAX_EXP"))
+#ifdef LDBL_MAX_EXP
+               return LDBL_MAX_EXP;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "LDBL_MIN_10_EXP"))
+#ifdef LDBL_MIN_10_EXP
+               return LDBL_MIN_10_EXP;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "LDBL_MIN_EXP"))
+#ifdef LDBL_MIN_EXP
+               return LDBL_MIN_EXP;
+#else
+               goto not_there;
+#endif
+           break;
+       }
+       if (strnEQ(name, "L_", 2)) {
+           if (strEQ(name, "L_ctermid"))
+#ifdef L_ctermid
+               return L_ctermid;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "L_cuserid"))
+#ifdef L_cuserid
+               return L_cuserid;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "L_tmpname"))
+#ifdef L_tmpname
+               return L_tmpname;
+#else
+               goto not_there;
+#endif
+           break;
+       }
+       if (strEQ(name, "LONG_MAX"))
+#ifdef LONG_MAX
+           return LONG_MAX;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "LONG_MIN"))
+#ifdef LONG_MIN
+           return LONG_MIN;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "LINK_MAX"))
+#ifdef LINK_MAX
+           return LINK_MAX;
+#else
+           goto not_there;
+#endif
+       break;
+    case 'M':
+       if (strEQ(name, "MAX_CANON"))
+#ifdef MAX_CANON
+           return MAX_CANON;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "MAX_INPUT"))
+#ifdef MAX_INPUT
+           return MAX_INPUT;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "MB_CUR_MAX"))
+#ifdef MB_CUR_MAX
+           return MB_CUR_MAX;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "MB_LEN_MAX"))
+#ifdef MB_LEN_MAX
+           return MB_LEN_MAX;
+#else
+           goto not_there;
+#endif
+       break;
+    case 'N':
+       if (strEQ(name, "NULL")) return NULL;
+       if (strEQ(name, "NAME_MAX"))
+#ifdef NAME_MAX
+           return NAME_MAX;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "NCCS"))
+#ifdef NCCS
+           return NCCS;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "NGROUPS_MAX"))
+#ifdef NGROUPS_MAX
+           return NGROUPS_MAX;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "NOFLSH"))
+#ifdef NOFLSH
+           return NOFLSH;
+#else
+           goto not_there;
+#endif
+       break;
+    case 'O':
+       if (strnEQ(name, "O_", 2)) {
+           if (strEQ(name, "O_APPEND"))
+#ifdef O_APPEND
+               return O_APPEND;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "O_CREAT"))
+#ifdef O_CREAT
+               return O_CREAT;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "O_TRUNC"))
+#ifdef O_TRUNC
+               return O_TRUNC;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "O_RDONLY"))
+#ifdef O_RDONLY
+               return O_RDONLY;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "O_RDWR"))
+#ifdef O_RDWR
+               return O_RDWR;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "O_WRONLY"))
+#ifdef O_WRONLY
+               return O_WRONLY;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "O_EXCL"))
+#ifdef O_EXCL
+               return O_EXCL;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "O_NOCTTY"))
+#ifdef O_NOCTTY
+               return O_NOCTTY;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "O_NONBLOCK"))
+#ifdef O_NONBLOCK
+               return O_NONBLOCK;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "O_ACCMODE"))
+#ifdef O_ACCMODE
+               return O_ACCMODE;
+#else
+               goto not_there;
+#endif
+           break;
+       }
+       if (strEQ(name, "OPEN_MAX"))
+#ifdef OPEN_MAX
+           return OPEN_MAX;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "OPOST"))
+#ifdef OPOST
+           return OPOST;
+#else
+           goto not_there;
+#endif
+       break;
+    case 'P':
+       if (strEQ(name, "PATH_MAX"))
+#ifdef PATH_MAX
+           return PATH_MAX;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "PARENB"))
+#ifdef PARENB
+           return PARENB;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "PARMRK"))
+#ifdef PARMRK
+           return PARMRK;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "PARODD"))
+#ifdef PARODD
+           return PARODD;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "PIPE_BUF"))
+#ifdef PIPE_BUF
+           return PIPE_BUF;
+#else
+           goto not_there;
+#endif
+       break;
+    case 'R':
+       if (strEQ(name, "RAND_MAX"))
+#ifdef RAND_MAX
+           return RAND_MAX;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "R_OK"))
+#ifdef R_OK
+           return R_OK;
+#else
+           goto not_there;
+#endif
+       break;
+    case 'S':
+       if (strnEQ(name, "SIG", 3)) {
+           if (name[3] == '_') {
+               if (strEQ(name, "SIG_BLOCK"))
+#ifdef SIG_BLOCK
+                   return SIG_BLOCK;
+#else
+                   goto not_there;
+#endif
+#ifdef SIG_DFL
+               if (strEQ(name, "SIG_DFL")) return (int)SIG_DFL;
+#endif
+#ifdef SIG_ERR
+               if (strEQ(name, "SIG_ERR")) return (int)SIG_ERR;
+#endif
+#ifdef SIG_IGN
+               if (strEQ(name, "SIG_IGN")) return (int)SIG_IGN;
+#endif
+               if (strEQ(name, "SIG_SETMASK"))
+#ifdef SIG_SETMASK
+                   return SIG_SETMASK;
+#else
+                   goto not_there;
+#endif
+               if (strEQ(name, "SIG_UNBLOCK"))
+#ifdef SIG_UNBLOCK
+                   return SIG_UNBLOCK;
+#else
+                   goto not_there;
+#endif
+               break;
+           }
+           if (strEQ(name, "SIGABRT"))
+#ifdef SIGABRT
+               return SIGABRT;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "SIGALRM"))
+#ifdef SIGALRM
+               return SIGALRM;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "SIGCHLD"))
+#ifdef SIGCHLD
+               return SIGCHLD;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "SIGCONT"))
+#ifdef SIGCONT
+               return SIGCONT;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "SIGFPE"))
+#ifdef SIGFPE
+               return SIGFPE;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "SIGHUP"))
+#ifdef SIGHUP
+               return SIGHUP;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "SIGILL"))
+#ifdef SIGILL
+               return SIGILL;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "SIGINT"))
+#ifdef SIGINT
+               return SIGINT;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "SIGKILL"))
+#ifdef SIGKILL
+               return SIGKILL;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "SIGPIPE"))
+#ifdef SIGPIPE
+               return SIGPIPE;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "SIGQUIT"))
+#ifdef SIGQUIT
+               return SIGQUIT;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "SIGSEGV"))
+#ifdef SIGSEGV
+               return SIGSEGV;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "SIGSTOP"))
+#ifdef SIGSTOP
+               return SIGSTOP;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "SIGTERM"))
+#ifdef SIGTERM
+               return SIGTERM;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "SIGTSTP"))
+#ifdef SIGTSTP
+               return SIGTSTP;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "SIGTTIN"))
+#ifdef SIGTTIN
+               return SIGTTIN;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "SIGTTOU"))
+#ifdef SIGTTOU
+               return SIGTTOU;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "SIGUSR1"))
+#ifdef SIGUSR1
+               return SIGUSR1;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "SIGUSR2"))
+#ifdef SIGUSR2
+               return SIGUSR2;
+#else
+               goto not_there;
+#endif
+           break;
+       }
+       if (name[1] == '_') {
+#ifdef S_ISBLK
+           if (strEQ(name, "S_ISBLK")) return S_ISBLK(arg);
+#endif
+#ifdef S_ISCHR
+           if (strEQ(name, "S_ISCHR")) return S_ISCHR(arg);
+#endif
+#ifdef S_ISDIR
+           if (strEQ(name, "S_ISDIR")) return S_ISDIR(arg);
+#endif
+#ifdef S_ISFIFO
+           if (strEQ(name, "S_ISFIFO")) return S_ISFIFO(arg);
+#endif
+#ifdef S_ISREG
+           if (strEQ(name, "S_ISREG")) return S_ISREG(arg);
+#endif
+           if (strEQ(name, "S_ISGID"))
+#ifdef S_ISGID
+               return S_ISGID;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "S_ISUID"))
+#ifdef S_ISUID
+               return S_ISUID;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "S_IRGRP"))
+#ifdef S_IRGRP
+               return S_IRGRP;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "S_IROTH"))
+#ifdef S_IROTH
+               return S_IROTH;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "S_IRUSR"))
+#ifdef S_IRUSR
+               return S_IRUSR;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "S_IRWXG"))
+#ifdef S_IRWXG
+               return S_IRWXG;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "S_IRWXO"))
+#ifdef S_IRWXO
+               return S_IRWXO;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "S_IRWXU"))
+#ifdef S_IRWXU
+               return S_IRWXU;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "S_IWGRP"))
+#ifdef S_IWGRP
+               return S_IWGRP;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "S_IWOTH"))
+#ifdef S_IWOTH
+               return S_IWOTH;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "S_IWUSR"))
+#ifdef S_IWUSR
+               return S_IWUSR;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "S_IXGRP"))
+#ifdef S_IXGRP
+               return S_IXGRP;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "S_IXOTH"))
+#ifdef S_IXOTH
+               return S_IXOTH;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "S_IXUSR"))
+#ifdef S_IXUSR
+               return S_IXUSR;
+#else
+               goto not_there;
+#endif
+           break;
+       }
+       if (strEQ(name, "SEEK_CUR"))
+#ifdef SEEK_CUR
+           return SEEK_CUR;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "SEEK_END"))
+#ifdef SEEK_END
+           return SEEK_END;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "SEEK_SET"))
+#ifdef SEEK_SET
+           return SEEK_SET;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "STREAM_MAX"))
+#ifdef STREAM_MAX
+           return STREAM_MAX;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "SHRT_MAX"))
+#ifdef SHRT_MAX
+           return SHRT_MAX;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "SHRT_MIN"))
+#ifdef SHRT_MIN
+           return SHRT_MIN;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "SA_NOCLDSTOP"))
+#ifdef SA_NOCLDSTOP
+           return SA_NOCLDSTOP;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "SCHAR_MAX"))
+#ifdef SCHAR_MAX
+           return SCHAR_MAX;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "SCHAR_MIN"))
+#ifdef SCHAR_MIN
+           return SCHAR_MIN;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "SSIZE_MAX"))
+#ifdef SSIZE_MAX
+           return SSIZE_MAX;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "STDIN_FILENO"))
+#ifdef STDIN_FILENO
+           return STDIN_FILENO;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "STDOUT_FILENO"))
+#ifdef STDOUT_FILENO
+           return STDOUT_FILENO;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "STRERR_FILENO"))
+#ifdef STRERR_FILENO
+           return STRERR_FILENO;
+#else
+           goto not_there;
+#endif
+       break;
+    case 'T':
+       if (strEQ(name, "TCIFLUSH"))
+#ifdef TCIFLUSH
+           return TCIFLUSH;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "TCIOFF"))
+#ifdef TCIOFF
+           return TCIOFF;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "TCIOFLUSH"))
+#ifdef TCIOFLUSH
+           return TCIOFLUSH;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "TCION"))
+#ifdef TCION
+           return TCION;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "TCOFLUSH"))
+#ifdef TCOFLUSH
+           return TCOFLUSH;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "TCOOFF"))
+#ifdef TCOOFF
+           return TCOOFF;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "TCOON"))
+#ifdef TCOON
+           return TCOON;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "TCSADRAIN"))
+#ifdef TCSADRAIN
+           return TCSADRAIN;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "TCSAFLUSH"))
+#ifdef TCSAFLUSH
+           return TCSAFLUSH;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "TCSANOW"))
+#ifdef TCSANOW
+           return TCSANOW;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "TMP_MAX"))
+#ifdef TMP_MAX
+           return TMP_MAX;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "TOSTOP"))
+#ifdef TOSTOP
+           return TOSTOP;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "TZNAME_MAX"))
+#ifdef TZNAME_MAX
+           return TZNAME_MAX;
+#else
+           goto not_there;
+#endif
+       break;
+    case 'U':
+       if (strEQ(name, "UCHAR_MAX"))
+#ifdef UCHAR_MAX
+           return UCHAR_MAX;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "UINT_MAX"))
+#ifdef UINT_MAX
+           return UINT_MAX;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "ULONG_MAX"))
+#ifdef ULONG_MAX
+           return ULONG_MAX;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "USHRT_MAX"))
+#ifdef USHRT_MAX
+           return USHRT_MAX;
+#else
+           goto not_there;
+#endif
+       break;
+    case 'V':
+       if (strEQ(name, "VEOF"))
+#ifdef VEOF
+           return VEOF;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "VEOL"))
+#ifdef VEOL
+           return VEOL;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "VERASE"))
+#ifdef VERASE
+           return VERASE;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "VINTR"))
+#ifdef VINTR
+           return VINTR;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "VKILL"))
+#ifdef VKILL
+           return VKILL;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "VMIN"))
+#ifdef VMIN
+           return VMIN;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "VQUIT"))
+#ifdef VQUIT
+           return VQUIT;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "VSTART"))
+#ifdef VSTART
+           return VSTART;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "VSTOP"))
+#ifdef VSTOP
+           return VSTOP;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "VSUSP"))
+#ifdef VSUSP
+           return VSUSP;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "VTIME"))
+#ifdef VTIME
+           return VTIME;
+#else
+           goto not_there;
+#endif
+       break;
+    case 'W':
+       if (strEQ(name, "W_OK"))
+#ifdef W_OK
+           return W_OK;
+#else
+           goto not_there;
+#endif
+#ifdef WEXITSTATUS
+       if (strEQ(name, "WEXITSTATUS")) return WEXITSTATUS(arg);
+#endif
+#ifdef WIFEXITED
+       if (strEQ(name, "WIFEXITED")) return WIFEXITED(arg);
+#endif
+#ifdef WIFSIGNALED
+       if (strEQ(name, "WIFSIGNALED")) return WIFSIGNALED(arg);
+#endif
+#ifdef WIFSTOPPED
+       if (strEQ(name, "WIFSTOPPED")) return WIFSTOPPED(arg);
+#endif
+       if (strEQ(name, "WNOHANG"))
+#ifdef WNOHANG
+           return WNOHANG;
+#else
+           goto not_there;
+#endif
+#ifdef WSTOPSIG
+       if (strEQ(name, "WSTOPSIG")) return WSTOPSIG(arg);
+#endif
+#ifdef WTERMSIG
+       if (strEQ(name, "WTERMSIG")) return WTERMSIG(arg);
+#endif
+       if (strEQ(name, "WUNTRACED"))
+#ifdef WUNTRACED
+           return WUNTRACED;
+#else
+           goto not_there;
+#endif
+       break;
+    case 'X':
+       if (strEQ(name, "X_OK"))
+#ifdef X_OK
+           return X_OK;
+#else
+           goto not_there;
+#endif
+       break;
+    case '_':
+       if (strnEQ(name, "_PC_", 4)) {
+           if (strEQ(name, "_PC_CHOWN_RESTRICTED"))
+#ifdef _PC_CHOWN_RESTRICTED
+               return _PC_CHOWN_RESTRICTED;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "_PC_LINK_MAX"))
+#ifdef _PC_LINK_MAX
+               return _PC_LINK_MAX;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "_PC_MAX_CANON"))
+#ifdef _PC_MAX_CANON
+               return _PC_MAX_CANON;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "_PC_MAX_INPUT"))
+#ifdef _PC_MAX_INPUT
+               return _PC_MAX_INPUT;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "_PC_NAME_MAX"))
+#ifdef _PC_NAME_MAX
+               return _PC_NAME_MAX;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "_PC_NO_TRUNC"))
+#ifdef _PC_NO_TRUNC
+               return _PC_NO_TRUNC;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "_PC_PATH_MAX"))
+#ifdef _PC_PATH_MAX
+               return _PC_PATH_MAX;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "_PC_PIPE_BUF"))
+#ifdef _PC_PIPE_BUF
+               return _PC_PIPE_BUF;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "_PC_VDISABLE"))
+#ifdef _PC_VDISABLE
+               return _PC_VDISABLE;
+#else
+               goto not_there;
+#endif
+           break;
+       }
+       if (strnEQ(name, "_POSIX_", 7)) {
+           if (strEQ(name, "_POSIX_ARG_MAX"))
+#ifdef _POSIX_ARG_MAX
+               return _POSIX_ARG_MAX;
+#else
+               return 0;
+#endif
+           if (strEQ(name, "_POSIX_CHILD_MAX"))
+#ifdef _POSIX_CHILD_MAX
+               return _POSIX_CHILD_MAX;
+#else
+               return 0;
+#endif
+           if (strEQ(name, "_POSIX_CHOWN_RESTRICTED"))
+#ifdef _POSIX_CHOWN_RESTRICTED
+               return _POSIX_CHOWN_RESTRICTED;
+#else
+               return 0;
+#endif
+           if (strEQ(name, "_POSIX_JOB_CONTROL"))
+#ifdef _POSIX_JOB_CONTROL
+               return _POSIX_JOB_CONTROL;
+#else
+               return 0;
+#endif
+           if (strEQ(name, "_POSIX_LINK_MAX"))
+#ifdef _POSIX_LINK_MAX
+               return _POSIX_LINK_MAX;
+#else
+               return 0;
+#endif
+           if (strEQ(name, "_POSIX_MAX_CANON"))
+#ifdef _POSIX_MAX_CANON
+               return _POSIX_MAX_CANON;
+#else
+               return 0;
+#endif
+           if (strEQ(name, "_POSIX_MAX_INPUT"))
+#ifdef _POSIX_MAX_INPUT
+               return _POSIX_MAX_INPUT;
+#else
+               return 0;
+#endif
+           if (strEQ(name, "_POSIX_NAME_MAX"))
+#ifdef _POSIX_NAME_MAX
+               return _POSIX_NAME_MAX;
+#else
+               return 0;
+#endif
+           if (strEQ(name, "_POSIX_NGROUPS_MAX"))
+#ifdef _POSIX_NGROUPS_MAX
+               return _POSIX_NGROUPS_MAX;
+#else
+               return 0;
+#endif
+           if (strEQ(name, "_POSIX_NO_TRUNC"))
+#ifdef _POSIX_NO_TRUNC
+               return _POSIX_NO_TRUNC;
+#else
+               return 0;
+#endif
+           if (strEQ(name, "_POSIX_OPEN_MAX"))
+#ifdef _POSIX_OPEN_MAX
+               return _POSIX_OPEN_MAX;
+#else
+               return 0;
+#endif
+           if (strEQ(name, "_POSIX_PATH_MAX"))
+#ifdef _POSIX_PATH_MAX
+               return _POSIX_PATH_MAX;
+#else
+               return 0;
+#endif
+           if (strEQ(name, "_POSIX_PIPE_BUF"))
+#ifdef _POSIX_PIPE_BUF
+               return _POSIX_PIPE_BUF;
+#else
+               return 0;
+#endif
+           if (strEQ(name, "_POSIX_SAVED_IDS"))
+#ifdef _POSIX_SAVED_IDS
+               return _POSIX_SAVED_IDS;
+#else
+               return 0;
+#endif
+           if (strEQ(name, "_POSIX_SSIZE_MAX"))
+#ifdef _POSIX_SSIZE_MAX
+               return _POSIX_SSIZE_MAX;
+#else
+               return 0;
+#endif
+           if (strEQ(name, "_POSIX_STREAM_MAX"))
+#ifdef _POSIX_STREAM_MAX
+               return _POSIX_STREAM_MAX;
+#else
+               return 0;
+#endif
+           if (strEQ(name, "_POSIX_TZNAME_MAX"))
+#ifdef _POSIX_TZNAME_MAX
+               return _POSIX_TZNAME_MAX;
+#else
+               return 0;
+#endif
+           if (strEQ(name, "_POSIX_VDISABLE"))
+#ifdef _POSIX_VDISABLE
+               return _POSIX_VDISABLE;
+#else
+               return 0;
+#endif
+           if (strEQ(name, "_POSIX_VERSION"))
+#ifdef _POSIX_VERSION
+               return _POSIX_VERSION;
+#else
+               return 0;
+#endif
+           break;
+       }
+       if (strnEQ(name, "_SC_", 4)) {
+           if (strEQ(name, "_SC_ARG_MAX"))
+#ifdef _SC_ARG_MAX
+               return _SC_ARG_MAX;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "_SC_CHILD_MAX"))
+#ifdef _SC_CHILD_MAX
+               return _SC_CHILD_MAX;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "_SC_CLK_TCK"))
+#ifdef _SC_CLK_TCK
+               return _SC_CLK_TCK;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "_SC_JOB_CONTROL"))
+#ifdef _SC_JOB_CONTROL
+               return _SC_JOB_CONTROL;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "_SC_NGROUPS_MAX"))
+#ifdef _SC_NGROUPS_MAX
+               return _SC_NGROUPS_MAX;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "_SC_OPEN_MAX"))
+#ifdef _SC_OPEN_MAX
+               return _SC_OPEN_MAX;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "_SC_SAVED_IDS"))
+#ifdef _SC_SAVED_IDS
+               return _SC_SAVED_IDS;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "_SC_STREAM_MAX"))
+#ifdef _SC_STREAM_MAX
+               return _SC_STREAM_MAX;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "_SC_TZNAME_MAX"))
+#ifdef _SC_TZNAME_MAX
+               return _SC_TZNAME_MAX;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "_SC_VERSION"))
+#ifdef _SC_VERSION
+               return _SC_VERSION;
+#else
+               goto not_there;
+#endif
+           break;
+       }
+       if (strEQ(name, "_IOFBF"))
+#ifdef _IOFBF
+           return _IOFBF;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "_IOLBF"))
+#ifdef _IOLBF
+           return _IOLBF;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "_IONBF"))
+#ifdef _IONBF
+           return _IONBF;
+#else
+           goto not_there;
+#endif
+       break;
+    }
+    errno = EINVAL;
+    return 0;
+
+not_there:
+    errno = ENOENT;
+    return 0;
+}
+
+MODULE = SigSet                PACKAGE = POSIX::SigSet         PREFIX = sig
+
+POSIX::SigSet
+new(packname = "POSIX::SigSet", ...)
+    char *             packname
+    CODE:
+       {
+           int i;
+           RETVAL = (sigset_t*)safemalloc(sizeof(sigset_t));
+           sigemptyset(RETVAL);
+           for (i = 2; i <= items; i++)
+               sigaddset(RETVAL, SvIV(ST(i)));
+       }
+    OUTPUT:
+       RETVAL
 
 void
-_exit(status)
-       int             status
+DESTROY(sigset)
+       POSIX::SigSet   sigset
+    CODE:
+       safefree(sigset);
+
+SysRet
+sigaddset(sigset, sig)
+       POSIX::SigSet   sigset
+       int             sig
+
+SysRet
+sigdelset(sigset, sig)
+       POSIX::SigSet   sigset
+       int             sig
+
+SysRet
+sigemptyset(sigset)
+       POSIX::SigSet   sigset
+
+SysRet
+sigfillset(sigset)
+       POSIX::SigSet   sigset
+
+int
+sigismember(sigset, sig)
+       POSIX::SigSet   sigset
+       int             sig
+
+
+MODULE = POSIX         PACKAGE = POSIX
+
+int
+constant(name,arg)
+       char *          name
+       int             arg
+
+int
+isalnum(charstring)
+       char *          charstring
+    CODE:
+       char *s;
+       RETVAL = 1;
+       for (s = charstring; *s; s++)
+           if (!isalnum(*s))
+               RETVAL = 0;
+    OUTPUT:
+       RETVAL
+
+int
+isalpha(charstring)
+       char *          charstring
+    CODE:
+       char *s;
+       RETVAL = 1;
+       for (s = charstring; *s; s++)
+           if (!isalpha(*s))
+               RETVAL = 0;
+    OUTPUT:
+       RETVAL
+
+int
+iscntrl(charstring)
+       char *          charstring
+    CODE:
+       char *s;
+       RETVAL = 1;
+       for (s = charstring; *s; s++)
+           if (!iscntrl(*s))
+               RETVAL = 0;
+    OUTPUT:
+       RETVAL
+
+int
+isdigit(charstring)
+       char *          charstring
+    CODE:
+       char *s;
+       RETVAL = 1;
+       for (s = charstring; *s; s++)
+           if (!isdigit(*s))
+               RETVAL = 0;
+    OUTPUT:
+       RETVAL
+
+int
+isgraph(charstring)
+       char *          charstring
+    CODE:
+       char *s;
+       RETVAL = 1;
+       for (s = charstring; *s; s++)
+           if (!isgraph(*s))
+               RETVAL = 0;
+    OUTPUT:
+       RETVAL
+
+int
+islower(charstring)
+       char *          charstring
+    CODE:
+       char *s;
+       RETVAL = 1;
+       for (s = charstring; *s; s++)
+           if (!islower(*s))
+               RETVAL = 0;
+    OUTPUT:
+       RETVAL
+
+int
+isprint(charstring)
+       char *          charstring
+    CODE:
+       char *s;
+       RETVAL = 1;
+       for (s = charstring; *s; s++)
+           if (!isprint(*s))
+               RETVAL = 0;
+    OUTPUT:
+       RETVAL
+
+int
+ispunct(charstring)
+       char *          charstring
+    CODE:
+       char *s;
+       RETVAL = 1;
+       for (s = charstring; *s; s++)
+           if (!ispunct(*s))
+               RETVAL = 0;
+    OUTPUT:
+       RETVAL
+
+int
+isspace(charstring)
+       char *          charstring
+    CODE:
+       char *s;
+       RETVAL = 1;
+       for (s = charstring; *s; s++)
+           if (!isspace(*s))
+               RETVAL = 0;
+    OUTPUT:
+       RETVAL
 
 int
-chdir(path)
-       char *          path
+isupper(charstring)
+       char *          charstring
+    CODE:
+       char *s;
+       RETVAL = 1;
+       for (s = charstring; *s; s++)
+           if (!isupper(*s))
+               RETVAL = 0;
+    OUTPUT:
+       RETVAL
 
 int
-chmod(path, mode)
-       char *          path
-       mode_t          mode
+isxdigit(charstring)
+       char *          charstring
+    CODE:
+       char *s;
+       RETVAL = 1;
+       for (s = charstring; *s; s++)
+           if (!isxdigit(*s))
+               RETVAL = 0;
+    OUTPUT:
+       RETVAL
+
+SysRet
+open(filename, flags = O_RDONLY, mode = 0666)
+       char *          filename
+       int             flags
+       int             mode
+
+HV *
+localeconv()
+    CODE:
+       struct lconv *lcbuf;
+       RETVAL = newHV();
+       if (lcbuf = localeconv()) {
+           /* the strings */
+           if (lcbuf->decimal_point && *lcbuf->decimal_point)
+               hv_store(RETVAL, "decimal_point", 13,
+                   newSVpv(lcbuf->decimal_point, 0), 0);
+           if (lcbuf->thousands_sep && *lcbuf->thousands_sep)
+               hv_store(RETVAL, "thousands_sep", 13,
+                   newSVpv(lcbuf->thousands_sep, 0), 0);
+           if (lcbuf->grouping && *lcbuf->grouping)
+               hv_store(RETVAL, "grouping", 8,
+                   newSVpv(lcbuf->grouping, 0), 0);
+           if (lcbuf->int_curr_symbol && *lcbuf->int_curr_symbol)
+               hv_store(RETVAL, "int_curr_symbol", 15,
+                   newSVpv(lcbuf->int_curr_symbol, 0), 0);
+           if (lcbuf->currency_symbol && *lcbuf->currency_symbol)
+               hv_store(RETVAL, "currency_symbol", 15,
+                   newSVpv(lcbuf->currency_symbol, 0), 0);
+           if (lcbuf->mon_decimal_point && *lcbuf->mon_decimal_point)
+               hv_store(RETVAL, "mon_decimal_point", 17,
+                   newSVpv(lcbuf->mon_decimal_point, 0), 0);
+           if (lcbuf->mon_thousands_sep && *lcbuf->mon_thousands_sep)
+               hv_store(RETVAL, "mon_thousands_sep", 17,
+                   newSVpv(lcbuf->mon_thousands_sep, 0), 0);
+           if (lcbuf->mon_grouping && *lcbuf->mon_grouping)
+               hv_store(RETVAL, "mon_grouping", 12,
+                   newSVpv(lcbuf->mon_grouping, 0), 0);
+           if (lcbuf->positive_sign && *lcbuf->positive_sign)
+               hv_store(RETVAL, "positive_sign", 13,
+                   newSVpv(lcbuf->positive_sign, 0), 0);
+           if (lcbuf->negative_sign && *lcbuf->negative_sign)
+               hv_store(RETVAL, "negative_sign", 13,
+                   newSVpv(lcbuf->negative_sign, 0), 0);
+           /* the integers */
+           if (lcbuf->int_frac_digits != CHAR_MAX)
+               hv_store(RETVAL, "int_frac_digits", 15,
+                   newSViv(lcbuf->int_frac_digits), 0);
+           if (lcbuf->frac_digits != CHAR_MAX)
+               hv_store(RETVAL, "frac_digits", 11,
+                   newSViv(lcbuf->frac_digits), 0);
+           if (lcbuf->p_cs_precedes != CHAR_MAX)
+               hv_store(RETVAL, "p_cs_precedes", 13,
+                   newSViv(lcbuf->p_cs_precedes), 0);
+           if (lcbuf->p_sep_by_space != CHAR_MAX)
+               hv_store(RETVAL, "p_sep_by_space", 14,
+                   newSViv(lcbuf->p_sep_by_space), 0);
+           if (lcbuf->n_cs_precedes != CHAR_MAX)
+               hv_store(RETVAL, "n_cs_precedes", 13,
+                   newSViv(lcbuf->n_cs_precedes), 0);
+           if (lcbuf->n_sep_by_space != CHAR_MAX)
+               hv_store(RETVAL, "n_sep_by_space", 14,
+                   newSViv(lcbuf->n_sep_by_space), 0);
+           if (lcbuf->p_sign_posn != CHAR_MAX)
+               hv_store(RETVAL, "p_sign_posn", 11,
+                   newSViv(lcbuf->p_sign_posn), 0);
+           if (lcbuf->n_sign_posn != CHAR_MAX)
+               hv_store(RETVAL, "n_sign_posn", 11,
+                   newSViv(lcbuf->n_sign_posn), 0);
+       }
+    OUTPUT:
+       RETVAL
+
+char *
+setlocale(category, locale)
+       int             category
+       char *          locale
+
+double
+acos(x)
+       double          x
+
+double
+asin(x)
+       double          x
+
+double
+atan(x)
+       double          x
+
+double
+ceil(x)
+       double          x
+
+double
+cosh(x)
+       double          x
+
+double
+floor(x)
+       double          x
+
+double
+fmod(x,y)
+       double          x
+       double          y
+
+void
+frexp(x)
+       double          x
+    PPCODE:
+       int expvar;
+       sp--;
+       /* (We already know stack is long enough.) */
+       PUSHs(sv_2mortal(newSVnv(frexp(x,&expvar))));
+       PUSHs(sv_2mortal(newSViv(expvar)));
+
+double
+ldexp(x,exp)
+       double          x
+       int             exp
+
+double
+log10(x)
+       double          x
+
+void
+modf(x)
+       double          x
+    PPCODE:
+       double intvar;
+       sp--;
+       /* (We already know stack is long enough.) */
+       PUSHs(sv_2mortal(newSVnv(modf(x,&intvar))));
+       PUSHs(sv_2mortal(newSVnv(intvar)));
+
+double
+sinh(x)
+       double          x
+
+double
+tanh(x)
+       double          x
+
+SysRet
+sigaction(sig, action, oldaction = 0)
+       int                     sig
+       POSIX::SigAction        action
+       POSIX::SigAction        oldaction
+    CODE:
+
+# This code is really grody because we're trying to make the signal
+# interface look beautiful, which is hard.
+
+       if (!siggv)
+           gv_fetchpv("SIG", TRUE);
+
+       {
+           struct sigaction act;
+           struct sigaction oact;
+           POSIX__SigSet sigset;
+           SV** svp;
+           SV** sigsvp = hv_fetch(GvHVn(siggv),
+                                sig_name[sig],
+                                strlen(sig_name[sig]),
+                                TRUE);
+
+           /* Remember old handler name if desired. */
+           if (oldaction) {
+               char *hand = SvPVx(*sigsvp, na);
+               svp = hv_fetch(oldaction, "HANDLER", 7, TRUE);
+               sv_setpv(*svp, *hand ? hand : "DEFAULT");
+           }
+
+           if (action) {
+               /* Vector new handler through %SIG.  (We always use sighandler
+                  for the C signal handler, which reads %SIG to dispatch.) */
+               svp = hv_fetch(action, "HANDLER", 7, FALSE);
+               if (!svp)
+                   croak("Can't supply an action without a HANDLER");
+               sv_setpv(*sigsvp, SvPV(*svp, na));
+               mg_set(*sigsvp);        /* handles DEFAULT and IGNORE */
+               act.sa_handler = sighandler;
+
+               /* Set up any desired mask. */
+               svp = hv_fetch(action, "MASK", 4, FALSE);
+               if (svp && sv_isa(*svp, "POSIX::SigSet")) {
+                   sigset = (sigset_t*)(unsigned long)SvNV((SV*)SvRV(*svp));
+                   act.sa_mask = *sigset;
+               }
+               else
+                   sigemptyset(act.sa_mask);
+
+               /* Set up any desired flags. */
+               svp = hv_fetch(action, "FLAGS", 5, FALSE);
+               act.sa_flags = svp ? SvIV(*svp) : 0;
+           }
+
+           /* Now work around sigaction oddities */
+           if (action && oldaction)
+               RETVAL = sigaction(sig, act, oact);
+           else if (action)
+               RETVAL = sigaction(sig, act, (struct sigaction*)0);
+           else if (oldaction)
+               RETVAL = sigaction(sig, (struct sigaction*)0, oact);
+
+           if (oldaction) {
+               /* Get back the mask. */
+               svp = hv_fetch(oldaction, "MASK", 4, TRUE);
+               if (sv_isa(*svp, "POSIX::SigSet"))
+                   sigset = (sigset_t*)(unsigned long)SvNV((SV*)SvRV(*svp));
+               else {
+                   sigset = (sigset_t*)safemalloc(sizeof(sigset_t));
+                   sv_setptrobj(*svp, sigset, "POSIX::SigSet");
+               }
+               *sigset = oact.sa_mask;
+
+               /* Get back the flags. */
+               svp = hv_fetch(oldaction, "FLAGS", 5, TRUE);
+               sv_setiv(*svp, oact.sa_flags);
+           }
+       }
+    OUTPUT:
+       RETVAL
+
+SysRet
+sigpending(sigset)
+       POSIX::SigSet           sigset
+
+SysRet
+sigprocmask(how, sigset, oldsigset = 0)
+       int                     how
+       POSIX::SigSet           sigset
+       POSIX::SigSet           oldsigset
+
+SysRet
+sigsuspend(signal_mask)
+       POSIX::SigSet           signal_mask
+
+############ Work in progress
+
+#FileHandle
+#fdopen(fd, type)
+#      int             fd
+#      char *          type
+
+#int
+#ferror(handle)
+#      FileHandle      handle
+
+#SysRet
+#fflush(handle)
+#      OutputHandle    handle
+
+void
+_exit(status)
+       int             status
 
 int
 close(fd)
@@ -78,16 +2486,11 @@ dup2(fd1, fd2)
        int             fd1
        int             fd2
 
-FILE *
-fdopen(fd, type)
-       int             fd
-       char *          type
-
 int
 fstat(fd, buf)
        int             fd
        struct stat *   buf = (struct stat*)sv_grow(ST(2),sizeof(struct stat));
-       CLEANUP:
+    CLEANUP:
        SvCUR(ST(2)) = sizeof(struct stat);
 
 int
@@ -111,21 +2514,12 @@ nice(incr)
        int             incr
 
 int
-open()
-
-int
 pipe()
 
 int
 read()
 
 int
-readlink(path, buf, bufsiz)
-       char *          path
-       char *          buf = sv_grow(ST(2), SvIV(ST(3)));
-       int             bufsiz
-
-int
 rename()
 
 int
@@ -171,16 +2565,15 @@ tcsetpgrp(fd, pgrp_id)
 int
 times(tms)
        struct tms *    tms = (struct tms*)sv_grow(ST(1), sizeof(struct tms));
-       CLEANUP:
+    CLEANUP:
        SvCUR(ST(1)) = sizeof(struct tms);
 
 int
 umask()
 
-int
+void
 uname()
-       CODE:
-       dSP;
+    PPCODE:
        struct utsname utsname;
        sp--;
        if (uname(&utsname) >= 0) {
@@ -191,7 +2584,6 @@ uname()
            PUSHs(sv_2mortal(newSVpv(utsname.version, 0)));
            PUSHs(sv_2mortal(newSVpv(utsname.machine, 0)));
        }
-       return sp - stack_base;
 
 int
 unlink()
@@ -207,7 +2599,7 @@ waitpid(pid, statusp, options)
        int             pid
        int             &statusp
        int             options
-       OUTPUT:
+    OUTPUT:
        statusp
 
 int
index 98d2135..4cf2975 100644 (file)
@@ -1,4 +1,7 @@
-mode_t         T_INT
-pid_t          T_INT
-fd             T_INT
-FILE *         T_PTR
+mode_t                 T_INT
+pid_t                  T_INT
+fd                     T_INT
+FILE *                 T_PTR
+FileHandle             T_PTROBJ
+POSIX::SigSet          T_PTROBJ
+POSIX::SigAction       T_HVOBJ
index 8c9f48d..24895dc 100644 (file)
@@ -14,6 +14,11 @@ caddr_t                      T_STRING
 unsigned long *                T_OPAQUEPTR
 char **                        T_PACKED
 void *                 T_PTR
+SV *                   T_SV
+SV *                   T_SVOBJ
+AV *                   T_AVOBJ
+HV *                   T_HVOBJ
+CV *                   T_CVOBJ
 
 I32                    T_LONG
 I16                    T_SHORT
@@ -22,9 +27,34 @@ U16                  T_U_SHORT
 Result                 T_U_CHAR
 Boolean                        T_U_CHAR
 double                 T_DOUBLE
+SysRet                 T_SYSRET
 
 #############################################################################
 INPUT
+T_SV
+       $var = $arg;
+T_SVOBJ
+       if (sv_isa($arg, \"${ntype}\"))
+           $var = (AV*)SvRV($arg);
+       else
+           croak(\"$var is not of type ${ntype}\")
+T_AVOBJ
+       if (sv_isa($arg, \"${ntype}\"))
+           $var = (AV*)SvRV($arg);
+       else
+           croak(\"$var is not of type ${ntype}\")
+T_HVOBJ
+       if (sv_isa($arg, \"${ntype}\"))
+           $var = (HV*)SvRV($arg);
+       else
+           croak(\"$var is not of type ${ntype}\")
+T_CVOBJ
+       if (sv_isa($arg, \"${ntype}\"))
+           $var = (CV*)SvRV($arg);
+       else
+           croak(\"$var is not of type ${ntype}\")
+T_SYSRET
+       $var NOT IMPLEMENTED
 T_INT
        $var = (int)SvIV($arg)
 T_ENUM
@@ -96,8 +126,25 @@ T_ARRAY
        }
 #############################################################################
 OUTPUT
+T_SV
+       $arg = $var;
+T_SVOBJ
+       $arg = newRV((SV*)$var);
+T_AVOBJ
+       $arg = newRV((SV*)$var);
+T_HVOBJ
+       $arg = newRV((SV*)$var);
+T_CVOBJ
+       $arg = newRV((SV*)$var);
 T_INT
        sv_setiv($arg, (I32)$var);
+T_SYSRET
+       if ($var != -1) {
+           if ($var == 0)
+               sv_setpvn($arg, "0 but true", 10);
+           else
+               sv_setiv($arg, (I32)$var);
+       }
 T_ENUM
        sv_setiv($arg, (I32)$var);
 T_U_INT
index d2be4f5..bb69720 100755 (executable)
@@ -1,4 +1,4 @@
-#!./perl
+#!./miniperl
 # $Header$ 
 
 $usage = "Usage: xsubpp [-ansi] [-C++] [-except] [-tm typemap] file.xs\n";
@@ -68,6 +68,8 @@ foreach $key (keys %input_expr) {
 sub Q {
     local $text = shift;
     $text =~ tr/#//d;
+    $text =~ s/\[\[/{/g;
+    $text =~ s/\]\]/}/g;
     $text;
 }
 
@@ -75,149 +77,176 @@ open(F, $filename) || die "cannot open $filename\n";
 
 while (<F>) {
        last if ($Module, $foo, $Package, $foo1, $Prefix) =
-               /^MODULE\s*=\s*(\w+)(\s+PACKAGE\s*=\s*(\w+))?(\s+PREFIX\s*=\s*(.+))?$/;
+               /^MODULE\s*=\s*(\w+)(\s+PACKAGE\s*=\s*([\w:]+))?(\s+PREFIX\s*=\s*(\S+))?$/;
        print $_;
 }
-$Pack = $Package;
-$Package .= "::" if defined $Package && $Package ne "";
-$/ = "";
+exit 0 if $_ eq "";
+$lastline = $_;
 
-while (<F>) {
-       # parse paragraph
-       chop;
-       next if /^\s*$/;
-       next if /^(#.*\n?)+$/;
-       if (/^MODULE\s*=\s*(\w+)(\s+PACKAGE\s*=\s*(\w+))?(\s+PREFIX\s*=\s*(.+))?$/) {
-               $Module = $1;
-               $foo = $2;
-               $Package = $3;
-               $Pack = $Package;
-               $foo1 = $4;
-               $Prefix = $5;
-               $Package .= "::" if defined $Package && $Package ne "";
-               next;
-       }
-       @line = split(/[\t ]*\n/);
-
-       # initialize info arrays
-       undef(%args_match);
-       undef(%var_types);
-       undef(%var_addr);
-       undef(%defaults);
-       undef($class);
-       undef($static);
-       undef($elipsis);
-
-       # extract return type, function name and arguments
-       $ret_type = shift(@line);
-       if ($ret_type =~ /^static\s+(.*)$/) {
-               $static = 1;
-               $ret_type = $1;
-       }
-       $func_header = shift(@line);
-       ($func_name, $orig_args) =  $func_header =~ /^([\w:]+)\s*\((.*)\)$/;
-       if ($func_name =~ /(.*)::(.*)/) {
-               $class = $1;
-               $func_name = $2;
-       }
-       ($pname = $func_name) =~ s/^($Prefix)?/$Package/;
-       push(@Func_name, "${Pack}_$func_name");
-       push(@Func_pname, $pname);
-       @args = split(/\s*,\s*/, $orig_args);
-       if (defined($class) && !defined($static)) {
-               unshift(@args, "THIS");
-               $orig_args = "THIS, $orig_args";
-               $orig_args =~ s/^THIS, $/THIS/;
+sub fetch_para {
+    # parse paragraph
+    @line = ();
+    if ($lastline ne "") {
+       if ($lastline =~
+    /^MODULE\s*=\s*(\w+)(\s+PACKAGE\s*=\s*([\w:]+))?(\s+PREFIX\s*=\s*(\S+))?$/) {
+           $Module = $1;
+           $foo = $2;
+           $Package = $3;
+           $foo1 = $4;
+           $Prefix = $5;
+           ($Packid = $Package) =~ s/:/_/g;
+           $Packprefix = $Package;
+           $Packprefix .= "::" if defined $Packprefix && $Packprefix ne "";
+           while (<F>) {
+               chop;
+               last if /^\S/;
+           }
+           push(@line, $_) if $_ ne "";
        }
-       $orig_args =~ s/"/\\"/g;
-       $min_args = $num_args = @args;
-       foreach $i (0..$num_args-1) {
-               if ($args[$i] =~ s/\.\.\.//) {
-                       $elipsis = 1;
-                       $min_args--;
-                       if ($args[i] eq '' && $i == $num_args - 1) {
-                           pop(@args);
-                           last;
-                       }
-               }
-               if ($args[$i] =~ /([^=]*\S)\s*=\s*(.*)/) {
-                       $min_args--;
-                       $args[$i] = $1;
-                       $defaults{$args[$i]} = $2;
-                       $defaults{$args[$i]} =~ s/"/\\"/g;
-               }
+       else {
+           push(@line, $lastline);
        }
-       if (defined($class) && !defined($static)) {
-               $func_args = join(", ", @args[1..$#args]);
-       } else {
-               $func_args = join(", ", @args);
+       $lastline = "";
+       while (<F>) {
+           next if /^#/ && !/^#(if|ifdef|else|elif|endif|define|undef)\b/;
+           chop;
+           if (/^\S/ && @line && $line[-1] eq "") {
+               $lastline = $_;
+               last;
+           }
+           else {
+               push(@line, $_);
+           }
        }
-       @args_match{@args} = 1..@args;
+       pop(@line) while @line && $line[-1] eq "";
+    }
+    scalar @line;
+}
 
-       # print function header
-       if ($ansiflag) {
-           print Q<<"EOF";
+while (&fetch_para) {
+    # initialize info arrays
+    undef(%args_match);
+    undef(%var_types);
+    undef(%var_addr);
+    undef(%defaults);
+    undef($class);
+    undef($static);
+    undef($elipsis);
+
+    # extract return type, function name and arguments
+    $ret_type = shift(@line);
+    if ($ret_type =~ /^static\s+(.*)$/) {
+           $static = 1;
+           $ret_type = $1;
+    }
+    $func_header = shift(@line);
+    ($func_name, $orig_args) =  $func_header =~ /^([\w:]+)\s*\((.*)\)$/;
+    if ($func_name =~ /(.*)::(.*)/) {
+           $class = $1;
+           $func_name = $2;
+    }
+    ($pname = $func_name) =~ s/^($Prefix)?/$Packprefix/;
+    push(@Func_name, "${Packid}_$func_name");
+    push(@Func_pname, $pname);
+    @args = split(/\s*,\s*/, $orig_args);
+    if (defined($class) && !defined($static)) {
+           unshift(@args, "THIS");
+           $orig_args = "THIS, $orig_args";
+           $orig_args =~ s/^THIS, $/THIS/;
+    }
+    $orig_args =~ s/"/\\"/g;
+    $min_args = $num_args = @args;
+    foreach $i (0..$num_args-1) {
+           if ($args[$i] =~ s/\.\.\.//) {
+                   $elipsis = 1;
+                   $min_args--;
+                   if ($args[i] eq '' && $i == $num_args - 1) {
+                       pop(@args);
+                       last;
+                   }
+           }
+           if ($args[$i] =~ /([^=]*\S)\s*=\s*(.*)/) {
+                   $min_args--;
+                   $args[$i] = $1;
+                   $defaults{$args[$i]} = $2;
+                   $defaults{$args[$i]} =~ s/"/\\"/g;
+           }
+    }
+    if (defined($class) && !defined($static)) {
+           $func_args = join(", ", @args[1..$#args]);
+    } else {
+           $func_args = join(", ", @args);
+    }
+    @args_match{@args} = 1..@args;
+
+    # print function header
+    if ($ansiflag) {
+       print Q<<"EOF";
 #static int
-#XS_${Pack}_$func_name(int, int ax, int items)
+#XS_${Packid}_$func_name(int, int ax, int items)
+#[[
 EOF
-       }
-       else {
-           print Q<<"EOF";
+    }
+    else {
+       print Q<<"EOF";
 #static int
-#XS_${Pack}_$func_name(ix, ax, items)
+#XS_${Packid}_$func_name(ix, ax, items)
 #register int ix;
 #register int ax;
 #register int items;
+#[[
 EOF
-       }
-       if ($elipsis) {
-           $cond = qq(items < $min_args);
-       }
-       elsif ($min_args == $num_args) {
-           $cond = qq(items != $min_args);
-       }
-       else {
-           $cond = qq(items < $min_args || items > $num_args);
-       }
+    }
+    if ($elipsis) {
+       $cond = qq(items < $min_args);
+    }
+    elsif ($min_args == $num_args) {
+       $cond = qq(items != $min_args);
+    }
+    else {
+       $cond = qq(items < $min_args || items > $num_args);
+    }
 
-print Q<<"EOF";
-#{
+    print Q<<"EOF" if $except;
+#    char errbuf[1024];
+#    *errbuf = '\0';
+EOF
+
+    print Q<<"EOF";
 #    if ($cond) {
 #      croak("Usage: $pname($orig_args)");
 #    }
 EOF
 
-# Now do a block of some sort.
+    # Now do a block of some sort.
 
-$condnum = 0;
-if (!@line) {
-    @line = "CLEANUP:";
-}
-while (@line) {
+    $condnum = 0;
+    if (!@line) {
+       @line = "CLEANUP:";
+    }
+    while (@line) {
        if ($_[0] =~ s/^\s*CASE\s*:\s*//) {
-               $cond = shift(@line);
-               if ($condnum == 0) {
-                   print "    if ($cond)\n";
-               }
-               elsif ($cond ne '') {
-                   print "    else if ($cond)\n";
-               }
-               else {
-                   print "    else\n";
-               }
-               $condnum++;
+           $cond = shift(@line);
+           if ($condnum == 0) {
+               print "    if ($cond)\n";
+           }
+           elsif ($cond ne '') {
+               print "    else if ($cond)\n";
+           }
+           else {
+               print "    else\n";
+           }
+           $condnum++;
        }
 
        if ($except) {
            print Q<<"EOF";
-#    char errbuf[1024];
-#    *errbuf = '\0';
-#    TRY {
+#    TRY [[
 EOF
        }
        else {
            print Q<<"EOF";
-#    {
+#    [[
 EOF
        }
 
@@ -225,9 +254,10 @@ EOF
        $thisdone = 0;
        $retvaldone = 0;
        $deferred = "";
-       while ($_ = shift(@line)) {
+       while (@line) {
+               $_ = shift(@line);
                last if /^\s*NOT_IMPLEMENTED_YET/;
-               last if /^\s*(CODE|OUTPUT|CLEANUP|CASE)\s*:/;
+               last if /^\s*(PPCODE|CODE|OUTPUT|CLEANUP|CASE)\s*:/;
                ($var_type, $var_name, $var_init) =
                    /\s*([^\t]+)\s*([^\s=]+)\s*(=.*)?/;
                if ($var_name =~ /^&/) {
@@ -272,13 +302,24 @@ EOF
                        $args_match{"RETVAL"} = 0;
                        $var_types{"RETVAL"} = $ret_type;
                }
-               print $deferred;
-               if (/^\s*CODE:/) {
-                       while ($_ = shift(@line)) {
+               if (/^\s*PPCODE:/) {
+                       print "\tdSP;\n";
+                       print $deferred;
+                       while (@line) {
+                               $_ = shift(@line);
+                               last if /^\s*(OUTPUT|CLEANUP|CASE)\s*:/;
+                               print "$_\n";
+                       }
+                       print "\tax = sp - stack_base;\n";
+               } elsif (/^\s*CODE:/) {
+                       print $deferred;
+                       while (@line) {
+                               $_ = shift(@line);
                                last if /^\s*(OUTPUT|CLEANUP|CASE)\s*:/;
                                print "$_\n";
                        }
                } else {
+                       print $deferred;
                        print "\n\t";
                        if ($ret_type ne "void") {
                                print "RETVAL = ";
@@ -299,7 +340,8 @@ EOF
 
        # do output variables
        if (/^\s*OUTPUT\s*:/) {
-               while ($_ = shift(@line)) {
+               while (@line) {
+                       $_ = shift(@line);
                        last if /^\s*CLEANUP\s*:/;
                        s/^\s+//;
                        ($outarg, $outcode) = split(/\t+/);
@@ -316,7 +358,8 @@ EOF
        }
        # do cleanup
        if (/^\s*CLEANUP\s*:/) {
-           while ($_ = shift(@line)) {
+           while (@line) {
+                   $_ = shift(@line);
                    last if /^\s*CASE\s*:/;
                    print "$_\n";
            }
@@ -324,27 +367,29 @@ EOF
        # print function trailer
        if ($except) {
            print Q<<EOF;
-#    }
+#    ]]
 #    BEGHANDLERS
 #    CATCHALL
 #      sprintf(errbuf, "%s: %s\\tpropagated", Xname, Xreason);
 #    ENDHANDLERS
-#    if (errbuf[0])
-#      croak(errbuf);
 EOF
        }
        else {
            print Q<<EOF;
-#    }
+#    ]]
 EOF
        }
        if (/^\s*CASE\s*:/) {
            unshift(@line, $_);
        }
-}
-       print Q<<EOF;
+    }
+    print Q<<EOF if $except;
+#    if (errbuf[0])
+#      croak(errbuf);
+EOF
+    print Q<<EOF;
 #    return ax;
-#}
+#]]
 #
 EOF
 }
@@ -356,103 +401,112 @@ print Q<<"EOF";
 #int ix;
 #int ax;
 #int items;
-#{
+#[[
 #    char* file = __FILE__;
 #
 EOF
 
 for (@Func_name) {
-       $pname = shift(@Func_pname);
-       print "    newXSUB(\"$pname\", 0, XS_$_, file);\n";
+    $pname = shift(@Func_pname);
+    print "    newXSUB(\"$pname\", 0, XS_$_, file);\n";
 }
 print "}\n";
 
 sub output_init {
-       local($type, $num, $init) = @_;
-       local($arg) = "ST($num)";
+    local($type, $num, $init) = @_;
+    local($arg) = "ST($num)";
 
-       eval qq/print " $init\\\n"/;
+    eval qq/print " $init\\\n"/;
 }
 
 sub blurt { warn @_; $errors++ }
 
 sub generate_init {
-       local($type, $num, $var) = @_;
-       local($arg) = "ST($num)";
-       local($argoff) = $num - 1;
-       local($ntype);
-       local($tk);
+    local($type, $num, $var) = @_;
+    local($arg) = "ST($num)";
+    local($argoff) = $num - 1;
+    local($ntype);
+    local($tk);
 
-       blurt("$type not in typemap"), return unless defined($type_kind{$type});
-       ($ntype = $type) =~ s/\s*\*/Ptr/g;
-       $subtype = $ntype;
-       $subtype =~ s/Ptr$//;
-       $subtype =~ s/Array$//;
-       $tk = $type_kind{$type};
-       $tk =~ s/OBJ$/REF/ if $func_name =~ /DESTROY$/;
-       $expr = $input_expr{$tk};
-       if ($expr =~ /DO_ARRAY_ELEM/) {
-           $subexpr = $input_expr{$type_kind{$subtype}};
-           $subexpr =~ s/ntype/subtype/g;
-           $subexpr =~ s/\$arg/ST(ix_$var)/g;
-           $subexpr =~ s/\n\t/\n\t\t/g;
-           $subexpr =~ s/is not of (.*")/[arg %d] is not of $1, ix_$var + 1/g;
-           $subexpr =~ s/\$var/$var[ix_$var - $argoff]/;
-           $expr =~ s/DO_ARRAY_ELEM/$subexpr/;
-       }
-       if (defined($defaults{$var})) {
-               $expr =~ s/(\t+)/$1    /g;
-               $expr =~ s/        /\t/g;
-               eval qq/print "\\t$var;\\n"/;
-               $deferred .= eval qq/"\\n\\tif (items < $num)\\n\\t    $var = $defaults{$var};\\n\\telse {\\n$expr;\\n\\t}\\n"/;
-       } elsif ($expr !~ /^\t\$var =/) {
-               eval qq/print "\\t$var;\\n"/;
-               $deferred .= eval qq/"\\n$expr;\\n"/;
-       } else {
-               eval qq/print "$expr;\\n"/;
-       }
+    blurt("$type not in typemap"), return unless defined($type_kind{$type});
+    ($ntype = $type) =~ s/\s*\*/Ptr/g;
+    $subtype = $ntype;
+    $subtype =~ s/Ptr$//;
+    $subtype =~ s/Array$//;
+    $tk = $type_kind{$type};
+    $tk =~ s/OBJ$/REF/ if $func_name =~ /DESTROY$/;
+    $type =~ s/:/_/g;
+    $expr = $input_expr{$tk};
+    if ($expr =~ /DO_ARRAY_ELEM/) {
+       $subexpr = $input_expr{$type_kind{$subtype}};
+       $subexpr =~ s/ntype/subtype/g;
+       $subexpr =~ s/\$arg/ST(ix_$var)/g;
+       $subexpr =~ s/\n\t/\n\t\t/g;
+       $subexpr =~ s/is not of (.*")/[arg %d] is not of $1, ix_$var + 1/g;
+       $subexpr =~ s/\$var/$var[ix_$var - $argoff]/;
+       $expr =~ s/DO_ARRAY_ELEM/$subexpr/;
+    }
+    if (defined($defaults{$var})) {
+           $expr =~ s/(\t+)/$1    /g;
+           $expr =~ s/        /\t/g;
+           eval qq/print "\\t$var;\\n"/;
+           $deferred .= eval qq/"\\n\\tif (items < $num)\\n\\t    $var = $defaults{$var};\\n\\telse {\\n$expr;\\n\\t}\\n"/;
+    } elsif ($expr !~ /^\t\$var =/) {
+           eval qq/print "\\t$var;\\n"/;
+           $deferred .= eval qq/"\\n$expr;\\n"/;
+    } else {
+           eval qq/print "$expr;\\n"/;
+    }
 }
 
 sub generate_output {
-       local($type, $num, $var) = @_;
-       local($arg) = "ST($num)";
-       local($argoff) = $num - 1;
-       local($ntype);
+    local($type, $num, $var) = @_;
+    local($arg) = "ST($num)";
+    local($argoff) = $num - 1;
+    local($ntype);
 
-       if ($type =~ /^array\(([^,]*),(.*)\)/) {
-               print "\tsv_setpvn($arg, (char *)$var, $2 * sizeof($1)), XFree((char *)$var);\n";
-       } else {
-               blurt("$type not in typemap"), return
-                   unless defined($type_kind{$type});
-               ($ntype = $type) =~ s/\s*\*/Ptr/g;
-               $ntype =~ s/\(\)//g;
-               $subtype = $ntype;
-               $subtype =~ s/Ptr$//;
-               $subtype =~ s/Array$//;
-               $expr = $output_expr{$type_kind{$type}};
-               if ($expr =~ /DO_ARRAY_ELEM/) {
-                   $subexpr = $output_expr{$type_kind{$subtype}};
-                   $subexpr =~ s/ntype/subtype/g;
-                   $subexpr =~ s/\$arg/ST(ix_$var)/g;
-                   $subexpr =~ s/\$var/${var}[ix_$var]/g;
-                   $subexpr =~ s/\n\t/\n\t\t/g;
-                   $expr =~ s/DO_ARRAY_ELEM\n/$subexpr/;
+    if ($type =~ /^array\(([^,]*),(.*)\)/) {
+           print "\tsv_setpvn($arg, (char *)$var, $2 * sizeof($1)), XFree((char *)$var);\n";
+    } else {
+           blurt("$type not in typemap"), return
+               unless defined($type_kind{$type});
+           ($ntype = $type) =~ s/\s*\*/Ptr/g;
+           $ntype =~ s/\(\)//g;
+           $subtype = $ntype;
+           $subtype =~ s/Ptr$//;
+           $subtype =~ s/Array$//;
+           $expr = $output_expr{$type_kind{$type}};
+           if ($expr =~ /DO_ARRAY_ELEM/) {
+               $subexpr = $output_expr{$type_kind{$subtype}};
+               $subexpr =~ s/ntype/subtype/g;
+               $subexpr =~ s/\$arg/ST(ix_$var)/g;
+               $subexpr =~ s/\$var/${var}[ix_$var]/g;
+               $subexpr =~ s/\n\t/\n\t\t/g;
+               $expr =~ s/DO_ARRAY_ELEM\n/$subexpr/;
+               eval "print qq\f$expr\f";
+           }
+           elsif ($arg eq 'ST(0)') {
+               if ($expr =~ /^\t\$arg = /) {
+                   eval "print qq\f$expr\f";
+                   print "\tsv_2mortal(ST(0));\n";
                }
-               elsif ($arg eq 'ST(0)') {
+               else {
                    print "\tST(0) = sv_newmortal();\n";
+                   eval "print qq\f$expr\f";
                }
-               eval "print qq\f$expr\f";
-       }
+           }
+    }
 }
 
 sub map_type {
-       local($type) = @_;
+    local($type) = @_;
 
-       if ($type =~ /^array\(([^,]*),(.*)\)/) {
-               return "$1 *";
-       } else {
-               return $type;
-       }
+    $type =~ s/:/_/g;
+    if ($type =~ /^array\(([^,]*),(.*)\)/) {
+           return "$1 *";
+    } else {
+           return $type;
+    }
 }
 
 exit $errors;
diff --git a/ext/xsubpp.bak b/ext/xsubpp.bak
new file mode 100755 (executable)
index 0000000..0f309e3
--- /dev/null
@@ -0,0 +1,529 @@
+#!/usr/bin/perl
+# $Header$ 
+
+$usage = "Usage: xsubpp [-a] [-s] [-c] typemap file.xs\n";
+die $usage unless (@ARGV >= 2 && @ARGV <= 6);
+
+SWITCH: while ($ARGV[0] =~ /^-/) {
+    $flag = shift @ARGV;
+    $aflag = 1, next SWITCH if $flag =~ /^-a$/;
+    $spat = $1, next SWITCH if $flag =~ /^-s(.*)$/;
+    $cflag = 1, next SWITCH if $flag =~ /^-c$/;
+    $eflag = 1, next SWITCH if $flag =~ /^-e$/;
+    die $usage;
+}
+
+$typemap = shift @ARGV;
+open(TYPEMAP, $typemap) || die "cannot open $typemap\n";
+while (<TYPEMAP>) {
+       next if /^\s*$/ || /^#/;
+       chop;
+       ($typename, $kind) = split(/\t+/, $_, 2);
+       $type_kind{$typename} = $kind;
+}
+close(TYPEMAP);
+
+%input_expr = (JUNK, split(/\n(T_\w*)\s*\n/, <<'T_END'));
+
+T_INT
+       $var = (int)SvIVn($arg)
+T_ENUM
+       $var = ($type)SvIVn($arg)
+T_U_INT
+       $var = (unsigned int)SvIVn($arg)
+T_SHORT
+       $var = (short)SvIVn($arg)
+T_U_SHORT
+       $var = (unsigned short)SvIVn($arg)
+T_LONG
+       $var = (long)SvIVn($arg)
+T_U_LONG
+       $var = (unsigned long)SvIVn($arg)
+T_CHAR
+       $var = (char)*SvPVn($arg,na)
+T_U_CHAR
+       $var = (unsigned char)SvIVn($arg)
+T_FLOAT
+       $var = (float)SvNVn($arg)
+T_DOUBLE
+       $var = SvNVn($arg)
+T_STRING
+       $var = SvPVn($arg,na)
+T_PTR
+       $var = ($type)(unsigned long)SvNVn($arg)
+T_PTRREF
+       if (SvTYPE($arg) == SVt_REF)
+           $var = ($type)(unsigned long)SvNVn((SV*)SvANY($arg));
+       else
+           croak(\"$var is not a reference\")
+T_PTROBJ
+       if (sv_isa($arg, \"${ntype}\"))
+           $var = ($type)(unsigned long)SvNVn((SV*)SvANY($arg));
+       else
+           croak(\"$var is not of type ${ntype}\")
+T_PTRDESC
+       if (sv_isa($arg, \"${ntype}\")) {
+           ${type}_desc = (\U${type}_DESC\E*)(unsigned long)SvNVn((SV*)SvANY($arg));
+           $var = ${type}_desc->ptr;
+       }
+       else
+           croak(\"$var is not of type ${ntype}\")
+T_REFREF
+       if (SvTYPE($arg) == SVt_REF)
+           $var = *($type)(unsigned long)SvNVn((SV*)SvANY($arg));
+       else
+           croak(\"$var is not a reference\")
+T_REFOBJ
+       if (sv_isa($arg, \"${ntype}\"))
+           $var = *($type)(unsigned long)SvNVn((SV*)SvANY($arg));
+       else
+           croak(\"$var is not of type ${ntype}\")
+T_OPAQUE
+       $var NOT IMPLEMENTED
+T_OPAQUEPTR
+       $var = ($type)SvPVn($arg,na)
+T_PACKED
+       $var = XS_unpack_$ntype($arg)
+T_PACKEDARRAY
+       $var = XS_unpack_$ntype($arg)
+T_CALLBACK
+       $var = make_perl_cb_$type($arg)
+T_ARRAY
+       $var = $ntype(items -= $argoff);
+       U32 ix_$var = $argoff;
+       while (items--) {
+           DO_ARRAY_ELEM;
+       }
+T_DATUM
+       $var.dptr = SvPVn($arg, $var.dsize);
+T_GDATUM
+       UNIMPLEMENTED
+T_PLACEHOLDER
+T_END
+
+$* = 1; %output_expr = (JUNK, split(/^(T_\w*)\s*\n/, <<'T_END')); $* = 0;
+T_INT
+       sv_setiv($arg, (I32)$var);
+T_ENUM
+       sv_setiv($arg, (I32)$var);
+T_U_INT
+       sv_setiv($arg, (I32)$var);
+T_SHORT
+       sv_setiv($arg, (I32)$var);
+T_U_SHORT
+       sv_setiv($arg, (I32)$var);
+T_LONG
+       sv_setiv($arg, (I32)$var);
+T_U_LONG
+       sv_setiv($arg, (I32)$var);
+T_CHAR
+       sv_setpvn($arg, (char *)&$var, 1);
+T_U_CHAR
+       sv_setiv($arg, (I32)$var);
+T_FLOAT
+       sv_setnv($arg, (double)$var);
+T_DOUBLE
+       sv_setnv($arg, $var);
+T_STRING
+       sv_setpv($arg, $var);
+T_PTR
+       sv_setnv($arg, (double)(unsigned long)$var);
+T_PTRREF
+       sv_setptrref($arg, $var);
+T_PTROBJ
+       sv_setptrobj($arg, $var, \"${ntype}\");
+T_PTRDESC
+       sv_setptrobj($arg, (void*)new\U${type}_DESC\E($var), \"${ntype}\");
+T_REFREF
+       sv_setrefref($arg, \"${ntype}\", XS_service_$ntype,
+                   ($var ? (void*)new $ntype($var) : 0));
+T_REFOBJ
+       NOT IMPLEMENTED
+T_OPAQUE
+       sv_setpvn($arg, (char *)&$var, sizeof($var));
+T_OPAQUEPTR
+       sv_setpvn($arg, (char *)$var, sizeof(*$var)), XFree((char *)$var);
+T_PACKED
+       XS_pack_$ntype($arg, $var);
+T_PACKEDARRAY
+       XS_pack_$ntype($arg, $var, count_$ntype);
+T_DATAUNIT     
+       sv_setpvn($arg, $var.chp(), $var.size());
+T_CALLBACK
+       sv_setpvn($arg, $var.context.value().chp(),
+               $var.context.value().size());
+T_ARRAY
+       ST_EXTEND($var.size);
+       for (U32 ix_$var = 0; ix_$var < $var.size; ix_$var++) {
+               ST(ix_$var) = sv_mortalcopy(&sv_undef);
+       DO_ARRAY_ELEM
+       }
+       sp += $var.size - 1;
+T_DATUM
+       sv_setpvn($arg, $var.dptr, $var.dsize);
+T_GDATUM
+       sv_usepvn($arg, $var.dptr, $var.dsize);
+T_END
+
+$uvfile = shift @ARGV;
+open(F, $uvfile) || die "cannot open $uvfile\n";
+
+if ($eflag) {
+       print qq|#include "cfm/basic.h"\n|;
+}
+
+while (<F>) {
+       last if ($Module, $foo, $Package, $foo1, $Prefix) =
+               /^MODULE\s*=\s*(\w+)(\s+PACKAGE\s*=\s*(\w+))?(\s+PREFIX\s*=\s*(.+))?$/;
+       print $_;
+}
+$Pack = $Package;
+$Package .= "::" if defined $Package && $Package ne "";
+$/ = "";
+
+while (<F>) {
+       # parse paragraph
+       chop;
+       next if /^\s*$/;
+       next if /^(#.*\n?)+$/;
+       if (/^MODULE\s*=\s*(\w+)(\s+PACKAGE\s*=\s*(\w+))?(\s+PREFIX\s*=\s*(.+))?$/) {
+               $Module = $1;
+               $foo = $2;
+               $Package = $3;
+               $Pack = $Package;
+               $foo1 = $4;
+               $Prefix = $5;
+               $Package .= "::" if defined $Package && $Package ne "";
+               next;
+       }
+       split(/[\t ]*\n/);
+
+       # initialize info arrays
+       undef(%args_match);
+       undef(%var_types);
+       undef(%var_addr);
+       undef(%defaults);
+       undef($class);
+       undef($static);
+       undef($elipsis);
+
+       # extract return type, function name and arguments
+       $ret_type = shift(@_);
+       if ($ret_type =~ /^static\s+(.*)$/) {
+               $static = 1;
+               $ret_type = $1;
+       }
+       $func_header = shift(@_);
+       ($func_name, $orig_args) =  $func_header =~ /^([\w:]+)\s*\((.*)\)$/;
+       if ($func_name =~ /(.*)::(.*)/) {
+               $class = $1;
+               $func_name = $2;
+       }
+       ($pname = $func_name) =~ s/^($Prefix)?/$Package/;
+       push(@Func_name, "${Pack}_$func_name");
+       push(@Func_pname, $pname);
+       @args = split(/\s*,\s*/, $orig_args);
+       if (defined($class) && !defined($static)) {
+               unshift(@args, "THIS");
+               $orig_args = "THIS, $orig_args";
+               $orig_args =~ s/^THIS, $/THIS/;
+       }
+       $orig_args =~ s/"/\\"/g;
+       $min_args = $num_args = @args;
+       foreach $i (0..$num_args-1) {
+               if ($args[$i] =~ s/\.\.\.//) {
+                       $elipsis = 1;
+                       $min_args--;
+                       if ($args[i] eq '' && $i == $num_args - 1) {
+                           pop(@args);
+                           last;
+                       }
+               }
+               if ($args[$i] =~ /([^=]*\S)\s*=\s*(.*)/) {
+                       $min_args--;
+                       $args[$i] = $1;
+                       $defaults{$args[$i]} = $2;
+                       $defaults{$args[$i]} =~ s/"/\\"/g;
+               }
+       }
+       if (defined($class) && !defined($static)) {
+               $func_args = join(", ", @args[1..$#args]);
+       } else {
+               $func_args = join(", ", @args);
+       }
+       @args_match{@args} = 1..@args;
+
+       # print function header
+       print <<"EOF" if $aflag;
+static int
+XS_${Pack}_$func_name(int, int sp, int items)
+EOF
+       print <<"EOF" if !$aflag;
+static int
+XS_${Pack}_$func_name(ix, sp, items)
+register int ix;
+register int sp;
+register int items;
+EOF
+       print <<"EOF" if $elipsis;
+{
+    if (items < $min_args) {
+       croak("Usage: $pname($orig_args)");
+    }
+EOF
+       print <<"EOF" if !$elipsis;
+{
+    if (items < $min_args || items > $num_args) {
+       croak("Usage: $pname($orig_args)");
+    }
+EOF
+
+# Now do a block of some sort.
+
+$condnum = 0;
+if (!@_) {
+    @_ = "CLEANUP:";
+}
+while (@_) {
+       if ($_[0] =~ s/^\s*CASE\s*:\s*//) {
+               $cond = shift(@_);
+               if ($condnum == 0) {
+                   print "    if ($cond)\n";
+               }
+               elsif ($cond ne '') {
+                   print "    else if ($cond)\n";
+               }
+               else {
+                   print "    else\n";
+               }
+               $condnum++;
+       }
+
+       print           <<"EOF" if $eflag;
+    TRY {
+EOF
+       print           <<"EOF" if !$eflag;
+    {
+EOF
+
+       # do initialization of input variables
+       $thisdone = 0;
+       $retvaldone = 0;
+       $deferred = "";
+       while ($_ = shift(@_)) {
+               last if /^\s*NOT_IMPLEMENTED_YET/;
+               last if /^\s*(CODE|OUTPUT|CLEANUP|CASE)\s*:/;
+               ($var_type, $var_name, $var_init) =
+                   /\s*([^\t]+)\s*([^\s=]+)\s*(=.*)?/;
+               if ($var_name =~ /^&/) {
+                       $var_name =~ s/^&//;
+                       $var_addr{$var_name} = 1;
+               }
+               $thisdone |= $var_name eq "THIS";
+               $retvaldone |= $var_name eq "RETVAL";
+               $var_types{$var_name} = $var_type;
+               print "\t" . &map_type($var_type);
+               $var_num = $args_match{$var_name};
+               if ($var_addr{$var_name}) {
+                       $func_args =~ s/\b($var_name)\b/&\1/;
+               }
+               if ($var_init !~ /^=\s*NO_INIT\s*$/) {
+                       if ($var_init !~ /^\s*$/) {
+                               &output_init($var_type, $var_num,
+                                   "$var_name $var_init");
+                       } elsif ($var_num) {
+                               # generate initialization code
+                               &generate_init($var_type, $var_num, $var_name);
+                       } else {
+                               print ";\n";
+                       }
+               } else {
+                       print "\t$var_name;\n";
+               }
+       }
+       if (!$thisdone && defined($class) && !defined($static)) {
+               print "\t$class *";
+               $var_types{"THIS"} = "$class *";
+               &generate_init("$class *", 1, "THIS");
+       }
+
+       # do code
+       if (/^\s*NOT_IMPLEMENTED_YET/) {
+               print "\ncroak(\"$pname: not implemented yet\");\n";
+       } else {
+               if ($ret_type ne "void") {
+                       print "\t" . &map_type($ret_type) . "\tRETVAL;\n"
+                               if !$retvaldone;
+                       $args_match{"RETVAL"} = 0;
+                       $var_types{"RETVAL"} = $ret_type;
+               }
+               print $deferred;
+               if (/^\s*CODE:/) {
+                       while ($_ = shift(@_)) {
+                               last if /^\s*(OUTPUT|CLEANUP|CASE)\s*:/;
+                               print "$_\n";
+                       }
+               } else {
+                       print "\n\t";
+                       if ($ret_type ne "void") {
+                               print "RETVAL = ";
+                       }
+                       if (defined($static)) {
+                               print "$class::";
+                       } elsif (defined($class)) {
+                               print "THIS->";
+                       }
+                       if (defined($spat) && $func_name =~ /^($spat)(.*)$/) {
+                               $func_name = $2;
+                       }
+                       print "$func_name($func_args);\n";
+                       &generate_output($ret_type, 0, "RETVAL")
+                           unless $ret_type eq "void";
+               }
+       }
+
+       # do output variables
+       if (/^\s*OUTPUT\s*:/) {
+               while ($_ = shift(@_)) {
+                       last if /^\s*CLEANUP\s*:/;
+                       s/^\s+//;
+                       ($outarg, $outcode) = split(/\t+/);
+                       if ($outcode) {
+                       print "\t$outcode\n";
+                       } else {
+                               die "$outarg not an argument"
+                                   unless defined($args_match{$outarg});
+                               $var_num = $args_match{$outarg};
+                               &generate_output($var_types{$outarg}, $var_num,
+                                   $outarg); 
+                       }
+               }
+       }
+       # do cleanup
+       if (/^\s*CLEANUP\s*:/) {
+           while ($_ = shift(@_)) {
+                   last if /^\s*CASE\s*:/;
+                   print "$_\n";
+           }
+       }
+       # print function trailer
+       print <<EOF if $eflag;
+    }
+    BEGHANDLERS
+    CATCHALL
+       croak("%s: %s\\tpropagated", Xname, Xreason);
+    ENDHANDLERS
+EOF
+       print <<EOF if !$eflag;
+    }
+EOF
+       if (/^\s*CASE\s*:/) {
+           unshift(@_, $_);
+       }
+}
+       print <<EOF;
+    return sp;
+}
+
+EOF
+}
+
+# print initialization routine
+print qq/extern "C"\n/ if $cflag;
+print <<"EOF";
+int init_$Module(ix,sp,items)
+int ix;
+int sp;
+int items;
+{
+    char* file = __FILE__;
+
+EOF
+
+for (@Func_name) {
+       $pname = shift(@Func_pname);
+       print "    newXSUB(\"$pname\", 0, XS_$_, file);\n";
+}
+print "}\n";
+
+sub output_init {
+       local($type, $num, $init) = @_;
+       local($arg) = "ST($num)";
+
+       eval qq/print " $init\\\n"/;
+}
+
+sub generate_init {
+       local($type, $num, $var) = @_;
+       local($arg) = "ST($num)";
+       local($argoff) = $num - 1;
+       local($ntype);
+
+       die "$type not in typemap" if !defined($type_kind{$type});
+       ($ntype = $type) =~ s/\s*\*/Ptr/g;
+       $subtype = $ntype;
+       $subtype =~ s/Ptr$//;
+       $subtype =~ s/Array$//;
+       $expr = $input_expr{$type_kind{$type}};
+       if ($expr =~ /DO_ARRAY_ELEM/) {
+           $subexpr = $input_expr{$type_kind{$subtype}};
+           $subexpr =~ s/ntype/subtype/g;
+           $subexpr =~ s/\$arg/ST(ix_$var)/g;
+           $subexpr =~ s/\n\t/\n\t\t/g;
+           $subexpr =~ s/is not of (.*")/[arg %d] is not of $1, ix_$var + 1/g;
+           $subexpr =~ s/\$var/$var[ix_$var - $argoff]/;
+           $expr =~ s/DO_ARRAY_ELEM/$subexpr/;
+       }
+       if (defined($defaults{$var})) {
+               $expr =~ s/(\t+)/$1    /g;
+               $expr =~ s/        /\t/g;
+               eval qq/print "\\t$var;\\n"/;
+               $deferred .= eval qq/"\\n\\tif (items < $num)\\n\\t    $var = $defaults{$var};\\n\\telse {\\n$expr;\\n\\t}\\n"/;
+       } elsif ($expr !~ /^\t\$var =/) {
+               eval qq/print "\\t$var;\\n"/;
+               $deferred .= eval qq/"\\n$expr;\\n"/;
+       } else {
+               eval qq/print "$expr;\\n"/;
+       }
+}
+
+sub generate_output {
+       local($type, $num, $var) = @_;
+       local($arg) = "ST($num)";
+       local($argoff) = $num - 1;
+       local($ntype);
+
+       if ($type =~ /^array\(([^,]*),(.*)\)/) {
+               print "\tsv_setpvn($arg, (char *)$var, $2 * sizeof($1)), XFree((char *)$var);\n";
+       } else {
+               die "$type not in typemap" if !defined($type_kind{$type});
+               ($ntype = $type) =~ s/\s*\*/Ptr/g;
+               $ntype =~ s/\(\)//g;
+               $subtype = $ntype;
+               $subtype =~ s/Ptr$//;
+               $subtype =~ s/Array$//;
+               $expr = $output_expr{$type_kind{$type}};
+               if ($expr =~ /DO_ARRAY_ELEM/) {
+                   $subexpr = $output_expr{$type_kind{$subtype}};
+                   $subexpr =~ s/ntype/subtype/g;
+                   $subexpr =~ s/\$arg/ST(ix_$var)/g;
+                   $subexpr =~ s/\$var/${var}[ix_$var]/g;
+                   $subexpr =~ s/\n\t/\n\t\t/g;
+                   $expr =~ s/DO_ARRAY_ELEM\n/$subexpr/;
+               }
+               elsif ($arg eq 'ST(0)') {
+                   print "\tST(0) = sv_mortalcopy(&sv_undef);\n";
+               }
+               eval "print qq\f$expr\f";
+       }
+}
+
+sub map_type {
+       local($type) = @_;
+
+       if ($type =~ /^array\(([^,]*),(.*)\)/) {
+               return "$1 *";
+       } else {
+               return $type;
+       }
+}
index 0d2c79a..cdb2bd0 100755 (executable)
@@ -1,7 +1,7 @@
 #!/usr/bin/perl
 # $Header$ 
 
-$usage = "Usage: tuv [-a] [-c] typemap file.uv\n";
+$usage = "Usage: xvar [-a] [-c] typemap file.xv\n";
 die $usage unless (@ARGV >= 2 && @ARGV <= 4);
 
 SWITCH: while ($ARGV[0] =~ /^-/) {
diff --git a/foo b/foo
index c2f7b43..88dac06 100755 (executable)
--- a/foo
+++ b/foo
@@ -1,11 +1,17 @@
 #!./perl
 
-#   Multiple Inheritence (get rich quick :-)
-       {
-           package OBJ2; sub abc { print "abc\n"; }
-           package OBJ3; sub def { print "def\n"; }
-           package OBJ4; @ISA = ("OBJ2", "OBJ3");
-           $x = bless { foo => bar };
-           $x->abc;                                    # prints ``abc''
-           $x->def;                                    # prints ``def''
-       }
+$foo = <<EOF;
+Subject: foobar
+From: baz
+EOF
+
+$* = 1;
+
+$pat = '^([*+&!]*)(Subject:)';
+#$pat =~ s/([a-zA-Z])/[\u$1\l$1]/g;
+#print $pat;
+
+$foo =~ /$pat/ig;
+
+print $', "\n";
+
diff --git a/gv.c b/gv.c
index ec23d90..e5eee1c 100644 (file)
--- a/gv.c
+++ b/gv.c
@@ -471,7 +471,7 @@ HV* stash;
                curcop->cop_filegv = GvFILEGV(gv);
                if (SvMULTI(GvFILEGV(gv)))      /* Filename began with slash */
                    continue;
-               warn("Possible typo: \"%s::%s\"", HvNAME(stash), GvNAME(gv));
+               warn("Identifier \"%s::%s\" used only once: possible typo", HvNAME(stash), GvNAME(gv));
            }
            else if (*entry->hent_key == '_' &&
                (gv = (GV*)entry->hent_val) &&
diff --git a/h2ph b/h2ph
index 5ada61a..59caa58 100755 (executable)
--- a/h2ph
+++ b/h2ph
@@ -67,7 +67,7 @@ foreach $file (@ARGV) {
                        $args = "local($args) = \@_;\n$t    ";
                    }
                    s/^\s+//;
-                   &expr();
+                   do expr();
                    $new =~ s/(["\\])/\\$1/g;
                    if ($t ne '') {
                        $new =~ s/(['\\])/\\$1/g;
@@ -81,7 +81,7 @@ foreach $file (@ARGV) {
                }
                else {
                    s/^\s+//;
-                   &expr();
+                   do expr();
                    $new = 1 if $new eq '';
                    if ($t ne '') {
                        $new =~ s/(['\\])/\\$1/g;
@@ -108,14 +108,14 @@ foreach $file (@ARGV) {
            }
            elsif (s/^if\s+//) {
                $new = '';
-               &expr();
+               do expr();
                print OUT $t,"if ($new) {\n";
                $tab += 4;
                $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
            }
            elsif (s/^elif\s+//) {
                $new = '';
-               &expr();
+               do expr();
                $tab -= 4;
                $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
                print OUT $t,"}\n${t}elsif ($new) {\n";
@@ -142,8 +142,8 @@ foreach $file (@ARGV) {
 sub expr {
     while ($_ ne '') {
        s/^(\s+)//              && do {$new .= ' '; next;};
-       s/^(0x[0-9a-fA-F]+)[lL]?//  && do {$new .= $1; next;};
-       s/^(\d+)[lL]?//         && do {$new .= $1; next;};
+       s/^(0x[0-9a-fA-F]+)//   && do {$new .= $1; next;};
+       s/^(\d+)//              && do {$new .= $1; next;};
        s/^("(\\"|[^"])*")//    && do {$new .= $1; next;};
        s/^'((\\"|[^"])*)'//    && do {
            if ($curargs{$1}) {
@@ -193,7 +193,7 @@ sub expr {
                }
            }
            else {
-               $new .= ' eval{&' . $id . '}';
+               $new .= ' &' . $id;
            }
            next;
        };
diff --git a/handy.h b/handy.h
index 4800906..102b840 100644 (file)
--- a/handy.h
+++ b/handy.h
@@ -79,6 +79,12 @@ typedef unsigned long        U32;
 #define strnNE(s1,s2,l) (strncmp(s1,s2,l))
 #define strnEQ(s1,s2,l) (!strncmp(s1,s2,l))
 
+#ifdef HAS_SETLOCALE  /* XXX Is there a better test for this? */
+#  ifndef CTYPE256
+#    define CTYPE256
+#  endif
+#endif
+
 #if defined(CTYPE256) || (!defined(isascii) && !defined(HAS_ISASCII))
 #define isALNUM(c)   (isalpha(c) || isdigit(c) || c == '_')
 #define isIDFIRST(c) (isalpha(c) || (c) == '_')
@@ -159,7 +165,7 @@ long lastxcount[MAXXCOUNT];
 #define Safefree(d) d = d
 #endif /* lint */
 
-#ifdef STRUCTCOPY
+#ifdef USE_STRUCT_COPY
 #define StructCopy(s,d,t) *((t*)(d)) = *((t*)(s))
 #else
 #define StructCopy(s,d,t) Copy(s,d,1,t)
index ff59108..0736d3d 100644 (file)
@@ -1,5 +1,5 @@
-set `echo $libswanted | sed -e 's/ x / /' -e 's/ PW / /' -e 's/ malloc / /'`
-libswanted="inet malloc $*"
+set `echo $libswanted | sed -e 's/ x / /' -e 's/ PW / /'`
+libswanted="$*"
 doio_cflags='ccflags="$ccflags -DENOTSOCK=103"'
 tdoio_cflags='ccflags="$ccflags -DENOTSOCK=103"'
 echo "<net/errno.h> defines error numbers for network calls, but"
index ca1b549..cad7a5b 100644 (file)
@@ -1,2 +1,2 @@
-set `echo $libswanted | sed -e 's/ socket / inet /'`
+set `echo $libswanted | sed -e 's/ PW / /' -e 's/ x / /'`
 libswanted="$*"
diff --git a/hints/solaris_2_2.sh b/hints/solaris_2_2.sh
new file mode 100644 (file)
index 0000000..01b9d93
--- /dev/null
@@ -0,0 +1,10 @@
+d_vfork='undef'
+set `echo $libpth | sed -e 's@/usr/ucblib@@'`
+libpth="$*"
+case $PATH in
+*/usr/ucb*:/usr/bin:*) cat <<END
+NOTE:  Some people have reported problems with /usr/ucb/cc.  
+Remove /usr/ucb from your PATH if you have difficulties.
+END
+;;
+esac
diff --git a/hints/solaris_2_3.sh b/hints/solaris_2_3.sh
new file mode 100644 (file)
index 0000000..01b9d93
--- /dev/null
@@ -0,0 +1,10 @@
+d_vfork='undef'
+set `echo $libpth | sed -e 's@/usr/ucblib@@'`
+libpth="$*"
+case $PATH in
+*/usr/ucb*:/usr/bin:*) cat <<END
+NOTE:  Some people have reported problems with /usr/ucb/cc.  
+Remove /usr/ucb from your PATH if you have difficulties.
+END
+;;
+esac
diff --git a/hints/sunos_4_1_2.sh b/hints/sunos_4_1_2.sh
new file mode 100644 (file)
index 0000000..9439388
--- /dev/null
@@ -0,0 +1 @@
+groupstype='int'
diff --git a/hints/sunos_4_1_3.sh b/hints/sunos_4_1_3.sh
new file mode 100644 (file)
index 0000000..9439388
--- /dev/null
@@ -0,0 +1 @@
+groupstype='int'
diff --git a/hvdbm.h b/hvdbm.h
index b45db4c..f81492b 100644 (file)
--- a/hvdbm.h
+++ b/hvdbm.h
 #   define dbm_firstkey(db) (croak("dbz doesn't implement traversal"),fetch())
 #   define nextkey() (croak("dbz doesn't implement traversal"),fetch())
 #   define dbm_nextkey(db) (croak("dbz doesn't implement traversal"),fetch())
-#   ifdef HAS_NDBM
-#      undef HAS_NDBM
+#   ifdef I_NDBM
+#      undef I_NDBM
 #   endif
-#   ifndef HAS_ODBM
-#      define HAS_ODBM
+#   ifndef I_DBM
+#      define I_DBM
 #   endif
 #else
 #   ifdef HAS_GDBM
 #          include <gdbm.h>
 #      endif
 #      define SOME_DBM
-#      ifdef HAS_NDBM
-#          undef HAS_NDBM
+#      ifdef I_NDBM
+#          undef I_NDBM
 #      endif
-#      ifdef HAS_ODBM
-#          undef HAS_ODBM
+#      ifdef I_DBM
+#          undef I_DBM
 #      endif
 #   else
-#      ifdef HAS_NDBM
+#      ifdef I_NDBM
 #          include <ndbm.h>
 #          define SOME_DBM
-#          ifdef HAS_ODBM
-#              undef HAS_ODBM
+#          ifdef I_DBM
+#              undef I_DBM
 #          endif
 #      else
-#          ifdef HAS_ODBM
+#          ifdef I_DBM
 #              ifdef NULL
 #                  undef NULL          /* suppress redefinition message */
 #              endif
@@ -51,8 +51,8 @@
 #              define dbm_store(db,dkey,dcontent,flags) store(dkey,dcontent)
 #              define dbm_close(db) dbmclose()
 #              define dbm_firstkey(db) firstkey()
-#          endif /* HAS_ODBM */
-#      endif /* HAS_NDBM */
+#          endif /* I_DBM */
+#      endif /* I_NDBM */
 #   endif /* HAS_GDBM */
 #endif /* WANT_DBZ */
 
index 471ad95..fbf686e 100644 (file)
--- a/internals
+++ b/internals
@@ -34,6 +34,8 @@ article, I can and probably should relax that.  That code is some of
 the oldest Perl 5 code, and I didn't see some things then that I do
 now.
 
+[I did relax that.]
+
 Ok, let me explain some things about how values are stored.  Consider
 this a little design document.
 
@@ -55,6 +57,8 @@ struct sv {
     U8         sv_private;     /* extra value, depending on type */
 };
 
+[The last 4 bytes have been combined into a single U32.]
+
 This is typedefed to SV.  There are other structurally equivalent
 types, AV, HV and CV, that are there merely to help gdb know what kind
 of pointer sv_any is, and provide a little bit of C type-checking.
@@ -70,6 +74,7 @@ Additionally I often use names containing
        IV      integer value
        NV      numeric value (double)
        PV      pointer value
+       RV      reference value
        LV      lvalue, such as a substr() or vec() being assigned to
        BM      a string containing a Boyer-Moore compiled pattern
        FM      a format line program
@@ -95,6 +100,9 @@ typedef enum {
        SVt_PVFM,
 } svtype;
 
+[There is no longer a REF type.  There's an RV type that holds a minimal ref
+value but other types can also hold an RV.  This was to allow magical refs.]
+
 These are arranged ROUGHLY in order of increasing complexity, though
 there are some discontinuities.  Many of them indicate that sv_any
 points to a struct of a similar name with an X on the front.  They can
@@ -105,7 +113,8 @@ be classified like this:
 
     SVt_REF
        The sv_any points to another SV.  (This is what we're talking
-       about changing to work more like IV and NV below.)
+       about changing to work more like IV and NV below.)  [And that's what
+       I did.]
 
     SVt_IV
     SVt_NV
@@ -120,6 +129,7 @@ be classified like this:
        memory.  This does waste a few allocated integers(doubles) at
        the beginning, but it's probably an overall win.
 
+    [SVt_RV probably belongs here.]
     SVt_PV
     SVt_PVIV
     SVt_PVNV
@@ -127,6 +137,15 @@ be classified like this:
        These are pretty ordinary, and each is "derived" from the
        previous in the sense that it just adds more data to the
        previous structure.
+[ Need to add this:
+       struct xrv {
+           SV *        xrv_rv;         /* pointer to another SV */
+       };
+
+           A reference value.  In the following structs its space is reserved
+           as a char* xpv_pv, but if SvROK() is true, xpv_pv is pointing to
+           another SV, not a string.
+]
 
        struct xpv {
            char *      xpv_pv;         /* pointer to malloced string */
@@ -187,23 +206,30 @@ be classified like this:
        These are specialized forms that are never directly visible to
        the Perl script.  They are independent of each other, and may
        not be promoted to any other type.
+       [Actually, PVBM doesn't belong here, but in the previous section.
+       saying index($foo,$bar) will in fact turn $bar into a PVBM so that
+       it can do Boyer-Moore searching.]
 
 There are several additional data values in the SV structure.  The sv_refcnt
 gives the number of references to this SV.  Some of these references may be
 actual Perl language references, but many other are just internal pointers,
 from a symbol table, or from the syntax tree, for example.  When sv_refcnt
-goes to zero, the value can be safely deallocated.
+goes to zero, the value can be safely deallocated.  Must be, in fact.
 
 The sv_storage byte is not very well thought out, but tends to indicate
 something about where the scalar lives.  It's used in allocating
 lexical storage, and at runtime contains an 'O' if the value has been
 blessed as an object.  There may be some conflicts lurking in here, and
-I may eventually claim some of the bits for other purposes.
+I may eventually claim some of the bits for other purposes.  [I did,
+with a vengeance.]
 
 The sv_flags are currently as follows.  Most of these are set and cleared
 by macros to guarantee their consistency, and you should always use the
 proper macro rather than accessing them directly.
 
+[Most of these numbers have changed, and there are some new flags.
+And they're all stuffed into a single U32.]
+
 #define SVf_IOK                1               /* has valid integer value */
 #define SVf_NOK                2               /* has valid numeric value */
 #define SVf_POK                4               /* has valid pointer value */
index b2a4127..6628a3c 100644 (file)
@@ -76,6 +76,7 @@ main_start
 mainstack
 maxscream
 maxsysfd
+minus_F
 minus_a
 minus_c
 minus_l
@@ -125,6 +126,7 @@ signalstack
 sortcop
 sortstack
 sortstash
+splitstr
 stack
 statcache
 statgv
index f911b21..5ea45e6 100644 (file)
@@ -6,114 +6,136 @@ require Exporter;
 $] == 5.000 or die sprintf
     "Perl lib version (5.000) doesn't match executable version (%.3f)\n", $];
 
-# config.sh
-# This file was produced by running the Configure script.
+#
+# This file was produced by running the Configure script. It holds all the
+# definitions figured out by Configure. Should you modify one of these values,
+# do not forget to propagate your changes by running "Configure -der". You may
+# instead choose to run each of the .SH files by yourself, or "Configure -S".
+#
+
+# Configuration time: Mon Apr  4 15:17:26 PDT 1994
+# Configured by: lwall
+# Target system: sunos scalpel 4.1.3 3 sun4c 
+
+$Config{'extensions'} = 'ext/dbm/NDBM_File.xs
+ext/dbm/ODBM_File.xs
+ext/dbm/GDBM_File.xs
+ext/dbm/SDBM_File.xs
+ext/posix/POSIX.xs';
+$Config{'d_bsd'} = 'define';
 $Config{'d_eunice'} = undef;
-$Config{'define'} = 'define';
+$Config{'d_xenix'} = undef;
 $Config{'eunicefix'} = ':';
-$Config{'loclist'} = '
-cat
-cp
-echo
-expr
-grep
-mkdir
-mv
-rm
-sed
-sort
-tr
-uniq
-';
-$Config{'expr'} = '/bin/expr';
-$Config{'sed'} = '/bin/sed';
-$Config{'echo'} = '/bin/echo';
-$Config{'cat'} = '/bin/cat';
-$Config{'rm'} = '/bin/rm';
-$Config{'mv'} = '/bin/mv';
-$Config{'cp'} = '/bin/cp';
-$Config{'tail'} = '';
-$Config{'tr'} = '/bin/tr';
-$Config{'mkdir'} = '/bin/mkdir';
-$Config{'sort'} = '/bin/sort';
-$Config{'uniq'} = '/bin/uniq';
-$Config{'grep'} = '/bin/grep';
-$Config{'trylist'} = '
-Mcc
-bison
-cpp
-csh
-egrep
-line
-nroff
-perl
-test
-uname
-yacc
-';
-$Config{'test'} = 'test';
-$Config{'inews'} = '';
-$Config{'egrep'} = '/bin/egrep';
-$Config{'more'} = '';
-$Config{'pg'} = '';
 $Config{'Mcc'} = 'Mcc';
-$Config{'vi'} = '';
-$Config{'mailx'} = '';
-$Config{'mail'} = '';
-$Config{'cpp'} = '/usr/lib/cpp';
-$Config{'perl'} = '/home/netlabs1/lwall/pl/perl';
+$Config{'awk'} = 'awk';
+$Config{'bash'} = '';
+$Config{'bison'} = 'bison';
+$Config{'byacc'} = 'byacc';
+$Config{'cat'} = 'cat';
+$Config{'chgrp'} = '';
+$Config{'chmod'} = '';
+$Config{'chown'} = '';
+$Config{'compress'} = '';
+$Config{'cp'} = 'cp';
+$Config{'cpio'} = '';
+$Config{'cpp'} = 'cpp';
+$Config{'csh'} = 'csh';
+$Config{'date'} = 'date';
+$Config{'echo'} = 'echo';
+$Config{'egrep'} = 'egrep';
 $Config{'emacs'} = '';
+$Config{'expr'} = 'expr';
+$Config{'find'} = 'find';
+$Config{'flex'} = '';
+$Config{'gcc'} = '';
+$Config{'grep'} = 'grep';
+$Config{'inews'} = '';
+$Config{'ksh'} = '';
+$Config{'less'} = '';
+$Config{'line'} = 'line';
+$Config{'lint'} = '';
+$Config{'ln'} = '';
+$Config{'lp'} = '';
+$Config{'lpr'} = '';
 $Config{'ls'} = '';
+$Config{'mail'} = '';
+$Config{'mailx'} = '';
+$Config{'make'} = '';
+$Config{'mkdir'} = 'mkdir';
+$Config{'more'} = '';
+$Config{'mv'} = 'mv';
+$Config{'nroff'} = 'nroff';
+$Config{'perl'} = 'perl';
+$Config{'pg'} = '';
+$Config{'pmake'} = '';
+$Config{'pr'} = '';
+$Config{'rm'} = 'rm';
 $Config{'rmail'} = '';
+$Config{'sed'} = 'sed';
 $Config{'sendmail'} = '';
+$Config{'sh'} = '';
 $Config{'shar'} = '';
+$Config{'sleep'} = '';
 $Config{'smail'} = '';
+$Config{'sort'} = 'sort';
+$Config{'submit'} = '';
+$Config{'tail'} = '';
+$Config{'tar'} = '';
 $Config{'tbl'} = '';
+$Config{'test'} = 'test';
+$Config{'touch'} = '';
+$Config{'tr'} = 'tr';
 $Config{'troff'} = '';
-$Config{'nroff'} = '/bin/nroff';
-$Config{'uname'} = '/bin/uname';
+$Config{'uname'} = 'uname';
+$Config{'uniq'} = 'uniq';
 $Config{'uuname'} = '';
-$Config{'line'} = '/bin/line';
-$Config{'chgrp'} = '';
-$Config{'chmod'} = '';
-$Config{'lint'} = '';
-$Config{'sleep'} = '';
-$Config{'pr'} = '';
-$Config{'tar'} = '';
-$Config{'ln'} = '';
-$Config{'lpr'} = '';
-$Config{'lp'} = '';
-$Config{'touch'} = '';
-$Config{'make'} = '';
-$Config{'date'} = '';
-$Config{'csh'} = '/bin/csh';
-$Config{'bash'} = '';
-$Config{'ksh'} = '';
-$Config{'lex'} = '';
-$Config{'flex'} = '';
-$Config{'bison'} = '/usr/local/bin/bison';
-$Config{'Log'} = '$Log';
-$Config{'Header'} = '$Header';
+$Config{'vi'} = '';
+$Config{'zcat'} = '';
+$Config{'hint'} = 'recommended';
+$Config{'myuname'} = 'sunos scalpel 4.1.3 3 sun4c ';
+$Config{'Author'} = '';
+$Config{'Date'} = '$Date';
+$Config{'Header'} = '';
 $Config{'Id'} = '$Id';
-$Config{'lastuname'} = 'SunOS scalpel 4.1.2 1 sun4c';
+$Config{'Locker'} = '';
+$Config{'Log'} = '$Log';
+$Config{'RCSfile'} = '$RCSfile';
+$Config{'Revision'} = '$Revision';
+$Config{'Source'} = '';
+$Config{'State'} = '';
+$Config{'afs'} = 'false';
 $Config{'alignbytes'} = '8';
 $Config{'bin'} = '/usr/local/bin';
+$Config{'binexp'} = '/usr/local/bin';
 $Config{'installbin'} = '/usr/local/bin';
 $Config{'byteorder'} = '4321';
+$Config{'cc'} = 'cc';
+$Config{'gccversion'} = '';
+$Config{'ccflags'} = '-DDEBUGGING';
+$Config{'cppflags'} = ' -DDEBUGGING';
+$Config{'ldflags'} = '';
+$Config{'lkflags'} = '';
+$Config{'optimize'} = '-g';
+$Config{'cf_by'} = 'lwall';
+$Config{'cf_time'} = 'Mon Apr  4 15:17:26 PDT 1994';
 $Config{'contains'} = 'grep';
-$Config{'cppstdin'} = '/usr/lib/cpp';
+$Config{'cpplast'} = '';
 $Config{'cppminus'} = '';
+$Config{'cpprun'} = 'cpp';
+$Config{'cppstdin'} = '/tmp_mnt/vol/src/local/lwall/perl5/cppstdin';
+$Config{'d_access'} = 'define';
 $Config{'d_bcmp'} = 'define';
 $Config{'d_bcopy'} = 'define';
-$Config{'d_safebcpy'} = 'define';
 $Config{'d_bzero'} = 'define';
-$Config{'d_castneg'} = 'define';
+$Config{'d_casti32'} = 'define';
 $Config{'castflags'} = '0';
+$Config{'d_castneg'} = 'define';
 $Config{'d_charsprf'} = 'define';
 $Config{'d_chsize'} = undef;
-$Config{'d_crypt'} = 'define';
+$Config{'d_const'} = undef;
 $Config{'cryptlib'} = '';
-$Config{'d_csh'} = 'define';
+$Config{'d_crypt'} = 'define';
+$Config{'d_csh'} = undef;
 $Config{'d_dosuid'} = undef;
 $Config{'d_dup2'} = 'define';
 $Config{'d_fchmod'} = 'define';
@@ -123,17 +145,20 @@ $Config{'d_flexfnam'} = 'define';
 $Config{'d_flock'} = 'define';
 $Config{'d_getgrps'} = 'define';
 $Config{'d_gethent'} = undef;
-$Config{'d_getpgrp'} = 'define';
+$Config{'aphostname'} = '';
+$Config{'d_gethname'} = undef;
+$Config{'d_phostname'} = undef;
+$Config{'d_uname'} = 'define';
 $Config{'d_getpgrp2'} = undef;
+$Config{'d_getpgrp'} = 'define';
 $Config{'d_getprior'} = 'define';
 $Config{'d_htonl'} = 'define';
-$Config{'d_index'} = undef;
 $Config{'d_isascii'} = 'define';
 $Config{'d_killpg'} = 'define';
+$Config{'d_link'} = 'define';
 $Config{'d_lstat'} = 'define';
 $Config{'d_memcmp'} = 'define';
 $Config{'d_memcpy'} = 'define';
-$Config{'d_safemcpy'} = undef;
 $Config{'d_memmove'} = undef;
 $Config{'d_memset'} = 'define';
 $Config{'d_mkdir'} = 'define';
@@ -142,14 +167,13 @@ $Config{'d_msgctl'} = 'define';
 $Config{'d_msgget'} = 'define';
 $Config{'d_msgrcv'} = 'define';
 $Config{'d_msgsnd'} = 'define';
-$Config{'d_ndbm'} = 'define';
-$Config{'d_odbm'} = 'define';
 $Config{'d_open3'} = 'define';
+$Config{'d_portable'} = 'define';
 $Config{'d_readdir'} = 'define';
 $Config{'d_rename'} = 'define';
-$Config{'d_rewindir'} = undef;
 $Config{'d_rmdir'} = 'define';
-$Config{'d_seekdir'} = 'define';
+$Config{'d_safebcpy'} = 'define';
+$Config{'d_safemcpy'} = undef;
 $Config{'d_select'} = 'define';
 $Config{'d_sem'} = 'define';
 $Config{'d_semctl'} = 'define';
@@ -157,119 +181,162 @@ $Config{'d_semget'} = 'define';
 $Config{'d_semop'} = 'define';
 $Config{'d_setegid'} = 'define';
 $Config{'d_seteuid'} = 'define';
-$Config{'d_setpgrp'} = 'define';
+$Config{'d_setlocale'} = 'define';
+$Config{'d_setpgid'} = 'define';
 $Config{'d_setpgrp2'} = undef;
+$Config{'d_bsdpgrp'} = '';
+$Config{'d_setpgrp'} = 'define';
 $Config{'d_setprior'} = 'define';
 $Config{'d_setregid'} = 'define';
 $Config{'d_setresgid'} = undef;
-$Config{'d_setreuid'} = 'define';
 $Config{'d_setresuid'} = undef;
+$Config{'d_setreuid'} = 'define';
 $Config{'d_setrgid'} = 'define';
 $Config{'d_setruid'} = 'define';
+$Config{'d_setsid'} = 'define';
 $Config{'d_shm'} = 'define';
 $Config{'d_shmat'} = 'define';
-$Config{'d_voidshmat'} = undef;
 $Config{'d_shmctl'} = 'define';
 $Config{'d_shmdt'} = 'define';
 $Config{'d_shmget'} = 'define';
+$Config{'d_oldsock'} = undef;
 $Config{'d_socket'} = 'define';
 $Config{'d_sockpair'} = 'define';
-$Config{'d_oldsock'} = undef;
+$Config{'sockethdr'} = '';
 $Config{'socketlib'} = '';
 $Config{'d_statblks'} = 'define';
 $Config{'d_stdstdio'} = 'define';
+$Config{'d_index'} = undef;
+$Config{'d_strchr'} = 'define';
 $Config{'d_strctcpy'} = 'define';
+$Config{'d_strerrm'} = 'define';
 $Config{'d_strerror'} = undef;
+$Config{'d_sysernlst'} = '';
+$Config{'d_syserrlst'} = 'define';
 $Config{'d_symlink'} = 'define';
 $Config{'d_syscall'} = 'define';
-$Config{'d_telldir'} = 'define';
+$Config{'d_system'} = 'define';
+$Config{'clocktype'} = 'long';
+$Config{'d_times'} = 'define';
 $Config{'d_truncate'} = 'define';
+$Config{'d_usendir'} = undef;
+$Config{'i_ndir'} = undef;
+$Config{'ndirc'} = '';
+$Config{'ndirlib'} = '';
+$Config{'ndiro'} = '';
 $Config{'d_vfork'} = 'define';
 $Config{'d_voidsig'} = 'define';
-$Config{'d_tosignal'} = 'int';
+$Config{'signal_t'} = 'void';
 $Config{'d_volatile'} = undef;
-$Config{'d_vprintf'} = 'define';
 $Config{'d_charvspr'} = 'define';
+$Config{'d_vprintf'} = 'define';
 $Config{'d_wait4'} = 'define';
 $Config{'d_waitpid'} = 'define';
+$Config{'dlobj'} = 'dl.o';
+$Config{'dlsrc'} = 'dl.c';
+$Config{'usedl'} = 'define';
 $Config{'gidtype'} = 'gid_t';
 $Config{'groupstype'} = 'int';
+$Config{'h_fcntl'} = 'false';
+$Config{'h_sysfile'} = 'true';
+$Config{'i_dbm'} = 'define';
+$Config{'d_dirnamlen'} = undef;
+$Config{'i_dirent'} = 'define';
+$Config{'i_dlfcn'} = 'define';
 $Config{'i_fcntl'} = undef;
 $Config{'i_gdbm'} = undef;
 $Config{'i_grp'} = 'define';
+$Config{'i_ndbm'} = 'define';
 $Config{'i_niin'} = 'define';
 $Config{'i_sysin'} = undef;
-$Config{'i_pwd'} = 'define';
-$Config{'d_pwquota'} = undef;
 $Config{'d_pwage'} = 'define';
 $Config{'d_pwchange'} = undef;
 $Config{'d_pwclass'} = undef;
-$Config{'d_pwexpire'} = undef;
 $Config{'d_pwcomment'} = 'define';
-$Config{'i_sys_file'} = 'define';
+$Config{'d_pwexpire'} = undef;
+$Config{'d_pwquota'} = undef;
+$Config{'i_pwd'} = 'define';
+$Config{'i_stdarg'} = undef;
+$Config{'i_stddef'} = 'define';
+$Config{'i_string'} = 'define';
+$Config{'strings'} = '/usr/include/string.h';
+$Config{'i_sysdir'} = 'define';
+$Config{'i_sysfile'} = 'define';
+$Config{'d_voidtty'} = '';
+$Config{'i_bsdioctl'} = '';
 $Config{'i_sysioctl'} = 'define';
+$Config{'i_syssockio'} = '';
+$Config{'i_sysndir'} = undef;
+$Config{'i_sysselct'} = undef;
+$Config{'i_sgtty'} = undef;
+$Config{'i_termio'} = undef;
+$Config{'i_termios'} = 'define';
+$Config{'i_systime'} = 'define';
+$Config{'i_systimek'} = undef;
 $Config{'i_time'} = undef;
-$Config{'i_sys_time'} = 'define';
-$Config{'i_sys_select'} = undef;
-$Config{'d_systimekernel'} = undef;
+$Config{'timeincl'} = '/usr/include/sys/time.h ';
 $Config{'i_utime'} = 'define';
 $Config{'i_varargs'} = 'define';
+$Config{'i_varhdr'} = 'varargs.h';
 $Config{'i_vfork'} = 'define';
 $Config{'intsize'} = '4';
-$Config{'libc'} = '/usr/lib/libc.so.1.7';
-$Config{'nm_opts'} = '';
-$Config{'libndir'} = '';
-$Config{'i_my_dir'} = undef;
-$Config{'i_ndir'} = undef;
-$Config{'i_sys_ndir'} = undef;
-$Config{'i_dirent'} = 'define';
-$Config{'i_sys_dir'} = undef;
-$Config{'d_dirnamlen'} = undef;
-$Config{'ndirc'} = '';
-$Config{'ndiro'} = '';
-$Config{'mallocsrc'} = 'malloc.c';
+$Config{'lib'} = '/usr/local/lib';
+$Config{'libexp'} = '/usr/local/lib';
+$Config{'libc'} = '/usr/lib/libc.so.1.8.1';
+$Config{'libpth'} = '  /lib /usr/lib /usr/ucblib /usr/local/lib';
+$Config{'plibpth'} = '';
+$Config{'xlibpth'} = '/usr/lib/386 /lib/386';
+$Config{'libs'} = '-ldbm -ldl -lm -lposix';
 $Config{'mallocobj'} = 'malloc.o';
-$Config{'d_mymalloc'} = 'define';
-$Config{'mallocptrtype'} = 'char';
-$Config{'mansrc'} = '/usr/man/manl';
-$Config{'manext'} = 'l';
+$Config{'mallocsrc'} = 'malloc.c';
+$Config{'malloctype'} = 'char *';
+$Config{'usemymalloc'} = 'y';
+$Config{'installmansrc'} = '/usr/local/man/man1';
+$Config{'manext'} = '1';
+$Config{'mansrc'} = '/usr/local/man/man1';
+$Config{'mansrcexp'} = '/usr/local/man/man1';
+$Config{'huge'} = '';
+$Config{'large'} = '';
+$Config{'medium'} = '';
 $Config{'models'} = 'none';
-$Config{'split'} = '';
 $Config{'small'} = '';
-$Config{'medium'} = '';
-$Config{'large'} = '';
-$Config{'huge'} = '';
-$Config{'optimize'} = '-g';
-$Config{'ccflags'} = '-DDEBUGGING -DHAS_SDBM';
-$Config{'cppflags'} = '-DDEBUGGING -DHAS_SDBM';
-$Config{'ldflags'} = '';
-$Config{'cc'} = 'cc';
-$Config{'nativegcc'} = '';
-$Config{'libs'} = '-ldbm -lm -lposix';
-$Config{'n'} = '-n';
+$Config{'split'} = '';
+$Config{'mydomain'} = '';
+$Config{'myhostname'} = 'scalpel';
+$Config{'phostname'} = 'hostname';
 $Config{'c'} = '';
+$Config{'n'} = '-n';
+$Config{'groupcat'} = '';
+$Config{'hostcat'} = 'ypcat hosts';
+$Config{'passcat'} = '';
 $Config{'package'} = 'perl';
+$Config{'spackage'} = '';
+$Config{'installprivlib'} = '/usr/local/lib/perl';
+$Config{'privlib'} = '/usr/local/lib/perl';
+$Config{'privlibexp'} = '/usr/local/lib/perl';
+$Config{'prototype'} = undef;
 $Config{'randbits'} = '31';
+$Config{'installscript'} = '/usr/local/bin';
 $Config{'scriptdir'} = '/usr/local/bin';
-$Config{'installscr'} = '/usr/local/bin';
+$Config{'scriptdirexp'} = '/usr/local/bin';
 $Config{'sig_name'} = 'ZERO HUP INT QUIT ILL TRAP ABRT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM URG STOP TSTP CONT CLD TTIN TTOU IO XCPU XFSZ VTALRM PROF WINCH LOST USR1 USR2';
-$Config{'spitshell'} = 'cat';
-$Config{'shsharp'} = 'true';
 $Config{'sharpbang'} = '#!';
+$Config{'shsharp'} = 'true';
+$Config{'spitshell'} = 'cat';
 $Config{'startsh'} = '#!/bin/sh';
 $Config{'stdchar'} = 'unsigned char';
+$Config{'sysman'} = '/usr/man/man1';
 $Config{'uidtype'} = 'uid_t';
-$Config{'usrinclude'} = '/usr/include';
-$Config{'inclPath'} = '';
-$Config{'void'} = '';
-$Config{'voidhave'} = '7';
-$Config{'voidwant'} = '7';
-$Config{'w_localtim'} = '1';
-$Config{'w_s_timevl'} = '1';
-$Config{'w_s_tm'} = '1';
-$Config{'yacc'} = '/bin/yacc';
-$Config{'lib'} = '';
-$Config{'privlib'} = '/usr/local/lib/perl';
-$Config{'installprivlib'} = '/usr/local/lib/perl';
-$Config{'PATCHLEVEL'} = 34;
+$Config{'nm_opt'} = '';
+$Config{'runnm'} = 'true';
+$Config{'usenm'} = 'true';
+$Config{'incpath'} = '';
+$Config{'mips'} = '';
+$Config{'mips_type'} = '';
+$Config{'usrinc'} = '/usr/include';
+$Config{'defvoidused'} = '15';
+$Config{'voidflags'} = '15';
+$Config{'yacc'} = 'yacc';
+$Config{'yaccflags'} = '';
+$Config{'PATCHLEVEL'} = 0;
 $Config{'CONFIG'} = true
index 959e5b6..ba89b16 100644 (file)
@@ -5,7 +5,6 @@ require Exporter;
 
 @EXPORT = qw(
        *ARG
-       $MAGIC
        $MATCH
        $PREMATCH
        $POSTMATCH
@@ -58,7 +57,6 @@ require Exporter;
 
 # The ground of all being.
 
-       *MAGIC                                  = \$_   ;
        *ARG                                    = *_    ;
 
 # Matching.
index b975c2b..2452a15 100644 (file)
@@ -3,15 +3,32 @@ package FileHandle;
 BEGIN {
     require 5.000;
     require English; import English;
+    require Exporter;
 }
-@ISA = ();
+
+@ISA = (Exporter);
+@EXPORT = qw(
+    print
+    autoflush
+    output_field_separator
+    output_record_separator
+    input_record_separator
+    input_line_number
+    format_page_number
+    format_lines_per_page
+    format_lines_left
+    format_name
+    format_top_name
+    format_line_break_characters
+    format_formfeed
+);
 
 sub print {
     local($this) = shift;
     print $this @_;
 }
 
-sub output_autoflush {
+sub autoflush {
     local($old) = select($_[0]);
     local($prev) = $OUTPUT_AUTOFLUSH;
     $OUTPUT_AUTOFLUSH = @_ > 1 ? $_[1] : 1;
index bf5d355..4d08f25 100644 (file)
@@ -52,7 +52,7 @@ $H{limits_h} =        [qw( ARG_MAX CHAR_BIT CHAR_MAX CHAR_MIN CHILD_MAX
                _POSIX_STREADM_MAX _POSIX_TZNAME_MAX)];
 
 $H{locale_h} =  [qw(LC_ALL LC_COLLATE LC_CTYPE LC_MONETARY LC_NUMERIC
-               LC_TIME NULL localeconf setlocale)];
+               LC_TIME NULL localeconv setlocale)];
 
 $H{math_h} =    [qw(HUGE_VAL acos asin atan2 atan ceil cos cosh exp
                fabs floor fmod frexp ldexp log10 log modf pow sin sinh
@@ -66,8 +66,7 @@ $H{signal_h} =  [qw(SA_NOCLDSTOP SIGABRT SIGALRM SIGCHLD SIGCONT SIGFPE
                SIGHUP SIGILL SIGINT SIGKILL SIGPIPE SIGQUIT SIGSEGV
                SIGSTOP SIGTERM SIGTSTP SIGTTIN SIGTTOU SIGUSR1 SIGUSR2
                SIG_BLOCK SIG_DFL SIG_ERR SIG_IGN SIG_SETMASK SIG_UNBLOCK
-               kill raise sigaction sigaddset sigdelset sigemptyset
-               sigfillset sigismember signal sigpending sigprocmask
+               kill raise sigaction signal sigpending sigprocmask
                sigsuspend)];
 
 $H{stdarg_h} = [qw()];
@@ -170,15 +169,943 @@ sub import {
     Exporter::import($this,@list);
 }
 
+sub AUTOLOAD {
+    if ($AUTOLOAD =~ /::(_?[a-z])/) {
+       $AutoLoader::AUTOLOAD = $AUTOLOAD;
+       goto &AutoLoader::AUTOLOAD
+    }
+    local $constname = $AUTOLOAD;
+    $constname =~ s/.*:://;
+    $val = constant($constname, $_[0]);
+    if ($! != 0) {
+       ($pack,$file,$line) = caller;
+       if ($! =~ /Invalid/) {
+           die "$constname is not a valid POSIX macro at $file line $line.\n";
+       }
+       else {
+           die "Your vendor has not defined POSIX macro $constname, used at $file line $line.\n";
+       }
+    }
+    eval "sub $AUTOLOAD { $val }";
+    goto &$AUTOLOAD;
+}
+
 bootstrap POSIX;
 
-sub usage { local ($mess, $pack, $file, $line) = @_;
-    die "Usage: POSIX::$_[0] at $file line $line\n";
+sub usage { 
+    local ($mess, $pack, $file, $line) = @_;
+    die "Usage: POSIX::$mess at $file line $line\n";
+}
+
+sub unimpl { 
+    local ($mess, $pack, $file, $line) = @_;
+    $mess =~ s/xxx//;
+    die "Unimplemented: POSIX::$mess at $file line $line\n";
+}
+
+$gensym = "SYM000";
+
+sub gensym {
+    $gensym++;
+}
+
+sub ungensym {
+    delete $_POSIX{$_[0]};
 }
 
 1;
 
+package POSIX::SigAction;
+
+sub new {
+    bless {HANDLER => $_[1], MASK => $_[2], FLAGS => $_[3]};
+}
 __END__
+
+sub assert {
+    usage "assert(expr)", caller if @_ != 1;
+    if (!$_[0]) {
+       local ($pack,$file,$line) = caller;
+       die "Assertion failed at $file line $line\n";
+    }
+}
+
+sub tolower {
+    usage "tolower(string)", caller if @_ != 1;
+    lc($_[0]);
+}
+
+sub toupper {
+    usage "toupper(string)", caller if @_ != 1;
+    uc($_[0]);
+}
+
+sub closedir {
+    usage "closedir(dirhandle)", caller if @_ != 1;
+    closedir($_[0]);
+    ungensym($_[0]);
+}
+
+sub opendir {
+    usage "opendir(directory)", caller if @_ != 1;
+    local($dirhandle) = &gensym;
+    opendir($dirhandle, $_[0])
+       ? $dirhandle
+       : (ungensym($dirhandle), undef);
+}
+
+sub readdir {
+    usage "readdir(dirhandle)", caller if @_ != 1;
+    readdir($_[0]);
+}
+
+sub rewinddir {
+    usage "rewinddir(dirhandle)", caller if @_ != 1;
+    rewinddir($_[0]);
+}
+
+sub errno {
+    usage "errno()", caller if @_ != 0;
+    $! + 0;
+}
+
+sub creat {
+    usage "creat(filename, mode)", caller if @_ != 2;
+    &open($_[0], &O_WRONLY | &O_CREAT | &O_TRUNC, $_[2]);
+}
+
+sub fcntl {
+    usage "fcntl(filehandle, cmd, arg)", caller if @_ != 3;
+    fcntl($_[0], $_[1], $_[2]);
+}
+
+sub getgrgid {
+    usage "getgrgid(gid)", caller if @_ != 1;
+    getgrgid($_[0]);
+}
+
+sub getgrnam {
+    usage "getgrnam(name)", caller if @_ != 1;
+    getgrnam($_[0]);
+}
+
+sub atan2 {
+    usage "atan2(x,y)", caller if @_ != 2;
+    atan2($_[0], $_[1]);
+}
+
+sub cos {
+    usage "cos(x)", caller if @_ != 1;
+    cos($_[0]);
+}
+
+sub exp {
+    usage "exp(x)", caller if @_ != 1;
+    exp($_[0]);
+}
+
+sub fabs {
+    usage "fabs(x)", caller if @_ != 1;
+    abs($_[0]);
+}
+
+sub log {
+    usage "log(x)", caller if @_ != 1;
+    log($_[0]);
+}
+
+sub pow {
+    usage "pow(x,exponent)", caller if @_ != 2;
+    $_[0] ** $_[1];
+}
+
+sub sin {
+    usage "sin(x)", caller if @_ != 1;
+    sin($_[0]);
+}
+
+sub sqrt {
+    usage "sqrt(x)", caller if @_ != 1;
+    sqrt($_[0]);
+}
+
+sub tan {
+    usage "tan(x)", caller if @_ != 1;
+    tan($_[0]);
+}
+
+sub getpwnam {
+    usage "getpwnam(name)", caller if @_ != 1;
+    getpwnam($_[0]);
+}
+
+sub getpwuid {
+    usage "getpwuid(uid)", caller if @_ != 1;
+    getpwuid($_[0]);
+}
+
+sub longjmp {
+    unimpl "longjmp() is C-specific: use die instead", caller;
+}
+
+sub setjmp {
+    unimpl "setjmp() is C-specific: use eval {} instead", caller;
+}
+
+sub siglongjmp {
+    unimpl "siglongjmp() is C-specific: use die instead", caller;
+}
+
+sub sigsetjmp {
+    unimpl "sigsetjmp() is C-specific: use eval {} instead", caller;
+}
+
+sub kill {
+    usage "kill(pid, sig)", caller if @_ != 2;
+    kill $_[1], $_[0];
+}
+
+sub raise {
+    usage "raise(sig)", caller if @_ != 1;
+    kill $$, $_[0];    # Is this good enough?
+}
+
+sub offsetof {
+    unimpl "offsetof() is C-specific, stopped", caller;
+}
+
+sub clearerr {
+    usage "clearerr(filehandle)", caller if @_ != 1;
+    seek($_[0], 0, 1);
+}
+
+sub fclose {
+    unimpl "fclose() is C-specific--use close instead", caller;
+}
+
+sub feof {
+    usage "feof(filehandle)", caller if @_ != 1;
+    eof($_[0]);
+}
+
+sub fgetc {
+    usage "fgetc(filehandle)", caller if @_ != 1;
+    getc($_[0]);
+}
+
+sub fgetpos {
+    unimpl "fgetpos(xxx)", caller if @_ != 123;
+    fgetpos($_[0]);
+}
+
+sub fgets {
+    usage "fgets(filehandle)", caller if @_ != 1;
+    local($handle) = @_;
+    scalar <$handle>;
+}
+
+sub fileno {
+    usage "fileno(filehandle)", caller if @_ != 1;
+    fileno($_[0]);
+}
+
+sub fopen {
+    unimpl "fopen() is C-specific--use open instead", caller;
+}
+
+sub fprintf {
+    unimpl "fprintf() is C-specific--use printf instead", caller;
+}
+
+sub fputc {
+    unimpl "fputc() is C-specific--use print instead", caller;
+}
+
+sub fputs {
+    unimpl "fputs() is C-specific--use print instead", caller;
+    usage "fputs(string, handle)", caller if @_ != 2;
+    local($handle) = pop;
+    print $handle @_;
+}
+
+sub fread {
+    unimpl "fread() is C-specific--use read instead", caller;
+    unimpl "fread(xxx)", caller if @_ != 123;
+    fread($_[0]);
+}
+
+sub freopen {
+    unimpl "freopen() is C-specific--use open instead", caller;
+    unimpl "freopen(xxx)", caller if @_ != 123;
+    freopen($_[0]);
+}
+
+sub fscanf {
+    unimpl "fscanf() is C-specific--use <> and regular expressions instead", caller;
+    unimpl "fscanf(xxx)", caller if @_ != 123;
+    fscanf($_[0]);
+}
+
+sub fseek {
+    unimpl "fseek() is C-specific--use seek instead", caller;
+    unimpl "fseek(xxx)", caller if @_ != 123;
+    fseek($_[0]);
+}
+
+sub fsetpos {
+    unimpl "fsetpos() is C-specific--use seek instead", caller;
+    unimpl "fsetpos(xxx)", caller if @_ != 123;
+    fsetpos($_[0]);
+}
+
+sub ftell {
+    unimpl "ftell() is C-specific--use tell instead", caller;
+    unimpl "ftell(xxx)", caller if @_ != 123;
+    ftell($_[0]);
+}
+
+sub fwrite {
+    unimpl "fwrite() is C-specific--use print instead", caller;
+    unimpl "fwrite(xxx)", caller if @_ != 123;
+    fwrite($_[0]);
+}
+
+sub getc {
+    usage "getc(handle)", caller if @_ != 1;
+    getc($_[0]);
+}
+
+sub getchar {
+    usage "getchar()", caller if @_ != 0;
+    getc(STDIN);
+}
+
+sub gets {
+    usage "gets(handle)", caller if @_ != 1;
+    local($handle) = shift;
+    scalar <$handle>;
+}
+
+sub perror {
+    unimpl "perror() is C-specific--print $! instead", caller;
+    unimpl "perror(xxx)", caller if @_ != 123;
+    perror($_[0]);
+}
+
+sub printf {
+    usage "printf(pattern, args...)", caller if @_ < 1;
+    printf STDOUT @_;
+}
+
+sub putc {
+    unimpl "putc() is C-specific--use print instead", caller;
+    unimpl "putc(xxx)", caller if @_ != 123;
+    putc($_[0]);
+}
+
+sub putchar {
+    unimpl "putchar() is C-specific--use print instead", caller;
+    unimpl "putchar(xxx)", caller if @_ != 123;
+    putchar($_[0]);
+}
+
+sub puts {
+    unimpl "puts() is C-specific--use print instead", caller;
+    unimpl "puts(xxx)", caller if @_ != 123;
+    puts($_[0]);
+}
+
+sub remove {
+    unimpl "remove(xxx)", caller if @_ != 123;
+    remove($_[0]);
+}
+
+sub rename {
+    unimpl "rename(xxx)", caller if @_ != 123;
+    rename($_[0]);
+}
+
+sub rewind {
+    unimpl "rewind(xxx)", caller if @_ != 123;
+    rewind($_[0]);
+}
+
+sub scanf {
+    unimpl "scanf(xxx)", caller if @_ != 123;
+    scanf($_[0]);
+}
+
+sub setbuf {
+    unimpl "setbuf(xxx)", caller if @_ != 123;
+    setbuf($_[0]);
+}
+
+sub setvbuf {
+    unimpl "setvbuf(xxx)", caller if @_ != 123;
+    setvbuf($_[0]);
+}
+
+sub sprintf {
+    unimpl "sprintf(xxx)", caller if @_ != 123;
+    sprintf($_[0]);
+}
+
+sub sscanf {
+    unimpl "sscanf(xxx)", caller if @_ != 123;
+    sscanf($_[0]);
+}
+
+sub tmpfile {
+    unimpl "tmpfile(xxx)", caller if @_ != 123;
+    tmpfile($_[0]);
+}
+
+sub tmpnam {
+    unimpl "tmpnam(xxx)", caller if @_ != 123;
+    tmpnam($_[0]);
+}
+
+sub ungetc {
+    unimpl "ungetc(xxx)", caller if @_ != 123;
+    ungetc($_[0]);
+}
+
+sub vfprintf {
+    unimpl "vfprintf(xxx)", caller if @_ != 123;
+    vfprintf($_[0]);
+}
+
+sub vprintf {
+    unimpl "vprintf(xxx)", caller if @_ != 123;
+    vprintf($_[0]);
+}
+
+sub vsprintf {
+    unimpl "vsprintf(xxx)", caller if @_ != 123;
+    vsprintf($_[0]);
+}
+
+sub abort {
+    unimpl "abort(xxx)", caller if @_ != 123;
+    abort($_[0]);
+}
+
+sub abs {
+    usage "abs(x)", caller if @_ != 1;
+    abs($_[0]);
+}
+
+sub atexit {
+    unimpl "atexit() is C-specific: use END {} instead", caller;
+}
+
+sub atof {
+    unimpl "atof() is C-specific, stopped", caller;
+}
+
+sub atoi {
+    unimpl "atoi() is C-specific, stopped", caller;
+}
+
+sub atol {
+    unimpl "atol() is C-specific, stopped", caller;
+}
+
+sub bsearch {
+    unimpl "bsearch(xxx)", caller if @_ != 123;
+    bsearch($_[0]);
+}
+
+sub calloc {
+    unimpl "calloc(xxx)", caller if @_ != 123;
+    calloc($_[0]);
+}
+
+sub div {
+    unimpl "div(xxx)", caller if @_ != 123;
+    div($_[0]);
+}
+
+sub exit {
+    unimpl "exit(xxx)", caller if @_ != 123;
+    exit($_[0]);
+}
+
+sub free {
+    unimpl "free(xxx)", caller if @_ != 123;
+    free($_[0]);
+}
+
+sub getenv {
+    unimpl "getenv(xxx)", caller if @_ != 123;
+    getenv($_[0]);
+}
+
+sub labs {
+    unimpl "labs(xxx)", caller if @_ != 123;
+    labs($_[0]);
+}
+
+sub ldiv {
+    unimpl "ldiv(xxx)", caller if @_ != 123;
+    ldiv($_[0]);
+}
+
+sub malloc {
+    unimpl "malloc(xxx)", caller if @_ != 123;
+    malloc($_[0]);
+}
+
+sub mblen {
+    unimpl "mblen(xxx)", caller if @_ != 123;
+    mblen($_[0]);
+}
+
+sub mbstowcs {
+    unimpl "mbstowcs(xxx)", caller if @_ != 123;
+    mbstowcs($_[0]);
+}
+
+sub mbtowc {
+    unimpl "mbtowc(xxx)", caller if @_ != 123;
+    mbtowc($_[0]);
+}
+
+sub qsort {
+    unimpl "qsort(xxx)", caller if @_ != 123;
+    qsort($_[0]);
+}
+
+sub rand {
+    unimpl "rand(xxx)", caller if @_ != 123;
+    rand($_[0]);
+}
+
+sub realloc {
+    unimpl "realloc(xxx)", caller if @_ != 123;
+    realloc($_[0]);
+}
+
+sub srand {
+    unimpl "srand(xxx)", caller if @_ != 123;
+    srand($_[0]);
+}
+
+sub strtod {
+    unimpl "strtod(xxx)", caller if @_ != 123;
+    strtod($_[0]);
+}
+
+sub strtol {
+    unimpl "strtol(xxx)", caller if @_ != 123;
+    strtol($_[0]);
+}
+
+sub stroul {
+    unimpl "stroul(xxx)", caller if @_ != 123;
+    stroul($_[0]);
+}
+
+sub system {
+    unimpl "system(xxx)", caller if @_ != 123;
+    system($_[0]);
+}
+
+sub wcstombs {
+    unimpl "wcstombs(xxx)", caller if @_ != 123;
+    wcstombs($_[0]);
+}
+
+sub wctomb {
+    unimpl "wctomb(xxx)", caller if @_ != 123;
+    wctomb($_[0]);
+}
+
+sub memchr {
+    unimpl "memchr(xxx)", caller if @_ != 123;
+    memchr($_[0]);
+}
+
+sub memcmp {
+    unimpl "memcmp(xxx)", caller if @_ != 123;
+    memcmp($_[0]);
+}
+
+sub memcpy {
+    unimpl "memcpy(xxx)", caller if @_ != 123;
+    memcpy($_[0]);
+}
+
+sub memmove {
+    unimpl "memmove(xxx)", caller if @_ != 123;
+    memmove($_[0]);
+}
+
+sub memset {
+    unimpl "memset(xxx)", caller if @_ != 123;
+    memset($_[0]);
+}
+
+sub strcat {
+    unimpl "strcat(xxx)", caller if @_ != 123;
+    strcat($_[0]);
+}
+
+sub strchr {
+    unimpl "strchr(xxx)", caller if @_ != 123;
+    strchr($_[0]);
+}
+
+sub strcmp {
+    unimpl "strcmp(xxx)", caller if @_ != 123;
+    strcmp($_[0]);
+}
+
+sub strcoll {
+    unimpl "strcoll(xxx)", caller if @_ != 123;
+    strcoll($_[0]);
+}
+
+sub strcpy {
+    unimpl "strcpy(xxx)", caller if @_ != 123;
+    strcpy($_[0]);
+}
+
+sub strcspn {
+    unimpl "strcspn(xxx)", caller if @_ != 123;
+    strcspn($_[0]);
+}
+
+sub strerror {
+    unimpl "strerror(xxx)", caller if @_ != 123;
+    strerror($_[0]);
+}
+
+sub strlen {
+    unimpl "strlen(xxx)", caller if @_ != 123;
+    strlen($_[0]);
+}
+
+sub strncat {
+    unimpl "strncat(xxx)", caller if @_ != 123;
+    strncat($_[0]);
+}
+
+sub strncmp {
+    unimpl "strncmp(xxx)", caller if @_ != 123;
+    strncmp($_[0]);
+}
+
+sub strncpy {
+    unimpl "strncpy(xxx)", caller if @_ != 123;
+    strncpy($_[0]);
+}
+
+sub strpbrk {
+    unimpl "strpbrk(xxx)", caller if @_ != 123;
+    strpbrk($_[0]);
+}
+
+sub strrchr {
+    unimpl "strrchr(xxx)", caller if @_ != 123;
+    strrchr($_[0]);
+}
+
+sub strspn {
+    unimpl "strspn(xxx)", caller if @_ != 123;
+    strspn($_[0]);
+}
+
+sub strstr {
+    unimpl "strstr(xxx)", caller if @_ != 123;
+    strstr($_[0]);
+}
+
+sub strtok {
+    unimpl "strtok(xxx)", caller if @_ != 123;
+    strtok($_[0]);
+}
+
+sub strxfrm {
+    unimpl "strxfrm(xxx)", caller if @_ != 123;
+    strxfrm($_[0]);
+}
+
+sub chmod {
+    unimpl "chmod(xxx)", caller if @_ != 123;
+    chmod($_[0]);
+}
+
+sub fstat {
+    unimpl "fstat(xxx)", caller if @_ != 123;
+    fstat($_[0]);
+}
+
+sub mkdir {
+    unimpl "mkdir(xxx)", caller if @_ != 123;
+    mkdir($_[0]);
+}
+
+sub mkfifo {
+    unimpl "mkfifo(xxx)", caller if @_ != 123;
+    mkfifo($_[0]);
+}
+
+sub stat {
+    unimpl "stat(xxx)", caller if @_ != 123;
+    stat($_[0]);
+}
+
+sub umask {
+    unimpl "umask(xxx)", caller if @_ != 123;
+    umask($_[0]);
+}
+
+sub times {
+    unimpl "times(xxx)", caller if @_ != 123;
+    times($_[0]);
+}
+
+sub wait {
+    unimpl "wait(xxx)", caller if @_ != 123;
+    wait($_[0]);
+}
+
+sub waitpid {
+    unimpl "waitpid(xxx)", caller if @_ != 123;
+    waitpid($_[0]);
+}
+
+sub cfgetispeed {
+    unimpl "cfgetispeed(xxx)", caller if @_ != 123;
+    cfgetispeed($_[0]);
+}
+
+sub cfgetospeed {
+    unimpl "cfgetospeed(xxx)", caller if @_ != 123;
+    cfgetospeed($_[0]);
+}
+
+sub cfsetispeed {
+    unimpl "cfsetispeed(xxx)", caller if @_ != 123;
+    cfsetispeed($_[0]);
+}
+
+sub cfsetospeed {
+    unimpl "cfsetospeed(xxx)", caller if @_ != 123;
+    cfsetospeed($_[0]);
+}
+
+sub tcdrain {
+    unimpl "tcdrain(xxx)", caller if @_ != 123;
+    tcdrain($_[0]);
+}
+
+sub tcflow {
+    unimpl "tcflow(xxx)", caller if @_ != 123;
+    tcflow($_[0]);
+}
+
+sub tcflush {
+    unimpl "tcflush(xxx)", caller if @_ != 123;
+    tcflush($_[0]);
+}
+
+sub tcgetattr {
+    unimpl "tcgetattr(xxx)", caller if @_ != 123;
+    tcgetattr($_[0]);
+}
+
+sub tcsendbreak {
+    unimpl "tcsendbreak(xxx)", caller if @_ != 123;
+    tcsendbreak($_[0]);
+}
+
+sub tcsetattr {
+    unimpl "tcsetattr(xxx)", caller if @_ != 123;
+    tcsetattr($_[0]);
+}
+
+sub asctime {
+    unimpl "asctime(xxx)", caller if @_ != 123;
+    asctime($_[0]);
+}
+
+sub clock {
+    unimpl "clock(xxx)", caller if @_ != 123;
+    clock($_[0]);
+}
+
+sub ctime {
+    unimpl "ctime(xxx)", caller if @_ != 123;
+    ctime($_[0]);
+}
+
+sub difftime {
+    unimpl "difftime(xxx)", caller if @_ != 123;
+    difftime($_[0]);
+}
+
+sub gmtime {
+    unimpl "gmtime(xxx)", caller if @_ != 123;
+    gmtime($_[0]);
+}
+
+sub localtime {
+    unimpl "localtime(xxx)", caller if @_ != 123;
+    localtime($_[0]);
+}
+
+sub mktime {
+    unimpl "mktime(xxx)", caller if @_ != 123;
+    mktime($_[0]);
+}
+
+sub strftime {
+    unimpl "strftime(xxx)", caller if @_ != 123;
+    strftime($_[0]);
+}
+
+sub time {
+    unimpl "time(xxx)", caller if @_ != 123;
+    time($_[0]);
+}
+
+sub tzset {
+    unimpl "tzset(xxx)", caller if @_ != 123;
+    tzset($_[0]);
+}
+
+sub tzname {
+    unimpl "tzname(xxx)", caller if @_ != 123;
+    tzname($_[0]);
+}
+
+sub _exit {
+    unimpl "_exit(xxx)", caller if @_ != 123;
+    _exit($_[0]);
+}
+
+sub access {
+    unimpl "access(xxx)", caller if @_ != 123;
+    access($_[0]);
+}
+
+sub alarm {
+    unimpl "alarm(xxx)", caller if @_ != 123;
+    alarm($_[0]);
+}
+
+sub chdir {
+    unimpl "chdir(xxx)", caller if @_ != 123;
+    chdir($_[0]);
+}
+
+sub chown {
+    unimpl "chown(xxx)", caller if @_ != 123;
+    chown($_[0]);
+}
+
+sub close {
+    unimpl "close(xxx)", caller if @_ != 123;
+    close($_[0]);
+}
+
+sub ctermid {
+    unimpl "ctermid(xxx)", caller if @_ != 123;
+    ctermid($_[0]);
+}
+
+sub cuserid {
+    unimpl "cuserid(xxx)", caller if @_ != 123;
+    cuserid($_[0]);
+}
+
+sub dup2 {
+    unimpl "dup2(xxx)", caller if @_ != 123;
+    dup2($_[0]);
+}
+
+sub dup {
+    unimpl "dup(xxx)", caller if @_ != 123;
+    dup($_[0]);
+}
+
+sub execl {
+    unimpl "execl(xxx)", caller if @_ != 123;
+    execl($_[0]);
+}
+
+sub execle {
+    unimpl "execle(xxx)", caller if @_ != 123;
+    execle($_[0]);
+}
+
+sub execlp {
+    unimpl "execlp(xxx)", caller if @_ != 123;
+    execlp($_[0]);
+}
+
+sub execv {
+    unimpl "execv(xxx)", caller if @_ != 123;
+    execv($_[0]);
+}
+
+sub execve {
+    unimpl "execve(xxx)", caller if @_ != 123;
+    execve($_[0]);
+}
+
+sub execvp {
+    unimpl "execvp(xxx)", caller if @_ != 123;
+    execvp($_[0]);
+}
+
+sub fork {
+    usage "fork()", caller if @_ != 0;
+    fork;
+}
+
+sub fpathconf {
+    unimpl "fpathconf(xxx)", caller if @_ != 123;
+    fpathconf($_[0]);
+}
+
+sub getcwd {
+    unimpl "getcwd(xxx)", caller if @_ != 123;
+    getcwd($_[0]);
+}
+
+sub getegid {
+    unimpl "getegid(xxx)", caller if @_ != 123;
+    getegid($_[0]);
+}
+
+sub geteuid {
+    unimpl "geteuid(xxx)", caller if @_ != 123;
+    geteuid($_[0]);
+}
+
+sub getgid {
+    unimpl "getgid(xxx)", caller if @_ != 123;
+    getgid($_[0]);
+}
+
+sub getgroups {
+    unimpl "getgroups(xxx)", caller if @_ != 123;
+    getgroups($_[0]);
+}
+
+sub getlogin {
+    unimpl "getlogin(xxx)", caller if @_ != 123;
+    getlogin($_[0]);
+}
+
+sub getpgrp {
+    unimpl "getpgrp(xxx)", caller if @_ != 123;
+    getpgrp($_[0]);
+}
+
 sub getpid {
     usage "getpid()", caller if @_ != 0;
     $$;
@@ -189,12 +1116,108 @@ sub getppid {
     getppid;
 }
 
-sub fork {
-    usage "fork()", caller if @_ != 0;
-    fork;
+sub getuid {
+    unimpl "getuid(xxx)", caller if @_ != 123;
+    getuid($_[0]);
 }
 
-sub kill {
-    usage "kill(pid, sig)", caller if @_ != 2;
-    kill $_[1], $_[0];
+sub isatty {
+    unimpl "isatty(xxx)", caller if @_ != 123;
+    isatty($_[0]);
+}
+
+sub link {
+    unimpl "link(xxx)", caller if @_ != 123;
+    link($_[0]);
+}
+
+sub lseek {
+    unimpl "lseek(xxx)", caller if @_ != 123;
+    lseek($_[0]);
+}
+
+sub pathconf {
+    unimpl "pathconf(xxx)", caller if @_ != 123;
+    pathconf($_[0]);
+}
+
+sub pause {
+    unimpl "pause(xxx)", caller if @_ != 123;
+    pause($_[0]);
+}
+
+sub pipe {
+    unimpl "pipe(xxx)", caller if @_ != 123;
+    pipe($_[0]);
+}
+
+sub read {
+    unimpl "read(xxx)", caller if @_ != 123;
+    read($_[0]);
+}
+
+sub rmdir {
+    unimpl "rmdir(xxx)", caller if @_ != 123;
+    rmdir($_[0]);
+}
+
+sub setgid {
+    unimpl "setgid(xxx)", caller if @_ != 123;
+    setgid($_[0]);
+}
+
+sub setpgid {
+    unimpl "setpgid(xxx)", caller if @_ != 123;
+    setpgid($_[0]);
+}
+
+sub setsid {
+    unimpl "setsid(xxx)", caller if @_ != 123;
+    setsid($_[0]);
+}
+
+sub setuid {
+    unimpl "setuid(xxx)", caller if @_ != 123;
+    setuid($_[0]);
+}
+
+sub sleep {
+    unimpl "sleep(xxx)", caller if @_ != 123;
+    sleep($_[0]);
+}
+
+sub sysconf {
+    unimpl "sysconf(xxx)", caller if @_ != 123;
+    sysconf($_[0]);
 }
+
+sub tcgetpgrp {
+    unimpl "tcgetpgrp(xxx)", caller if @_ != 123;
+    tcgetpgrp($_[0]);
+}
+
+sub tcsetpgrp {
+    unimpl "tcsetpgrp(xxx)", caller if @_ != 123;
+    tcsetpgrp($_[0]);
+}
+
+sub ttyname {
+    unimpl "ttyname(xxx)", caller if @_ != 123;
+    ttyname($_[0]);
+}
+
+sub unlink {
+    unimpl "unlink(xxx)", caller if @_ != 123;
+    unlink($_[0]);
+}
+
+sub write {
+    unimpl "write(xxx)", caller if @_ != 123;
+    write($_[0]);
+}
+
+sub utime {
+    unimpl "utime(xxx)", caller if @_ != 123;
+    utime($_[0]);
+}
+
diff --git a/lib/auto/POSIX/_exit b/lib/auto/POSIX/_exit
new file mode 100644 (file)
index 0000000..a860527
--- /dev/null
@@ -0,0 +1,9 @@
+package POSIX;
+
+sub _exit {
+    unimpl "_exit(xxx)", caller if @_ != 123;
+    _exit($_[0]);
+}
+
+
+1;
diff --git a/lib/auto/README b/lib/auto/README
new file mode 100644 (file)
index 0000000..b217acc
--- /dev/null
@@ -0,0 +1,2 @@
+Everything down here is derived from elsewhere.  If you modify anything
+down here it will someday be overwritten.
diff --git a/lib/dotsh.pl.art b/lib/dotsh.pl.art
new file mode 100644 (file)
index 0000000..4f0f188
--- /dev/null
@@ -0,0 +1,154 @@
+Article 19995 of comp.lang.perl:
+Newsgroups: comp.lang.perl
+Path: netlabs!news.cerf.net!mvb.saic.com!MathWorks.Com!europa.eng.gtefsd.com!howland.reston.ans.net!news.ans.net!malgudi.oar.net!chemabs!skf26
+From: skf26@cas.org (Scott Frost)
+Subject: HOW TO source shell scripts into Perl
+Message-ID: <1994Mar21.191518.11636@chemabs.uucp>
+Followup-To: scott.frost@cas.org
+Keywords: Shell, Source, Dot
+Sender: usenet@chemabs.uucp
+Organization: Chemical Abstracts Service
+Date: Mon, 21 Mar 1994 19:15:18 GMT
+Lines: 139
+
+A few days ago I posted a request for information on how to source
+a shell script into a perl script.  In general, the responses indicated that
+it could not be done (although one came pretty close to the actual solution).
+
+A fellow staff member (who I was posting the request for) wasn't satisfied with
+the response and came up with a way.
+
+Before I indicate how he solved the problem, let me suggest some alternative
+methods of resolving this issue,
+
+   1.  Hard code the environment variables directly in your PERL script.  This
+       is easy but unreliable.  System administrators could change the
+       production shell script environment variables and your PERL script would
+       be hosed.
+
+   2.  Create a shell wrapper that dots the shell script into your current
+       environment and then invoke your perl script.  This approach is easy
+       to do, fairly full proof, but an affront to serious PERL programmers
+       who believe PERL is God's gift to man (or at least Larry's :-) ).
+
+Chuck's solution involves running the script in the appropriate shell
+environment, dumping the shell's environment variables to a file, and then
+reading the environment variables into PERL's environment.
+
+It supports ksh, sh, csh, and zsh shells.  It'll look at the first line of
+the file to be executed to determine the shell to run it under, if not found,
+it'll look at the SHELL environment variable.  If the shell is not one of the
+four listed, it'll warn you and attempt to run the shell script under /bin/sh.
+
+      A typical usage might look like this,
+      #!/usr/bin/perl
+
+      # Make sure dotsh.pl is placed in your /usr/perl/lib
+      require "dotsh.pl";
+
+      print "SHELL_ENV_VAR = $SHELL_ENV_VAR\n" ;
+      &dotsh('/tmp/foo') ;                      # script to run
+      print "SHELL_ENV_VAR = $SHELL_ENV_VAR\n" ;
+
+      /tmp/foo looks like this:
+      #!/bin/ksh
+      export SHELL_ENV_VAR="hi mom"
+
+The actual dotsh.pl script follows (BTW, this is now public domain):
+#
+#   @(#)dotsh.pl                                               03/19/94
+#
+#   Author: Charles Collins
+#
+#   Description:
+#      This routine takes a shell script and 'dots' it into the current perl
+#      environment. This makes it possible to use existing system scripts
+#      to alter environment variables on the fly.
+#
+#   Usage:
+#      &dotsh ('ShellScript', 'DependentVariable(s)');
+#
+#         where
+#
+#      'ShellScript' is the full name of the shell script to be dotted
+#
+#      'DependentVariable(s)' is an optional list of shell variables in the
+#         form VARIABLE=VALUE,VARIABLE=VALUE,... that 'ShellScript' is
+#         dependent upon. These variables MUST be defined using shell syntax.
+#
+#   Example:
+#      &dotsh ('/tmp/foo', 'arg1');
+#      &dotsh ('/tmp/foo');
+#      &dotsh ('/tmp/foo arg1 ... argN');
+#
+sub dotsh {
+   local(@sh) = @_;
+   local($tmp,$key,$shell,*dotsh,$command,$args,$vars) = '';
+   $dotsh = shift(@sh);
+   @dotsh = split (/\s/, $dotsh);
+   $command = shift (@dotsh);
+   $args = join (" ", @dotsh);
+   $vars = join ("\n", @sh);
+   open (_SH_ENV, "$command") || die "Could not open $dotsh!\n";
+   chop($_ = <_SH_ENV>);
+   $shell = "$1 -c" if ($_ =~ /^\#\!\s*(\S+(\/sh|\/ksh|\/zsh|\/csh))\s*$/);
+   close (_SH_ENV);
+   if (!$shell) {
+      if ($ENV{'SHELL'} =~ /\/sh$|\/ksh$|\/zsh$|\/csh$/) {
+        $shell = "$ENV{'SHELL'} -c";
+      } else {
+        print "SHELL not recognized!\nUsing /bin/sh...\n";
+        $shell = "/bin/sh -c";
+      }
+   }
+   if (length($vars) > 0) {
+      system "$shell \"$vars;. $command $args; set > /tmp/_sh_env$$\"";
+   } else {
+      system "$shell \". $command $args; set > /tmp/_sh_env$$\"";
+   }
+
+   open (_SH_ENV, "/tmp/_sh_env$$") || die "Could not open /tmp/_sh_env$$!\n";
+   while (<_SH_ENV>) {
+       chop;
+       /=/;
+       $ENV{$`} = $';
+   }
+   close (_SH_ENV);
+   system "rm -f /tmp/_sh_env$$";
+
+   foreach $key (keys(ENV)) {
+       $tmp .= "\$$key = \$ENV{'$key'};" if $key =~ /^[A-Za-z]\w*$/;
+   }
+   eval $tmp;
+}
+1;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+--
+Scott K. Frost                                    INET: scott.frost@cas.org
+
+
diff --git a/lib/quotewords.pl.art b/lib/quotewords.pl.art
new file mode 100644 (file)
index 0000000..65e9f0a
--- /dev/null
@@ -0,0 +1,146 @@
+Article 20075 of comp.lang.perl:
+Newsgroups: comp.lang.perl
+Path: netlabs!news.cerf.net!ihnp4.ucsd.edu!swrinde!sgiblab!rpal.rockwell.com!imagen!pomeranz
+From: pomeranz@imagen.com (Hal Pomeranz)
+Subject: quotewords.pl [REVISED]
+Message-ID: <1994Mar23.071634.23171@aqm.com>
+Sender: usenet@aqm.com
+Nntp-Posting-Host: imagen
+Organization: QMS Inc., Santa Clara
+Date: Wed, 23 Mar 1994 07:16:34 GMT
+Lines: 132
+
+
+ARRGH!  The version I posted earlier tonight contained an error, so
+I've sent out a cancel to chase it down and kill it.  Please use this
+version dated "23 March 1994".
+
+quotewords.pl is a generic replacement for shellwords.pl.
+&quotewords() allows you to specify a delimiter, which may be a
+regular expression, and returns a list of words broken on that
+delimiter ignoring any instances of the delimiter which may appear
+within a quoted string.  There's a boolean flag to tell the function
+whether or not you want it to strip quotes and backslashes or retain
+them.
+
+I've also included a revised version of &shellwords() (written in
+terms of &quotewords() of course) which is 99% the same as the
+original version.  The only difference is that the new version will
+not default to using $_ if no arguments are supplied.
+
+Share and enjoy...
+
+==============================================================================
+     Hal Pomeranz       pomeranz@sclara.qms.com     pomeranz@cs.swarthmore.edu
+System/Network Manager  "All I can say is that my life is pretty plain.
+   QMS Santa Clara       I like watchin' the puddles gather rain." Blind Melon
+==============================================================================
+
+# quotewords.pl
+#
+# Usage:
+#      require 'quotes.pl';
+#      @words = &quotewords($delim, $keep, @lines);
+#      @words = &shellwords(@lines);
+
+# Hal Pomeranz (pomeranz@netcom.com), 23 March 1994
+# Permission to use and distribute under the same terms as Perl.
+# No warranty expressed or implied.
+
+# Basically an update and generalization of the old shellwords.pl.
+# Much code shamelessly stolen from the old version (author unknown).
+#
+# &quotewords() accepts a delimiter (which can be a regular expression)
+# and a list of lines and then breaks those lines up into a list of
+# words ignoring delimiters that appear inside quotes.
+#
+# The $keep argument is a boolean flag.  If true, the quotes are kept
+# with each word, otherwise quotes are stripped in the splitting process.
+# $keep also defines whether unprotected backslashes are retained.
+#
+# A &shellwords() replacement is included to demonstrate the new package.
+# This version differs from the original in that it will _NOT_ default
+# to using $_ if no arguments are given.  I personally find the old behavior
+# to be a mis-feature.
+
+package quotewords;
+
+sub main'shellwords {
+    local(@lines) = @_;
+    $lines[$#lines] =~ s/\s+$//;
+    &main'quotewords('\s+', 0, @lines);
+}
+
+
+# &quotewords() works by simply jamming all of @lines into a single
+# string in $_ and then pulling off words a bit at a time until $_
+# is exhausted.
+#
+# The inner "for" loop builds up each word (or $field) one $snippet
+# at a time.  A $snippet is a quoted string, a backslashed character,
+# or an unquoted string.  We fall out of the "for" loop when we reach
+# the end of $_ or when we hit a delimiter.  Falling out of the "for"
+# loop, we push the $field we've been building up onto the list of
+# @words we'll be returning, and then loop back and pull another word
+# off of $_.
+#
+# The first two cases inside the "for" loop deal with quoted strings.
+# The first case matches a double quoted string, removes it from $_,
+# and assigns the double quoted string to $snippet in the body of the
+# conditional.  The second case handles single quoted strings.  In
+# the third case we've found a quote at the current beginning of $_,
+# but it didn't match the quoted string regexps in the first two cases,
+# so it must be an unbalanced quote and we die with an error (which can
+# be caught by eval()).
+#
+# The next case handles backslashed characters, and the next case is the
+# exit case on reaching the end of the string or finding a delimiter.
+#
+# Otherwise, we've found an unquoted thing and we pull of characters one
+# at a time until we reach something that could start another $snippet--
+# a quote of some sort, a backslash, or the delimiter.  This one character
+# at a time behavior was necessary if the delimiter was going to be a
+# regexp (love to hear it if you can figure out a better way).
+
+sub main'quotewords {
+    local($delim, $keep, @lines) = @_;
+    local(@words,$snippet,$field,$_);
+
+    $_ = join('', @lines);
+    while ($_) {
+       $field = '';
+       for (;;) {
+            $snippet = '';
+           if (s/^"(([^"\\]|\\[\\"])*)"//) {
+               $snippet = $1;
+                $snippet = "\"$snippet\"" if ($keep);
+           }
+           elsif (s/^'(([^'\\]|\\[\\'])*)'//) {
+               $snippet = $1;
+                $snippet = "'$snippet'" if ($keep);
+           }
+           elsif (/^["']/) {
+               die "Unmatched quote\n";
+           }
+            elsif (s/^\\(.)//) {
+                $snippet = $1;
+                $snippet = "\\$snippet" if ($keep);
+            }
+           elsif (!$_ || s/^$delim//) {
+               last;
+           }
+           else {
+                while ($_ && !(/^$delim/ || /^['"\\]/)) {
+                  $snippet .=  substr($_, 0, 1);
+                   substr($_, 0, 1) = '';
+                }
+           }
+           $field .= $snippet;
+       }
+       push(@words, $field);
+    }
+    @words;
+}
+1;
+
+
diff --git a/lib/soundex.pl.art b/lib/soundex.pl.art
new file mode 100644 (file)
index 0000000..1cc0b9e
--- /dev/null
@@ -0,0 +1,285 @@
+Article 20106 of comp.lang.perl:
+Path: netlabs!news.cerf.net!ihnp4.ucsd.edu!mvb.saic.com!MathWorks.Com!noc.near.net!newshost.meiko.com!not-for-mail
+From: mike@meiko.com (Mike Stok)
+Newsgroups: comp.lang.perl
+Subject: Soundex (again :-)
+Date: 23 Mar 1994 19:44:35 -0500
+Organization: Meiko Scientific, Inc., MA
+Lines: 272
+Message-ID: <2mqnpj$qk4@hibbert.meiko.com>
+NNTP-Posting-Host: hibbert.meiko.com
+
+Thanks to Rich Pinder <rpinder@hsc.usc.edu> for finding a little bug in my
+soundex code I posted a while back.  This showed up when he compared it
+with the output from Oracle's soundex function, and were caused by leading
+characters which were different but shared the same soundex code.
+
+Here's a fixed shar file...
+
+Mike
+
+#!/bin/sh
+# This is a shell archive (produced by shar 3.49)
+# To extract the files from this archive, save it to a file, remove
+# everything above the "!/bin/sh" line above, and type "sh file_name".
+#
+# made 03/24/1994 00:35 UTC by Mike.Stok@meiko.concord.ma.us
+# Source directory /tmp_mnt/develop/sw/misc/mike/soundex
+#
+# existing files will NOT be overwritten unless -c is specified
+#
+# This shar contains:
+# length  mode       name
+# ------ ---------- ------------------------------------------
+#   1677 -r--r--r-- soundex.pl
+#   2408 -r-xr-xr-x soundex.t
+#
+# ============= soundex.pl ==============
+if test -f 'soundex.pl' -a X"$1" != X"-c"; then
+       echo 'x - skipping soundex.pl (File already exists)'
+else
+echo 'x - extracting soundex.pl (Text)'
+sed 's/^X//' << 'SHAR_EOF' > 'soundex.pl' &&
+package soundex;
+X
+;# $Id: soundex.pl,v 1.2 1994/03/24 00:30:27 mike Exp $
+;#
+;# Implementation of soundex algorithm as described by Knuth in volume
+;# 3 of The Art of Computer Programming, with ideas stolen from Ian
+;# Phillips <ian@pipex.net>.
+;#
+;# Mike Stok <Mike.Stok@meiko.concord.ma.us>, 2 March 1994.
+;#
+;# Knuth's test cases are:
+;# 
+;# Euler, Ellery -> E460
+;# Gauss, Ghosh -> G200
+;# Hilbert, Heilbronn -> H416
+;# Knuth, Kant -> K530
+;# Lloyd, Ladd -> L300
+;# Lukasiewicz, Lissajous -> L222
+;#
+;# $Log: soundex.pl,v $
+;# Revision 1.2  1994/03/24  00:30:27  mike
+;# Subtle bug (any excuse :-) spotted by Rich Pinder <rpinder@hsc.usc.edu>
+;# in the way I handles leasing characters which were different but had
+;# the same soundex code.  This showed up comparing it with Oracle's
+;# soundex output.
+;#
+;# Revision 1.1  1994/03/02  13:01:30  mike
+;# Initial revision
+;#
+;#
+;##############################################################################
+X
+;# $soundex'noCode is used to indicate a string doesn't have a soundex
+;# code, I like undef other people may want to set it to 'Z000'.
+X
+$noCode = undef;
+X
+;# main'soundex
+;#
+;# usage:
+;#
+;# @codes = &main'soundex (@wordList);
+;# $code = &main'soundex ($word);
+;#
+;# This strenuously avoids $[
+X
+sub main'soundex
+{
+X  local (@s, $f, $fc, $_) = @_;
+X
+X  foreach (@s)
+X  {
+X    tr/a-z/A-Z/;
+X    tr/A-Z//cd;
+X
+X    if ($_ eq '')
+X    {
+X      $_ = $noCode;
+X    }
+X    else
+X    {
+X      ($f) = /^(.)/;
+X      tr/AEHIOUWYBFPVCGJKQSXZDTLMNR/00000000111122222222334556/;
+X      ($fc) = /^(.)/;
+X      s/^$fc+//;
+X      tr///cs;
+X      tr/0//d;
+X      $_ = $f . $_ . '000';
+X      s/^(.{4}).*/$1/;
+X    }
+X  }
+X
+X  wantarray ? @s : shift @s;
+}
+X
+1;
+SHAR_EOF
+chmod 0444 soundex.pl ||
+echo 'restore of soundex.pl failed'
+Wc_c="`wc -c < 'soundex.pl'`"
+test 1677 -eq "$Wc_c" ||
+       echo 'soundex.pl: original size 1677, current size' "$Wc_c"
+fi
+# ============= soundex.t ==============
+if test -f 'soundex.t' -a X"$1" != X"-c"; then
+       echo 'x - skipping soundex.t (File already exists)'
+else
+echo 'x - extracting soundex.t (Text)'
+sed 's/^X//' << 'SHAR_EOF' > 'soundex.t' &&
+#!./perl
+;#
+;# $Id: soundex.t,v 1.2 1994/03/24 00:30:27 mike Exp $
+;#
+;# test module for soundex.pl
+;#
+;# $Log: soundex.t,v $
+;# Revision 1.2  1994/03/24  00:30:27  mike
+;# Subtle bug (any excuse :-) spotted by Rich Pinder <rpinder@hsc.usc.edu>
+;# in the way I handles leasing characters which were different but had
+;# the same soundex code.  This showed up comparing it with Oracle's
+;# soundex output.
+;#
+;# Revision 1.1  1994/03/02  13:03:02  mike
+;# Initial revision
+;#
+;#
+X
+require '../lib/soundex.pl';
+X
+$test = 0;
+print "1..13\n";
+X
+while (<DATA>)
+{
+X  chop;
+X  next if /^\s*;?#/;
+X  next if /^\s*$/;
+X
+X  ++$test;
+X  $bad = 0;
+X
+X  if (/^eval\s+/)
+X  {
+X    ($try = $_) =~ s/^eval\s+//;
+X
+X    eval ($try);
+X    if ($@)
+X    {
+X      $bad++;
+X      print "not ok $test\n";
+X      print "# eval '$try' returned $@";
+X    }
+X  }
+X  elsif (/^\(/)
+X  {
+X    ($in, $out) = split (':');
+X
+X    $try = "\@expect = $out; \@got = &soundex $in;";
+X    eval ($try);
+X
+X    if (@expect != @got)
+X    {
+X      $bad++;
+X      print "not ok $test\n";
+X      print "# expected ", scalar @expect, " results, got ", scalar @got, "\n";
+X      print "# expected (", join (', ', @expect),
+X          ") got (", join (', ', @got), ")\n";
+X    }
+X    else
+X    {
+X      while (@got)
+X      {
+X      $expect = shift @expect;
+X      $got = shift @got;
+X
+X      if ($expect ne $got)
+X      {
+X        $bad++;
+X        print "not ok $test\n";
+X        print "# expected $expect, got $got\n";
+X      }
+X      }
+X    }
+X  }
+X  else
+X  {
+X    ($in, $out) = split (':');
+X
+X    $try = "\$expect = $out; \$got = &soundex ($in);";
+X    eval ($try);
+X
+X    if ($expect ne $got)
+X    {
+X      $bad++;
+X      print "not ok $test\n";
+X      print "# expected $expect, got $got\n";
+X    }
+X  }
+X
+X  print "ok $test\n" unless $bad;
+}
+X
+__END__
+#
+# 1..6
+#
+# Knuth's test cases, scalar in, scalar out
+#
+'Euler':'E460'
+'Gauss':'G200'
+'Hilbert':'H416'
+'Knuth':'K530'
+'Lloyd':'L300'
+'Lukasiewicz':'L222'
+#
+# 7..8
+#
+# check default bad code
+#
+'2 + 2 = 4':undef
+undef:undef
+#
+# 9
+#
+# check array in, array out
+#
+('Ellery', 'Ghosh', 'Heilbronn', 'Kant', 'Ladd', 'Lissajous'):('E460', 'G200', 'H416', 'K530', 'L300', 'L222')
+#
+# 10
+#
+# check array with explicit undef
+#
+('Mike', undef, 'Stok'):('M200', undef, 'S320')
+#
+# 11..12
+#
+# check setting $soundex'noCode
+#
+eval $soundex'noCode = 'Z000';
+('Mike', undef, 'Stok'):('M200', 'Z000', 'S320')
+#
+# 13
+#
+# a subtle difference between me & oracle, spotted by Rich Pinder
+# <rpinder@hsc.usc.edu>
+#
+CZARKOWSKA:C622
+SHAR_EOF
+chmod 0555 soundex.t ||
+echo 'restore of soundex.t failed'
+Wc_c="`wc -c < 'soundex.t'`"
+test 2408 -eq "$Wc_c" ||
+       echo 'soundex.t: original size 2408, current size' "$Wc_c"
+fi
+exit 0
+
+-- 
+The "usual disclaimers" apply.    | Meiko
+Mike Stok                         | 130C Baker Ave. Ext
+Mike.Stok@meiko.concord.ma.us     | Concord, MA 01742
+Meiko tel: (508) 371 0088         | 
+
+
diff --git a/main.c b/main.c
index ff43754..8cb0a88 100644 (file)
--- a/main.c
+++ b/main.c
@@ -34,24 +34,4 @@ perl_init_ext()
     char *file = __FILE__;
 
     boot_DynamicLoader();
-
-#ifdef HAS_DB
-    newXSUB("DB_File::bootstrap",   0, boot_DB_File,   file);
-#endif
-#ifdef HAS_NDBM
-    newXSUB("NDBM_File::bootstrap", 0, boot_NDBM_File, file);
-#endif
-#ifdef HAS_GDBM
-    newXSUB("GDBM_File::bootstrap", 0, boot_GDBM_File, file);
-#endif
-#ifdef HAS_SDBM
-/*    newXSUB("SDBM_File::bootstrap", 0, boot_SDBM_File, file); */
-#endif
-#ifdef HAS_ODBM
-    newXSUB("ODBM_File::bootstrap", 0, boot_ODBM_File, file);
-#endif
-#ifdef HAS_DBZ
-    newXSUB("DBZ_File::bootstrap",  0, boot_DBZ_File,  file);
-#endif
-    newXSUB("POSIX::bootstrap",  0, boot_POSIX,  file);
 }
index bc47759..bda9fe0 100644 (file)
--- a/make.out
+++ b/make.out
@@ -1,6 +1,5 @@
 make: Warning: Both `makefile' and `Makefile' exists
-`sh  cflags gv.o` gv.c
-         CCCMD =  cc -c -DDEBUGGING -DHAS_SDBM -g  
-cc -Bstatic   main.o perly.o perl.o av.o scope.o op.o doop.o doio.o dump.o hv.o malloc.o mg.o pp.o regcomp.o regexec.o gv.o sv.o taint.o toke.o util.o deb.o run.o NDBM_File.o ODBM_File.o POSIX.o dl.o -ldbm -lm -lposix -Bdynamic -ldl -Bstatic  -o perl
-echo "\a"
-\a
+./configpm
+ld.so: Undefined symbol: _dbminit
+*** Error code 127
+make: Fatal error: Command failed for target `lib/Config.pm'
index 73e63b7..11e4a1f 100755 (executable)
@@ -1,5 +1,5 @@
 #!/bin/sh
-# : makedepend.SH,v 15738Revision: 4.1 15738Date: 92/08/07 18:24:20 $
+# $RCSfile: makedepend.SH,v 28453Revision: 4.1 28453Date: 92/08/07 18:24:20 $
 #
 # $Log:        makedepend.SH,v $
 # Revision 4.1  92/08/07  18:24:20  lwall
 
 export PATH || (echo "OOPS, this isn't sh.  Desperation time.  I will feed myself to sh."; sh $0; kill $$)
 
-cat='/bin/cat'
-cppflags=' -I/usr/include/sun -I/usr/ucbinclude -DDEBUGGING'
-cp='/bin/cp'
-cppstdin='/usr/lib/cpp'
+cat='cat'
+cppflags=' -DDEBUGGING'
+cp='cp'
+cppstdin='/tmp_mnt/vol/src/local/lwall/perl5/cppstdin'
 cppminus=''
-echo='/bin/echo'
-egrep='/bin/egrep'
-expr='/bin/expr'
-mv='/bin/mv'
-rm='/bin/rm'
-sed='/bin/sed'
-sort='/bin/sort'
+echo='echo'
+egrep='egrep'
+expr='expr'
+mv='mv'
+rm='rm'
+sed='sed'
+sort='sort'
 test='test'
-tr='/bin/tr'
-uniq='/bin/uniq'
+tr='tr'
+uniq='uniq'
 
 PATH="$PATH:."
 export PATH
@@ -82,6 +82,7 @@ for file in `$cat .clist`; do
     ( $echo "#line 1 \"$file\""; \
       $sed -n <$file \
        -e "/^${filebase}_init(/q" \
+       -e '/^#line/d' \
        -e '/^#/{' \
        -e 's|/\*.*$||' \
        -e 's|\\$||' \
index fc6595d..d474b72 100755 (executable)
@@ -102,6 +102,7 @@ for file in `$cat .clist`; do
     ( $echo "#line 1 \"$file\""; \
       $sed -n <$file \
        -e "/^${filebase}_init(/q" \
+       -e '/^#line/d' \
        -e '/^#/{' \
        -e 's|/\*.*$||' \
        -e 's|\\$||' \
diff --git a/makedir b/makedir
index 51986a8..343c78d 100755 (executable)
--- a/makedir
+++ b/makedir
@@ -1,5 +1,5 @@
 #!/bin/sh
-# : makedir.SH,v 15738Revision: 4.1 15738Date: 92/08/07 18:24:23 $
+# $RCSfile: makedir.SH,v 28453Revision: 4.1 28453Date: 92/08/07 18:24:23 $
 # 
 # $Log:        makedir.SH,v $
 # Revision 4.1  92/08/07  18:24:23  lwall
@@ -16,7 +16,7 @@ export PATH || (echo "OOPS, this isn't sh.  Desperation time.  I will feed mysel
 
 case $# in
   0)
-    /bin/echo "makedir pathname filenameflag"
+    echo "makedir pathname filenameflag"
     exit 1
     ;;
 esac
@@ -29,7 +29,7 @@ esac
 
 : strip last component if it is to be a filename
 case X$2 in
-  X1) set `/bin/echo $1 | /bin/sed 's:\(.*\)/[^/]*$:\1:'` ;;
+  X1) set `echo $1 | sed 's:\(.*\)/[^/]*$:\1:'` ;;
   *)  set $1 ;;
 esac
 
@@ -43,7 +43,7 @@ while true ; do
     case $1 in
     */*)
        list="$1 $list"
-       set `echo $1 | /bin/sed 's:\(.*\)/:\1 :'`
+       set `echo $1 | sed 's:\(.*\)/:\1 :'`
        ;;
     *)
        break
@@ -54,5 +54,5 @@ done
 set $list
 
 for dir do
-    /bin/mkdir $dir >/dev/null 2>&1
+    mkdir $dir >/dev/null 2>&1
 done
index c2307b6..e5c6310 100644 (file)
--- a/makefile
+++ b/makefile
 # 
 
 # I now supply perly.c with the kits, so don't remake perly.c without byacc
-BYACC = ../perl-byacc1.8.2/byacc
-
+BYACC = byacc
 CC = cc
 bin = /usr/local/bin
 scriptdir = /usr/local/bin
 privlib = /usr/local/lib/perl
-mansrc = /usr/man/manl
-manext = l
+mansrc = /usr/local/man/man1
+manext = 1
 LDFLAGS = 
 CLDFLAGS = 
 SMALL = 
 LARGE =  
 mallocsrc = malloc.c
 mallocobj = malloc.o
+dlsrc = dl.c
+dlobj = dl.o
 SLN = ln -s
 RMS = rm -f
 
-libs = -ldbm -lm -lposix -Bdynamic -ldl
+libs = -ldbm -ldl -lm -lposix 
 
-public = perl
+public = perl 
 
 shellflags = 
 
 # To use an alternate make, set  in config.sh.
 MAKE = make
 
-
 CCCMD = `sh $(shellflags) cflags $@`
 
 private = 
@@ -69,25 +69,29 @@ sh = Makefile.SH makedepend.SH h2ph.SH
 h1 = EXTERN.h INTERN.h av.h cop.h config.h embed.h form.h handy.h
 h2 = hv.h op.h opcode.h perl.h regcomp.h regexp.h gv.h sv.h util.h
 
-h = $(h1) $(h2)
+h1 = EXTERN.h INTERN.h XSUB.h av.h config.h cop.h cv.h dosish.h 
+h2 = embed.h form.h gv.h handy.h hv.h hvdbm.h keywords.h mg.h op.h
+h3 = opcode.h patchlevel.h perl.h perly.h pp.h proto.h regcomp.h
+h4 = regexp.h scope.h sv.h unixish.h util.h
+h = $(h1) $(h2) $(h3) $(h4)
 
-c1 = av.c cop.c cons.c consop.c doop.c doio.c
-c2 = eval.c hv.c main.c $(mallocsrc) perl.c pp.c regcomp.c regexec.c
-c3 = gv.c sv.c taint.c toke.c util.c usersub.c
+c1 = av.c scope.c op.c doop.c doio.c dump.c hv.c
+c2 = $(mallocsrc) mg.c perly.c pp.c regcomp.c regexec.c
+c3 = gv.c sv.c taint.c toke.c util.c deb.c run.c
 
 c = $(c1) $(c2) $(c3)
 
-s1 = av.c cop.c cons.c consop.c doop.c doio.c
-s2 = eval.c hv.c main.c perl.c pp.c regcomp.c regexec.c
-s3 = gv.c sv.c taint.c toke.c util.c usersub.c perly.c
+s1 = av.c scope.c op.c doop.c doio.c dump.c hv.c
+s2 = $(mallocobj) mg.c perly.c pp.c regcomp.c regexec.c
+s3 = gv.c sv.c taint.c toke.c util.c deb.c run.c perly.c
 
 saber = $(s1) $(s2) $(s3)
 
 obj1 = av.o scope.o op.o doop.o doio.o dump.o hv.o
-obj2 = $(mallocobj) mg.o pp.o regcomp.o regexec.o
+obj2 = $(mallocobj) mg.o perly.o pp.o regcomp.o regexec.o
 obj3 = gv.o sv.o taint.o toke.o util.o deb.o run.o
 
-obj = $(obj1) $(obj2) $(obj3) NDBM_File.o ODBM_File.o POSIX.o dl.o
+obj = $(obj1) $(obj2) $(obj3) $(dlobj)
 
 lintflags = -hbvxac
 
@@ -96,29 +100,89 @@ addedbyconf = Makefile.old bsd eunice filexp loc pdp11 usg v7
 # grrr
 SHELL = /bin/sh
 
+.SUFFIXES: .x
+
 .c.o:
        $(CCCMD) $*.c
 
+.x.c:
+       sh writemain $*.x >$*.c
 
-all: perl lib/Config.pm
+all: miniperl perl lib/Config.pm
 
 #all: $(public) $(private) $(util) $(scripts)
 #      cd x2p; $(MAKE) all
 #      touch all
 
+# NDBM_File extension
+NDBM_File.c:   ext/dbm/NDBM_File.xs ext/xsubpp ext/typemap
+       test -f miniperl || make miniperl
+       ext/xsubpp ext/dbm/NDBM_File.xs >tmp
+       mv tmp NDBM_File.c
+
+NDBM_File.o: NDBM_File.c
+
+# ODBM_File extension
+ODBM_File.c:   ext/dbm/ODBM_File.xs ext/xsubpp ext/typemap
+       test -f miniperl || make miniperl
+       ext/xsubpp ext/dbm/ODBM_File.xs >tmp
+       mv tmp ODBM_File.c
+
+ODBM_File.o: ODBM_File.c
+
+# GDBM_File extension
+GDBM_File.c:   ext/dbm/GDBM_File.xs ext/xsubpp ext/typemap
+       test -f miniperl || make miniperl
+       ext/xsubpp ext/dbm/GDBM_File.xs >tmp
+       mv tmp GDBM_File.c
+
+GDBM_File.o: GDBM_File.c
+
+# SDBM_File extension
+SDBM_File.c:   ext/dbm/SDBM_File.xs ext/xsubpp ext/typemap
+       test -f miniperl || make miniperl
+       ext/xsubpp ext/dbm/SDBM_File.xs >tmp
+       mv tmp SDBM_File.c
+
+SDBM_File.o: SDBM_File.c
+
+lib/auto/SDBM_File/SDBM_File.so: SDBM_File.o ext/dbm/sdbm/libsdbm.a
+       @- mkdir lib/auto/SDBM_File 2>/dev/null
+       ld -o lib/auto/SDBM_File/SDBM_File.so SDBM_File.o ext/dbm/sdbm/libsdbm.a
+
+ext/dbm/sdbm/libsdbm.a: ext/dbm/sdbm/sdbm.c ext/dbm/sdbm/sdbm.h
+       cd ext/dbm/sdbm; $(MAKE) sdbm
+
+# POSIX extension
+POSIX.c:       ext/posix/POSIX.xs ext/xsubpp ext/typemap
+       test -f miniperl || make miniperl
+       ext/xsubpp ext/posix/POSIX.xs >tmp
+       mv tmp POSIX.c
+
+POSIX.o: POSIX.c
+lib/auto/POSIX/POSIX.so: POSIX.o ext/dbm/sdbm/libsdbm.a
+       @- mkdir lib/auto/POSIX 2>/dev/null
+       ld -o lib/auto/POSIX/POSIX.so POSIX.o ext/dbm/sdbm/libsdbm.a
+extobjs=  ext/dbm/NDBM_File.xs.o ext/dbm/ODBM_File.xs.o ext/dbm/GDBM_File.xs.o ext/dbm/SDBM_File.xs.o ext/posix/POSIX.xs.o
 # The $& notation tells Sequent machines that it can do a parallel make,
 # and is harmless otherwise.
 
-perl: $& main.o perly.o perl.o $(obj)
-       $(CC) -Bstatic $(LARGE) $(CLDFLAGS) main.o perly.o perl.o $(obj) $(libs) -Bstatic  -o perl
-       echo "\a"
+miniperlmain.c: miniperlmain.x
+miniperlmain.o: miniperlmain.c
+miniperl: $& miniperlmain.o perl.o $(obj)
+       $(CC) $(LARGE) $(CLDFLAGS) -o miniperl miniperlmain.o perl.o $(obj) $(libs)
+
+perlmain.c: perlmain.x
+perlmain.o: perlmain.c
+perl: $& perlmain.o perl.o $(obj) NDBM_File.o ODBM_File.o POSIX.o
+       $(CC) $(LARGE) $(CLDFLAGS) -o perl perlmain.o perl.o $(obj) NDBM_File.o ODBM_File.o POSIX.o $(libs)
 
 libperl.rlb: libperl.a
        ranlib libperl.a
        touch libperl.rlb
 
-libperl.a: $& perly.o perl.o $(obj)
-       ar rcuv libperl.a $(obj) perly.o
+libperl.a: $& perl.o $(obj)
+       ar rcuv libperl.a $(obj)
 
 # This version, if specified in Configure, does ONLY those scripts which need
 # set-id emulation.  Suidperl must be setuid root.  It contains the "taint"
@@ -138,64 +202,14 @@ saber: $(saber)
 sperl.o: perl.c perly.h patchlevel.h $(h)
        $(RMS) sperl.c
        $(SLN) perl.c sperl.c
-       $(CCCMD) -DTAINT -DIAMSUID sperl.c
+       $(CCCMD) -DIAMSUID sperl.c
        $(RMS) sperl.c
 
 dl.o: ext/dl/dl.c
        cp ext/dl/dl.c dl.c
        $(CC) -c dl.c
 
-# ODBM_File extension
-
-ODBM_File.c: ext/dbm/ODBM_File.xs ext/xsubpp ext/typemap
-       ext/xsubpp ext/dbm/ODBM_File.xs >tmp
-       mv tmp ODBM_File.c
-
-ODBM_File.o: ODBM_File.c
-
-# NDBM_File extension
-
-NDBM_File.c: ext/dbm/NDBM_File.xs ext/xsubpp ext/typemap
-       ext/xsubpp ext/dbm/NDBM_File.xs >tmp
-       mv tmp NDBM_File.c
-
-NDBM_File.o: NDBM_File.c
-
-# SDBM_File extension
-
-SDBM_File.c: ext/dbm/SDBM_File.xs ext/xsubpp ext/typemap
-       ext/xsubpp ext/dbm/SDBM_File.xs > tmp
-       mv tmp SDBM_File.c
-
-SDBM_File.o: SDBM_File.c
-
-lib/auto/SDBM_File/SDBM_File.so: SDBM_File.o ext/dbm/sdbm/libsdbm.a
-       @- mkdir lib/auto/SDBM_File 2>/dev/null
-       ld -o lib/auto/SDBM_File/SDBM_File.so SDBM_File.o ext/dbm/sdbm/libsdbm.a
-
-ext/dbm/sdbm/libsdbm.a: ext/dbm/sdbm/sdbm.c ext/dbm/sdbm/sdbm.h
-       cd ext/dbm/sdbm; $(MAKE) sdbm
-
-# GDBM_File extension
-
-GDBM_File.c: ext/dbm/GDBM_File.xs ext/xsubpp ext/typemap
-       ext/xsubpp ext/dbm/GDBM_File.xs >tmp
-       mv tmp GDBM_File.c
-
-GDBM_File.o: GDBM_File.c
-
-# POSIX extension
-
-POSIX.c: ext/posix/POSIX.xs ext/xsubpp ext/typemap
-       ext/xsubpp ext/posix/POSIX.xs > tmp
-       mv tmp POSIX.c
-
-POSIX.o: POSIX.c
-
-lib/auto/POSIX/POSIX.so: POSIX.o
-       @- mkdir lib/auto/POSIX 2>/dev/null
-       ld -o lib/auto/POSIX/POSIX.so POSIX.o ext/dbm/sdbm/libsdbm.a
-
+    
 perly.h: perly.c
        @ echo Dummy dependency for dumb parallel make
        touch perly.h
@@ -207,7 +221,7 @@ embed.h: embed_h.SH global.sym interp.sym
        sh embed_h.SH
 
 perly.c:
-       @ echo 'Expect' 62 shift/reduce and 62 reduce/reduce conflicts
+       @ echo 'Expect' 80 shift/reduce and 62 reduce/reduce conflicts
        $(BYACC) -d perly.y
        sh $(shellflags) ./perly.fixer y.tab.c perly.c
        mv y.tab.h perly.h
@@ -220,13 +234,13 @@ install: all
        ./perl installperl
 
 clean:
-       rm -f *.o all perl taintperl suidperl perly.c
+       rm -f *.o all perl taintperl suidperl miniperl
        cd x2p; $(MAKE) clean
 
 realclean: clean
        cd x2p; $(MAKE) realclean
        rm -f *.orig */*.orig *~ */*~ core $(addedbyconf) h2ph h2ph.man
-       rm -f perly.c perly.h t/perl Makefile config.h makedepend makedir
+       rm -f perly.h t/perl Makefile config.h makedepend makedir
        rm -f makefile x2p/Makefile x2p/makefile cflags x2p/cflags
        rm -f c2ph pstruct
 
@@ -259,737 +273,575 @@ shlist:
 
 # AUTOMATICALLY GENERATED MAKE DEPENDENCIES--PUT NOTHING BELOW THIS LINE
 # If this runs make out of memory, delete /usr/include lines.
-av.o: 
-av.o: /usr/ucbinclude/ctype.h
-av.o: /usr/ucbinclude/dirent.h
-av.o: /usr/ucbinclude/errno.h
-av.o: /usr/ucbinclude/machine/param.h
-av.o: /usr/ucbinclude/machine/setjmp.h
-av.o: /usr/ucbinclude/ndbm.h
-av.o: /usr/ucbinclude/netinet/in.h
-av.o: /usr/ucbinclude/setjmp.h
-av.o: /usr/ucbinclude/stdio.h
-av.o: /usr/ucbinclude/sys/dirent.h
-av.o: /usr/ucbinclude/sys/errno.h
-av.o: /usr/ucbinclude/sys/filio.h
-av.o: /usr/ucbinclude/sys/ioccom.h
-av.o: /usr/ucbinclude/sys/ioctl.h
-av.o: /usr/ucbinclude/sys/param.h
-av.o: /usr/ucbinclude/sys/signal.h
-av.o: /usr/ucbinclude/sys/sockio.h
-av.o: /usr/ucbinclude/sys/stat.h
-av.o: /usr/ucbinclude/sys/stdtypes.h
-av.o: /usr/ucbinclude/sys/sysmacros.h
-av.o: /usr/ucbinclude/sys/time.h
-av.o: /usr/ucbinclude/sys/times.h
-av.o: /usr/ucbinclude/sys/ttold.h
-av.o: /usr/ucbinclude/sys/ttychars.h
-av.o: /usr/ucbinclude/sys/ttycom.h
-av.o: /usr/ucbinclude/sys/ttydev.h
-av.o: /usr/ucbinclude/sys/types.h
-av.o: /usr/ucbinclude/time.h
-av.o: /usr/ucbinclude/vm/faultcode.h
+av.o: /usr/include/ctype.h
+av.o: /usr/include/dirent.h
+av.o: /usr/include/errno.h
+av.o: /usr/include/machine/param.h
+av.o: /usr/include/machine/setjmp.h
+av.o: /usr/include/netinet/in.h
+av.o: /usr/include/setjmp.h
+av.o: /usr/include/stdio.h
+av.o: /usr/include/sys/dirent.h
+av.o: /usr/include/sys/errno.h
+av.o: /usr/include/sys/filio.h
+av.o: /usr/include/sys/ioccom.h
+av.o: /usr/include/sys/ioctl.h
+av.o: /usr/include/sys/param.h
+av.o: /usr/include/sys/signal.h
+av.o: /usr/include/sys/sockio.h
+av.o: /usr/include/sys/stat.h
+av.o: /usr/include/sys/stdtypes.h
+av.o: /usr/include/sys/sysmacros.h
+av.o: /usr/include/sys/time.h
+av.o: /usr/include/sys/times.h
+av.o: /usr/include/sys/ttold.h
+av.o: /usr/include/sys/ttychars.h
+av.o: /usr/include/sys/ttycom.h
+av.o: /usr/include/sys/ttydev.h
+av.o: /usr/include/sys/types.h
+av.o: /usr/include/time.h
+av.o: /usr/include/varargs.h
+av.o: /usr/include/vm/faultcode.h
 av.o: EXTERN.h
 av.o: av.c
 av.o: av.h
 av.o: config.h
 av.o: cop.h
+av.o: cv.h
 av.o: embed.h
 av.o: form.h
 av.o: gv.h
 av.o: handy.h
 av.o: hv.h
+av.o: mg.h
 av.o: op.h
 av.o: opcode.h
 av.o: perl.h
 av.o: pp.h
 av.o: proto.h
 av.o: regexp.h
+av.o: scope.h
 av.o: sv.h
 av.o: unixish.h
 av.o: util.h
-cop.o: 
-cop.o: /usr/ucbinclude/ctype.h
-cop.o: /usr/ucbinclude/dirent.h
-cop.o: /usr/ucbinclude/errno.h
-cop.o: /usr/ucbinclude/machine/param.h
-cop.o: /usr/ucbinclude/machine/setjmp.h
-cop.o: /usr/ucbinclude/ndbm.h
-cop.o: /usr/ucbinclude/netinet/in.h
-cop.o: /usr/ucbinclude/setjmp.h
-cop.o: /usr/ucbinclude/stdio.h
-cop.o: /usr/ucbinclude/sys/dirent.h
-cop.o: /usr/ucbinclude/sys/errno.h
-cop.o: /usr/ucbinclude/sys/filio.h
-cop.o: /usr/ucbinclude/sys/ioccom.h
-cop.o: /usr/ucbinclude/sys/ioctl.h
-cop.o: /usr/ucbinclude/sys/param.h
-cop.o: /usr/ucbinclude/sys/signal.h
-cop.o: /usr/ucbinclude/sys/sockio.h
-cop.o: /usr/ucbinclude/sys/stat.h
-cop.o: /usr/ucbinclude/sys/stdtypes.h
-cop.o: /usr/ucbinclude/sys/sysmacros.h
-cop.o: /usr/ucbinclude/sys/time.h
-cop.o: /usr/ucbinclude/sys/times.h
-cop.o: /usr/ucbinclude/sys/ttold.h
-cop.o: /usr/ucbinclude/sys/ttychars.h
-cop.o: /usr/ucbinclude/sys/ttycom.h
-cop.o: /usr/ucbinclude/sys/ttydev.h
-cop.o: /usr/ucbinclude/sys/types.h
-cop.o: /usr/ucbinclude/time.h
-cop.o: /usr/ucbinclude/varargs.h
-cop.o: /usr/ucbinclude/vm/faultcode.h
-cop.o: EXTERN.h
-cop.o: av.h
-cop.o: config.h
-cop.o: cop.c
-cop.o: cop.h
-cop.o: embed.h
-cop.o: form.h
-cop.o: gv.h
-cop.o: handy.h
-cop.o: hv.h
-cop.o: op.h
-cop.o: opcode.h
-cop.o: perl.h
-cop.o: pp.h
-cop.o: proto.h
-cop.o: regexp.h
-cop.o: sv.h
-cop.o: unixish.h
-cop.o: util.h
-cons.o: 
-cons.o: /usr/ucbinclude/ctype.h
-cons.o: /usr/ucbinclude/dirent.h
-cons.o: /usr/ucbinclude/errno.h
-cons.o: /usr/ucbinclude/machine/param.h
-cons.o: /usr/ucbinclude/machine/setjmp.h
-cons.o: /usr/ucbinclude/ndbm.h
-cons.o: /usr/ucbinclude/netinet/in.h
-cons.o: /usr/ucbinclude/setjmp.h
-cons.o: /usr/ucbinclude/stdio.h
-cons.o: /usr/ucbinclude/sys/dirent.h
-cons.o: /usr/ucbinclude/sys/errno.h
-cons.o: /usr/ucbinclude/sys/filio.h
-cons.o: /usr/ucbinclude/sys/ioccom.h
-cons.o: /usr/ucbinclude/sys/ioctl.h
-cons.o: /usr/ucbinclude/sys/param.h
-cons.o: /usr/ucbinclude/sys/signal.h
-cons.o: /usr/ucbinclude/sys/sockio.h
-cons.o: /usr/ucbinclude/sys/stat.h
-cons.o: /usr/ucbinclude/sys/stdtypes.h
-cons.o: /usr/ucbinclude/sys/sysmacros.h
-cons.o: /usr/ucbinclude/sys/time.h
-cons.o: /usr/ucbinclude/sys/times.h
-cons.o: /usr/ucbinclude/sys/ttold.h
-cons.o: /usr/ucbinclude/sys/ttychars.h
-cons.o: /usr/ucbinclude/sys/ttycom.h
-cons.o: /usr/ucbinclude/sys/ttydev.h
-cons.o: /usr/ucbinclude/sys/types.h
-cons.o: /usr/ucbinclude/time.h
-cons.o: /usr/ucbinclude/vm/faultcode.h
-cons.o: EXTERN.h
-cons.o: av.h
-cons.o: config.h
-cons.o: cons.c
-cons.o: cop.h
-cons.o: embed.h
-cons.o: form.h
-cons.o: gv.h
-cons.o: handy.h
-cons.o: hv.h
-cons.o: op.h
-cons.o: opcode.h
-cons.o: perl.h
-cons.o: perly.h
-cons.o: pp.h
-cons.o: proto.h
-cons.o: regexp.h
-cons.o: sv.h
-cons.o: unixish.h
-cons.o: util.h
-consop.o: 
-consop.o: /usr/ucbinclude/ctype.h
-consop.o: /usr/ucbinclude/dirent.h
-consop.o: /usr/ucbinclude/errno.h
-consop.o: /usr/ucbinclude/machine/param.h
-consop.o: /usr/ucbinclude/machine/setjmp.h
-consop.o: /usr/ucbinclude/ndbm.h
-consop.o: /usr/ucbinclude/netinet/in.h
-consop.o: /usr/ucbinclude/setjmp.h
-consop.o: /usr/ucbinclude/stdio.h
-consop.o: /usr/ucbinclude/sys/dirent.h
-consop.o: /usr/ucbinclude/sys/errno.h
-consop.o: /usr/ucbinclude/sys/filio.h
-consop.o: /usr/ucbinclude/sys/ioccom.h
-consop.o: /usr/ucbinclude/sys/ioctl.h
-consop.o: /usr/ucbinclude/sys/param.h
-consop.o: /usr/ucbinclude/sys/signal.h
-consop.o: /usr/ucbinclude/sys/sockio.h
-consop.o: /usr/ucbinclude/sys/stat.h
-consop.o: /usr/ucbinclude/sys/stdtypes.h
-consop.o: /usr/ucbinclude/sys/sysmacros.h
-consop.o: /usr/ucbinclude/sys/time.h
-consop.o: /usr/ucbinclude/sys/times.h
-consop.o: /usr/ucbinclude/sys/ttold.h
-consop.o: /usr/ucbinclude/sys/ttychars.h
-consop.o: /usr/ucbinclude/sys/ttycom.h
-consop.o: /usr/ucbinclude/sys/ttydev.h
-consop.o: /usr/ucbinclude/sys/types.h
-consop.o: /usr/ucbinclude/time.h
-consop.o: /usr/ucbinclude/vm/faultcode.h
-consop.o: EXTERN.h
-consop.o: av.h
-consop.o: config.h
-consop.o: consop.c
-consop.o: cop.h
-consop.o: embed.h
-consop.o: form.h
-consop.o: gv.h
-consop.o: handy.h
-consop.o: hv.h
-consop.o: op.h
-consop.o: opcode.h
-consop.o: perl.h
-consop.o: pp.h
-consop.o: proto.h
-consop.o: regexp.h
-consop.o: sv.h
-consop.o: unixish.h
-consop.o: util.h
+scope.o: /usr/include/ctype.h
+scope.o: /usr/include/dirent.h
+scope.o: /usr/include/errno.h
+scope.o: /usr/include/machine/param.h
+scope.o: /usr/include/machine/setjmp.h
+scope.o: /usr/include/netinet/in.h
+scope.o: /usr/include/setjmp.h
+scope.o: /usr/include/stdio.h
+scope.o: /usr/include/sys/dirent.h
+scope.o: /usr/include/sys/errno.h
+scope.o: /usr/include/sys/filio.h
+scope.o: /usr/include/sys/ioccom.h
+scope.o: /usr/include/sys/ioctl.h
+scope.o: /usr/include/sys/param.h
+scope.o: /usr/include/sys/signal.h
+scope.o: /usr/include/sys/sockio.h
+scope.o: /usr/include/sys/stat.h
+scope.o: /usr/include/sys/stdtypes.h
+scope.o: /usr/include/sys/sysmacros.h
+scope.o: /usr/include/sys/time.h
+scope.o: /usr/include/sys/times.h
+scope.o: /usr/include/sys/ttold.h
+scope.o: /usr/include/sys/ttychars.h
+scope.o: /usr/include/sys/ttycom.h
+scope.o: /usr/include/sys/ttydev.h
+scope.o: /usr/include/sys/types.h
+scope.o: /usr/include/time.h
+scope.o: /usr/include/varargs.h
+scope.o: /usr/include/vm/faultcode.h
 scope.o: EXTERN.h
 scope.o: av.h
 scope.o: config.h
 scope.o: cop.h
-scope.o: doop.c
+scope.o: cv.h
 scope.o: embed.h
 scope.o: form.h
 scope.o: gv.h
 scope.o: handy.h
 scope.o: hv.h
+scope.o: mg.h
 scope.o: op.h
 scope.o: opcode.h
 scope.o: perl.h
 scope.o: pp.h
 scope.o: proto.h
 scope.o: regexp.h
+scope.o: scope.c
+scope.o: scope.h
 scope.o: sv.h
 scope.o: unixish.h
 scope.o: util.h
+op.o: /usr/include/ctype.h
+op.o: /usr/include/dirent.h
+op.o: /usr/include/errno.h
+op.o: /usr/include/machine/param.h
+op.o: /usr/include/machine/setjmp.h
+op.o: /usr/include/netinet/in.h
+op.o: /usr/include/setjmp.h
+op.o: /usr/include/stdio.h
+op.o: /usr/include/sys/dirent.h
+op.o: /usr/include/sys/errno.h
+op.o: /usr/include/sys/filio.h
+op.o: /usr/include/sys/ioccom.h
+op.o: /usr/include/sys/ioctl.h
+op.o: /usr/include/sys/param.h
+op.o: /usr/include/sys/signal.h
+op.o: /usr/include/sys/sockio.h
+op.o: /usr/include/sys/stat.h
+op.o: /usr/include/sys/stdtypes.h
+op.o: /usr/include/sys/sysmacros.h
+op.o: /usr/include/sys/time.h
+op.o: /usr/include/sys/times.h
+op.o: /usr/include/sys/ttold.h
+op.o: /usr/include/sys/ttychars.h
+op.o: /usr/include/sys/ttycom.h
+op.o: /usr/include/sys/ttydev.h
+op.o: /usr/include/sys/types.h
+op.o: /usr/include/time.h
+op.o: /usr/include/varargs.h
+op.o: /usr/include/vm/faultcode.h
 op.o: EXTERN.h
 op.o: av.h
 op.o: config.h
 op.o: cop.h
-op.o: doop.c
+op.o: cv.h
 op.o: embed.h
 op.o: form.h
 op.o: gv.h
 op.o: handy.h
 op.o: hv.h
+op.o: mg.h
+op.o: op.c
 op.o: op.h
 op.o: opcode.h
 op.o: perl.h
 op.o: pp.h
 op.o: proto.h
 op.o: regexp.h
+op.o: scope.h
 op.o: sv.h
 op.o: unixish.h
 op.o: util.h
-run.o: EXTERN.h
-run.o: av.h
-run.o: config.h
-run.o: cop.h
-run.o: doop.c
-run.o: embed.h
-run.o: form.h
-run.o: gv.h
-run.o: handy.h
-run.o: hv.h
-run.o: op.h
-run.o: opcode.h
-run.o: perl.h
-run.o: pp.h
-run.o: proto.h
-run.o: regexp.h
-run.o: sv.h
-run.o: unixish.h
-run.o: util.h
-deb.o: EXTERN.h
-deb.o: av.h
-deb.o: config.h
-deb.o: cop.h
-deb.o: doop.c
-deb.o: embed.h
-deb.o: form.h
-deb.o: gv.h
-deb.o: handy.h
-deb.o: hv.h
-deb.o: op.h
-deb.o: opcode.h
-deb.o: perl.h
-deb.o: pp.h
-deb.o: proto.h
-deb.o: regexp.h
-deb.o: sv.h
-deb.o: unixish.h
-deb.o: util.h
-doop.o: 
-doop.o: /usr/ucbinclude/ctype.h
-doop.o: /usr/ucbinclude/dirent.h
-doop.o: /usr/ucbinclude/errno.h
-doop.o: /usr/ucbinclude/machine/param.h
-doop.o: /usr/ucbinclude/machine/setjmp.h
-doop.o: /usr/ucbinclude/ndbm.h
-doop.o: /usr/ucbinclude/netinet/in.h
-doop.o: /usr/ucbinclude/setjmp.h
-doop.o: /usr/ucbinclude/stdio.h
-doop.o: /usr/ucbinclude/sys/dirent.h
-doop.o: /usr/ucbinclude/sys/errno.h
-doop.o: /usr/ucbinclude/sys/filio.h
-doop.o: /usr/ucbinclude/sys/ioccom.h
-doop.o: /usr/ucbinclude/sys/ioctl.h
-doop.o: /usr/ucbinclude/sys/param.h
-doop.o: /usr/ucbinclude/sys/signal.h
-doop.o: /usr/ucbinclude/sys/sockio.h
-doop.o: /usr/ucbinclude/sys/stat.h
-doop.o: /usr/ucbinclude/sys/stdtypes.h
-doop.o: /usr/ucbinclude/sys/sysmacros.h
-doop.o: /usr/ucbinclude/sys/time.h
-doop.o: /usr/ucbinclude/sys/times.h
-doop.o: /usr/ucbinclude/sys/ttold.h
-doop.o: /usr/ucbinclude/sys/ttychars.h
-doop.o: /usr/ucbinclude/sys/ttycom.h
-doop.o: /usr/ucbinclude/sys/ttydev.h
-doop.o: /usr/ucbinclude/sys/types.h
-doop.o: /usr/ucbinclude/time.h
-doop.o: /usr/ucbinclude/vm/faultcode.h
+doop.o: /usr/include/ctype.h
+doop.o: /usr/include/dirent.h
+doop.o: /usr/include/errno.h
+doop.o: /usr/include/machine/param.h
+doop.o: /usr/include/machine/setjmp.h
+doop.o: /usr/include/netinet/in.h
+doop.o: /usr/include/setjmp.h
+doop.o: /usr/include/stdio.h
+doop.o: /usr/include/sys/dirent.h
+doop.o: /usr/include/sys/errno.h
+doop.o: /usr/include/sys/filio.h
+doop.o: /usr/include/sys/ioccom.h
+doop.o: /usr/include/sys/ioctl.h
+doop.o: /usr/include/sys/param.h
+doop.o: /usr/include/sys/signal.h
+doop.o: /usr/include/sys/sockio.h
+doop.o: /usr/include/sys/stat.h
+doop.o: /usr/include/sys/stdtypes.h
+doop.o: /usr/include/sys/sysmacros.h
+doop.o: /usr/include/sys/time.h
+doop.o: /usr/include/sys/times.h
+doop.o: /usr/include/sys/ttold.h
+doop.o: /usr/include/sys/ttychars.h
+doop.o: /usr/include/sys/ttycom.h
+doop.o: /usr/include/sys/ttydev.h
+doop.o: /usr/include/sys/types.h
+doop.o: /usr/include/time.h
+doop.o: /usr/include/varargs.h
+doop.o: /usr/include/vm/faultcode.h
 doop.o: EXTERN.h
 doop.o: av.h
 doop.o: config.h
 doop.o: cop.h
+doop.o: cv.h
 doop.o: doop.c
 doop.o: embed.h
 doop.o: form.h
 doop.o: gv.h
 doop.o: handy.h
 doop.o: hv.h
+doop.o: mg.h
 doop.o: op.h
 doop.o: opcode.h
 doop.o: perl.h
 doop.o: pp.h
 doop.o: proto.h
 doop.o: regexp.h
+doop.o: scope.h
 doop.o: sv.h
 doop.o: unixish.h
 doop.o: util.h
-doio.o: 
-doio.o: /usr/ucbinclude/ctype.h
-doio.o: /usr/ucbinclude/debug/debug.h
-doio.o: /usr/ucbinclude/dirent.h
-doio.o: /usr/ucbinclude/errno.h
-doio.o: /usr/ucbinclude/machine/mmu.h
-doio.o: /usr/ucbinclude/machine/param.h
-doio.o: /usr/ucbinclude/machine/setjmp.h
-doio.o: /usr/ucbinclude/mon/obpdefs.h
-doio.o: /usr/ucbinclude/mon/openprom.h
-doio.o: /usr/ucbinclude/mon/sunromvec.h
-doio.o: /usr/ucbinclude/ndbm.h
-doio.o: /usr/ucbinclude/netinet/in.h
-doio.o: /usr/ucbinclude/setjmp.h
-doio.o: /usr/ucbinclude/stdio.h
-doio.o: /usr/ucbinclude/sys/dirent.h
-doio.o: /usr/ucbinclude/sys/errno.h
-doio.o: /usr/ucbinclude/sys/fcntlcom.h
-doio.o: /usr/ucbinclude/sys/file.h
-doio.o: /usr/ucbinclude/sys/filio.h
-doio.o: /usr/ucbinclude/sys/ioccom.h
-doio.o: /usr/ucbinclude/sys/ioctl.h
-doio.o: /usr/ucbinclude/sys/ipc.h
-doio.o: /usr/ucbinclude/sys/msg.h
-doio.o: /usr/ucbinclude/sys/param.h
-doio.o: /usr/ucbinclude/sys/sem.h
-doio.o: /usr/ucbinclude/sys/shm.h
-doio.o: /usr/ucbinclude/sys/signal.h
-doio.o: /usr/ucbinclude/sys/sockio.h
-doio.o: /usr/ucbinclude/sys/stat.h
-doio.o: /usr/ucbinclude/sys/stdtypes.h
-doio.o: /usr/ucbinclude/sys/sysmacros.h
-doio.o: /usr/ucbinclude/sys/time.h
-doio.o: /usr/ucbinclude/sys/times.h
-doio.o: /usr/ucbinclude/sys/ttold.h
-doio.o: /usr/ucbinclude/sys/ttychars.h
-doio.o: /usr/ucbinclude/sys/ttycom.h
-doio.o: /usr/ucbinclude/sys/ttydev.h
-doio.o: /usr/ucbinclude/sys/types.h
-doio.o: /usr/ucbinclude/time.h
-doio.o: /usr/ucbinclude/utime.h
-doio.o: /usr/ucbinclude/vm/faultcode.h
+doio.o: /usr/include/ctype.h
+doio.o: /usr/include/debug/debug.h
+doio.o: /usr/include/dirent.h
+doio.o: /usr/include/errno.h
+doio.o: /usr/include/machine/mmu.h
+doio.o: /usr/include/machine/param.h
+doio.o: /usr/include/machine/setjmp.h
+doio.o: /usr/include/mon/obpdefs.h
+doio.o: /usr/include/mon/openprom.h
+doio.o: /usr/include/mon/sunromvec.h
+doio.o: /usr/include/netinet/in.h
+doio.o: /usr/include/setjmp.h
+doio.o: /usr/include/stdio.h
+doio.o: /usr/include/sys/dirent.h
+doio.o: /usr/include/sys/errno.h
+doio.o: /usr/include/sys/fcntlcom.h
+doio.o: /usr/include/sys/file.h
+doio.o: /usr/include/sys/filio.h
+doio.o: /usr/include/sys/ioccom.h
+doio.o: /usr/include/sys/ioctl.h
+doio.o: /usr/include/sys/ipc.h
+doio.o: /usr/include/sys/msg.h
+doio.o: /usr/include/sys/param.h
+doio.o: /usr/include/sys/sem.h
+doio.o: /usr/include/sys/shm.h
+doio.o: /usr/include/sys/signal.h
+doio.o: /usr/include/sys/sockio.h
+doio.o: /usr/include/sys/stat.h
+doio.o: /usr/include/sys/stdtypes.h
+doio.o: /usr/include/sys/sysmacros.h
+doio.o: /usr/include/sys/time.h
+doio.o: /usr/include/sys/times.h
+doio.o: /usr/include/sys/ttold.h
+doio.o: /usr/include/sys/ttychars.h
+doio.o: /usr/include/sys/ttycom.h
+doio.o: /usr/include/sys/ttydev.h
+doio.o: /usr/include/sys/types.h
+doio.o: /usr/include/time.h
+doio.o: /usr/include/utime.h
+doio.o: /usr/include/varargs.h
+doio.o: /usr/include/vm/faultcode.h
 doio.o: EXTERN.h
 doio.o: av.h
 doio.o: config.h
 doio.o: cop.h
+doio.o: cv.h
 doio.o: doio.c
 doio.o: embed.h
 doio.o: form.h
 doio.o: gv.h
 doio.o: handy.h
 doio.o: hv.h
+doio.o: mg.h
 doio.o: op.h
 doio.o: opcode.h
 doio.o: perl.h
 doio.o: pp.h
 doio.o: proto.h
 doio.o: regexp.h
+doio.o: scope.h
 doio.o: sv.h
 doio.o: unixish.h
 doio.o: util.h
-dump.o: 
-dump.o: /usr/ucbinclude/ctype.h
-dump.o: /usr/ucbinclude/dirent.h
-dump.o: /usr/ucbinclude/errno.h
-dump.o: /usr/ucbinclude/machine/param.h
-dump.o: /usr/ucbinclude/machine/setjmp.h
-dump.o: /usr/ucbinclude/ndbm.h
-dump.o: /usr/ucbinclude/netinet/in.h
-dump.o: /usr/ucbinclude/setjmp.h
-dump.o: /usr/ucbinclude/stdio.h
-dump.o: /usr/ucbinclude/sys/dirent.h
-dump.o: /usr/ucbinclude/sys/errno.h
-dump.o: /usr/ucbinclude/sys/filio.h
-dump.o: /usr/ucbinclude/sys/ioccom.h
-dump.o: /usr/ucbinclude/sys/ioctl.h
-dump.o: /usr/ucbinclude/sys/param.h
-dump.o: /usr/ucbinclude/sys/signal.h
-dump.o: /usr/ucbinclude/sys/sockio.h
-dump.o: /usr/ucbinclude/sys/stat.h
-dump.o: /usr/ucbinclude/sys/stdtypes.h
-dump.o: /usr/ucbinclude/sys/sysmacros.h
-dump.o: /usr/ucbinclude/sys/time.h
-dump.o: /usr/ucbinclude/sys/times.h
-dump.o: /usr/ucbinclude/sys/ttold.h
-dump.o: /usr/ucbinclude/sys/ttychars.h
-dump.o: /usr/ucbinclude/sys/ttycom.h
-dump.o: /usr/ucbinclude/sys/ttydev.h
-dump.o: /usr/ucbinclude/sys/types.h
-dump.o: /usr/ucbinclude/time.h
-dump.o: /usr/ucbinclude/vm/faultcode.h
+dump.o: /usr/include/ctype.h
+dump.o: /usr/include/dirent.h
+dump.o: /usr/include/errno.h
+dump.o: /usr/include/machine/param.h
+dump.o: /usr/include/machine/setjmp.h
+dump.o: /usr/include/netinet/in.h
+dump.o: /usr/include/setjmp.h
+dump.o: /usr/include/stdio.h
+dump.o: /usr/include/sys/dirent.h
+dump.o: /usr/include/sys/errno.h
+dump.o: /usr/include/sys/filio.h
+dump.o: /usr/include/sys/ioccom.h
+dump.o: /usr/include/sys/ioctl.h
+dump.o: /usr/include/sys/param.h
+dump.o: /usr/include/sys/signal.h
+dump.o: /usr/include/sys/sockio.h
+dump.o: /usr/include/sys/stat.h
+dump.o: /usr/include/sys/stdtypes.h
+dump.o: /usr/include/sys/sysmacros.h
+dump.o: /usr/include/sys/time.h
+dump.o: /usr/include/sys/times.h
+dump.o: /usr/include/sys/ttold.h
+dump.o: /usr/include/sys/ttychars.h
+dump.o: /usr/include/sys/ttycom.h
+dump.o: /usr/include/sys/ttydev.h
+dump.o: /usr/include/sys/types.h
+dump.o: /usr/include/time.h
+dump.o: /usr/include/varargs.h
+dump.o: /usr/include/vm/faultcode.h
 dump.o: EXTERN.h
 dump.o: av.h
 dump.o: config.h
 dump.o: cop.h
+dump.o: cv.h
 dump.o: dump.c
 dump.o: embed.h
 dump.o: form.h
 dump.o: gv.h
 dump.o: handy.h
 dump.o: hv.h
+dump.o: mg.h
 dump.o: op.h
 dump.o: opcode.h
 dump.o: perl.h
 dump.o: pp.h
 dump.o: proto.h
 dump.o: regexp.h
+dump.o: scope.h
 dump.o: sv.h
 dump.o: unixish.h
 dump.o: util.h
-eval.o: 
-eval.o: /usr/ucbinclude/ctype.h
-eval.o: /usr/ucbinclude/dirent.h
-eval.o: /usr/ucbinclude/errno.h
-eval.o: /usr/ucbinclude/machine/param.h
-eval.o: /usr/ucbinclude/machine/setjmp.h
-eval.o: /usr/ucbinclude/ndbm.h
-eval.o: /usr/ucbinclude/netinet/in.h
-eval.o: /usr/ucbinclude/setjmp.h
-eval.o: /usr/ucbinclude/stdio.h
-eval.o: /usr/ucbinclude/sys/dirent.h
-eval.o: /usr/ucbinclude/sys/errno.h
-eval.o: /usr/ucbinclude/sys/fcntlcom.h
-eval.o: /usr/ucbinclude/sys/file.h
-eval.o: /usr/ucbinclude/sys/filio.h
-eval.o: /usr/ucbinclude/sys/ioccom.h
-eval.o: /usr/ucbinclude/sys/ioctl.h
-eval.o: /usr/ucbinclude/sys/param.h
-eval.o: /usr/ucbinclude/sys/signal.h
-eval.o: /usr/ucbinclude/sys/sockio.h
-eval.o: /usr/ucbinclude/sys/stat.h
-eval.o: /usr/ucbinclude/sys/stdtypes.h
-eval.o: /usr/ucbinclude/sys/sysmacros.h
-eval.o: /usr/ucbinclude/sys/time.h
-eval.o: /usr/ucbinclude/sys/times.h
-eval.o: /usr/ucbinclude/sys/ttold.h
-eval.o: /usr/ucbinclude/sys/ttychars.h
-eval.o: /usr/ucbinclude/sys/ttycom.h
-eval.o: /usr/ucbinclude/sys/ttydev.h
-eval.o: /usr/ucbinclude/sys/types.h
-eval.o: /usr/ucbinclude/time.h
-eval.o: /usr/ucbinclude/vfork.h
-eval.o: /usr/ucbinclude/vm/faultcode.h
-eval.o: EXTERN.h
-eval.o: av.h
-eval.o: config.h
-eval.o: cop.h
-eval.o: embed.h
-eval.o: eval.c
-eval.o: form.h
-eval.o: gv.h
-eval.o: handy.h
-eval.o: hv.h
-eval.o: op.h
-eval.o: opcode.h
-eval.o: perl.h
-eval.o: pp.h
-eval.o: proto.h
-eval.o: regexp.h
-eval.o: sv.h
-eval.o: unixish.h
-eval.o: util.h
-hv.o: 
-hv.o: /usr/ucbinclude/ctype.h
-hv.o: /usr/ucbinclude/dirent.h
-hv.o: /usr/ucbinclude/errno.h
-hv.o: /usr/ucbinclude/machine/param.h
-hv.o: /usr/ucbinclude/machine/setjmp.h
-hv.o: /usr/ucbinclude/ndbm.h
-hv.o: /usr/ucbinclude/netinet/in.h
-hv.o: /usr/ucbinclude/setjmp.h
-hv.o: /usr/ucbinclude/stdio.h
-hv.o: /usr/ucbinclude/sys/dirent.h
-hv.o: /usr/ucbinclude/sys/errno.h
-hv.o: /usr/ucbinclude/sys/fcntlcom.h
-hv.o: /usr/ucbinclude/sys/file.h
-hv.o: /usr/ucbinclude/sys/filio.h
-hv.o: /usr/ucbinclude/sys/ioccom.h
-hv.o: /usr/ucbinclude/sys/ioctl.h
-hv.o: /usr/ucbinclude/sys/param.h
-hv.o: /usr/ucbinclude/sys/signal.h
-hv.o: /usr/ucbinclude/sys/sockio.h
-hv.o: /usr/ucbinclude/sys/stat.h
-hv.o: /usr/ucbinclude/sys/stdtypes.h
-hv.o: /usr/ucbinclude/sys/sysmacros.h
-hv.o: /usr/ucbinclude/sys/time.h
-hv.o: /usr/ucbinclude/sys/times.h
-hv.o: /usr/ucbinclude/sys/ttold.h
-hv.o: /usr/ucbinclude/sys/ttychars.h
-hv.o: /usr/ucbinclude/sys/ttycom.h
-hv.o: /usr/ucbinclude/sys/ttydev.h
-hv.o: /usr/ucbinclude/sys/types.h
-hv.o: /usr/ucbinclude/time.h
-hv.o: /usr/ucbinclude/vm/faultcode.h
+hv.o: /usr/include/ctype.h
+hv.o: /usr/include/dirent.h
+hv.o: /usr/include/errno.h
+hv.o: /usr/include/machine/param.h
+hv.o: /usr/include/machine/setjmp.h
+hv.o: /usr/include/netinet/in.h
+hv.o: /usr/include/setjmp.h
+hv.o: /usr/include/stdio.h
+hv.o: /usr/include/sys/dirent.h
+hv.o: /usr/include/sys/errno.h
+hv.o: /usr/include/sys/filio.h
+hv.o: /usr/include/sys/ioccom.h
+hv.o: /usr/include/sys/ioctl.h
+hv.o: /usr/include/sys/param.h
+hv.o: /usr/include/sys/signal.h
+hv.o: /usr/include/sys/sockio.h
+hv.o: /usr/include/sys/stat.h
+hv.o: /usr/include/sys/stdtypes.h
+hv.o: /usr/include/sys/sysmacros.h
+hv.o: /usr/include/sys/time.h
+hv.o: /usr/include/sys/times.h
+hv.o: /usr/include/sys/ttold.h
+hv.o: /usr/include/sys/ttychars.h
+hv.o: /usr/include/sys/ttycom.h
+hv.o: /usr/include/sys/ttydev.h
+hv.o: /usr/include/sys/types.h
+hv.o: /usr/include/time.h
+hv.o: /usr/include/varargs.h
+hv.o: /usr/include/vm/faultcode.h
 hv.o: EXTERN.h
 hv.o: av.h
 hv.o: config.h
 hv.o: cop.h
+hv.o: cv.h
 hv.o: embed.h
 hv.o: form.h
 hv.o: gv.h
 hv.o: handy.h
 hv.o: hv.c
 hv.o: hv.h
+hv.o: mg.h
 hv.o: op.h
 hv.o: opcode.h
 hv.o: perl.h
 hv.o: pp.h
 hv.o: proto.h
 hv.o: regexp.h
+hv.o: scope.h
 hv.o: sv.h
 hv.o: unixish.h
 hv.o: util.h
-main.o: 
-main.o: /usr/ucbinclude/ctype.h
-main.o: /usr/ucbinclude/dirent.h
-main.o: /usr/ucbinclude/errno.h
-main.o: /usr/ucbinclude/machine/param.h
-main.o: /usr/ucbinclude/machine/setjmp.h
-main.o: /usr/ucbinclude/ndbm.h
-main.o: /usr/ucbinclude/netinet/in.h
-main.o: /usr/ucbinclude/setjmp.h
-main.o: /usr/ucbinclude/stdio.h
-main.o: /usr/ucbinclude/sys/dirent.h
-main.o: /usr/ucbinclude/sys/errno.h
-main.o: /usr/ucbinclude/sys/filio.h
-main.o: /usr/ucbinclude/sys/ioccom.h
-main.o: /usr/ucbinclude/sys/ioctl.h
-main.o: /usr/ucbinclude/sys/param.h
-main.o: /usr/ucbinclude/sys/signal.h
-main.o: /usr/ucbinclude/sys/sockio.h
-main.o: /usr/ucbinclude/sys/stat.h
-main.o: /usr/ucbinclude/sys/stdtypes.h
-main.o: /usr/ucbinclude/sys/sysmacros.h
-main.o: /usr/ucbinclude/sys/time.h
-main.o: /usr/ucbinclude/sys/times.h
-main.o: /usr/ucbinclude/sys/ttold.h
-main.o: /usr/ucbinclude/sys/ttychars.h
-main.o: /usr/ucbinclude/sys/ttycom.h
-main.o: /usr/ucbinclude/sys/ttydev.h
-main.o: /usr/ucbinclude/sys/types.h
-main.o: /usr/ucbinclude/time.h
-main.o: /usr/ucbinclude/vm/faultcode.h
-main.o: INTERN.h
-main.o: av.h
-main.o: config.h
-main.o: cop.h
-main.o: embed.h
-main.o: form.h
-main.o: gv.h
-main.o: handy.h
-main.o: hv.h
-main.o: main.c
-main.o: op.h
-main.o: opcode.h
-main.o: perl.h
-main.o: pp.h
-main.o: proto.h
-main.o: regexp.h
-main.o: sv.h
-main.o: unixish.h
-main.o: util.h
-malloc.o: 
-malloc.o: /usr/ucbinclude/ctype.h
-malloc.o: /usr/ucbinclude/dirent.h
-malloc.o: /usr/ucbinclude/errno.h
-malloc.o: /usr/ucbinclude/machine/param.h
-malloc.o: /usr/ucbinclude/machine/setjmp.h
-malloc.o: /usr/ucbinclude/ndbm.h
-malloc.o: /usr/ucbinclude/netinet/in.h
-malloc.o: /usr/ucbinclude/setjmp.h
-malloc.o: /usr/ucbinclude/stdio.h
-malloc.o: /usr/ucbinclude/sys/dirent.h
-malloc.o: /usr/ucbinclude/sys/errno.h
-malloc.o: /usr/ucbinclude/sys/filio.h
-malloc.o: /usr/ucbinclude/sys/ioccom.h
-malloc.o: /usr/ucbinclude/sys/ioctl.h
-malloc.o: /usr/ucbinclude/sys/param.h
-malloc.o: /usr/ucbinclude/sys/signal.h
-malloc.o: /usr/ucbinclude/sys/sockio.h
-malloc.o: /usr/ucbinclude/sys/stat.h
-malloc.o: /usr/ucbinclude/sys/stdtypes.h
-malloc.o: /usr/ucbinclude/sys/sysmacros.h
-malloc.o: /usr/ucbinclude/sys/time.h
-malloc.o: /usr/ucbinclude/sys/times.h
-malloc.o: /usr/ucbinclude/sys/ttold.h
-malloc.o: /usr/ucbinclude/sys/ttychars.h
-malloc.o: /usr/ucbinclude/sys/ttycom.h
-malloc.o: /usr/ucbinclude/sys/ttydev.h
-malloc.o: /usr/ucbinclude/sys/types.h
-malloc.o: /usr/ucbinclude/time.h
-malloc.o: /usr/ucbinclude/vm/faultcode.h
+malloc.o: /usr/include/ctype.h
+malloc.o: /usr/include/dirent.h
+malloc.o: /usr/include/errno.h
+malloc.o: /usr/include/machine/param.h
+malloc.o: /usr/include/machine/setjmp.h
+malloc.o: /usr/include/netinet/in.h
+malloc.o: /usr/include/setjmp.h
+malloc.o: /usr/include/stdio.h
+malloc.o: /usr/include/sys/dirent.h
+malloc.o: /usr/include/sys/errno.h
+malloc.o: /usr/include/sys/filio.h
+malloc.o: /usr/include/sys/ioccom.h
+malloc.o: /usr/include/sys/ioctl.h
+malloc.o: /usr/include/sys/param.h
+malloc.o: /usr/include/sys/signal.h
+malloc.o: /usr/include/sys/sockio.h
+malloc.o: /usr/include/sys/stat.h
+malloc.o: /usr/include/sys/stdtypes.h
+malloc.o: /usr/include/sys/sysmacros.h
+malloc.o: /usr/include/sys/time.h
+malloc.o: /usr/include/sys/times.h
+malloc.o: /usr/include/sys/ttold.h
+malloc.o: /usr/include/sys/ttychars.h
+malloc.o: /usr/include/sys/ttycom.h
+malloc.o: /usr/include/sys/ttydev.h
+malloc.o: /usr/include/sys/types.h
+malloc.o: /usr/include/time.h
+malloc.o: /usr/include/varargs.h
+malloc.o: /usr/include/vm/faultcode.h
 malloc.o: EXTERN.h
 malloc.o: av.h
 malloc.o: config.h
 malloc.o: cop.h
+malloc.o: cv.h
 malloc.o: embed.h
 malloc.o: form.h
 malloc.o: gv.h
 malloc.o: handy.h
 malloc.o: hv.h
 malloc.o: malloc.c
+malloc.o: mg.h
 malloc.o: op.h
 malloc.o: opcode.h
 malloc.o: perl.h
 malloc.o: pp.h
 malloc.o: proto.h
 malloc.o: regexp.h
+malloc.o: scope.h
 malloc.o: sv.h
 malloc.o: unixish.h
 malloc.o: util.h
-perl.o: 
-perl.o: /usr/ucbinclude/ctype.h
-perl.o: /usr/ucbinclude/dirent.h
-perl.o: /usr/ucbinclude/errno.h
-perl.o: /usr/ucbinclude/machine/param.h
-perl.o: /usr/ucbinclude/machine/setjmp.h
-perl.o: /usr/ucbinclude/ndbm.h
-perl.o: /usr/ucbinclude/netinet/in.h
-perl.o: /usr/ucbinclude/setjmp.h
-perl.o: /usr/ucbinclude/stdio.h
-perl.o: /usr/ucbinclude/sys/dirent.h
-perl.o: /usr/ucbinclude/sys/errno.h
-perl.o: /usr/ucbinclude/sys/filio.h
-perl.o: /usr/ucbinclude/sys/ioccom.h
-perl.o: /usr/ucbinclude/sys/ioctl.h
-perl.o: /usr/ucbinclude/sys/param.h
-perl.o: /usr/ucbinclude/sys/signal.h
-perl.o: /usr/ucbinclude/sys/sockio.h
-perl.o: /usr/ucbinclude/sys/stat.h
-perl.o: /usr/ucbinclude/sys/stdtypes.h
-perl.o: /usr/ucbinclude/sys/sysmacros.h
-perl.o: /usr/ucbinclude/sys/time.h
-perl.o: /usr/ucbinclude/sys/times.h
-perl.o: /usr/ucbinclude/sys/ttold.h
-perl.o: /usr/ucbinclude/sys/ttychars.h
-perl.o: /usr/ucbinclude/sys/ttycom.h
-perl.o: /usr/ucbinclude/sys/ttydev.h
-perl.o: /usr/ucbinclude/sys/types.h
-perl.o: /usr/ucbinclude/time.h
-perl.o: /usr/ucbinclude/vm/faultcode.h
-perl.o: EXTERN.h
-perl.o: av.h
-perl.o: config.h
-perl.o: cop.h
-perl.o: embed.h
-perl.o: form.h
-perl.o: gv.h
-perl.o: handy.h
-perl.o: hv.h
-perl.o: op.h
-perl.o: opcode.h
-perl.o: patchlevel.h
-perl.o: perl.c
-perl.o: perl.h
-perl.o: perly.h
-perl.o: pp.h
-perl.o: proto.h
-perl.o: regexp.h
-perl.o: sv.h
-perl.o: unixish.h
-perl.o: util.h
-pp.o: 
-pp.o: /usr/ucbinclude/ctype.h
-pp.o: /usr/ucbinclude/dirent.h
-pp.o: /usr/ucbinclude/errno.h
-pp.o: /usr/ucbinclude/grp.h
-pp.o: /usr/ucbinclude/machine/param.h
-pp.o: /usr/ucbinclude/machine/setjmp.h
-pp.o: /usr/ucbinclude/ndbm.h
-pp.o: /usr/ucbinclude/netdb.h
-pp.o: /usr/ucbinclude/netinet/in.h
-pp.o: /usr/ucbinclude/pwd.h
-pp.o: /usr/ucbinclude/setjmp.h
-pp.o: /usr/ucbinclude/stdio.h
-pp.o: /usr/ucbinclude/sys/dirent.h
-pp.o: /usr/ucbinclude/sys/errno.h
-pp.o: /usr/ucbinclude/sys/fcntlcom.h
-pp.o: /usr/ucbinclude/sys/file.h
-pp.o: /usr/ucbinclude/sys/filio.h
-pp.o: /usr/ucbinclude/sys/ioccom.h
-pp.o: /usr/ucbinclude/sys/ioctl.h
-pp.o: /usr/ucbinclude/sys/param.h
-pp.o: /usr/ucbinclude/sys/signal.h
-pp.o: /usr/ucbinclude/sys/socket.h
-pp.o: /usr/ucbinclude/sys/sockio.h
-pp.o: /usr/ucbinclude/sys/stat.h
-pp.o: /usr/ucbinclude/sys/stdtypes.h
-pp.o: /usr/ucbinclude/sys/sysmacros.h
-pp.o: /usr/ucbinclude/sys/time.h
-pp.o: /usr/ucbinclude/sys/times.h
-pp.o: /usr/ucbinclude/sys/ttold.h
-pp.o: /usr/ucbinclude/sys/ttychars.h
-pp.o: /usr/ucbinclude/sys/ttycom.h
-pp.o: /usr/ucbinclude/sys/ttydev.h
-pp.o: /usr/ucbinclude/sys/types.h
-pp.o: /usr/ucbinclude/time.h
-pp.o: /usr/ucbinclude/utime.h
-pp.o: /usr/ucbinclude/vm/faultcode.h
+mg.o: /usr/include/ctype.h
+mg.o: /usr/include/dirent.h
+mg.o: /usr/include/errno.h
+mg.o: /usr/include/machine/param.h
+mg.o: /usr/include/machine/setjmp.h
+mg.o: /usr/include/netinet/in.h
+mg.o: /usr/include/setjmp.h
+mg.o: /usr/include/stdio.h
+mg.o: /usr/include/sys/dirent.h
+mg.o: /usr/include/sys/errno.h
+mg.o: /usr/include/sys/filio.h
+mg.o: /usr/include/sys/ioccom.h
+mg.o: /usr/include/sys/ioctl.h
+mg.o: /usr/include/sys/param.h
+mg.o: /usr/include/sys/signal.h
+mg.o: /usr/include/sys/sockio.h
+mg.o: /usr/include/sys/stat.h
+mg.o: /usr/include/sys/stdtypes.h
+mg.o: /usr/include/sys/sysmacros.h
+mg.o: /usr/include/sys/time.h
+mg.o: /usr/include/sys/times.h
+mg.o: /usr/include/sys/ttold.h
+mg.o: /usr/include/sys/ttychars.h
+mg.o: /usr/include/sys/ttycom.h
+mg.o: /usr/include/sys/ttydev.h
+mg.o: /usr/include/sys/types.h
+mg.o: /usr/include/time.h
+mg.o: /usr/include/varargs.h
+mg.o: /usr/include/vm/faultcode.h
+mg.o: EXTERN.h
+mg.o: av.h
+mg.o: config.h
+mg.o: cop.h
+mg.o: cv.h
+mg.o: embed.h
+mg.o: form.h
+mg.o: gv.h
+mg.o: handy.h
+mg.o: hv.h
+mg.o: mg.c
+mg.o: mg.h
+mg.o: op.h
+mg.o: opcode.h
+mg.o: perl.h
+mg.o: pp.h
+mg.o: proto.h
+mg.o: regexp.h
+mg.o: scope.h
+mg.o: sv.h
+mg.o: unixish.h
+mg.o: util.h
+perly.o: /usr/include/ctype.h
+perly.o: /usr/include/dirent.h
+perly.o: /usr/include/errno.h
+perly.o: /usr/include/machine/param.h
+perly.o: /usr/include/machine/setjmp.h
+perly.o: /usr/include/netinet/in.h
+perly.o: /usr/include/setjmp.h
+perly.o: /usr/include/stdio.h
+perly.o: /usr/include/sys/dirent.h
+perly.o: /usr/include/sys/errno.h
+perly.o: /usr/include/sys/filio.h
+perly.o: /usr/include/sys/ioccom.h
+perly.o: /usr/include/sys/ioctl.h
+perly.o: /usr/include/sys/param.h
+perly.o: /usr/include/sys/signal.h
+perly.o: /usr/include/sys/sockio.h
+perly.o: /usr/include/sys/stat.h
+perly.o: /usr/include/sys/stdtypes.h
+perly.o: /usr/include/sys/sysmacros.h
+perly.o: /usr/include/sys/time.h
+perly.o: /usr/include/sys/times.h
+perly.o: /usr/include/sys/ttold.h
+perly.o: /usr/include/sys/ttychars.h
+perly.o: /usr/include/sys/ttycom.h
+perly.o: /usr/include/sys/ttydev.h
+perly.o: /usr/include/sys/types.h
+perly.o: /usr/include/time.h
+perly.o: /usr/include/varargs.h
+perly.o: /usr/include/vm/faultcode.h
+perly.o: EXTERN.h
+perly.o: av.h
+perly.o: config.h
+perly.o: cop.h
+perly.o: cv.h
+perly.o: embed.h
+perly.o: form.h
+perly.o: gv.h
+perly.o: handy.h
+perly.o: hv.h
+perly.o: mg.h
+perly.o: op.h
+perly.o: opcode.h
+perly.o: perl.h
+perly.o: perly.c
+perly.o: pp.h
+perly.o: proto.h
+perly.o: regexp.h
+perly.o: scope.h
+perly.o: sv.h
+perly.o: unixish.h
+perly.o: util.h
+pp.o: /usr/include/ctype.h
+pp.o: /usr/include/dirent.h
+pp.o: /usr/include/errno.h
+pp.o: /usr/include/grp.h
+pp.o: /usr/include/machine/param.h
+pp.o: /usr/include/machine/setjmp.h
+pp.o: /usr/include/netdb.h
+pp.o: /usr/include/netinet/in.h
+pp.o: /usr/include/pwd.h
+pp.o: /usr/include/setjmp.h
+pp.o: /usr/include/stdio.h
+pp.o: /usr/include/sys/dirent.h
+pp.o: /usr/include/sys/errno.h
+pp.o: /usr/include/sys/fcntlcom.h
+pp.o: /usr/include/sys/file.h
+pp.o: /usr/include/sys/filio.h
+pp.o: /usr/include/sys/ioccom.h
+pp.o: /usr/include/sys/ioctl.h
+pp.o: /usr/include/sys/param.h
+pp.o: /usr/include/sys/signal.h
+pp.o: /usr/include/sys/socket.h
+pp.o: /usr/include/sys/sockio.h
+pp.o: /usr/include/sys/stat.h
+pp.o: /usr/include/sys/stdtypes.h
+pp.o: /usr/include/sys/sysmacros.h
+pp.o: /usr/include/sys/time.h
+pp.o: /usr/include/sys/times.h
+pp.o: /usr/include/sys/ttold.h
+pp.o: /usr/include/sys/ttychars.h
+pp.o: /usr/include/sys/ttycom.h
+pp.o: /usr/include/sys/ttydev.h
+pp.o: /usr/include/sys/types.h
+pp.o: /usr/include/time.h
+pp.o: /usr/include/utime.h
+pp.o: /usr/include/varargs.h
+pp.o: /usr/include/vm/faultcode.h
 pp.o: EXTERN.h
 pp.o: av.h
 pp.o: config.h
 pp.o: cop.h
+pp.o: cv.h
 pp.o: embed.h
 pp.o: form.h
 pp.o: gv.h
 pp.o: handy.h
 pp.o: hv.h
+pp.o: mg.h
 pp.o: op.h
 pp.o: opcode.h
 pp.o: perl.h
@@ -997,49 +849,51 @@ pp.o: pp.c
 pp.o: pp.h
 pp.o: proto.h
 pp.o: regexp.h
+pp.o: scope.h
 pp.o: sv.h
 pp.o: unixish.h
 pp.o: util.h
-regcomp.o: 
-regcomp.o: /usr/ucbinclude/ctype.h
-regcomp.o: /usr/ucbinclude/dirent.h
-regcomp.o: /usr/ucbinclude/errno.h
-regcomp.o: /usr/ucbinclude/machine/param.h
-regcomp.o: /usr/ucbinclude/machine/setjmp.h
-regcomp.o: /usr/ucbinclude/ndbm.h
-regcomp.o: /usr/ucbinclude/netinet/in.h
-regcomp.o: /usr/ucbinclude/setjmp.h
-regcomp.o: /usr/ucbinclude/stdio.h
-regcomp.o: /usr/ucbinclude/sys/dirent.h
-regcomp.o: /usr/ucbinclude/sys/errno.h
-regcomp.o: /usr/ucbinclude/sys/filio.h
-regcomp.o: /usr/ucbinclude/sys/ioccom.h
-regcomp.o: /usr/ucbinclude/sys/ioctl.h
-regcomp.o: /usr/ucbinclude/sys/param.h
-regcomp.o: /usr/ucbinclude/sys/signal.h
-regcomp.o: /usr/ucbinclude/sys/sockio.h
-regcomp.o: /usr/ucbinclude/sys/stat.h
-regcomp.o: /usr/ucbinclude/sys/stdtypes.h
-regcomp.o: /usr/ucbinclude/sys/sysmacros.h
-regcomp.o: /usr/ucbinclude/sys/time.h
-regcomp.o: /usr/ucbinclude/sys/times.h
-regcomp.o: /usr/ucbinclude/sys/ttold.h
-regcomp.o: /usr/ucbinclude/sys/ttychars.h
-regcomp.o: /usr/ucbinclude/sys/ttycom.h
-regcomp.o: /usr/ucbinclude/sys/ttydev.h
-regcomp.o: /usr/ucbinclude/sys/types.h
-regcomp.o: /usr/ucbinclude/time.h
-regcomp.o: /usr/ucbinclude/vm/faultcode.h
+regcomp.o: /usr/include/ctype.h
+regcomp.o: /usr/include/dirent.h
+regcomp.o: /usr/include/errno.h
+regcomp.o: /usr/include/machine/param.h
+regcomp.o: /usr/include/machine/setjmp.h
+regcomp.o: /usr/include/netinet/in.h
+regcomp.o: /usr/include/setjmp.h
+regcomp.o: /usr/include/stdio.h
+regcomp.o: /usr/include/sys/dirent.h
+regcomp.o: /usr/include/sys/errno.h
+regcomp.o: /usr/include/sys/filio.h
+regcomp.o: /usr/include/sys/ioccom.h
+regcomp.o: /usr/include/sys/ioctl.h
+regcomp.o: /usr/include/sys/param.h
+regcomp.o: /usr/include/sys/signal.h
+regcomp.o: /usr/include/sys/sockio.h
+regcomp.o: /usr/include/sys/stat.h
+regcomp.o: /usr/include/sys/stdtypes.h
+regcomp.o: /usr/include/sys/sysmacros.h
+regcomp.o: /usr/include/sys/time.h
+regcomp.o: /usr/include/sys/times.h
+regcomp.o: /usr/include/sys/ttold.h
+regcomp.o: /usr/include/sys/ttychars.h
+regcomp.o: /usr/include/sys/ttycom.h
+regcomp.o: /usr/include/sys/ttydev.h
+regcomp.o: /usr/include/sys/types.h
+regcomp.o: /usr/include/time.h
+regcomp.o: /usr/include/varargs.h
+regcomp.o: /usr/include/vm/faultcode.h
 regcomp.o: EXTERN.h
 regcomp.o: INTERN.h
 regcomp.o: av.h
 regcomp.o: config.h
 regcomp.o: cop.h
+regcomp.o: cv.h
 regcomp.o: embed.h
 regcomp.o: form.h
 regcomp.o: gv.h
 regcomp.o: handy.h
 regcomp.o: hv.h
+regcomp.o: mg.h
 regcomp.o: op.h
 regcomp.o: opcode.h
 regcomp.o: perl.h
@@ -1048,48 +902,50 @@ regcomp.o: proto.h
 regcomp.o: regcomp.c
 regcomp.o: regcomp.h
 regcomp.o: regexp.h
+regcomp.o: scope.h
 regcomp.o: sv.h
 regcomp.o: unixish.h
 regcomp.o: util.h
-regexec.o: 
-regexec.o: /usr/ucbinclude/ctype.h
-regexec.o: /usr/ucbinclude/dirent.h
-regexec.o: /usr/ucbinclude/errno.h
-regexec.o: /usr/ucbinclude/machine/param.h
-regexec.o: /usr/ucbinclude/machine/setjmp.h
-regexec.o: /usr/ucbinclude/ndbm.h
-regexec.o: /usr/ucbinclude/netinet/in.h
-regexec.o: /usr/ucbinclude/setjmp.h
-regexec.o: /usr/ucbinclude/stdio.h
-regexec.o: /usr/ucbinclude/sys/dirent.h
-regexec.o: /usr/ucbinclude/sys/errno.h
-regexec.o: /usr/ucbinclude/sys/filio.h
-regexec.o: /usr/ucbinclude/sys/ioccom.h
-regexec.o: /usr/ucbinclude/sys/ioctl.h
-regexec.o: /usr/ucbinclude/sys/param.h
-regexec.o: /usr/ucbinclude/sys/signal.h
-regexec.o: /usr/ucbinclude/sys/sockio.h
-regexec.o: /usr/ucbinclude/sys/stat.h
-regexec.o: /usr/ucbinclude/sys/stdtypes.h
-regexec.o: /usr/ucbinclude/sys/sysmacros.h
-regexec.o: /usr/ucbinclude/sys/time.h
-regexec.o: /usr/ucbinclude/sys/times.h
-regexec.o: /usr/ucbinclude/sys/ttold.h
-regexec.o: /usr/ucbinclude/sys/ttychars.h
-regexec.o: /usr/ucbinclude/sys/ttycom.h
-regexec.o: /usr/ucbinclude/sys/ttydev.h
-regexec.o: /usr/ucbinclude/sys/types.h
-regexec.o: /usr/ucbinclude/time.h
-regexec.o: /usr/ucbinclude/vm/faultcode.h
+regexec.o: /usr/include/ctype.h
+regexec.o: /usr/include/dirent.h
+regexec.o: /usr/include/errno.h
+regexec.o: /usr/include/machine/param.h
+regexec.o: /usr/include/machine/setjmp.h
+regexec.o: /usr/include/netinet/in.h
+regexec.o: /usr/include/setjmp.h
+regexec.o: /usr/include/stdio.h
+regexec.o: /usr/include/sys/dirent.h
+regexec.o: /usr/include/sys/errno.h
+regexec.o: /usr/include/sys/filio.h
+regexec.o: /usr/include/sys/ioccom.h
+regexec.o: /usr/include/sys/ioctl.h
+regexec.o: /usr/include/sys/param.h
+regexec.o: /usr/include/sys/signal.h
+regexec.o: /usr/include/sys/sockio.h
+regexec.o: /usr/include/sys/stat.h
+regexec.o: /usr/include/sys/stdtypes.h
+regexec.o: /usr/include/sys/sysmacros.h
+regexec.o: /usr/include/sys/time.h
+regexec.o: /usr/include/sys/times.h
+regexec.o: /usr/include/sys/ttold.h
+regexec.o: /usr/include/sys/ttychars.h
+regexec.o: /usr/include/sys/ttycom.h
+regexec.o: /usr/include/sys/ttydev.h
+regexec.o: /usr/include/sys/types.h
+regexec.o: /usr/include/time.h
+regexec.o: /usr/include/varargs.h
+regexec.o: /usr/include/vm/faultcode.h
 regexec.o: EXTERN.h
 regexec.o: av.h
 regexec.o: config.h
 regexec.o: cop.h
+regexec.o: cv.h
 regexec.o: embed.h
 regexec.o: form.h
 regexec.o: gv.h
 regexec.o: handy.h
 regexec.o: hv.h
+regexec.o: mg.h
 regexec.o: op.h
 regexec.o: opcode.h
 regexec.o: perl.h
@@ -1098,97 +954,101 @@ regexec.o: proto.h
 regexec.o: regcomp.h
 regexec.o: regexec.c
 regexec.o: regexp.h
+regexec.o: scope.h
 regexec.o: sv.h
 regexec.o: unixish.h
 regexec.o: util.h
-gv.o: 
-gv.o: /usr/ucbinclude/ctype.h
-gv.o: /usr/ucbinclude/dirent.h
-gv.o: /usr/ucbinclude/errno.h
-gv.o: /usr/ucbinclude/machine/param.h
-gv.o: /usr/ucbinclude/machine/setjmp.h
-gv.o: /usr/ucbinclude/ndbm.h
-gv.o: /usr/ucbinclude/netinet/in.h
-gv.o: /usr/ucbinclude/setjmp.h
-gv.o: /usr/ucbinclude/stdio.h
-gv.o: /usr/ucbinclude/sys/dirent.h
-gv.o: /usr/ucbinclude/sys/errno.h
-gv.o: /usr/ucbinclude/sys/filio.h
-gv.o: /usr/ucbinclude/sys/ioccom.h
-gv.o: /usr/ucbinclude/sys/ioctl.h
-gv.o: /usr/ucbinclude/sys/param.h
-gv.o: /usr/ucbinclude/sys/signal.h
-gv.o: /usr/ucbinclude/sys/sockio.h
-gv.o: /usr/ucbinclude/sys/stat.h
-gv.o: /usr/ucbinclude/sys/stdtypes.h
-gv.o: /usr/ucbinclude/sys/sysmacros.h
-gv.o: /usr/ucbinclude/sys/time.h
-gv.o: /usr/ucbinclude/sys/times.h
-gv.o: /usr/ucbinclude/sys/ttold.h
-gv.o: /usr/ucbinclude/sys/ttychars.h
-gv.o: /usr/ucbinclude/sys/ttycom.h
-gv.o: /usr/ucbinclude/sys/ttydev.h
-gv.o: /usr/ucbinclude/sys/types.h
-gv.o: /usr/ucbinclude/time.h
-gv.o: /usr/ucbinclude/vm/faultcode.h
+gv.o: /usr/include/ctype.h
+gv.o: /usr/include/dirent.h
+gv.o: /usr/include/errno.h
+gv.o: /usr/include/machine/param.h
+gv.o: /usr/include/machine/setjmp.h
+gv.o: /usr/include/netinet/in.h
+gv.o: /usr/include/setjmp.h
+gv.o: /usr/include/stdio.h
+gv.o: /usr/include/sys/dirent.h
+gv.o: /usr/include/sys/errno.h
+gv.o: /usr/include/sys/filio.h
+gv.o: /usr/include/sys/ioccom.h
+gv.o: /usr/include/sys/ioctl.h
+gv.o: /usr/include/sys/param.h
+gv.o: /usr/include/sys/signal.h
+gv.o: /usr/include/sys/sockio.h
+gv.o: /usr/include/sys/stat.h
+gv.o: /usr/include/sys/stdtypes.h
+gv.o: /usr/include/sys/sysmacros.h
+gv.o: /usr/include/sys/time.h
+gv.o: /usr/include/sys/times.h
+gv.o: /usr/include/sys/ttold.h
+gv.o: /usr/include/sys/ttychars.h
+gv.o: /usr/include/sys/ttycom.h
+gv.o: /usr/include/sys/ttydev.h
+gv.o: /usr/include/sys/types.h
+gv.o: /usr/include/time.h
+gv.o: /usr/include/varargs.h
+gv.o: /usr/include/vm/faultcode.h
 gv.o: EXTERN.h
 gv.o: av.h
 gv.o: config.h
 gv.o: cop.h
+gv.o: cv.h
 gv.o: embed.h
 gv.o: form.h
 gv.o: gv.c
 gv.o: gv.h
 gv.o: handy.h
 gv.o: hv.h
+gv.o: mg.h
 gv.o: op.h
 gv.o: opcode.h
 gv.o: perl.h
 gv.o: pp.h
 gv.o: proto.h
 gv.o: regexp.h
+gv.o: scope.h
 gv.o: sv.h
 gv.o: unixish.h
 gv.o: util.h
-sv.o: 
-sv.o: /usr/ucbinclude/ctype.h
-sv.o: /usr/ucbinclude/dirent.h
-sv.o: /usr/ucbinclude/errno.h
-sv.o: /usr/ucbinclude/machine/param.h
-sv.o: /usr/ucbinclude/machine/setjmp.h
-sv.o: /usr/ucbinclude/ndbm.h
-sv.o: /usr/ucbinclude/netinet/in.h
-sv.o: /usr/ucbinclude/setjmp.h
-sv.o: /usr/ucbinclude/stdio.h
-sv.o: /usr/ucbinclude/sys/dirent.h
-sv.o: /usr/ucbinclude/sys/errno.h
-sv.o: /usr/ucbinclude/sys/filio.h
-sv.o: /usr/ucbinclude/sys/ioccom.h
-sv.o: /usr/ucbinclude/sys/ioctl.h
-sv.o: /usr/ucbinclude/sys/param.h
-sv.o: /usr/ucbinclude/sys/signal.h
-sv.o: /usr/ucbinclude/sys/sockio.h
-sv.o: /usr/ucbinclude/sys/stat.h
-sv.o: /usr/ucbinclude/sys/stdtypes.h
-sv.o: /usr/ucbinclude/sys/sysmacros.h
-sv.o: /usr/ucbinclude/sys/time.h
-sv.o: /usr/ucbinclude/sys/times.h
-sv.o: /usr/ucbinclude/sys/ttold.h
-sv.o: /usr/ucbinclude/sys/ttychars.h
-sv.o: /usr/ucbinclude/sys/ttycom.h
-sv.o: /usr/ucbinclude/sys/ttydev.h
-sv.o: /usr/ucbinclude/sys/types.h
-sv.o: /usr/ucbinclude/time.h
-sv.o: /usr/ucbinclude/vm/faultcode.h
+sv.o: /usr/include/ctype.h
+sv.o: /usr/include/dirent.h
+sv.o: /usr/include/errno.h
+sv.o: /usr/include/machine/param.h
+sv.o: /usr/include/machine/setjmp.h
+sv.o: /usr/include/netinet/in.h
+sv.o: /usr/include/setjmp.h
+sv.o: /usr/include/stdio.h
+sv.o: /usr/include/sys/dirent.h
+sv.o: /usr/include/sys/errno.h
+sv.o: /usr/include/sys/filio.h
+sv.o: /usr/include/sys/ioccom.h
+sv.o: /usr/include/sys/ioctl.h
+sv.o: /usr/include/sys/param.h
+sv.o: /usr/include/sys/signal.h
+sv.o: /usr/include/sys/sockio.h
+sv.o: /usr/include/sys/stat.h
+sv.o: /usr/include/sys/stdtypes.h
+sv.o: /usr/include/sys/sysmacros.h
+sv.o: /usr/include/sys/time.h
+sv.o: /usr/include/sys/times.h
+sv.o: /usr/include/sys/ttold.h
+sv.o: /usr/include/sys/ttychars.h
+sv.o: /usr/include/sys/ttycom.h
+sv.o: /usr/include/sys/ttydev.h
+sv.o: /usr/include/sys/types.h
+sv.o: /usr/include/time.h
+sv.o: /usr/include/varargs.h
+sv.o: /usr/include/vm/faultcode.h
 sv.o: EXTERN.h
 sv.o: av.h
 sv.o: config.h
 sv.o: cop.h
+sv.o: cv.h
 sv.o: embed.h
 sv.o: form.h
 sv.o: gv.h
 sv.o: handy.h
 sv.o: hv.h
+sv.o: mg.h
 sv.o: op.h
 sv.o: opcode.h
 sv.o: perl.h
@@ -1196,52 +1056,105 @@ sv.o: perly.h
 sv.o: pp.h
 sv.o: proto.h
 sv.o: regexp.h
+sv.o: scope.h
 sv.o: sv.c
 sv.o: sv.h
 sv.o: unixish.h
 sv.o: util.h
-toke.o: 
-toke.o: /usr/ucbinclude/ctype.h
-toke.o: /usr/ucbinclude/dirent.h
-toke.o: /usr/ucbinclude/errno.h
-toke.o: /usr/ucbinclude/machine/param.h
-toke.o: /usr/ucbinclude/machine/setjmp.h
-toke.o: /usr/ucbinclude/ndbm.h
-toke.o: /usr/ucbinclude/netinet/in.h
-toke.o: /usr/ucbinclude/setjmp.h
-toke.o: /usr/ucbinclude/stdio.h
-toke.o: /usr/ucbinclude/sys/dirent.h
-toke.o: /usr/ucbinclude/sys/errno.h
-toke.o: /usr/ucbinclude/sys/fcntlcom.h
-toke.o: /usr/ucbinclude/sys/file.h
-toke.o: /usr/ucbinclude/sys/filio.h
-toke.o: /usr/ucbinclude/sys/ioccom.h
-toke.o: /usr/ucbinclude/sys/ioctl.h
-toke.o: /usr/ucbinclude/sys/param.h
-toke.o: /usr/ucbinclude/sys/signal.h
-toke.o: /usr/ucbinclude/sys/sockio.h
-toke.o: /usr/ucbinclude/sys/stat.h
-toke.o: /usr/ucbinclude/sys/stdtypes.h
-toke.o: /usr/ucbinclude/sys/sysmacros.h
-toke.o: /usr/ucbinclude/sys/time.h
-toke.o: /usr/ucbinclude/sys/times.h
-toke.o: /usr/ucbinclude/sys/ttold.h
-toke.o: /usr/ucbinclude/sys/ttychars.h
-toke.o: /usr/ucbinclude/sys/ttycom.h
-toke.o: /usr/ucbinclude/sys/ttydev.h
-toke.o: /usr/ucbinclude/sys/types.h
-toke.o: /usr/ucbinclude/time.h
-toke.o: /usr/ucbinclude/vm/faultcode.h
+taint.o: /usr/include/ctype.h
+taint.o: /usr/include/dirent.h
+taint.o: /usr/include/errno.h
+taint.o: /usr/include/machine/param.h
+taint.o: /usr/include/machine/setjmp.h
+taint.o: /usr/include/netinet/in.h
+taint.o: /usr/include/setjmp.h
+taint.o: /usr/include/stdio.h
+taint.o: /usr/include/sys/dirent.h
+taint.o: /usr/include/sys/errno.h
+taint.o: /usr/include/sys/filio.h
+taint.o: /usr/include/sys/ioccom.h
+taint.o: /usr/include/sys/ioctl.h
+taint.o: /usr/include/sys/param.h
+taint.o: /usr/include/sys/signal.h
+taint.o: /usr/include/sys/sockio.h
+taint.o: /usr/include/sys/stat.h
+taint.o: /usr/include/sys/stdtypes.h
+taint.o: /usr/include/sys/sysmacros.h
+taint.o: /usr/include/sys/time.h
+taint.o: /usr/include/sys/times.h
+taint.o: /usr/include/sys/ttold.h
+taint.o: /usr/include/sys/ttychars.h
+taint.o: /usr/include/sys/ttycom.h
+taint.o: /usr/include/sys/ttydev.h
+taint.o: /usr/include/sys/types.h
+taint.o: /usr/include/time.h
+taint.o: /usr/include/varargs.h
+taint.o: /usr/include/vm/faultcode.h
+taint.o: EXTERN.h
+taint.o: av.h
+taint.o: config.h
+taint.o: cop.h
+taint.o: cv.h
+taint.o: embed.h
+taint.o: form.h
+taint.o: gv.h
+taint.o: handy.h
+taint.o: hv.h
+taint.o: mg.h
+taint.o: op.h
+taint.o: opcode.h
+taint.o: perl.h
+taint.o: pp.h
+taint.o: proto.h
+taint.o: regexp.h
+taint.o: scope.h
+taint.o: sv.h
+taint.o: taint.c
+taint.o: unixish.h
+taint.o: util.h
+toke.o: /usr/include/ctype.h
+toke.o: /usr/include/dirent.h
+toke.o: /usr/include/errno.h
+toke.o: /usr/include/machine/param.h
+toke.o: /usr/include/machine/setjmp.h
+toke.o: /usr/include/netinet/in.h
+toke.o: /usr/include/setjmp.h
+toke.o: /usr/include/stdio.h
+toke.o: /usr/include/sys/dirent.h
+toke.o: /usr/include/sys/errno.h
+toke.o: /usr/include/sys/fcntlcom.h
+toke.o: /usr/include/sys/file.h
+toke.o: /usr/include/sys/filio.h
+toke.o: /usr/include/sys/ioccom.h
+toke.o: /usr/include/sys/ioctl.h
+toke.o: /usr/include/sys/param.h
+toke.o: /usr/include/sys/signal.h
+toke.o: /usr/include/sys/sockio.h
+toke.o: /usr/include/sys/stat.h
+toke.o: /usr/include/sys/stdtypes.h
+toke.o: /usr/include/sys/sysmacros.h
+toke.o: /usr/include/sys/time.h
+toke.o: /usr/include/sys/times.h
+toke.o: /usr/include/sys/ttold.h
+toke.o: /usr/include/sys/ttychars.h
+toke.o: /usr/include/sys/ttycom.h
+toke.o: /usr/include/sys/ttydev.h
+toke.o: /usr/include/sys/types.h
+toke.o: /usr/include/time.h
+toke.o: /usr/include/varargs.h
+toke.o: /usr/include/vm/faultcode.h
 toke.o: EXTERN.h
 toke.o: av.h
 toke.o: config.h
 toke.o: cop.h
+toke.o: cv.h
 toke.o: embed.h
 toke.o: form.h
 toke.o: gv.h
 toke.o: handy.h
 toke.o: hv.h
 toke.o: keywords.h
+toke.o: mg.h
 toke.o: op.h
 toke.o: opcode.h
 toke.o: perl.h
@@ -1249,131 +1162,167 @@ toke.o: perly.h
 toke.o: pp.h
 toke.o: proto.h
 toke.o: regexp.h
+toke.o: scope.h
 toke.o: sv.h
 toke.o: toke.c
 toke.o: unixish.h
 toke.o: util.h
-util.o: 
-util.o: /usr/ucbinclude/ctype.h
-util.o: /usr/ucbinclude/dirent.h
-util.o: /usr/ucbinclude/errno.h
-util.o: /usr/ucbinclude/machine/param.h
-util.o: /usr/ucbinclude/machine/setjmp.h
-util.o: /usr/ucbinclude/ndbm.h
-util.o: /usr/ucbinclude/netinet/in.h
-util.o: /usr/ucbinclude/setjmp.h
-util.o: /usr/ucbinclude/stdio.h
-util.o: /usr/ucbinclude/sys/dirent.h
-util.o: /usr/ucbinclude/sys/errno.h
-util.o: /usr/ucbinclude/sys/fcntlcom.h
-util.o: /usr/ucbinclude/sys/file.h
-util.o: /usr/ucbinclude/sys/filio.h
-util.o: /usr/ucbinclude/sys/ioccom.h
-util.o: /usr/ucbinclude/sys/ioctl.h
-util.o: /usr/ucbinclude/sys/param.h
-util.o: /usr/ucbinclude/sys/signal.h
-util.o: /usr/ucbinclude/sys/sockio.h
-util.o: /usr/ucbinclude/sys/stat.h
-util.o: /usr/ucbinclude/sys/stdtypes.h
-util.o: /usr/ucbinclude/sys/sysmacros.h
-util.o: /usr/ucbinclude/sys/time.h
-util.o: /usr/ucbinclude/sys/times.h
-util.o: /usr/ucbinclude/sys/ttold.h
-util.o: /usr/ucbinclude/sys/ttychars.h
-util.o: /usr/ucbinclude/sys/ttycom.h
-util.o: /usr/ucbinclude/sys/ttydev.h
-util.o: /usr/ucbinclude/sys/types.h
-util.o: /usr/ucbinclude/time.h
-util.o: /usr/ucbinclude/varargs.h
-util.o: /usr/ucbinclude/vfork.h
-util.o: /usr/ucbinclude/vm/faultcode.h
+util.o: /usr/include/ctype.h
+util.o: /usr/include/dirent.h
+util.o: /usr/include/errno.h
+util.o: /usr/include/machine/param.h
+util.o: /usr/include/machine/setjmp.h
+util.o: /usr/include/netinet/in.h
+util.o: /usr/include/setjmp.h
+util.o: /usr/include/stdio.h
+util.o: /usr/include/sys/dirent.h
+util.o: /usr/include/sys/errno.h
+util.o: /usr/include/sys/fcntlcom.h
+util.o: /usr/include/sys/file.h
+util.o: /usr/include/sys/filio.h
+util.o: /usr/include/sys/ioccom.h
+util.o: /usr/include/sys/ioctl.h
+util.o: /usr/include/sys/param.h
+util.o: /usr/include/sys/signal.h
+util.o: /usr/include/sys/sockio.h
+util.o: /usr/include/sys/stat.h
+util.o: /usr/include/sys/stdtypes.h
+util.o: /usr/include/sys/sysmacros.h
+util.o: /usr/include/sys/time.h
+util.o: /usr/include/sys/times.h
+util.o: /usr/include/sys/ttold.h
+util.o: /usr/include/sys/ttychars.h
+util.o: /usr/include/sys/ttycom.h
+util.o: /usr/include/sys/ttydev.h
+util.o: /usr/include/sys/types.h
+util.o: /usr/include/time.h
+util.o: /usr/include/varargs.h
+util.o: /usr/include/vfork.h
+util.o: /usr/include/vm/faultcode.h
 util.o: EXTERN.h
 util.o: av.h
 util.o: config.h
 util.o: cop.h
+util.o: cv.h
 util.o: embed.h
 util.o: form.h
 util.o: gv.h
 util.o: handy.h
 util.o: hv.h
+util.o: mg.h
 util.o: op.h
 util.o: opcode.h
 util.o: perl.h
 util.o: pp.h
 util.o: proto.h
 util.o: regexp.h
+util.o: scope.h
 util.o: sv.h
 util.o: unixish.h
 util.o: util.c
 util.o: util.h
-usersub.o: 
-usersub.o: /usr/ucbinclude/ctype.h
-usersub.o: /usr/ucbinclude/dirent.h
-usersub.o: /usr/ucbinclude/errno.h
-usersub.o: /usr/ucbinclude/machine/param.h
-usersub.o: /usr/ucbinclude/machine/setjmp.h
-usersub.o: /usr/ucbinclude/ndbm.h
-usersub.o: /usr/ucbinclude/netinet/in.h
-usersub.o: /usr/ucbinclude/setjmp.h
-usersub.o: /usr/ucbinclude/stdio.h
-usersub.o: /usr/ucbinclude/sys/dirent.h
-usersub.o: /usr/ucbinclude/sys/errno.h
-usersub.o: /usr/ucbinclude/sys/filio.h
-usersub.o: /usr/ucbinclude/sys/ioccom.h
-usersub.o: /usr/ucbinclude/sys/ioctl.h
-usersub.o: /usr/ucbinclude/sys/param.h
-usersub.o: /usr/ucbinclude/sys/signal.h
-usersub.o: /usr/ucbinclude/sys/sockio.h
-usersub.o: /usr/ucbinclude/sys/stat.h
-usersub.o: /usr/ucbinclude/sys/stdtypes.h
-usersub.o: /usr/ucbinclude/sys/sysmacros.h
-usersub.o: /usr/ucbinclude/sys/time.h
-usersub.o: /usr/ucbinclude/sys/times.h
-usersub.o: /usr/ucbinclude/sys/ttold.h
-usersub.o: /usr/ucbinclude/sys/ttychars.h
-usersub.o: /usr/ucbinclude/sys/ttycom.h
-usersub.o: /usr/ucbinclude/sys/ttydev.h
-usersub.o: /usr/ucbinclude/sys/types.h
-usersub.o: /usr/ucbinclude/time.h
-usersub.o: /usr/ucbinclude/vm/faultcode.h
-usersub.o: EXTERN.h
-usersub.o: av.h
-usersub.o: config.h
-usersub.o: cop.h
-usersub.o: embed.h
-usersub.o: form.h
-usersub.o: gv.h
-usersub.o: handy.h
-usersub.o: hv.h
-usersub.o: op.h
-usersub.o: opcode.h
-usersub.o: perl.h
-usersub.o: pp.h
-usersub.o: proto.h
-usersub.o: regexp.h
-usersub.o: sv.h
-usersub.o: unixish.h
-usersub.o: usersub.c
-usersub.o: util.h
-mg.o: EXTERN.h
-mg.o: av.h
-mg.o: config.h
-mg.o: cop.h
-mg.o: embed.h
-mg.o: form.h
-mg.o: gv.h
-mg.o: handy.h
-mg.o: mg.c
-mg.o: hv.h
-mg.o: op.h
-mg.o: opcode.h
-mg.o: perl.h
-mg.o: pp.h
-mg.o: proto.h
-mg.o: regexp.h
-mg.o: sv.h
-mg.o: unixish.h
-mg.o: util.h
+deb.o: /usr/include/ctype.h
+deb.o: /usr/include/dirent.h
+deb.o: /usr/include/errno.h
+deb.o: /usr/include/machine/param.h
+deb.o: /usr/include/machine/setjmp.h
+deb.o: /usr/include/netinet/in.h
+deb.o: /usr/include/setjmp.h
+deb.o: /usr/include/stdio.h
+deb.o: /usr/include/sys/dirent.h
+deb.o: /usr/include/sys/errno.h
+deb.o: /usr/include/sys/filio.h
+deb.o: /usr/include/sys/ioccom.h
+deb.o: /usr/include/sys/ioctl.h
+deb.o: /usr/include/sys/param.h
+deb.o: /usr/include/sys/signal.h
+deb.o: /usr/include/sys/sockio.h
+deb.o: /usr/include/sys/stat.h
+deb.o: /usr/include/sys/stdtypes.h
+deb.o: /usr/include/sys/sysmacros.h
+deb.o: /usr/include/sys/time.h
+deb.o: /usr/include/sys/times.h
+deb.o: /usr/include/sys/ttold.h
+deb.o: /usr/include/sys/ttychars.h
+deb.o: /usr/include/sys/ttycom.h
+deb.o: /usr/include/sys/ttydev.h
+deb.o: /usr/include/sys/types.h
+deb.o: /usr/include/time.h
+deb.o: /usr/include/varargs.h
+deb.o: /usr/include/vm/faultcode.h
+deb.o: EXTERN.h
+deb.o: av.h
+deb.o: config.h
+deb.o: cop.h
+deb.o: cv.h
+deb.o: deb.c
+deb.o: embed.h
+deb.o: form.h
+deb.o: gv.h
+deb.o: handy.h
+deb.o: hv.h
+deb.o: mg.h
+deb.o: op.h
+deb.o: opcode.h
+deb.o: perl.h
+deb.o: pp.h
+deb.o: proto.h
+deb.o: regexp.h
+deb.o: scope.h
+deb.o: sv.h
+deb.o: unixish.h
+deb.o: util.h
+run.o: /usr/include/ctype.h
+run.o: /usr/include/dirent.h
+run.o: /usr/include/errno.h
+run.o: /usr/include/machine/param.h
+run.o: /usr/include/machine/setjmp.h
+run.o: /usr/include/netinet/in.h
+run.o: /usr/include/setjmp.h
+run.o: /usr/include/stdio.h
+run.o: /usr/include/sys/dirent.h
+run.o: /usr/include/sys/errno.h
+run.o: /usr/include/sys/filio.h
+run.o: /usr/include/sys/ioccom.h
+run.o: /usr/include/sys/ioctl.h
+run.o: /usr/include/sys/param.h
+run.o: /usr/include/sys/signal.h
+run.o: /usr/include/sys/sockio.h
+run.o: /usr/include/sys/stat.h
+run.o: /usr/include/sys/stdtypes.h
+run.o: /usr/include/sys/sysmacros.h
+run.o: /usr/include/sys/time.h
+run.o: /usr/include/sys/times.h
+run.o: /usr/include/sys/ttold.h
+run.o: /usr/include/sys/ttychars.h
+run.o: /usr/include/sys/ttycom.h
+run.o: /usr/include/sys/ttydev.h
+run.o: /usr/include/sys/types.h
+run.o: /usr/include/time.h
+run.o: /usr/include/varargs.h
+run.o: /usr/include/vm/faultcode.h
+run.o: EXTERN.h
+run.o: av.h
+run.o: config.h
+run.o: cop.h
+run.o: cv.h
+run.o: embed.h
+run.o: form.h
+run.o: gv.h
+run.o: handy.h
+run.o: hv.h
+run.o: mg.h
+run.o: op.h
+run.o: opcode.h
+run.o: perl.h
+run.o: pp.h
+run.o: proto.h
+run.o: regexp.h
+run.o: run.c
+run.o: scope.h
+run.o: sv.h
+run.o: unixish.h
+run.o: util.h
 Makefile: Makefile.SH config.sh ; /bin/sh Makefile.SH
 makedepend: makedepend.SH config.sh ; /bin/sh makedepend.SH
 h2ph: h2ph.SH config.sh ; /bin/sh h2ph.SH
index 41a5d78..c99e358 100644 (file)
--- a/malloc.c
+++ b/malloc.c
@@ -121,7 +121,7 @@ botch(s)
 #define        ASSERT(p)
 #endif
 
-MALLOCPTRTYPE *
+Malloc_t
 malloc(nbytes)
        register MEM_SIZE nbytes;
 {
@@ -208,7 +208,7 @@ malloc(nbytes)
        p->ov_rmagic = RMAGIC;
        *((u_int *)((caddr_t)p + nbytes - RSLOP)) = RMAGIC;
 #endif
-       return ((MALLOCPTRTYPE *)(p + 1));
+       return ((Malloc_t)(p + 1));
 }
 
 /*
@@ -281,7 +281,7 @@ morecore(bucket)
 
 void
 free(mp)
-       MALLOCPTRTYPE *mp;
+       Malloc_t mp;
 {   
        register MEM_SIZE size;
        register union overhead *op;
@@ -339,9 +339,9 @@ free(mp)
  */
 int reall_srchlen = 4; /* 4 should be plenty, -1 =>'s whole list */
 
-MALLOCPTRTYPE *
+Malloc_t
 realloc(mp, nbytes)
-       MALLOCPTRTYPE *mp; 
+       Malloc_t mp; 
        MEM_SIZE nbytes;
 {   
        register MEM_SIZE onb;
@@ -438,7 +438,7 @@ realloc(mp, nbytes)
 #  endif
 #endif
 #endif /* safemalloc */
-       return ((MALLOCPTRTYPE*)res);
+       return ((Malloc_t)res);
 }
 
 /*
diff --git a/mg.c b/mg.c
index f70a41b..a78d4da 100644 (file)
--- a/mg.c
+++ b/mg.c
@@ -188,14 +188,6 @@ SV* sv;
 #include <signal.h>
 #endif
 
-#ifdef VOIDSIG
-#define handlertype void
-#else
-#define handlertype int
-#endif
-
-static handlertype sighandler();
-
 U32
 magic_len(sv, mg)
 SV *sv;
@@ -405,7 +397,7 @@ MAGIC *mg;
        break;
     case '!':
        sv_setnv(sv,(double)errno);
-       sv_setpv(sv, errno ? strerror(errno) : "");
+       sv_setpv(sv, errno ? Strerror(errno) : "");
        SvNOK_on(sv);   /* what a wonderful hack! */
        break;
     case '<':
@@ -506,8 +498,8 @@ MAGIC* mg;
        (void)signal(i,SIG_DFL);
     else {
        (void)signal(i,sighandler);
-       if (!strchr(s,'\'')) {
-           sprintf(tokenbuf, "main'%s",s);
+       if (!strchr(s,':') && !strchr(s,'\'')) {
+           sprintf(tokenbuf, "main::%s",s);
            sv_setpv(sv,tokenbuf);
        }
     }
@@ -896,6 +888,8 @@ MAGIC* mg;
     case '.':
        if (localizing)
            save_sptr((SV**)&last_in_gv);
+       else if (SvOK(sv))
+           IoLINES(GvIO(last_in_gv)) = (long)SvIV(sv);
        break;
     case '^':
        Safefree(IoTOP_NAME(GvIO(defoutgv)));
@@ -1117,7 +1111,7 @@ char *sig;
     return 0;
 }
 
-static handlertype
+VOIDRET
 sighandler(sig)
 I32 sig;
 {
diff --git a/miniperlmain.c b/miniperlmain.c
new file mode 100644 (file)
index 0000000..e0b75ff
--- /dev/null
@@ -0,0 +1,39 @@
+#include "INTERN.h"
+#include "perl.h"
+
+main(argc, argv, env)
+int argc;
+char **argv;
+char **env;
+{
+    int exitstatus;
+    PerlInterpreter *my_perl;
+
+    my_perl = perl_alloc();
+    if (!my_perl)
+       exit(1);
+    perl_construct( my_perl );
+
+    exitstatus = perl_parse( my_perl, argc, argv, env );
+    if (exitstatus)
+       exit( exitstatus );
+
+    exitstatus = perl_run( my_perl );
+
+    perl_destruct( my_perl );
+    perl_free( my_perl );
+
+    exit( exitstatus );
+}
+
+/* Register any extra external extensions */
+
+void
+perl_init_ext()
+{
+    char *file = __FILE__;
+
+#ifdef USE_DYNAMIC_LOADING
+    boot_DynamicLoader();
+#endif
+}
diff --git a/op.c b/op.c
index 7c021cb..86a870e 100644 (file)
--- a/op.c
+++ b/op.c
@@ -508,7 +508,6 @@ OP *op;
     case OP_HSLICE:
     case OP_UNPACK:
     case OP_PACK:
-    case OP_SPLIT:
     case OP_JOIN:
     case OP_LSLICE:
     case OP_ANONLIST:
@@ -3137,7 +3136,7 @@ OP *op;
 {
     if (op->op_flags & OPf_KIDS) {
        OP *kid = cLISTOP->op_first->op_sibling;        /* get past pushmark */
-       if (kid->op_sibling) {
+       if (kid && kid->op_sibling) {
            op->op_type = OP_SSELECT;
            op->op_ppaddr = ppaddr[OP_SSELECT];
            op = ck_fun(op);
diff --git a/perl.c b/perl.c
index 337e190..0293282 100644 (file)
--- a/perl.c
+++ b/perl.c
@@ -100,6 +100,8 @@ void
 perl_construct( sv_interp )
 register PerlInterpreter *sv_interp;
 {
+    char* s;
+
     if (!(curinterp = sv_interp))
        return;
 
@@ -158,9 +160,10 @@ register PerlInterpreter *sv_interp;
     gid = (int)getgid();
     egid = (int)getegid();
     tainting = (euid != uid || egid != gid);
-    sprintf(patchlevel,"%3.3s%2.2d", strchr(rcsid,'5'), PATCHLEVEL);
-
-    (void)sprintf(strchr(rcsid,'#'), "%d\n", PATCHLEVEL);
+    if (s = strchr(rcsid,'#')) {
+       (void)sprintf(s, "%d\n", PATCHLEVEL);
+       sprintf(patchlevel,"%3.3s%2.2d", strchr(rcsid,'5'), PATCHLEVEL);
+    }
 
     fdpid = newAV();   /* for remembering popen pids by fd */
     pidstatus = newHV();/* for remembering status of dead pids */
@@ -200,6 +203,7 @@ register PerlInterpreter *sv_interp;
      * ones.  If so, the code below will clean up, but any destructors
      * may fail to find what they're looking for.
      */
+    dirty = TRUE;
     if (sv_count != 0)
        sv_clean_refs();
 
@@ -223,10 +227,6 @@ register PerlInterpreter *sv_interp;
 #endif
 
     /* Now absolutely destruct everything, somehow or other, loops or no. */
-#ifdef APPARENTLY_UNNECESSARY
-    if (sv_count != 0)
-       sv_clean_magic();
-#endif
     last_sv_count = 0;
     while (sv_count != 0 && sv_count != last_sv_count) {
        last_sv_count = sv_count;
@@ -319,6 +319,7 @@ setuid perl scripts securely.\n");
       reswitch:
        switch (*s) {
        case '0':
+       case 'F':
        case 'a':
        case 'c':
        case 'd':
@@ -399,7 +400,7 @@ setuid perl scripts securely.\n");
     scriptname = argv[0];
     if (e_fp) {
        if (fflush(e_fp) || ferror(e_fp) || fclose(e_fp))
-           croak("Can't write to temp file for -e: %s", strerror(errno));
+           croak("Can't write to temp file for -e: %s", Strerror(errno));
        argc++,argv--;
        scriptname = e_tmpname;
     }
@@ -677,6 +678,11 @@ char *s;
            nrschar = '\n';
        }
        return s + numlen;
+    case 'F':
+       minus_F = TRUE;
+       splitstr = savestr(s + 1);
+       s += strlen(s);
+       return s;
     case 'a':
        minus_a = TRUE;
        s++;
@@ -767,7 +773,7 @@ char *s;
        s++;
        return s;
     case 'v':
-       fputs("\nThis is perl, version 5.0, Alpha 6 (unsupported)\n\n",stdout);
+       fputs("\nThis is perl, version 5.0, Alpha 8 (unsupported)\n\n",stdout);
        fputs(rcsid,stdout);
        fputs("\nCopyright (c) 1989, 1990, 1991, 1992, 1993, 1994 Larry Wall\n",stdout);
 #ifdef MSDOS
@@ -989,7 +995,7 @@ sed %s -e \"/^[^#]/b\" \
 #endif
 #endif
        croak("Can't open perl script \"%s\": %s\n",
-         SvPVX(GvSV(curcop->cop_filegv)), strerror(errno));
+         SvPVX(GvSV(curcop->cop_filegv)), Strerror(errno));
     }
 }
 
diff --git a/perl.h b/perl.h
index 81f724c..75e66ad 100644 (file)
--- a/perl.h
+++ b/perl.h
@@ -209,10 +209,10 @@ char Error[1];
 #endif /* HAS_BCMP */
 
 #ifndef HAS_MEMMOVE
-#   if defined(HAS_BCOPY) && defined(SAFE_BCOPY)
+#   if defined(HAS_BCOPY) && defined(HAS_SAFE_BCOPY)
 #      define memmove(d,s,l) bcopy(s,d,l)
 #   else
-#      if defined(HAS_MEMCPY) && defined(SAFE_MEMCPY)
+#      if defined(HAS_MEMCPY) && defined(HAS_SAFE_MEMCPY)
 #          define memmove(d,s,l) memcpy(d,s,l)
 #      else
 #          define memmove(d,s,l) my_bcopy(s,d,l)
@@ -284,18 +284,23 @@ char Error[1];
 #   endif
 #endif
 
-#ifndef strerror
-#   ifdef HAS_STRERROR
+#ifdef HAS_STRERROR
        char *strerror P((int));
-#   else
+#       ifndef Strerror
+#           define Strerror strerror
+#       endif
+#else
+#    ifdef HAS_SYS_ERRLIST
        extern int sys_nerr;
        extern char *sys_errlist[];
-#       define strerror(e) \
+#       ifndef Strerror
+#           define Strerror(e) \
                ((e) < 0 || (e) >= sys_nerr ? "(unknown)" : sys_errlist[e])
+#       endif
 #   endif
 #endif
 
-#ifdef I_SYSIOCTL
+#ifdef I_SYS_IOCTL
 #   ifndef _IOCTL_
 #      include <sys/ioctl.h>
 #   endif
@@ -305,8 +310,8 @@ char Error[1];
 #   ifdef HAS_SOCKETPAIR
 #      undef HAS_SOCKETPAIR
 #   endif
-#   ifdef HAS_NDBM
-#      undef HAS_NDBM
+#   ifdef I_NDBM
+#      undef I_NDBM
 #   endif
 #endif
 
@@ -746,7 +751,7 @@ char *strcpy(), *strcat();
            double exp P((double));
            double log P((double));
            double sqrt P((double));
-           double modf P((double,int*));
+           double modf P((double,double*));
            double sin P((double));
            double cos P((double));
            double atan2 P((double,double));
@@ -759,7 +764,7 @@ char *strcpy(), *strcat();
 
 char *crypt P((const char*, const char*));
 char *getenv P((const char*));
-long lseek P((int,int,int));
+long lseek P((int,off_t,int));
 char *getlogin P((void));
 
 #ifdef EUNICE
@@ -1108,11 +1113,13 @@ IEXT char       Ipatchlevel[6];
 IEXT char *    Inrs IINIT("\n");
 IEXT U32       Inrschar IINIT('\n');   /* final char of rs, or 0777 if none */
 IEXT I32       Inrslen IINIT(1);
+IEXT char *    Isplitstr IINIT(" ");
 IEXT bool      Ipreprocess;
 IEXT bool      Iminus_n;
 IEXT bool      Iminus_p;
 IEXT bool      Iminus_l;
 IEXT bool      Iminus_a;
+IEXT bool      Iminus_F;
 IEXT bool      Idoswitches;
 IEXT bool      Idowarn;
 IEXT bool      Idoextract;
@@ -1212,7 +1219,7 @@ IEXT HV * Ipidstatus;     /* keep pid-to-status mappings for waitpid */
 IEXT VOL int   Iin_eval;       /* trap "fatal" errors? */
 IEXT OP *      Irestartop;     /* Are we propagating an error from croak? */
 IEXT int       Idelaymagic;    /* ($<,$>) = ... */
-IEXT bool      Idirty;         /* clean before rerunning */
+IEXT bool      Idirty;         /* In the middle of tearing things down? */
 IEXT bool      Ilocalizing;    /* are we processing a local() list? */
 IEXT bool      Itainted;       /* using variables controlled by $< */
 IEXT bool      Itainting;      /* doing taint checks */
@@ -1287,6 +1294,14 @@ struct interpreter {
 extern "C" {
 #endif
 
+#ifdef STANDARD_C
+#  include <stdarg.h>
+#else
+#  ifdef I_VARARGS
+#    include <varargs.h>
+#  endif
+#endif
+
 #include "proto.h"
 
 #ifdef __cplusplus
index 6f3c7db..0cef761 100644 (file)
--- a/perl.man
+++ b/perl.man
@@ -6080,7 +6080,7 @@ very small files.  To do larger files, use
 .nf
 
        undef $/;
-       $checksum = unpack("%32C*",<>) % 32767;
+       $checksum = unpack("%32C*",<>) % 65535;
 
 .fi
 .PP
diff --git a/perlmain.c b/perlmain.c
new file mode 100644 (file)
index 0000000..75a3d6f
--- /dev/null
@@ -0,0 +1,42 @@
+#include "INTERN.h"
+#include "perl.h"
+
+main(argc, argv, env)
+int argc;
+char **argv;
+char **env;
+{
+    int exitstatus;
+    PerlInterpreter *my_perl;
+
+    my_perl = perl_alloc();
+    if (!my_perl)
+       exit(1);
+    perl_construct( my_perl );
+
+    exitstatus = perl_parse( my_perl, argc, argv, env );
+    if (exitstatus)
+       exit( exitstatus );
+
+    exitstatus = perl_run( my_perl );
+
+    perl_destruct( my_perl );
+    perl_free( my_perl );
+
+    exit( exitstatus );
+}
+
+/* Register any extra external extensions */
+
+void
+perl_init_ext()
+{
+    char *file = __FILE__;
+
+#ifdef USE_DYNAMIC_LOADING
+    boot_DynamicLoader();
+#endif
+    newXSUB("POSIX::bootstrap", 0, boot_POSIX, file);
+    newXSUB("NDBM_File::bootstrap", 0, boot_NDBM_File, file);
+    newXSUB("ODBM_File::bootstrap", 0, boot_ODBM_File, file);
+}
diff --git a/perlmain.x b/perlmain.x
new file mode 100644 (file)
index 0000000..9839490
--- /dev/null
@@ -0,0 +1,3 @@
+POSIX
+NDBM_File
+ODBM_File
diff --git a/perly.y.save b/perly.y.save
new file mode 100644 (file)
index 0000000..8babbb9
--- /dev/null
@@ -0,0 +1,591 @@
+/* $RCSfile: perly.y,v $$Revision: 4.1 $$Date: 92/08/07 18:26:16 $
+ *
+ *    Copyright (c) 1991, Larry Wall
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
+ *
+ * $Log:       perly.y,v $
+ * Revision 4.1  92/08/07  18:26:16  lwall
+ * 
+ * Revision 4.0.1.5  92/06/11  21:12:50  lwall
+ * patch34: expectterm incorrectly set to indicate start of program or block
+ * 
+ * Revision 4.0.1.4  92/06/08  17:33:25  lwall
+ * patch20: one of the backdoors to expectterm was on the wrong reduction
+ * 
+ * Revision 4.0.1.3  92/06/08  15:18:16  lwall
+ * patch20: an expression may now start with a bareword
+ * patch20: relaxed requirement for semicolon at the end of a block
+ * patch20: added ... as variant on ..
+ * patch20: fixed double debug break in foreach with implicit array assignment
+ * patch20: if {block} {block} didn't work any more
+ * patch20: deleted some minor memory leaks
+ * 
+ * Revision 4.0.1.2  91/11/05  18:17:38  lwall
+ * patch11: extra comma at end of list is now allowed in more places (Hi, Felix!)
+ * patch11: once-thru blocks didn't display right in the debugger
+ * patch11: debugger got confused over nested subroutine definitions
+ * 
+ * Revision 4.0.1.1  91/06/07  11:42:34  lwall
+ * patch4: new copyright notice
+ * 
+ * Revision 4.0  91/03/20  01:38:40  lwall
+ * 4.0 baseline.
+ * 
+ */
+
+%{
+#include "EXTERN.h"
+#include "perl.h"
+
+/*SUPPRESS 530*/
+/*SUPPRESS 593*/
+/*SUPPRESS 595*/
+
+%}
+
+%start prog
+
+%union {
+    int        ival;
+    char *cval;
+    OP *opval;
+    COP *copval;
+    struct compcmd compval;
+    GV *stabval;
+    FF *formval;
+}
+
+%token <ival> '{' ')'
+
+%token <opval> WORD
+%token <cval> LABEL
+%token <ival> APPEND OPEN SSELECT LOOPEX DOTDOT DOLSHARP
+%token <ival> USING FORMAT DO SHIFT PUSH POP LVALFUN
+%token <ival> WHILE UNTIL IF UNLESS ELSE ELSIF CONTINUE SPLIT FLIST
+%token <ival> FOR FILOP FILOP2 FILOP3 FILOP4 FILOP22 FILOP25
+%token <ival> FUNC0 FUNC1 FUNC2 FUNC2x FUNC3 FUNC4 FUNC5 HSHFUN HSHFUN3
+%token <ival> FLIST2 SUB LOCAL DELETE FUNC
+%token <ival> RELOP EQOP MULOP ADDOP PACKAGE
+%token <formval> FORMLIST
+%token <opval> THING STRING
+
+%type <ival> prog decl format remember crp
+%type <copval> block lineseq line loop cond sideff nexpr else
+%type <opval> expr sexpr term scalar ary hsh arylen star amper
+%type <opval> listexpr indirob
+%type <opval> texpr listop
+%type <cval> label
+%type <compval> compblock
+
+%nonassoc <ival> LSTOP
+%left ','
+%right '='
+%right '?' ':'
+%nonassoc DOTDOT
+%left OROR
+%left ANDAND
+%left <ival> BITOROP
+%left <ival> BITANDOP
+%nonassoc EQOP
+%nonassoc RELOP
+%nonassoc <ival> UNIOP
+%left <ival> SHIFTOP
+%left ADDOP
+%left MULOP
+%left <ival> MATCHOP
+%right '!' '~' UMINUS
+%right <ival> POWOP
+%nonassoc INC DEC
+%left '('
+
+%% /* RULES */
+
+prog   :       /* NULL */
+               {
+#if defined(YYDEBUG) && defined(DEBUGGING)
+                   yydebug = (debug & 1);
+#endif
+                   expectterm = 2;
+               }
+       /*CONTINUED*/   lineseq
+                       { if (in_eval)
+                               eval_root = block_head($2);
+                           else
+                               main_root = block_head($2); }
+       ;
+
+compblock:     block CONTINUE block
+                       { $$.comp_true = $1; $$.comp_alt = $3; }
+       |       block else
+                       { $$.comp_true = $1; $$.comp_alt = $2; }
+       ;
+
+else   :       /* NULL */
+                       { $$ = Nullcop; }
+       |       ELSE block
+                       { $$ = $2; }
+       |       ELSIF '(' expr ')' compblock
+                       { cmdline = $1;
+                           $$ = newCCOP(OP_ELSIF,1,$3,$5); }
+       ;
+
+block  :       '{' remember lineseq '}'
+                       { $$ = block_head($3);
+                         if (cmdline > (line_t)$1)
+                             cmdline = $1;
+                         if (savestack->av_fill > $2)
+                           leave_scope($2);
+                         expectterm = 2; }
+       ;
+
+remember:      /* NULL */      /* in case they push a package name */
+                       { $$ = savestack->av_fill; }
+       ;
+
+lineseq        :       /* NULL */
+                       { $$ = Nullcop; }
+       |       lineseq line
+                       { $$ = append_elem(OP_LINESEQ,$1,$2); }
+       ;
+
+line   :       decl
+                       { $$ = Nullcop; }
+       |       label cond
+                       { $$ = add_label($1,$2); }
+       |       loop    /* loops add their own labels */
+       |       label ';'
+                       { if ($1 != Nullch) {
+                             $$ = add_label($1, newACOP(Nullgv, Nullop) );
+                           }
+                           else {
+                             $$ = Nullcop;
+                             cmdline = NOLINE;
+                           }
+                           expectterm = 2; }
+       |       label sideff ';'
+                       { $$ = add_label($1,$2);
+                         expectterm = 2; }
+       ;
+
+sideff :       error
+                       { $$ = Nullcop; }
+       |       expr
+                       { $$ = newACOP(Nullgv, $1); }
+       |       expr IF expr
+                       { $$ = addcond(
+                              newACOP(Nullgv, Nullop, $1), $3); }
+       |       expr UNLESS expr
+                       { $$ = addcond(invert(
+                              newACOP(Nullgv, Nullop, $1)), $3); }
+       |       expr WHILE expr
+                       { $$ = addloop(
+                              newACOP(Nullgv, Nullop, $1), $3); }
+       |       expr UNTIL expr
+                       { $$ = addloop(invert(
+                              newACOP(Nullgv, Nullop, $1)), $3); }
+       ;
+
+cond   :       IF '(' expr ')' compblock
+                       { cmdline = $1;
+                           $$ = newICOP(OP_IF,$3,$5); }
+       |       UNLESS '(' expr ')' compblock
+                       { cmdline = $1;
+                           $$ = invert(newICOP(OP_IF,$3,$5)); }
+       |       IF block compblock
+                       { cmdline = $1;
+                           $$ = newICOP(OP_IF,$2,$3); }
+       |       UNLESS block compblock
+                       { cmdline = $1;
+                           $$ = invert(newICOP(OP_IF,$2,$3)); }
+       ;
+
+loop   :       label WHILE '(' texpr ')' compblock
+                       { cmdline = $2;
+                           $$ = wopt(add_label($1,
+                           newCCOP(OP_WHILE,1,$4,$6) )); }
+       |       label UNTIL '(' expr ')' compblock
+                       { cmdline = $2;
+                           $$ = wopt(add_label($1,
+                           invert(newCCOP(OP_WHILE,1,$4,$6)) )); }
+       |       label WHILE block compblock
+                       { cmdline = $2;
+                           $$ = wopt(add_label($1,
+                           newCCOP(OP_WHILE, 1, $3,$4) )); }
+       |       label UNTIL block compblock
+                       { cmdline = $2;
+                           $$ = wopt(add_label($1,
+                           invert(newCCOP(OP_WHILE,1,$3,$4)) )); }
+       |       label FOR scalar '(' expr crp compblock
+                       { cmdline = $2;
+                           /*
+                            * The following gobbledygook catches EXPRs that
+                            * aren't explicit array refs and translates
+                            *          foreach VAR (EXPR) {
+                            * into
+                            *          @ary = EXPR;
+                            *          foreach VAR (@ary) {
+                            * where @ary is a hidden array made by newGVgen().
+                            * (Note that @ary may become a local array if
+                            * it is determined that it might be called
+                            * recursively.  See cmd_tosave().)
+                            */
+                           if ($5->op_type != OP_ARRAY) {
+                               scrstab = gv_AVadd(newGVgen());
+                               $$ = append_elem(OP_LINESEQ,
+                                   newACOP(Nullgv,
+                                     newBINOP(OP_ASSIGN,
+                                       listref(newUNOP(OP_ARRAY,
+                                         gv_to_op(A_STAB,scrstab))),
+                                       forcelist($5))),
+                                   wopt(over($3,add_label($1,
+                                     newCCOP(OP_WHILE, 0,
+                                       newUNOP(OP_ARRAY,
+                                         gv_to_op(A_STAB,scrstab)),
+                                       $7)))));
+                               $$->cop_line = $2;
+                               $$->cop_head->cop_line = $2;
+                           }
+                           else {
+                               $$ = wopt(over($3,add_label($1,
+                               newCCOP(OP_WHILE,1,$5,$7) )));
+                           }
+                       }
+       |       label FOR '(' expr crp compblock
+                       { cmdline = $2;
+                           if ($4->op_type != OP_ARRAY) {
+                               scrstab = gv_AVadd(newGVgen());
+                               $$ = append_elem(OP_LINESEQ,
+                                   newACOP(Nullgv,
+                                     newBINOP(OP_ASSIGN,
+                                       listref(newUNOP(OP_ARRAY,
+                                         gv_to_op(A_STAB,scrstab))),
+                                       forcelist($4))),
+                                   wopt(over(defstab,add_label($1,
+                                     newCCOP(OP_WHILE, 0,
+                                       newUNOP(OP_ARRAY,
+                                         gv_to_op(A_STAB,scrstab)),
+                                       $6)))));
+                               $$->cop_line = $2;
+                               $$->cop_head->cop_line = $2;
+                           }
+                           else {      /* lisp, anyone? */
+                               $$ = wopt(over(defstab,add_label($1,
+                               newCCOP(OP_WHILE,1,$4,$6) )));
+                           }
+                       }
+       |       label FOR '(' nexpr ';' texpr ';' nexpr ')' block
+                       /* basically fake up an initialize-while lineseq */
+                       {   yyval.compval.comp_true = $10;
+                           yyval.compval.comp_alt = $8;
+                           cmdline = $2;
+                           $$ = append_elem(OP_LINESEQ,$4,wopt(add_label($1,
+                               newCCOP(OP_WHILE,1,$6,yyval.compval) ))); }
+       |       label compblock /* a block is a loop that happens once */
+                       { $$ = add_label($1,newCCOP(OP_BLOCK,1,Nullop,$2)); }
+       ;
+
+nexpr  :       /* NULL */
+                       { $$ = Nullcop; }
+       |       sideff
+       ;
+
+texpr  :       /* NULL means true */
+                       { (void)scan_num("1"); $$ = yylval.op; }
+       |       expr
+       ;
+
+label  :       /* empty */
+                       { $$ = Nullch; }
+       |       LABEL
+       ;
+
+decl   :       format
+                       { $$ = 0; }
+       |       subrout
+                       { $$ = 0; }
+       |       package
+                       { $$ = 0; }
+       ;
+
+format :       FORMAT WORD '=' FORMLIST
+                       { if (strEQ($2,"stdout"))
+                           newFORM(newGV("STDOUT",TRUE),$4);
+                         else if (strEQ($2,"stderr"))
+                           newFORM(newGV("STDERR",TRUE),$4);
+                         else
+                           newFORM(newGV($2,TRUE),$4);
+                         Safefree($2); $2 = Nullch; }
+       |       FORMAT '=' FORMLIST
+                       { newFORM(newGV("STDOUT",TRUE),$3); }
+       ;
+
+subrout        :       SUB WORD block
+                       { newSUB($2,$3);
+                         cmdline = NOLINE;
+                         if (savestack->av_fill > $1)
+                           leave_scope($1); }
+       ;
+
+package :      PACKAGE WORD ';'
+                       { char tmpbuf[256];
+                         GV *tmpstab;
+
+                         save_hptr(&curstash);
+                         save_item(curstname);
+                         sv_setpv(curstname,$2);
+                         sprintf(tmpbuf,"'_%s",$2);
+                         tmpstab = newGV(tmpbuf,TRUE);
+                         if (!GvHV(tmpstab))
+                             GvHV(tmpstab) = newHV(0);
+                         curstash = GvHV(tmpstab);
+                         if (!curstash->hv_name)
+                             curstash->hv_name = savestr($2);
+                         curstash->hv_coeffsize = 0;
+                         Safefree($2); $2 = Nullch;
+                         cmdline = NOLINE;
+                         expectterm = 2;
+                       }
+       ;
+
+expr   :       expr ',' sexpr
+                       { $$ = append_elem(OP_LIST, $1, $3); }
+       |       sexpr
+       ;
+
+sexpr  :       sexpr '=' sexpr
+                       { $$ = newBINOP(OP_ASSIGN, ref($1), $3); }
+       |       sexpr POWOP '=' sexpr
+                       { $$ = newBINOP($2, ref($1), $4); }
+       |       sexpr MULOP '=' sexpr
+                       { $$ = newBINOP($2, ref($1), $4); }
+       |       sexpr ADDOP '=' sexpr
+                       { $$ = newBINOP($2, ref($1), $4);}
+       |       sexpr SHIFTOP '=' sexpr
+                       { $$ = newBINOP($2, ref($1), $4); }
+       |       sexpr BITANDOP '=' sexpr
+                       { $$ = newBINOP($2, ref($1), $4); }
+       |       sexpr BITOROP '=' sexpr
+                       { $$ = newBINOP($2, ref($1), $4); }
+
+
+       |       sexpr POWOP sexpr
+                       { $$ = newBINOP($2, $1, $3); }
+       |       sexpr MULOP sexpr
+                       { if ($2 == OP_REPEAT)
+                             $1 = forcelist($1);
+                           $$ = newBINOP($2, $1, $3);
+                           if ($2 == OP_REPEAT) {
+                               if ($$[1].op_type != A_EXPR ||
+                                 $$[1].op_ptr.op_op->op_type != OP_LIST)
+                                   $$[1].op_flags &= ~AF_ARYOK;
+                           } }
+       |       sexpr ADDOP sexpr
+                       { $$ = newBINOP($2, $1, $3); }
+       |       sexpr SHIFTOP sexpr
+                       { $$ = newBINOP($2, $1, $3); }
+       |       sexpr RELOP sexpr
+                       { $$ = newBINOP($2, $1, $3); }
+       |       sexpr EQOP sexpr
+                       { $$ = newBINOP($2, $1, $3); }
+       |       sexpr BITANDOP sexpr
+                       { $$ = newBINOP($2, $1, $3); }
+       |       sexpr BITOROP sexpr
+                       { $$ = newBINOP($2, $1, $3); }
+       |       sexpr DOTDOT sexpr
+                       { $$ = newBINOP($2, $1, $3); }
+       |       sexpr ANDAND sexpr
+                       { $$ = newBINOP(OP_AND, $1, $3); }
+       |       sexpr OROR sexpr
+                       { $$ = newBINOP(OP_OR, $1, $3); }
+       |       sexpr '?' sexpr ':' sexpr
+                       { $$ = newCONDOP(OP_COND_EXPR, $1, $3, $5); }
+       |       sexpr MATCHOP sexpr
+                       { $$ = bind_match($2, $1, $3); }
+       |       term
+                       { $$ = $1; }
+       ;
+
+term   :       '-' term %prec UMINUS
+                       { $$ = newUNOP(OP_NEGATE, $2); }
+       |       '+' term %prec UMINUS
+                       { $$ = $2; }
+       |       '!' term
+                       { $$ = newUNOP(OP_NOT, $2); }
+       |       '~' term
+                       { $$ = newUNOP(OP_COMPLEMENT, $2);}
+       |       term INC
+                       { $$ = newUNOP(OP_POSTINC,ref($1)); }
+       |       term DEC
+                       { $$ = newUNOP(OP_POSTDEC,ref($1)); }
+       |       INC term
+                       { $$ = newUNOP(OP_PREINC,ref($2)); }
+       |       DEC term
+                       { $$ = newUNOP(OP_PREDEC,ref($2)); }
+       |       LOCAL '(' expr crp
+                       { $$ = localize(forcelist($3)); }
+       |       '(' expr crp
+                       { $$ = $2; }
+       |       '(' ')'
+                       { $$ = Nullop; }        /* XXX may be insufficient */
+       |       scalar  %prec '('
+                       { $$ = gv_to_op(A_STAB,$1); }
+       |       star    %prec '('
+                       { $$ = gv_to_op(A_STAR,$1); }
+       |       scalar '[' expr ']'     %prec '('
+                       { $$ = newBINOP(OP_AELEM,
+                               gv_to_op(A_STAB,gv_AVadd($1)), $3); }
+       |       hsh     %prec '('
+                       { $$ = newUNOP(OP_HASH, gv_to_op(A_STAB,$1)); }
+       |       ary     %prec '('
+                       { $$ = newUNOP(OP_ARRAY, gv_to_op(A_STAB,$1)); }
+       |       arylen  %prec '('
+                       { $$ = newUNOP(OP_ARYLEN, gv_to_op(A_STAB,$1)); }
+       |       scalar '{' expr ';' '}' %prec '('
+                       { $$ = newBINOP(OP_HELEM,
+                               gv_to_op(A_STAB,gv_HVadd($1)),
+                               jmaybe($3));
+                           expectterm = FALSE; }
+       |       '(' expr crp '[' expr ']'       %prec '('
+                       { $$ = newSLICEOP(OP_LSLICE, Nullop,
+                               forcelist($5),
+                               forcelist($2)); }
+       |       '(' ')' '[' expr ']'    %prec '('
+                       { $$ = newSLICEOP(OP_LSLICE, Nullop,
+                               forcelist($4), Nullop); }
+       |       ary '[' expr ']'        %prec '('
+                       { $$ = newBINOP(OP_ASLICE,
+                               gv_to_op(A_STAB,gv_AVadd($1)),
+                               forcelist($3)); }
+       |       ary '{' expr ';' '}'    %prec '('
+                       { $$ = newBINOP(OP_HSLICE,
+                               gv_to_op(A_STAB,gv_HVadd($1)),
+                               forcelist($3));
+                           expectterm = FALSE; }
+       |       DELETE scalar '{' expr ';' '}'  %prec '('
+                       { $$ = newBINOP(OP_DELETE,
+                               gv_to_op(A_STAB,gv_HVadd($2)),
+                               jmaybe($4));
+                           expectterm = FALSE; }
+       |       DELETE '(' scalar '{' expr ';' '}' ')'  %prec '('
+                       { $$ = newBINOP(OP_DELETE,
+                               gv_to_op(A_STAB,gv_HVadd($3)),
+                               jmaybe($5));
+                           expectterm = FALSE; }
+       |       THING   %prec '('
+                       { $$ = $1; }
+
+       |       amper
+                       { $$ = newUNIOP(OP_SUBR,
+                               gv_to_op(A_STAB,$1)); }
+       |       amper '(' ')'
+                       { $$ = newBINOP(OP_SUBR,
+                               gv_to_op(A_STAB,$1),
+                               flatten(Nullop)); }
+       |       amper '(' expr crp
+                       { $$ = newBINOP(OP_SUBR,
+                               gv_to_op(A_STAB,$1),
+                               $3); }
+
+       |       DO sexpr        %prec UNIOP
+                       { $$ = newUNOP(OP_DOFILE,$2);
+                         allgvs = TRUE;}
+       |       DO block        %prec '('
+                       { $$ = $2; }
+       |       DO WORD '(' ')'
+                       { $$ = newBINOP(OP_SUBR,
+                               gv_to_op(A_WORD,newGV($2,MULTI)),
+                               Nullop);
+                           Safefree($2); $2 = Nullch;
+                           $$->op_flags |= AF_DEPR; }
+       |       DO WORD '(' expr crp
+                       { $$ = newBINOP(OP_SUBR,
+                               gv_to_op(A_WORD,newGV($2,MULTI)),
+                               $4); Safefree($2); $2 = Nullch;
+                           $$->op_flags |= AF_DEPR; }
+       |       DO scalar '(' ')'
+                       { $$ = newBINOP(OP_SUBR,
+                               gv_to_op(A_STAB,$2),
+                               flatten(Nullop));
+                           $$->op_flags |= AF_DEPR; }
+       |       DO scalar '(' expr crp
+                       { $$ = newBINOP(OP_SUBR,
+                               gv_to_op(A_STAB,$2),
+                               $4);
+                           $$->op_flags |= AF_DEPR; }
+       |       LOOPEX
+                       { $$ = newOP($1); }
+       |       LOOPEX WORD
+                       { $$ = newUNIOP($1,pv_to_op($2)); }
+       |       UNIOP
+                       { $$ = newOP($1); }
+       |       UNIOP block
+                       { $$ = newUNOP($1,$2); }
+       |       UNIOP sexpr
+                       { $$ = newUNOP($1,$2); }
+       |       FUNC0
+                       { $$ = newOP($1); }
+       |       FUNC0 '(' ')'
+                       { $$ = newOP($1); }
+       |       FUNC1 '(' ')'
+                       { $$ = newOP($1); }
+       |       FUNC1 '(' expr ')'
+                       { $$ = newUNIOP($1,$3); }
+       |       WORD
+       |       listop
+       ;
+
+listop :       LSTOP listexpr
+                       { $$ = newUNOP($1, $2); }
+       |       FUNC '(' listexpr ')'
+                       { $$ = newUNOP($1, $3); }
+       ;
+
+listexpr:      /* NULL */
+                       { $$ = newNULLLIST(); }
+       |       expr
+                       { $$ = $1; }
+       |       indirob expr
+                       { $$ = prepend_elem(OP_LIST, $1, $2); }
+       ;
+
+amper  :       '&' indirob
+                       { $$ = $2; }
+       ;
+
+scalar :       '$' indirob
+                       { $$ = $2; }
+       ;
+
+ary    :       '@' indirob
+                       { $$ = $2; }
+       ;
+
+hsh    :       '%' indirob
+                       { $$ = $2; }
+       ;
+
+arylen :       DOLSHARP indirob
+                       { $$ = $2; }
+       ;
+
+star   :       '*' indirob
+                       { $$ = $2; }
+       ;
+
+indirob        :       WORD
+                       { $$ = newINDIROB($1); }
+       |       scalar
+                       { $$ = newINDIROB($1); }
+       |       block
+                       { $$ = newINDIROB($1); }
+       ;
+
+crp    :       ',' ')'
+                       { $$ = 1; }
+       |       ')'
+                       { $$ = 0; }
+       ;
+
+%% /* PROGRAM */
diff --git a/pp.c b/pp.c
index d5c33d1..0713690 100644 (file)
--- a/pp.c
+++ b/pp.c
@@ -58,14 +58,6 @@ extern int h_errno;
 #include <sys/file.h>
 #endif
 
-#ifdef STANDARD_C
-#  include <stdarg.h>
-#else
-#  ifdef I_VARARGS
-#    include <varargs.h>
-#  endif
-#endif
-
 static I32 dopoptosub P((I32 startingblock));
 
 /* Nothing. */
@@ -2038,7 +2030,7 @@ PP(pp_log)
     else
        value = POPn;
     if (value <= 0.0)
-       DIE("Can't take log of %g\n", value);
+       DIE("Can't take log of %g", value);
     value = log(value);
     XPUSHn(value);
     RETURN;
@@ -2053,7 +2045,7 @@ PP(pp_sqrt)
     else
        value = POPn;
     if (value < 0.0)
-       DIE("Can't take sqrt of %g\n", value);
+       DIE("Can't take sqrt of %g", value);
     value = sqrt(value);
     XPUSHn(value);
     RETURN;
@@ -2159,8 +2151,11 @@ PP(pp_substr)
     tmps = SvPV(sv, curlen);           /* force conversion to string */
     if (pos < 0)
        pos += curlen + arybase;
-    if (pos < 0 || pos > curlen)
-       sv_setpvn(TARG, "", 0);
+    if (pos < 0 || pos > curlen) {
+       if (dowarn)
+           warn("substr outside of string");
+       RETPUSHUNDEF;
+    }
     else {
        if (MAXARG < 3)
            len = curlen;
@@ -2742,7 +2737,7 @@ PP(pp_formline)
                    MARK = markmark;
                    if (lines == 200) {
                        arg = t - linemark;
-                       if (strnEQ(linemark, linemark - t, arg))
+                       if (strnEQ(linemark, linemark - arg, arg))
                            DIE("Runaway format");
                    }
                    arg = t - SvPVX(formtarget);
@@ -3953,7 +3948,7 @@ PP(pp_pack)
        default:
            break;
        case '%':
-           DIE("% may only be used in unpack");
+           DIE("%% may only be used in unpack");
        case '@':
            len -= SvCUR(cat);
            if (len > 0)
@@ -4665,7 +4660,7 @@ PP(pp_splice)
                    *dst-- = *src--;
            }
            Zero(AvARRAY(ary), -diff, SV*);
-           AvARRAY(ary) -= diff;               /* diff is negative */
+           SvPVX(ary) = (char*)(AvARRAY(ary) - diff); /* diff is negative */
            AvMAX(ary) += diff;
        }
        else {
@@ -4702,7 +4697,7 @@ PP(pp_splice)
                    dst = src - diff;
                    Move(src, dst, offset, SV*);
                }
-               AvARRAY(ary) -= diff;           /* diff is positive */
+               SvPVX(ary) = (char*)(AvARRAY(ary) - diff);/* diff is positive */
                AvMAX(ary) += diff;
                AvFILL(ary) += diff;
            }
@@ -5294,7 +5289,7 @@ die(pat, va_alist)
 #else
     va_start(args);
 #endif
-    message = mess(pat, args);
+    message = mess(pat, &args);
     va_end(args);
     restartop = die_where(message);
     if (stack != mainstack)
@@ -7376,7 +7371,7 @@ PP(pp_eof)
     if (MAXARG <= 0)
        gv = last_in_gv;
     else
-       gv = (GV*)POPs;
+       gv = last_in_gv = (GV*)POPs;
     PUSHs(!gv || do_eof(gv) ? &sv_yes : &sv_no);
     RETURN;
 }
@@ -7389,7 +7384,7 @@ PP(pp_tell)
     if (MAXARG <= 0)
        gv = last_in_gv;
     else
-       gv = (GV*)POPs;
+       gv = last_in_gv = (GV*)POPs;
     PUSHi( do_tell(gv) );
     RETURN;
 }
@@ -7401,7 +7396,7 @@ PP(pp_seek)
     int whence = POPi;
     long offset = POPl;
 
-    gv = (GV*)POPs;
+    gv = last_in_gv = (GV*)POPs;
     PUSHs( do_seek(gv, offset, whence) ? &sv_yes : &sv_no );
     RETURN;
 }
diff --git a/proto.h b/proto.h
index 7bec500..00c31c8 100644 (file)
--- a/proto.h
+++ b/proto.h
@@ -167,10 +167,10 @@ void      magicalize P((char* list));
 void   magicname P((char* sym, char* name, I32 namlen));
 int    main P((int argc, char** argv, char** env));
 #ifndef STANDARD_C
-MALLOCPTRTYPE* malloc P((MEM_SIZE nbytes));
+Malloc_t       malloc P((MEM_SIZE nbytes));
 #endif
 OP*    maybeforcelist P((I32 optype, OP* arg));
-char*  mess P((char* pat, ...));
+char*  mess P((char* pat, va_list* args));
 int    mg_clear P((SV* sv));
 MAGIC* mg_find P((SV* sv, char type));
 int    mg_free P((SV* sv));
@@ -226,6 +226,7 @@ IO* newIO P((void));
 OP*    newLISTOP P((I32 type, I32 flags, OP* first, OP* last));
 OP*    newPMOP P((I32 type, I32 flags));
 OP*    newPVOP P((I32 type, I32 flags, char* pv));
+SV*    newRV P((SV* ref));
 #ifdef LEAKTEST
 SV*    newSV P((I32 x, STRLEN len));
 #else
@@ -262,7 +263,7 @@ void        peep P((OP* op));
 PerlInterpreter*       perl_alloc P((void));
 I32    perl_callargv P((char* subname, I32 sp, I32 gimme, char** argv));
 I32    perl_callpv P((char* subname, I32 sp, I32 gimme, I32 hasargs, I32 numargs));
-I32    perl_callsv P((CV* cv, I32 sp, I32 gimme, I32 hasargs, I32 numargs));
+I32    perl_callsv P((SV* sv, I32 sp, I32 gimme, I32 hasargs, I32 numargs));
 void   perl_construct P((PerlInterpreter* sv_interp));
 void   perl_destruct P((PerlInterpreter* sv_interp));
 void   perl_free P((PerlInterpreter* sv_interp));
@@ -335,6 +336,7 @@ char*       scan_word P((char* s, char* dest, int allow_package, STRLEN *slp));
 OP*    scope P((OP* o));
 char*  screaminstr P((SV* bigsv, SV* littlesv));
 I32    setenv_getix P((char* nam));
+VOIDRET sighandler P((I32 sig));
 char*  skipspace P((char* s));
 int    start_subparse P((void));
 bool   sv_2bool P((SV* sv));
index b8484d7..e339feb 100644 (file)
--- a/regcomp.h
+++ b/regcomp.h
@@ -180,10 +180,10 @@ EXT char regdummy;
  * Utility definitions.
  */
 #ifndef lint
-#ifndef CHARBITS
+#ifndef CHARMASK
 #define        UCHARAT(p)      ((int)*(unsigned char *)(p))
 #else
-#define        UCHARAT(p)      ((int)*(p)&CHARBITS)
+#define        UCHARAT(p)      ((int)*(p)&CHARMASK)
 #endif
 #else /* lint */
 #define UCHARAT(p)     regdummy
index 131ad0f..2d23d05 100644 (file)
--- a/regexec.c
+++ b/regexec.c
@@ -432,10 +432,12 @@ I32 safebase;     /* no need to remember string in subbase */
        prog->subend = strend;
        if ((!safebase && (prog->nparens || sawampersand)) || prog->do_folding){
                strend += dontbother;   /* uncheat */
-               if (safebase)                   /* no need for $digit later */
+               i = strend - string + (stringarg - strbeg);
+               if (safebase) {                 /* no need for $digit later */
                    s = strbeg;
+                   prog->subend = s+i;
+               }
                else if (strbeg != prog->subbase) {
-                   i = strend - string + (stringarg - strbeg);
                    s = nsavestr(strbeg,i);     /* so $digit will work later */
                    if (prog->subbase)
                            Safefree(prog->subbase);
@@ -443,7 +445,6 @@ I32 safebase;       /* no need to remember string in subbase */
                    prog->subend = s+i;
                }
                else {
-                   i = strend - string + (stringarg - strbeg);
                    prog->subbeg = s = prog->subbase;
                    prog->subend = s+i;
                }
diff --git a/sv.c b/sv.c
index dfe3c78..152a767 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -134,26 +134,6 @@ sv_clean_refs()
 }
 
 void
-sv_clean_magic()
-{
-    register SV* sv;
-    register SV* svend;
-
-    for (sv = sv_arenaroot; sv; sv = SvANY(sv)) {
-       svend = &sv[1008 / sizeof(SV)];
-       while (sv < svend) {
-           if (SvTYPE(sv) != SVTYPEMASK && SvMAGICAL(sv)) {
-               DEBUG_D((fprintf(stderr, "Cleaning magic:\n "), sv_dump(sv));)
-               SvFLAGS(sv) |= SVf_BREAK;
-               sv_unmagic(sv);
-               SvREFCNT_dec(sv);
-           }
-           ++sv;
-       }
-    }
-}
-
-void
 sv_clean_all()
 {
     register SV* sv;
@@ -597,7 +577,7 @@ U32 mt;
        SvANY(sv) = new_XPVAV();
        if (pv)
            Safefree(pv);
-       AvARRAY(sv)     = 0;
+       SvPVX(sv)       = 0;
        AvMAX(sv)       = 0;
        AvFILL(sv)      = 0;
        SvIVX(sv)       = 0;
@@ -804,9 +784,9 @@ register SV *sv;
        if (!SvPVX(sv))
            return "(null)";
        if (SvOOK(sv))
-           sprintf(t,"(%ld+\"%0.127s\")",(long)SvIVX(sv),SvPVX(sv));
+           sprintf(t,"(%ld+\"%.127s\")",(long)SvIVX(sv),SvPVX(sv));
        else
-           sprintf(t,"(\"%0.127s\")",SvPVX(sv));
+           sprintf(t,"(\"%.127s\")",SvPVX(sv));
     }
     else if (SvNOK(sv))
        sprintf(t,"(%g)",SvNVX(sv));
@@ -946,7 +926,6 @@ register SV *sv;
     if (SvTHINKFIRST(sv)) {
        if (SvROK(sv))
            return (I32)SvRV(sv);
-#ifdef TOOSTRICT
        if (SvREADONLY(sv)) {
            if (SvNOK(sv))
                return (I32)SvNVX(sv);
@@ -956,7 +935,6 @@ register SV *sv;
                warn(warn_uninit);
            return 0;
        }
-#endif
     }
     switch (SvTYPE(sv)) {
     case SVt_NULL:
@@ -1010,7 +988,6 @@ register SV *sv;
     if (SvTHINKFIRST(sv)) {
        if (SvROK(sv))
            return (double)(unsigned long)SvRV(sv);
-#ifdef TOOSTRICT
        if (SvREADONLY(sv)) {
            if (SvPOK(sv) && SvLEN(sv))
                return atof(SvPVX(sv));
@@ -1020,7 +997,6 @@ register SV *sv;
                warn(warn_uninit);
            return 0.0;
        }
-#endif
     }
     if (SvTYPE(sv) < SVt_NV) {
        if (SvTYPE(sv) == SVt_IV)
@@ -1121,7 +1097,6 @@ STRLEN *lp;
            *lp = strlen(s);
            return s;
        }
-#ifdef TOOSTRICT
        if (SvREADONLY(sv)) {
            if (SvIOK(sv)) {
                (void)sprintf(tokenbuf,"%ld",SvIVX(sv));
@@ -1138,7 +1113,6 @@ STRLEN *lp;
            *lp = 0;
            return "";
        }
-#endif
     }
     if (!SvUPGRADE(sv, SVt_PV))
        return 0;
@@ -2524,6 +2498,23 @@ I32 i;
     return sv;
 }
 
+SV *
+newRV(ref)
+SV *ref;
+{
+    register SV *sv;
+
+    new_SV();
+    SvANY(sv) = 0;
+    SvREFCNT(sv) = 1;
+    SvFLAGS(sv) = 0;
+    sv_upgrade(sv, SVt_RV);
+    SvRV(sv) = SvREFCNT_inc(ref);
+    SvROK_on(sv);
+    ++sv_rvcount;
+    return sv;
+}
+
 /* make an exact duplicate of old */
 
 SV *
@@ -2995,4 +2986,10 @@ SV* sv;
        break;
     }
 }
+#else
+void
+sv_dump(sv)
+SV* sv;
+{
+}
 #endif
diff --git a/sv.h b/sv.h
index ed8acaa..77671c5 100644 (file)
--- a/sv.h
+++ b/sv.h
@@ -89,12 +89,12 @@ struct io {
 
 #define SvREFCNT(sv)   (sv)->sv_refcnt
 #ifdef CRIPPLED_CC
-#define SvREFCNT_inc(sv)       sv_newref(sv)
-#define SvREFCNT_dec(sv)       sv_free(sv)
+#define SvREFCNT_inc(sv)       sv_newref((SV*)sv)
+#define SvREFCNT_dec(sv)       sv_free((SV*)sv)
 #else
 #define SvREFCNT_inc(sv)       ((Sv = (SV*)(sv)), \
                                    (Sv && ++SvREFCNT(Sv)), (SV*)Sv)
-#define SvREFCNT_dec(sv)       sv_free(sv)
+#define SvREFCNT_dec(sv)       sv_free((SV*)sv)
 #endif
 
 #define SVTYPEMASK     0xff
diff --git a/t/SDBM_File.so b/t/SDBM_File.so
new file mode 100755 (executable)
index 0000000..ace796d
--- /dev/null
@@ -0,0 +1,4 @@
+#!./perl -Dst
+
+$ref = [[],2,[3,4,5,]];
+print ${$$ref[2]}[2] == 5 ? "ok 16\n" : "not ok 16\n";
index bbc0c0c..5c76407 100755 (executable)
@@ -8,14 +8,14 @@ require English; import English;
 print $PID == $$ ? "ok 1\n" : "not ok 1\n";
 
 $_ = 1;
-print $MAGIC == $_ ? "ok 2\n" : "not ok 2\n";
+print $ARG == $_ ? "ok 2\n" : "not ok 2\n";
 
 sub foo {
     print $ARG[0] == $_[0] ? "ok 3\n" : "not ok 3\n";
 }
 &foo(1);
 
-$MAGIC = "ok 4\nok 5\nok 6\n";
+$ARG = "ok 4\nok 5\nok 6\n";
 /ok 5\n/;
 print $PREMATCH, $MATCH, $POSTMATCH;
 
diff --git a/toke.c b/toke.c
index ea675e8..6c582a5 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -1099,8 +1099,20 @@ yylex()
                sv_catpv(linestr, "LINE: while (<>) {");
                if (minus_l)
                    sv_catpv(linestr,"chop;");
-               if (minus_a)
-                   sv_catpv(linestr,"@F=split(' ');");
+               if (minus_a){
+                   if (minus_F){
+                     char tmpbuf1[50];
+                     if ( splitstr[0] == '/' || 
+                          splitstr[0] == '\'' || 
+                          splitstr[0] == '"' )
+                           sprintf( tmpbuf1, "@F=split(%s);", splitstr );
+                       else
+                           sprintf( tmpbuf1, "@F=split('%s');", splitstr );
+                       sv_catpv(linestr,tmpbuf1);
+                   }
+                   else
+                       sv_catpv(linestr,"@F=split(' ');");
+               }
            }
            oldoldbufptr = oldbufptr = s = SvPVX(linestr);
            bufend = SvPVX(linestr) + SvCUR(linestr);
@@ -1152,7 +1164,8 @@ yylex()
            if (*s == ':')      /* for csh's that have to exec sh scripts */
                s++;
            if (*s == '#' && s[1] == '!') {
-               if (!in_eval && !instr(s,"perl") && instr(origargv[0],"perl")) {
+               if (!in_eval && !instr(s,"perl") && !instr(s,"indir") &&
+                       instr(origargv[0],"perl")) {
                    char **newargv;
                    char *cmd;
 
@@ -1398,8 +1411,8 @@ yylex()
        if (expect == XTERM)
            OPERATOR(HASHBRACK);
        else if (expect == XBLOCK || expect == XOPERATOR) {
-           lex_brackstack[lex_brackets-1] = XBLOCK;
-           expect = XBLOCK;
+           lex_brackstack[lex_brackets-1] = XSTATE;
+           expect = XSTATE;
        }
        else {
            char *t;
diff --git a/unobsolete b/unobsolete
new file mode 100644 (file)
index 0000000..d766e79
--- /dev/null
@@ -0,0 +1,11 @@
+replace  HAS_NDBM I_NDBM atarist/config.h
+replace  HAS_ODBM I_DBM atarist/config.h
+replace  HAS_NDBM I_NDBM config_c++.h
+replace  HAS_ODBM I_DBM config_c++.h
+replace  HAS_NDBM I_NDBM hvdbm.h
+replace  HAS_ODBM I_DBM hvdbm.h
+replace  HAS_NDBM I_NDBM msdos/config.h
+replace  HAS_ODBM I_DBM msdos/config.h
+replace  HAS_NDBM I_NDBM os2/config.h
+replace  HAS_ODBM I_DBM os2/config.h
+replace  HAS_NDBM I_NDBM perl.h
diff --git a/util.c b/util.c
index 2e31e18..8f6845a 100644 (file)
--- a/util.c
+++ b/util.c
 #  include <vfork.h>
 #endif
 
-#ifdef STANDARD_C
-#  include <stdarg.h>
-#else
-#  ifdef I_VARARGS
-#    include <varargs.h>
-#  endif
-#endif
-
 #ifdef I_FCNTL
 #  include <fcntl.h>
 #endif
@@ -93,7 +85,7 @@ unsigned long size;
 MEM_SIZE size;
 #endif /* MSDOS */
 {
-    char *ptr;
+    char  *ptr;
 #ifndef STANDARD_C
     char *malloc();
 #endif /* ! STANDARD_C */
@@ -741,21 +733,25 @@ long a1, a2, a3, a4;
     }
 
     if (s[-1] != '\n') {
-       if (curcop->cop_line) {
-           (void)sprintf(s," at %s line %ld",
-             SvPVX(GvSV(curcop->cop_filegv)), (long)curcop->cop_line);
-           s += strlen(s);
-       }
-       if (last_in_gv &&
-           GvIO(last_in_gv) &&
-           IoLINES(GvIO(last_in_gv)) ) {
-           (void)sprintf(s,", <%s> %s %ld",
-             last_in_gv == argvgv ? "" : GvENAME(last_in_gv),
-             strEQ(rs,"\n") ? "line" : "chunk", 
-             (long)IoLINES(GvIO(last_in_gv)));
-           s += strlen(s);
+       if (dirty)
+           strcpy(s, " during global destruction.\n");
+       else {
+           if (curcop->cop_line) {
+               (void)sprintf(s," at %s line %ld",
+                 SvPVX(GvSV(curcop->cop_filegv)), (long)curcop->cop_line);
+               s += strlen(s);
+           }
+           if (last_in_gv &&
+               GvIO(last_in_gv) &&
+               IoLINES(GvIO(last_in_gv)) ) {
+               (void)sprintf(s,", <%s> %s %ld",
+                 last_in_gv == argvgv ? "" : GvENAME(last_in_gv),
+                 strEQ(rs,"\n") ? "line" : "chunk", 
+                 (long)IoLINES(GvIO(last_in_gv)));
+               s += strlen(s);
+           }
+           (void)strcpy(s,".\n");
        }
-       (void)strcpy(s,".\n");
        if (usermess)
            sv_catpv(tmpstr,buf+1);
     }
@@ -801,13 +797,13 @@ long a1, a2, a3, a4;
 
 #ifdef STANDARD_C
 char *
-mess(char *pat, va_list args)
+mess(char *pat, va_list *args)
 #else
 /*VARARGS0*/
 char *
 mess(pat, args)
     char *pat;
-    va_list args;
+    va_list *args;
 #endif
 {
     char *s;
@@ -825,31 +821,35 @@ mess(pat, args)
     usermess = strEQ(pat, "%s");
     if (usermess) {
        tmpstr = sv_newmortal();
-       sv_setpv(tmpstr, va_arg(args, char *));
+       sv_setpv(tmpstr, va_arg(*args, char *));
        *s++ = SvPVX(tmpstr)[SvCUR(tmpstr)-1];
     }
     else {
-       (void) vsprintf(s,pat,args);
+       (void) vsprintf(s,pat,*args);
        s += strlen(s);
     }
-    va_end(args);
+    va_end(*args);
 
     if (s[-1] != '\n') {
-       if (curcop->cop_line) {
-           (void)sprintf(s," at %s line %ld",
-             SvPVX(GvSV(curcop->cop_filegv)), (long)curcop->cop_line);
-           s += strlen(s);
-       }
-       if (last_in_gv &&
-           GvIO(last_in_gv) &&
-           IoLINES(GvIO(last_in_gv)) ) {
-           (void)sprintf(s,", <%s> %s %ld",
-             last_in_gv == argvgv ? "" : GvNAME(last_in_gv),
-             strEQ(rs,"\n") ? "line" : "chunk", 
-             (long)IoLINES(GvIO(last_in_gv)));
-           s += strlen(s);
+       if (dirty)
+           strcpy(s, " during global destruction.\n");
+       else {
+           if (curcop->cop_line) {
+               (void)sprintf(s," at %s line %ld",
+                 SvPVX(GvSV(curcop->cop_filegv)), (long)curcop->cop_line);
+               s += strlen(s);
+           }
+           if (last_in_gv &&
+               GvIO(last_in_gv) &&
+               IoLINES(GvIO(last_in_gv)) ) {
+               (void)sprintf(s,", <%s> %s %ld",
+                 last_in_gv == argvgv ? "" : GvNAME(last_in_gv),
+                 strEQ(rs,"\n") ? "line" : "chunk", 
+                 (long)IoLINES(GvIO(last_in_gv)));
+               s += strlen(s);
+           }
+           (void)strcpy(s,".\n");
        }
-       (void)strcpy(s,".\n");
        if (usermess)
            sv_catpv(tmpstr,buf+1);
     }
@@ -880,7 +880,7 @@ croak(pat, va_alist)
 #else
     va_start(args);
 #endif
-    message = mess(pat, args);
+    message = mess(pat, &args);
     va_end(args);
     if (restartop = die_where(message))
        longjmp(top_env, 3);
@@ -910,7 +910,7 @@ warn(pat,va_alist)
 #else
     va_start(args);
 #endif
-    message = mess(pat, args);
+    message = mess(pat, &args);
     va_end(args);
 
     fputs(message,stderr);
@@ -1283,7 +1283,7 @@ char      *mode;
                close(fd);
 #endif
            do_exec(cmd);       /* may or may not use the shell */
-           warn("Can't exec \"%s\": %s", cmd, strerror(errno));
+           warn("Can't exec \"%s\": %s", cmd, Strerror(errno));
            _exit(1);
        }
        /*SUPPRESS 560*/
diff --git a/writemain b/writemain
new file mode 100755 (executable)
index 0000000..3dfa7cf
--- /dev/null
+++ b/writemain
@@ -0,0 +1,44 @@
+#!/bin/sh
+
+cat <<'EOF'
+#include "INTERN.h"
+#include "perl.h"
+
+main(argc, argv, env)
+int argc;
+char **argv;
+char **env;
+{
+    int exitstatus;
+    PerlInterpreter *my_perl;
+
+    my_perl = perl_alloc();
+    if (!my_perl)
+       exit(1);
+    perl_construct( my_perl );
+
+    exitstatus = perl_parse( my_perl, argc, argv, env );
+    if (exitstatus)
+       exit( exitstatus );
+
+    exitstatus = perl_run( my_perl );
+
+    perl_destruct( my_perl );
+    perl_free( my_perl );
+
+    exit( exitstatus );
+}
+
+/* Register any extra external extensions */
+
+void
+perl_init_ext()
+{
+    char *file = __FILE__;
+
+    boot_DynamicLoader();
+EOF
+
+sed -e 's/\(.*\)/    newXSUB("\1::bootstrap", 0, boot_\1, file);/' <$1
+
+echo '}'
index 1c6d4a9..2d2ff74 100644 (file)
@@ -1,4 +1,4 @@
-# : Makefile.SH,v 15738Revision: 4.1 15738Date: 92/08/07 18:29:07 $
+# $RCSfile: Makefile.SH,v 28453Revision: 4.1 28453Date: 92/08/07 18:29:07 $
 #
 # $Log:        Makefile.SH,v $
 # Revision 4.1  92/08/07  18:29:07  lwall
 # 
 
 CC = cc
-YACC = /bin/yacc
+YACC = yacc
 bin = /usr/local/bin
-lib = 
-mansrc = /usr/man/manl
-manext = l
+lib = /usr/local/lib
+mansrc = /usr/local/man/man1
+manext = 1
 LDFLAGS = 
 SMALL = 
 LARGE =  
@@ -32,7 +32,7 @@ mallocsrc = malloc.c
 mallocobj = malloc.o
 shellflags = 
 
-libs = -ldbm -lm -lposix
+libs = -ldl -lm -lposix
 
 CCCMD = `sh $(shellflags) cflags $@`
 
index 111a6f6..b732b72 100644 (file)
--- a/x2p/a2p.y
+++ b/x2p/a2p.y
@@ -105,6 +105,8 @@ cond        : expr
        | match
        | rel
        | compound_cond
+       | cond '?' expr ':' expr
+               { $$ = oper3(OCOND,$1,$3,$5); }
        ;
 
 compound_cond
@@ -370,7 +372,7 @@ simple
                { $$ = oper0(ORETURN); }
        | RET expr
                { $$ = oper1(ORETURN,$2); }
-       | DELETE VAR '[' expr ']'
+       | DELETE VAR '[' expr_list ']'
                { $$ = oper2(ODELETE,aryrefarg($2),$4); }
        ;
 
index 62e6b1b..7bbeccd 100755 (executable)
@@ -1,4 +1,8 @@
 #!/usr/local/bin/perl
+# 
+# Modified September 26, 1993 to provide proper handling of years after 1999
+#   Tom Link <tml+@pitt.edu>
+#   University of Pittsburgh
 
 eval 'exec /usr/local/bin/perl -S $0 ${1+"$@"}'
        if $running_under_some_shell;
@@ -62,18 +66,18 @@ while (@ARGV) {
        $out .= &tab;
        $type = shift;
        if ($type eq 'nfs')
-           { $out .= '$dev < 0'; }
+           { $out .= '($dev < 0)'; }
        else
-           { $out .= '$dev >= 0'; }
+           { $out .= '($dev >= 0)'; }
     }
     elsif ($_ eq 'user') {
        $uname = shift;
-       $out .= &tab . "\$uid == \$uid{'$uname'}";
+       $out .= &tab . "(\$uid == \$uid{'$uname'})";
        $inituser++;
     }
     elsif ($_ eq 'group') {
        $gname = shift;
-       $out .= &tab . "\$gid == \$gid{'$gname'}";
+       $out .= &tab . "(\$gid == \$gid{'$gname'})";
        $initgroup++;
     }
     elsif ($_ eq 'nouser') {
@@ -85,22 +89,22 @@ while (@ARGV) {
        $initgroup++;
     }
     elsif ($_ eq 'links') {
-       $out .= &tab . '$nlink ' . &n(shift);
+       $out .= &tab . '($nlink ' . &n(shift);
     }
     elsif ($_ eq 'inum') {
-       $out .= &tab . '$ino ' . &n(shift);
+       $out .= &tab . '($ino ' . &n(shift);
     }
     elsif ($_ eq 'size') {
-       $out .= &tab . 'int((-s _ + 511) / 512) ' . &n(shift);
+       $out .= &tab . '(int(((-s _) + 511) / 512) ' . &n(shift);
     }
     elsif ($_ eq 'atime') {
-       $out .= &tab . 'int(-A _) ' . &n(shift);
+       $out .= &tab . '(int(-A _) ' . &n(shift);
     }
     elsif ($_ eq 'mtime') {
-       $out .= &tab . 'int(-M _) ' . &n(shift);
+       $out .= &tab . '(int(-M _) ' . &n(shift);
     }
     elsif ($_ eq 'ctime') {
-       $out .= &tab . 'int(-C _) ' . &n(shift);
+       $out .= &tab . '(int(-C _) ' . &n(shift);
     }
     elsif ($_ eq 'exec') {
        for (@cmd = (); @ARGV && $ARGV[0] ne ';'; push(@cmd,shift)) { }
@@ -146,7 +150,7 @@ while (@ARGV) {
        $newername = 'AGE_OF' . $file;
        $newername =~ s/[^\w]/_/g;
        $newername = '$' . $newername;
-       $out .= "-M _ < $newername";
+       $out .= "(-M _ < $newername)";
        $initnewer .= "$newername = -M " . &quote($file) . ";\n";
     }
     elsif ($_ eq 'eval') {
@@ -319,7 +323,7 @@ sub ls {
     ($sec,$min,$hour,$mday,$mon,$year) = localtime($mtime);
     $moname = $moname[$mon];
     if (-M _ > 365.25 / 2) {
-       $timeyear = '19' . $year;
+       $timeyear = $year + 1900;
     }
     else {
        $timeyear = sprintf("%02d:%02d", $hour, $min);
@@ -548,9 +552,9 @@ ENDOFSTAT
 sub fileglob_to_re {
     local($tmp) = @_;
 
-    $tmp =~ s/([.^\$()])/\\$1/g;
+    $tmp =~ s#([./^\$()])#\\$1#g;
     $tmp =~ s/([?*])/.$1/g;
-    "^$tmp$";
+    "^$tmp\$";
 }
 
 sub n {
@@ -558,7 +562,7 @@ sub n {
 
     $n =~ s/^-/< / || $n =~ s/^\+/> / || $n =~ s/^/== /;
     $n =~ s/ 0*(\d)/ $1/;
-    $n;
+    $n . ')';
 }
 
 sub quote {
index d6a11d3..18b8e0b 100644 (file)
@@ -1,4 +1,4 @@
-# : Makefile.SH,v 15738Revision: 4.1 15738Date: 92/08/07 18:29:07 $
+# $RCSfile: Makefile.SH,v 28453Revision: 4.1 28453Date: 92/08/07 18:29:07 $
 #
 # $Log:        Makefile.SH,v $
 # Revision 4.1  92/08/07  18:29:07  lwall
 # 
 
 CC = cc
-YACC = /bin/yacc
+YACC = yacc
 bin = /usr/local/bin
-lib = 
-mansrc = /usr/man/manl
-manext = l
+lib = /usr/local/lib
+mansrc = /usr/local/man/man1
+manext = 1
 LDFLAGS = 
 SMALL = 
 LARGE =  
@@ -32,7 +32,7 @@ mallocsrc = malloc.c
 mallocobj = malloc.o
 shellflags = 
 
-libs = -ldbm -lm -lposix
+libs = -ldl -lm -lposix
 
 CCCMD = `sh $(shellflags) cflags $@`
 
@@ -129,10 +129,9 @@ malloc.c: ../malloc.c
 
 # AUTOMATICALLY GENERATED MAKE DEPENDENCIES--PUT NOTHING BELOW THIS LINE
 # If this runs make out of memory, delete /usr/include lines.
-hash.o: 
 hash.o: ../config.h
-hash.o: /usr/ucbinclude/ctype.h
-hash.o: /usr/ucbinclude/stdio.h
+hash.o: /usr/include/ctype.h
+hash.o: /usr/include/stdio.h
 hash.o: EXTERN.h
 hash.o: a2p.h
 hash.o: handy.h
@@ -140,60 +139,60 @@ hash.o: hash.c
 hash.o: hash.h
 hash.o: str.h
 hash.o: util.h
-malloc.o: 
 malloc.o: ../av.h
 malloc.o: ../config.h
 malloc.o: ../cop.h
+malloc.o: ../cv.h
 malloc.o: ../embed.h
 malloc.o: ../form.h
 malloc.o: ../gv.h
 malloc.o: ../handy.h
 malloc.o: ../hv.h
+malloc.o: ../mg.h
 malloc.o: ../op.h
 malloc.o: ../opcode.h
 malloc.o: ../perl.h
-malloc.o: ../pm.h
 malloc.o: ../pp.h
 malloc.o: ../proto.h
 malloc.o: ../regexp.h
+malloc.o: ../scope.h
 malloc.o: ../sv.h
 malloc.o: ../unixish.h
 malloc.o: ../util.h
-malloc.o: /usr/ucbinclude/ctype.h
-malloc.o: /usr/ucbinclude/dirent.h
-malloc.o: /usr/ucbinclude/errno.h
-malloc.o: /usr/ucbinclude/machine/param.h
-malloc.o: /usr/ucbinclude/machine/setjmp.h
-malloc.o: /usr/ucbinclude/ndbm.h
-malloc.o: /usr/ucbinclude/netinet/in.h
-malloc.o: /usr/ucbinclude/setjmp.h
-malloc.o: /usr/ucbinclude/stdio.h
-malloc.o: /usr/ucbinclude/sys/dirent.h
-malloc.o: /usr/ucbinclude/sys/errno.h
-malloc.o: /usr/ucbinclude/sys/filio.h
-malloc.o: /usr/ucbinclude/sys/ioccom.h
-malloc.o: /usr/ucbinclude/sys/ioctl.h
-malloc.o: /usr/ucbinclude/sys/param.h
-malloc.o: /usr/ucbinclude/sys/signal.h
-malloc.o: /usr/ucbinclude/sys/sockio.h
-malloc.o: /usr/ucbinclude/sys/stat.h
-malloc.o: /usr/ucbinclude/sys/stdtypes.h
-malloc.o: /usr/ucbinclude/sys/sysmacros.h
-malloc.o: /usr/ucbinclude/sys/time.h
-malloc.o: /usr/ucbinclude/sys/times.h
-malloc.o: /usr/ucbinclude/sys/ttold.h
-malloc.o: /usr/ucbinclude/sys/ttychars.h
-malloc.o: /usr/ucbinclude/sys/ttycom.h
-malloc.o: /usr/ucbinclude/sys/ttydev.h
-malloc.o: /usr/ucbinclude/sys/types.h
-malloc.o: /usr/ucbinclude/time.h
-malloc.o: /usr/ucbinclude/vm/faultcode.h
+malloc.o: /usr/include/ctype.h
+malloc.o: /usr/include/dirent.h
+malloc.o: /usr/include/errno.h
+malloc.o: /usr/include/machine/param.h
+malloc.o: /usr/include/machine/setjmp.h
+malloc.o: /usr/include/netinet/in.h
+malloc.o: /usr/include/setjmp.h
+malloc.o: /usr/include/stdio.h
+malloc.o: /usr/include/sys/dirent.h
+malloc.o: /usr/include/sys/errno.h
+malloc.o: /usr/include/sys/filio.h
+malloc.o: /usr/include/sys/ioccom.h
+malloc.o: /usr/include/sys/ioctl.h
+malloc.o: /usr/include/sys/param.h
+malloc.o: /usr/include/sys/signal.h
+malloc.o: /usr/include/sys/sockio.h
+malloc.o: /usr/include/sys/stat.h
+malloc.o: /usr/include/sys/stdtypes.h
+malloc.o: /usr/include/sys/sysmacros.h
+malloc.o: /usr/include/sys/time.h
+malloc.o: /usr/include/sys/times.h
+malloc.o: /usr/include/sys/ttold.h
+malloc.o: /usr/include/sys/ttychars.h
+malloc.o: /usr/include/sys/ttycom.h
+malloc.o: /usr/include/sys/ttydev.h
+malloc.o: /usr/include/sys/types.h
+malloc.o: /usr/include/time.h
+malloc.o: /usr/include/varargs.h
+malloc.o: /usr/include/vm/faultcode.h
 malloc.o: EXTERN.h
 malloc.o: malloc.c
-str.o: 
 str.o: ../config.h
-str.o: /usr/ucbinclude/ctype.h
-str.o: /usr/ucbinclude/stdio.h
+str.o: /usr/include/ctype.h
+str.o: /usr/include/stdio.h
 str.o: EXTERN.h
 str.o: a2p.h
 str.o: handy.h
@@ -201,10 +200,9 @@ str.o: hash.h
 str.o: str.c
 str.o: str.h
 str.o: util.h
-util.o: 
 util.o: ../config.h
-util.o: /usr/ucbinclude/ctype.h
-util.o: /usr/ucbinclude/stdio.h
+util.o: /usr/include/ctype.h
+util.o: /usr/include/stdio.h
 util.o: EXTERN.h
 util.o: INTERN.h
 util.o: a2p.h
@@ -213,10 +211,9 @@ util.o: hash.h
 util.o: str.h
 util.o: util.c
 util.o: util.h
-walk.o: 
 walk.o: ../config.h
-walk.o: /usr/ucbinclude/ctype.h
-walk.o: /usr/ucbinclude/stdio.h
+walk.o: /usr/include/ctype.h
+walk.o: /usr/include/stdio.h
 walk.o: EXTERN.h
 walk.o: a2p.h
 walk.o: handy.h
index c31d0e1..d5c4717 100644 (file)
@@ -82,7 +82,6 @@ union overhead {
 };
 
 #define        MAGIC           0xff            /* magic # on accounting info */
-#define OLDMAGIC       0x7f            /* same after a free() */
 #define RMAGIC         0x55555555      /* magic # on range info */
 #ifdef RCHECK
 #define        RSLOP           sizeof (u_int)
@@ -122,7 +121,7 @@ botch(s)
 #define        ASSERT(p)
 #endif
 
-MALLOCPTRTYPE *
+Malloc_t
 malloc(nbytes)
        register MEM_SIZE nbytes;
 {
@@ -143,7 +142,7 @@ malloc(nbytes)
 #endif /* MSDOS */
 #ifdef DEBUGGING
        if ((long)nbytes < 0)
-           fatal("panic: malloc");
+           croak("panic: malloc");
 #endif
 #endif /* safemalloc */
 
@@ -177,14 +176,10 @@ malloc(nbytes)
        }
 
 #ifdef safemalloc
-#ifdef DEBUGGING
-#  if !(defined(I286) || defined(atarist))
-    if (debug & 128)
-        fprintf(stderr,"0x%x: (%05d) malloc %ld bytes\n",p+1,an++,(long)size);
-#  else
-    if (debug & 128)
-        fprintf(stderr,"0x%lx: (%05d) malloc %ld bytes\n",p+1,an++,(long)size);
-#  endif
+#if !(defined(I286) || defined(atarist))
+    DEBUG_m(fprintf(stderr,"0x%x: (%05d) malloc %ld bytes\n",p+1,an++,(long)size));
+#else
+    DEBUG_m(fprintf(stderr,"0x%lx: (%05d) malloc %ld bytes\n",p+1,an++,(long)size));
 #endif
 #endif /* safemalloc */
 
@@ -213,7 +208,7 @@ malloc(nbytes)
        p->ov_rmagic = RMAGIC;
        *((u_int *)((caddr_t)p + nbytes - RSLOP)) = RMAGIC;
 #endif
-       return ((MALLOCPTRTYPE *)(p + 1));
+       return ((Malloc_t)(p + 1));
 }
 
 /*
@@ -286,21 +281,17 @@ morecore(bucket)
 
 void
 free(mp)
-       MALLOCPTRTYPE *mp;
+       Malloc_t mp;
 {   
        register MEM_SIZE size;
        register union overhead *op;
        char *cp = (char*)mp;
 
 #ifdef safemalloc
-#ifdef DEBUGGING
-#  if !(defined(I286) || defined(atarist))
-       if (debug & 128)
-               fprintf(stderr,"0x%x: (%05d) free\n",cp,an++);
-#  else
-       if (debug & 128)
-               fprintf(stderr,"0x%lx: (%05d) free\n",cp,an++);
-#  endif
+#if !(defined(I286) || defined(atarist))
+       DEBUG_m(fprintf(stderr,"0x%x: (%05d) free\n",cp,an++));
+#else
+       DEBUG_m(fprintf(stderr,"0x%lx: (%05d) free\n",cp,an++));
 #endif
 #endif /* safemalloc */
 
@@ -311,16 +302,20 @@ free(mp)
        ASSERT(op->ov_magic == MAGIC);          /* make sure it was in use */
 #else
        if (op->ov_magic != MAGIC) {
+#ifdef RCHECK
                warn("%s free() ignored",
-                   op->ov_magic == OLDMAGIC ? "Duplicate" : "Bad");
+                   op->ov_rmagic == RMAGIC - 1 ? "Duplicate" : "Bad");
+#else
+               warn("Bad free() ignored");
+#endif
                return;                         /* sanity */
        }
-       op->ov_magic = OLDMAGIC;
 #endif
 #ifdef RCHECK
        ASSERT(op->ov_rmagic == RMAGIC);
        if (op->ov_index <= 13)
                ASSERT(*(u_int *)((caddr_t)op + op->ov_size + 1 - RSLOP) == RMAGIC);
+       op->ov_rmagic = RMAGIC - 1;
 #endif
        ASSERT(op->ov_index < NBUCKETS);
        size = op->ov_index;
@@ -344,9 +339,9 @@ free(mp)
  */
 int reall_srchlen = 4; /* 4 should be plenty, -1 =>'s whole list */
 
-MALLOCPTRTYPE *
+Malloc_t
 realloc(mp, nbytes)
-       MALLOCPTRTYPE *mp; 
+       Malloc_t mp; 
        MEM_SIZE nbytes;
 {   
        register MEM_SIZE onb;
@@ -371,7 +366,7 @@ realloc(mp, nbytes)
                return malloc(nbytes);
 #ifdef DEBUGGING
        if ((long)nbytes < 0)
-               fatal("panic: realloc");
+               croak("panic: realloc");
 #endif
 #endif /* safemalloc */
 
@@ -443,7 +438,7 @@ realloc(mp, nbytes)
 #  endif
 #endif
 #endif /* safemalloc */
-       return ((MALLOCPTRTYPE*)res);
+       return ((Malloc_t)res);
 }
 
 /*