summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xConfigure158
-rw-r--r--MANIFEST29
-rw-r--r--Makefile.SH9
-rw-r--r--README3
-rw-r--r--client2
-rw-r--r--cmd.c21
-rw-r--r--msdos/Changes.dds57
-rw-r--r--msdos/Makefile101
-rw-r--r--msdos/Wishlist.dds17
-rw-r--r--msdos/config.h540
-rw-r--r--patchlevel.h2
11 files changed, 862 insertions, 77 deletions
diff --git a/Configure b/Configure
index fdf3428db9..1fe5fe3b12 100755
--- a/Configure
+++ b/Configure
@@ -8,7 +8,16 @@
# and edit it to reflect your system. Some packages may include samples
# of config.h for certain machines, so you might look for one of those.)
#
-# $Header: Configure,v 3.0.1.6 90/03/12 16:10:23 lwall Locked $
+# $Header: Configure,v 3.0.1.7 90/03/28 09:14:53 lwall Locked $
+
+: make sure these files are renamed
+test -f config_h.SH || mv -f config.h.SH config_h.SH
+test -f perl_man.1 || mv -f perl.man.1 perl_man.1
+test -f perl_man.2 || mv -f perl.man.2 perl_man.2
+test -f perl_man.3 || mv -f perl.man.3 perl_man.3
+test -f perl_man.4 || mv -f perl.man.4 perl_man.4
+test -f t/op.s || mv -f t/op.subst t/op.s
+
#
# Yes, you may rip this off to use in other distribution packages.
# (Note: this Configure script was generated automatically. Rather than
@@ -102,6 +111,7 @@ cppminus=''
d_bcmp=''
d_bcopy=''
d_bzero=''
+d_castneg=''
d_charsprf=''
d_crypt=''
cryptlib=''
@@ -1110,6 +1120,7 @@ rmlist="$rmlist pdp11"
echo " "
echo "Checking for optional libraries..."
+dflt=''
case "$libswanted" in
'') libswanted='c_s';;
esac
@@ -1153,6 +1164,7 @@ set X $dflt
shift
dflt="$*"
case "$libs" in
+'') dflt="$dflt";;
*) dflt="$libs";;
esac
case "$dflt" in
@@ -1437,6 +1449,8 @@ if $contains '^printf$' libc.list >/dev/null 2>&1; then
else
$sed -n -e 's/^__*//' -e 's/^\([a-zA-Z_0-9$]*\).*xtern.*/\1/p' <libc.tmp >libc.list
$contains '^printf$' libc.list >/dev/null 2>&1 || \
+ $sed -n -e '/|UNDEF/d' -e '/FUNC..GL/s/^.*|__*//p' <libc.tmp >libc.list
+ $contains '^printf$' libc.list >/dev/null 2>&1 || \
$sed -n -e 's/^.* D __*//p' -e 's/^.* D //p' <libc.tmp >libc.list
$contains '^printf$' libc.list >/dev/null 2>&1 || \
$sed -n -e 's/^_//' \
@@ -1492,6 +1506,35 @@ eval $inlibc
set bzero d_bzero
eval $inlibc
+: check for ability to cast negative floats to unsigned
+echo " "
+echo 'Checking to see if your C compiler can cast negative float to unsigned'
+$cat >try.c <<'EOCP'
+main()
+{
+ double f = -123;
+ unsigned long along;
+ unsigned int aint;
+ unsigned short ashort;
+
+ along = (unsigned long)f;
+ aint = (unsigned int)f;
+ ashort = (unsigned short)f;
+ if (along == 0L || aint == 0 || ashort == 0)
+ exit(1);
+ else
+ exit(0);
+}
+EOCP
+if $cc -o try $ccflags try.c >/dev/null 2>&1 && ./try; then
+ d_castneg="$define"
+ echo "Yup, it does."
+else
+ d_castneg="$undef"
+ echo "Nope, it doesn't."
+fi
+$rm -f try.*
+
: see if sprintf is declared as int or pointer to char
echo " "
cat >.ucbsprf.c <<'EOF'
@@ -1756,6 +1799,61 @@ else
echo "dbm.h not found."
fi
+socketlib=''
+: see whether socket exists
+echo " "
+if $contains socket libc.list >/dev/null 2>&1; then
+ echo "Looks like you have Berkeley networking support."
+ d_socket="$define"
+ : now check for advanced features
+ if $contains setsockopt libc.list >/dev/null 2>&1; then
+ d_oldsock="$undef"
+ else
+ echo "...but it uses the old 4.1c interface, rather than 4.2"
+ d_oldsock="$define"
+ fi
+else
+ : hpux, for one, puts all the socket stuff in socklib.o
+ if $contains socklib libc.list >/dev/null 2>&1; then
+ echo "Looks like you have Berkeley networking support."
+ d_socket="$define"
+ : we will have to assume that it supports the 4.2 BSD interface
+ d_oldsock="$undef"
+ else
+ echo "Hmmm...you don't have Berkeley networking in libc.a..."
+ : look for an optional networking library
+ if test -f /usr/lib/libnet.a; then
+ (ar t /usr/lib/libnet.a ||
+ nm -g /usr/lib/libnet.a) 2>/dev/null >> libc.list
+ if $contains socket libc.list >/dev/null 2>&1; then
+ echo "but the Wollongong group seems to have hacked it in."
+ socketlib="-lnet"
+ d_socket="$define"
+ : now check for advanced features
+ 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"
+ d_oldsock="$define"
+ fi
+ else
+ echo "or even in libnet.a, which is peculiar."
+ d_socket="$undef"
+ d_oldsock="$undef"
+ fi
+ else
+ echo "or anywhere else I see."
+ d_socket="$undef"
+ d_oldsock="$undef"
+ fi
+ fi
+fi
+if $contains socketpair libc.list >/dev/null 2>&1; then
+ d_sockpair="$define"
+else
+ d_sockpair="$undef"
+fi
+
: see if this is a pwd system
echo " "
if $test -r /usr/include/pwd.h ; then
@@ -1850,61 +1948,6 @@ eval $inlibc
set setruid d_setruid
eval $inlibc
-socketlib=''
-: see whether socket exists
-echo " "
-if $contains socket libc.list >/dev/null 2>&1; then
- echo "Looks like you have Berkeley networking support."
- d_socket="$define"
- : now check for advanced features
- if $contains setsockopt libc.list >/dev/null 2>&1; then
- d_oldsock="$undef"
- else
- echo "...but it uses the old 4.1c interface, rather than 4.2"
- d_oldsock="$define"
- fi
-else
- : hpux, for one, puts all the socket stuff in socklib.o
- if $contains socklib libc.list >/dev/null 2>&1; then
- echo "Looks like you have Berkeley networking support."
- d_socket="$define"
- : we will have to assume that it supports the 4.2 BSD interface
- d_oldsock="$undef"
- else
- echo "Hmmm...you don't have Berkeley networking in libc.a..."
- : look for an optional networking library
- if test -f /usr/lib/libnet.a; then
- (ar t /usr/lib/libnet.a ||
- nm -g /usr/lib/libnet.a) 2>/dev/null >> libc.list
- if $contains socket libc.list >/dev/null 2>&1; then
- echo "but the Wollongong group seems to have hacked it in."
- socketlib="-lnet"
- d_socket="$define"
- : now check for advanced features
- 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"
- d_oldsock="$define"
- fi
- else
- echo "or even in libnet.a, which is peculiar."
- d_socket="$undef"
- d_oldsock="$undef"
- fi
- else
- echo "or anywhere else I see."
- d_socket="$undef"
- d_oldsock="$undef"
- fi
- fi
-fi
-if $contains socketpair libc.list >/dev/null 2>&1; then
- d_sockpair="$define"
-else
- d_sockpair="$undef"
-fi
-
: see if stat knows about block sizes
echo " "
if $contains 'st_blocks;' /usr/include/sys/stat.h >/dev/null 2>&1 ; then
@@ -2067,8 +2110,10 @@ echo 'Checking to see if your C compiler knows about "volatile"...'
$cat >try.c <<'EOCP'
main()
{
+ typedef unsigned short foo_t;
char *volatile foo;
volatile int bar;
+ volatile foo_t blech;
foo = foo;
}
EOCP
@@ -2560,6 +2605,7 @@ cppminus='$cppminus'
d_bcmp='$d_bcmp'
d_bcopy='$d_bcopy'
d_bzero='$d_bzero'
+d_castneg='$d_castneg'
d_charsprf='$d_charsprf'
d_crypt='$d_crypt'
cryptlib='$cryptlib'
diff --git a/MANIFEST b/MANIFEST
index 0472fa785e..b9c7c8904e 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -16,7 +16,7 @@ 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_h.SH Produces config.h
cons.c Routines to construct cmd nodes of a parse tree
consarg.c Routines to construct arg nodes of a parse tree
doarg.c Scalar expression evaluation
@@ -41,6 +41,7 @@ eg/muck.man Manual page for muck
eg/myrup A program to find lightly loaded machines
eg/nih Script to insert #! workaround
eg/rename A program to rename files
+eg/relink A program to change symbolic links
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
@@ -51,6 +52,7 @@ 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/travesty A program to print travesties of its input text
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
@@ -68,24 +70,39 @@ ioctl.pl Sample ioctl.pl
lib/abbrev.pl An abbreviation table builder
lib/look.pl A "look" equivalent
lib/complete.pl A command completion subroutine
+lib/ctime.pl A ctime workalike
lib/dumpvar.pl A variable dumper
lib/getopt.pl Perl library supporting option parsing
lib/getopts.pl Perl library supporting option parsing
lib/importenv.pl Perl routine to get environment into variables
lib/perldb.pl Perl debugging routines
lib/stat.pl Perl library supporting stat function
+lib/syslog.pl Perl library supporting syslogging
lib/termcap.pl Perl library supporting termcap usage
lib/validate.pl Perl library supporting wholesale file mode validation
makedepend.SH Precursor to makedepend
makedir.SH Precursor to makedir
makelib.SH A thing to turn C .h file into perl .h files
malloc.c A version of malloc you might not want
+msdos/Changes.dds Expanation of MS-DOS patches by Diomidis Spinellis
+msdos/Makefile MS-DOS makefile
+msdos/README.msdos Compiling and usage information
+msdos/Wishlist.dds My wishlist
+msdos/config.h Definitions for msdos
+msdos/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
patchlevel.h The current patch level of perl
perl.h Global declarations
-perl.man.1 The manual page(s), first fourth
-perl.man.2 The manual page(s), second fourth
-perl.man.3 The manual page(s), third fourth
-perl.man.4 The manual page(s), fourth fourth
+perl_man.1 The manual page(s), first fourth
+perl_man.2 The manual page(s), second fourth
+perl_man.3 The manual page(s), third fourth
+perl_man.4 The manual page(s), fourth fourth
perl.y Yacc grammar for perl
perlsh A poor man's perl shell
perly.c main()
@@ -164,7 +181,7 @@ t/op.split See if split works
t/op.sprintf See if sprintf works
t/op.stat See if stat works
t/op.study See if study works
-t/op.subst See if substitutions work
+t/op.s See if substitutions work
t/op.substr See if substr works
t/op.time See if time functions work
t/op.undef See if undef works
diff --git a/Makefile.SH b/Makefile.SH
index b1c1eeb94b..122b6dcf4c 100644
--- a/Makefile.SH
+++ b/Makefile.SH
@@ -25,9 +25,12 @@ esac
echo "Extracting Makefile (with variable substitutions)"
cat >Makefile <<!GROK!THIS!
-# $Header: Makefile.SH,v 3.0.1.5 90/03/12 16:15:17 lwall Locked $
+# $Header: Makefile.SH,v 3.0.1.6 90/03/27 15:27:15 lwall Locked $
#
# $Log: Makefile.SH,v $
+# Revision 3.0.1.6 90/03/27 15:27:15 lwall
+# patch16: MSDOS support
+#
# Revision 3.0.1.5 90/03/12 16:15:17 lwall
# patch13: some dependencies missing on perly.h
# patch13: some relief for buggy parallel makes
@@ -276,10 +279,10 @@ perl.c: perl.y
perl.o: perl.c perly.h $(h)
$(CC) -c $(CFLAGS) $(LARGE) perl.c
-perl.man: perl.man.1 perl.man.2 perl.man.3 perl.man.4 patchlevel.h perl
+perl.man: perl_man.1 perl_man.2 perl_man.3 perl_man.4 patchlevel.h perl
./perl -e '($$r,$$p)=$$]=~/(\d+\.\d+).*\n\D*(\d+)/;' \
-e 'print ".ds RP Release $$r Patchlevel $$p\n";' >perl.man
- cat perl.man.[1-4] >>perl.man
+ cat perl_man.[1-4] >>perl.man
install: all
# won't work with csh
diff --git a/README b/README
index 8de855db67..5029dcf7d3 100644
--- a/README
+++ b/README
@@ -1,7 +1,7 @@
Perl Kit, Version 3.0
- Copyright (c) 1989, Larry Wall
+ Copyright (c) 1989,1990, Larry Wall
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -76,6 +76,7 @@ Installation
The 3b2 needs to turn off -O.
AIX/RT may need a -a switch and -DCRIPPLED_CC.
+ SUNOS 4.0.[12] needs #define fputs(str,fp) fprintf(fp,"%s",str) in perl.h
SGI machines may need -Ddouble="long float".
Ultrix (2.3) may need to hand assemble teval.s with a -J switch.
Ultrix on MIPS machines may need -DLANGUAGE_C.
diff --git a/client b/client
index 97ecbc215e..5900c90d09 100644
--- a/client
+++ b/client
@@ -19,7 +19,7 @@ if (connect(S,$that)) { print "connect ok\n"; } else { die $!; }
select(S); $| = 1; select(stdout);
if ($child = fork) {
- while (<>) {
+ while (<STDIN>) {
print S;
}
sleep 3;
diff --git a/cmd.c b/cmd.c
index fbcdc9b8e9..4f3c13a799 100644
--- a/cmd.c
+++ b/cmd.c
@@ -1,4 +1,4 @@
-/* $Header: cmd.c,v 3.0.1.6 90/03/12 16:21:09 lwall Locked $
+/* $Header: cmd.c,v 3.0.1.7 90/03/27 15:32:37 lwall Locked $
*
* Copyright (c) 1989, Larry Wall
*
@@ -6,6 +6,9 @@
* as specified in the README file that comes with the perl 3.0 kit.
*
* $Log: cmd.c,v $
+ * Revision 3.0.1.7 90/03/27 15:32:37 lwall
+ * patch16: non-terminal blocks should never have arrays requested of them
+ *
* Revision 3.0.1.6 90/03/12 16:21:09 lwall
* patch13: fixed some backwards VOLATILE declarations
* patch13: while (s/x//) {} still caused some anomolies
@@ -127,7 +130,7 @@ tail_recursion_entry:
grow_dlevel();
}
#endif
- newsp = cmd_exec(cmd->ucmd.ccmd.cc_true,gimme,sp);
+ newsp = cmd_exec(cmd->ucmd.ccmd.cc_true,gimme && (cmdflags & CF_TERM),sp);
st = stack->ary_array; /* possibly reallocated */
retstr = st[newsp];
}
@@ -158,7 +161,7 @@ tail_recursion_entry:
grow_dlevel();
}
#endif
- newsp = cmd_exec(cmd->ucmd.ccmd.cc_true,gimme,sp);
+ newsp = cmd_exec(cmd->ucmd.ccmd.cc_true,gimme && (cmdflags & CF_TERM),sp);
st = stack->ary_array; /* possibly reallocated */
retstr = st[newsp];
}
@@ -247,7 +250,7 @@ tail_recursion_entry:
grow_dlevel();
}
#endif
- newsp = cmd_exec(cmd->ucmd.ccmd.cc_true,gimme,sp);
+ newsp = cmd_exec(cmd->ucmd.ccmd.cc_true,gimme && (cmdflags & CF_TERM),sp);
st = stack->ary_array; /* possibly reallocated */
retstr = st[newsp];
}
@@ -267,7 +270,7 @@ tail_recursion_entry:
grow_dlevel();
}
#endif
- newsp = cmd_exec(cmd->ucmd.ccmd.cc_alt,gimme,sp);
+ newsp = cmd_exec(cmd->ucmd.ccmd.cc_alt,gimme && (cmdflags & CF_TERM),sp);
st = stack->ary_array; /* possibly reallocated */
retstr = st[newsp];
}
@@ -711,7 +714,7 @@ until_loop:
grow_dlevel();
}
#endif
- newsp = cmd_exec(cmd->ucmd.ccmd.cc_true,gimme,sp);
+ newsp = cmd_exec(cmd->ucmd.ccmd.cc_true,gimme && (cmdflags & CF_TERM),sp);
st = stack->ary_array; /* possibly reallocated */
retstr = st[newsp];
}
@@ -740,7 +743,7 @@ until_loop:
grow_dlevel();
}
#endif
- newsp = cmd_exec(cmd->ucmd.ccmd.cc_true,gimme,sp);
+ newsp = cmd_exec(cmd->ucmd.ccmd.cc_true,gimme && (cmdflags & CF_TERM),sp);
st = stack->ary_array; /* possibly reallocated */
retstr = st[newsp];
}
@@ -826,7 +829,7 @@ until_loop:
grow_dlevel();
}
#endif
- newsp = cmd_exec(cmd->ucmd.ccmd.cc_true,gimme,sp);
+ newsp = cmd_exec(cmd->ucmd.ccmd.cc_true,gimme && (cmdflags & CF_TERM),sp);
st = stack->ary_array; /* possibly reallocated */
retstr = st[newsp];
}
@@ -846,7 +849,7 @@ until_loop:
grow_dlevel();
}
#endif
- newsp = cmd_exec(cmd->ucmd.ccmd.cc_alt,gimme,sp);
+ newsp = cmd_exec(cmd->ucmd.ccmd.cc_alt,gimme && (cmdflags & CF_TERM),sp);
st = stack->ary_array; /* possibly reallocated */
retstr = st[newsp];
}
diff --git a/msdos/Changes.dds b/msdos/Changes.dds
new file mode 100644
index 0000000000..1eed759cf9
--- /dev/null
+++ b/msdos/Changes.dds
@@ -0,0 +1,57 @@
+These are the changes done by the `patches' file:
+
+[These patches have been applied, more or less, so I don't supply the
+patches file--law]
+
+Compilation of some portions is done conditional on the definition
+of the following symbols:
+
+BINARY Enables the usage of setmode under MSDOS (added binmode command)
+BUGGY_MSC Adds #pragma_function(memset) to avoid internal compiler error
+CHOWN Enables chown
+CHROOT Enables chroot
+FORK Enables fork and changes the compilation of system
+GETLOGIN Enables getlogin
+GETPPID Enables getppid
+GROUP Enables all the group access functions
+KILL Enables kill
+LINK Enables link
+PASSWD Enables all the password access functions
+PIPE Enables the pipe function
+WAIT Enables the wait function
+UMASK Enables the umask function
+
+S_IFBLK * Enables the block special device check
+S_ISGID * Enables the setgid check
+S_ISUID * Enables the setuid check
+S_ISVTX * Enables the vtx check
+unix * Compiles globbing for Unix
+MSDOS * Compiles globbing for MS-DOS
+ Closes stdaux and stdprn on startup
+ Adds a copyright message for -v
+ Disables the compilation of my_popen, my_pclose as the
+ are in a separate file.
+
+Symbols marked with * are defined in the compilation environment. The
+rest should be added to config.h (config.h.SH). All functions when not
+supported give a fatal error.
+
+Added documentation for the binmode function in the manual.
+
+Fixed the following bugs:
+
+In eval.c function eval if ioctl or fcntl returned something
+other than 0 or -1 the result was a random number as the
+double `value' variable wasn't set to `anum'.
+
+In doio.c function do_exec there were two errors associated with
+firing up the shell when the execv fails. First argv was not freed,
+secondly an attempt was made to start up the shell with the cmd
+string that was now cut to pieces for the execv. Also the maxible
+possible length of argv was calculated by (s - cmd). Problem was
+that s was not pointing to the end of the string, but to the first
+non alpha.
+
+[These are incorporated in patches 15 and 16--law]
+
+Diomidis Spinellis, March 1990
diff --git a/msdos/Makefile b/msdos/Makefile
new file mode 100644
index 0000000000..eeb15e8068
--- /dev/null
+++ b/msdos/Makefile
@@ -0,0 +1,101 @@
+#
+# Makefile for compiling Perl under MS-DOS
+#
+# Needs a Unix compatible make.
+# This makefile works for an initial compilation. It does not
+# include all dependencies and thus is unsuitable for serious
+# development work. But who would do serious development under
+# MS-DOS?
+#
+# By Diomidis Spinellis, March 1990
+#
+
+# Source files
+SRC = array.c cmd.c cons.c consarg.c doarg.c doio.c dolist.c dump.c \
+eval.c form.c hash.c perl.y perly.c regcomp.c regexec.c \
+stab.c str.c toke.c util.c msdos.c popen.c directory.c
+
+# Object files
+OBJ = perl.obj array.obj cmd.obj cons.obj consarg.obj doarg.obj doio.obj \
+dolist.obj dump.obj eval.obj form.obj hash.obj perly.obj regcomp.obj \
+regexec.obj stab.obj str.obj toke.obj util.obj msdos.obj popen.obj \
+directory.obj
+
+# Files in the MS-DOS distribution
+DOSFILES=config.h dir.h director.c glob.c makefile msdos.c popen.c readme.msd \
+changes.dds wishlist.dds patches manifest
+
+# Yacc flags
+YFLAGS=-d
+
+# Manual pages
+MAN=perlman.1 perlman.2 perlman.3 perlman.4
+
+CC=cc
+# Cflags for the files that break under the optimiser
+CPLAIN=-AL -DCRIPPLED_CC
+# Cflags for all the rest
+CFLAGS=$(CPLAIN) -Ox
+# Destination directory for executables
+DESTDIR=\usr\bin
+
+# Deliverables
+all: perl.exe perl.1 glob.exe
+
+perl.exe: $(OBJ)
+ echo array+cmd+cons+consarg+doarg+doio+dolist+dump+ >perl.arp
+ echo eval+form+hash+perl+perly+regcomp+regexec+ >>perl.arp
+ echo stab+str+toke+util+msdos+popen+directory+\lib\setargv >>perl.arp
+ echo perl.exe >>perl.arp
+ echo nul >>perl.arp
+ echo /stack:32767 /NOE >>perl.arp
+ link @perl.arp
+
+glob.exe: glob.c
+ $(CC) glob.c \lib\setargv.obj -link /NOE
+
+array.obj: array.c
+cmd.obj: cmd.c
+cons.obj: cons.c perly.h
+consarg.obj: consarg.c
+ $(CC) $(CPLAIN) -c consarg.c
+doarg.obj: doarg.c
+doio.obj: doio.c
+dolist.obj: dolist.c
+dump.obj: dump.c
+eval.obj: eval.c evalargs.xc
+form.obj: form.c
+hash.obj: hash.c
+perl.obj: perl.y
+perly.obj: perly.c
+regcomp.obj: regcomp.c
+regexec.obj: regexec.c
+stab.obj: stab.c
+str.obj: str.c
+toke.obj: toke.c
+util.obj: util.c
+ $(CC) $(CPLAIN) -c util.c
+perly.h: perl.obj
+ mv ytab.h perly.h
+directory.obj: directory.c
+popen.obj: popen.c
+msdos.obj: msdos.c
+
+perl.1: $(MAN)
+ nroff -man $(MAN) >perl.1
+
+install: all
+ exepack perl.exe $(DESTDIR)\perl.exe
+ exepack glob.exe $(DESTDIR)\glob.exe
+
+clean:
+ rm -f *.obj *.exe perl.1 perly.h perl.arp
+
+tags:
+ ctags *.c *.h *.xc
+
+dosperl:
+ mv $(DOSFILES) ../perl30.new
+
+doskit:
+ mv $(DOSFILES) ../msdos
diff --git a/msdos/Wishlist.dds b/msdos/Wishlist.dds
new file mode 100644
index 0000000000..d06de117ab
--- /dev/null
+++ b/msdos/Wishlist.dds
@@ -0,0 +1,17 @@
+Perl in general:
+Add ftw or find?
+Add a parsing mechanism (user specifies parse tree, perl parses).
+Arbitrary precision arithmetic.
+File calculus (e.g. file1 = file2 + file3, file1 =^ s/foo/bar/g etc.)
+
+MS-DOS version of Perl:
+Add interface to treat dBase files as associative arrays.
+Add int86x function.
+Handle the C preprocessor.
+Provide real pipes by switching the processes. (difficult)
+Provide a list of ioctl codes.
+Check the ioctl errno handling.
+I can't find an easy way in Perl to pass a number as the first argument
+ to ioctl. This is needed for some functions of ioctl. Either hack
+ ioctl, or change perl to ioctl interface. Another solution would be
+ a perl pseudo array containing the filehandles indexed by fd.
diff --git a/msdos/config.h b/msdos/config.h
new file mode 100644
index 0000000000..f664cdae3b
--- /dev/null
+++ b/msdos/config.h
@@ -0,0 +1,540 @@
+/* config.h
+ * This file is hand tailored for compiling under MS-DOS and MSC 5.1.
+ * Diomidis Spinellis, March 1990.
+ */
+
+
+/* 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:
+ * This symbol, if defined, indicates that the program is running under
+ * VMS. It is currently only set in conjunction with the EUNICE symbol.
+ */
+/*#undef EUNICE /**/
+/*#undef VMS /**/
+
+/* BIN:
+ * This symbol holds the name of the directory in which the user wants
+ * to put publicly executable images for the package in question. It
+ * is most often a local directory such as /usr/local/bin.
+ */
+#define BIN "/usr/local/bin" /**/
+
+/* BYTEORDER:
+ * This symbol contains an encoding of the order of bytes in a long.
+ * Usual values (in octal) are 01234, 04321, 02143, 03412...
+ */
+/* CHECK */
+#define BYTEORDER 0x1234 /**/
+
+/* 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 -{" or "/lib/cpp".
+ */
+/* 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 "".
+ */
+/* TODO */
+#define CPPSTDIN "cc -{"
+#define CPPMINUS ""
+
+/* BCMP:
+ * This symbol, if defined, indicates that the bcmp routine is available
+ * to compare blocks of memory. If undefined, use memcmp. If that's
+ * not available, roll your own.
+ */
+/*#define BCMP /**/
+
+/* BCOPY:
+ * This symbol, if defined, indicates that the bcopy routine is available
+ * to copy blocks of memory. Otherwise you should probably use memcpy().
+ */
+/*#define BCOPY /**/
+
+/* 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
+ * symbol.
+ */
+/*#define CHARSPRINTF /**/
+
+/* CRYPT:
+ * This symbol, if defined, indicates that the crypt routine is available
+ * to encrypt passwords and the like.
+ */
+/* TODO */
+/*#define CRYPT /**/
+
+/* 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
+ * setuid #! scripts because the kernel can't do it securely.
+ * It is up to the package designer to make sure that this emulation
+ * is done securely. Among other things, it should do an fstat on
+ * the script it just opened to make sure it really is a setuid/setgid
+ * script, it should make sure the arguments passed correspond exactly
+ * to the argument on the #! line, and it should not trust any
+ * subprocesses to which it must pass the filename rather than the
+ * file descriptor of the script to be executed.
+ */
+/*#define DOSUID /**/
+
+/* DUP2:
+ * This symbol, if defined, indicates that the dup2 routine is available
+ * to dup file descriptors. Otherwise you should use dup().
+ */
+#define DUP2 /**/
+
+/* FCHMOD:
+ * This symbol, if defined, indicates that the fchmod routine is available
+ * to change mode of opened files. If unavailable, use chmod().
+ */
+/*#define FCHMOD /**/
+
+/* FCHOWN:
+ * This symbol, if defined, indicates that the fchown routine is available
+ * to change ownership of opened files. If unavailable, use chown().
+ */
+/*#define FCHOWN /**/
+
+/* FCNTL:
+ * This symbol, if defined, indicates to the C program that it should
+ * include fcntl.h.
+ */
+/*#define FCNTL /**/
+
+/* FLOCK:
+ * This symbol, if defined, indicates that the flock() routine is
+ * available to do file locking.
+ */
+/*#define FLOCK /**/
+
+/* GETGROUPS:
+ * This symbol, if defined, indicates that the getgroups() routine is
+ * available to get the list of process groups. If unavailable, multiple
+ * groups are probably not supported.
+ */
+/*#define GETGROUPS /**/
+
+/* GETHOSTENT:
+ * This symbol, if defined, indicates that the gethostent() routine is
+ * available to lookup host names in some data base or other.
+ */
+/*#define GETHOSTENT /**/
+
+/* GETPGRP:
+ * This symbol, if defined, indicates that the getpgrp() routine is
+ * available to get the current process group.
+ */
+/*#define GETPGRP /**/
+
+/* GETPRIORITY:
+ * This symbol, if defined, indicates that the getpriority() routine is
+ * available to get a process's priority.
+ */
+/*#define GETPRIORITY /**/
+
+/* HTONS:
+ * This symbol, if defined, indicates that the htons routine (and friends)
+ * are available to do network order byte swapping.
+ */
+/* HTONL:
+ * This symbol, if defined, indicates that the htonl routine (and friends)
+ * are available to do network order byte swapping.
+ */
+/* NTOHS:
+ * This symbol, if defined, indicates that the ntohs routine (and friends)
+ * are available to do network order byte swapping.
+ */
+/* NTOHL:
+ * This symbol, if defined, indicates that the ntohl routine (and friends)
+ * are available to do network order byte swapping.
+ */
+/*#define HTONS /**/
+/*#define HTONL /**/
+/*#define NTOHS /**/
+/*#define NTOHL /**/
+
+/* 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.
+ */
+#define index strchr /* cultural */
+#define rindex strrchr /* differences? */
+
+/* IOCTL:
+ * This symbol, if defined, indicates that sys/ioctl.h exists and should
+ * be included.
+ */
+/*#define IOCTL /**/
+
+/* KILLPG:
+ * This symbol, if defined, indicates that the killpg routine is available
+ * to kill process groups. If unavailable, you probably should use kill
+ * with a negative process number.
+ */
+/*#define KILLPG /**/
+
+/* MEMCMP:
+ * This symbol, if defined, indicates that the memcmp routine is available
+ * to compare blocks of memory. If undefined, roll your own.
+ */
+#define MEMCMP /**/
+
+/* MEMCPY:
+ * This symbol, if defined, indicates that the memcpy routine is available
+ * to copy blocks of memory. Otherwise you should probably use bcopy().
+ * If neither is defined, roll your own.
+ */
+#define MEMCPY /**/
+
+/* MKDIR:
+ * This symbol, if defined, indicates that the mkdir routine is available
+ * to create directories. Otherwise you should fork off a new process to
+ * exec /bin/mkdir.
+ */
+#define MKDIR /**/
+
+/* NDBM:
+ * This symbol, if defined, indicates that ndbm.h exists and should
+ * be included.
+ */
+/*#define NDBM /**/
+
+/* ODBM:
+ * This symbol, if defined, indicates that dbm.h exists and should
+ * be included.
+ */
+/*#define ODBM /**/
+
+/* READDIR:
+ * This symbol, if defined, indicates that the readdir routine is available
+ * from the C library to create directories.
+ */
+#define READDIR /**/
+
+/* RENAME:
+ * This symbol, if defined, indicates that the rename routine is available
+ * to rename files. Otherwise you should do the unlink(), link(), unlink()
+ * trick.
+ */
+#define RENAME /**/
+
+/* RMDIR:
+ * This symbol, if defined, indicates that the rmdir routine is available
+ * to remove directories. Otherwise you should fork off a new process to
+ * exec /bin/rmdir.
+ */
+#define RMDIR /**/
+
+/* SETEGID:
+ * This symbol, if defined, indicates that the setegid routine is available
+ * to change the effective gid of the current program.
+ */
+/*#define SETEGID /**/
+
+/* SETEUID:
+ * This symbol, if defined, indicates that the seteuid routine is available
+ * to change the effective uid of the current program.
+ */
+/*#define SETEUID /**/
+
+/* SETPGRP:
+ * This symbol, if defined, indicates that the setpgrp() routine is
+ * available to set the current process group.
+ */
+/*#define SETPGRP /**/
+
+/* SETPRIORITY:
+ * This symbol, if defined, indicates that the setpriority() routine is
+ * available to set a process's priority.
+ */
+/*#define SETPRIORITY /**/
+
+/* SETREGID:
+ * This symbol, if defined, indicates that the setregid routine is available
+ * to change the real and effective gid of the current program.
+ */
+/*#define SETREGID /**/
+
+/* SETREUID:
+ * This symbol, if defined, indicates that the setreuid routine is available
+ * to change the real and effective uid of the current program.
+ */
+/*#define SETREUID /**/
+
+/* SETRGID:
+ * This symbol, if defined, indicates that the setrgid routine is available
+ * to change the real gid of the current program.
+ */
+/*#define SETRGID /**/
+
+/* SETRUID:
+ * This symbol, if defined, indicates that the setruid routine is available
+ * to change the real uid of the current program.
+ */
+/*#define SETRUID /**/
+
+/* SOCKET:
+ * This symbol, if defined, indicates that the BSD socket interface is
+ * supported.
+ */
+/* SOCKETPAIR:
+ * This symbol, if defined, indicates that the BSD socketpair call is
+ * supported.
+ */
+/* 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.
+ */
+/*#undef SOCKET /**/
+
+/*#undef SOCKETPAIR /**/
+
+/*#undef OLDSOCKET /**/
+
+/* STATBLOCKS:
+ * This symbol is defined if this system has a stat structure declaring
+ * st_blksize and st_blocks.
+ */
+/*#define STATBLOCKS /**/
+
+/* STDSTDIO:
+ * This symbol is defined if this system has a FILE structure declaring
+ * _ptr and _cnt in stdio.h.
+ */
+#define STDSTDIO /**/
+
+/* STRUCTCOPY:
+ * This symbol, if defined, indicates that this C compiler knows how
+ * to copy structures. If undefined, you'll need to use a block copy
+ * routine of some sort instead.
+ */
+#define STRUCTCOPY /**/
+
+/* SYMLINK:
+ * This symbol, if defined, indicates that the symlink routine is available
+ * to create symbolic links.
+ */
+/*#define SYMLINK /**/
+
+/* SYSCALL:
+ * This symbol, if defined, indicates that the syscall routine is available
+ * to call arbitrary system calls. If undefined, that's tough.
+ */
+/*#define SYSCALL /**/
+
+/* TMINSYS:
+ * This symbol is defined if this system declares "struct tm" in
+ * in <sys/time.h> rather than <time.h>. We can't just say
+ * -I/usr/include/sys because some systems have both time files, and
+ * the -I trick gets the wrong one.
+ */
+/* I_SYSTIME:
+ * This symbol is defined if this system has the file <sys/time.h>.
+ */
+/*
+ * I_TIME:
+ * This symbol is defined if time this system has the file <time.h>.
+ */
+/*#undef TMINSYS /**/
+/*#define I_SYSTIME /**/
+#define I_TIME
+
+/* VARARGS:
+ * This symbol, if defined, indicates to the C program that it should
+ * include varargs.h.
+ */
+#define VARARGS /**/
+
+/* vfork:
+ * This symbol, if defined, remaps the vfork routine to fork if the
+ * vfork() routine isn't supported here.
+ */
+/*#undef vfork fork /**/
+
+/* 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.
+ */
+#define VOIDSIG /**/
+
+/* 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:
+ * 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 VPRINTF /**/
+/*#undef CHARVSPRINTF /**/
+
+/* GIDTYPE:
+ * This symbol has a value like gid_t, int, ushort, or whatever type is
+ * used to declare group ids in the kernel.
+ */
+/* TODO */
+#define GIDTYPE int /**/
+
+/* I_DIRENT:
+ * This symbol, if defined, indicates to the C program that it should
+ * include dirent.h.
+ */
+/* DIRNAMLEN:
+ * This symbol, if defined, indicates to the C program that the length
+ * of directory entry names is provided by a d_namlen field. Otherwise
+ * you need to do strlen() on the d_name field.
+ */
+/*#undef I_DIRENT /**/
+#define DIRNAMLEN /**/
+
+/* I_FCNTL:
+ * This symbol, if defined, indicates to the C program that it should
+ * include fcntl.h.
+ */
+#define I_FCNTL /**/
+
+/* I_GRP:
+ * This symbol, if defined, indicates to the C program that it should
+ * include grp.h.
+ */
+/*#define I_GRP /**/
+
+/* I_PWD:
+ * This symbol, if defined, indicates to the C program that it should
+ * include pwd.h.
+ */
+/* PWQUOTA:
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_quota.
+ */
+/* PWAGE:
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_age.
+ */
+/*#define I_PWD /**/
+/*#define PWQUOTA /**/
+/*#undef PWAGE /**/
+
+/* I_SYSDIR:
+ * This symbol, if defined, indicates to the C program that it should
+ * include sys/dir.h.
+ */
+#define I_SYSDIR /**/
+
+/* I_SYSIOCTL:
+ * This symbol, if defined, indicates that sys/ioctl.h exists and should
+ * be included.
+ */
+/*#define I_SYSIOCTL /**/
+
+/* I_VARARGS:
+ * This symbol, if defined, indicates to the C program that it should
+ * include varargs.h.
+ */
+#define I_VARARGS /**/
+
+/* INTSIZE:
+ * This symbol contains the size of an int, so that the C preprocessor
+ * can make decisions based on it.
+ */
+#define INTSIZE 2 /**/
+
+/* RANDBITS:
+ * This symbol contains the number of bits of random number the rand()
+ * function produces. Usual values are 15, 16, and 31.
+ */
+#define RANDBITS 31 /**/
+
+/* SIG_NAME:
+ * This symbol contains an list of signal names in order.
+ */
+#define SIG_NAME
+ "ZERO","HUP","INT","QUIT","ILL","TRAP","IOT","EMT","FPE","KILL","BUS","SEGV","S
+YS","PIPE","ALRM","TERM","URG","STOP","TSTP","CONT","CHLD","TTIN","TTOU","IO","X
+CPU","XFSZ","VTALRM","PROF","WINCH","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".
+ */
+#define STDCHAR char /**/
+
+/* UIDTYPE:
+ * This symbol has a value like uid_t, int, ushort, or whatever type is
+ * used to declare user ids in the kernel.
+ */
+#define UIDTYPE int /**/
+
+/* VOIDFLAGS:
+ * This symbol indicates how much support of the void type is given by this
+ * compiler. What various bits mean:
+ *
+ * 1 = supports declaration of void
+ * 2 = supports arrays of pointers to functions returning void
+ * 4 = supports comparisons between pointers to void functions and
+ * addresses of void functions
+ *
+ * The package designer should define VOIDUSED to indicate the requirements
+ * of the package. This can be done either by #defining VOIDUSED before
+ * including config.h, or by defining defvoidused in Myinit.U. If the
+ * latter approach is taken, only those flags will be tested. If the
+ * level of void support necessary is not present, defines void to int.
+ */
+#ifndef VOIDUSED
+#define VOIDUSED 7
+#endif
+#define VOIDFLAGS 7
+#if (VOIDFLAGS & VOIDUSED) != VOIDUSED
+#define void int /* is void to be avoided? */
+#define M_VOID /* Xenix strikes again */
+#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.
+ */
+#define PRIVLIB "/usr/local/lib/perl" /**/
+
+/*
+ * BUGGY_MSC:
+ * This symbol is defined if you are the unfortunate owner of a buggy
+ * Microsoft C compiler and want to use intrinsic functions. Versions
+ * up to 5.1 are known conform to this definition.
+ */
+#define BUGGY_MSC /**/
+
+/*
+ * BINARY:
+ * This symbol is defined if you run under an operating system that
+ * distinguishes between binary and text files. If so the function
+ * setmode will be used to set the file into binary mode.
+ */
+#define BINARY
+
+#define S_ISUID 0
+#define S_ISGID 0
+#define CASTNEGFLOAT
diff --git a/patchlevel.h b/patchlevel.h
index 69d9c2fd72..29d912735e 100644
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -1 +1 @@
-#define PATCHLEVEL 15
+#define PATCHLEVEL 16