home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 October
/
usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso
/
misc
/
volume30
/
perl
/
patch24
< prev
next >
Wrap
Text File
|
1992-06-11
|
50KB
|
1,664 lines
Newsgroups: comp.sources.misc
From: lwall@netlabs.com (Larry Wall)
Subject: v30i035: perl - The perl programming language, Patch24
Message-ID: <1992Jun11.180341.380@sparky.imd.sterling.com>
X-Md4-Signature: 4eb6394e0c3195dc6769b693fc24b9da
Date: Thu, 11 Jun 1992 18:03:41 GMT
Approved: kent@sparky.imd.sterling.com
Submitted-by: lwall@netlabs.com (Larry Wall)
Posting-number: Volume 30, Issue 35
Archive-name: perl/patch24
Environment: UNIX, MS-DOS, OS2
Patch-To: perl: Volume 18, Issue 19-54
System: perl version 4.0
Patch #: 24
Priority: highish
Subject: patch #20, continued
Description:
See patch #20.
Fix: From rn, say "| patch -p -N -d DIR", where DIR is your perl source
directory. Outside of rn, say "cd DIR; patch -p -N <thisarticle".
If you don't have the patch program, apply the following by hand,
or get patch (version 2.0, latest patchlevel).
After patching:
*** DO NOTHING--INSTALL ALL PATCHES UP THROUGH #33 FIRST ***
If patch indicates that patchlevel is the wrong version, you may need
to apply one or more previous patches, or the patch may already
have been applied. See the patchlevel.h file to find out what has or
has not been applied. In any event, don't continue with the patch.
If you are missing previous patches they can be obtained from me:
Larry Wall
lwall@netlabs.com
If you send a mail message of the following form it will greatly speed
processing:
Subject: Command
@SH mailpatch PATH perl 4.0 LIST
^ note the c
where PATH is a return path FROM ME TO YOU either in Internet notation,
or in bang notation from some well-known host, and LIST is the number
of one or more patches you need, separated by spaces, commas, and/or
hyphens. Saying 35- says everything from 35 to the end.
Index: patchlevel.h
Prereq: 23
1c1
< #define PATCHLEVEL 23
---
> #define PATCHLEVEL 24
Index: os2/config.h
*** os2/config.h.old Mon Jun 8 17:49:45 1992
--- os2/config.h Mon Jun 8 17:49:46 1992
***************
*** 1,31 ****
/* config.h
! * This file was hand tailored for compiling under MS-DOS and MSC 5.1.
! * Diomidis Spinellis, March 1990.
*
! * Then it got mangled again for compiling under OS/2 and MSC 6.0.
! * Raymond Chen, June 1990.
*/
- #define OS2 /**/
/* OS/2 supports some additional things MS-DOS doesn't.
*/
! #ifdef OS2
! #define PIPE
! #define GETPPID
! #define HAS_GETPRIORITY
! #define HAS_SETPRIORITY
! #define KILL
! #endif /* OS2 */
! /* SUFFIX:
! * This symbol, if defined, indicates that the function add_suffix has
! * been supplied in a system-dependent .c file. This function is
! * recommended for operating systems whose filenaming conventions
! * do not permit arbitrary strings as filenames.
! */
! #define SUFFIX /**/
! /* 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,
--- 1,35 ----
+ /* manually edited version for OS/2 with MS C 6.00
+ check the HAS_?DBM symbols and if you have such a library ...
+ June 1991, Kai Uwe Rommel */
+
+ #ifndef config_h
+ #define config_h
/* config.h
! * This file was produced by running the config.h.SH script, which
! * gets its values from config.sh, which is generally produced by
! * running Configure.
*
! * Feel free to modify any of this as the need arises. Note, however,
! * that running config.h.SH again will wipe out any changes you've made.
! * For a more permanent change edit config.sh and rerun config.h.SH.
*/
+ #define OS2
+
/* OS/2 supports some additional things MS-DOS doesn't.
*/
! #define S_ISUID 0
! #define S_ISGID 0
! #define HAS_ALARM
! #define HAS_GETPPID
! #define HAS_PIPE
! #define HAS_KILL
! #define HAS_WAIT
! #define HAS_UMASK
! #define HAS_GDBM
! /* 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,
***************
*** 32,38 ****
* 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.
*/
--- 36,42 ----
* 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.
*/
***************
*** 39,102 ****
/*#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 ""
! /* 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 HAS_BCMP /**/
! /* HAS_BCOPY:
* This symbol, if defined, indicates that the bcopy routine is available
* to copy blocks of memory. Otherwise you should probably use memcpy().
*/
! /*#define HAS_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 /**/
! /* HAS_CRYPT:
* This symbol, if defined, indicates that the crypt routine is available
* to encrypt passwords and the like.
*/
! /* TODO */
! /*#define HAS_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
--- 43,142 ----
/*#undef EUNICE /**/
/*#undef VMS /**/
! /* ALIGNBYTES
! * This symbol contains the number of bytes required to align a double.
! * Usual values are 2, 4, and 8.
! */
! #define ALIGNBYTES 2 /**/
!
! /* BIN
* This symbol holds the name of the directory in which the user wants
! * to keep publicly executable images for the package in question. It
* is most often a local directory such as /usr/local/bin.
*/
! #define BIN "c:/bin" /**/
! /* BYTEORDER
* This symbol contains an encoding of the order of bytes in a long.
* Usual values (in octal) are 01234, 04321, 02143, 03412...
*/
#define BYTEORDER 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 -E" 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 "".
*/
! #define CPPSTDIN "cpp -P"
#define CPPMINUS ""
! /* HAS_BCMP
* This symbol, if defined, indicates that the bcmp routine is available
* to compare blocks of memory. If undefined, use memcmp. If that's
* not available, roll your own.
*/
! /* #define HAS_BCMP /**/
! /* HAS_BCOPY
* This symbol, if defined, indicates that the bcopy routine is available
* to copy blocks of memory. Otherwise you should probably use memcpy().
*/
! /* #define HAS_BCOPY /**/
! /* HAS_BZERO
! * This symbol, if defined, indicates that the bzero routine is available
! * to zero blocks of memory. Otherwise you should probably use memset()
! * or roll your own.
! */
! /* #define HAS_BZERO /**/
!
! /* 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 1 /**/
!
! /* 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 /**/
! /* HAS_CHSIZE
! * This symbol, if defined, indicates that the chsize routine is available
! * to truncate files. You might need a -lx to get this routine.
! */
! #undef HAS_CHSIZE /**/
!
! /* HAS_CRYPT
* This symbol, if defined, indicates that the crypt routine is available
* to encrypt passwords and the like.
*/
! #define HAS_CRYPT /**/
! /* CSH
! * This symbol, if defined, indicates that the C-shell exists.
! * If defined, contains the full pathname of csh.
! */
! /* #define CSH "/bin/csh" /**/
!
! /* DOSUID
* 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
***************
*** 109,197 ****
* subprocesses to which it must pass the filename rather than the
* file descriptor of the script to be executed.
*/
! /*#define DOSUID /**/
! /* HAS_DUP2:
* This symbol, if defined, indicates that the dup2 routine is available
* to dup file descriptors. Otherwise you should use dup().
*/
#define HAS_DUP2 /**/
! /* HAS_FCHMOD:
* This symbol, if defined, indicates that the fchmod routine is available
* to change mode of opened files. If unavailable, use chmod().
*/
! /*#define HAS_FCHMOD /**/
! /* HAS_FCHOWN:
* This symbol, if defined, indicates that the fchown routine is available
* to change ownership of opened files. If unavailable, use chown().
*/
! /*#define HAS_FCHOWN /**/
! /* I_FCNTL:
! * This symbol, if defined, indicates to the C program that it should
! * include fcntl.h.
*/
! /*#define I_FCNTL /**/
! /* HAS_FLOCK:
* This symbol, if defined, indicates that the flock() routine is
* available to do file locking.
*/
! /*#define HAS_FLOCK /**/
! /* HAS_GETGROUPS:
* This symbol, if defined, indicates that the getgroups() routine is
* available to get the list of process groups. If unavailable, multiple
* groups are probably not supported.
*/
! /*#define HAS_GETGROUPS /**/
! /* HAS_GETHOSTENT:
* This symbol, if defined, indicates that the gethostent() routine is
* available to lookup host names in some data base or other.
*/
! /*#define HAS_GETHOSTENT /**/
! /* HAS_GETPGRP:
* This symbol, if defined, indicates that the getpgrp() routine is
* available to get the current process group.
*/
! /*#define HAS_GETPGRP /**/
! /* HAS_GETPRIORITY:
* This symbol, if defined, indicates that the getpriority() routine is
* available to get a process's priority.
*/
! /*#define HAS_GETPRIORITY /**/
! /* HAS_HTONS:
* This symbol, if defined, indicates that the htons routine (and friends)
* are available to do network order byte swapping.
*/
! /* HAS_HTONL:
* This symbol, if defined, indicates that the htonl routine (and friends)
* are available to do network order byte swapping.
*/
! /* HAS_NTOHS:
* This symbol, if defined, indicates that the ntohs routine (and friends)
* are available to do network order byte swapping.
*/
! /* HAS_NTOHL:
* This symbol, if defined, indicates that the ntohl routine (and friends)
* are available to do network order byte swapping.
*/
! /*#define HAS_HTONS /**/
! /*#define HAS_HTONL /**/
! /*#define HAS_NTOHS /**/
! /*#define HAS_NTOHL /**/
! /* index:
* This preprocessor symbol is defined, along with rindex, if the system
* uses the strchr and strrchr routines instead.
*/
! /* rindex:
* This preprocessor symbol is defined, along with index, if the system
* uses the strchr and strrchr routines instead.
*/
--- 149,249 ----
* subprocesses to which it must pass the filename rather than the
* file descriptor of the script to be executed.
*/
! /*#undef DOSUID /**/
! /* HAS_DUP2
* This symbol, if defined, indicates that the dup2 routine is available
* to dup file descriptors. Otherwise you should use dup().
*/
#define HAS_DUP2 /**/
! /* HAS_FCHMOD
* This symbol, if defined, indicates that the fchmod routine is available
* to change mode of opened files. If unavailable, use chmod().
*/
! /* #define HAS_FCHMOD /**/
! /* HAS_FCHOWN
* This symbol, if defined, indicates that the fchown routine is available
* to change ownership of opened files. If unavailable, use chown().
*/
! /* #define HAS_FCHOWN /**/
! /* HAS_FCNTL
! * This symbol, if defined, indicates to the C program that
! * the fcntl() function exists.
*/
! /* #define HAS_FCNTL /**/
! /* FLEXFILENAMES
! * This symbol, if defined, indicates that the system supports filenames
! * longer than 14 characters.
! */
! #define FLEXFILENAMES /**/
!
! /* HAS_FLOCK
* This symbol, if defined, indicates that the flock() routine is
* available to do file locking.
*/
! /* #define HAS_FLOCK /**/
! /* HAS_GETGROUPS
* This symbol, if defined, indicates that the getgroups() routine is
* available to get the list of process groups. If unavailable, multiple
* groups are probably not supported.
*/
! /* #define HAS_GETGROUPS /**/
! /* HAS_GETHOSTENT
* This symbol, if defined, indicates that the gethostent() routine is
* available to lookup host names in some data base or other.
*/
! /*#undef HAS_GETHOSTENT /**/
! /* HAS_GETPGRP
* This symbol, if defined, indicates that the getpgrp() routine is
* available to get the current process group.
*/
! /* #define HAS_GETPGRP /**/
! /* HAS_GETPGRP2
! * This symbol, if defined, indicates that the getpgrp2() (as in DG/UX)
! * routine is available to get the current process group.
! */
! /*#undef HAS_GETPGRP2 /**/
!
! /* HAS_GETPRIORITY
* This symbol, if defined, indicates that the getpriority() routine is
* available to get a process's priority.
*/
! #define HAS_GETPRIORITY /**/
! /* HAS_HTONS
* This symbol, if defined, indicates that the htons routine (and friends)
* are available to do network order byte swapping.
*/
! /* HAS_HTONL
* This symbol, if defined, indicates that the htonl routine (and friends)
* are available to do network order byte swapping.
*/
! /* HAS_NTOHS
* This symbol, if defined, indicates that the ntohs routine (and friends)
* are available to do network order byte swapping.
*/
! /* HAS_NTOHL
* This symbol, if defined, indicates that the ntohl routine (and friends)
* are available to do network order byte swapping.
*/
! /* #define HAS_HTONS /**/
! /* #define HAS_HTONL /**/
! /* #define HAS_NTOHS /**/
! /* #define HAS_NTOHL /**/
! /* index
* This preprocessor symbol is defined, along with rindex, if the system
* uses the strchr and strrchr routines instead.
*/
! /* rindex
* This preprocessor symbol is defined, along with index, if the system
* uses the strchr and strrchr routines instead.
*/
***************
*** 198,230 ****
#define index strchr /* cultural */
#define rindex strrchr /* differences? */
! /* I_SYSIOCTL:
! * This symbol, if defined, indicates that sys/ioctl.h exists and should
! * be included.
*/
! /*#define I_SYSIOCTL /**/
! /* HAS_KILLPG:
* This symbol, if defined, indicates that the killpg routine is available
* to kill process groups. If unavailable, you probably should use kill
* with a negative process number.
*/
! /*#define HAS_KILLPG /**/
! /* HAS_MEMCMP:
* This symbol, if defined, indicates that the memcmp routine is available
* to compare blocks of memory. If undefined, roll your own.
*/
#define HAS_MEMCMP /**/
! /* 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 HAS_MEMCPY /**/
! /* 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.
--- 250,308 ----
#define index strchr /* cultural */
#define rindex strrchr /* differences? */
! /* HAS_ISASCII
! * This symbol, if defined, indicates that the isascii routine is available
! * to test characters for asciiness.
*/
! /*#undef HAS_ISASCII /**/
! /* HAS_KILLPG
* This symbol, if defined, indicates that the killpg routine is available
* to kill process groups. If unavailable, you probably should use kill
* with a negative process number.
*/
! /* #define HAS_KILLPG /**/
! /* HAS_LSTAT
! * This symbol, if defined, indicates that the lstat() routine is
! * available to stat symbolic links.
! */
! /* #define HAS_LSTAT /**/
!
! /* HAS_MEMCMP
* This symbol, if defined, indicates that the memcmp routine is available
* to compare blocks of memory. If undefined, roll your own.
*/
#define HAS_MEMCMP /**/
! /* 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.
*/
+ /* SAFE_MEMCPY
+ * This symbol, if defined, indicates that the memcpy routine is available
+ * to copy potentially overlapping copy blocks of memory. Otherwise you
+ * should probably use memmove() or bcopy(). If neither is defined,
+ * roll your own.
+ */
#define HAS_MEMCPY /**/
+ /*#undef SAFE_MEMCPY /**/
! /* HAS_MEMMOVE
! * This symbol, if defined, indicates that the memmove routine is available
! * to move potentially overlapping blocks of memory. Otherwise you
! * should use bcopy() or roll your own.
! */
! /*#undef HAS_MEMMOVE /**/
!
! /* HAS_MEMSET
! * This symbol, if defined, indicates that the memset routine is available
! * to set a block of memory to a character. If undefined, roll your own.
! */
! #define HAS_MEMSET /**/
!
! /* 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.
***************
*** 231,255 ****
*/
#define HAS_MKDIR /**/
! /* HAS_NDBM:
* This symbol, if defined, indicates that ndbm.h exists and should
* be included.
*/
! #define HAS_NDBM /**/
! /* HAS_ODBM:
* This symbol, if defined, indicates that dbm.h exists and should
* be included.
*/
! /*#define HAS_ODBM /**/
! /* HAS_READDIR:
* This symbol, if defined, indicates that the readdir routine is available
! * from the C library to create directories.
*/
#define HAS_READDIR /**/
! /* 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.
--- 309,369 ----
*/
#define HAS_MKDIR /**/
! /* HAS_MSG
! * This symbol, if defined, indicates that the entire msg*(2) library is
! * supported.
! */
! /* #define HAS_MSG /**/
!
! /* HAS_MSGCTL
! * This symbol, if defined, indicates that the msgctl() routine is
! * available to control message passing.
! */
! /* #define HAS_MSGCTL /**/
!
! /* HAS_MSGGET
! * This symbol, if defined, indicates that the msgget() routine is
! * available to get messages.
! */
! /* #define HAS_MSGGET /**/
!
! /* HAS_MSGRCV
! * This symbol, if defined, indicates that the msgrcv() routine is
! * available to receive messages.
! */
! /* #define HAS_MSGRCV /**/
!
! /* HAS_MSGSND
! * This symbol, if defined, indicates that the msgsnd() routine is
! * available to send messages.
! */
! /* #define HAS_MSGSND /**/
!
! /* HAS_NDBM
* This symbol, if defined, indicates that ndbm.h exists and should
* be included.
*/
! /* #define HAS_NDBM /**/
! /* HAS_ODBM
* This symbol, if defined, indicates that dbm.h exists and should
* be included.
*/
! /* #define HAS_ODBM /**/
! /* HAS_OPEN3
! * This manifest constant lets the C program know that the three
! * argument form of open(2) is available.
! */
! #define HAS_OPEN3 /**/
!
! /* HAS_READDIR
* This symbol, if defined, indicates that the readdir routine is available
! * from the C library to read directories.
*/
#define HAS_READDIR /**/
! /* 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.
***************
*** 256,262 ****
*/
#define HAS_RENAME /**/
! /* 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.
--- 370,382 ----
*/
#define HAS_RENAME /**/
! /* HAS_REWINDDIR
! * This symbol, if defined, indicates that the rewindir routine is
! * available to rewind directories.
! */
! #define HAS_REWINDDIR /**/
!
! /* 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.
***************
*** 263,347 ****
*/
#define HAS_RMDIR /**/
! /* HAS_SETEGID:
* This symbol, if defined, indicates that the setegid routine is available
* to change the effective gid of the current program.
*/
! /*#define HAS_SETEGID /**/
! /* HAS_SETEUID:
* This symbol, if defined, indicates that the seteuid routine is available
* to change the effective uid of the current program.
*/
! /*#define HAS_SETEUID /**/
! /* HAS_SETPGRP:
* This symbol, if defined, indicates that the setpgrp() routine is
* available to set the current process group.
*/
! /*#define HAS_SETPGRP /**/
! /* HAS_SETPRIORITY:
* This symbol, if defined, indicates that the setpriority() routine is
* available to set a process's priority.
*/
! /*#define HAS_SETPRIORITY /**/
! /* 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 HAS_SETREGID /**/
! /* HAS_SETREUID:
! * This symbol, if defined, indicates that the setreuid routine is available
! * to change the real and effective uid of the current program.
*/
! /*#define HAS_SETREUID /**/
! /* HAS_SETRGID:
* This symbol, if defined, indicates that the setrgid routine is available
* to change the real gid of the current program.
*/
! /*#define HAS_SETRGID /**/
! /* HAS_SETRUID:
* This symbol, if defined, indicates that the setruid routine is available
* to change the real uid of the current program.
*/
! /*#define HAS_SETRUID /**/
! /* 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 /**/
! /* 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.
--- 383,557 ----
*/
#define HAS_RMDIR /**/
! /* HAS_SEEKDIR
! * This symbol, if defined, indicates that the seekdir routine is
! * available to seek into directories.
! */
! #define HAS_SEEKDIR /**/
!
! /* HAS_SELECT
! * This symbol, if defined, indicates that the select() subroutine
! * exists.
! */
! /* #define HAS_SELECT /**/
!
! /* HAS_SEM
! * This symbol, if defined, indicates that the entire sem*(2) library is
! * supported.
! */
! /* #define HAS_SEM /**/
!
! /* HAS_SEMCTL
! * This symbol, if defined, indicates that the semctl() routine is
! * available to control semaphores.
! */
! /* #define HAS_SEMCTL /**/
!
! /* HAS_SEMGET
! * This symbol, if defined, indicates that the semget() routine is
! * available to get semaphores ids.
! */
! /* #define HAS_SEMGET /**/
!
! /* HAS_SEMOP
! * This symbol, if defined, indicates that the semop() routine is
! * available to perform semaphore operations.
! */
! /* #define 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 HAS_SETEGID /**/
! /* HAS_SETEUID
* This symbol, if defined, indicates that the seteuid routine is available
* to change the effective uid of the current program.
*/
! /* #define HAS_SETEUID /**/
! /* HAS_SETPGRP
* This symbol, if defined, indicates that the setpgrp() routine is
* available to set the current process group.
*/
! /* #define 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 /**/
!
! /* HAS_SETPRIORITY
* This symbol, if defined, indicates that the setpriority() routine is
* available to set a process's priority.
*/
! #define HAS_SETPRIORITY /**/
! /* HAS_SETREGID
! * This symbol, if defined, indicates that the setregid routine is
! * available to change the real and effective gid of the current program.
*/
! /* HAS_SETRESGID
! * This symbol, if defined, indicates that the setresgid routine is
! * available to change the real, effective and saved gid of the current
! * program.
! */
! /* #define HAS_SETREGID /**/
! /*#undef HAS_SETRESGID /**/
! /* 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 HAS_SETREUID /**/
! /*#undef HAS_SETRESUID /**/
! /* HAS_SETRGID
* This symbol, if defined, indicates that the setrgid routine is available
* to change the real gid of the current program.
*/
! /* #define HAS_SETRGID /**/
! /* HAS_SETRUID
* This symbol, if defined, indicates that the setruid routine is available
* to change the real uid of the current program.
*/
! /* #define HAS_SETRUID /**/
! /* HAS_SHM
! * This symbol, if defined, indicates that the entire shm*(2) library is
! * supported.
*/
! /* #define HAS_SHM /**/
!
! /* HAS_SHMAT
! * This symbol, if defined, indicates that the shmat() routine is
! * available to attach a shared memory segment.
*/
! /* VOID_SHMAT
! * This symbol, if defined, indicates that the shmat() routine
! * returns a pointer of type void*.
*/
! /* #define HAS_SHMAT /**/
! /*#undef VOIDSHMAT /**/
! /* HAS_SHMCTL
! * This symbol, if defined, indicates that the shmctl() routine is
! * available to control a shared memory segment.
! */
! /* #define HAS_SHMCTL /**/
! /* HAS_SHMDT
! * This symbol, if defined, indicates that the shmdt() routine is
! * available to detach a shared memory segment.
! */
! /* #define HAS_SHMDT /**/
!
! /* HAS_SHMGET
! * This symbol, if defined, indicates that the shmget() routine is
! * available to get a shared memory segment id.
! */
! /* #define HAS_SHMGET /**/
!
! /* 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.
! */
! /* #define HAS_SOCKET /**/
!
! /* #define HAS_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.
***************
*** 348,520 ****
*/
#define STRUCTCOPY /**/
! /* HAS_SYMLINK:
* This symbol, if defined, indicates that the symlink routine is available
* to create symbolic links.
*/
! /*#define HAS_SYMLINK /**/
! /* HAS_SYSCALL:
* This symbol, if defined, indicates that the syscall routine is available
* to call arbitrary system calls. If undefined, that's tough.
*/
! /*#define HAS_SYSCALL /**/
! /* s_tm:
! * 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_SYS_TIME:
! * 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 s_tm /**/
! /*#define I_SYS_TIME /**/
! #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 /**/
! /* 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:
* This symbol is defined if this system has vsprintf() returning type
* (char*). The trend seems to be to declare it as "int vsprintf()". It
* is up to the package author to declare vsprintf correctly based on the
* symbol.
*/
! #define HAS_VPRINTF /**/
! /*#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_SYS_DIR:
! * This symbol, if defined, indicates to the C program that it should
! * include sys/dir.h.
*/
! #define I_SYS_DIR /**/
! /* 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.
*/
! #ifdef OS2
! #define SIG_NAME "ZERO","HUP","INT","QUIT","ILL","TRAP","IOT","EMT","FPE",\
! /* 0 1 2 3 4 5 6 7 8 */\
"KILL","BUS","SEGV","SYS","PIPE","UALRM","TERM","ALRM","USR2","CLD",\
/* 9 10 11 12 13 14 15 16 17 18 */\
"PWR","USR3","BREAK","ABRT"
/*19 20 21 22 */
- #else
- #define SIG_NAME "ZERO","HUP","INT","QUIT","ILL","TRAP","IOT","EMT","FPE","KILL","BUS","SEGV","SYS","PIPE","ALRM","TERM","URG","STOP","TSTP","CONT","CHLD","TTIN","TTOU","IO","XCPU","XFSZ","VTALRM","PROF","WINCH","USR1","USR2" /**/
- #endif /* OS2 */
! /* 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:
*
--- 558,852 ----
*/
#define STRUCTCOPY /**/
! /* HAS_STRERROR
! * This symbol, if defined, indicates that the strerror() routine is
! * available to translate error numbers to strings.
! */
! /*#undef HAS_STRERROR /**/
!
! /* HAS_SYMLINK
* This symbol, if defined, indicates that the symlink routine is available
* to create symbolic links.
*/
! /* #define HAS_SYMLINK /**/
! /* HAS_SYSCALL
* This symbol, if defined, indicates that the syscall routine is available
* to call arbitrary system calls. If undefined, that's tough.
*/
! /* #define HAS_SYSCALL /**/
! /* HAS_TELLDIR
! * This symbol, if defined, indicates that the telldir routine is
! * available to tell your location in directories.
*/
! #define HAS_TELLDIR /**/
! /* HAS_TRUNCATE
! * This symbol, if defined, indicates that the truncate routine is
! * available to truncate files.
*/
! /* #define HAS_TRUNCATE /**/
! /* HAS_VFORK
! * This symbol, if defined, indicates that vfork() exists.
*/
! /* #define HAS_VFORK /**/
! /* VOIDSIG
* This symbol is defined if this system declares "void (*signal())()" in
* signal.h. The old way was to declare it as "int (*signal())()". It
* 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 void /**/
! /* HASVOLATILE
! * This symbol, if defined, indicates that this C compiler knows about
! * the volatile declaration.
! */
! #define HASVOLATILE /**/
!
! /* HAS_VPRINTF
* This symbol, if defined, indicates that the vprintf routine is available
* to printf with a pointer to an argument list. If unavailable, you
* may need to write your own, probably in terms of _doprnt().
*/
! /* CHARVSPRINTF
* This symbol is defined if this system has vsprintf() returning type
* (char*). The trend seems to be to declare it as "int vsprintf()". It
* is up to the package author to declare vsprintf correctly based on the
* symbol.
*/
! #define HAS_VPRINTF /**/
! /* #define CHARVSPRINTF /**/
! /* HAS_WAIT4
! * This symbol, if defined, indicates that wait4() exists.
! */
! /* #define HAS_WAIT4 /**/
!
! /* HAS_WAITPID
! * This symbol, if defined, indicates that waitpid() exists.
! */
! #define HAS_WAITPID /**/
!
! /* GIDTYPE
* This symbol has a value like gid_t, int, ushort, or whatever type is
* used to declare group ids in the kernel.
*/
#define GIDTYPE int /**/
! /* GROUPSTYPE
! * This symbol has a value like gid_t, int, ushort, or whatever type is
! * used in the return value of getgroups().
*/
! #define GROUPSTYPE int /**/
!
! /* I_FCNTL
! * This manifest constant tells the C program to include <fcntl.h>.
*/
! /*#undef I_FCNTL /**/
! /* I_GDBM
! * This symbol, if defined, indicates that gdbm.h exists and should
! * be included.
*/
! #define I_GDBM /**/
! /* I_GRP
* This symbol, if defined, indicates to the C program that it should
* include grp.h.
*/
! /* #define I_GRP /**/
! /* I_NETINET_IN
* This symbol, if defined, indicates to the C program that it should
+ * include netinet/in.h.
+ */
+ /* I_SYS_IN
+ * This symbol, if defined, indicates to the C program that it should
+ * include sys/in.h.
+ */
+ /* #define I_NETINET_IN /**/
+ /*#undef I_SYS_IN /**/
+
+ /* I_PWD
+ * This symbol, if defined, indicates to the C program that it should
* include pwd.h.
*/
! /* PWQUOTA
* 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.
*/
! /* PWCHANGE
! * This symbol, if defined, indicates to the C program that struct passwd
! * contains pw_change.
! */
! /* PWCLASS
! * This symbol, if defined, indicates to the C program that struct passwd
! * contains pw_class.
! */
! /* PWEXPIRE
! * This symbol, if defined, indicates to the C program that struct passwd
! * contains pw_expire.
! */
! /* PWCOMMENT
! * This symbol, if defined, indicates to the C program that struct passwd
! * contains pw_comment.
! */
! /* #define I_PWD /**/
! /*#undef PWQUOTA /**/
! /* #define PWAGE /**/
! /*#undef PWCHANGE /**/
! /*#undef PWCLASS /**/
! /*#undef PWEXPIRE /**/
! /* #define PWCOMMENT /**/
! /* I_SYS_FILE
! * This manifest constant tells the C program to include <sys/file.h>.
*/
! /* #define I_SYS_FILE /**/
! /* I_SYSIOCTL
* This symbol, if defined, indicates that sys/ioctl.h exists and should
* be included.
*/
! /* #define 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 /**/
! /* #define I_SYS_TIME /**/
! /*#undef SYSTIMEKERNEL /**/
! /*#undef I_SYS_SELECT /**/
!
! /* I_UTIME
* This symbol, if defined, indicates to the C program that it should
+ * include utime.h.
+ */
+ /* #define I_UTIME /**/
+
+ /* I_VARARGS
+ * This symbol, if defined, indicates to the C program that it should
* include varargs.h.
*/
#define I_VARARGS /**/
! /* I_VFORK
! * This symbol, if defined, indicates to the C program that it should
! * include vfork.h.
! */
! /* #define 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 /**/
! /* I_DIRENT
! * This symbol, if defined, indicates that the program should use the
! * P1003-style directory routines, and include <dirent.h>.
! */
! /* I_SYS_DIR
! * This symbol, if defined, indicates that the program should use the
! * directory functions by including <sys/dir.h>.
! */
! /* I_NDIR
! * This symbol, if defined, indicates that the program should include the
! * system's version of ndir.h, rather than the one with this package.
! */
! /* I_SYS_NDIR
! * This symbol, if defined, indicates that the program should include the
! * system's version of sys/ndir.h, rather than the one with this package.
! */
! /* I_MY_DIR
! * This symbol, if defined, indicates that the program should compile
! * the ndir.c code provided with the package.
! */
! /* DIRNAMLEN
! * This symbol, if defined, indicates to the C program that the length
! * of directory entry names is provided by a d_namlen field. Otherwise
! * you need to do strlen() on the d_name field.
! */
! /* #define I_DIRENT /**/
! #define I_SYS_DIR /**/
! /*#undef I_NDIR /**/
! /*#undef I_SYS_NDIR /**/
! /*#undef I_MY_DIR /**/
! #define DIRNAMLEN /**/
!
! /* MYMALLOC
! * This symbol, if defined, indicates that we're using our own malloc.
! */
! /* MALLOCPTRTYPE
! * This symbol defines the kind of ptr returned by malloc and realloc.
! */
! #define MYMALLOC /**/
!
! #define MALLOCPTRTYPE void /**/
!
!
! /* RANDBITS
* This symbol contains the number of bits of random number the rand()
* function produces. Usual values are 15, 16, and 31.
*/
! #define RANDBITS 15 /**/
! /* SCRIPTDIR
! * This symbol holds the name of the directory in which the user wants
! * to keep publicly executable scripts for the package in question. It
! * is often a directory that is mounted across diverse architectures.
! */
! #define SCRIPTDIR "c:/bin/perl" /**/
!
! /* SIG_NAME
* This symbol contains an list of signal names in order.
*/
! #define SIG_NAME \
! "ZERO","HUP","INT","QUIT","ILL","TRAP","IOT","EMT","FPE",\
! /* 0 1 2 3 4 5 6 7 8 */\
"KILL","BUS","SEGV","SYS","PIPE","UALRM","TERM","ALRM","USR2","CLD",\
/* 9 10 11 12 13 14 15 16 17 18 */\
"PWR","USR3","BREAK","ABRT"
/*19 20 21 22 */
! /* 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 /**/
! /* VOIDHAVE
* This symbol indicates how much support of the void type is given by this
* compiler. What various bits mean:
*
***************
*** 523,560 ****
* 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 "c:/bin/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
--- 855,905 ----
* 4 = supports comparisons between pointers to void functions and
* addresses of void functions
*
! * The package designer should define VOIDWANT to indicate the requirements
! * of the package. This can be done either by #defining VOIDWANT before
! * including config.h, or by defining voidwant in Myinit.U. If the level
! * of void support necessary is not present, config.h defines void to "int",
! * VOID to the empty string, and VOIDP to "char *".
*/
! /* void
! * This symbol is used for void casts. On implementations which support
! * void appropriately, its value is "void". Otherwise, its value maps
! * to "int".
! */
! /* VOID
! * This symbol's value is "void" if the implementation supports void
! * appropriately. Otherwise, its value is the empty string. The primary
! * use of this symbol is in specifying void parameter lists for function
! * prototypes.
! */
! /* VOIDP
! * This symbol is used for casting generic pointers. On implementations
! * which support void appropriately, its value is "void *". Otherwise,
! * its value is "char *".
! */
! #ifndef VOIDWANT
! #define VOIDWANT 7
#endif
! #define VOIDHAVE 7
! #if (VOIDHAVE & VOIDWANT) != VOIDWANT
#define void int /* is void to be avoided? */
+ #define VOID
+ #define VOIDP (char *)
#define M_VOID /* Xenix strikes again */
+ #else
+ #define VOID void
+ #define VOIDP (void *)
#endif
! /* PRIVLIB
* This symbol contains the name of the private library for this package.
* The library is private in the sense that it needn't be in anyone's
* execution path, but it should be accessible by the world. The program
! * should be prepared to do ~ expansion.
*/
#define PRIVLIB "c:/bin/perl" /**/
/*
* BINARY:
* This symbol is defined if you run under an operating system that
* distinguishes between binary and text files. If so the function
***************
*** 562,567 ****
*/
#define BINARY
! #define S_ISUID 0
! #define S_ISGID 0
! #define CASTNEGFLOAT
--- 907,910 ----
*/
#define BINARY
! #endif
Index: atarist/echo.c
*** atarist/echo.c.old Mon Jun 8 17:35:11 1992
--- atarist/echo.c Mon Jun 8 17:35:11 1992
***************
*** 0 ****
--- 1,98 ----
+ /*
+ * echo args, globbing is necessary.
+ * usage:
+ * echo [-n] [args ...]
+ * \n \r \b \c \v \\ \f \t \NNN escapes supported
+ * -n and \c mean dont echo the final newline.
+ *
+ * ++jrb bammi@cadence.com
+ */
+
+ #include <stdio.h>
+
+ #if __STDC__
+ # include <compiler.h>
+ #else
+ # define __PROTO(X) ()
+ #endif
+
+ char **glob __PROTO((char *patt, int decend_dir));
+ int contains_wild __PROTO((char *patt));
+ void free_all __PROTO((void));
+
+
+ int final_newline = 1; /* turned off by -n or \c */
+
+ int main(argc, argv)
+ int argc;
+ char **argv;
+ {
+ --argc; ++argv;
+ if((*argv)[0] == '-')
+ {
+ if ((*argv)[1] == 'n')
+ final_newline = 0;
+ else
+ {
+ fputs("usage: echo [-n] [arguement ... ]\n", stderr);
+ return 1;
+ }
+ --argc; ++argv;
+ }
+
+ while(argc--)
+ {
+ char *word = *argv;
+ char **list;
+
+ if(contains_wild(word) && (list = glob(word, 0)))
+ {
+ while(*list)
+ {
+ fputs(*list, stdout);
+ if(*++list) putchar(' ');
+ }
+ free_all();
+ }
+ else
+ {
+ char c;
+ for(c = *word; c; c = (*word)? *++word : 0)
+ {
+ if(c != '\\')
+ putchar(c);
+ else
+ {
+ switch(*++word)
+ {
+ case 'b': putchar('\b'); break;
+ case 'f': putchar('\f'); break;
+ case 'n': putchar('\n'); break;
+ case 'r': putchar('\r'); break;
+ case 't': putchar('\t'); break;
+ case 'v': putchar('\v'); break;
+ case '\\': putchar('\\'); break;
+ case 'c': final_newline = 0; break;
+ default: putchar(*word); /* ?? */
+ case '0':
+ {
+ int n = 0;
+ for(c = *++word; (c >= '0') && (c <= '7'); c = *++word)
+ n = (n << 3) + (c - '0');
+ putchar(n);
+ }
+ }
+ }
+ }
+ }
+ if(*++argv) putchar(' ');
+ }
+ if(final_newline) putchar('\n');
+ return 0;
+ }
+
+
+
+
+
+
*** End of Patch 24 ***
exit 0 # Just in case...