summaryrefslogtreecommitdiff
path: root/msdos
diff options
context:
space:
mode:
Diffstat (limited to 'msdos')
-rw-r--r--msdos/README.msdos80
-rw-r--r--msdos/chdir.c96
-rw-r--r--msdos/config.h734
-rw-r--r--msdos/dir.h5
-rw-r--r--msdos/directory.c8
-rw-r--r--msdos/msdos.c35
-rw-r--r--msdos/popen.c17
-rw-r--r--msdos/usage.c51
8 files changed, 794 insertions, 232 deletions
diff --git a/msdos/README.msdos b/msdos/README.msdos
index 2d6a276b78..3a5c38fcae 100644
--- a/msdos/README.msdos
+++ b/msdos/README.msdos
@@ -113,3 +113,83 @@ front of %0.bat).
Myrsinis 1
GR-145 62 Kifissia
Greece
+
+--------------------------------------------------------------------------
+
+ Revisions to the MS-DOS support in Perl 4.0
+ Tom Dinger, 18 March 1991
+
+The DOS compatibility added to Perl sometime in release 3.x was not
+maintained, and Perl as distributed could not be built without changes.
+
+Both myself and Len Reed more or less "rediscovered" how to get Perl built
+and running reliably for MS-DOS, using the Microsoft C compiler. He and I
+have communicated, and will be putting together additional patches for the
+DOS version of Perl.
+
+1. Compiling Perl
+
+ For now, I have not supplied a makefile, as there is no standard for
+ make utilities under DOS. All the files can be compiled with Microsoft
+ C 5.1, using the switches "-AL -Ox" for Large memory model, maximum
+ optimization (this turned out a few code generation bugs in MSC 5.1).
+ The code will also compile with MSC 6.00A, with the optimization
+ "-Oacegils /Gs" for all files (regcomp.c has special case code to change
+ the aliasing optimizations).
+
+ Generally, you follow the instructions given above to compile and build
+ Perl 4.0 for DOS. I used the output of SunOS yacc run on perly.y,
+ without modification, but I expect both Bison and Berkeley-YACC will work
+ also. From inspection of the generated code, however, I believe AT&T
+ derived YACC produces the smallest tables, i.e. uses the least memory.
+ This is important for a 300K executable file.
+
+2. Editing in-place.
+
+ You will need the file suffix.c from the os2 subdirectory -- it will
+ create a backup file with much less danger for DOS.
+
+3. A "Smarter" chdir() function.
+
+ I have added to the DOS version of Perl 4.0 a replacement chdir()
+ function. Unlike the "normal" behavior, it is aware of drive letters
+ at the start of paths for DOS. So for example:
+
+ perl_chdir( "B:" ) changes to the default directory, on drive B:
+ perl_chdir( "C:\FOO" ) changes to the specified directory, on drive C:
+ perl_chdir( "\BAR" ) changes to the specified directory on the
+ current drive.
+
+4. *.BAT Scripts as Perl scripts
+
+ The strategy described above for turning a Perl script into a *.BAT
+ script do not work. I have been using the following lines at the
+ beginning of a Perl *.BAT script:
+
+ @REM=(qq!
+ @perl -S %0.bat %1 %2 %3 %4 %5 %6 %7 %8 %9
+ @goto end !) if 0 ;
+
+ and the following at the end of the *.BAT script:
+
+ @REM=(qq!
+ :end !) if 0 ;
+
+ If you like, with the proper editor you can replace the four '!'
+ characters with some untypeable character, such as Ctrl-A. This will
+ allow you to pass any characters, including ".." strings as arguments.
+
+4. Things to Come
+
+ * Better temporary file handling.
+ * A real Makefile -- Len Reed has one for Dmake 3.6
+ * Swapping code -- swaps most of Perl out of memory (to EMS, XMS or
+ disk) before running a sub-program or pipe.
+ * MKS command line support, both into Perl, and to other programs
+ spawned by Perl.
+ * Smarter pipe functions, not using COMMAND.COM.
+
+
+ Tom Dinger
+ tdinger@East.Sun.COM
+ Martch 18, 1991
diff --git a/msdos/chdir.c b/msdos/chdir.c
new file mode 100644
index 0000000000..6954f9853e
--- /dev/null
+++ b/msdos/chdir.c
@@ -0,0 +1,96 @@
+/*
+ * (C) Copyright 1990, 1991 Tom Dinger
+ *
+ * You may distribute under the terms of the GNU General Public License
+ * as specified in the README file that comes with the perl 4.0 kit.
+ *
+ */
+
+/*
+ * A "DOS-aware" chdir() function, that will change current drive as well.
+ *
+ * chdir( "B:" ) -- changes to the default directory, on drive B:
+ * chdir( "C:\FOO" ) changes to the specified directory, on drive C:
+ * chdir( "\BAR" ) changes to the specified directory on the current
+ * drive.
+ */
+
+#include <stdlib.h>
+#include <ctype.h>
+#include <direct.h>
+#include <dos.h>
+#include <errno.h>
+
+#include "config.h"
+#ifdef chdir
+#undef chdir
+#endif
+
+/* We should have the line:
+ *
+ * #define chdir perl_chdir
+ *
+ * in some header for perl (I put it in config.h) so that all
+ * references to chdir() become references to this function.
+ */
+
+/*------------------------------------------------------------------*/
+
+#if defined(BUGGY_MSC5) /* only needed for MSC 5.1 */
+
+int _chdrive( int drivenum )
+{
+unsigned int ndrives;
+unsigned int tmpdrive;
+
+
+_dos_setdrive( drivenum, &ndrives );
+
+/* check for illegal drive letter */
+_dos_getdrive( &tmpdrive );
+
+return (tmpdrive != drivenum) ? -1 : 0 ;
+}
+
+#endif
+
+/*-----------------------------------------------------------------*/
+
+int perl_chdir( char * path )
+{
+int drive_letter;
+unsigned int drivenum;
+
+
+if ( path && *path && (path[1] == ':') )
+ {
+ /* The path starts with a drive letter */
+ /* Change current drive */
+ drive_letter = *path;
+ if ( isalpha(drive_letter) )
+ {
+ /* Drive letter legal */
+ if ( islower(drive_letter) )
+ drive_letter = toupper(drive_letter);
+ drivenum = drive_letter - 'A' + 1;
+
+ /* Change drive */
+ if ( _chdrive( drivenum ) == -1 )
+ {
+ /* Drive change failed -- must be illegal drive letter */
+ errno = ENODEV;
+ return -1;
+ }
+
+ /* Now see if that's all we do */
+ if ( ! path[2] )
+ return 0; /* no path after drive -- all done */
+ }
+ /* else drive letter illegal -- fall into "normal" chdir */
+ }
+
+/* Here with some path as well */
+return chdir( path );
+
+/* end perl_chdir() */
+}
diff --git a/msdos/config.h b/msdos/config.h
index f664cdae3b..f6998ea54f 100644
--- a/msdos/config.h
+++ b/msdos/config.h
@@ -1,81 +1,135 @@
+#ifndef config_h
+#define config_h
/* config.h
- * This file is hand tailored for compiling under MS-DOS and MSC 5.1.
- * Diomidis Spinellis, March 1990.
+ *
+ * This file is hand tailored for MS-DOS and MSC 5.1 and 6.00A.
+ * Tom Dinger, March 1991.
+ */
+
+
+/*
+ * BUGGY_MSC5:
+ * This symbol is defined if you are the unfortunate owner of the buggy
+ * Microsoft C compiler version 5.1. It is used as a conditional to
+ * guard code sections that are known to break this compiler.
+ * BUGGY_MSC6:
+ * This symbol is defined if you are the unfortunate owner of the buggy
+ * Microsoft C compiler version 6.0A. It is used as a conditional to
+ * guard code sections that are known to break this compiler.
*/
+#define BUGGY_MSC5 /**/
+/*#undef BUGGY_MSC6 /**/
-/* EUNICE:
+/* EUNICE
* This symbol, if defined, indicates that the program is being compiled
* under the EUNICE package under VMS. The program will need to handle
* things like files that don't go away the first time you unlink them,
* due to version numbering. It will also need to compensate for lack
* of a respectable link() command.
*/
-/* VMS:
+/* VMS
* This symbol, if defined, indicates that the program is running under
* VMS. It is currently only set in conjunction with the EUNICE symbol.
*/
/*#undef EUNICE /**/
/*#undef VMS /**/
-/* BIN:
+/* ALIGNBYTES
+ * This symbol contains the number of bytes required to align a double.
+ * Usual values are 2, 4, and 8.
+ */
+#define ALIGNBYTES 4 /**/
+
+/* BIN
* This symbol holds the name of the directory in which the user wants
* to put publicly executable images for the package in question. It
* is most often a local directory such as /usr/local/bin.
*/
#define BIN "/usr/local/bin" /**/
-/* BYTEORDER:
+/* BYTEORDER
* This symbol contains an encoding of the order of bytes in a long.
* Usual values (in octal) are 01234, 04321, 02143, 03412...
*/
-/* CHECK */
#define BYTEORDER 0x1234 /**/
-/* CPPSTDIN:
+/* CPPSTDIN
* This symbol contains the first part of the string which will invoke
* the C preprocessor on the standard input and produce to standard
- * output. Typical value of "cc -{" or "/lib/cpp".
+ * output. Typical value of "cc -E" or "/lib/cpp".
*/
-/* CPPMINUS:
+/* CPPMINUS
* This symbol contains the second part of the string which will invoke
* the C preprocessor on the standard input and produce to standard
* output. This symbol will have the value "-" if CPPSTDIN needs a minus
* to specify standard input, otherwise the value is "".
*/
-/* TODO */
-#define CPPSTDIN "cc -{"
+/* TODO: doesn't work for MSC -- it's more complicated than this */
+#define CPPSTDIN "cl "
#define CPPMINUS ""
-/* BCMP:
+/* HAS_BCMP
* This symbol, if defined, indicates that the bcmp routine is available
* to compare blocks of memory. If undefined, use memcmp. If that's
* not available, roll your own.
*/
-/*#define BCMP /**/
+/*#undef HAS_BCMP /**/
-/* BCOPY:
+/* HAS_BCOPY
* This symbol, if defined, indicates that the bcopy routine is available
* to copy blocks of memory. Otherwise you should probably use memcpy().
*/
-/*#define BCOPY /**/
+/*#undef 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.
+ */
+/*#undef HAS_BZERO /**/
-/* CHARSPRINTF:
+/* CASTNEGFLOAT
+ * This symbol, if defined, indicates that this C compiler knows how to
+ * cast negative or large floating point numbers to unsigned longs, ints
+ * and shorts.
+ */
+/* CASTFLAGS
+ * This symbol contains flags that say what difficulties the compiler
+ * has casting odd floating values to unsigned long:
+ * 1 = couldn't cast < 0
+ * 2 = couldn't cast >= 0x80000000
+ */
+#define CASTNEGFLOAT /**/
+#define CASTFLAGS 0 /**/
+
+/* CHARSPRINTF
* This symbol is defined if this system declares "char *sprintf()" in
* stdio.h. The trend seems to be to declare it as "int sprintf()". It
* is up to the package author to declare sprintf correctly based on the
* symbol.
*/
-/*#define CHARSPRINTF /**/
+/*#undef CHARSPRINTF /**/
+
+/* 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.
+ */
+#define HAS_CHSIZE /**/
-/* CRYPT:
+/* HAS_CRYPT
* This symbol, if defined, indicates that the crypt routine is available
* to encrypt passwords and the like.
*/
-/* TODO */
-/*#define CRYPT /**/
+/*#undef HAS_CRYPT /**/
+
+/* CSH
+ * This symbol, if defined, indicates that the C-shell exists.
+ * If defined, contains the full pathname of csh.
+ */
+/*#undef CSH "/usr/bin/csh" /**/
-/* DOSUID:
+/* DOSUID
* This symbol, if defined, indicates that the C program should
* check the script that it is executing for setuid/setgid bits, and
* attempt to emulate setuid/setgid on systems that have disabled
@@ -88,406 +142,637 @@
* subprocesses to which it must pass the filename rather than the
* file descriptor of the script to be executed.
*/
-/*#define DOSUID /**/
+/*#undef DOSUID /**/
-/* DUP2:
+/* HAS_DUP2
* This symbol, if defined, indicates that the dup2 routine is available
* to dup file descriptors. Otherwise you should use dup().
*/
-#define DUP2 /**/
+#define HAS_DUP2 /**/
-/* FCHMOD:
+/* HAS_FCHMOD
* This symbol, if defined, indicates that the fchmod routine is available
* to change mode of opened files. If unavailable, use chmod().
*/
-/*#define FCHMOD /**/
+/*#undef HAS_FCHMOD /**/
-/* FCHOWN:
+/* HAS_FCHOWN
* This symbol, if defined, indicates that the fchown routine is available
* to change ownership of opened files. If unavailable, use chown().
*/
-/*#define FCHOWN /**/
+/*#undef HAS_FCHOWN /**/
-/* FCNTL:
- * This symbol, if defined, indicates to the C program that it should
- * include fcntl.h.
+/* HAS_FCNTL
+ * This symbol, if defined, indicates to the C program that
+ * the fcntl() function exists.
*/
-/*#define FCNTL /**/
+/*#undef HAS_FCNTL /**/
-/* FLOCK:
+/* FLEXFILENAMES
+ * This symbol, if defined, indicates that the system supports filenames
+ * longer than 14 characters.
+ */
+/*#undef FLEXFILENAMES /**/
+
+/* HAS_FLOCK
* This symbol, if defined, indicates that the flock() routine is
* available to do file locking.
*/
-/*#define FLOCK /**/
+/*#undef HAS_FLOCK /**/
-/* GETGROUPS:
+/* HAS_GETGROUPS
* This symbol, if defined, indicates that the getgroups() routine is
* available to get the list of process groups. If unavailable, multiple
* groups are probably not supported.
*/
-/*#define GETGROUPS /**/
+/*#undef HAS_GETGROUPS /**/
-/* GETHOSTENT:
+/* HAS_GETHOSTENT
* This symbol, if defined, indicates that the gethostent() routine is
* available to lookup host names in some data base or other.
*/
-/*#define GETHOSTENT /**/
+/*#undef HAS_GETHOSTENT /**/
-/* GETPGRP:
+/* HAS_GETPGRP
* This symbol, if defined, indicates that the getpgrp() routine is
* available to get the current process group.
*/
-/*#define GETPGRP /**/
+/*#undef HAS_GETPGRP /**/
-/* GETPRIORITY:
+/* 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 /**/
+
+/* HAS_GETPRIORITY
* This symbol, if defined, indicates that the getpriority() routine is
* available to get a process's priority.
*/
-/*#define GETPRIORITY /**/
+/*#undef HAS_GETPRIORITY /**/
-/* HTONS:
+/* HAS_HTONS
* This symbol, if defined, indicates that the htons routine (and friends)
* are available to do network order byte swapping.
*/
-/* HTONL:
+/* HAS_HTONL
* This symbol, if defined, indicates that the htonl routine (and friends)
* are available to do network order byte swapping.
*/
-/* NTOHS:
+/* HAS_NTOHS
* This symbol, if defined, indicates that the ntohs routine (and friends)
* are available to do network order byte swapping.
*/
-/* NTOHL:
+/* HAS_NTOHL
* This symbol, if defined, indicates that the ntohl routine (and friends)
* are available to do network order byte swapping.
*/
-/*#define HTONS /**/
-/*#define HTONL /**/
-/*#define NTOHS /**/
-/*#define NTOHL /**/
+/*#undef HAS_HTONS /**/
+/*#undef HAS_HTONL /**/
+/*#undef HAS_NTOHS /**/
+/*#undef HAS_NTOHL /**/
-/* index:
+/* index
* This preprocessor symbol is defined, along with rindex, if the system
* uses the strchr and strrchr routines instead.
*/
-/* rindex:
+/* rindex
* This preprocessor symbol is defined, along with index, if the system
* uses the strchr and strrchr routines instead.
*/
#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:
+/* HAS_KILLPG
* This symbol, if defined, indicates that the killpg routine is available
* to kill process groups. If unavailable, you probably should use kill
* with a negative process number.
*/
-/*#define KILLPG /**/
+/*#undef HAS_KILLPG /**/
-/* MEMCMP:
+/* HAS_LSTAT
+ * This symbol, if defined, indicates that the lstat() routine is
+ * available to stat symbolic links.
+ */
+/*#undef HAS_LSTAT /**/
+
+/* HAS_MEMCMP
* This symbol, if defined, indicates that the memcmp routine is available
* to compare blocks of memory. If undefined, roll your own.
*/
-#define MEMCMP /**/
+#define HAS_MEMCMP /**/
-/* MEMCPY:
+/* HAS_MEMCPY
* This symbol, if defined, indicates that the memcpy routine is available
* to copy blocks of memory. Otherwise you should probably use bcopy().
* If neither is defined, roll your own.
*/
-#define MEMCPY /**/
+#define HAS_MEMCPY /**/
-/* MKDIR:
+/* HAS_MKDIR
* This symbol, if defined, indicates that the mkdir routine is available
* to create directories. Otherwise you should fork off a new process to
* exec /bin/mkdir.
*/
-#define MKDIR /**/
+#define HAS_MKDIR /**/
+
+/* HAS_MSG
+ * This symbol, if defined, indicates that the entire msg*(2) library is
+ * supported.
+ */
+/*#undef HAS_MSG /**/
+
+/* HAS_MSGCTL
+ * This symbol, if defined, indicates that the msgctl() routine is
+ * available to stat symbolic links.
+ */
+/*#undef HAS_MSGCTL /**/
+
+/* HAS_MSGGET
+ * This symbol, if defined, indicates that the msgget() routine is
+ * available to stat symbolic links.
+ */
+/*#undef HAS_MSGGET /**/
+
+/* HAS_MSGRCV
+ * This symbol, if defined, indicates that the msgrcv() routine is
+ * available to stat symbolic links.
+ */
+/*#undef HAS_MSGRCV /**/
+
+/* HAS_MSGSND
+ * This symbol, if defined, indicates that the msgsnd() routine is
+ * available to stat symbolic links.
+ */
+/*#undef HAS_MSGSND /**/
-/* NDBM:
+/* HAS_NDBM
* This symbol, if defined, indicates that ndbm.h exists and should
* be included.
*/
-/*#define NDBM /**/
+/*#undef HAS_NDBM /**/
-/* ODBM:
+/* HAS_ODBM
* This symbol, if defined, indicates that dbm.h exists and should
* be included.
*/
-/*#define ODBM /**/
+/*#undef HAS_ODBM /**/
+
+/* HAS_OPEN3
+ * This manifest constant lets the C program know that the three
+ * argument form of open(2) is available.
+ */
+#define HAS_OPEN3 /**/
-/* READDIR:
+/* HAS_READDIR
* This symbol, if defined, indicates that the readdir routine is available
- * from the C library to create directories.
+ * from the C library to read directories.
*/
-#define READDIR /**/
+#define HAS_READDIR /**/
-/* RENAME:
+/* HAS_RENAME
* This symbol, if defined, indicates that the rename routine is available
* to rename files. Otherwise you should do the unlink(), link(), unlink()
* trick.
*/
-#define RENAME /**/
+#define HAS_RENAME /**/
-/* RMDIR:
+/* HAS_RMDIR
* This symbol, if defined, indicates that the rmdir routine is available
* to remove directories. Otherwise you should fork off a new process to
* exec /bin/rmdir.
*/
-#define RMDIR /**/
+#define HAS_RMDIR /**/
+
+/* HAS_SELECT
+ * This symbol, if defined, indicates that the select() subroutine
+ * exists.
+ */
+/*#undef HAS_SELECT /**/
+
+/* HAS_SEM
+ * This symbol, if defined, indicates that the entire sem*(2) library is
+ * supported.
+ */
+/*#undef HAS_SEM /**/
-/* SETEGID:
+/* HAS_SEMCTL
+ * This symbol, if defined, indicates that the semctl() routine is
+ * available to stat symbolic links.
+ */
+/*#undef HAS_SEMCTL /**/
+
+/* HAS_SEMGET
+ * This symbol, if defined, indicates that the semget() routine is
+ * available to stat symbolic links.
+ */
+/*#undef HAS_SEMGET /**/
+
+/* HAS_SEMOP
+ * This symbol, if defined, indicates that the semop() routine is
+ * available to stat symbolic links.
+ */
+/*#undef HAS_SEMOP /**/
+
+/* HAS_SETEGID
* This symbol, if defined, indicates that the setegid routine is available
* to change the effective gid of the current program.
*/
-/*#define SETEGID /**/
+/*#undef HAS_SETEGID /**/
-/* SETEUID:
+/* HAS_SETEUID
* This symbol, if defined, indicates that the seteuid routine is available
* to change the effective uid of the current program.
*/
-/*#define SETEUID /**/
+/*#undef HAS_SETEUID /**/
-/* SETPGRP:
+/* HAS_SETPGRP
* This symbol, if defined, indicates that the setpgrp() routine is
* available to set the current process group.
*/
-/*#define SETPGRP /**/
+/*#undef HAS_SETPGRP /**/
+
+/* 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 /**/
-/* SETPRIORITY:
+/* HAS_SETPRIORITY
* This symbol, if defined, indicates that the setpriority() routine is
* available to set a process's priority.
*/
-/*#define SETPRIORITY /**/
+/*#undef HAS_SETPRIORITY /**/
-/* SETREGID:
- * This symbol, if defined, indicates that the setregid routine is available
- * to change the real and effective gid of the current program.
+/* HAS_SETREGID
+ * This symbol, if defined, indicates that the setregid routine is
+ * available to change the real and effective gid of the current program.
*/
-/*#define SETREGID /**/
+/* HAS_SETRESGID
+ * This symbol, if defined, indicates that the setresgid routine is
+ * available to change the real, effective and saved gid of the current
+ * program.
+ */
+/*#undef HAS_SETREGID /**/
+/*#undef HAS_SETRESGID /**/
-/* SETREUID:
- * This symbol, if defined, indicates that the setreuid routine is available
- * to change the real and effective uid of the current program.
+/* HAS_SETREUID
+ * This symbol, if defined, indicates that the setreuid routine is
+ * available to change the real and effective uid of the current program.
+ */
+/* HAS_SETRESUID
+ * This symbol, if defined, indicates that the setresuid routine is
+ * available to change the real, effective and saved uid of the current
+ * program.
*/
-/*#define SETREUID /**/
+/*#undef HAS_SETREUID /**/
+/*#undef HAS_SETRESUID /**/
-/* SETRGID:
+/* HAS_SETRGID
* This symbol, if defined, indicates that the setrgid routine is available
* to change the real gid of the current program.
*/
-/*#define SETRGID /**/
+/*#undef HAS_SETRGID /**/
-/* SETRUID:
+/* HAS_SETRUID
* This symbol, if defined, indicates that the setruid routine is available
* to change the real uid of the current program.
*/
-/*#define SETRUID /**/
+/*#undef HAS_SETRUID /**/
-/* SOCKET:
- * This symbol, if defined, indicates that the BSD socket interface is
- * supported.
+/* HAS_SHM
+ * This symbol, if defined, indicates that the entire shm*(2) library is
+ * supported.
*/
-/* SOCKETPAIR:
- * This symbol, if defined, indicates that the BSD socketpair call is
- * supported.
+/*#undef HAS_SHM /**/
+
+/* HAS_SHMAT
+ * This symbol, if defined, indicates that the shmat() routine is
+ * available to stat symbolic links.
*/
-/* 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 HAS_SHMAT /**/
+
+/* HAS_SHMCTL
+ * This symbol, if defined, indicates that the shmctl() routine is
+ * available to stat symbolic links.
*/
-/*#undef SOCKET /**/
+/*#undef HAS_SHMCTL /**/
-/*#undef SOCKETPAIR /**/
+/* HAS_SHMDT
+ * This symbol, if defined, indicates that the shmdt() routine is
+ * available to stat symbolic links.
+ */
+/*#undef HAS_SHMDT /**/
-/*#undef OLDSOCKET /**/
+/* HAS_SHMGET
+ * This symbol, if defined, indicates that the shmget() routine is
+ * available to stat symbolic links.
+ */
+/*#undef HAS_SHMGET /**/
-/* STATBLOCKS:
+/* 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
+ * 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 HAS_SOCKET /**/
+
+/*#undef HAS_SOCKETPAIR /**/
+
+/*#undef OLDSOCKET /**/
+
+/* STATBLOCKS
* This symbol is defined if this system has a stat structure declaring
* st_blksize and st_blocks.
*/
-/*#define STATBLOCKS /**/
+/*#undef STATBLOCKS /**/
-/* STDSTDIO:
+/* STDSTDIO
* This symbol is defined if this system has a FILE structure declaring
* _ptr and _cnt in stdio.h.
+ *
+ * NOTE: [Tom Dinger, 23 February 1991] You also need the _filbuf()
+ * function, usually referred to by the getc() macro in stdio.h.
*/
#define STDSTDIO /**/
-/* STRUCTCOPY:
+/* STRUCTCOPY
* This symbol, if defined, indicates that this C compiler knows how
* to copy structures. If undefined, you'll need to use a block copy
* routine of some sort instead.
*/
#define STRUCTCOPY /**/
-/* SYMLINK:
+/* HAS_STRERROR
+ * This symbol, if defined, indicates that the strerror() routine is
+ * available to translate error numbers to strings.
+ */
+#define HAS_STRERROR /**/
+
+/* HAS_SYMLINK
* This symbol, if defined, indicates that the symlink routine is available
* to create symbolic links.
*/
-/*#define SYMLINK /**/
+/*#undef HAS_SYMLINK /**/
-/* SYSCALL:
+/* HAS_SYSCALL
* This symbol, if defined, indicates that the syscall routine is available
* to call arbitrary system calls. If undefined, that's tough.
*/
-/*#define SYSCALL /**/
-
-/* TMINSYS:
- * This symbol is defined if this system declares "struct tm" in
- * in <sys/time.h> rather than <time.h>. We can't just say
- * -I/usr/include/sys because some systems have both time files, and
- * the -I trick gets the wrong one.
- */
-/* I_SYSTIME:
- * This symbol is defined if this system has the file <sys/time.h>.
- */
-/*
- * I_TIME:
- * This symbol is defined if time this system has the file <time.h>.
- */
-/*#undef TMINSYS /**/
-/*#define I_SYSTIME /**/
-#define I_TIME
+/*#undef HAS_SYSCALL /**/
-/* VARARGS:
- * This symbol, if defined, indicates to the C program that it should
- * include varargs.h.
+/* HAS_TRUNCATE
+ * This symbol, if defined, indicates that the truncate routine is
+ * available to truncate files.
*/
-#define VARARGS /**/
+/*#undef HAS_TRUNCATE /**/
-/* vfork:
- * This symbol, if defined, remaps the vfork routine to fork if the
- * vfork() routine isn't supported here.
+/* HAS_VFORK
+ * This symbol, if defined, indicates that vfork() exists.
*/
-/*#undef vfork fork /**/
+/*#undef HAS_VFORK /**/
-/* VOIDSIG:
+/* VOIDSIG
* This symbol is defined if this system declares "void (*signal())()" in
* signal.h. The old way was to declare it as "int (*signal())()". It
* is up to the package author to declare things correctly based on the
* symbol.
*/
+/* TO_SIGNAL
+ * This symbol's value is either "void" or "int", corresponding to the
+ * appropriate return "type" of a signal handler. Thus, one can declare
+ * a signal handler using "TO_SIGNAL (*handler())()", and define the
+ * handler using "TO_SIGNAL handler(sig)".
+ */
#define VOIDSIG /**/
+#define TO_SIGNAL int /**/
+
+/* HASVOLATILE
+ * This symbol, if defined, indicates that this C compiler knows about
+ * the volatile declaration.
+ */
+/*#undef HASVOLATILE /**/
-/* VPRINTF:
+/* HAS_VPRINTF
* This symbol, if defined, indicates that the vprintf routine is available
* to printf with a pointer to an argument list. If unavailable, you
* may need to write your own, probably in terms of _doprnt().
*/
-/* CHARVSPRINTF:
+/* CHARVSPRINTF
* This symbol is defined if this system has vsprintf() returning type
* (char*). The trend seems to be to declare it as "int vsprintf()". It
* is up to the package author to declare vsprintf correctly based on the
* symbol.
*/
-#define VPRINTF /**/
+#define HAS_VPRINTF /**/
/*#undef CHARVSPRINTF /**/
-/* GIDTYPE:
+/* HAS_WAIT4
+ * This symbol, if defined, indicates that wait4() exists.
+ */
+/*#undef HAS_WAIT4 /**/
+
+/* HAS_WAITPID
+ * This symbol, if defined, indicates that waitpid() exists.
+ */
+/*#undef HAS_WAITPID /**/
+
+/* GIDTYPE
* This symbol has a value like gid_t, int, ushort, or whatever type is
* used to declare group ids in the kernel.
*/
-/* 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.
+/* I_FCNTL
+ * This manifest constant tells the C program to include <fcntl.h>.
*/
-/*#undef I_DIRENT /**/
-#define DIRNAMLEN /**/
+#define I_FCNTL /**/
-/* I_FCNTL:
+/* I_GRP
* This symbol, if defined, indicates to the C program that it should
- * include fcntl.h.
+ * include grp.h.
*/
-#define I_FCNTL /**/
+/*#undef I_GRP /**/
-/* I_GRP:
+/* I_NETINET_IN
* This symbol, if defined, indicates to the C program that it should
- * include grp.h.
+ * include netinet/in.h.
*/
-/*#define I_GRP /**/
+/* I_SYS_IN
+ * This symbol, if defined, indicates to the C program that it should
+ * include sys/in.h.
+ */
+/*#undef I_NETINET_IN /**/
+/*#undef I_SYS_IN /**/
-/* I_PWD:
+/* I_PWD
* This symbol, if defined, indicates to the C program that it should
* include pwd.h.
*/
-/* PWQUOTA:
+/* PWQUOTA
* This symbol, if defined, indicates to the C program that struct passwd
* contains pw_quota.
*/
-/* PWAGE:
+/* PWAGE
* This symbol, if defined, indicates to the C program that struct passwd
* contains pw_age.
*/
-/*#define I_PWD /**/
-/*#define PWQUOTA /**/
+/* PWCHANGE
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_change.
+ */
+/* PWCLASS
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_class.
+ */
+/* PWEXPIRE
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_expire.
+ */
+/* PWCOMMENT
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_comment.
+ */
+/*#undef I_PWD /**/
+/*#undef PWQUOTA /**/
/*#undef PWAGE /**/
+/*#undef PWCHANGE /**/
+/*#undef PWCLASS /**/
+/*#undef PWEXPIRE /**/
+/*#undef PWCOMMENT /**/
-/* I_SYSDIR:
- * This symbol, if defined, indicates to the C program that it should
- * include sys/dir.h.
+/* I_SYS_FILE
+ * This manifest constant tells the C program to include <sys/file.h>.
*/
-#define I_SYSDIR /**/
+/*#undef I_SYS_FILE /**/
-/* I_SYSIOCTL:
+/* I_SYSIOCTL
* This symbol, if defined, indicates that sys/ioctl.h exists and should
* be included.
*/
-/*#define I_SYSIOCTL /**/
+/*#undef I_SYSIOCTL /**/
+
+/* I_TIME
+ * This symbol is defined if the program should include <time.h>.
+ */
+/* I_SYS_TIME
+ * This symbol is defined if the program should include <sys/time.h>.
+ */
+/* SYSTIMEKERNEL
+ * This symbol is defined if the program should include <sys/time.h>
+ * with KERNEL defined.
+ */
+/* I_SYS_SELECT
+ * This symbol is defined if the program should include <sys/select.h>.
+ */
+#define I_TIME /**/
+/*#undef I_SYS_TIME /**/
+/*#undef SYSTIMEKERNEL /**/
+/*#undef I_SYS_SELECT /**/
-/* I_VARARGS:
+/* I_UTIME
+ * This symbol, if defined, indicates to the C program that it should
+ * include utime.h.
+ */
+/*#undef I_UTIME /**/
+
+/* I_VARARGS
* This symbol, if defined, indicates to the C program that it should
* include varargs.h.
*/
#define I_VARARGS /**/
-/* INTSIZE:
+/* I_VFORK
+ * This symbol, if defined, indicates to the C program that it should
+ * include vfork.h.
+ */
+/*#undef I_VFORK /**/
+
+/* INTSIZE
* This symbol contains the size of an int, so that the C preprocessor
* can make decisions based on it.
*/
#define INTSIZE 2 /**/
-/* RANDBITS:
+/* I_DIRENT
+ * This symbol, if defined, indicates that the program should use the
+ * P1003-style directory routines, and include <dirent.h>.
+ */
+/* I_SYS_DIR
+ * This symbol, if defined, indicates that the program should use the
+ * directory functions by including <sys/dir.h>.
+ */
+/* I_NDIR
+ * This symbol, if defined, indicates that the program should include the
+ * system's version of ndir.h, rather than the one with this package.
+ */
+/* I_SYS_NDIR
+ * This symbol, if defined, indicates that the program should include the
+ * system's version of sys/ndir.h, rather than the one with this package.
+ */
+/* I_MY_DIR
+ * This symbol, if defined, indicates that the program should compile
+ * the ndir.c code provided with the package.
+ */
+/* DIRNAMLEN
+ * This symbol, if defined, indicates to the C program that the length
+ * of directory entry names is provided by a d_namlen field. Otherwise
+ * you need to do strlen() on the d_name field.
+ */
+/*#undef I_DIRENT /**/
+#define I_SYS_DIR /**/
+/*#undef I_NDIR /**/
+/*#undef I_SYS_NDIR /**/
+/*#undef I_MY_DIR /**/
+/*#undef DIRNAMLEN /**/
+
+
+/* RANDBITS
* This symbol contains the number of bits of random number the rand()
* function produces. Usual values are 15, 16, and 31.
*/
#define RANDBITS 31 /**/
-/* SIG_NAME:
+/* SCRIPTDIR
+ * This symbol holds the name of the directory in which the user wants
+ * to put publicly executable scripts for the package in question. It
+ * is often a directory that is mounted across diverse architectures.
+ */
+#define SCRIPTDIR "C:/bin/perl" /**/
+
+/* SIG_NAME
* This symbol contains an list of signal names in order.
+ *
+ * Note: This list is specific for Microsoft C 5.1 and 6.0, which only
+ * support SIGINT, SIGFPE, SIGILL, SIGSEGV, and SIGABRT on
+ * DOS 3.x, but in addition defines SIGTERM, SIGBREAK, SIGUSR1,
+ * SIGUSR2, and SIGUSR3.
*/
-#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" /**/
+#define SIG_NAME \
+ "ZERO","HUP","INT","QUIT","ILL","TRAP","IOT","EMT","FPE","KILL",\
+ "BUS","SEGV","SYS","PIPE","ALRM","TERM","USR1","USR2","TSTP","CONT",\
+ "USR3","BREAK","ABRT" /**/
-/* STDCHAR:
+/* STDCHAR
* This symbol is defined to be the type of char used in stdio.h.
* It has the values "unsigned char" or "char".
*/
#define STDCHAR char /**/
-/* UIDTYPE:
+/* UIDTYPE
* This symbol has a value like uid_t, int, ushort, or whatever type is
* used to declare user ids in the kernel.
*/
#define UIDTYPE int /**/
-/* VOIDFLAGS:
+/* VOIDHAVE
* This symbol indicates how much support of the void type is given by this
* compiler. What various bits mean:
*
@@ -496,38 +781,51 @@ CPU","XFSZ","VTALRM","PROF","WINCH","USR1","USR2" /**/
* 4 = supports comparisons between pointers to void functions and
* addresses of void functions
*
- * The package designer should define VOIDUSED to indicate the requirements
- * of the package. This can be done either by #defining VOIDUSED before
- * including config.h, or by defining defvoidused in Myinit.U. If the
- * latter approach is taken, only those flags will be tested. If the
- * level of void support necessary is not present, defines void to int.
- */
-#ifndef VOIDUSED
-#define VOIDUSED 7
+ * The package designer should define VOIDWANT to indicate the requirements
+ * of the package. This can be done either by #defining VOIDWANT before
+ * including config.h, or by defining voidwant in Myinit.U. If the level
+ * of void support necessary is not present, config.h defines void to "int",
+ * VOID to the empty string, and VOIDP to "char *".
+ */
+/* void
+ * This symbol is used for void casts. On implementations which support
+ * void appropriately, its value is "void". Otherwise, its value maps
+ * to "int".
+ */
+/* VOID
+ * This symbol's value is "void" if the implementation supports void
+ * appropriately. Otherwise, its value is the empty string. The primary
+ * use of this symbol is in specifying void parameter lists for function
+ * prototypes.
+ */
+/* VOIDP
+ * This symbol is used for casting generic pointers. On implementations
+ * which support void appropriately, its value is "void *". Otherwise,
+ * its value is "char *".
+ */
+#ifndef VOIDWANT
+#define VOIDWANT 1
#endif
-#define VOIDFLAGS 7
-#if (VOIDFLAGS & VOIDUSED) != VOIDUSED
+#define VOIDHAVE 1
+#if (VOIDHAVE & VOIDWANT) != VOIDWANT
#define void int /* is void to be avoided? */
+#define VOID
+#define VOIDP (char *)
#define M_VOID /* Xenix strikes again */
+#else
+#define VOID void
+#define VOIDP (void *)
#endif
-/* PRIVLIB:
+/* PRIVLIB
* This symbol contains the name of the private library for this package.
* The library is private in the sense that it needn't be in anyone's
* execution path, but it should be accessible by the world. The program
- * should be prepared to do ^ expansion.
+ * 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
@@ -537,4 +835,24 @@ CPU","XFSZ","VTALRM","PROF","WINCH","USR1","USR2" /**/
#define S_ISUID 0
#define S_ISGID 0
-#define CASTNEGFLOAT
+
+/* For MSC5.1, toke.c "runs out of heap space" unless CRIPPLED_CC is
+ * defined.
+ */
+#if defined(BUGGY_MSC5) || defined(BUGGY_MSC6)
+#define CRIPPLED_CC /**/
+#endif
+
+/* MSC (5.1 and 6.0) doesn't know about S_IFBLK or S_IFIFO -- these are
+ * normally found in sys/stat.h
+ */
+#define S_IFBLK (S_IFDIR | S_IFCHR)
+#define S_IFIFO 0010000
+
+/* Define SUFFIX to get special DOS suffix-replacement code */
+#define SUFFIX /**/
+
+/* Add this for the DOS-specific chdir() function */
+#define chdir perl_chdir
+
+#endif
diff --git a/msdos/dir.h b/msdos/dir.h
index abda0c25b2..d7536372a3 100644
--- a/msdos/dir.h
+++ b/msdos/dir.h
@@ -1,4 +1,4 @@
-/* $Header: dir.h,v 3.0.1.1 90/03/27 16:07:08 lwall Locked $
+/* $Header: dir.h,v 4.0 91/03/20 01:34:20 lwall Locked $
*
* (C) Copyright 1987, 1990 Diomidis Spinellis.
*
@@ -6,6 +6,9 @@
* as specified in the README file that comes with the perl 3.0 kit.
*
* $Log: dir.h,v $
+ * Revision 4.0 91/03/20 01:34:20 lwall
+ * 4.0 baseline.
+ *
* Revision 3.0.1.1 90/03/27 16:07:08 lwall
* patch16: MSDOS support
*
diff --git a/msdos/directory.c b/msdos/directory.c
index b435453a17..cc469d07fd 100644
--- a/msdos/directory.c
+++ b/msdos/directory.c
@@ -1,4 +1,4 @@
-/* $Header: directory.c,v 3.0.1.1 90/03/27 16:07:37 lwall Locked $
+/* $Header: directory.c,v 4.0 91/03/20 01:34:24 lwall Locked $
*
* (C) Copyright 1987, 1988, 1990 Diomidis Spinellis.
*
@@ -6,6 +6,9 @@
* as specified in the README file that comes with the perl 3.0 kit.
*
* $Log: directory.c,v $
+ * Revision 4.0 91/03/20 01:34:24 lwall
+ * 4.0 baseline.
+ *
* Revision 3.0.1.1 90/03/27 16:07:37 lwall
* patch16: MSDOS support
*
@@ -41,8 +44,7 @@
#define PATHLEN 65
#ifndef lint
-static char rcsid[] = "$Header: director.c;v 1.3 90/03/16 22:39:40 dds Exp
- $";
+static char rcsid[] = "$Header: directory.c,v 4.0 91/03/20 01:34:24 lwall Locked $";
#endif
DIR *
diff --git a/msdos/msdos.c b/msdos/msdos.c
index 7deb0aa71e..bfe2764531 100644
--- a/msdos/msdos.c
+++ b/msdos/msdos.c
@@ -1,4 +1,4 @@
-/* $Header: msdos.c,v 3.0.1.1 90/03/27 16:10:41 lwall Locked $
+/* $Header: msdos.c,v 4.0 91/03/20 01:34:46 lwall Locked $
*
* (C) Copyright 1989, 1990 Diomidis Spinellis.
*
@@ -6,6 +6,9 @@
* as specified in the README file that comes with the perl 3.0 kit.
*
* $Log: msdos.c,v $
+ * Revision 4.0 91/03/20 01:34:46 lwall
+ * 4.0 baseline.
+ *
* Revision 3.0.1.1 90/03/27 16:10:41 lwall
* patch16: MSDOS support
*
@@ -18,15 +21,12 @@
* Various Unix compatibility functions for MS-DOS.
*/
-#include <stdio.h>
-#include <errno.h>
-#include <dos.h>
-#include <time.h>
-#include <process.h>
-
#include "EXTERN.h"
#include "perl.h"
+#include <dos.h>
+#include <process.h>
+
/*
* Interface to the MS-DOS ioctl system call.
* The function is encoded as follows:
@@ -58,7 +58,7 @@ ioctl(int handle, unsigned int function, char *data)
struct SREGS segregs;
srv.h.ah = 0x44;
- srv.h.al = function & 0xf;
+ srv.h.al = (unsigned char)(function & 0x0F);
srv.x.bx = handle;
srv.x.cx = function >> 4;
segread(&segregs);
@@ -138,30 +138,40 @@ sleep(unsigned len)
/*
* Just pretend that everyone is a superuser
*/
+#define ROOT_UID 0
+#define ROOT_GID 0
int
getuid(void)
{
- return 0;
+ return ROOT_UID;
}
int
geteuid(void)
{
- return 0;
+ return ROOT_UID;
}
int
getgid(void)
{
- return 0;
+ return ROOT_GID;
}
int
getegid(void)
{
- return 0;
+ return ROOT_GID;
}
+int
+setuid(int uid)
+{ return (uid==ROOT_UID?0:-1); }
+
+int
+setgid(int gid)
+{ return (gid==ROOT_GID?0:-1); }
+
/*
* The following code is based on the do_exec and do_aexec functions
* in file doio.c
@@ -198,7 +208,6 @@ int *arglast;
return status;
}
-char *getenv(char *name);
int
do_spawn(cmd)
diff --git a/msdos/popen.c b/msdos/popen.c
index 4cc58d1baa..96e68558cc 100644
--- a/msdos/popen.c
+++ b/msdos/popen.c
@@ -1,4 +1,4 @@
-/* $Header: popen.c,v 3.0.1.2 90/08/09 04:04:42 lwall Locked $
+/* $Header: popen.c,v 4.0 91/03/20 01:34:50 lwall Locked $
*
* (C) Copyright 1988, 1990 Diomidis Spinellis.
*
@@ -6,6 +6,9 @@
* as specified in the README file that comes with the perl 3.0 kit.
*
* $Log: popen.c,v $
+ * Revision 4.0 91/03/20 01:34:50 lwall
+ * 4.0 baseline.
+ *
* Revision 3.0.1.2 90/08/09 04:04:42 lwall
* patch19: various MSDOS and OS/2 patches folded in
*
@@ -83,12 +86,12 @@ mypopen(const char *command, const char *t)
else
init++;
- if ((name = tempnam(getenv("TMP"), "pp")) == NULL)
+ if ((name = tempnam((char*)NULL, "pp")) == NULL)
return NULL;
switch (*t) {
case 'r':
- sprintf(buff, "%s>%s", command, name);
+ sprintf(buff, "%s >%s", command, name);
if (system(buff) || (f = fopen(name, "r")) == NULL) {
free(name);
return NULL;
@@ -140,22 +143,22 @@ mypclose(FILE *f)
status = EOF;
else
status = 0;
- free(name);
+ free((void*)name);
return status;
case execute:
(void)sprintf(buff, "%s <%s", p->command, p->name);
free(p);
- if (system(buff)) {
+ if (fclose(f) == EOF) {
(void)unlink(name);
status = EOF;
- } else if (fclose(f) == EOF) {
+ } else if (system(buff)) {
(void)unlink(name);
status = EOF;
} else if (unlink(name) < 0)
status = EOF;
else
status = 0;
- free(name);
+ free((void*)name);
return status;
default:
return EOF;
diff --git a/msdos/usage.c b/msdos/usage.c
new file mode 100644
index 0000000000..28991679e9
--- /dev/null
+++ b/msdos/usage.c
@@ -0,0 +1,51 @@
+/* usage.c
+ *
+ * Show usage message.
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+
+usage(char *myname)
+{
+char * p;
+char * name_p;
+
+name_p = myname;
+if ( p = strrchr(myname,'/') )
+ name_p = p+1; /* point after final '/' */
+#ifdef MSDOS
+if ( p = strrchr(name_p,'\\') )
+ name_p = p+1; /* point after final '\\' */
+if ( p = strrchr(name_p,':') )
+ name_p = p+1; /* point after final ':' */
+ printf("\nUsage: %s [-acdnpsSvw] [-Dnumber] [-i[extension]] [-Idirectory]"
+#else
+ printf("\nUsage: %s [-acdnpPsSuUvw] [-Dnumber] [-i[extension]] [-Idirectory]"
+#endif
+ "\n [-e \"command\"] [-x[directory]] [filename] [arguments]\n", name_p);
+
+ printf("\n -a autosplit mode with -n or -p"
+ "\n -c syntaxcheck only"
+ "\n -d run scripts under debugger"
+ "\n -n assume 'while (<>) { ...script... }' loop arround your script"
+ "\n -p assume loop like -n but print line also like sed"
+#ifndef MSDOS
+ "\n -P run script through C preprocessor befor compilation"
+#endif
+ "\n -s enable some switch parsing for switches after script name"
+ "\n -S look for the script using PATH environment variable");
+#ifndef MSDOS
+ printf("\n -u dump core after compiling the script"
+ "\n -U allow unsafe operations");
+#endif
+ printf("\n -v print version number and patchlevel of perl"
+ "\n -w turn warnings on for compilation of your script\n"
+ "\n -Dnumber set debugging flags"
+ "\n -i[extension] edit <> files in place (make backup if extension supplied)"
+ "\n -Idirectory specify include directory in conjunction with -P"
+ "\n -e command one line of script, multiple -e options are allowed"
+ "\n [filename] can be ommitted, when -e is used"
+ "\n -x[directory] strip off text before #!perl line and perhaps cd to directory\n");
+}