diff options
Diffstat (limited to 'msdos')
-rw-r--r-- | msdos/README.msdos | 80 | ||||
-rw-r--r-- | msdos/chdir.c | 96 | ||||
-rw-r--r-- | msdos/config.h | 734 | ||||
-rw-r--r-- | msdos/dir.h | 5 | ||||
-rw-r--r-- | msdos/directory.c | 8 | ||||
-rw-r--r-- | msdos/msdos.c | 35 | ||||
-rw-r--r-- | msdos/popen.c | 17 | ||||
-rw-r--r-- | msdos/usage.c | 51 |
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"); +} |