diff options
author | obrien <obrien@FreeBSD.org> | 2000-04-18 07:31:36 +0000 |
---|---|---|
committer | obrien <obrien@FreeBSD.org> | 2000-04-18 07:31:36 +0000 |
commit | 6d573144b323d585e9999b045a7cdfb0f3f8d491 (patch) | |
tree | 6f3237f7547194d4258d65f1e1ecc234ebd3692f | |
parent | a0eba154d3e138792cbfc004135e7ab7310e0e6a (diff) | |
download | FreeBSD-src-6d573144b323d585e9999b045a7cdfb0f3f8d491.zip FreeBSD-src-6d573144b323d585e9999b045a7cdfb0f3f8d491.tar.gz |
Upgrade csh.
-rw-r--r-- | bin/csh/Makefile | 58 | ||||
-rw-r--r-- | bin/csh/alloc.c | 130 | ||||
-rw-r--r-- | bin/csh/char.c | 316 | ||||
-rw-r--r-- | bin/csh/char.h | 97 | ||||
-rw-r--r-- | bin/csh/config.h | 153 | ||||
-rw-r--r-- | bin/csh/config_p.h | 153 | ||||
-rw-r--r-- | bin/csh/const.c | 167 | ||||
-rw-r--r-- | bin/csh/csh.c | 1362 | ||||
-rw-r--r-- | bin/csh/csh.h | 551 | ||||
-rw-r--r-- | bin/csh/dir.c | 933 | ||||
-rw-r--r-- | bin/csh/dir.h | 46 | ||||
-rw-r--r-- | bin/csh/dol.c | 991 | ||||
-rw-r--r-- | bin/csh/err.c | 411 | ||||
-rw-r--r-- | bin/csh/exec.c | 746 | ||||
-rw-r--r-- | bin/csh/exp.c | 712 | ||||
-rw-r--r-- | bin/csh/extern.h | 339 | ||||
-rw-r--r-- | bin/csh/file.c | 685 | ||||
-rw-r--r-- | bin/csh/func.c | 1520 | ||||
-rw-r--r-- | bin/csh/glob.c | 961 | ||||
-rw-r--r-- | bin/csh/hist.c | 188 | ||||
-rw-r--r-- | bin/csh/init.c | 139 | ||||
-rw-r--r-- | bin/csh/lex.c | 1643 | ||||
-rw-r--r-- | bin/csh/misc.c | 424 | ||||
-rw-r--r-- | bin/csh/parse.c | 702 | ||||
-rw-r--r-- | bin/csh/pathnames.h | 42 | ||||
-rw-r--r-- | bin/csh/proc.c | 1362 | ||||
-rw-r--r-- | bin/csh/proc.h | 102 | ||||
-rw-r--r-- | bin/csh/sem.c | 650 | ||||
-rw-r--r-- | bin/csh/set.c | 847 | ||||
-rw-r--r-- | bin/csh/str.c | 472 | ||||
-rw-r--r-- | bin/csh/tc.defs.c | 2709 | ||||
-rw-r--r-- | bin/csh/time.c | 321 |
32 files changed, 3059 insertions, 16873 deletions
diff --git a/bin/csh/Makefile b/bin/csh/Makefile index 3ebbb1e..19ba1e1 100644 --- a/bin/csh/Makefile +++ b/bin/csh/Makefile @@ -6,36 +6,66 @@ # # To profile, put -DPROF in DEFS and -pg in CFLAGS, and recompile. +TCSHDIR= ${.CURDIR}/../../contrib/tcsh +.PATH: ${TCSHDIR} + PROG= csh -DFLAGS=-DBUILTIN -DFILEC -DNLS -DSHORT_STRINGS -CFLAGS+=-I${.CURDIR} -I. ${DFLAGS} -SRCS= alloc.c char.c const.c csh.c dir.c dol.c err.c exec.c exp.c file.c \ - func.c glob.c hist.c init.c lex.c misc.c parse.c printf.c proc.c \ - sem.c set.c str.c time.c const.h errnum.h -.PATH: ${.CURDIR}/../../usr.bin/printf +DFLAGS= -D_PATH_TCSHELL='"${DESTDIR}/bin/${PROG}"' +CFLAGS+= -I${TCSHDIR} -I${.CURDIR} -I. ${DFLAGS} +SRCS= sh.c sh.dir.c sh.dol.c sh.err.c sh.exec.c sh.char.c \ + sh.exp.c sh.file.c sh.func.c sh.glob.c sh.hist.c sh.init.c \ + sh.lex.c sh.misc.c sh.parse.c sh.print.c sh.proc.c sh.sem.c \ + sh.set.c sh.time.c sh.h sh.char.h sh.dir.h sh.proc.h +SRCS+= sh.decls.h glob.c glob.h mi.termios.c mi.wait.h mi.varargs.h +SRCS+= tw.decls.h tw.h tw.help.c tw.init.c tw.parse.c tw.spell.c \ + tw.comp.c tw.color.c +SRCS+= ed.chared.c ed.decls.h ed.defns.c ed.h ed.init.c ed.inputl.c \ + ed.refresh.c ed.screen.c ed.xmap.c ed.term.c ed.term.h +SRCS+= tc.alloc.c tc.bind.c tc.const.c tc.decls.h tc.disc.c \ + tc.func.c tc.os.c tc.os.h tc.printf.c tc.prompt.c \ + tc.sched.c tc.sig.c tc.sig.h tc.str.c sh.types.h tc.vers.c tc.wait.h \ + tc.who.c tc.h +SRCS+= tc.defs.c MAN1= csh.1 # MLINKS for Shell built in commands for which there are no userland # utilities of the same name are handled with the associated manpage, # builtin.1 in share/man/man1/. -CLEANFILES+=const.h errnum.h +DPADD+= ${LIBNCURSES} ${LIBCRYPT} +LDADD+= -lncurses -lcrypt + +csh.1: tcsh.man + ln -sf ${.ALLSRC} ${.TARGET} + +GENHDRS+= ed.defns.h tc.const.h sh.err.h +SRCS+= ${GENHDRS} +CLEANFILES+= ${GENHDRS} -const.h: errnum.h +ed.defns.h: ed.defns.c + @rm -f ${.TARGET} + @echo '/* Do not edit this file, make creates it. */' > ${.TARGET} + @echo '#ifndef _h_ed_defns' >> ${.TARGET} + @echo '#define _h_ed_defns' >> ${.TARGET} + grep '[FV]_' ${TCSHDIR}/ed.defns.c | grep '^#define' >> ${.TARGET} + @echo '#endif /* _h_ed_defns */' >> ${.TARGET} -errnum.h: err.c +sh.err.h: sh.err.c @rm -f ${.TARGET} @echo '/* Do not edit this file, make creates it. */' > ${.TARGET} - @echo '#ifndef _h_sh_error' >> ${.TARGET} - @echo '#define _h_sh_error' >> ${.TARGET} + @echo '#ifndef _h_sh_err' >> ${.TARGET} + @echo '#define _h_sh_err' >> ${.TARGET} egrep 'ERR_' ${.ALLSRC} | egrep '^#define' >> ${.TARGET} - @echo '#endif /* _h_sh_error */' >> ${.TARGET} + @echo '#endif /* _h_sh_err */' >> ${.TARGET} -const.h: const.c +tc.const.h: tc.const.c sh.char.h config.h config_f.h sh.types.h sh.err.h @rm -f ${.TARGET} @echo '/* Do not edit this file, make creates it. */' > ${.TARGET} - ${CC} -E ${CFLAGS} ${.ALLSRC} | egrep 'Char STR' | \ + @echo '#ifndef _h_tc_const' >> ${.TARGET} + @echo '#define _h_tc_const' >> ${.TARGET} + ${CC} -E ${CFLAGS} ${.ALLSRC} -D_h_tc_const | egrep 'Char STR' | \ sed -e 's/Char \([a-zA-Z0-9_]*\)\(.*\)/extern Char \1[];/' | \ sort >> ${.TARGET} + @echo '#endif /* _h_tc_const */' >> ${.TARGET} .include <bsd.prog.mk> diff --git a/bin/csh/alloc.c b/bin/csh/alloc.c deleted file mode 100644 index 1653329..0000000 --- a/bin/csh/alloc.c +++ /dev/null @@ -1,130 +0,0 @@ -/*- - * Copyright (c) 1983, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -#if 0 -static char sccsid[] = "@(#)alloc.c 8.1 (Berkeley) 5/31/93"; -#else -static const char rcsid[] = - "$FreeBSD$"; -#endif -#endif /* not lint */ - -#include <sys/types.h> -#include <unistd.h> -#include <stdlib.h> -#if __STDC__ -# include <stdarg.h> -#else -# include <varargs.h> -#endif - -#include "csh.h" -#include "extern.h" - -char *memtop = NULL; /* PWP: top of current memory */ -char *membot = NULL; /* PWP: bottom of allocatable memory */ - -ptr_t -Malloc(n) - size_t n; -{ - ptr_t ptr; - - if (membot == NULL) - memtop = membot = sbrk(0); - if ((ptr = malloc(n)) == (ptr_t) 0) { - child++; - stderror(ERR_NOMEM); - } - return (ptr); -} - -ptr_t -Realloc(p, n) - ptr_t p; - size_t n; -{ - ptr_t ptr; - - if (membot == NULL) - memtop = membot = sbrk(0); - if ((ptr = realloc(p, n)) == (ptr_t) 0) { - child++; - stderror(ERR_NOMEM); - } - return (ptr); -} - -ptr_t -Calloc(s, n) - size_t s, n; -{ - ptr_t ptr; - - if (membot == NULL) - memtop = membot = sbrk(0); - if ((ptr = calloc(s, n)) == (ptr_t) 0) { - child++; - stderror(ERR_NOMEM); - } - - return (ptr); -} - -void -Free(p) - ptr_t p; -{ - if (p) - free(p); -} - -/* - * mstats - print out statistics about malloc - * - * Prints two lines of numbers, one showing the length of the free list - * for each size category, the second showing the number of mallocs - - * frees for each size category. - */ -void -/*ARGSUSED*/ -showall(v, t) - Char **v; - struct command *t; -{ - memtop = (char *) sbrk(0); - (void) fprintf(cshout, "Allocated memory from 0x%lx to 0x%lx (%ld).\n", - (unsigned long) membot, (unsigned long) memtop, - (unsigned long) (memtop - membot)); -} diff --git a/bin/csh/char.c b/bin/csh/char.c deleted file mode 100644 index b2aa378..0000000 --- a/bin/csh/char.c +++ /dev/null @@ -1,316 +0,0 @@ -/*- - * Copyright (c) 1980, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -#if 0 -static char sccsid[] = "@(#)char.c 8.1 (Berkeley) 5/31/93"; -#else -static const char rcsid[] = - "$FreeBSD$"; -#endif -#endif /* not lint */ - -#include "char.h" - -unsigned short _cmap[256] = { -/* nul soh stx etx */ - _CTR, _CTR, _CTR, _CTR, - -/* eot enq ack bel */ - _CTR, _CTR, _CTR, _CTR, - -/* bs ht nl vt */ - _CTR, _CTR|_SP|_META, _CTR|_NL|_META, _CTR, - -/* np cr so si */ - _CTR, _CTR, _CTR, _CTR, - -/* dle dc1 dc2 dc3 */ - _CTR, _CTR, _CTR, _CTR, - -/* dc4 nak syn etb */ - _CTR, _CTR, _CTR, _CTR, - -/* can em sub esc */ - _CTR, _CTR, _CTR, _CTR, - -/* fs gs rs us */ - _CTR, _CTR, _CTR, _CTR, - -/* sp ! " # */ - _SP|_META, 0, _QF, _META, - -/* $ % & ' */ - _DOL, 0, _META|_CMD, _QF, - -/* ( ) * + */ - _META|_CMD, _META, _GLOB, 0, - -/* , - . / */ - 0, 0, 0, 0, - -/* 0 1 2 3 */ - _DIG|_XD, _DIG|_XD, _DIG|_XD, _DIG|_XD, - -/* 4 5 6 7 */ - _DIG|_XD, _DIG|_XD, _DIG|_XD, _DIG|_XD, - -/* 8 9 : ; */ - _DIG|_XD, _DIG|_XD, 0, _META|_CMD, - -/* < = > ? */ - _META, 0, _META, _GLOB, - -/* @ A B C */ - 0, _LET|_UP|_XD, _LET|_UP|_XD, _LET|_UP|_XD, - -/* D E F G */ - _LET|_UP|_XD, _LET|_UP|_XD, _LET|_UP|_XD, _LET|_UP, - -/* H I J K */ - _LET|_UP, _LET|_UP, _LET|_UP, _LET|_UP, - -/* L M N O */ - _LET|_UP, _LET|_UP, _LET|_UP, _LET|_UP, - -/* P Q R S */ - _LET|_UP, _LET|_UP, _LET|_UP, _LET|_UP, - -/* T U V W */ - _LET|_UP, _LET|_UP, _LET|_UP, _LET|_UP, - -/* X Y Z [ */ - _LET|_UP, _LET|_UP, _LET|_UP, _GLOB, - -/* \ ] ^ _ */ - _ESC, 0, 0, 0, - -/* ` a b c */ - _QB|_GLOB|_META, _LET|_LOW|_XD, _LET|_LOW|_XD, _LET|_LOW|_XD, - -/* d e f g */ - _LET|_LOW|_XD, _LET|_LOW|_XD, _LET|_LOW|_XD, _LET|_LOW, - -/* h i j k */ - _LET|_LOW, _LET|_LOW, _LET|_LOW, _LET|_LOW, - -/* l m n o */ - _LET|_LOW, _LET|_LOW, _LET|_LOW, _LET|_LOW, - -/* p q r s */ - _LET|_LOW, _LET|_LOW, _LET|_LOW, _LET|_LOW, - -/* t u v w */ - _LET|_LOW, _LET|_LOW, _LET|_LOW, _LET|_LOW, - -/* x y z { */ - _LET|_LOW, _LET|_LOW, _LET|_LOW, _GLOB, - -/* | } ~ del */ - _META|_CMD, 0, 0, _CTR, - -#if defined(SHORT_STRINGS) && !defined(KANJI) -/****************************************************************/ -/* 128 - 255 The below is supposedly ISO 8859/1 */ -/****************************************************************/ -/* (undef) (undef) (undef) (undef) */ - _CTR, _CTR, _CTR, _CTR, - -/* (undef) (undef) (undef) (undef) */ - _CTR, _CTR, _CTR, _CTR, - -/* (undef) (undef) (undef) (undef) */ - _CTR, _CTR, _CTR, _CTR, - -/* (undef) (undef) (undef) (undef) */ - _CTR, _CTR, _CTR, _CTR, - -/* (undef) (undef) (undef) (undef) */ - _CTR, _CTR, _CTR, _CTR, - -/* (undef) (undef) (undef) (undef) */ - _CTR, _CTR, _CTR, _CTR, - -/* (undef) (undef) (undef) (undef) */ - _CTR, _CTR, _CTR, _CTR, - -/* (undef) (undef) (undef) (undef) */ - _CTR, _CTR, _CTR, _CTR, - -/* nobreakspace exclamdown cent sterling */ - _SP, 0, 0, 0, - -/* currency yen brokenbar section */ - 0, 0, 0, 0, - -/* diaeresis copyright ordfeminine guillemotleft */ - 0, 0, 0, 0, - -/* notsign hyphen registered macron */ - 0, 0, 0, 0, - -/* degree plusminus twosuperior threesuperior */ - 0, 0, 0, 0, - -/* acute mu paragraph periodcentered */ - 0, 0, 0, 0, - -/* cedilla onesuperior masculine guillemotright */ - 0, 0, 0, 0, - -/* onequarter onehalf threequarters questiondown */ - 0, 0, 0, 0, - -/* Agrave Aacute Acircumflex Atilde */ - _LET|_UP, _LET|_UP, _LET|_UP, _LET|_UP, - -/* Adiaeresis Aring AE Ccedilla */ - _LET|_UP, _LET|_UP, _LET|_UP, _LET|_UP, - -/* Egrave Eacute Ecircumflex Ediaeresis */ - _LET|_UP, _LET|_UP, _LET|_UP, _LET|_UP, - -/* Igrave Iacute Icircumflex Idiaeresis */ - _LET|_UP, _LET|_UP, _LET|_UP, _LET|_UP, - -/* ETH Ntilde Ograve Oacute */ - _LET|_UP, _LET|_UP, _LET|_UP, _LET|_UP, - -/* Ocircumflex Otilde Odiaeresis multiply */ - _LET|_UP, _LET|_UP, _LET|_UP, 0, - -/* Ooblique Ugrave Uacute Ucircumflex */ - _LET|_UP, _LET|_UP, _LET|_UP, _LET|_UP, - -/* Udiaeresis Yacute THORN ssharp */ - _LET|_UP, _LET|_UP, _LET|_UP, _LET|_LOW, - -/* agrave aacute acircumflex atilde */ - _LET|_LOW, _LET|_LOW, _LET|_LOW, _LET|_LOW, - -/* adiaeresis aring ae ccedilla */ - _LET|_LOW, _LET|_LOW, _LET|_LOW, _LET|_LOW, - -/* egrave eacute ecircumflex ediaeresis */ - _LET|_LOW, _LET|_LOW, _LET|_LOW, _LET|_LOW, - -/* igrave iacute icircumflex idiaeresis */ - _LET|_LOW, _LET|_LOW, _LET|_LOW, _LET|_LOW, - -/* eth ntilde ograve oacute */ - _LET|_LOW, _LET|_LOW, _LET|_LOW, _LET|_LOW, - -/* ocircumflex otilde odiaeresis division */ - _LET|_LOW, _LET|_LOW, _LET|_LOW, 0, - -/* oslash ugrave uacute ucircumflex */ - _LET|_LOW, _LET|_LOW, _LET|_LOW, _LET|_LOW, - -/* udiaeresis yacute thorn ydiaeresis */ - _LET|_LOW, _LET|_LOW, _LET|_LOW, _LET|_LOW, -#endif /* SHORT_STRINGS && !KANJI */ -}; - -#ifndef NLS -/* _cmap_lower, _cmap_upper for ISO 8859/1 */ - -unsigned char _cmap_lower[256] = { - 0000, 0001, 0002, 0003, 0004, 0005, 0006, 0007, - 0010, 0011, 0012, 0013, 0014, 0015, 0016, 0017, - 0020, 0021, 0022, 0023, 0024, 0025, 0026, 0027, - 0030, 0031, 0032, 0033, 0034, 0035, 0036, 0037, - 0040, 0041, 0042, 0043, 0044, 0045, 0046, 0047, - 0050, 0051, 0052, 0053, 0054, 0055, 0056, 0057, - 0060, 0061, 0062, 0063, 0064, 0065, 0066, 0067, - 0070, 0071, 0072, 0073, 0074, 0075, 0076, 0077, - 0100, 0141, 0142, 0143, 0144, 0145, 0146, 0147, - 0150, 0151, 0152, 0153, 0154, 0155, 0156, 0157, - 0160, 0161, 0162, 0163, 0164, 0165, 0166, 0167, - 0170, 0171, 0172, 0133, 0134, 0135, 0136, 0137, - 0140, 0141, 0142, 0143, 0144, 0145, 0146, 0147, - 0150, 0151, 0152, 0153, 0154, 0155, 0156, 0157, - 0160, 0161, 0162, 0163, 0164, 0165, 0166, 0167, - 0170, 0171, 0172, 0173, 0174, 0175, 0176, 0177, - 0200, 0201, 0202, 0203, 0204, 0205, 0206, 0207, - 0210, 0211, 0212, 0213, 0214, 0215, 0216, 0217, - 0220, 0221, 0222, 0223, 0224, 0225, 0226, 0227, - 0230, 0231, 0232, 0233, 0234, 0235, 0236, 0237, - 0240, 0241, 0242, 0243, 0244, 0245, 0246, 0247, - 0250, 0251, 0252, 0253, 0254, 0255, 0256, 0257, - 0260, 0261, 0262, 0263, 0264, 0265, 0266, 0267, - 0270, 0271, 0272, 0273, 0274, 0275, 0276, 0277, - 0340, 0341, 0342, 0343, 0344, 0345, 0346, 0347, - 0350, 0351, 0352, 0353, 0354, 0355, 0356, 0357, - 0360, 0361, 0362, 0363, 0364, 0365, 0366, 0327, - 0370, 0371, 0372, 0373, 0374, 0375, 0376, 0337, - 0340, 0341, 0342, 0343, 0344, 0345, 0346, 0347, - 0350, 0351, 0352, 0353, 0354, 0355, 0356, 0357, - 0360, 0361, 0362, 0363, 0364, 0365, 0366, 0367, - 0370, 0371, 0372, 0373, 0374, 0375, 0376, 0377, -}; - -unsigned char _cmap_upper[256] = { - 0000, 0001, 0002, 0003, 0004, 0005, 0006, 0007, - 0010, 0011, 0012, 0013, 0014, 0015, 0016, 0017, - 0020, 0021, 0022, 0023, 0024, 0025, 0026, 0027, - 0030, 0031, 0032, 0033, 0034, 0035, 0036, 0037, - 0040, 0041, 0042, 0043, 0044, 0045, 0046, 0047, - 0050, 0051, 0052, 0053, 0054, 0055, 0056, 0057, - 0060, 0061, 0062, 0063, 0064, 0065, 0066, 0067, - 0070, 0071, 0072, 0073, 0074, 0075, 0076, 0077, - 0100, 0101, 0102, 0103, 0104, 0105, 0106, 0107, - 0110, 0111, 0112, 0113, 0114, 0115, 0116, 0117, - 0120, 0121, 0122, 0123, 0124, 0125, 0126, 0127, - 0130, 0131, 0132, 0133, 0134, 0135, 0136, 0137, - 0140, 0101, 0102, 0103, 0104, 0105, 0106, 0107, - 0110, 0111, 0112, 0113, 0114, 0115, 0116, 0117, - 0120, 0121, 0122, 0123, 0124, 0125, 0126, 0127, - 0130, 0131, 0132, 0173, 0174, 0175, 0176, 0177, - 0200, 0201, 0202, 0203, 0204, 0205, 0206, 0207, - 0210, 0211, 0212, 0213, 0214, 0215, 0216, 0217, - 0220, 0221, 0222, 0223, 0224, 0225, 0226, 0227, - 0230, 0231, 0232, 0233, 0234, 0235, 0236, 0237, - 0240, 0241, 0242, 0243, 0244, 0245, 0246, 0247, - 0250, 0251, 0252, 0253, 0254, 0255, 0256, 0257, - 0260, 0261, 0262, 0263, 0264, 0265, 0266, 0267, - 0270, 0271, 0272, 0273, 0274, 0275, 0276, 0277, - 0300, 0301, 0302, 0303, 0304, 0305, 0306, 0307, - 0310, 0311, 0312, 0313, 0314, 0315, 0316, 0317, - 0320, 0321, 0322, 0323, 0324, 0325, 0326, 0327, - 0330, 0331, 0332, 0333, 0334, 0335, 0336, 0337, - 0300, 0301, 0302, 0303, 0304, 0305, 0306, 0307, - 0310, 0311, 0312, 0313, 0314, 0315, 0316, 0317, - 0320, 0321, 0322, 0323, 0324, 0325, 0326, 0367, - 0330, 0331, 0332, 0333, 0334, 0335, 0336, 0377, -}; -#endif /* NLS */ diff --git a/bin/csh/char.h b/bin/csh/char.h deleted file mode 100644 index 396e7ab..0000000 --- a/bin/csh/char.h +++ /dev/null @@ -1,97 +0,0 @@ -/*- - * Copyright (c) 1980, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)char.h 8.1 (Berkeley) 5/31/93 - * $FreeBSD$ - */ - -#include <ctype.h> - -extern unsigned short _cmap[]; - -#ifndef NLS -extern unsigned char _cmap_lower[], _cmap_upper[]; - -#endif - -#define _QF 0x0001 /* '" (Forward quotes) */ -#define _QB 0x0002 /* ` (Backquote) */ -#define _SP 0x0004 /* space and tab */ -#define _NL 0x0008 /* \n */ -#define _META 0x0010 /* lex meta characters, sp #'`";&<>()|\t\n */ -#define _GLOB 0x0020 /* glob characters, *?{[` */ -#define _ESC 0x0040 /* \ */ -#define _DOL 0x0080 /* $ */ -#define _DIG 0x0100 /* 0-9 */ -#define _LET 0x0200 /* a-z, A-Z, _ */ -#define _UP 0x0400 /* A-Z */ -#define _LOW 0x0800 /* a-z */ -#define _XD 0x1000 /* 0-9, a-f, A-F */ -#define _CMD 0x2000 /* lex end of command chars, ;&(|` */ -#define _CTR 0x4000 /* control */ - -#define cmap(c, bits) \ - (((c) & QUOTE) ? 0 : (_cmap[(unsigned char)(c)] & (bits))) - -#define isglob(c) cmap(c, _GLOB) -#define isspc(c) cmap(c, _SP) -#define ismeta(c) cmap(c, _META) -#define iscmdmeta(c) cmap(c, _CMD) -#define letter(c) (((c) & QUOTE) ? 0 : \ - (isalpha((unsigned char) (c)) || (c) == '_')) -#define alnum(c) (((c) & QUOTE) ? 0 : \ - (isalnum((unsigned char) (c)) || (c) == '_')) -#ifdef NLS -#define Isspace(c) (((c) & QUOTE) ? 0 : isspace((unsigned char) (c))) -#define Isdigit(c) (((c) & QUOTE) ? 0 : isdigit((unsigned char) (c))) -#define Isalpha(c) (((c) & QUOTE) ? 0 : isalpha((unsigned char) (c))) -#define Islower(c) (((c) & QUOTE) ? 0 : islower((unsigned char) (c))) -#define Isupper(c) (((c) & QUOTE) ? 0 : isupper((unsigned char) (c))) -#define Tolower(c) (((c) & QUOTE) ? 0 : tolower((unsigned char) (c))) -#define Toupper(c) (((c) & QUOTE) ? 0 : toupper((unsigned char) (c))) -#define Isxdigit(c) (((c) & QUOTE) ? 0 : isxdigit((unsigned char) (c))) -#define Isalnum(c) (((c) & QUOTE) ? 0 : isalnum((unsigned char) (c))) -#define Iscntrl(c) (((c) & QUOTE) ? 0 : iscntrl((unsigned char) (c))) -#define Isprint(c) (((c) & QUOTE) ? 0 : isprint((unsigned char) (c))) -#else -#define Isspace(c) cmap(c, _SP|_NL) -#define Isdigit(c) cmap(c, _DIG) -#define Isalpha(c) (cmap(c,_LET) && !(((c) & META) && AsciiOnly)) -#define Islower(c) (cmap(c,_LOW) && !(((c) & META) && AsciiOnly)) -#define Isupper(c) (cmap(c, _UP) && !(((c) & META) && AsciiOnly)) -#define Tolower(c) (_cmap_lower[(unsigned char)(c)]) -#define Toupper(c) (_cmap_upper[(unsigned char)(c)]) -#define Isxdigit(c) cmap(c, _XD) -#define Isalnum(c) (cmap(c, _DIG|_LET) && !(((c) & META) && AsciiOnly)) -#define Iscntrl(c) (cmap(c,_CTR) && !(((c) & META) && AsciiOnly)) -#define Isprint(c) (!cmap(c,_CTR) && !(((c) & META) && AsciiOnly)) -#endif diff --git a/bin/csh/config.h b/bin/csh/config.h new file mode 100644 index 0000000..57dd362 --- /dev/null +++ b/bin/csh/config.h @@ -0,0 +1,153 @@ +/* config.h. Generated automatically by configure. */ +/* + * config.h -- configure various defines for tcsh + * + * All source files should #include this FIRST. + * + * Edit this to match your system type. + */ + +/* $FreeBSD$ */ + +#ifndef _h_config +#define _h_config +/****************** System dependant compilation flags ****************/ +/* + * POSIX This system supports IEEE Std 1003.1-1988 (POSIX). + */ +#define POSIX + +/* + * POSIXJOBS This system supports the optional IEEE Std 1003.1-1988 (POSIX) + * job control facilities. + */ +#define POSIXJOBS + +/* + * POSIXSIGS Use the POSIX signal facilities to emulate BSD signals. + */ +/* #undef POSIXSIGS */ + +/* + * VFORK This machine has a vfork(). + * It used to be that for job control to work, this define + * was mandatory. This is not the case any more. + * If you think you still need it, but you don't have vfork, + * define this anyway and then do #define vfork fork. + * I do this anyway on a Sun because of yellow pages brain damage, + * [should not be needed under 4.1] + * and on the iris4d cause SGI's fork is sufficiently "virtual" + * that vfork isn't necessary. (Besides, SGI's vfork is weird). + * Note that some machines eg. rs6000 have a vfork, but not + * with the berkeley semantics, so we cannot use it there either. + */ +#define VFORK + +/* + * BSDJOBS You have BSD-style job control (both process groups and + * a tty that deals correctly + */ +#define BSDJOBS + +/* + * BSDSIGS You have 4.2-style signals, rather than USG style. + * Note: POSIX systems should not define this unless they + * have sigvec() and friends (ie: 4.3BSD-RENO, HP-UX). + */ +#define BSDSIGS + +/* + * BSDTIMES You have BSD-style process time stuff (like rusage) + * This may or may not be true. For example, Apple Unix + * (OREO) has BSDJOBS and BSDSIGS but not BSDTIMES. + */ +#define BSDTIMES + +/* + * BSDLIMIT You have BSD-style resource limit stuff (getrlimit/setrlimit) + */ +#define BSDLIMIT + +/* + * BSDNICE Your system uses setpriority() instead of nice, to + * change a processes scheduling priority + */ +#define BSDNICE + +/* + * TERMIO You have struct termio instead of struct sgttyb. + * This is usually the case for SYSV systems, where + * BSD uses sgttyb. POSIX systems should define this + * anyway, even though they use struct termios. + */ +#define TERMIO + +/* + * SYSVREL Your machine is SYSV based (HPUX, A/UX) + * NOTE: don't do this if you are on a Pyramid -- tcsh is + * built in a BSD universe. + * Set SYSVREL to 1, 2, 3, or 4, depending the version of System V + * you are running. Or set it to 0 if you are not SYSV based + */ +#define SYSVREL 0 + +/* + * YPBUGS Work around Sun YP bugs that cause expansion of ~username + * to send command output to /dev/null + */ +/* #undef YPBUGS */ + +/* + * SIGVOID Define this if your signal handlers return void. On older + * systems, signal returns int, but on newer ones, it returns void. + */ +#define SIGVOID + +/* + * HAVEDUP2 Define this if your system supports dup2(). + */ +#define HAVEDUP2 + +/* + * UTHOST Does the utmp file have a host field? + */ +#define UTHOST + +/* + * DIRENT Your system has <dirent.h> instead of <sys/dir.h> + */ +#define DIRENT +/****************** local defines *********************/ +/****************** configurable hacks ****************/ + +/* have been moved to config_f.h */ +#include "config_f.h" + +#if defined(__FreeBSD__) +#define NLS_BUGS +#endif + +#if defined(__bsdi__) +/* + * _PATH_TCSHELL if you've change the installation location (vix) + */ +# ifdef _BSDI_VERSION >= 199701 +# define _PATH_TCSHELL "/bin/tcsh" +/* # undef SYSMALLOC */ +# define SYSMALLOC +# else +# define _PATH_TCSHELL "/usr/contrib/bin/tcsh" +# endif + +# undef NLS +# undef NLS_CATALOGS + +#elif defined(__APPLE__) +# define SYSMALLOC + +#else +# define NLS_CATALOGS +#endif + +#endif /* _h_config */ +/* config.h.in. Generated automatically from configure.in by autoheader. */ diff --git a/bin/csh/config_p.h b/bin/csh/config_p.h new file mode 100644 index 0000000..57dd362 --- /dev/null +++ b/bin/csh/config_p.h @@ -0,0 +1,153 @@ +/* config.h. Generated automatically by configure. */ +/* + * config.h -- configure various defines for tcsh + * + * All source files should #include this FIRST. + * + * Edit this to match your system type. + */ + +/* $FreeBSD$ */ + +#ifndef _h_config +#define _h_config +/****************** System dependant compilation flags ****************/ +/* + * POSIX This system supports IEEE Std 1003.1-1988 (POSIX). + */ +#define POSIX + +/* + * POSIXJOBS This system supports the optional IEEE Std 1003.1-1988 (POSIX) + * job control facilities. + */ +#define POSIXJOBS + +/* + * POSIXSIGS Use the POSIX signal facilities to emulate BSD signals. + */ +/* #undef POSIXSIGS */ + +/* + * VFORK This machine has a vfork(). + * It used to be that for job control to work, this define + * was mandatory. This is not the case any more. + * If you think you still need it, but you don't have vfork, + * define this anyway and then do #define vfork fork. + * I do this anyway on a Sun because of yellow pages brain damage, + * [should not be needed under 4.1] + * and on the iris4d cause SGI's fork is sufficiently "virtual" + * that vfork isn't necessary. (Besides, SGI's vfork is weird). + * Note that some machines eg. rs6000 have a vfork, but not + * with the berkeley semantics, so we cannot use it there either. + */ +#define VFORK + +/* + * BSDJOBS You have BSD-style job control (both process groups and + * a tty that deals correctly + */ +#define BSDJOBS + +/* + * BSDSIGS You have 4.2-style signals, rather than USG style. + * Note: POSIX systems should not define this unless they + * have sigvec() and friends (ie: 4.3BSD-RENO, HP-UX). + */ +#define BSDSIGS + +/* + * BSDTIMES You have BSD-style process time stuff (like rusage) + * This may or may not be true. For example, Apple Unix + * (OREO) has BSDJOBS and BSDSIGS but not BSDTIMES. + */ +#define BSDTIMES + +/* + * BSDLIMIT You have BSD-style resource limit stuff (getrlimit/setrlimit) + */ +#define BSDLIMIT + +/* + * BSDNICE Your system uses setpriority() instead of nice, to + * change a processes scheduling priority + */ +#define BSDNICE + +/* + * TERMIO You have struct termio instead of struct sgttyb. + * This is usually the case for SYSV systems, where + * BSD uses sgttyb. POSIX systems should define this + * anyway, even though they use struct termios. + */ +#define TERMIO + +/* + * SYSVREL Your machine is SYSV based (HPUX, A/UX) + * NOTE: don't do this if you are on a Pyramid -- tcsh is + * built in a BSD universe. + * Set SYSVREL to 1, 2, 3, or 4, depending the version of System V + * you are running. Or set it to 0 if you are not SYSV based + */ +#define SYSVREL 0 + +/* + * YPBUGS Work around Sun YP bugs that cause expansion of ~username + * to send command output to /dev/null + */ +/* #undef YPBUGS */ + +/* + * SIGVOID Define this if your signal handlers return void. On older + * systems, signal returns int, but on newer ones, it returns void. + */ +#define SIGVOID + +/* + * HAVEDUP2 Define this if your system supports dup2(). + */ +#define HAVEDUP2 + +/* + * UTHOST Does the utmp file have a host field? + */ +#define UTHOST + +/* + * DIRENT Your system has <dirent.h> instead of <sys/dir.h> + */ +#define DIRENT +/****************** local defines *********************/ +/****************** configurable hacks ****************/ + +/* have been moved to config_f.h */ +#include "config_f.h" + +#if defined(__FreeBSD__) +#define NLS_BUGS +#endif + +#if defined(__bsdi__) +/* + * _PATH_TCSHELL if you've change the installation location (vix) + */ +# ifdef _BSDI_VERSION >= 199701 +# define _PATH_TCSHELL "/bin/tcsh" +/* # undef SYSMALLOC */ +# define SYSMALLOC +# else +# define _PATH_TCSHELL "/usr/contrib/bin/tcsh" +# endif + +# undef NLS +# undef NLS_CATALOGS + +#elif defined(__APPLE__) +# define SYSMALLOC + +#else +# define NLS_CATALOGS +#endif + +#endif /* _h_config */ +/* config.h.in. Generated automatically from configure.in by autoheader. */ diff --git a/bin/csh/const.c b/bin/csh/const.c deleted file mode 100644 index 41de3c1..0000000 --- a/bin/csh/const.c +++ /dev/null @@ -1,167 +0,0 @@ -/*- - * Copyright (c) 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -#if 0 -static char sccsid[] = "@(#)const.c 8.1 (Berkeley) 5/31/93"; -#else -static const char rcsid[] = - "$FreeBSD$"; -#endif -#endif /* not lint */ - -/* - * tc.const.c: String constants for csh. - */ - -#include "csh.h" - -Char STR0[] = { '0', '\0' }; -Char STR1[] = { '1', '\0' }; -Char STRHOME[] = { 'H', 'O', 'M', 'E', '\0' }; -Char STRLANG[] = { 'L', 'A', 'N', 'G', '\0' }; -Char STRLC_ALL[] = { 'L', 'C', '_', 'A', 'L', 'L', '\0' }; -Char STRLC_CTYPE[] = { 'L', 'C', '_', 'C', 'T', 'Y', 'P', 'E', '\0' }; -Char STRLC_COLLATE[] = { 'L', 'C', '_', 'C', 'O', 'L', 'L', 'A', 'T', 'E', '\0' }; -Char STRLOGNAME[] = { 'L', 'O', 'G', 'N', 'A', 'M', 'E', '\0' }; -Char STRLbrace[] = { '{', '\0' }; -Char STRLparen[] = { '(', '\0' }; -Char STRLparensp[] = { '(', ' ', '\0' }; -Char STRNULL[] = { '\0' }; -Char STRPATH[] = { 'P', 'A', 'T', 'H', '\0' }; -Char STRPWD[] = { 'P', 'W', 'D', '\0' }; -Char STRQNULL[] = { '\0' | QUOTE, '\0' }; -Char STRRbrace[] = { '}', '\0' }; -Char STRspRparen[] = { ' ', ')', '\0' }; -Char STRTERM[] = { 'T', 'E', 'R', 'M', '\0' }; -Char STRUSER[] = { 'U', 'S', 'E', 'R', '\0' }; -Char STRalias[] = { 'a', 'l', 'i', 'a', 's', '\0' }; -Char STRand[] = { '&', '\0' }; -Char STRand2[] = { '&', '&', '\0' }; -Char STRaout[] = { 'a', '.', 'o', 'u', 't', '\0' }; -Char STRargv[] = { 'a', 'r', 'g', 'v', '\0' }; -Char STRbang[] = { '!', '\0' }; -Char STRcaret[] = { '^', '\0' }; -Char STRcdpath[] = { 'c', 'd', 'p', 'a', 't', 'h', '\0' }; -Char STRcent2[] = { '%', '%', '\0' }; -Char STRcenthash[] = { '%', '#', '\0' }; -Char STRcentplus[] = { '%', '+', '\0' }; -Char STRcentminus[] = { '%', '-', '\0' }; -Char STRchase_symlinks[] = { 'c', 'h', 'a', 's', 'e', '_', 's', 'y', 'm', 'l', - 'i', 'n', 'k', 's', '\0' }; -Char STRchild[] = { 'c', 'h', 'i', 'l', 'd', '\0' }; -Char STRcolon[] = { ':', '\0' }; -Char STRcwd[] = { 'c', 'w', 'd', '\0' }; -Char STRdefault[] = { 'd', 'e', 'f', 'a', 'u', 'l', 't', '\0' }; -Char STRdot[] = { '.', '\0' }; -Char STRdotdotsl[] = { '.', '.', '/', '\0' }; -Char STRdotsl[] = { '.', '/', '\0' }; -Char STRecho[] = { 'e', 'c', 'h', 'o', '\0' }; -Char STRequal[] = { '=', '\0' }; -Char STRfakecom[] = { '{', ' ', '.', '.', '.', ' ', '}', '\0' }; -Char STRfakecom1[] = { '`', ' ', '.', '.', '.', ' ', '`', '\0' }; -Char STRfignore[] = { 'f', 'i', 'g', 'n', 'o', 'r', 'e', '\0' }; -#ifdef FILEC -Char STRfilec[] = { 'f', 'i', 'l', 'e', 'c', '\0' }; -#endif /* FILEC */ -Char STRhistchars[] = { 'h', 'i', 's', 't', 'c', 'h', 'a', 'r', 's', '\0' }; -Char STRtildothist[] = { '~', '/', '.', 'h', 'i', 's', 't', 'o', 'r', - 'y', '\0' }; -Char STRhistfile[] = { 'h', 'i', 's', 't', 'f', 'i', 'l', 'e', '\0' }; -Char STRhistory[] = { 'h', 'i', 's', 't', 'o', 'r', 'y', '\0' }; -Char STRhome[] = { 'h', 'o', 'm', 'e', '\0' }; -Char STRignore_symlinks[] = { 'i', 'g', 'n', 'o', 'r', 'e', '_', 's', 'y', 'm', - 'l', 'i', 'n', 'k', 's', '\0' }; -Char STRignoreeof[] = { 'i', 'g', 'n', 'o', 'r', 'e', 'e', 'o', 'f', '\0' }; -Char STRjobs[] = { 'j', 'o', 'b', 's', '\0' }; -Char STRlistjobs[] = { 'l', 'i', 's', 't', 'j', 'o', 'b', 's', '\0' }; -Char STRlogout[] = { 'l', 'o', 'g', 'o', 'u', 't', '\0' }; -Char STRlong[] = { 'l', 'o', 'n', 'g', '\0' }; -Char STRmail[] = { 'm', 'a', 'i', 'l', '\0' }; -Char STRmh[] = { '-', 'h', '\0' }; -Char STRminus[] = { '-', '\0' }; -Char STRml[] = { '-', 'l', '\0' }; -Char STRmn[] = { '-', 'n', '\0' }; -Char STRmquestion[] = { '?' | QUOTE, ' ', '\0' }; -Char STRnice[] = { 'n', 'i', 'c', 'e', '\0' }; -Char STRnoambiguous[] = { 'n', 'o', 'a', 'm', 'b', 'i', 'g', 'u', 'o', 'u', - 's', '\0' }; -Char STRnobeep[] = { 'n', 'o', 'b', 'e', 'e', 'p', '\0' }; -Char STRnoclobber[] = { 'n', 'o', 'c', 'l', 'o', 'b', 'b', 'e', 'r', '\0' }; -Char STRnoglob[] = { 'n', 'o', 'g', 'l', 'o', 'b', '\0' }; -Char STRnohup[] = { 'n', 'o', 'h', 'u', 'p', '\0' }; -Char STRnonomatch[] = { 'n', 'o', 'n', 'o', 'm', 'a', 't', 'c', 'h', '\0' }; -Char STRnormal[] = { 'n', 'o', 'r', 'm', 'a', 'l', '\0' }; -Char STRnotify[] = { 'n', 'o', 't', 'i', 'f', 'y', '\0' }; -Char STRor[] = { '|', '\0' }; -Char STRor2[] = { '|', '|', '\0' }; -Char STRpath[] = { 'p', 'a', 't', 'h', '\0' }; -Char STRprintexitvalue[] = { 'p', 'r', 'i', 'n', 't', 'e', 'x', 'i', 't', 'v', - 'a', 'l', 'u', 'e', '\0' }; -Char STRprompt[] = { 'p', 'r', 'o', 'm', 'p', 't', '\0' }; -Char STRprompt2[] = { 'p', 'r', 'o', 'm', 'p', 't', '2', '\0' }; -Char STRpushdsilent[] = { 'p', 'u', 's', 'h', 'd', 's', 'i', 'l', 'e', 'n', - 't', '\0' }; -Char STRret[] = { '\n', '\0' }; -Char STRsavehist[] = { 's', 'a', 'v', 'e', 'h', 'i', 's', 't', '\0' }; -Char STRsemisp[] = { ';', ' ', '\0' }; -Char STRshell[] = { 's', 'h', 'e', 'l', 'l', '\0' }; -Char STRslash[] = { '/', '\0' }; -Char STRsldotcshrc[] = { '/', '.', 'c', 's', 'h', 'r', 'c', '\0' }; -Char STRsldotlogin[] = { '/', '.', 'l', 'o', 'g', 'i', 'n', '\0' }; -Char STRsldthist[] = { '/', '.', 'h', 'i', 's', 't', 'o', 'r', 'y', '\0' }; -Char STRsldtlogout[] = { '/', '.', 'l', 'o', 'g', 'o', 'u', 't', '\0' }; -Char STRsource[] = { 's', 'o', 'u', 'r', 'c', 'e', '\0' }; -Char STRsp3dots[] = { ' ', '.', '.', '.', '\0' }; -Char STRspLarrow2sp[] = { ' ', '<', '<', ' ', '\0' }; -Char STRspLarrowsp[] = { ' ', '<', ' ', '\0' }; -Char STRspRarrow[] = { ' ', '>', '\0' }; -Char STRspRarrow2[] = { ' ', '>', '>', '\0' }; -Char STRRparen[] = { ')', '\0' }; -Char STRspace[] = { ' ', '\0' }; -Char STRspand2sp[] = { ' ', '&', '&', ' ', '\0' }; -Char STRspor2sp[] = { ' ', '|', '|', ' ', '\0' }; -Char STRsporsp[] = { ' ', '|', ' ', '\0' }; -Char STRstar[] = { '*', '\0' }; -Char STRstatus[] = { 's', 't', 'a', 't', 'u', 's', '\0' }; -Char STRsymcent[] = { '%', ' ', '\0' }; -Char STRsymhash[] = { '#', ' ', '\0' }; -Char STRterm[] = { 't', 'e', 'r', 'm', '\0' }; -Char STRthen[] = { 't', 'h', 'e', 'n', '\0' }; -Char STRtilde[] = { '~', '\0' }; -Char STRtime[] = { 't', 'i', 'm', 'e', '\0' }; -Char STRtmpsh[] = { '/', 't', 'm', 'p', '/', 's', 'h', '\0' }; -Char STRunalias[] = { 'u', 'n', 'a', 'l', 'i', 'a', 's', '\0' }; -Char STRuser[] = { 'u', 's', 'e', 'r', '\0' }; -Char STRverbose[] = { 'v', 'e', 'r', 'b', 'o', 's', 'e', '\0' }; -Char STRwordchars[] = { 'w', 'o', 'r', 'd', 'c', 'h', 'a', 'r', 's', '\0' }; diff --git a/bin/csh/csh.c b/bin/csh/csh.c deleted file mode 100644 index 0bbc557..0000000 --- a/bin/csh/csh.c +++ /dev/null @@ -1,1362 +0,0 @@ -/*- - * Copyright (c) 1980, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static const char copyright[] = -"@(#) Copyright (c) 1980, 1991, 1993\n\ - The Regents of the University of California. All rights reserved.\n"; -#endif /* not lint */ - -#ifndef lint -#if 0 -static char sccsid[] = "@(#)csh.c 8.2 (Berkeley) 10/12/93"; -#else -static const char rcsid[] = - "$FreeBSD$"; -#endif -#endif /* not lint */ - -#include <sys/param.h> -#include <sys/ioctl.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <errno.h> -#include <pwd.h> -#include <stdlib.h> -#include <string.h> -#include <locale.h> -#include <unistd.h> -#include <vis.h> -#if __STDC__ -# include <stdarg.h> -#else -# include <varargs.h> -#endif - -#include "csh.h" -#include "proc.h" -#include "extern.h" -#include "pathnames.h" - -extern bool MapsAreInited; -extern bool NLSMapsAreInited; - -/* - * C Shell - * - * Bill Joy, UC Berkeley, California, USA - * October 1978, May 1980 - * - * Jim Kulp, IIASA, Laxenburg, Austria - * April 1980 - * - * Christos Zoulas, Cornell University - * June, 1991 - */ - -Char *dumphist[] = {STRhistory, STRmh, 0, 0}; -Char *loadhist[] = {STRsource, STRmh, STRtildothist, 0}; - -int nofile = 0; -bool reenter = 0; -bool nverbose = 0; -bool nexececho = 0; -bool quitit = 0; -bool fast = 0; -bool batch = 0; -bool mflag = 0; -bool prompt = 1; -bool enterhist = 0; -bool tellwhat = 0; - -extern char **environ; - -static int readf __P((void *, char *, int)); -static fpos_t seekf __P((void *, fpos_t, int)); -static int writef __P((void *, const char *, int)); -static int closef __P((void *)); -static int srccat __P((Char *, Char *)); -static int srcfile __P((char *, bool, bool)); -static void phup __P((int)); -static void srcunit __P((int, bool, bool)); -static void mailchk __P((void)); -static Char **defaultpath __P((void)); - -int -main(argc, argv) - int argc; - char **argv; -{ - Char *cp; - char *tcp; - int f; - char **tempv; - struct sigvec osv; - - cshin = stdin; - cshout = stdout; - csherr = stderr; - - settimes(); /* Immed. estab. timing base */ - - /* - * Initialize non constant strings - */ -#ifdef _PATH_BSHELL - STR_BSHELL = SAVE(_PATH_BSHELL); -#endif -#ifdef _PATH_CSHELL - STR_SHELLPATH = SAVE(_PATH_CSHELL); -#endif - STR_environ = blk2short(environ); - environ = short2blk(STR_environ); /* So that we can free it */ - STR_WORD_CHARS = SAVE(WORD_CHARS); - - HIST = '!'; - HISTSUB = '^'; - word_chars = STR_WORD_CHARS; - - tempv = argv; - if (eq(str2short(tempv[0]), STRaout)) /* A.out's are quittable */ - quitit = 1; - uid = getuid(); - gid = getgid(); - euid = geteuid(); - egid = getegid(); - /* - * We are a login shell if: 1. we were invoked as -<something> and we had - * no arguments 2. or we were invoked only with the -l flag - */ - loginsh = (**tempv == '-' && argc == 1) || - (argc == 2 && tempv[1][0] == '-' && tempv[1][1] == 'l' && - tempv[1][2] == '\0'); - - if (loginsh && **tempv != '-') { - /* - * Mangle the argv space - */ - tempv[1][0] = '\0'; - tempv[1][1] = '\0'; - tempv[1] = NULL; - for (tcp = *tempv; *tcp++;) - continue; - for (tcp--; tcp >= *tempv; tcp--) - tcp[1] = tcp[0]; - *++tcp = '-'; - argc--; - } - if (loginsh) - (void) time(&chktim); - - AsciiOnly = 1; -#ifdef NLS - (void) setlocale(LC_ALL, ""); - { - int k; - - for (k = 0200; k <= 0377 && !Isprint(k); k++) - continue; - AsciiOnly = k > 0377; - } -#else - AsciiOnly = getenv("LANG") == NULL && - getenv("LC_ALL") == NULL && - getenv("LC_CTYPE") == NULL; -#endif /* NLS */ - - /* - * Move the descriptors to safe places. The variable didfds is 0 while we - * have only FSH* to work with. When didfds is true, we have 0,1,2 and - * prefer to use these. - */ - initdesc(); - /* - * XXX: This is to keep programs that use stdio happy. - * what we really want is freunopen() .... - * Closing cshin cshout and csherr (which are really stdin stdout - * and stderr at this point and then reopening them in the same order - * gives us again stdin == cshin stdout == cshout and stderr == csherr. - * If that was not the case builtins like printf that use stdio - * would break. But in any case we could fix that with memcpy and - * a bit of pointer manipulation... - * Fortunately this is not needed under the current implementation - * of stdio. - */ - (void) fclose(cshin); - (void) fclose(cshout); - (void) fclose(csherr); - if (!(cshin = funopen((void *) &SHIN, readf, writef, seekf, closef))) - exit(1); - if (!(cshout = funopen((void *) &SHOUT, readf, writef, seekf, closef))) - exit(1); - if (!(csherr = funopen((void *) &SHERR, readf, writef, seekf, closef))) - exit(1); - (void) setvbuf(cshin, NULL, _IOLBF, 0); - (void) setvbuf(cshout, NULL, _IOLBF, 0); - (void) setvbuf(csherr, NULL, _IOLBF, 0); - - /* - * Initialize the shell variables. ARGV and PROMPT are initialized later. - * STATUS is also munged in several places. CHILD is munged when - * forking/waiting - */ - set(STRstatus, Strsave(STR0)); - - if ((tcp = getenv("HOME")) != NULL && strlen(tcp) < MAXPATHLEN) - cp = SAVE(tcp); - else - cp = NULL; - - if (cp == NULL) - fast = 1; /* No home -> can't read scripts */ - else - set(STRhome, cp); - dinit(cp); /* dinit thinks that HOME == cwd in a login - * shell */ - /* - * Grab other useful things from the environment. Should we grab - * everything?? - */ - if ((tcp = getenv("LOGNAME")) != NULL || - (tcp = getenv("USER")) != NULL) - set(STRuser, SAVE(tcp)); - if ((tcp = getenv("TERM")) != NULL) - set(STRterm, SAVE(tcp)); - - set(STRshell, Strsave(STR_SHELLPATH)); - - doldol = putn((int) getpid()); /* For $$ */ - shtemp = Strspl(STRtmpsh, doldol); /* For << */ - - /* - * Record the interrupt states from the parent process. If the parent is - * non-interruptible our hand must be forced or we (and our children) won't - * be either. Our children inherit termination from our parent. We catch it - * only if we are the login shell. - */ - /* parents interruptibility */ - (void) sigvec(SIGINT, NULL, &osv); - parintr = (void (*) ()) osv.sv_handler; - (void) sigvec(SIGTERM, NULL, &osv); - parterm = (void (*) ()) osv.sv_handler; - - if (loginsh) { - (void) signal(SIGHUP, phup); /* exit processing on HUP */ - (void) signal(SIGXCPU, phup); /* ...and on XCPU */ - (void) signal(SIGXFSZ, phup); /* ...and on XFSZ */ - } - - /* - * Process the arguments. - * - * Note that processing of -v/-x is actually delayed till after script - * processing. - * - * We set the first character of our name to be '-' if we are a shell - * running interruptible commands. Many programs which examine ps'es - * use this to filter such shells out. - */ - argc--, tempv++; - while (argc > 0 && (tcp = tempv[0])[0] == '-' && *++tcp != '\0' && !batch) { - do - switch (*tcp++) { - - case 0: /* - Interruptible, no prompt */ - prompt = 0; - setintr = 1; - nofile = 1; - break; - - case 'b': /* -b Next arg is input file */ - batch = 1; - break; - - case 'c': /* -c Command input from arg */ - if (argc == 1) - xexit(0); - argc--, tempv++; - arginp = SAVE(tempv[0]); - prompt = 0; - nofile = 1; - break; - - case 'e': /* -e Exit on any error */ - exiterr = 1; - break; - - case 'f': /* -f Fast start */ - fast = 1; - break; - - case 'i': /* -i Interactive, even if !intty */ - intact = 1; - nofile = 1; - break; - - case 'm': /* -m read .cshrc (from su) */ - mflag = 1; - break; - - case 'n': /* -n Don't execute */ - noexec = 1; - break; - - case 'q': /* -q (Undoc'd) ... die on quit */ - quitit = 1; - break; - - case 's': /* -s Read from std input */ - nofile = 1; - break; - - case 't': /* -t Read one line from input */ - onelflg = 2; - prompt = 0; - nofile = 1; - break; - - case 'v': /* -v Echo hist expanded input */ - nverbose = 1; /* ... later */ - break; - - case 'x': /* -x Echo just before execution */ - nexececho = 1; /* ... later */ - break; - - case 'V': /* -V Echo hist expanded input */ - setNS(STRverbose); /* NOW! */ - break; - - case 'X': /* -X Echo just before execution */ - setNS(STRecho); /* NOW! */ - break; - - } while (*tcp); - tempv++, argc--; - } - - if (quitit) /* With all due haste, for debugging */ - (void) signal(SIGQUIT, SIG_DFL); - - /* - * Unless prevented by -, -c, -i, -s, or -t, if there are remaining - * arguments the first of them is the name of a shell file from which to - * read commands. - */ - if (nofile == 0 && argc > 0) { - nofile = open(tempv[0], O_RDONLY); - if (nofile < 0) { - child = 1; /* So this doesn't return */ - stderror(ERR_SYSTEM, tempv[0], strerror(errno)); - } - ffile = SAVE(tempv[0]); - /* - * Replace FSHIN. Handle /dev/std{in,out,err} specially - * since once they are closed we cannot open them again. - * In that case we use our own saved descriptors - */ - if ((SHIN = dmove(nofile, FSHIN)) < 0) - switch(nofile) { - case 0: - SHIN = FSHIN; - break; - case 1: - SHIN = FSHOUT; - break; - case 2: - SHIN = FSHERR; - break; - default: - stderror(ERR_SYSTEM, tempv[0], strerror(errno)); - break; - } - (void) ioctl(SHIN, FIOCLEX, NULL); - prompt = 0; - /* argc not used any more */ tempv++; - } - - intty = isatty(SHIN); - intty |= intact; - if (intty || (intact && isatty(SHOUT))) { - if (!batch && (uid != euid || gid != egid)) { - errno = EACCES; - child = 1; /* So this doesn't return */ - stderror(ERR_SYSTEM, "csh", strerror(errno)); - } - } - - /* - * Re-initialize path if set in environment - * importpath uses intty and intact - */ - if ((tcp = getenv("PATH")) == NULL) - set1(STRpath, defaultpath(), &shvhed); - else - importpath(SAVE(tcp)); - - /* - * Decide whether we should play with signals or not. If we are explicitly - * told (via -i, or -) or we are a login shell (arg0 starts with -) or the - * input and output are both the ttys("csh", or "csh</dev/ttyx>/dev/ttyx") - * Note that in only the login shell is it likely that parent may have set - * signals to be ignored - */ - if (loginsh || intact || (intty && isatty(SHOUT))) - setintr = 1; - settell(); - /* - * Save the remaining arguments in argv. - */ - setq(STRargv, blk2short(tempv), &shvhed); - - /* - * Set up the prompt. - */ - if (prompt) { - set(STRprompt, Strsave(uid == 0 ? STRsymhash : STRsymcent)); - /* that's a meta-questionmark */ - set(STRprompt2, Strsave(STRmquestion)); - } - - /* - * If we are an interactive shell, then start fiddling with the signals; - * this is a tricky game. - */ - shpgrp = getpgrp(); - opgrp = tpgrp = -1; - if (setintr) { - **argv = '-'; - if (!quitit) /* Wary! */ - (void) signal(SIGQUIT, SIG_IGN); - (void) signal(SIGINT, pintr); - (void) sigblock(sigmask(SIGINT)); - (void) signal(SIGTERM, SIG_IGN); - if (quitit == 0 && arginp == 0) { - (void) signal(SIGTSTP, SIG_IGN); - (void) signal(SIGTTIN, SIG_IGN); - (void) signal(SIGTTOU, SIG_IGN); - /* - * Wait till in foreground, in case someone stupidly runs csh & - * dont want to try to grab away the tty. - */ - if (isatty(FSHERR)) - f = FSHERR; - else if (isatty(FSHOUT)) - f = FSHOUT; - else if (isatty(OLDSTD)) - f = OLDSTD; - else - f = -1; - retry: - if ((tpgrp = tcgetpgrp(f)) != -1) { - if (tpgrp != shpgrp) { - sig_t old = signal(SIGTTIN, SIG_DFL); - (void) kill(0, SIGTTIN); - (void) signal(SIGTTIN, old); - goto retry; - } - opgrp = shpgrp; - shpgrp = getpid(); - tpgrp = shpgrp; - /* - * Setpgid will fail if we are a session leader and - * mypid == mypgrp (POSIX 4.3.3) - */ - if (opgrp != shpgrp) - if (setpgid(0, shpgrp) == -1) - goto notty; - /* - * We do that after we set our process group, to make sure - * that the process group belongs to a process in the same - * session as the tty (our process and our group) (POSIX 7.2.4) - */ - if (tcsetpgrp(f, shpgrp) == -1) - goto notty; - (void) ioctl(dcopy(f, FSHTTY), FIOCLEX, NULL); - } - if (tpgrp == -1) { -notty: - (void) fprintf(csherr, "Warning: no access to tty (%s).\n", - strerror(errno)); - (void) fprintf(csherr, "Thus no job control in this shell.\n"); - } - } - } - if ((setintr == 0) && (parintr == SIG_DFL)) - setintr = 1; - (void) signal(SIGCHLD, pchild); /* while signals not ready */ - - /* - * Set an exit here in case of an interrupt or error reading the shell - * start-up scripts. - */ - reenter = setexit(); /* PWP */ - haderr = 0; /* In case second time through */ - if (!fast && reenter == 0) { - /* Will have value(STRhome) here because set fast if don't */ - { - int osetintr = setintr; - sig_t oparintr = parintr; - int omask = sigblock(sigmask(SIGINT)); - - setintr = 0; - parintr = SIG_IGN; /* Disable onintr */ -#ifdef _PATH_DOTCSHRC - (void) srcfile(_PATH_DOTCSHRC, 0, 0); -#endif - if (!fast && !arginp && !onelflg) - dohash(NULL, NULL); -#ifdef _PATH_DOTLOGIN - if (loginsh) - (void) srcfile(_PATH_DOTLOGIN, 0, 0); -#endif - (void) sigsetmask(omask); - setintr = osetintr; - parintr = oparintr; - } - (void) srccat(value(STRhome), STRsldotcshrc); - - if (!fast && !arginp && !onelflg && !havhash) - dohash(NULL, NULL); - /* - * Source history before .login so that it is available in .login - */ - if ((cp = value(STRhistfile)) != STRNULL) - loadhist[2] = cp; - dosource(loadhist, NULL); - if (loginsh) - (void) srccat(value(STRhome), STRsldotlogin); - } - - /* - * Now are ready for the -v and -x flags - */ - if (nverbose) - setNS(STRverbose); - if (nexececho) - setNS(STRecho); - - /* - * All the rest of the world is inside this call. The argument to process - * indicates whether it should catch "error unwinds". Thus if we are a - * interactive shell our call here will never return by being blown past on - * an error. - */ - process(setintr); - - /* - * Mop-up. - */ - if (intty) { - if (loginsh) { - (void) fprintf(cshout, "logout\n"); - (void) close(SHIN); - child = 1; - goodbye(); - } - else { - (void) fprintf(cshout, "exit\n"); - } - } - rechist(); - exitstat(); - return (0); -} - -void -untty() -{ - if (tpgrp > 0) { - (void) setpgid(0, opgrp); - (void) tcsetpgrp(FSHTTY, opgrp); - } -} - -void -importpath(cp) - Char *cp; -{ - int i = 0; - Char *dp; - Char **pv; - int c; - - for (dp = cp; *dp; dp++) - if (*dp == ':') - i++; - /* - * i+2 where i is the number of colons in the path. There are i+1 - * directories in the path plus we need room for a zero terminator. - */ - pv = (Char **) xcalloc((size_t) (i + 2), sizeof(Char **)); - dp = cp; - i = 0; - if (*dp) - for (;;) { - if ((c = *dp) == ':' || c == 0) { - *dp = 0; - if (*cp != '/' && (euid == 0 || uid == 0) && - (intact || (intty && isatty(SHOUT)))) - (void) fprintf(csherr, - "Warning: imported path contains relative components\n"); - pv[i++] = Strsave(*cp ? cp : STRdot); - if (c) { - cp = dp + 1; - *dp = ':'; - } - else - break; - } - dp++; - } - pv[i] = 0; - set1(STRpath, pv, &shvhed); -} - -/* - * Source to the file which is the catenation of the argument names. - */ -static int -srccat(cp, dp) - Char *cp, *dp; -{ - Char *ep = Strspl(cp, dp); - char *ptr = short2str(ep); - - xfree((ptr_t) ep); - return srcfile(ptr, mflag ? 0 : 1, 0); -} - -/* - * Source to a file putting the file descriptor in a safe place (> 2). - */ -static int -srcfile(f, onlyown, flag) - char *f; - bool onlyown, flag; -{ - int unit; - - if ((unit = open(f, O_RDONLY)) == -1) - return 0; - unit = dmove(unit, -1); - - (void) ioctl(unit, FIOCLEX, NULL); - srcunit(unit, onlyown, flag); - return 1; -} - -/* - * Source to a unit. If onlyown it must be our file or our group or - * we don't chance it. This occurs on ".cshrc"s and the like. - */ -int insource; -static void -srcunit(unit, onlyown, hflg) - int unit; - bool onlyown, hflg; -{ - /* We have to push down a lot of state here */ - /* All this could go into a structure */ - int oSHIN = -1, oldintty = intty, oinsource = insource; - struct whyle *oldwhyl = whyles; - Char *ogointr = gointr, *oarginp = arginp; - Char *oevalp = evalp, **oevalvec = evalvec; - int oonelflg = onelflg; - bool oenterhist = enterhist; - char OHIST = HIST; - bool otell = cantell; - - struct Bin saveB; - volatile int omask; - jmp_buf oldexit; - - /* The (few) real local variables */ - int my_reenter; - - if (unit < 0) - return; - if (didfds) - donefds(); - if (onlyown) { - struct stat stb; - - if (fstat(unit, &stb) < 0) { - (void) close(unit); - return; - } - } - - /* - * There is a critical section here while we are pushing down the input - * stream since we have stuff in different structures. If we weren't - * careful an interrupt could corrupt SHIN's Bin structure and kill the - * shell. - * - * We could avoid the critical region by grouping all the stuff in a single - * structure and pointing at it to move it all at once. This is less - * efficient globally on many variable references however. - */ - insource = 1; - getexit(oldexit); - omask = 0; - - if (setintr) - omask = sigblock(sigmask(SIGINT)); - /* Setup the new values of the state stuff saved above */ - memmove((char *) &(saveB), (char *) &B, sizeof(B)); - fbuf = NULL; - fseekp = feobp = fblocks = 0; - oSHIN = SHIN, SHIN = unit, arginp = 0, onelflg = 0; - intty = isatty(SHIN), whyles = 0, gointr = 0; - evalvec = 0; - evalp = 0; - enterhist = hflg; - if (enterhist) - HIST = '\0'; - - /* - * Now if we are allowing commands to be interrupted, we let ourselves be - * interrupted. - */ - if (setintr) - (void) sigsetmask(omask); - settell(); - - if ((my_reenter = setexit()) == 0) - process(0); /* 0 -> blow away on errors */ - - if (setintr) - (void) sigsetmask(omask); - if (oSHIN >= 0) { - int i; - - /* We made it to the new state... free up its storage */ - /* This code could get run twice but xfree doesn't care */ - for (i = 0; i < fblocks; i++) - xfree((ptr_t) fbuf[i]); - xfree((ptr_t) fbuf); - - /* Reset input arena */ - memmove((char *) &B, (char *) &(saveB), sizeof(B)); - - (void) close(SHIN), SHIN = oSHIN; - arginp = oarginp, onelflg = oonelflg; - evalp = oevalp, evalvec = oevalvec; - intty = oldintty, whyles = oldwhyl, gointr = ogointr; - if (enterhist) - HIST = OHIST; - enterhist = oenterhist; - cantell = otell; - } - - resexit(oldexit); - /* - * If process reset() (effectively an unwind) then we must also unwind. - */ - if (my_reenter) - stderror(ERR_SILENT); - insource = oinsource; -} - -void -rechist() -{ - Char buf[BUFSIZ], hbuf[BUFSIZ], *hfile; - int fp, ftmp, oldidfds; - struct varent *shist; - - if (!fast) { - /* - * If $savehist is just set, we use the value of $history - * else we use the value in $savehist - */ - if ((shist = adrof(STRsavehist)) != NULL) { - if (shist->vec[0][0] != '\0') - (void) Strcpy(hbuf, shist->vec[0]); - else if ((shist = adrof(STRhistory)) && shist->vec[0][0] != '\0') - (void) Strcpy(hbuf, shist->vec[0]); - else - return; - } - else - return; - - if ((hfile = value(STRhistfile)) == STRNULL) { - hfile = Strcpy(buf, value(STRhome)); - (void) Strcat(buf, STRsldthist); - } - - if ((fp = creat(short2str(hfile), 0600)) == -1) - return; - - oldidfds = didfds; - didfds = 0; - ftmp = SHOUT; - SHOUT = fp; - dumphist[2] = hbuf; - dohist(dumphist, NULL); - SHOUT = ftmp; - (void) close(fp); - didfds = oldidfds; - } -} - -void -goodbye() -{ - rechist(); - - if (loginsh) { - (void) signal(SIGQUIT, SIG_IGN); - (void) signal(SIGINT, SIG_IGN); - (void) signal(SIGTERM, SIG_IGN); - setintr = 0; /* No interrupts after "logout" */ - if (!(adrof(STRlogout))) - set(STRlogout, STRnormal); -#ifdef _PATH_DOTLOGOUT - (void) srcfile(_PATH_DOTLOGOUT, 0, 0); -#endif - if (adrof(STRhome)) - (void) srccat(value(STRhome), STRsldtlogout); - } - exitstat(); -} - -void -exitstat() -{ - Char *s; -#ifdef PROF - monitor(0); -#endif - /* - * Note that if STATUS is corrupted (i.e. getn bombs) then error will exit - * directly because we poke child here. Otherwise we might continue - * unwarrantedly (sic). - */ - child = 1; - s = value(STRstatus); - xexit(s ? getn(s) : 0); -} - -/* - * in the event of a HUP we want to save the history - */ -static void -phup(sig) -int sig; -{ - rechist(); - - /* - * We kill the last foreground process group. It then becomes - * responsible to propagate the SIGHUP to its progeny. - */ - { - struct process *pp, *np; - - for (pp = proclist.p_next; pp; pp = pp->p_next) { - np = pp; - /* - * Find if this job is in the foreground. It could be that - * the process leader has exited and the foreground flag - * is cleared for it. - */ - do - /* - * If a process is in the foreground; we try to kill - * it's process group. If we succeed, then the - * whole job is gone. Otherwise we keep going... - * But avoid sending HUP to the shell again. - */ - if ((np->p_flags & PFOREGND) != 0 && np->p_jobid != shpgrp && - killpg(np->p_jobid, SIGHUP) != -1) { - /* In case the job was suspended... */ - (void) killpg(np->p_jobid, SIGCONT); - break; - } - while ((np = np->p_friends) != pp); - } - } - _exit(sig); -} - -Char *jobargv[2] = {STRjobs, 0}; - -/* - * Catch an interrupt, e.g. during lexical input. - * If we are an interactive shell, we reset the interrupt catch - * immediately. In any case we drain the shell output, - * and finally go through the normal error mechanism, which - * gets a chance to make the shell go away. - */ -/* ARGSUSED */ -void -pintr(notused) - int notused; -{ - pintr1(1); -} - -void -pintr1(wantnl) - bool wantnl; -{ - Char **v; - int omask; - - omask = sigblock(0); - if (setintr) { - (void) sigsetmask(omask & ~sigmask(SIGINT)); - if (pjobs) { - pjobs = 0; - (void) fprintf(cshout, "\n"); - dojobs(jobargv, NULL); - stderror(ERR_NAME | ERR_INTR); - } - } - (void) sigsetmask(omask & ~sigmask(SIGCHLD)); - (void) fpurge(cshout); - (void) endpwent(); - - /* - * If we have an active "onintr" then we search for the label. Note that if - * one does "onintr -" then we shan't be interruptible so we needn't worry - * about that here. - */ - if (gointr) { - gotolab(gointr); - timflg = 0; - if ((v = pargv) != NULL) - pargv = 0, blkfree(v); - if ((v = gargv) != NULL) - gargv = 0, blkfree(v); - reset(); - } - else if (intty && wantnl) { - (void) fputc('\r', cshout); - (void) fputc('\n', cshout); - } - stderror(ERR_SILENT); -} - -/* - * Process is the main driving routine for the shell. - * It runs all command processing, except for those within { ... } - * in expressions (which is run by a routine evalav in sh.exp.c which - * is a stripped down process), and `...` evaluation which is run - * also by a subset of this code in sh.glob.c in the routine backeval. - * - * The code here is a little strange because part of it is interruptible - * and hence freeing of structures appears to occur when none is necessary - * if this is ignored. - * - * Note that if catch is not set then we will unwind on any error. - * If an end-of-file occurs, we return. - */ -static struct command *savet = NULL; -void -process(catch) - bool catch; -{ - jmp_buf osetexit; - struct command *t = savet; - - savet = NULL; - getexit(osetexit); - for (;;) { - pendjob(); - paraml.next = paraml.prev = ¶ml; - paraml.word = STRNULL; - (void) setexit(); - justpr = enterhist; /* execute if not entering history */ - - /* - * Interruptible during interactive reads - */ - if (setintr) - (void) sigsetmask(sigblock(0) & ~sigmask(SIGINT)); - - /* - * For the sake of reset() - */ - freelex(¶ml); - if (savet) - freesyn(savet), savet = NULL; - - if (haderr) { - if (!catch) { - /* unwind */ - doneinp = 0; - resexit(osetexit); - savet = t; - reset(); - } - haderr = 0; - /* - * Every error is eventually caught here or the shell dies. It is - * at this point that we clean up any left-over open files, by - * closing all but a fixed number of pre-defined files. Thus - * routines don't have to worry about leaving files open due to - * deeper errors... they will get closed here. - */ - closem(); - continue; - } - if (doneinp) { - doneinp = 0; - break; - } - if (chkstop) - chkstop--; - if (neednote) - pnote(); - if (intty && prompt && evalvec == 0) { - mailchk(); - /* - * If we are at the end of the input buffer then we are going to - * read fresh stuff. Otherwise, we are rereading input and don't - * need or want to prompt. - */ - if (aret == F_SEEK && fseekp == feobp) - printprompt(); - (void) fflush(cshout); - } - if (seterr) { - xfree((ptr_t) seterr); - seterr = NULL; - } - - /* - * Echo not only on VERBOSE, but also with history expansion. If there - * is a lexical error then we forego history echo. - */ - if ((lex(¶ml) && !seterr && intty) || adrof(STRverbose)) { - prlex(csherr, ¶ml); - } - - /* - * The parser may lose space if interrupted. - */ - if (setintr) - (void) sigblock(sigmask(SIGINT)); - - /* - * Save input text on the history list if reading in old history, or it - * is from the terminal at the top level and not in a loop. - * - * PWP: entry of items in the history list while in a while loop is done - * elsewhere... - */ - if (enterhist || (catch && intty && !whyles)) - savehist(¶ml); - - /* - * Print lexical error messages, except when sourcing history lists. - */ - if (!enterhist && seterr) - stderror(ERR_OLD); - - /* - * If had a history command :p modifier then this is as far as we - * should go - */ - if (justpr) - reset(); - - alias(¶ml); - - /* - * Parse the words of the input into a parse tree. - */ - savet = syntax(paraml.next, ¶ml, 0); - if (seterr) - stderror(ERR_OLD); - - execute(savet, (tpgrp > 0 ? tpgrp : -1), NULL, NULL); - - /* - * Made it! - */ - freelex(¶ml); - freesyn((struct command *) savet), savet = NULL; - } - resexit(osetexit); - savet = t; -} - -void -/*ARGSUSED*/ -dosource(v, t) - Char **v; - struct command *t; - -{ - Char *f; - bool hflg = 0; - Char buf[BUFSIZ]; - - v++; - if (*v && eq(*v, STRmh)) { - if (*++v == NULL) - stderror(ERR_NAME | ERR_HFLAG); - hflg++; - } - (void) Strcpy(buf, *v); - f = globone(buf, G_ERROR); - (void) strcpy((char *) buf, short2str(f)); - xfree((ptr_t) f); - if (!srcfile((char *) buf, 0, hflg) && !hflg) - stderror(ERR_SYSTEM, (char *) buf, strerror(errno)); -} - -/* - * Check for mail. - * If we are a login shell, then we don't want to tell - * about any mail file unless its been modified - * after the time we started. - * This prevents us from telling the user things he already - * knows, since the login program insists on saying - * "You have mail." - */ -static void -mailchk() -{ - struct varent *v; - Char **vp; - time_t t; - int intvl, cnt; - struct stat stb; - bool new; - - v = adrof(STRmail); - if (v == 0) - return; - (void) time(&t); - vp = v->vec; - cnt = blklen(vp); - intvl = (cnt && number(*vp)) ? (--cnt, getn(*vp++)) : MAILINTVL; - if (intvl < 1) - intvl = 1; - if (chktim + intvl > t) - return; - for (; *vp; vp++) { - if (stat(short2str(*vp), &stb) < 0) - continue; - new = stb.st_mtime > time0.tv_sec; - if (stb.st_size == 0 || stb.st_atime > stb.st_mtime || - (stb.st_atime < chktim && stb.st_mtime < chktim) || - (loginsh && !new)) - continue; - if (cnt == 1) - (void) fprintf(cshout, "You have %smail.\n", new ? "new " : ""); - else - (void) fprintf(cshout, "%s in %s.\n", new ? "New mail" : "Mail", - vis_str(*vp)); - } - chktim = t; -} - -/* - * Extract a home directory from the password file - * The argument points to a buffer where the name of the - * user whose home directory is sought is currently. - * We write the home directory of the user back there. - */ -int -gethdir(home) - Char *home; -{ - Char *h; - struct passwd *pw; - - /* - * Is it us? - */ - if (*home == '\0') { - if ((h = value(STRhome)) != NULL) { - (void) Strcpy(home, h); - return 0; - } - else - return 1; - } - - if ((pw = getpwnam(short2str(home))) != NULL) { - (void) Strcpy(home, str2short(pw->pw_dir)); - return 0; - } - else - return 1; -} - -/* - * When didfds is set, we do I/O from 0, 1, 2 otherwise from 15, 16, 17 - * We also check if the shell has already changed the descriptor to point to - * 0, 1, 2 when didfds is set. - */ -#define DESC(a) (*((int *) (a)) - (didfds && *((int *) a) >= FSHIN ? FSHIN : 0)) - -static int -readf(oreo, buf, siz) - void *oreo; - char *buf; - int siz; -{ - return read(DESC(oreo), buf, siz); -} - - -static int -writef(oreo, buf, siz) - void *oreo; - const char *buf; - int siz; -{ - return write(DESC(oreo), buf, siz); -} - -static fpos_t -seekf(oreo, off, whence) - void *oreo; - fpos_t off; - int whence; -{ - return lseek(DESC(oreo), off, whence); -} - - -static int -closef(oreo) - void *oreo; -{ - return close(DESC(oreo)); -} - - -/* - * Print the visible version of a string. - */ -int -vis_fputc(ch, fp) - int ch; - FILE *fp; -{ - char uenc[5]; /* 4 + NULL */ - - if (ch & QUOTE) - return fputc(ch & TRIM, fp); - /* - * XXX: When we are in AsciiOnly we want all characters >= 0200 to - * be encoded, but currently there is no way in vis to do that. - */ - (void) vis(uenc, ch & TRIM, VIS_NOSLASH, 0); - return fputs(uenc, fp); -} - -/* - * Move the initial descriptors to their eventual - * resting places, closin all other units. - */ -void -initdesc() -{ - - didfds = 0; /* 0, 1, 2 aren't set up */ - (void) ioctl(SHIN = dcopy(0, FSHIN), FIOCLEX, NULL); - (void) ioctl(SHOUT = dcopy(1, FSHOUT), FIOCLEX, NULL); - (void) ioctl(SHERR = dcopy(2, FSHERR), FIOCLEX, NULL); - (void) ioctl(OLDSTD = dcopy(SHIN, FOLDSTD), FIOCLEX, NULL); - closem(); -} - - -void -#ifdef PROF -done(i) -#else -xexit(i) -#endif - int i; -{ - untty(); - _exit(i); -} - -static Char ** -defaultpath() -{ - char *ptr; - Char **blk, **blkp; - struct stat stb; - - blkp = blk = (Char **) xmalloc((size_t) sizeof(Char *) * 10); - -#define DIRAPPEND(a) \ - if (stat(ptr = a, &stb) == 0 && (stb.st_mode & S_IFMT) == S_IFDIR) \ - *blkp++ = SAVE(ptr) - - DIRAPPEND(_PATH_BIN); - DIRAPPEND(_PATH_USRBIN); - -#undef DIRAPPEND - - if (euid != 0 && uid != 0) - *blkp++ = Strsave(STRdot); - *blkp = NULL; - return (blk); -} - -void -printprompt() -{ - Char *cp; - - if (!whyles) { - for (cp = value(STRprompt); *cp; cp++) - if (*cp == HIST) - (void) fprintf(cshout, "%d", eventno + 1); - else { - if (*cp == '\\' && cp[1] == HIST) - cp++; - (void) vis_fputc(*cp | QUOTE, cshout); - } - } - else - /* - * Prompt for forward reading loop body content. - */ - (void) fprintf(cshout, "? "); - (void) fflush(cshout); -} diff --git a/bin/csh/csh.h b/bin/csh/csh.h deleted file mode 100644 index cf6723f..0000000 --- a/bin/csh/csh.h +++ /dev/null @@ -1,551 +0,0 @@ -/*- - * Copyright (c) 1980, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)csh.h 8.1 (Berkeley) 5/31/93 - * $FreeBSD$ - */ - -/* - * Fundamental definitions which may vary from system to system. - * - * BUFSIZ The i/o buffering size; also limits word size - * MAILINTVL How often to mailcheck; more often is more expensive - */ -#ifndef BUFSIZ -#define BUFSIZ 1024 /* default buffer size */ -#endif /* BUFSIZ */ - -#define FORKSLEEP 10 /* delay loop on non-interactive fork failure */ -#define MAILINTVL 600 /* 10 minutes */ - -/* - * The shell moves std in/out/diag and the old std input away from units - * 0, 1, and 2 so that it is easy to set up these standards for invoked - * commands. - */ -#define FSHTTY 15 /* /dev/tty when manip pgrps */ -#define FSHIN 16 /* Preferred desc for shell input */ -#define FSHOUT 17 /* ... shell output */ -#define FSHERR 18 /* ... shell diagnostics */ -#define FOLDSTD 19 /* ... old std input */ - -#ifdef PROF -#define xexit(n) done(n) -#endif - -#ifdef SHORT_STRINGS -typedef short Char; - -#define SAVE(a) (Strsave(str2short(a))) -#else -typedef char Char; - -#define SAVE(a) (strsave(a)) -#endif - -/* - * Make sure a variable is not stored in a register by taking its address - * This is used where variables might be clobbered by longjmp. - */ -#define UNREGISTER(a) (void) &a - -typedef void *ioctl_t; /* Third arg of ioctl */ - -typedef void *ptr_t; - -#include "const.h" -#include "char.h" -#include "errnum.h" - -#define xmalloc(i) Malloc(i) -#define xrealloc(p, i) Realloc(p, i) -#define xcalloc(n, s) Calloc(n, s) -#define xfree(p) Free(p) - -#include <stdio.h> -FILE *cshin, *cshout, *csherr; - -#define isdir(d) ((d.st_mode & S_IFMT) == S_IFDIR) - -typedef int bool; - -#define eq(a, b) (Strcmp(a, b) == 0) - -/* globone() flags */ -#define G_ERROR 0 /* default action: error if multiple words */ -#define G_IGNORE 1 /* ignore the rest of the words */ -#define G_APPEND 2 /* make a sentence by cat'ing the words */ - -/* - * Global flags - */ -bool chkstop; /* Warned of stopped jobs... allow exit */ -bool didfds; /* Have setup i/o fd's for child */ -bool doneinp; /* EOF indicator after reset from readc */ -bool exiterr; /* Exit if error or non-zero exit status */ -bool child; /* Child shell ... errors cause exit */ -bool haderr; /* Reset was because of an error */ -bool intty; /* Input is a tty */ -bool intact; /* We are interactive... therefore prompt */ -bool justpr; /* Just print because of :p hist mod */ -bool loginsh; /* We are a loginsh -> .login/.logout */ -bool neednote; /* Need to pnotify() */ -bool noexec; /* Don't execute, just syntax check */ -bool pjobs; /* want to print jobs if interrupted */ -bool setintr; /* Set interrupts on/off -> Wait intr... */ -bool timflg; /* Time the next waited for command */ -bool havhash; /* path hashing is available */ - -#ifdef FILEC -bool filec; /* doing filename expansion */ -#endif - -/* - * Global i/o info - */ -Char *arginp; /* Argument input for sh -c and internal `xx` */ -int onelflg; /* 2 -> need line for -t, 1 -> exit on read */ -Char *ffile; /* Name of shell file for $0 */ - -char *seterr; /* Error message from scanner/parser */ -Char *shtemp; /* Temp name for << shell files in /tmp */ - -#include <sys/types.h> -#include <sys/time.h> -#include <sys/resource.h> - -struct timeval time0; /* Time at which the shell started */ -struct rusage ru0; - -/* - * Miscellany - */ -Char *doldol; /* Character pid for $$ */ -int backpid; /* Pid of the last background process */ -int uid, euid; /* Invokers uid */ -int gid, egid; /* Invokers gid */ -time_t chktim; /* Time mail last checked */ -int shpgrp; /* Pgrp of shell */ -int tpgrp; /* Terminal process group */ - -/* If tpgrp is -1, leave tty alone! */ -int opgrp; /* Initial pgrp and tty pgrp */ - - -/* - * To be able to redirect i/o for builtins easily, the shell moves the i/o - * descriptors it uses away from 0,1,2. - * Ideally these should be in units which are closed across exec's - * (this saves work) but for version 6, this is not usually possible. - * The desired initial values for these descriptors are F{SHIN,...}. - */ -int SHIN; /* Current shell input (script) */ -int SHOUT; /* Shell output */ -int SHERR; /* Diagnostic output... shell errs go here */ -int OLDSTD; /* Old standard input (def for cmds) */ - -/* - * Error control - * - * Errors in scanning and parsing set up an error message to be printed - * at the end and complete. Other errors always cause a reset. - * Because of source commands and .cshrc we need nested error catches. - */ - -#include <setjmp.h> -jmp_buf reslab; - -#define setexit() (setjmp(reslab)) -#define reset() longjmp(reslab, 1) - /* Should use structure assignment here */ -#define getexit(a) memmove((char *)(a), (char *)reslab, sizeof reslab) -#define resexit(a) memmove((char *)reslab, (char *)(a), sizeof reslab) - -Char *gointr; /* Label for an onintr transfer */ - -#include <signal.h> -sig_t parintr; /* Parents interrupt catch */ -sig_t parterm; /* Parents terminate catch */ - -/* - * Lexical definitions. - * - * All lexical space is allocated dynamically. - * The eighth/sixteenth bit of characters is used to prevent recognition, - * and eventually stripped. - */ -#define META 0200 -#define ASCII 0177 -#ifdef SHORT_STRINGS -#define CHAR 0377 -#define QUOTE 0100000 /* 16nth char bit used for 'ing */ -#define TRIM 0077777 /* Mask to strip quote bit */ -#else -#define CHAR 0177 -#define QUOTE 0200 /* Eighth char bit used for 'ing */ -#define TRIM 0177 /* Mask to strip quote bit */ -#endif - -int AsciiOnly; /* If set only 7 bits is expected in characters */ - -/* - * Each level of input has a buffered input structure. - * There are one or more blocks of buffered input for each level, - * exactly one if the input is seekable and tell is available. - * In other cases, the shell buffers enough blocks to keep all loops - * in the buffer. - */ -struct Bin { - off_t Bfseekp; /* Seek pointer */ - off_t Bfbobp; /* Seekp of beginning of buffers */ - off_t Bfeobp; /* Seekp of end of buffers */ - int Bfblocks; /* Number of buffer blocks */ - Char **Bfbuf; /* The array of buffer blocks */ -} B; - -/* - * This structure allows us to seek inside aliases - */ -struct Ain { - int type; -#define I_SEEK -1 /* Invalid seek */ -#define A_SEEK 0 /* Alias seek */ -#define F_SEEK 1 /* File seek */ -#define E_SEEK 2 /* Eval seek */ - union { - off_t _f_seek; - Char* _c_seek; - } fc; -#define f_seek fc._f_seek -#define c_seek fc._c_seek - Char **a_seek; -} ; -extern int aret; /* What was the last character returned */ -#define SEEKEQ(a, b) ((a)->type == (b)->type && \ - (a)->f_seek == (b)->f_seek && \ - (a)->a_seek == (b)->a_seek) - -#define fseekp B.Bfseekp -#define fbobp B.Bfbobp -#define feobp B.Bfeobp -#define fblocks B.Bfblocks -#define fbuf B.Bfbuf - -/* - * The shell finds commands in loops by reseeking the input - * For whiles, in particular, it reseeks to the beginning of the - * line the while was on; hence the while placement restrictions. - */ -struct Ain lineloc; - -bool cantell; /* Is current source tellable ? */ - -/* - * Input lines are parsed into doubly linked circular - * lists of words of the following form. - */ -struct wordent { - Char *word; - struct wordent *prev; - struct wordent *next; -}; - -/* - * During word building, both in the initial lexical phase and - * when expanding $ variable substitutions, expansion by `!' and `$' - * must be inhibited when reading ahead in routines which are themselves - * processing `!' and `$' expansion or after characters such as `\' or in - * quotations. The following flags are passed to the getC routines - * telling them which of these substitutions are appropriate for the - * next character to be returned. - */ -#define DODOL 1 -#define DOEXCL 2 -#define DOALL DODOL|DOEXCL - -/* - * Labuf implements a general buffer for lookahead during lexical operations. - * Text which is to be placed in the input stream can be stuck here. - * We stick parsed ahead $ constructs during initial input, - * process id's from `$$', and modified variable values (from qualifiers - * during expansion in sh.dol.c) here. - */ -Char *lap; - -/* - * Parser structure - * - * Each command is parsed to a tree of command structures and - * flags are set bottom up during this process, to be propagated down - * as needed during the semantics/execution pass (sh.sem.c). - */ -struct command { - short t_dtyp; /* Type of node */ -#define NODE_COMMAND 1 /* t_dcom <t_dlef >t_drit */ -#define NODE_PAREN 2 /* ( t_dspr ) <t_dlef >t_drit */ -#define NODE_PIPE 3 /* t_dlef | t_drit */ -#define NODE_LIST 4 /* t_dlef ; t_drit */ -#define NODE_OR 5 /* t_dlef || t_drit */ -#define NODE_AND 6 /* t_dlef && t_drit */ - short t_dflg; /* Flags, e.g. F_AMPERSAND|... */ -#define F_SAVE (F_NICE|F_TIME|F_NOHUP) /* save these when re-doing */ - -#define F_AMPERSAND (1<<0) /* executes in background */ -#define F_APPEND (1<<1) /* output is redirected >> */ -#define F_PIPEIN (1<<2) /* input is a pipe */ -#define F_PIPEOUT (1<<3) /* output is a pipe */ -#define F_NOFORK (1<<4) /* don't fork, last ()ized cmd */ -#define F_NOINTERRUPT (1<<5) /* should be immune from intr's */ -/* spare */ -#define F_STDERR (1<<7) /* redirect unit 2 with unit 1 */ -#define F_OVERWRITE (1<<8) /* output was ! */ -#define F_READ (1<<9) /* input redirection is << */ -#define F_REPEAT (1<<10) /* reexec aft if, repeat,... */ -#define F_NICE (1<<11) /* t_nice is meaningful */ -#define F_NOHUP (1<<12) /* nohup this command */ -#define F_TIME (1<<13) /* time this command */ - union { - Char *T_dlef; /* Input redirect word */ - struct command *T_dcar; /* Left part of list/pipe */ - } L; - union { - Char *T_drit; /* Output redirect word */ - struct command *T_dcdr; /* Right part of list/pipe */ - } R; -#define t_dlef L.T_dlef -#define t_dcar L.T_dcar -#define t_drit R.T_drit -#define t_dcdr R.T_dcdr - Char **t_dcom; /* Command/argument vector */ - struct command *t_dspr; /* Pointer to ()'d subtree */ - int t_nice; -}; - - -/* - * These are declared here because they want to be - * initialized in sh.init.c (to allow them to be made readonly) - */ - -extern struct biltins { - char *bname; - void (*bfunct) __P((Char **, struct command *)); - short minargs, maxargs; -} bfunc[]; -extern int nbfunc; - -extern struct srch { - char *s_name; - short s_value; -} srchn[]; -extern int nsrchn; - -/* - * The keywords for the parser - */ -#define T_BREAK 0 -#define T_BRKSW 1 -#define T_CASE 2 -#define T_DEFAULT 3 -#define T_ELSE 4 -#define T_END 5 -#define T_ENDIF 6 -#define T_ENDSW 7 -#define T_EXIT 8 -#define T_FOREACH 9 -#define T_GOTO 10 -#define T_IF 11 -#define T_LABEL 12 -#define T_LET 13 -#define T_SET 14 -#define T_SWITCH 15 -#define T_TEST 16 -#define T_THEN 17 -#define T_WHILE 18 - -/* - * Structure defining the existing while/foreach loops at this - * source level. Loops are implemented by seeking back in the - * input. For foreach (fe), the word list is attached here. - */ -struct whyle { - struct Ain w_start; /* Point to restart loop */ - struct Ain w_end; /* End of loop (0 if unknown) */ - Char **w_fe, **w_fe0; /* Current/initial wordlist for fe */ - Char *w_fename; /* Name for fe */ - struct whyle *w_next; /* Next (more outer) loop */ -} *whyles; - -/* - * Variable structure - * - * Aliases and variables are stored in AVL balanced binary trees. - */ -struct varent { - Char **vec; /* Array of words which is the value */ - Char *v_name; /* Name of variable/alias */ - struct varent *v_link[3]; /* The links, see below */ - int v_bal; /* Balance factor */ -} shvhed, aliases; - -#define v_left v_link[0] -#define v_right v_link[1] -#define v_parent v_link[2] - -#define adrof(v) adrof1(v, &shvhed) -#define value(v) value1(v, &shvhed) - -/* - * The following are for interfacing redo substitution in - * aliases to the lexical routines. - */ -struct wordent *alhistp; /* Argument list (first) */ -struct wordent *alhistt; /* Node after last in arg list */ -Char **alvec, *alvecp; /* The (remnants of) alias vector */ - -/* - * Filename/command name expansion variables - */ -int gflag; /* After tglob -> is globbing needed? */ - -#define MAXVARLEN 30 /* Maximum number of char in a variable name */ - -/* - * Variables for filename expansion - */ -extern Char **gargv; /* Pointer to the (stack) arglist */ -extern long gargc; /* Number args in gargv */ - -/* - * Variables for command expansion. - */ -extern Char **pargv; /* Pointer to the argv list space */ -extern long pargc; /* Count of arguments in pargv */ -Char *pargs; /* Pointer to start current word */ -long pnleft; /* Number of chars left in pargs */ -Char *pargcp; /* Current index into pargs */ - -/* - * History list - * - * Each history list entry contains an embedded wordlist - * from the scanner, a number for the event, and a reference count - * to aid in discarding old entries. - * - * Essentially "invisible" entries are put on the history list - * when history substitution includes modifiers, and thrown away - * at the next discarding since their event numbers are very negative. - */ -struct Hist { - struct wordent Hlex; - int Hnum; - int Href; - struct Hist *Hnext; -} Histlist; - -struct wordent paraml; /* Current lexical word list */ -int eventno; /* Next events number */ -int lastev; /* Last event reference (default) */ - -Char HIST; /* history invocation character */ -Char HISTSUB; /* auto-substitute character */ - -/* - * strings.h: - */ -#ifndef SHORT_STRINGS -#define Strchr(a, b) strchr(a, b) -#define Strrchr(a, b) strrchr(a, b) -#define Strcat(a, b) strcat(a, b) -#define Strncat(a, b, c) strncat(a, b, c) -#define Strcpy(a, b) strcpy(a, b) -#define Strncpy(a, b, c) strncpy(a, b, c) -#define Strlen(a) strlen(a) -#define Strcmp(a, b) strcmp(a, b) -#define Strncmp(a, b, c) strncmp(a, b, c) - -#define Strspl(a, b) strspl(a, b) -#define Strsave(a) strsave(a) -#define Strend(a) strend(a) -#define Strstr(a, b) strstr(a, b) - -#define str2short(a) (a) -#define blk2short(a) saveblk(a) -#define short2blk(a) saveblk(a) -#define short2str(a) strip(a) -#else -#define Strchr(a, b) s_strchr(a, b) -#define Strrchr(a, b) s_strrchr(a, b) -#define Strcat(a, b) s_strcat(a, b) -#define Strncat(a, b, c) s_strncat(a, b, c) -#define Strcpy(a, b) s_strcpy(a, b) -#define Strncpy(a, b, c) s_strncpy(a, b, c) -#define Strlen(a) s_strlen(a) -#define Strcmp(a, b) s_strcmp(a, b) -#define Strncmp(a, b, c) s_strncmp(a, b, c) - -#define Strspl(a, b) s_strspl(a, b) -#define Strsave(a) s_strsave(a) -#define Strend(a) s_strend(a) -#define Strstr(a, b) s_strstr(a, b) -#endif - -/* - * setname is a macro to save space (see sh.err.c) - */ -char *bname; - -#define setname(a) (bname = (a)) - -Char *Vsav; -Char *Vdp; -Char *Vexpath; -char **Vt; - -Char **evalvec; -Char *evalp; - -/* word_chars is set by default to WORD_CHARS but can be overridden by - the wordchars variable--if unset, reverts to WORD_CHARS */ - -Char *word_chars; - -#define WORD_CHARS "*?_-.[]~=" /* default chars besides alnums in words */ - -Char *STR_SHELLPATH; - -#include <paths.h> -#ifdef _PATH_BSHELL -Char *STR_BSHELL; -#endif -Char *STR_WORD_CHARS; -Char **STR_environ; diff --git a/bin/csh/dir.c b/bin/csh/dir.c deleted file mode 100644 index 62acd39..0000000 --- a/bin/csh/dir.c +++ /dev/null @@ -1,933 +0,0 @@ -/*- - * Copyright (c) 1980, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -#if 0 -static char sccsid[] = "@(#)dir.c 8.1 (Berkeley) 5/31/93"; -#else -static const char rcsid[] = - "$FreeBSD$"; -#endif -#endif /* not lint */ - -#include <sys/param.h> -#include <sys/stat.h> -#include <errno.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#if __STDC__ -# include <stdarg.h> -#else -# include <varargs.h> -#endif - -#include "csh.h" -#include "dir.h" -#include "extern.h" - -/* Directory management. */ - -static struct directory - *dfind __P((Char *)); -static Char *dfollow __P((Char *)); -static void printdirs __P((void)); -static Char *dgoto __P((Char *)); -static void dnewcwd __P((struct directory *)); -static void dset __P((Char *)); - -struct directory dhead; /* "head" of loop */ -int printd; /* force name to be printed */ - -static int dirflag = 0; - -/* - * dinit - initialize current working directory - */ -void -dinit(hp) - Char *hp; -{ - char *tcp; - Char *cp; - struct directory *dp; - char path[MAXPATHLEN]; - static char *emsg = "csh: Trying to start from \"%s\"\n"; - - /* Don't believe the login shell home, because it may be a symlink */ - tcp = getcwd(path, MAXPATHLEN); /* see ngetwd.c for System V version */ - if (tcp == NULL || *tcp == '\0') { - (void) fprintf(csherr, "csh: %s: %s\n", path, strerror(errno)); - if (hp && *hp) { - tcp = short2str(hp); - if (chdir(tcp) == -1) - cp = NULL; - else - cp = hp; - (void) fprintf(csherr, emsg, vis_str(hp)); - } - else - cp = NULL; - if (cp == NULL) { - (void) fprintf(csherr, emsg, "/"); - if (chdir("/") == -1) - /* I am not even try to print an error message! */ - xexit(1); - cp = SAVE("/"); - } - } - else { - struct stat swd, shp; - - /* - * See if $HOME is the working directory we got and use that - */ - if (hp && *hp && - stat(tcp, &swd) != -1 && stat(short2str(hp), &shp) != -1 && - swd.st_dev == shp.st_dev && swd.st_ino == shp.st_ino) - cp = hp; - else { - char *cwd; - - /* - * use PWD if we have it (for subshells) - */ - if ((cwd = getenv("PWD")) != NULL) { - if (stat(cwd, &shp) != -1 && swd.st_dev == shp.st_dev && - swd.st_ino == shp.st_ino) - tcp = cwd; - } - cp = dcanon(SAVE(tcp), STRNULL); - } - } - - dp = (struct directory *) xcalloc(sizeof(struct directory), 1); - dp->di_name = Strsave(cp); - dp->di_count = 0; - dhead.di_next = dhead.di_prev = dp; - dp->di_next = dp->di_prev = &dhead; - printd = 0; - dnewcwd(dp); -} - -static void -dset(dp) -Char *dp; -{ - /* - * Don't call set() directly cause if the directory contains ` or - * other junk characters glob will fail. - */ - Char **vec = (Char **) xmalloc((size_t) (2 * sizeof(Char **))); - - vec[0] = Strsave(dp); - vec[1] = 0; - setq(STRcwd, vec, &shvhed); - Setenv(STRPWD, dp); -} - -#define DIR_LONG 1 -#define DIR_VERT 2 -#define DIR_LINE 4 - -static void -skipargs(v, str) - Char ***v; - char *str; -{ - Char **n = *v, *s; - - dirflag = 0; - for (n++; *n != NULL && (*n)[0] == '-'; n++) - for (s = &((*n)[1]); *s; s++) - switch (*s) { - case 'l': - dirflag |= DIR_LONG; - break; - case 'v': - dirflag |= DIR_VERT; - break; - case 'n': - dirflag |= DIR_LINE; - break; - default: - stderror(ERR_DIRUS, vis_str(**v), str); - break; - } - *v = n; -} - -/* - * dodirs - list all directories in directory loop - */ -void -/*ARGSUSED*/ -dodirs(v, t) - Char **v; - struct command *t; -{ - skipargs(&v, ""); - - if (*v != NULL) - stderror(ERR_DIRUS, "dirs", ""); - printdirs(); -} - -static void -printdirs() -{ - struct directory *dp; - Char *s, *hp = value(STRhome); - int idx, len, cur; - - if (*hp == '\0') - hp = NULL; - dp = dcwd; - idx = 0; - cur = 0; - do { - if (dp == &dhead) - continue; - if (dirflag & DIR_VERT) { - (void) fprintf(cshout, "%d\t", idx++); - cur = 0; - } - if (!(dirflag & DIR_LONG) && hp != NULL && !eq(hp, STRslash) && - (len = Strlen(hp), Strncmp(hp, dp->di_name, len) == 0) && - (dp->di_name[len] == '\0' || dp->di_name[len] == '/')) - len = Strlen(s = (dp->di_name + len)) + 2; - else - len = Strlen(s = dp->di_name) + 1; - - cur += len; - if ((dirflag & DIR_LINE) && cur >= 80 - 1 && len < 80) { - (void) fprintf(cshout, "\n"); - cur = len; - } - (void) fprintf(cshout, s != dp->di_name ? "~%s%c" : "%s%c", - vis_str(s), (dirflag & DIR_VERT) ? '\n' : ' '); - } while ((dp = dp->di_prev) != dcwd); - if (!(dirflag & DIR_VERT)) - (void) fprintf(cshout, "\n"); -} - -void -dtildepr(home, dir) - Char *home, *dir; -{ - - if (!eq(home, STRslash) && prefix(home, dir)) - (void) fprintf(cshout, "~%s", vis_str(dir + Strlen(home))); - else - (void) fprintf(cshout, "%s", vis_str(dir)); -} - -void -dtilde() -{ - struct directory *d = dcwd; - - do { - if (d == &dhead) - continue; - d->di_name = dcanon(d->di_name, STRNULL); - } while ((d = d->di_prev) != dcwd); - - dset(dcwd->di_name); -} - - -/* dnormalize(): - * If the name starts with . or .. then we might need to normalize - * it depending on the symbolic link flags - */ -Char * -dnormalize(cp) - Char *cp; -{ - -#define UC (unsigned char) -#define ISDOT(c) (UC(c)[0] == '.' && ((UC(c)[1] == '\0') || (UC(c)[1] == '/'))) -#define ISDOTDOT(c) (UC(c)[0] == '.' && ISDOT(&((c)[1]))) - - if ((unsigned char) cp[0] == '/') - return (Strsave(cp)); - - if (adrof(STRignore_symlinks)) { - int dotdot = 0; - Char *dp, *cwd; - - cwd = (Char *) xmalloc((size_t) ((Strlen(dcwd->di_name) + 3) * - sizeof(Char))); - (void) Strcpy(cwd, dcwd->di_name); - - /* - * Ignore . and count ..'s - */ - while (*cp) { - if (ISDOT(cp)) { - if (*++cp) - cp++; - } - else if (ISDOTDOT(cp)) { - dotdot++; - cp += 2; - if (*cp) - cp++; - } - else - break; - } - while (dotdot > 0) - if ((dp = Strrchr(cwd, '/'))) { - *dp = '\0'; - dotdot--; - } - else - break; - - if (*cp) { - cwd[dotdot = Strlen(cwd)] = '/'; - cwd[dotdot + 1] = '\0'; - dp = Strspl(cwd, cp); - xfree((ptr_t) cwd); - return dp; - } - else { - if (!*cwd) { - cwd[0] = '/'; - cwd[1] = '\0'; - } - return cwd; - } - } - return Strsave(cp); -} - -/* - * dochngd - implement chdir command. - */ -void -/*ARGSUSED*/ -dochngd(v, t) - Char **v; - struct command *t; -{ - Char *cp; - struct directory *dp; - - skipargs(&v, " [<dir>]"); - printd = 0; - if (*v == NULL) { - if ((cp = value(STRhome)) == NULL || *cp == 0) - stderror(ERR_NAME | ERR_NOHOMEDIR); - if (chdir(short2str(cp)) < 0) - stderror(ERR_NAME | ERR_CANTCHANGE); - cp = Strsave(cp); - } - else if (v[1] != NULL) { - stderror(ERR_NAME | ERR_TOOMANY); - /* NOTREACHED */ - return; - } - else if ((dp = dfind(*v)) != 0) { - char *tmp; - - printd = 1; - if (chdir(tmp = short2str(dp->di_name)) < 0) - stderror(ERR_SYSTEM, tmp, strerror(errno)); - dcwd->di_prev->di_next = dcwd->di_next; - dcwd->di_next->di_prev = dcwd->di_prev; - dfree(dcwd); - dnewcwd(dp); - return; - } - else - cp = dfollow(*v); - dp = (struct directory *) xcalloc(sizeof(struct directory), 1); - dp->di_name = cp; - dp->di_count = 0; - dp->di_next = dcwd->di_next; - dp->di_prev = dcwd->di_prev; - dp->di_prev->di_next = dp; - dp->di_next->di_prev = dp; - dfree(dcwd); - dnewcwd(dp); -} - -static Char * -dgoto(cp) - Char *cp; -{ - Char *dp; - - if (*cp != '/') { - Char *p, *q; - int cwdlen; - - for (p = dcwd->di_name; *p++;) - continue; - if ((cwdlen = p - dcwd->di_name - 1) == 1) /* root */ - cwdlen = 0; - for (p = cp; *p++;) - continue; - dp = (Char *) xmalloc((size_t)((cwdlen + (p - cp) + 1) * sizeof(Char))); - for (p = dp, q = dcwd->di_name; (*p++ = *q++) != '\0';) - continue; - if (cwdlen) - p[-1] = '/'; - else - p--; /* don't add a / after root */ - for (q = cp; (*p++ = *q++) != '\0';) - continue; - xfree((ptr_t) cp); - cp = dp; - dp += cwdlen; - } - else - dp = cp; - - cp = dcanon(cp, dp); - return cp; -} - -/* - * dfollow - change to arg directory; fall back on cdpath if not valid - */ -static Char * -dfollow(cp) - Char *cp; -{ - Char *dp; - struct varent *c; - char ebuf[MAXPATHLEN]; - int serrno; - - cp = globone(cp, G_ERROR); - /* - * if we are ignoring symlinks, try to fix relatives now. - */ - dp = dnormalize(cp); - if (chdir(short2str(dp)) >= 0) { - xfree((ptr_t) cp); - return dgoto(dp); - } - else { - xfree((ptr_t) dp); - if (chdir(short2str(cp)) >= 0) - return dgoto(cp); - serrno = errno; - } - - if (cp[0] != '/' && !prefix(STRdotsl, cp) && !prefix(STRdotdotsl, cp) - && (c = adrof(STRcdpath))) { - Char **cdp; - Char *p; - Char buf[MAXPATHLEN]; - - for (cdp = c->vec; *cdp; cdp++) { - for (dp = buf, p = *cdp; (*dp++ = *p++) != '\0';) - continue; - dp[-1] = '/'; - for (p = cp; (*dp++ = *p++) != '\0';) - continue; - if (chdir(short2str(buf)) >= 0) { - printd = 1; - xfree((ptr_t) cp); - cp = Strsave(buf); - return dgoto(cp); - } - } - } - dp = value(cp); - if ((dp[0] == '/' || dp[0] == '.') && chdir(short2str(dp)) >= 0) { - xfree((ptr_t) cp); - cp = Strsave(dp); - printd = 1; - return dgoto(cp); - } - (void) strcpy(ebuf, short2str(cp)); - xfree((ptr_t) cp); - stderror(ERR_SYSTEM, ebuf, strerror(serrno)); - return (NULL); -} - - -/* - * dopushd - push new directory onto directory stack. - * with no arguments exchange top and second. - * with numeric argument (+n) bring it to top. - */ -void -/*ARGSUSED*/ -dopushd(v, t) - Char **v; - struct command *t; -{ - struct directory *dp; - - skipargs(&v, " [<dir>|+<n>]"); - printd = 1; - if (*v == NULL) { - char *tmp; - - if ((dp = dcwd->di_prev) == &dhead) - dp = dhead.di_prev; - if (dp == dcwd) - stderror(ERR_NAME | ERR_NODIR); - if (chdir(tmp = short2str(dp->di_name)) < 0) - stderror(ERR_SYSTEM, tmp, strerror(errno)); - dp->di_prev->di_next = dp->di_next; - dp->di_next->di_prev = dp->di_prev; - dp->di_next = dcwd->di_next; - dp->di_prev = dcwd; - dcwd->di_next->di_prev = dp; - dcwd->di_next = dp; - } - else if (v[1] != NULL) { - stderror(ERR_NAME | ERR_TOOMANY); - /* NOTREACHED */ - return; - } - else if ((dp = dfind(*v)) != NULL) { - char *tmp; - - if (chdir(tmp = short2str(dp->di_name)) < 0) - stderror(ERR_SYSTEM, tmp, strerror(errno)); - } - else { - Char *ccp; - - ccp = dfollow(*v); - dp = (struct directory *) xcalloc(sizeof(struct directory), 1); - dp->di_name = ccp; - dp->di_count = 0; - dp->di_prev = dcwd; - dp->di_next = dcwd->di_next; - dcwd->di_next = dp; - dp->di_next->di_prev = dp; - } - dnewcwd(dp); -} - -/* - * dfind - find a directory if specified by numeric (+n) argument - */ -static struct directory * -dfind(cp) - Char *cp; -{ - struct directory *dp; - int i; - Char *ep; - - if (*cp++ != '+') - return (0); - for (ep = cp; Isdigit(*ep); ep++) - continue; - if (*ep) - return (0); - i = getn(cp); - if (i <= 0) - return (0); - for (dp = dcwd; i != 0; i--) { - if ((dp = dp->di_prev) == &dhead) - dp = dp->di_prev; - if (dp == dcwd) - stderror(ERR_NAME | ERR_DEEP); - } - return (dp); -} - -/* - * dopopd - pop a directory out of the directory stack - * with a numeric argument just discard it. - */ -void -/*ARGSUSED*/ -dopopd(v, t) - Char **v; - struct command *t; -{ - struct directory *dp, *p = NULL; - - skipargs(&v, " [+<n>]"); - printd = 1; - if (*v == NULL) - dp = dcwd; - else if (v[1] != NULL) { - stderror(ERR_NAME | ERR_TOOMANY); - /* NOTREACHED */ - return; - } - else if ((dp = dfind(*v)) == 0) - stderror(ERR_NAME | ERR_BADDIR); - if (dp->di_prev == &dhead && dp->di_next == &dhead) - stderror(ERR_NAME | ERR_EMPTY); - if (dp == dcwd) { - char *tmp; - - if ((p = dp->di_prev) == &dhead) - p = dhead.di_prev; - if (chdir(tmp = short2str(p->di_name)) < 0) - stderror(ERR_SYSTEM, tmp, strerror(errno)); - } - dp->di_prev->di_next = dp->di_next; - dp->di_next->di_prev = dp->di_prev; - if (dp == dcwd) - dnewcwd(p); - else { - printdirs(); - } - dfree(dp); -} - -/* - * dfree - free the directory (or keep it if it still has ref count) - */ -void -dfree(dp) - struct directory *dp; -{ - - if (dp->di_count != 0) { - dp->di_next = dp->di_prev = 0; - } - else { - xfree((char *) dp->di_name); - xfree((ptr_t) dp); - } -} - -/* - * dcanon - canonicalize the pathname, removing excess ./ and ../ etc. - * we are of course assuming that the file system is standardly - * constructed (always have ..'s, directories have links) - */ -Char * -dcanon(cp, p) - Char *cp, *p; -{ - Char *sp; - Char *p1, *p2; /* general purpose */ - bool slash; - - Char link[MAXPATHLEN]; - char tlink[MAXPATHLEN]; - int cc; - Char *newcp; - - /* - * christos: if the path given does not start with a slash prepend cwd. If - * cwd does not start with a path or the result would be too long abort(). - */ - if (*cp != '/') { - Char tmpdir[MAXPATHLEN]; - - p1 = value(STRcwd); - if (p1 == NULL || *p1 != '/') - abort(); - if (Strlen(p1) + Strlen(cp) + 1 >= MAXPATHLEN) - abort(); - (void) Strcpy(tmpdir, p1); - (void) Strcat(tmpdir, STRslash); - (void) Strcat(tmpdir, cp); - xfree((ptr_t) cp); - cp = p = Strsave(tmpdir); - } - - while (*p) { /* for each component */ - sp = p; /* save slash address */ - while (*++p == '/') /* flush extra slashes */ - continue; - if (p != ++sp) - for (p1 = sp, p2 = p; (*p1++ = *p2++) != '\0';) - continue; - p = sp; /* save start of component */ - slash = 0; - while (*++p) /* find next slash or end of path */ - if (*p == '/') { - slash = 1; - *p = 0; - break; - } - - if (*sp == '\0') /* if component is null */ - if (--sp == cp) /* if path is one char (i.e. /) */ - break; - else - *sp = '\0'; - else if (sp[0] == '.' && sp[1] == 0) { - if (slash) { - for (p1 = sp, p2 = p + 1; (*p1++ = *p2++) != '\0';) - continue; - p = --sp; - } - else if (--sp != cp) - *sp = '\0'; - } - else if (sp[0] == '.' && sp[1] == '.' && sp[2] == 0) { - /* - * We have something like "yyy/xxx/..", where "yyy" can be null or - * a path starting at /, and "xxx" is a single component. Before - * compressing "xxx/..", we want to expand "yyy/xxx", if it is a - * symbolic link. - */ - *--sp = 0; /* form the pathname for readlink */ - if (sp != cp && !adrof(STRignore_symlinks) && - (cc = readlink(short2str(cp), tlink, sizeof(tlink) - 1)) >= 0) { - (void) Strcpy(link, str2short(tlink)); - link[cc] = '\0'; - - if (slash) - *p = '/'; - /* - * Point p to the '/' in "/..", and restore the '/'. - */ - *(p = sp) = '/'; - /* - * find length of p - */ - for (p1 = p; *p1++;) - continue; - if (*link != '/') { - /* - * Relative path, expand it between the "yyy/" and the - * "/..". First, back sp up to the character past "yyy/". - */ - while (*--sp != '/') - continue; - sp++; - *sp = 0; - /* - * New length is "yyy/" + link + "/.." and rest - */ - p1 = newcp = (Char *) xmalloc((size_t) - (((sp - cp) + cc + (p1 - p)) * - sizeof(Char))); - /* - * Copy new path into newcp - */ - for (p2 = cp; (*p1++ = *p2++) != '\0';) - continue; - for (p1--, p2 = link; (*p1++ = *p2++) != '\0';) - continue; - for (p1--, p2 = p; (*p1++ = *p2++) != '\0';) - continue; - /* - * Restart canonicalization at expanded "/xxx". - */ - p = sp - cp - 1 + newcp; - } - else { - /* - * New length is link + "/.." and rest - */ - p1 = newcp = (Char *) xmalloc((size_t) - ((cc + (p1 - p)) * sizeof(Char))); - /* - * Copy new path into newcp - */ - for (p2 = link; (*p1++ = *p2++) != '\0';) - continue; - for (p1--, p2 = p; (*p1++ = *p2++) != '\0';) - continue; - /* - * Restart canonicalization at beginning - */ - p = newcp; - } - xfree((ptr_t) cp); - cp = newcp; - continue; /* canonicalize the link */ - } - *sp = '/'; - if (sp != cp) - while (*--sp != '/') - continue; - if (slash) { - for (p1 = sp + 1, p2 = p + 1; (*p1++ = *p2++) != '\0';) - continue; - p = sp; - } - else if (cp == sp) - *++sp = '\0'; - else - *sp = '\0'; - } - else { /* normal dir name (not . or .. or nothing) */ - - if (sp != cp && adrof(STRchase_symlinks) && - !adrof(STRignore_symlinks) && - (cc = readlink(short2str(cp), tlink, sizeof(tlink) - 1)) >= 0) { - (void) Strcpy(link, str2short(tlink)); - link[cc] = '\0'; - - /* - * restore the '/'. - */ - if (slash) - *p = '/'; - - /* - * point sp to p (rather than backing up). - */ - sp = p; - - /* - * find length of p - */ - for (p1 = p; *p1++;) - continue; - if (*link != '/') { - /* - * Relative path, expand it between the "yyy/" and the - * remainder. First, back sp up to the character past - * "yyy/". - */ - while (*--sp != '/') - continue; - sp++; - *sp = 0; - /* - * New length is "yyy/" + link + "/.." and rest - */ - p1 = newcp = (Char *) xmalloc((size_t) - (((sp - cp) + cc + (p1 - p)) - * sizeof(Char))); - /* - * Copy new path into newcp - */ - for (p2 = cp; (*p1++ = *p2++) != '\0';) - continue; - for (p1--, p2 = link; (*p1++ = *p2++) != '\0';) - continue; - for (p1--, p2 = p; (*p1++ = *p2++) != '\0';) - continue; - /* - * Restart canonicalization at expanded "/xxx". - */ - p = sp - cp - 1 + newcp; - } - else { - /* - * New length is link + the rest - */ - p1 = newcp = (Char *) xmalloc((size_t) - ((cc + (p1 - p)) * sizeof(Char))); - /* - * Copy new path into newcp - */ - for (p2 = link; (*p1++ = *p2++) != '\0';) - continue; - for (p1--, p2 = p; (*p1++ = *p2++) != '\0';) - continue; - /* - * Restart canonicalization at beginning - */ - p = newcp; - } - xfree((ptr_t) cp); - cp = newcp; - continue; /* canonicalize the link */ - } - if (slash) - *p = '/'; - } - } - - /* - * fix home... - */ - p1 = value(STRhome); - cc = Strlen(p1); - /* - * See if we're not in a subdir of STRhome - */ - if (p1 && *p1 == '/' && - (Strncmp(p1, cp, cc) != 0 || (cp[cc] != '/' && cp[cc] != '\0'))) { - static ino_t home_ino = -1; - static dev_t home_dev = -1; - static Char *home_ptr = NULL; - struct stat statbuf; - - /* - * Get dev and ino of STRhome - */ - if (home_ptr != p1 && - stat(short2str(p1), &statbuf) != -1) { - home_dev = statbuf.st_dev; - home_ino = statbuf.st_ino; - home_ptr = p1; - } - /* - * Start comparing dev & ino backwards - */ - p2 = Strcpy(link, cp); - for (sp = NULL; *p2 && stat(short2str(p2), &statbuf) != -1;) { - if (statbuf.st_dev == home_dev && - statbuf.st_ino == home_ino) { - sp = (Char *) - 1; - break; - } - if ((sp = Strrchr(p2, '/')) != NULL) - *sp = '\0'; - } - /* - * See if we found it - */ - if (*p2 && sp == (Char *) -1) { - /* - * Use STRhome to make '~' work - */ - newcp = Strspl(p1, cp + Strlen(p2)); - xfree((ptr_t) cp); - cp = newcp; - } - } - return cp; -} - - -/* - * dnewcwd - make a new directory in the loop the current one - */ -static void -dnewcwd(dp) - struct directory *dp; -{ - dcwd = dp; - dset(dcwd->di_name); - if (printd && !(adrof(STRpushdsilent))) - printdirs(); -} diff --git a/bin/csh/dir.h b/bin/csh/dir.h deleted file mode 100644 index 285acb7..0000000 --- a/bin/csh/dir.h +++ /dev/null @@ -1,46 +0,0 @@ -/*- - * Copyright (c) 1980, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)dir.h 8.1 (Berkeley) 5/31/93 - * $FreeBSD$ - */ - -/* - * Structure for entries in directory stack. - */ -struct directory { - struct directory *di_next; /* next in loop */ - struct directory *di_prev; /* prev in loop */ - unsigned short *di_count; /* refcount of processes */ - Char *di_name; /* actual name */ -}; -struct directory *dcwd; /* the one we are in now */ diff --git a/bin/csh/dol.c b/bin/csh/dol.c deleted file mode 100644 index fdab107..0000000 --- a/bin/csh/dol.c +++ /dev/null @@ -1,991 +0,0 @@ -/*- - * Copyright (c) 1980, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -#if 0 -static char sccsid[] = "@(#)dol.c 8.1 (Berkeley) 5/31/93"; -#else -static const char rcsid[] = - "$FreeBSD$"; -#endif -#endif /* not lint */ - -#include <sys/types.h> -#include <fcntl.h> -#include <errno.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#if __STDC__ -# include <stdarg.h> -#else -# include <varargs.h> -#endif - -#include "csh.h" -#include "extern.h" - -/* - * These routines perform variable substitution and quoting via ' and ". - * To this point these constructs have been preserved in the divided - * input words. Here we expand variables and turn quoting via ' and " into - * QUOTE bits on characters (which prevent further interpretation). - * If the `:q' modifier was applied during history expansion, then - * some QUOTEing may have occurred already, so we dont "trim()" here. - */ - -static int Dpeekc, Dpeekrd; /* Peeks for DgetC and Dreadc */ -static Char *Dcp, **Dvp; /* Input vector for Dreadc */ - -#define DEOF -1 - -#define unDgetC(c) Dpeekc = c - -#define QUOTES (_QF|_QB|_ESC) /* \ ' " ` */ - -/* - * The following variables give the information about the current - * $ expansion, recording the current word position, the remaining - * words within this expansion, the count of remaining words, and the - * information about any : modifier which is being applied. - */ -#define MAXWLEN (BUFSIZ - 4) -#define MAXMOD MAXWLEN /* This cannot overflow */ -static Char *dolp; /* Remaining chars from this word */ -static Char **dolnxt; /* Further words */ -static int dolcnt; /* Count of further words */ -static Char dolmod[MAXMOD]; /* : modifier character */ -static int dolnmod; /* Number of modifiers */ -static int dolmcnt; /* :gx -> 10000, else 1 */ -static int dolwcnt; /* :wx -> 10000, else 1 */ - -static void Dfix2 __P((Char **)); -static Char *Dpack __P((Char *, Char *)); -static int Dword __P((void)); -static void dolerror __P((Char *)); -static int DgetC __P((int)); -static void Dgetdol __P((void)); -static void fixDolMod __P((void)); -static void setDolp __P((Char *)); -static void unDredc __P((int)); -static int Dredc __P((void)); -static void Dtestq __P((int)); - - -/* - * Fix up the $ expansions and quotations in the - * argument list to command t. - */ -void -Dfix(t) - struct command *t; -{ - Char **pp; - Char *p; - - if (noexec) - return; - /* Note that t_dcom isn't trimmed thus !...:q's aren't lost */ - for (pp = t->t_dcom; (p = *pp++) != NULL;) - for (; *p; p++) { - if (cmap(*p, _DOL | QUOTES)) { /* $, \, ', ", ` */ - Dfix2(t->t_dcom); /* found one */ - blkfree(t->t_dcom); - t->t_dcom = gargv; - gargv = 0; - return; - } - } -} - -/* - * $ substitute one word, for i/o redirection - */ -Char * -Dfix1(cp) - Char *cp; -{ - Char *Dv[2]; - - if (noexec) - return (0); - Dv[0] = cp; - Dv[1] = NULL; - Dfix2(Dv); - if (gargc != 1) { - setname(vis_str(cp)); - stderror(ERR_NAME | ERR_AMBIG); - } - cp = Strsave(gargv[0]); - blkfree(gargv), gargv = 0; - return (cp); -} - -/* - * Subroutine to do actual fixing after state initialization. - */ -static void -Dfix2(v) - Char **v; -{ - ginit(); /* Initialize glob's area pointers */ - Dvp = v; - Dcp = STRNULL; /* Setup input vector for Dreadc */ - unDgetC(0); - unDredc(0); /* Clear out any old peeks (at error) */ - dolp = 0; - dolcnt = 0; /* Clear out residual $ expands (...) */ - while (Dword()) - continue; -} - -/* - * Pack up more characters in this word - */ -static Char * -Dpack(wbuf, wp) - Char *wbuf, *wp; -{ - int c; - int i = MAXWLEN - (wp - wbuf); - - for (;;) { - c = DgetC(DODOL); - if (c == '\\') { - c = DgetC(0); - if (c == DEOF) { - unDredc(c); - *wp = 0; - Gcat(STRNULL, wbuf); - return (NULL); - } - if (c == '\n') - c = ' '; - else - c |= QUOTE; - } - if (c == DEOF) { - unDredc(c); - *wp = 0; - Gcat(STRNULL, wbuf); - return (NULL); - } - if (cmap(c, _SP | _NL | _QF | _QB)) { /* sp \t\n'"` */ - unDgetC(c); - if (cmap(c, QUOTES)) - return (wp); - *wp++ = 0; - Gcat(STRNULL, wbuf); - return (NULL); - } - if (--i <= 0) - stderror(ERR_WTOOLONG); - *wp++ = c; - } -} - -/* - * Get a word. This routine is analogous to the routine - * word() in sh.lex.c for the main lexical input. One difference - * here is that we don't get a newline to terminate our expansion. - * Rather, DgetC will return a DEOF when we hit the end-of-input. - */ -static int -Dword() -{ - int c, c1; - Char wbuf[BUFSIZ]; - Char *wp = wbuf; - int i = MAXWLEN; - bool dolflg; - bool sofar = 0, done = 0; - - while (!done) { - done = 1; - c = DgetC(DODOL); - switch (c) { - - case DEOF: - if (sofar == 0) - return (0); - /* finish this word and catch the code above the next time */ - unDredc(c); - /* fall into ... */ - - case '\n': - *wp = 0; - Gcat(STRNULL, wbuf); - return (1); - - case ' ': - case '\t': - done = 0; - break; - - case '`': - /* We preserve ` quotations which are done yet later */ - *wp++ = c, --i; - case '\'': - case '"': - /* - * Note that DgetC never returns a QUOTES character from an - * expansion, so only true input quotes will get us here or out. - */ - c1 = c; - dolflg = c1 == '"' ? DODOL : 0; - for (;;) { - c = DgetC(dolflg); - if (c == c1) - break; - if (c == '\n' || c == DEOF) - stderror(ERR_UNMATCHED, c1); - if ((c & (QUOTE | TRIM)) == ('\n' | QUOTE)) - --wp, ++i; - if (--i <= 0) - stderror(ERR_WTOOLONG); - switch (c1) { - - case '"': - /* - * Leave any `s alone for later. Other chars are all - * quoted, thus `...` can tell it was within "...". - */ - *wp++ = c == '`' ? '`' : c | QUOTE; - break; - - case '\'': - /* Prevent all further interpretation */ - *wp++ = c | QUOTE; - break; - - case '`': - /* Leave all text alone for later */ - *wp++ = c; - break; - - default: - break; - } - } - if (c1 == '`') - *wp++ = '`' /* i--; eliminated */; - sofar = 1; - if ((wp = Dpack(wbuf, wp)) == NULL) - return (1); - else { - i = MAXWLEN - (wp - wbuf); - done = 0; - } - break; - - case '\\': - c = DgetC(0); /* No $ subst! */ - if (c == '\n' || c == DEOF) { - done = 0; - break; - } - c |= QUOTE; - break; - - default: - break; - } - if (done) { - unDgetC(c); - sofar = 1; - if ((wp = Dpack(wbuf, wp)) == NULL) - return (1); - else { - i = MAXWLEN - (wp - wbuf); - done = 0; - } - } - } - /* Really NOTREACHED */ - return (0); -} - - -/* - * Get a character, performing $ substitution unless flag is 0. - * Any QUOTES character which is returned from a $ expansion is - * QUOTEd so that it will not be recognized above. - */ -static int -DgetC(flag) - int flag; -{ - int c; - -top: - if ((c = Dpeekc) != '\0') { - Dpeekc = 0; - return (c); - } - if (lap) { - c = *lap++ & (QUOTE | TRIM); - if (c == 0) { - lap = 0; - goto top; - } -quotspec: - if (cmap(c, QUOTES)) - return (c | QUOTE); - return (c); - } - if (dolp) { - if ((c = *dolp++ & (QUOTE | TRIM)) != '\0') - goto quotspec; - if (dolcnt > 0) { - setDolp(*dolnxt++); - --dolcnt; - return (' '); - } - dolp = 0; - } - if (dolcnt > 0) { - setDolp(*dolnxt++); - --dolcnt; - goto top; - } - c = Dredc(); - if (c == '$' && flag) { - Dgetdol(); - goto top; - } - return (c); -} - -static Char *nulvec[] = {0}; -static struct varent nulargv = {nulvec, STRargv, { NULL, NULL, NULL }, 0}; - -static void -dolerror(s) - Char *s; -{ - setname(vis_str(s)); - stderror(ERR_NAME | ERR_RANGE); -} - -/* - * Handle the multitudinous $ expansion forms. - * Ugh. - */ -static void -Dgetdol() -{ - Char *np; - struct varent *vp = NULL; - Char name[4 * MAXVARLEN + 1]; - int c, sc; - int subscr = 0, lwb = 1, upb = 0; - bool dimen = 0, bitset = 0; - char tnp; - Char wbuf[BUFSIZ]; - static Char *dolbang = NULL; - - dolnmod = dolmcnt = dolwcnt = 0; - c = sc = DgetC(0); - if (c == '{') - c = DgetC(0); /* sc is { to take } later */ - if ((c & TRIM) == '#') - dimen++, c = DgetC(0); /* $# takes dimension */ - else if (c == '?') - bitset++, c = DgetC(0); /* $? tests existence */ - switch (c) { - - case '!': - if (dimen || bitset) - stderror(ERR_SYNTAX); - if (backpid != 0) { - if (dolbang) - xfree((ptr_t) dolbang); - setDolp(dolbang = putn(backpid)); - } - goto eatbrac; - - case '$': - if (dimen || bitset) - stderror(ERR_SYNTAX); - setDolp(doldol); - goto eatbrac; - - case '<' | QUOTE: - if (bitset) - stderror(ERR_NOTALLOWED, "$?<"); - if (dimen) - stderror(ERR_NOTALLOWED, "$?#"); - for (np = wbuf; read(OLDSTD, &tnp, 1) == 1; np++) { - *np = (unsigned char) tnp; - if (np >= &wbuf[BUFSIZ - 1]) - stderror(ERR_LTOOLONG); - if (tnp == '\n') - break; - } - *np = 0; - /* - * KLUDGE: dolmod is set here because it will cause setDolp to call - * domod and thus to copy wbuf. Otherwise setDolp would use it - * directly. If we saved it ourselves, no one would know when to free - * it. The actual function of the 'q' causes filename expansion not to - * be done on the interpolated value. - */ - dolmod[dolnmod++] = 'q'; - dolmcnt = 10000; - setDolp(wbuf); - goto eatbrac; - - case DEOF: - case '\n': - stderror(ERR_SYNTAX); - /* NOTREACHED */ - break; - - case '*': - (void) Strcpy(name, STRargv); - vp = adrof(STRargv); - subscr = -1; /* Prevent eating [...] */ - break; - - default: - np = name; - if (Isdigit(c)) { - if (dimen) - stderror(ERR_NOTALLOWED, "$#<num>"); - subscr = 0; - do { - subscr = subscr * 10 + c - '0'; - c = DgetC(0); - } while (Isdigit(c)); - unDredc(c); - if (subscr < 0) { - dolerror(vp->v_name); - return; - } - if (subscr == 0) { - if (bitset) { - dolp = ffile ? STR1 : STR0; - goto eatbrac; - } - if (ffile == 0) - stderror(ERR_DOLZERO); - fixDolMod(); - setDolp(ffile); - goto eatbrac; - } - if (bitset) - stderror(ERR_DOLQUEST); - vp = adrof(STRargv); - if (vp == 0) { - vp = &nulargv; - goto eatmod; - } - break; - } - if (!alnum(c)) - stderror(ERR_VARALNUM); - for (;;) { - *np++ = c; - c = DgetC(0); - if (!alnum(c)) - break; - if (np >= &name[MAXVARLEN]) - stderror(ERR_VARTOOLONG); - } - *np++ = 0; - unDredc(c); - vp = adrof(name); - } - if (bitset) { - dolp = (vp || getenv(short2str(name))) ? STR1 : STR0; - goto eatbrac; - } - if (vp == 0) { - np = str2short(getenv(short2str(name))); - if (np) { - fixDolMod(); - setDolp(np); - goto eatbrac; - } - udvar(name); - /* NOTREACHED */ - } - c = DgetC(0); - upb = blklen(vp->vec); - if (dimen == 0 && subscr == 0 && c == '[') { - np = name; - for (;;) { - c = DgetC(DODOL); /* Allow $ expand within [ ] */ - if (c == ']') - break; - if (c == '\n' || c == DEOF) - stderror(ERR_INCBR); - if (np >= &name[sizeof(name) / sizeof(Char) - 2]) - stderror(ERR_VARTOOLONG); - *np++ = c; - } - *np = 0, np = name; - if (dolp || dolcnt) /* $ exp must end before ] */ - stderror(ERR_EXPORD); - if (!*np) - stderror(ERR_SYNTAX); - if (Isdigit(*np)) { - int i; - - for (i = 0; Isdigit(*np); i = i * 10 + *np++ - '0') - continue; - if ((i < 0 || i > upb) && !any("-*", *np)) { - dolerror(vp->v_name); - return; - } - lwb = i; - if (!*np) - upb = lwb, np = STRstar; - } - if (*np == '*') - np++; - else if (*np != '-') - stderror(ERR_MISSING, '-'); - else { - int i = upb; - - np++; - if (Isdigit(*np)) { - i = 0; - while (Isdigit(*np)) - i = i * 10 + *np++ - '0'; - if (i < 0 || i > upb) { - dolerror(vp->v_name); - return; - } - } - if (i < lwb) - upb = lwb - 1; - else - upb = i; - } - if (lwb == 0) { - if (upb != 0) { - dolerror(vp->v_name); - return; - } - upb = -1; - } - if (*np) - stderror(ERR_SYNTAX); - } - else { - if (subscr > 0) { - if (subscr > upb) - lwb = 1, upb = 0; - else - lwb = upb = subscr; - } - unDredc(c); - } - if (dimen) { - Char *cp = putn(upb - lwb + 1); - - addla(cp); - xfree((ptr_t) cp); - } - else { -eatmod: - fixDolMod(); - dolnxt = &vp->vec[lwb - 1]; - dolcnt = upb - lwb + 1; - } -eatbrac: - if (sc == '{') { - c = Dredc(); - if (c != '}') - stderror(ERR_MISSING, '}'); - } -} - -static void -fixDolMod() -{ - int c; - - c = DgetC(0); - if (c == ':') { - do { - c = DgetC(0), dolmcnt = 1, dolwcnt = 1; - if (c == 'g' || c == 'a') { - if (c == 'g') - dolmcnt = 10000; - else - dolwcnt = 10000; - c = DgetC(0); - } - if ((c == 'g' && dolmcnt != 10000) || - (c == 'a' && dolwcnt != 10000)) { - if (c == 'g') - dolmcnt = 10000; - else - dolwcnt = 10000; - c = DgetC(0); - } - - if (c == 's') { /* [eichin:19910926.0755EST] */ - int delimcnt = 2; - int delim = DgetC(0); - dolmod[dolnmod++] = c; - dolmod[dolnmod++] = delim; - - if (!delim || letter(delim) - || Isdigit(delim) || any(" \t\n", delim)) { - seterror(ERR_BADSUBST); - break; - } - while ((c = DgetC(0)) != (-1)) { - dolmod[dolnmod++] = c; - if(c == delim) delimcnt--; - if(!delimcnt) break; - } - if(delimcnt) { - seterror(ERR_BADSUBST); - break; - } - continue; - } - if (!any("htrqxes", c)) - stderror(ERR_BADMOD, c); - dolmod[dolnmod++] = c; - if (c == 'q') - dolmcnt = 10000; - } - while ((c = DgetC(0)) == ':'); - unDredc(c); - } - else - unDredc(c); -} - -static void -setDolp(cp) - Char *cp; -{ - Char *dp; - int i; - - if (dolnmod == 0 || dolmcnt == 0) { - dolp = cp; - return; - } - dp = cp = Strsave(cp); - for (i = 0; i < dolnmod; i++) { - /* handle s// [eichin:19910926.0510EST] */ - if(dolmod[i] == 's') { - int delim; - Char *lhsub, *rhsub, *np; - size_t lhlen = 0, rhlen = 0; - int didmod = 0; - - delim = dolmod[++i]; - if (!delim || letter(delim) - || Isdigit(delim) || any(" \t\n", delim)) { - seterror(ERR_BADSUBST); - break; - } - lhsub = &dolmod[++i]; - while(dolmod[i] != delim && dolmod[++i]) { - lhlen++; - } - dolmod[i] = 0; - rhsub = &dolmod[++i]; - while(dolmod[i] != delim && dolmod[++i]) { - rhlen++; - } - dolmod[i] = 0; - - do { - dp = Strstr(cp, lhsub); - if (dp) { - np = (Char *) xmalloc((size_t) - ((Strlen(cp) + 1 - lhlen + rhlen) * - sizeof(Char))); - (void) Strncpy(np, cp, dp - cp); - (void) Strcpy(np + (dp - cp), rhsub); - (void) Strcpy(np + (dp - cp) + rhlen, dp + lhlen); - - xfree((ptr_t) cp); - dp = cp = np; - didmod = 1; - } else { - /* should this do a seterror? */ - break; - } - } - while (dolwcnt == 10000); - /* - * restore dolmod for additional words - */ - dolmod[i] = rhsub[-1] = delim; - if (didmod) - dolmcnt--; - else - break; - } else { - int didmod = 0; - - do { - if ((dp = domod(cp, dolmod[i]))) { - didmod = 1; - if (Strcmp(cp, dp) == 0) { - xfree((ptr_t) cp); - cp = dp; - break; - } - else { - xfree((ptr_t) cp); - cp = dp; - } - } - else - break; - } - while (dolwcnt == 10000); - dp = cp; - if (didmod) - dolmcnt--; - else - break; - } - } - - if (dp) { - addla(dp); - xfree((ptr_t) dp); - } - else - addla(cp); - - dolp = STRNULL; - if (seterr) - stderror(ERR_OLD); -} - -static void -unDredc(c) - int c; -{ - - Dpeekrd = c; -} - -static int -Dredc() -{ - int c; - - if ((c = Dpeekrd) != '\0') { - Dpeekrd = 0; - return (c); - } - if (Dcp && (c = *Dcp++)) - return (c & (QUOTE | TRIM)); - if (*Dvp == 0) { - Dcp = 0; - return (DEOF); - } - Dcp = *Dvp++; - return (' '); -} - -static void -Dtestq(c) - int c; -{ - - if (cmap(c, QUOTES)) - gflag = 1; -} - -/* - * Form a shell temporary file (in unit 0) from the words - * of the shell input up to EOF or a line the same as "term". - * Unit 0 should have been closed before this call. - */ -void -/*ARGSUSED*/ -heredoc(term) - Char *term; -{ - int c; - Char *Dv[2]; - Char obuf[BUFSIZ], lbuf[BUFSIZ], mbuf[BUFSIZ]; - int ocnt, lcnt, mcnt; - Char *lbp, *obp, *mbp; - Char **vp; - bool quoted; - char *tmp; - - if (creat(tmp = short2str(shtemp), 0600) < 0) - stderror(ERR_SYSTEM, tmp, strerror(errno)); - (void) close(0); - if (open(tmp, O_RDWR) < 0) { - int oerrno = errno; - - (void) unlink(tmp); - errno = oerrno; - stderror(ERR_SYSTEM, tmp, strerror(errno)); - } - (void) unlink(tmp); /* 0 0 inode! */ - Dv[0] = term; - Dv[1] = NULL; - gflag = 0; - trim(Dv); - rscan(Dv, Dtestq); - quoted = gflag; - ocnt = BUFSIZ; - obp = obuf; - for (;;) { - /* - * Read up a line - */ - lbp = lbuf; - lcnt = BUFSIZ - 4; - for (;;) { - c = readc(1); /* 1 -> Want EOF returns */ - if (c < 0 || c == '\n') - break; - if ((c &= TRIM) != '\0') { - *lbp++ = c; - if (--lcnt < 0) { - setname("<<"); - stderror(ERR_NAME | ERR_OVERFLOW); - } - } - } - *lbp = 0; - - /* - * Check for EOF or compare to terminator -- before expansion - */ - if (c < 0 || eq(lbuf, term)) { - (void) write(0, short2str(obuf), (size_t) (BUFSIZ - ocnt)); - (void) lseek(0, 0l, L_SET); - return; - } - - /* - * If term was quoted or -n just pass it on - */ - if (quoted || noexec) { - *lbp++ = '\n'; - *lbp = 0; - for (lbp = lbuf; (c = *lbp++) != '\0';) { - *obp++ = c; - if (--ocnt == 0) { - (void) write(0, short2str(obuf), BUFSIZ); - obp = obuf; - ocnt = BUFSIZ; - } - } - continue; - } - - /* - * Term wasn't quoted so variable and then command expand the input - * line - */ - Dcp = lbuf; - Dvp = Dv + 1; - mbp = mbuf; - mcnt = BUFSIZ - 4; - for (;;) { - c = DgetC(DODOL); - if (c == DEOF) - break; - if ((c &= TRIM) == 0) - continue; - /* \ quotes \ $ ` here */ - if (c == '\\') { - c = DgetC(0); - if (!any("$\\`", c)) - unDgetC(c | QUOTE), c = '\\'; - else - c |= QUOTE; - } - *mbp++ = c; - if (--mcnt == 0) { - setname("<<"); - stderror(ERR_NAME | ERR_OVERFLOW); - } - } - *mbp++ = 0; - - /* - * If any ` in line do command substitution - */ - mbp = mbuf; - if (any(short2str(mbp), '`')) { - /* - * 1 arg to dobackp causes substitution to be literal. Words are - * broken only at newlines so that all blanks and tabs are - * preserved. Blank lines (null words) are not discarded. - */ - vp = dobackp(mbuf, 1); - } - else - /* Setup trivial vector similar to return of dobackp */ - Dv[0] = mbp, Dv[1] = NULL, vp = Dv; - - /* - * Resurrect the words from the command substitution each separated by - * a newline. Note that the last newline of a command substitution - * will have been discarded, but we put a newline after the last word - * because this represents the newline after the last input line! - */ - for (; *vp; vp++) { - for (mbp = *vp; *mbp; mbp++) { - *obp++ = *mbp & TRIM; - if (--ocnt == 0) { - (void) write(0, short2str(obuf), BUFSIZ); - obp = obuf; - ocnt = BUFSIZ; - } - } - *obp++ = '\n'; - if (--ocnt == 0) { - (void) write(0, short2str(obuf), BUFSIZ); - obp = obuf; - ocnt = BUFSIZ; - } - } - if (pargv) - blkfree(pargv), pargv = 0; - } -} diff --git a/bin/csh/err.c b/bin/csh/err.c deleted file mode 100644 index 9eb689d..0000000 --- a/bin/csh/err.c +++ /dev/null @@ -1,411 +0,0 @@ -/*- - * Copyright (c) 1980, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -#if 0 -static char sccsid[] = "@(#)err.c 8.1 (Berkeley) 5/31/93"; -#else -static const char rcsid[] = - "$FreeBSD$"; -#endif -#endif /* not lint */ - -#include <sys/types.h> -#include <unistd.h> -#if __STDC__ -# include <stdarg.h> -#else -# include <varargs.h> -#endif - -#include "csh.h" -#include "extern.h" - -char *seterr = NULL; /* Holds last error if there was one */ - -#define ERR_FLAGS 0xf0000000 -#define ERR_NAME 0x10000000 -#define ERR_SILENT 0x20000000 -#define ERR_OLD 0x40000000 - -static char *errorlist[] = -{ -#define ERR_SYNTAX 0 - "Syntax Error", -#define ERR_NOTALLOWED 1 - "%s is not allowed", -#define ERR_WTOOLONG 2 - "Word too long", -#define ERR_LTOOLONG 3 - "$< line too long", -#define ERR_DOLZERO 4 - "No file for $0", -#define ERR_DOLQUEST 5 - "$? not allowed here", -#define ERR_INCBR 6 - "Incomplete [] modifier", -#define ERR_EXPORD 7 - "$ expansion must end before ]", -#define ERR_BADMOD 8 - "Bad : modifier in $ (%c)", -#define ERR_SUBSCRIPT 9 - "Subscript error", -#define ERR_BADNUM 10 - "Badly formed number", -#define ERR_NOMORE 11 - "No more words", -#define ERR_FILENAME 12 - "Missing file name", -#define ERR_GLOB 13 - "Internal glob error", -#define ERR_COMMAND 14 - "Command not found", -#define ERR_TOOFEW 15 - "Too few arguments", -#define ERR_TOOMANY 16 - "Too many arguments", -#define ERR_DANGER 17 - "Too dangerous to alias that", -#define ERR_EMPTYIF 18 - "Empty if", -#define ERR_IMPRTHEN 19 - "Improper then", -#define ERR_NOPAREN 20 - "Words not parenthesized", -#define ERR_NOTFOUND 21 - "%s not found", -#define ERR_MASK 22 - "Improper mask", -#define ERR_LIMIT 23 - "No such limit", -#define ERR_TOOLARGE 24 - "Argument too large", -#define ERR_SCALEF 25 - "Improper or unknown scale factor", -#define ERR_UNDVAR 26 - "Undefined variable", -#define ERR_DEEP 27 - "Directory stack not that deep", -#define ERR_BADSIG 28 - "Bad signal number", -#define ERR_UNKSIG 29 - "Unknown signal; kill -l lists signals", -#define ERR_VARBEGIN 30 - "Variable name must begin with a letter", -#define ERR_VARTOOLONG 31 - "Variable name too long", -#define ERR_VARALNUM 32 - "Variable name must contain alphanumeric characters", -#define ERR_JOBCONTROL 33 - "No job control in this shell", -#define ERR_EXPRESSION 34 - "Expression Syntax", -#define ERR_NOHOMEDIR 35 - "No home directory", -#define ERR_CANTCHANGE 36 - "Can't change to home directory", -#define ERR_NULLCOM 37 - "Invalid null command", -#define ERR_ASSIGN 38 - "Assignment missing expression", -#define ERR_UNKNOWNOP 39 - "Unknown operator", -#define ERR_AMBIG 40 - "Ambiguous", -#define ERR_EXISTS 41 - "%s: File exists", -#define ERR_INTR 42 - "Interrupted", -#define ERR_RANGE 43 - "Subscript out of range", -#define ERR_OVERFLOW 44 - "Line overflow", -#define ERR_VARMOD 45 - "Unknown variable modifier", -#define ERR_NOSUCHJOB 46 - "No such job", -#define ERR_TERMINAL 47 - "Can't from terminal", -#define ERR_NOTWHILE 48 - "Not in while/foreach", -#define ERR_NOPROC 49 - "No more processes", -#define ERR_NOMATCH 50 - "No match", -#define ERR_MISSING 51 - "Missing %c", -#define ERR_UNMATCHED 52 - "Unmatched %c", -#define ERR_NOMEM 53 - "Out of memory", -#define ERR_PIPE 54 - "Can't make pipe", -#define ERR_SYSTEM 55 - "%s: %s", -#define ERR_STRING 56 - "%s", -#define ERR_JOBS 57 - "Usage: jobs [ -l ]", -#define ERR_JOBARGS 58 - "Arguments should be jobs or process id's", -#define ERR_JOBCUR 59 - "No current job", -#define ERR_JOBPREV 60 - "No previous job", -#define ERR_JOBPAT 61 - "No job matches pattern", -#define ERR_NESTING 62 - "Fork nesting > %d; maybe `...` loop", -#define ERR_JOBCTRLSUB 63 - "No job control in subshells", -#define ERR_BADPLPS 64 - "Badly placed ()'s", -#define ERR_STOPPED 65 - "%sThere are suspended jobs", -#define ERR_NODIR 66 - "No other directory", -#define ERR_EMPTY 67 - "Directory stack empty", -#define ERR_BADDIR 68 - "Bad directory", -#define ERR_DIRUS 69 - "Usage: %s [-lvn]%s", -#define ERR_HFLAG 70 - "No operand for -h flag", -#define ERR_NOTLOGIN 71 - "Not a login shell", -#define ERR_DIV0 72 - "Division by 0", -#define ERR_MOD0 73 - "Mod by 0", -#define ERR_BADSCALE 74 - "Bad scaling; did you mean \"%s\"?", -#define ERR_SUSPLOG 75 - "Can't suspend a login shell (yet)", -#define ERR_UNKUSER 76 - "Unknown user: %s", -#define ERR_NOHOME 77 - "No $home variable set", -#define ERR_HISTUS 78 - "Usage: history [-rh] [# number of events]", -#define ERR_SPDOLLT 79 - "$, ! or < not allowed with $# or $?", -#define ERR_NEWLINE 80 - "Newline in variable name", -#define ERR_SPSTAR 81 - "* not allowed with $# or $?", -#define ERR_DIGIT 82 - "$?<digit> or $#<digit> not allowed", -#define ERR_VARILL 83 - "Illegal variable name", -#define ERR_NLINDEX 84 - "Newline in variable index", -#define ERR_EXPOVFL 85 - "Expansion buffer overflow", -#define ERR_VARSYN 86 - "Variable syntax", -#define ERR_BADBANG 87 - "Bad ! form", -#define ERR_NOSUBST 88 - "No previous substitute", -#define ERR_BADSUBST 89 - "Bad substitute", -#define ERR_LHS 90 - "No previous left hand side", -#define ERR_RHSLONG 91 - "Right hand side too long", -#define ERR_BADBANGMOD 92 - "Bad ! modifier: %c", -#define ERR_MODFAIL 93 - "Modifier failed", -#define ERR_SUBOVFL 94 - "Substitution buffer overflow", -#define ERR_BADBANGARG 95 - "Bad ! arg selector", -#define ERR_NOSEARCH 96 - "No prev search", -#define ERR_NOEVENT 97 - "%s: Event not found", -#define ERR_TOOMANYRP 98 - "Too many )'s", -#define ERR_TOOMANYLP 99 - "Too many ('s", -#define ERR_BADPLP 100 - "Badly placed (", -#define ERR_MISRED 101 - "Missing name for redirect", -#define ERR_OUTRED 102 - "Ambiguous output redirect", -#define ERR_REDPAR 103 - "Can't << within ()'s", -#define ERR_INRED 104 - "Ambiguous input redirect", -#define ERR_ALIASLOOP 105 - "Alias loop", -#define ERR_HISTLOOP 106 - "!# History loop", -#define ERR_ARCH 107 - "%s: %s. Wrong Architecture", -#define ERR_FILEINQ 108 - "Malformed file inquiry", -#define ERR_SELOVFL 109 - "Selector overflow", -#define ERR_INVALID 110 - "Invalid Error" -}; - -/* - * The parser and scanner set up errors for later by calling seterr, - * which sets the variable err as a side effect; later to be tested, - * e.g. in process. - */ -void -#if __STDC__ -seterror(int id, ...) -#else -seterror(id, va_alist) - int id; - va_dcl -#endif -{ - if (seterr == 0) { - char berr[BUFSIZ]; - va_list va; - -#if __STDC__ - va_start(va, id); -#else - va_start(va); -#endif - if (id < 0 || id > sizeof(errorlist) / sizeof(errorlist[0])) - id = ERR_INVALID; - vsnprintf(berr, sizeof(berr), errorlist[id], va); - va_end(va); - - seterr = strsave(berr); - } -} - -/* - * Print the error with the given id. - * - * Special ids: - * ERR_SILENT: Print nothing. - * ERR_OLD: Print the previously set error if one was there. - * otherwise return. - * ERR_NAME: If this bit is set, print the name of the function - * in bname - * - * This routine always resets or exits. The flag haderr - * is set so the routine who catches the unwind can propagate - * it if they want. - * - * Note that any open files at the point of error will eventually - * be closed in the routine process in sh.c which is the only - * place error unwinds are ever caught. - */ -void -#if __STDC__ -stderror(int id, ...) -#else -stderror(id, va_alist) - int id; - va_dcl -#endif -{ - va_list va; - Char **v; - int flags = id & ERR_FLAGS; - - id &= ~ERR_FLAGS; - - if ((flags & ERR_OLD) && seterr == NULL) - return; - - if (id < 0 || id > sizeof(errorlist) / sizeof(errorlist[0])) - id = ERR_INVALID; - - (void) fflush(cshout); - (void) fflush(csherr); - haderr = 1; /* Now to diagnostic output */ - timflg = 0; /* This isn't otherwise reset */ - - - if (!(flags & ERR_SILENT)) { - if (flags & ERR_NAME) - (void) fprintf(csherr, "%s: ", bname); - if ((flags & ERR_OLD)) - /* Old error. */ - (void) fprintf(csherr, "%s.\n", seterr); - else { -#if __STDC__ - va_start(va, id); -#else - va_start(va); -#endif - (void) vfprintf(csherr, errorlist[id], va); - va_end(va); - (void) fprintf(csherr, ".\n"); - } - } - - if (seterr) { - xfree((ptr_t) seterr); - seterr = NULL; - } - - if ((v = pargv) != NULL) - pargv = 0, blkfree(v); - if ((v = gargv) != NULL) - gargv = 0, blkfree(v); - - (void) fflush(cshout); - (void) fflush(csherr); - didfds = 0; /* Forget about 0,1,2 */ - /* - * Go away if -e or we are a child shell - */ - if (exiterr || child) - xexit(1); - - /* - * Reset the state of the input. This buffered seek to end of file will - * also clear the while/foreach stack. - */ - btoeof(); - - set(STRstatus, Strsave(STR1)); - if (tpgrp > 0) - (void) tcsetpgrp(FSHTTY, tpgrp); - reset(); /* Unwind */ -} diff --git a/bin/csh/exec.c b/bin/csh/exec.c deleted file mode 100644 index 64d45d2..0000000 --- a/bin/csh/exec.c +++ /dev/null @@ -1,746 +0,0 @@ -/*- - * Copyright (c) 1980, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -#if 0 -static char sccsid[] = "@(#)exec.c 8.1 (Berkeley) 5/31/93"; -#else -static const char rcsid[] = - "$FreeBSD$"; -#endif -#endif /* not lint */ - -#include <sys/param.h> -#include <dirent.h> -#include <fcntl.h> -#include <sys/stat.h> -#include <errno.h> -#include <string.h> -#include <unistd.h> -#if __STDC__ -# include <stdarg.h> -#else -# include <varargs.h> -#endif - -#include "csh.h" -#include "extern.h" - -/* - * System level search and execute of a command. We look in each directory - * for the specified command name. If the name contains a '/' then we - * execute only the full path name. If there is no search path then we - * execute only full path names. - */ -extern char **environ; - -/* - * As we search for the command we note the first non-trivial error - * message for presentation to the user. This allows us often - * to show that a file has the wrong mode/no access when the file - * is not in the last component of the search path, so we must - * go on after first detecting the error. - */ -static char *exerr; /* Execution error message */ -static Char *expath; /* Path for exerr */ - -/* - * Xhash is an array of HSHSIZ bits (HSHSIZ / 8 chars), which are used - * to hash execs. If it is allocated (havhash true), then to tell - * whether ``name'' is (possibly) present in the i'th component - * of the variable path, you look at the bit in xhash indexed by - * hash(hashname("name"), i). This is setup automatically - * after .login is executed, and recomputed whenever ``path'' is - * changed. - * The two part hash function is designed to let texec() call the - * more expensive hashname() only once and the simple hash() several - * times (once for each path component checked). - * Byte size is assumed to be 8. - */ -#define HSHSIZ 8192 /* 1k bytes */ -#define HSHMASK (HSHSIZ - 1) -#define HSHMUL 243 -static char xhash[HSHSIZ / 8]; - -#define hash(a, b) (((a) * HSHMUL + (b)) & HSHMASK) -#define bit(h, b) ((h)[(b) >> 3] & 1 << ((b) & 7)) /* bit test */ -#define bis(h, b) ((h)[(b) >> 3] |= 1 << ((b) & 7)) /* bit set */ -static int hits, misses; - -/* Dummy search path for just absolute search when no path */ -static Char *justabs[] = {STRNULL, 0}; - -static void pexerr __P((void)); -static void texec __P((Char *, Char **)); -static int hashname __P((Char *)); -static void tellmewhat __P((struct wordent *)); -static int executable __P((Char *, Char *, bool)); -static int iscommand __P((Char *)); - - -void -/*ARGSUSED*/ -doexec(v, t) - Char **v; - struct command *t; -{ - Char *dp, **pv, **av, *sav; - struct varent *pathv; - bool slash; - int hashval = 0, hashval1, i; - Char *blk[2]; - - /* - * Glob the command name. We will search $path even if this does something, - * as in sh but not in csh. One special case: if there is no PATH, then we - * execute only commands which start with '/'. - */ - blk[0] = t->t_dcom[0]; - blk[1] = 0; - gflag = 0, tglob(blk); - if (gflag) { - pv = globall(blk); - if (pv == 0) { - setname(vis_str(blk[0])); - stderror(ERR_NAME | ERR_NOMATCH); - } - gargv = 0; - } - else - pv = saveblk(blk); - - trim(pv); - - exerr = 0; - expath = Strsave(pv[0]); - Vexpath = expath; - - pathv = adrof(STRpath); - if (pathv == 0 && expath[0] != '/') { - blkfree(pv); - pexerr(); - } - slash = any(short2str(expath), '/'); - - /* - * Glob the argument list, if necessary. Otherwise trim off the quote bits. - */ - gflag = 0; - av = &t->t_dcom[1]; - tglob(av); - if (gflag) { - av = globall(av); - if (av == 0) { - blkfree(pv); - setname(vis_str(expath)); - stderror(ERR_NAME | ERR_NOMATCH); - } - gargv = 0; - } - else - av = saveblk(av); - - blkfree(t->t_dcom); - t->t_dcom = blkspl(pv, av); - xfree((ptr_t) pv); - xfree((ptr_t) av); - av = t->t_dcom; - trim(av); - - if (*av == NULL || **av == '\0') - pexerr(); - - xechoit(av); /* Echo command if -x */ - /* - * Since all internal file descriptors are set to close on exec, we don't - * need to close them explicitly here. Just reorient ourselves for error - * messages. - */ - SHIN = 0; - SHOUT = 1; - SHERR = 2; - OLDSTD = 0; - /* - * We must do this AFTER any possible forking (like `foo` in glob) so that - * this shell can still do subprocesses. - */ - (void) sigsetmask(0); - /* - * If no path, no words in path, or a / in the filename then restrict the - * command search. - */ - if (pathv == 0 || pathv->vec[0] == 0 || slash) - pv = justabs; - else - pv = pathv->vec; - sav = Strspl(STRslash, *av);/* / command name for postpending */ - Vsav = sav; - if (havhash) - hashval = hashname(*av); - i = 0; - hits++; - do { - /* - * Try to save time by looking at the hash table for where this command - * could be. If we are doing delayed hashing, then we put the names in - * one at a time, as the user enters them. This is kinda like Korn - * Shell's "tracked aliases". - */ - if (!slash && pv[0][0] == '/' && havhash) { - hashval1 = hash(hashval, i); - if (!bit(xhash, hashval1)) - goto cont; - } - if (pv[0][0] == 0 || eq(pv[0], STRdot)) /* don't make ./xxx */ - texec(*av, av); - else { - dp = Strspl(*pv, sav); - Vdp = dp; - texec(dp, av); - Vdp = 0; - xfree((ptr_t) dp); - } - misses++; -cont: - pv++; - i++; - } while (*pv); - hits--; - Vsav = 0; - xfree((ptr_t) sav); - pexerr(); -} - -static void -pexerr() -{ - /* Couldn't find the damn thing */ - if (expath) { - setname(vis_str(expath)); - Vexpath = 0; - xfree((ptr_t) expath); - expath = 0; - } - else - setname(""); - if (exerr) - stderror(ERR_NAME | ERR_STRING, exerr); - stderror(ERR_NAME | ERR_COMMAND); -} - -/* - * Execute command f, arg list t. - * Record error message if not found. - * Also do shell scripts here. - */ -static void -texec(sf, st) - Char *sf; - Char **st; -{ - char **t; - char *f; - struct varent *v; - Char **vp; - Char *lastsh[2]; - int fd; - unsigned char c; - Char *st0, **ost; - - /* The order for the conversions is significant */ - t = short2blk(st); - f = short2str(sf); - Vt = t; - errno = 0; /* don't use a previous error */ - (void) execve(f, t, environ); - Vt = 0; - blkfree((Char **) t); - switch (errno) { - - case ENOEXEC: - /* - * From: casper@fwi.uva.nl (Casper H.S. Dik) If we could not execute - * it, don't feed it to the shell if it looks like a binary! - */ - if ((fd = open(f, O_RDONLY)) != -1) { - if (read(fd, (char *) &c, 1) == 1) { - if (!Isprint(c) && (c != '\n' && c != '\t')) { - (void) close(fd); - /* - * We *know* what ENOEXEC means. - */ - stderror(ERR_ARCH, f, strerror(errno)); - } - } -#ifdef _PATH_BSHELL - else - c = '#'; -#endif - (void) close(fd); - } - /* - * If there is an alias for shell, then put the words of the alias in - * front of the argument list replacing the command name. Note no - * interpretation of the words at this point. - */ - v = adrof1(STRshell, &aliases); - if (v == 0) { - vp = lastsh; - vp[0] = adrof(STRshell) ? value(STRshell) : STR_SHELLPATH; - vp[1] = NULL; -#ifdef _PATH_BSHELL - if (fd != -1 && c != '#') - vp[0] = STR_BSHELL; -#endif - } - else - vp = v->vec; - st0 = st[0]; - st[0] = sf; - ost = st; - st = blkspl(vp, st); /* Splice up the new arglst */ - ost[0] = st0; - sf = *st; - /* The order for the conversions is significant */ - t = short2blk(st); - f = short2str(sf); - xfree((ptr_t) st); - Vt = t; - (void) execve(f, t, environ); - Vt = 0; - blkfree((Char **) t); - /* The sky is falling, the sky is falling! */ - - case ENOMEM: - stderror(ERR_SYSTEM, f, strerror(errno)); - - case ENOENT: - break; - - default: - if (exerr == 0) { - exerr = strerror(errno); - if (expath) - xfree((ptr_t) expath); - expath = Strsave(sf); - Vexpath = expath; - } - } -} - -/*ARGSUSED*/ -void -execash(t, kp) - Char **t; - struct command *kp; -{ - int saveIN, saveOUT, saveDIAG, saveSTD; - int oSHIN; - int oSHOUT; - int oSHERR; - int oOLDSTD; - jmp_buf osetexit; - int my_reenter; - int odidfds; - sig_t osigint, osigquit, osigterm; - - if (chkstop == 0 && setintr) - panystop(0); - /* - * Hmm, we don't really want to do that now because we might - * fail, but what is the choice - */ - rechist(); - - osigint = signal(SIGINT, parintr); - osigquit = signal(SIGQUIT, parintr); - osigterm = signal(SIGTERM, parterm); - - odidfds = didfds; - oSHIN = SHIN; - oSHOUT = SHOUT; - oSHERR = SHERR; - oOLDSTD = OLDSTD; - - saveIN = dcopy(SHIN, -1); - saveOUT = dcopy(SHOUT, -1); - saveDIAG = dcopy(SHERR, -1); - saveSTD = dcopy(OLDSTD, -1); - - lshift(kp->t_dcom, 1); - - getexit(osetexit); - - if ((my_reenter = setexit()) == 0) { - SHIN = dcopy(0, -1); - SHOUT = dcopy(1, -1); - SHERR = dcopy(2, -1); - didfds = 0; - doexec(t, kp); - } - - (void) signal(SIGINT, osigint); - (void) signal(SIGQUIT, osigquit); - (void) signal(SIGTERM, osigterm); - - doneinp = 0; - didfds = odidfds; - (void) close(SHIN); - (void) close(SHOUT); - (void) close(SHERR); - (void) close(OLDSTD); - SHIN = dmove(saveIN, oSHIN); - SHOUT = dmove(saveOUT, oSHOUT); - SHERR = dmove(saveDIAG, oSHERR); - OLDSTD = dmove(saveSTD, oOLDSTD); - - resexit(osetexit); - if (my_reenter) - stderror(ERR_SILENT); -} - -void -xechoit(t) - Char **t; -{ - if (adrof(STRecho)) { - (void) fflush(csherr); - blkpr(csherr, t); - (void) fputc('\n', csherr); - } -} - -void -/*ARGSUSED*/ -dohash(v, t) - Char **v; - struct command *t; -{ - DIR *dirp; - struct dirent *dp; - int cnt; - int i = 0; - struct varent *pathv = adrof(STRpath); - Char **pv; - int hashval; - - havhash = 1; - for (cnt = 0; cnt < sizeof xhash; cnt++) - xhash[cnt] = 0; - if (pathv == 0) - return; - for (pv = pathv->vec; *pv; pv++, i++) { - if (pv[0][0] != '/') - continue; - dirp = opendir(short2str(*pv)); - if (dirp == NULL) - continue; - while ((dp = readdir(dirp)) != NULL) { - if (dp->d_ino == 0) - continue; - if (dp->d_name[0] == '.' && - (dp->d_name[1] == '\0' || - (dp->d_name[1] == '.' && dp->d_name[2] == '\0'))) - continue; - hashval = hash(hashname(str2short(dp->d_name)), i); - bis(xhash, hashval); - /* tw_add_comm_name (dp->d_name); */ - } - (void) closedir(dirp); - } -} - -void -/*ARGSUSED*/ -dounhash(v, t) - Char **v; - struct command *t; -{ - havhash = 0; -} - -void -/*ARGSUSED*/ -hashstat(v, t) - Char **v; - struct command *t; -{ - if (hits + misses) - (void) fprintf(cshout, "%d hits, %d misses, %d%%\n", - hits, misses, 100 * hits / (hits + misses)); -} - -/* - * Hash a command name. - */ -static int -hashname(cp) - Char *cp; -{ - long h = 0; - - while (*cp) - h = hash(h, *cp++); - return ((int) h); -} - -static int -iscommand(name) - Char *name; -{ - Char **pv; - Char *sav; - struct varent *v; - bool slash = any(short2str(name), '/'); - int hashval = 0, hashval1, i; - - v = adrof(STRpath); - if (v == 0 || v->vec[0] == 0 || slash) - pv = justabs; - else - pv = v->vec; - sav = Strspl(STRslash, name); /* / command name for postpending */ - if (havhash) - hashval = hashname(name); - i = 0; - do { - if (!slash && pv[0][0] == '/' && havhash) { - hashval1 = hash(hashval, i); - if (!bit(xhash, hashval1)) - goto cont; - } - if (pv[0][0] == 0 || eq(pv[0], STRdot)) { /* don't make ./xxx */ - if (executable(NULL, name, 0)) { - xfree((ptr_t) sav); - return i + 1; - } - } - else { - if (executable(*pv, sav, 0)) { - xfree((ptr_t) sav); - return i + 1; - } - } -cont: - pv++; - i++; - } while (*pv); - xfree((ptr_t) sav); - return 0; -} - -/* Also by: - * Andreas Luik <luik@isaak.isa.de> - * I S A GmbH - Informationssysteme fuer computerintegrierte Automatisierung - * Azenberstr. 35 - * D-7000 Stuttgart 1 - * West-Germany - * is the executable() routine below and changes to iscommand(). - * Thanks again!! - */ - -/* - * executable() examines the pathname obtained by concatenating dir and name - * (dir may be NULL), and returns 1 either if it is executable by us, or - * if dir_ok is set and the pathname refers to a directory. - * This is a bit kludgy, but in the name of optimization... - */ -static int -executable(dir, name, dir_ok) - Char *dir, *name; - bool dir_ok; -{ - struct stat stbuf; - Char path[MAXPATHLEN + 1], *dp, *sp; - char *strname; - - if (dir && *dir) { - for (dp = path, sp = dir; *sp; *dp++ = *sp++) - if (dp == &path[MAXPATHLEN + 1]) { - *--dp = '\0'; - break; - } - for (sp = name; *sp; *dp++ = *sp++) - if (dp == &path[MAXPATHLEN + 1]) { - *--dp = '\0'; - break; - } - *dp = '\0'; - strname = short2str(path); - } - else - strname = short2str(name); - return (stat(strname, &stbuf) != -1 && - ((S_ISREG(stbuf.st_mode) && - /* save time by not calling access() in the hopeless case */ - (stbuf.st_mode & (S_IXOTH | S_IXGRP | S_IXUSR)) && - access(strname, X_OK) == 0) || - (dir_ok && S_ISDIR(stbuf.st_mode)))); -} - -/* The dowhich() is by: - * Andreas Luik <luik@isaak.isa.de> - * I S A GmbH - Informationssysteme fuer computerintegrierte Automatisierung - * Azenberstr. 35 - * D-7000 Stuttgart 1 - * West-Germany - * Thanks!! - */ -/*ARGSUSED*/ -void -dowhich(v, c) - Char **v; - struct command *c; -{ - struct wordent lex[3]; - struct varent *vp; - - lex[0].next = &lex[1]; - lex[1].next = &lex[2]; - lex[2].next = &lex[0]; - - lex[0].prev = &lex[2]; - lex[1].prev = &lex[0]; - lex[2].prev = &lex[1]; - - lex[0].word = STRNULL; - lex[2].word = STRret; - - while (*++v) { - if ((vp = adrof1(*v, &aliases)) != NULL) { - (void) fprintf(cshout, "%s: \t aliased to ", vis_str(*v)); - blkpr(cshout, vp->vec); - (void) fputc('\n', cshout); - } - else { - lex[1].word = *v; - tellmewhat(lex); - } - } -} - -static void -tellmewhat(lex) - struct wordent *lex; -{ - int i; - struct biltins *bptr; - struct wordent *sp = lex->next; - bool aliased = 0; - Char *s0, *s1, *s2, *cmd; - Char qc; - - if (adrof1(sp->word, &aliases)) { - alias(lex); - sp = lex->next; - aliased = 1; - } - - s0 = sp->word; /* to get the memory freeing right... */ - - /* handle quoted alias hack */ - if ((*(sp->word) & (QUOTE | TRIM)) == QUOTE) - (sp->word)++; - - /* do quoting, if it hasn't been done */ - s1 = s2 = sp->word; - while (*s2) - switch (*s2) { - case '\'': - case '"': - qc = *s2++; - while (*s2 && *s2 != qc) - *s1++ = *s2++ | QUOTE; - if (*s2) - s2++; - break; - case '\\': - if (*++s2) - *s1++ = *s2++ | QUOTE; - break; - default: - *s1++ = *s2++; - } - *s1 = '\0'; - - for (bptr = bfunc; bptr < &bfunc[nbfunc]; bptr++) { - if (eq(sp->word, str2short(bptr->bname))) { - if (aliased) - prlex(cshout, lex); - (void) fprintf(cshout, "%s: shell built-in command.\n", - vis_str(sp->word)); - sp->word = s0; /* we save and then restore this */ - return; - } - } - - sp->word = cmd = globone(sp->word, G_IGNORE); - - if ((i = iscommand(strip(sp->word))) != 0) { - Char **pv; - struct varent *v; - bool slash = any(short2str(sp->word), '/'); - - v = adrof(STRpath); - if (v == 0 || v->vec[0] == 0 || slash) - pv = justabs; - else - pv = v->vec; - - while (--i) - pv++; - if (pv[0][0] == 0 || eq(pv[0], STRdot)) { - if (!slash) { - sp->word = Strspl(STRdotsl, sp->word); - prlex(cshout, lex); - xfree((ptr_t) sp->word); - } else - prlex(cshout, lex); - sp->word = s0; /* we save and then restore this */ - xfree((ptr_t) cmd); - return; - } - s1 = Strspl(*pv, STRslash); - sp->word = Strspl(s1, sp->word); - xfree((ptr_t) s1); - prlex(cshout, lex); - xfree((ptr_t) sp->word); - } - else { - if (aliased) - prlex(cshout, lex); - (void) fprintf(csherr, "%s: Command not found.\n", vis_str(sp->word)); - } - xfree((ptr_t) cmd); - sp->word = s0; /* we save and then restore this */ -} diff --git a/bin/csh/exp.c b/bin/csh/exp.c deleted file mode 100644 index b6ec280..0000000 --- a/bin/csh/exp.c +++ /dev/null @@ -1,712 +0,0 @@ -/*- - * Copyright (c) 1980, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -#if 0 -static char sccsid[] = "@(#)exp.c 8.1 (Berkeley) 5/31/93"; -#else -static const char rcsid[] = - "$FreeBSD$"; -#endif -#endif /* not lint */ - -#include <sys/types.h> -#include <sys/stat.h> -#include <unistd.h> -#if __STDC__ -# include <stdarg.h> -#else -# include <varargs.h> -#endif - -#include "csh.h" -#include "extern.h" - -#define IGNORE 1 /* in ignore, it means to ignore value, just parse */ -#define NOGLOB 2 /* in ignore, it means not to globone */ - -#define ADDOP 1 -#define MULOP 2 -#define EQOP 4 -#define RELOP 8 -#define RESTOP 16 -#define ANYOP 31 - -#define EQEQ 1 -#define GTR 2 -#define LSS 4 -#define NOTEQ 6 -#define EQMATCH 7 -#define NOTEQMATCH 8 - -static int exp1 __P((Char ***, bool)); -static int exp2 __P((Char ***, bool)); -static int exp2a __P((Char ***, bool)); -static int exp2b __P((Char ***, bool)); -static int exp2c __P((Char ***, bool)); -static Char * exp3 __P((Char ***, bool)); -static Char * exp3a __P((Char ***, bool)); -static Char * exp4 __P((Char ***, bool)); -static Char * exp5 __P((Char ***, bool)); -static Char * exp6 __P((Char ***, bool)); -static void evalav __P((Char **)); -static int isa __P((Char *, int)); -static int egetn __P((Char *)); - -#ifdef EDEBUG -static void etracc __P((char *, Char *, Char ***)); -static void etraci __P((char *, int, Char ***)); -#endif - -int -expr(vp) - Char ***vp; -{ - return (exp0(vp, 0)); -} - -int -exp0(vp, ignore) - Char ***vp; - bool ignore; -{ - int p1 = exp1(vp, ignore); - -#ifdef EDEBUG - etraci("exp0 p1", p1, vp); -#endif - if (**vp && eq(**vp, STRor2)) { - int p2; - - (*vp)++; - p2 = exp0(vp, (ignore & IGNORE) || p1); -#ifdef EDEBUG - etraci("exp0 p2", p2, vp); -#endif - return (p1 || p2); - } - return (p1); -} - -static int -exp1(vp, ignore) - Char ***vp; - bool ignore; -{ - int p1 = exp2(vp, ignore); - -#ifdef EDEBUG - etraci("exp1 p1", p1, vp); -#endif - if (**vp && eq(**vp, STRand2)) { - int p2; - - (*vp)++; - p2 = exp1(vp, (ignore & IGNORE) || !p1); -#ifdef EDEBUG - etraci("exp1 p2", p2, vp); -#endif - return (p1 && p2); - } - return (p1); -} - -static int -exp2(vp, ignore) - Char ***vp; - bool ignore; -{ - int p1 = exp2a(vp, ignore); - -#ifdef EDEBUG - etraci("exp3 p1", p1, vp); -#endif - if (**vp && eq(**vp, STRor)) { - int p2; - - (*vp)++; - p2 = exp2(vp, ignore); -#ifdef EDEBUG - etraci("exp3 p2", p2, vp); -#endif - return (p1 | p2); - } - return (p1); -} - -static int -exp2a(vp, ignore) - Char ***vp; - bool ignore; -{ - int p1 = exp2b(vp, ignore); - -#ifdef EDEBUG - etraci("exp2a p1", p1, vp); -#endif - if (**vp && eq(**vp, STRcaret)) { - int p2; - - (*vp)++; - p2 = exp2a(vp, ignore); -#ifdef EDEBUG - etraci("exp2a p2", p2, vp); -#endif - return (p1 ^ p2); - } - return (p1); -} - -static int -exp2b(vp, ignore) - Char ***vp; - bool ignore; -{ - int p1 = exp2c(vp, ignore); - -#ifdef EDEBUG - etraci("exp2b p1", p1, vp); -#endif - if (**vp && eq(**vp, STRand)) { - int p2; - - (*vp)++; - p2 = exp2b(vp, ignore); -#ifdef EDEBUG - etraci("exp2b p2", p2, vp); -#endif - return (p1 & p2); - } - return (p1); -} - -static int -exp2c(vp, ignore) - Char ***vp; - bool ignore; -{ - Char *p1 = exp3(vp, ignore); - Char *p2; - int i; - -#ifdef EDEBUG - etracc("exp2c p1", p1, vp); -#endif - if ((i = isa(**vp, EQOP)) != 0) { - (*vp)++; - if (i == EQMATCH || i == NOTEQMATCH) - ignore |= NOGLOB; - p2 = exp3(vp, ignore); -#ifdef EDEBUG - etracc("exp2c p2", p2, vp); -#endif - if (!(ignore & IGNORE)) - switch (i) { - - case EQEQ: - i = eq(p1, p2); - break; - - case NOTEQ: - i = !eq(p1, p2); - break; - - case EQMATCH: - i = Gmatch(p1, p2); - break; - - case NOTEQMATCH: - i = !Gmatch(p1, p2); - break; - } - xfree((ptr_t) p1); - xfree((ptr_t) p2); - return (i); - } - i = egetn(p1); - xfree((ptr_t) p1); - return (i); -} - -static Char * -exp3(vp, ignore) - Char ***vp; - bool ignore; -{ - Char *p1, *p2; - int i; - - p1 = exp3a(vp, ignore); -#ifdef EDEBUG - etracc("exp3 p1", p1, vp); -#endif - if ((i = isa(**vp, RELOP)) != 0) { - (*vp)++; - if (**vp && eq(**vp, STRequal)) - i |= 1, (*vp)++; - p2 = exp3(vp, ignore); -#ifdef EDEBUG - etracc("exp3 p2", p2, vp); -#endif - if (!(ignore & IGNORE)) - switch (i) { - - case GTR: - i = egetn(p1) > egetn(p2); - break; - - case GTR | 1: - i = egetn(p1) >= egetn(p2); - break; - - case LSS: - i = egetn(p1) < egetn(p2); - break; - - case LSS | 1: - i = egetn(p1) <= egetn(p2); - break; - } - xfree((ptr_t) p1); - xfree((ptr_t) p2); - return (putn(i)); - } - return (p1); -} - -static Char * -exp3a(vp, ignore) - Char ***vp; - bool ignore; -{ - Char *p1, *p2, *op; - int i; - - p1 = exp4(vp, ignore); -#ifdef EDEBUG - etracc("exp3a p1", p1, vp); -#endif - op = **vp; - if (op && any("<>", op[0]) && op[0] == op[1]) { - (*vp)++; - p2 = exp3a(vp, ignore); -#ifdef EDEBUG - etracc("exp3a p2", p2, vp); -#endif - if (op[0] == '<') - i = egetn(p1) << egetn(p2); - else - i = egetn(p1) >> egetn(p2); - xfree((ptr_t) p1); - xfree((ptr_t) p2); - return (putn(i)); - } - return (p1); -} - -static Char * -exp4(vp, ignore) - Char ***vp; - bool ignore; -{ - Char *p1, *p2; - int i = 0; - - p1 = exp5(vp, ignore); -#ifdef EDEBUG - etracc("exp4 p1", p1, vp); -#endif - if (isa(**vp, ADDOP)) { - Char *op = *(*vp)++; - - p2 = exp4(vp, ignore); -#ifdef EDEBUG - etracc("exp4 p2", p2, vp); -#endif - if (!(ignore & IGNORE)) - switch (op[0]) { - - case '+': - i = egetn(p1) + egetn(p2); - break; - - case '-': - i = egetn(p1) - egetn(p2); - break; - } - xfree((ptr_t) p1); - xfree((ptr_t) p2); - return (putn(i)); - } - return (p1); -} - -static Char * -exp5(vp, ignore) - Char ***vp; - bool ignore; -{ - Char *p1, *p2; - int i = 0; - - p1 = exp6(vp, ignore); -#ifdef EDEBUG - etracc("exp5 p1", p1, vp); -#endif - if (isa(**vp, MULOP)) { - Char *op = *(*vp)++; - - p2 = exp5(vp, ignore); -#ifdef EDEBUG - etracc("exp5 p2", p2, vp); -#endif - if (!(ignore & IGNORE)) - switch (op[0]) { - - case '*': - i = egetn(p1) * egetn(p2); - break; - - case '/': - i = egetn(p2); - if (i == 0) - stderror(ERR_DIV0); - i = egetn(p1) / i; - break; - - case '%': - i = egetn(p2); - if (i == 0) - stderror(ERR_MOD0); - i = egetn(p1) % i; - break; - } - xfree((ptr_t) p1); - xfree((ptr_t) p2); - return (putn(i)); - } - return (p1); -} - -static Char * -exp6(vp, ignore) - Char ***vp; - bool ignore; -{ - int ccode, i = 0; - Char *cp, *dp, *ep; - - if (**vp == 0) - stderror(ERR_NAME | ERR_EXPRESSION); - if (eq(**vp, STRbang)) { - (*vp)++; - cp = exp6(vp, ignore); -#ifdef EDEBUG - etracc("exp6 ! cp", cp, vp); -#endif - i = egetn(cp); - xfree((ptr_t) cp); - return (putn(!i)); - } - if (eq(**vp, STRtilde)) { - (*vp)++; - cp = exp6(vp, ignore); -#ifdef EDEBUG - etracc("exp6 ~ cp", cp, vp); -#endif - i = egetn(cp); - xfree((ptr_t) cp); - return (putn(~i)); - } - if (eq(**vp, STRLparen)) { - (*vp)++; - ccode = exp0(vp, ignore); -#ifdef EDEBUG - etraci("exp6 () ccode", ccode, vp); -#endif - if (*vp == 0 || **vp == 0 || ***vp != ')') - stderror(ERR_NAME | ERR_EXPRESSION); - (*vp)++; - return (putn(ccode)); - } - if (eq(**vp, STRLbrace)) { - Char **v; - struct command faket; - Char *fakecom[2]; - - faket.t_dtyp = NODE_COMMAND; - faket.t_dflg = 0; - faket.t_dcar = faket.t_dcdr = faket.t_dspr = NULL; - faket.t_dcom = fakecom; - fakecom[0] = STRfakecom; - fakecom[1] = NULL; - (*vp)++; - v = *vp; - for (;;) { - if (!**vp) - stderror(ERR_NAME | ERR_MISSING, '}'); - if (eq(*(*vp)++, STRRbrace)) - break; - } - if (ignore & IGNORE) - return (Strsave(STRNULL)); - psavejob(); - if (pfork(&faket, -1) == 0) { - *--(*vp) = 0; - evalav(v); - exitstat(); - } - pwait(); - prestjob(); -#ifdef EDEBUG - etraci("exp6 {} status", egetn(value(STRstatus)), vp); -#endif - return (putn(egetn(value(STRstatus)) == 0)); - } - if (isa(**vp, ANYOP)) - return (Strsave(STRNULL)); - cp = *(*vp)++; - if (*cp == '-' && any("erwxfdzopls", cp[1])) { - struct stat stb; - - if (cp[2] != '\0') - stderror(ERR_NAME | ERR_FILEINQ); - /* - * Detect missing file names by checking for operator in the file name - * position. However, if an operator name appears there, we must make - * sure that there's no file by that name (e.g., "/") before announcing - * an error. Even this check isn't quite right, since it doesn't take - * globbing into account. - */ - if (isa(**vp, ANYOP) && stat(short2str(**vp), &stb)) - stderror(ERR_NAME | ERR_FILENAME); - - dp = *(*vp)++; - if (ignore & IGNORE) - return (Strsave(STRNULL)); - ep = globone(dp, G_ERROR); - switch (cp[1]) { - - case 'r': - i = !access(short2str(ep), R_OK); - break; - - case 'w': - i = !access(short2str(ep), W_OK); - break; - - case 'x': - i = !access(short2str(ep), X_OK); - break; - - default: - if ( -#ifdef S_IFLNK - cp[1] == 'l' ? lstat(short2str(ep), &stb) : -#endif - stat(short2str(ep), &stb)) { - xfree((ptr_t) ep); - return (Strsave(STR0)); - } - switch (cp[1]) { - - case 'f': - i = S_ISREG(stb.st_mode); - break; - - case 'd': - i = S_ISDIR(stb.st_mode); - break; - - case 'p': -#ifdef S_ISFIFO - i = S_ISFIFO(stb.st_mode); -#else - i = 0; -#endif - break; - - case 'l': -#ifdef S_ISLNK - i = S_ISLNK(stb.st_mode); -#else - i = 0; -#endif - break; - - case 's': -#ifdef S_ISSOCK - i = S_ISSOCK(stb.st_mode); -#else - i = 0; -#endif - break; - - case 'z': - i = stb.st_size == 0; - break; - - case 'e': - i = 1; - break; - - case 'o': - i = stb.st_uid == uid; - break; - } - } -#ifdef EDEBUG - etraci("exp6 -? i", i, vp); -#endif - xfree((ptr_t) ep); - return (putn(i)); - } -#ifdef EDEBUG - etracc("exp6 default", cp, vp); -#endif - return (ignore & NOGLOB ? Strsave(cp) : globone(cp, G_ERROR)); -} - -static void -evalav(v) - Char **v; -{ - struct wordent paraml1; - struct wordent *hp = ¶ml1; - struct command *t; - struct wordent *wdp = hp; - - set(STRstatus, Strsave(STR0)); - hp->prev = hp->next = hp; - hp->word = STRNULL; - while (*v) { - struct wordent *new = - (struct wordent *) xcalloc(1, sizeof *wdp); - - new->prev = wdp; - new->next = hp; - wdp->next = new; - wdp = new; - wdp->word = Strsave(*v++); - } - hp->prev = wdp; - alias(¶ml1); - t = syntax(paraml1.next, ¶ml1, 0); - if (seterr) - stderror(ERR_OLD); - execute(t, -1, NULL, NULL); - freelex(¶ml1), freesyn(t); -} - -static int -isa(cp, what) - Char *cp; - int what; -{ - if (cp == 0) - return ((what & RESTOP) != 0); - if (cp[1] == 0) { - if (what & ADDOP && (*cp == '+' || *cp == '-')) - return (1); - if (what & MULOP && (*cp == '*' || *cp == '/' || *cp == '%')) - return (1); - if (what & RESTOP && (*cp == '(' || *cp == ')' || *cp == '!' || - *cp == '~' || *cp == '^' || *cp == '"')) - return (1); - } - else if (cp[2] == 0) { - if (what & RESTOP) { - if (cp[0] == '|' && cp[1] == '&') - return (1); - if (cp[0] == '<' && cp[1] == '<') - return (1); - if (cp[0] == '>' && cp[1] == '>') - return (1); - } - if (what & EQOP) { - if (cp[0] == '=') { - if (cp[1] == '=') - return (EQEQ); - if (cp[1] == '~') - return (EQMATCH); - } - else if (cp[0] == '!') { - if (cp[1] == '=') - return (NOTEQ); - if (cp[1] == '~') - return (NOTEQMATCH); - } - } - } - if (what & RELOP) { - if (*cp == '<') - return (LSS); - if (*cp == '>') - return (GTR); - } - return (0); -} - -static int -egetn(cp) - Char *cp; -{ - if (*cp && *cp != '-' && !Isdigit(*cp)) - stderror(ERR_NAME | ERR_EXPRESSION); - return (getn(cp)); -} - -/* Phew! */ - -#ifdef EDEBUG -static void -etraci(str, i, vp) - char *str; - int i; - Char ***vp; -{ - (void) fprintf(csherr, "%s=%d\t", str, i); - blkpr(csherr, *vp); - (void) fprintf(csherr, "\n"); -} -static void -etracc(str, cp, vp) - char *str; - Char *cp; - Char ***vp; -{ - (void) fprintf(csherr, "%s=%s\t", str, vis_str(cp)); - blkpr(csherr, *vp); - (void) fprintf(csherr, "\n"); -} -#endif diff --git a/bin/csh/extern.h b/bin/csh/extern.h deleted file mode 100644 index a1cbfcb..0000000 --- a/bin/csh/extern.h +++ /dev/null @@ -1,339 +0,0 @@ -/*- - * Copyright (c) 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)extern.h 8.1 (Berkeley) 5/31/93 - * $FreeBSD$ - */ - -#include <sys/cdefs.h> - -/* - * csh.c - */ -int gethdir __P((Char *)); -void dosource __P((Char **, struct command *)); -void exitstat __P((void)); -void goodbye __P((void)); -void importpath __P((Char *)); -void initdesc __P((void)); -void pintr __P((int)); -void pintr1 __P((bool)); -void printprompt __P((void)); -void process __P((bool)); -void rechist __P((void)); -void untty __P((void)); -int vis_fputc __P((int, FILE *)); - -#ifdef PROF -void done __P((int)); -#else -void xexit __P((int)); -#endif - -/* - * dir.c - */ -void dinit __P((Char *)); -void dodirs __P((Char **, struct command *)); -Char *dcanon __P((Char *, Char *)); -void dtildepr __P((Char *, Char *)); -void dtilde __P((void)); -void dochngd __P((Char **, struct command *)); -Char *dnormalize __P((Char *)); -void dopushd __P((Char **, struct command *)); -void dopopd __P((Char **, struct command *)); -struct directory; -void dfree __P((struct directory *)); - -/* - * dol.c - */ -void Dfix __P((struct command *)); -Char *Dfix1 __P((Char *)); -void heredoc __P((Char *)); - -/* - * err.c - */ -void seterror __P((int, ...)); -void stderror __P((int, ...)); - -/* - * exec.c - */ -void doexec __P((Char **, struct command *)); -void dohash __P((Char **, struct command *)); -void dounhash __P((Char **, struct command *)); -void dowhich __P((Char **, struct command *)); -void execash __P((Char **, struct command *)); -void hashstat __P((Char **, struct command *)); -void xechoit __P((Char **)); - -/* - * exp.c - */ -int expr __P((Char ***)); -int exp0 __P((Char ***, bool)); - -/* - * file.c - */ -#ifdef FILEC -int tenex __P((Char *, int)); -#endif - -/* - * func.c - */ -void Setenv __P((Char *, Char *)); -void doalias __P((Char **, struct command *)); -void dobreak __P((Char **, struct command *)); -void docontin __P((Char **, struct command *)); -void doecho __P((Char **, struct command *)); -void doelse __P((Char **, struct command *)); -void doend __P((Char **, struct command *)); -void doeval __P((Char **, struct command *)); -void doexit __P((Char **, struct command *)); -void doforeach __P((Char **, struct command *)); -void doglob __P((Char **, struct command *)); -void dogoto __P((Char **, struct command *)); -void doif __P((Char **, struct command *)); -void dolimit __P((Char **, struct command *)); -void dologin __P((Char **, struct command *)); -void dologout __P((Char **, struct command *)); -void donohup __P((Char **, struct command *)); -void doonintr __P((Char **, struct command *)); -void doprintf __P((Char **, struct command *)); -void dorepeat __P((Char **, struct command *)); -void dosetenv __P((Char **, struct command *)); -void dosuspend __P((Char **, struct command *)); -void doswbrk __P((Char **, struct command *)); -void doswitch __P((Char **, struct command *)); -void doumask __P((Char **, struct command *)); -void dounlimit __P((Char **, struct command *)); -void dounsetenv __P((Char **, struct command *)); -void dowhile __P((Char **, struct command *)); -void dozip __P((Char **, struct command *)); -void func __P((struct command *, struct biltins *)); -struct biltins * - isbfunc __P((struct command *)); -void prvars __P((void)); -void gotolab __P((Char *)); -int srchx __P((Char *)); -void unalias __P((Char **, struct command *)); -void wfree __P((void)); - -/* - * glob.c - */ -Char **dobackp __P((Char *, bool)); -void Gcat __P((Char *, Char *)); -Char *globone __P((Char *, int)); -int Gmatch __P((Char *, Char *)); -void ginit __P((void)); -Char **globall __P((Char **)); -void rscan __P((Char **, void (*)(int))); -void tglob __P((Char **)); -void trim __P((Char **)); -#ifdef FILEC -int sortscmp __P((const ptr_t, const ptr_t)); -#endif /* FILEC */ - -/* - * hist.c - */ -void dohist __P((Char **, struct command *)); -struct Hist * - enthist __P((int, struct wordent *, bool)); -void savehist __P((struct wordent *)); - -/* - * lex.c - */ -void addla __P((Char *)); -void bseek __P((struct Ain *)); -void btell __P((struct Ain *)); -void btoeof __P((void)); -void copylex __P((struct wordent *, struct wordent *)); -Char *domod __P((Char *, int)); -void freelex __P((struct wordent *)); -int lex __P((struct wordent *)); -void prlex __P((FILE *, struct wordent *)); -int readc __P((bool)); -void settell __P((void)); -void unreadc __P((int)); - -/* - * misc.c - */ -int any __P((char *, int)); -Char **blkcat __P((Char **, Char **)); -Char **blkcpy __P((Char **, Char **)); -Char **blkend __P((Char **)); -void blkfree __P((Char **)); -int blklen __P((Char **)); -void blkpr __P((FILE *, Char **)); -Char **blkspl __P((Char **, Char **)); -void closem __P((void)); -Char **copyblk __P((Char **)); -int dcopy __P((int, int)); -int dmove __P((int, int)); -void donefds __P((void)); -Char lastchr __P((Char *)); -void lshift __P((Char **, int)); -int number __P((Char *)); -int prefix __P((Char *, Char *)); -Char **saveblk __P((Char **)); -void setzero __P((char *, int)); -Char *strip __P((Char *)); -char *strsave __P((char *)); -char *strspl __P((char *, char *)); -void udvar __P((Char *)); - -#ifndef SHORT_STRINGS -# ifdef NOTUSED -char *strstr __P((const char *, const char *)); -# endif /* NOTUSED */ -char *strend __P((char *)); -#endif - -/* - * parse.c - */ -void alias __P((struct wordent *)); -void freesyn __P((struct command *)); -struct command * - syntax __P((struct wordent *, struct wordent *, int)); - - -/* - * proc.c - */ -void dobg __P((Char **, struct command *)); -void dobg1 __P((Char **, struct command *)); -void dofg __P((Char **, struct command *)); -void dofg1 __P((Char **, struct command *)); -void dojobs __P((Char **, struct command *)); -void dokill __P((Char **, struct command *)); -void donotify __P((Char **, struct command *)); -void dostop __P((Char **, struct command *)); -void dowait __P((Char **, struct command *)); -void palloc __P((int, struct command *)); -void panystop __P((bool)); -void pchild __P((int)); -void pendjob __P((void)); -struct process * - pfind __P((Char *)); -int pfork __P((struct command *, int)); -void pgetty __P((int, int)); -void pjwait __P((struct process *)); -void pnote __P((void)); -void prestjob __P((void)); -void psavejob __P((void)); -void pstart __P((struct process *, int)); -void pwait __P((void)); - -/* - * sem.c - */ -void execute __P((struct command *, int, int *, int *)); -void mypipe __P((int *)); - -/* - * set.c - */ -struct varent - *adrof1 __P((Char *, struct varent *)); -void doset __P((Char **, struct command *)); -void dolet __P((Char **, struct command *)); -Char *putn __P((int)); -int getn __P((Char *)); -Char *value1 __P((Char *, struct varent *)); -void set __P((Char *, Char *)); -void set1 __P((Char *, Char **, struct varent *)); -void setq __P((Char *, Char **, struct varent *)); -void unset __P((Char **, struct command *)); -void unset1 __P((Char *[], struct varent *)); -void unsetv __P((Char *)); -void setNS __P((Char *)); -void shift __P((Char **, struct command *)); -void plist __P((struct varent *)); - -/* - * time.c - */ -void donice __P((Char **, struct command *)); -void dotime __P((Char **, struct command *)); -void prusage __P((struct rusage *, struct rusage *, - struct timeval *, struct timeval *)); -void ruadd __P((struct rusage *, struct rusage *)); -void settimes __P((void)); -void tvadd __P((struct timeval *, struct timeval *)); -void tvsub __P((struct timeval *, struct timeval *, struct timeval *)); -void pcsecs __P((long)); -void psecs __P((long)); - -/* - * alloc.c - */ -void Free __P((ptr_t)); -ptr_t Malloc __P((size_t)); -ptr_t Realloc __P((ptr_t, size_t)); -ptr_t Calloc __P((size_t, size_t)); -void showall __P((Char **, struct command *)); - -/* - * str.c: - */ -#ifdef SHORT_STRINGS -Char *s_strchr __P((Char *, int)); -Char *s_strrchr __P((Char *, int)); -Char *s_strcat __P((Char *, Char *)); -#ifdef NOTUSED -Char *s_strncat __P((Char *, Char *, size_t)); -#endif -Char *s_strcpy __P((Char *, Char *)); -Char *s_strncpy __P((Char *, Char *, size_t)); -Char *s_strspl __P((Char *, Char *)); -size_t s_strlen __P((Char *)); -int s_strcmp __P((Char *, Char *)); -int s_strncmp __P((Char *, Char *, size_t)); -Char *s_strsave __P((Char *)); -Char *s_strend __P((Char *)); -Char *s_strstr __P((Char *, Char *)); -Char *str2short __P((char *)); -Char **blk2short __P((char **)); -char *short2str __P((Char *)); -char **short2blk __P((Char **)); -#endif -char *short2qstr __P((Char *)); -char *vis_str __P((Char *)); diff --git a/bin/csh/file.c b/bin/csh/file.c deleted file mode 100644 index a1f5ab2..0000000 --- a/bin/csh/file.c +++ /dev/null @@ -1,685 +0,0 @@ -/*- - * Copyright (c) 1980, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -#if 0 -static char sccsid[] = "@(#)file.c 8.2 (Berkeley) 3/19/94"; -#else -static const char rcsid[] = - "$FreeBSD$"; -#endif -#endif /* not lint */ - -#ifdef FILEC - -#include <sys/param.h> -#include <sys/stat.h> -#include <termios.h> -#include <dirent.h> -#include <pwd.h> -#include <stdlib.h> -#include <unistd.h> -#if __STDC__ -# include <stdarg.h> -#else -# include <varargs.h> -#endif - -#include "csh.h" -#include "extern.h" - -/* - * Tenex style file name recognition, .. and more. - * History: - * Author: Ken Greer, Sept. 1975, CMU. - * Finally got around to adding to the Cshell., Ken Greer, Dec. 1981. - */ - -#define ON 1 -#define OFF 0 -#ifndef TRUE -#define TRUE 1 -#endif -#ifndef FALSE -#define FALSE 0 -#endif - -#define ESC '\033' - -typedef enum { - LIST, RECOGNIZE -} COMMAND; - -static void setup_tty __P((int)); -static void back_to_col_1 __P((void)); -static void pushback __P((Char *)); -static void catn __P((Char *, Char *, int)); -static void copyn __P((Char *, Char *, int)); -static Char filetype __P((Char *, Char *)); -static void print_by_column __P((Char *, Char *[], int)); -static Char *tilde __P((Char *, Char *)); -static void retype __P((void)); -static void beep __P((void)); -static void print_recognized_stuff __P((Char *)); -static void extract_dir_and_name __P((Char *, Char *, Char *)); -static Char *getentry __P((DIR *, int)); -static void free_items __P((Char **)); -static int tsearch __P((Char *, COMMAND, int)); -static int recognize __P((Char *, Char *, int, int)); -static int is_prefix __P((Char *, Char *)); -static int is_suffix __P((Char *, Char *)); -static int ignored __P((Char *)); - -/* - * Put this here so the binary can be patched with adb to enable file - * completion by default. Filec controls completion, nobeep controls - * ringing the terminal bell on incomplete expansions. - */ -bool filec = 0; - -static void -setup_tty(on) - int on; -{ - struct termios tchars; - - (void) tcgetattr(SHIN, &tchars); - - if (on) { - tchars.c_cc[VEOL] = ESC; - if (tchars.c_lflag & ICANON) - on = TCSADRAIN; - else { - on = TCSAFLUSH; - tchars.c_lflag |= ICANON; - } - } - else { - tchars.c_cc[VEOL] = _POSIX_VDISABLE; - on = TCSADRAIN; - } - - (void) tcsetattr(SHIN, on, &tchars); -} - -/* - * Move back to beginning of current line - */ -static void -back_to_col_1() -{ - struct termios tty, tty_normal; - int omask; - - omask = sigblock(sigmask(SIGINT)); - (void) tcgetattr(SHOUT, &tty); - tty_normal = tty; - tty.c_iflag &= ~INLCR; - tty.c_oflag &= ~ONLCR; - (void) tcsetattr(SHOUT, TCSANOW, &tty); - (void) write(SHOUT, "\r", 1); - (void) tcsetattr(SHOUT, TCSANOW, &tty_normal); - (void) sigsetmask(omask); -} - -/* - * Push string contents back into tty queue - */ -static void -pushback(string) - Char *string; -{ - Char *p; - struct termios tty, tty_normal; - int omask; - char c; - - omask = sigblock(sigmask(SIGINT)); - (void) tcgetattr(SHOUT, &tty); - tty_normal = tty; - tty.c_lflag &= ~(ECHOKE | ECHO | ECHOE | ECHOK | ECHONL | ECHOPRT | ECHOCTL); - (void) tcsetattr(SHOUT, TCSANOW, &tty); - - for (p = string; (c = *p) != '\0'; p++) - (void) ioctl(SHOUT, TIOCSTI, (ioctl_t) & c); - (void) tcsetattr(SHOUT, TCSANOW, &tty_normal); - (void) sigsetmask(omask); -} - -/* - * Concatenate src onto tail of des. - * Des is a string whose maximum length is count. - * Always null terminate. - */ -static void -catn(des, src, count) - Char *des, *src; - int count; -{ - while (--count >= 0 && *des) - des++; - while (--count >= 0) - if ((*des++ = *src++) == 0) - return; - *des = '\0'; -} - -/* - * Like strncpy but always leave room for trailing \0 - * and always null terminate. - */ -static void -copyn(des, src, count) - Char *des, *src; - int count; -{ - while (--count >= 0) - if ((*des++ = *src++) == 0) - return; - *des = '\0'; -} - -static Char -filetype(dir, file) - Char *dir, *file; -{ - Char path[MAXPATHLEN]; - struct stat statb; - - catn(Strcpy(path, dir), file, sizeof(path) / sizeof(Char)); - if (lstat(short2str(path), &statb) == 0) { - switch (statb.st_mode & S_IFMT) { - case S_IFDIR: - return ('/'); - - case S_IFLNK: - if (stat(short2str(path), &statb) == 0 && /* follow it out */ - S_ISDIR(statb.st_mode)) - return ('>'); - else - return ('@'); - - case S_IFSOCK: - return ('='); - - default: - if (statb.st_mode & 0111) - return ('*'); - } - } - return (' '); -} - -static struct winsize win; - -/* - * Print sorted down columns - */ -static void -print_by_column(dir, items, count) - Char *dir, *items[]; - int count; -{ - int i, rows, r, c, maxwidth = 0, columns; - - if (ioctl(SHOUT, TIOCGWINSZ, (ioctl_t) & win) < 0 || win.ws_col == 0) - win.ws_col = 80; - for (i = 0; i < count; i++) - maxwidth = maxwidth > (r = Strlen(items[i])) ? maxwidth : r; - maxwidth += 2; /* for the file tag and space */ - columns = win.ws_col / maxwidth; - if (columns == 0) - columns = 1; - rows = (count + (columns - 1)) / columns; - for (r = 0; r < rows; r++) { - for (c = 0; c < columns; c++) { - i = c * rows + r; - if (i < count) { - int w; - - (void) fprintf(cshout, "%s", vis_str(items[i])); - (void) fputc(dir ? filetype(dir, items[i]) : ' ', cshout); - if (c < columns - 1) { /* last column? */ - w = Strlen(items[i]) + 1; - for (; w < maxwidth; w++) - (void) fputc(' ', cshout); - } - } - } - (void) fputc('\r', cshout); - (void) fputc('\n', cshout); - } -} - -/* - * Expand file name with possible tilde usage - * ~person/mumble - * expands to - * home_directory_of_person/mumble - */ -static Char * -tilde(new, old) - Char *new, *old; -{ - Char *o, *p; - struct passwd *pw; - static Char person[40]; - - if (old[0] != '~') - return (Strcpy(new, old)); - - for (p = person, o = &old[1]; *o && *o != '/'; *p++ = *o++) - continue; - *p = '\0'; - if (person[0] == '\0') - (void) Strcpy(new, value(STRhome)); - else { - pw = getpwnam(short2str(person)); - if (pw == NULL) - return (NULL); - (void) Strcpy(new, str2short(pw->pw_dir)); - } - (void) Strcat(new, o); - return (new); -} - -/* - * Cause pending line to be printed - */ -static void -retype() -{ - struct termios tty; - - (void) tcgetattr(SHOUT, &tty); - tty.c_lflag |= PENDIN; - (void) tcsetattr(SHOUT, TCSANOW, &tty); -} - -static void -beep() -{ - if (adrof(STRnobeep) == 0) - (void) write(SHOUT, "\007", 1); -} - -/* - * Erase that silly ^[ and - * print the recognized part of the string - */ -static void -print_recognized_stuff(recognized_part) - Char *recognized_part; -{ - /* An optimized erasing of that silly ^[ */ - (void) fputc('\b', cshout); - (void) fputc('\b', cshout); - switch (Strlen(recognized_part)) { - - case 0: /* erase two Characters: ^[ */ - (void) fputc(' ', cshout); - (void) fputc(' ', cshout); - (void) fputc('\b', cshout); - (void) fputc('\b', cshout); - break; - - case 1: /* overstrike the ^, erase the [ */ - (void) fprintf(cshout, "%s", vis_str(recognized_part)); - (void) fputc(' ', cshout); - (void) fputc('\b', cshout); - break; - - default: /* overstrike both Characters ^[ */ - (void) fprintf(cshout, "%s", vis_str(recognized_part)); - break; - } - (void) fflush(cshout); -} - -/* - * Parse full path in file into 2 parts: directory and file names - * Should leave final slash (/) at end of dir. - */ -static void -extract_dir_and_name(path, dir, name) - Char *path, *dir, *name; -{ - Char *p; - - p = Strrchr(path, '/'); - if (p == NULL) { - copyn(name, path, MAXNAMLEN); - dir[0] = '\0'; - } - else { - copyn(name, ++p, MAXNAMLEN); - copyn(dir, path, p - path); - } -} - -static Char * -getentry(dir_fd, looking_for_lognames) - DIR *dir_fd; - int looking_for_lognames; -{ - struct passwd *pw; - struct dirent *dirp; - - if (looking_for_lognames) { - if ((pw = getpwent()) == NULL) - return (NULL); - return (str2short(pw->pw_name)); - } - if ((dirp = readdir(dir_fd)) != NULL) - return (str2short(dirp->d_name)); - return (NULL); -} - -static void -free_items(items) - Char **items; -{ - int i; - - for (i = 0; items[i]; i++) - xfree((ptr_t) items[i]); - xfree((ptr_t) items); -} - -#define FREE_ITEMS(items) { \ - int omask;\ -\ - omask = sigblock(sigmask(SIGINT));\ - free_items(items);\ - items = NULL;\ - (void) sigsetmask(omask);\ -} - -/* - * Perform a RECOGNIZE or LIST command on string "word". - */ -static int -tsearch(word, command, max_word_length) - Char *word; - COMMAND command; - int max_word_length; -{ - static Char **items = NULL; - DIR *dir_fd; - int numitems = 0, ignoring = TRUE, nignored = 0; - int name_length, looking_for_lognames; - Char tilded_dir[MAXPATHLEN + 1], dir[MAXPATHLEN + 1]; - Char name[MAXNAMLEN + 1], extended_name[MAXNAMLEN + 1]; - Char *entry; - -#define MAXITEMS 1024 - - if (items != NULL) - FREE_ITEMS(items); - - looking_for_lognames = (*word == '~') && (Strchr(word, '/') == NULL); - if (looking_for_lognames) { - setpwent(); - copyn(name, &word[1], MAXNAMLEN); /* name sans ~ */ - dir_fd = NULL; - } - else { - extract_dir_and_name(word, dir, name); - if (tilde(tilded_dir, dir) == 0) - return (0); - dir_fd = opendir(*tilded_dir ? short2str(tilded_dir) : "."); - if (dir_fd == NULL) - return (0); - } - -again: /* search for matches */ - name_length = Strlen(name); - for (numitems = 0; (entry = getentry(dir_fd, looking_for_lognames)) != NULL;) { - if (!is_prefix(name, entry)) - continue; - /* Don't match . files on null prefix match */ - if (name_length == 0 && entry[0] == '.' && - !looking_for_lognames) - continue; - if (command == LIST) { - if (numitems >= MAXITEMS) { - (void) fprintf(csherr, "\nYikes!! Too many %s!!\n", - looking_for_lognames ? - "names in password file" : "files"); - break; - } - if (items == NULL) - items = (Char **) xcalloc(sizeof(items[0]), MAXITEMS); - items[numitems] = (Char *) xmalloc((size_t) (Strlen(entry) + 1) * - sizeof(Char)); - copyn(items[numitems], entry, MAXNAMLEN); - numitems++; - } - else { /* RECOGNIZE command */ - if (ignoring && ignored(entry)) - nignored++; - else if (recognize(extended_name, - entry, name_length, ++numitems)) - break; - } - } - if (ignoring && numitems == 0 && nignored > 0) { - ignoring = FALSE; - nignored = 0; - if (looking_for_lognames) - setpwent(); - else - rewinddir(dir_fd); - goto again; - } - - if (looking_for_lognames) - (void) endpwent(); - else - (void) closedir(dir_fd); - if (numitems == 0) - return (0); - if (command == RECOGNIZE) { - if (looking_for_lognames) - copyn(word, STRtilde, 1); - else - /* put back dir part */ - copyn(word, dir, max_word_length); - /* add extended name */ - catn(word, extended_name, max_word_length); - return (numitems); - } - else { /* LIST */ - qsort((ptr_t) items, numitems, sizeof(items[0]), - (int (*) __P((const void *, const void *))) sortscmp); - print_by_column(looking_for_lognames ? NULL : tilded_dir, - items, numitems); - if (items != NULL) - FREE_ITEMS(items); - } - return (0); -} - -/* - * Object: extend what user typed up to an ambiguity. - * Algorithm: - * On first match, copy full entry (assume it'll be the only match) - * On subsequent matches, shorten extended_name to the first - * Character mismatch between extended_name and entry. - * If we shorten it back to the prefix length, stop searching. - */ -static int -recognize(extended_name, entry, name_length, numitems) - Char *extended_name, *entry; - int name_length, numitems; -{ - if (numitems == 1) /* 1st match */ - copyn(extended_name, entry, MAXNAMLEN); - else { /* 2nd & subsequent matches */ - Char *x, *ent; - int len = 0; - - x = extended_name; - for (ent = entry; *x && *x == *ent++; x++, len++) - continue; - *x = '\0'; /* Shorten at 1st Char diff */ - if (len == name_length) /* Ambiguous to prefix? */ - return (-1); /* So stop now and save time */ - } - return (0); -} - -/* - * Return true if check matches initial Chars in template. - * This differs from PWB imatch in that if check is null - * it matches anything. - */ -static int -is_prefix(check, template) - Char *check, *template; -{ - do - if (*check == 0) - return (TRUE); - while (*check++ == *template++); - return (FALSE); -} - -/* - * Return true if the Chars in template appear at the - * end of check, I.e., are it's suffix. - */ -static int -is_suffix(check, template) - Char *check, *template; -{ - Char *c, *t; - - for (c = check; *c++;) - continue; - for (t = template; *t++;) - continue; - for (;;) { - if (t == template) - return 1; - if (c == check || *--t != *--c) - return 0; - } -} - -int -tenex(inputline, inputline_size) - Char *inputline; - int inputline_size; -{ - int numitems, num_read; - char tinputline[BUFSIZ]; - - - setup_tty(ON); - - while ((num_read = read(SHIN, tinputline, BUFSIZ)) > 0) { - int i; - static Char delims[] = {' ', '\'', '"', '\t', ';', '&', '<', - '>', '(', ')', '|', '^', '%', '\0'}; - Char *str_end, *word_start, last_Char, should_retype; - int space_left; - COMMAND command; - - for (i = 0; i < num_read; i++) - inputline[i] = (unsigned char) tinputline[i]; - last_Char = inputline[num_read - 1] & ASCII; - - if (last_Char == '\n' || num_read == inputline_size) - break; - command = (last_Char == ESC) ? RECOGNIZE : LIST; - if (command == LIST) - (void) fputc('\n', cshout); - str_end = &inputline[num_read]; - if (last_Char == ESC) - --str_end; /* wipeout trailing cmd Char */ - *str_end = '\0'; - /* - * Find LAST occurence of a delimiter in the inputline. The word start - * is one Character past it. - */ - for (word_start = str_end; word_start > inputline; --word_start) - if (Strchr(delims, word_start[-1])) - break; - space_left = inputline_size - (word_start - inputline) - 1; - numitems = tsearch(word_start, command, space_left); - - if (command == RECOGNIZE) { - /* print from str_end on */ - print_recognized_stuff(str_end); - if (numitems != 1) /* Beep = No match/ambiguous */ - beep(); - } - - /* - * Tabs in the input line cause trouble after a pushback. tty driver - * won't backspace over them because column positions are now - * incorrect. This is solved by retyping over current line. - */ - should_retype = FALSE; - if (Strchr(inputline, '\t')) { /* tab Char in input line? */ - back_to_col_1(); - should_retype = TRUE; - } - if (command == LIST) /* Always retype after a LIST */ - should_retype = TRUE; - if (should_retype) - printprompt(); - pushback(inputline); - if (should_retype) - retype(); - } - setup_tty(OFF); - return (num_read); -} - -static int -ignored(entry) - Char *entry; -{ - struct varent *vp; - Char **cp; - - if ((vp = adrof(STRfignore)) == NULL || (cp = vp->vec) == NULL) - return (FALSE); - for (; *cp != NULL; cp++) - if (is_suffix(entry, *cp)) - return (TRUE); - return (FALSE); -} -#endif /* FILEC */ diff --git a/bin/csh/func.c b/bin/csh/func.c deleted file mode 100644 index 2a1b802..0000000 --- a/bin/csh/func.c +++ /dev/null @@ -1,1520 +0,0 @@ -/*- - * Copyright (c) 1980, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -#if 0 -static char sccsid[] = "@(#)func.c 8.1 (Berkeley) 5/31/93"; -#else -static const char rcsid[] = - "$FreeBSD$"; -#endif -#endif /* not lint */ - -#include <sys/types.h> -#include <sys/stat.h> -#include <signal.h> -#include <locale.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#if __STDC__ -# include <stdarg.h> -#else -# include <varargs.h> -#endif - -#include "csh.h" -#include "extern.h" -#include "pathnames.h" - -extern char **environ; - -static int zlast = -1; -static void islogin __P((void)); -static void reexecute __P((struct command *)); -static void preread __P((void)); -static void doagain __P((void)); -static void search __P((int, int, Char *)); -static int getword __P((Char *)); -static int keyword __P((Char *)); -static void toend __P((void)); -static void xecho __P((int, Char **)); -static void Unsetenv __P((Char *)); - -struct biltins * -isbfunc(t) - struct command *t; -{ - Char *cp = t->t_dcom[0]; - struct biltins *bp, *bp1, *bp2; - static struct biltins label = {"", dozip, 0, 0}; - static struct biltins foregnd = {"%job", dofg1, 0, 0}; - static struct biltins backgnd = {"%job &", dobg1, 0, 0}; - - if (lastchr(cp) == ':') { - label.bname = short2str(cp); - return (&label); - } - if (*cp == '%') { - if (t->t_dflg & F_AMPERSAND) { - t->t_dflg &= ~F_AMPERSAND; - backgnd.bname = short2str(cp); - return (&backgnd); - } - foregnd.bname = short2str(cp); - return (&foregnd); - } - /* - * Binary search Bp1 is the beginning of the current search range. Bp2 is - * one past the end. - */ - for (bp1 = bfunc, bp2 = bfunc + nbfunc; bp1 < bp2;) { - int i; - - bp = bp1 + ((bp2 - bp1) >> 1); - if ((i = *cp - *bp->bname) == 0 && - (i = Strcmp(cp, str2short(bp->bname))) == 0) - return bp; - if (i < 0) - bp2 = bp; - else - bp1 = bp + 1; - } - return (0); -} - -void -func(t, bp) - struct command *t; - struct biltins *bp; -{ - int i; - - xechoit(t->t_dcom); - setname(bp->bname); - i = blklen(t->t_dcom) - 1; - if (i < bp->minargs) - stderror(ERR_NAME | ERR_TOOFEW); - if (i > bp->maxargs) - stderror(ERR_NAME | ERR_TOOMANY); - (*bp->bfunct) (t->t_dcom, t); -} - -void -/*ARGSUSED*/ -doonintr(v, t) - Char **v; - struct command *t; -{ - Char *cp; - Char *vv = v[1]; - - if (parintr == SIG_IGN) - return; - if (setintr && intty) - stderror(ERR_NAME | ERR_TERMINAL); - cp = gointr; - gointr = 0; - xfree((ptr_t) cp); - if (vv == 0) { - if (setintr) - (void) sigblock(sigmask(SIGINT)); - else - (void) signal(SIGINT, SIG_DFL); - gointr = 0; - } - else if (eq((vv = strip(vv)), STRminus)) { - (void) signal(SIGINT, SIG_IGN); - gointr = Strsave(STRminus); - } - else { - gointr = Strsave(vv); - (void) signal(SIGINT, pintr); - } -} - -void -/*ARGSUSED*/ -donohup(v, t) - Char **v; - struct command *t; -{ - if (intty) - stderror(ERR_NAME | ERR_TERMINAL); - if (setintr == 0) { - (void) signal(SIGHUP, SIG_IGN); - } -} - -void -/*ARGSUSED*/ -dozip(v, t) - Char **v; - struct command *t; -{ - ; -} - -void -prvars() -{ - plist(&shvhed); -} - -void -/*ARGSUSED*/ -doalias(v, t) - Char **v; - struct command *t; -{ - struct varent *vp; - Char *p; - - v++; - p = *v++; - if (p == 0) - plist(&aliases); - else if (*v == 0) { - vp = adrof1(strip(p), &aliases); - if (vp) { - blkpr(cshout, vp->vec); - fputc('\n', cshout); - } - } - else { - if (eq(p, STRalias) || eq(p, STRunalias)) { - setname(vis_str(p)); - stderror(ERR_NAME | ERR_DANGER); - } - set1(strip(p), saveblk(v), &aliases); - } -} - -void -/*ARGSUSED*/ -unalias(v, t) - Char **v; - struct command *t; -{ - unset1(v, &aliases); -} - -void -/*ARGSUSED*/ -dologout(v, t) - Char **v; - struct command *t; -{ - islogin(); - goodbye(); -} - -void -/*ARGSUSED*/ -dologin(v, t) - Char **v; - struct command *t; -{ - islogin(); - rechist(); - (void) signal(SIGTERM, parterm); - (void) execl(_PATH_LOGIN, "login", short2str(v[1]), NULL); - untty(); - xexit(1); -} - -static void -islogin() -{ - if (chkstop == 0 && setintr) - panystop(0); - if (loginsh) - return; - stderror(ERR_NOTLOGIN); -} - -void -doif(v, kp) - Char **v; - struct command *kp; -{ - int i; - Char **vv; - - v++; - i = expr(&v); - vv = v; - if (*vv == NULL) - stderror(ERR_NAME | ERR_EMPTYIF); - if (eq(*vv, STRthen)) { - if (*++vv) - stderror(ERR_NAME | ERR_IMPRTHEN); - setname(vis_str(STRthen)); - /* - * If expression was zero, then scan to else, otherwise just fall into - * following code. - */ - if (!i) - search(T_IF, 0, NULL); - return; - } - /* - * Simple command attached to this if. Left shift the node in this tree, - * munging it so we can reexecute it. - */ - if (i) { - lshift(kp->t_dcom, vv - kp->t_dcom); - reexecute(kp); - donefds(); - } -} - -/* - * Reexecute a command, being careful not - * to redo i/o redirection, which is already set up. - */ -static void -reexecute(kp) - struct command *kp; -{ - kp->t_dflg &= F_SAVE; - kp->t_dflg |= F_REPEAT; - /* - * If tty is still ours to arbitrate, arbitrate it; otherwise dont even set - * pgrp's as the jobs would then have no way to get the tty (we can't give - * it to them, and our parent wouldn't know their pgrp, etc. - */ - execute(kp, (tpgrp > 0 ? tpgrp : -1), NULL, NULL); -} - -void -/*ARGSUSED*/ -doelse(v, t) - Char **v; - struct command *t; -{ - search(T_ELSE, 0, NULL); -} - -void -/*ARGSUSED*/ -dogoto(v, t) - Char **v; - struct command *t; -{ - Char *lp; - - gotolab(lp = globone(v[1], G_ERROR)); - xfree((ptr_t) lp); -} - -void -gotolab(lab) - Char *lab; -{ - struct whyle *wp; - /* - * While we still can, locate any unknown ends of existing loops. This - * obscure code is the WORST result of the fact that we don't really parse. - */ - zlast = T_GOTO; - for (wp = whyles; wp; wp = wp->w_next) - if (wp->w_end.type == F_SEEK && wp->w_end.f_seek == 0) { - search(T_BREAK, 0, NULL); - btell(&wp->w_end); - } - else - bseek(&wp->w_end); - search(T_GOTO, 0, lab); - /* - * Eliminate loops which were exited. - */ - wfree(); -} - -void -/*ARGSUSED*/ -doswitch(v, t) - Char **v; - struct command *t; -{ - Char *cp, *lp; - - v++; - if (!*v || *(*v++) != '(') - stderror(ERR_SYNTAX); - cp = **v == ')' ? STRNULL : *v++; - if (*(*v++) != ')') - v--; - if (*v) - stderror(ERR_SYNTAX); - search(T_SWITCH, 0, lp = globone(cp, G_ERROR)); - xfree((ptr_t) lp); -} - -void -/*ARGSUSED*/ -dobreak(v, t) - Char **v; - struct command *t; -{ - if (whyles) - toend(); - else - stderror(ERR_NAME | ERR_NOTWHILE); -} - -void -/*ARGSUSED*/ -doexit(v, t) - Char **v; - struct command *t; -{ - if (chkstop == 0 && (intty || intact) && evalvec == 0) - panystop(0); - /* - * Don't DEMAND parentheses here either. - */ - v++; - if (*v) { - set(STRstatus, putn(expr(&v))); - if (*v) - stderror(ERR_NAME | ERR_EXPRESSION); - } - btoeof(); - if (intty) - (void) close(SHIN); -} - -void -/*ARGSUSED*/ -doforeach(v, t) - Char **v; - struct command *t; -{ - Char *cp, *sp; - struct whyle *nwp; - - v++; - sp = cp = strip(*v); - if (!letter(*sp)) - stderror(ERR_NAME | ERR_VARBEGIN); - while (*cp && alnum(*cp)) - cp++; - if (*cp) - stderror(ERR_NAME | ERR_VARALNUM); - if ((cp - sp) > MAXVARLEN) - stderror(ERR_NAME | ERR_VARTOOLONG); - cp = *v++; - if (v[0][0] != '(' || v[blklen(v) - 1][0] != ')') - stderror(ERR_NAME | ERR_NOPAREN); - v++; - gflag = 0, tglob(v); - v = globall(v); - if (v == 0) - stderror(ERR_NAME | ERR_NOMATCH); - nwp = (struct whyle *) xcalloc(1, sizeof *nwp); - nwp->w_fe = nwp->w_fe0 = v; - gargv = 0; - btell(&nwp->w_start); - nwp->w_fename = Strsave(cp); - nwp->w_next = whyles; - nwp->w_end.type = F_SEEK; - whyles = nwp; - /* - * Pre-read the loop so as to be more comprehensible to a terminal user. - */ - zlast = T_FOREACH; - if (intty) - preread(); - doagain(); -} - -void -/*ARGSUSED*/ -dowhile(v, t) - Char **v; - struct command *t; -{ - int status; - bool again = whyles != 0 && SEEKEQ(&whyles->w_start, &lineloc) && - whyles->w_fename == 0; - - v++; - /* - * Implement prereading here also, taking care not to evaluate the - * expression before the loop has been read up from a terminal. - */ - if (intty && !again) - status = !exp0(&v, 1); - else - status = !expr(&v); - if (*v) - stderror(ERR_NAME | ERR_EXPRESSION); - if (!again) { - struct whyle *nwp = - (struct whyle *) xcalloc(1, sizeof(*nwp)); - - nwp->w_start = lineloc; - nwp->w_end.type = F_SEEK; - nwp->w_end.f_seek = 0; - nwp->w_next = whyles; - whyles = nwp; - zlast = T_WHILE; - if (intty) { - /* - * The tty preread - */ - preread(); - doagain(); - return; - } - } - if (status) - /* We ain't gonna loop no more, no more! */ - toend(); -} - -static void -preread() -{ - whyles->w_end.type = I_SEEK; - if (setintr) - (void) sigsetmask(sigblock(0) & ~sigmask(SIGINT)); - - search(T_BREAK, 0, NULL); /* read the expression in */ - if (setintr) - (void) sigblock(sigmask(SIGINT)); - btell(&whyles->w_end); -} - -void -/*ARGSUSED*/ -doend(v, t) - Char **v; - struct command *t; -{ - if (!whyles) - stderror(ERR_NAME | ERR_NOTWHILE); - btell(&whyles->w_end); - doagain(); -} - -void -/*ARGSUSED*/ -docontin(v, t) - Char **v; - struct command *t; -{ - if (!whyles) - stderror(ERR_NAME | ERR_NOTWHILE); - doagain(); -} - -static void -doagain() -{ - /* Repeating a while is simple */ - if (whyles->w_fename == 0) { - bseek(&whyles->w_start); - return; - } - /* - * The foreach variable list actually has a spurious word ")" at the end of - * the w_fe list. Thus we are at the of the list if one word beyond this - * is 0. - */ - if (!whyles->w_fe[1]) { - dobreak(NULL, NULL); - return; - } - set(whyles->w_fename, Strsave(*whyles->w_fe++)); - bseek(&whyles->w_start); -} - -void -dorepeat(v, kp) - Char **v; - struct command *kp; -{ - int i; - int omask = 0; - - i = getn(v[1]); - if (setintr) - omask = sigblock(sigmask(SIGINT)) & ~sigmask(SIGINT); - lshift(v, 2); - while (i > 0) { - if (setintr) - (void) sigsetmask(omask); - reexecute(kp); - --i; - } - donefds(); - if (setintr) - (void) sigsetmask(omask); -} - -void -/*ARGSUSED*/ -doswbrk(v, t) - Char **v; - struct command *t; -{ - search(T_BRKSW, 0, NULL); -} - -int -srchx(cp) - Char *cp; -{ - struct srch *sp, *sp1, *sp2; - int i; - - /* - * Binary search Sp1 is the beginning of the current search range. Sp2 is - * one past the end. - */ - for (sp1 = srchn, sp2 = srchn + nsrchn; sp1 < sp2;) { - sp = sp1 + ((sp2 - sp1) >> 1); - if ((i = *cp - *sp->s_name) == 0 && - (i = Strcmp(cp, str2short(sp->s_name))) == 0) - return sp->s_value; - if (i < 0) - sp2 = sp; - else - sp1 = sp + 1; - } - return (-1); -} - -static Char Stype; -static Char *Sgoal; - -/*VARARGS2*/ -static void -search(type, level, goal) - int type; - int level; - Char *goal; -{ - Char wordbuf[BUFSIZ]; - Char *aword = wordbuf; - Char *cp; - - Stype = type; - Sgoal = goal; - if (type == T_GOTO) { - struct Ain a; - a.type = F_SEEK; - a.f_seek = 0; - bseek(&a); - } - do { - if (intty && fseekp == feobp && aret == F_SEEK) - (void) fprintf(cshout, "? "), (void) fflush(cshout); - aword[0] = 0; - (void) getword(aword); - switch (srchx(aword)) { - - case T_ELSE: - if (level == 0 && type == T_IF) - return; - break; - - case T_IF: - while (getword(aword)) - continue; - if ((type == T_IF || type == T_ELSE) && - eq(aword, STRthen)) - level++; - break; - - case T_ENDIF: - if (type == T_IF || type == T_ELSE) - level--; - break; - - case T_FOREACH: - case T_WHILE: - if (type == T_BREAK) - level++; - break; - - case T_END: - if (type == T_BREAK) - level--; - break; - - case T_SWITCH: - if (type == T_SWITCH || type == T_BRKSW) - level++; - break; - - case T_ENDSW: - if (type == T_SWITCH || type == T_BRKSW) - level--; - break; - - case T_LABEL: - if (type == T_GOTO && getword(aword) && eq(aword, goal)) - level = -1; - break; - - default: - if (type != T_GOTO && (type != T_SWITCH || level != 0)) - break; - if (lastchr(aword) != ':') - break; - aword[Strlen(aword) - 1] = 0; - if ((type == T_GOTO && eq(aword, goal)) || - (type == T_SWITCH && eq(aword, STRdefault))) - level = -1; - break; - - case T_CASE: - if (type != T_SWITCH || level != 0) - break; - (void) getword(aword); - if (lastchr(aword) == ':') - aword[Strlen(aword) - 1] = 0; - cp = strip(Dfix1(aword)); - if (Gmatch(goal, cp)) - level = -1; - xfree((ptr_t) cp); - break; - - case T_DEFAULT: - if (type == T_SWITCH && level == 0) - level = -1; - break; - } - (void) getword(NULL); - } while (level >= 0); -} - -static int -getword(wp) - Char *wp; -{ - int found = 0; - int c, d; - int kwd = 0; - Char *owp = wp; - - c = readc(1); - d = 0; - do { - while (c == ' ' || c == '\t') - c = readc(1); - if (c == '#') - do - c = readc(1); - while (c >= 0 && c != '\n'); - if (c < 0) - goto past; - if (c == '\n') { - if (wp) - break; - return (0); - } - unreadc(c); - found = 1; - do { - c = readc(1); - if (c == '\\' && (c = readc(1)) == '\n') - c = ' '; - if (c == '\'' || c == '"') { - if (d == 0) - d = c; - else if (d == c) - d = 0; - } - if (c < 0) - goto past; - if (wp) { - *wp++ = c; - *wp = 0; /* end the string b4 test */ - } - } while ((d || (!(kwd = keyword(owp)) && c != ' ' - && c != '\t')) && c != '\n'); - } while (wp == 0); - - /* - * if we have read a keyword ( "if", "switch" or "while" ) then we do not - * need to unreadc the look-ahead char - */ - if (!kwd) { - unreadc(c); - if (found) - *--wp = 0; - } - - return (found); - -past: - switch (Stype) { - - case T_IF: - stderror(ERR_NAME | ERR_NOTFOUND, "then/endif"); - - case T_ELSE: - stderror(ERR_NAME | ERR_NOTFOUND, "endif"); - - case T_BRKSW: - case T_SWITCH: - stderror(ERR_NAME | ERR_NOTFOUND, "endsw"); - - case T_BREAK: - stderror(ERR_NAME | ERR_NOTFOUND, "end"); - - case T_GOTO: - setname(vis_str(Sgoal)); - stderror(ERR_NAME | ERR_NOTFOUND, "label"); - } - /* NOTREACHED */ - return (0); -} - -/* - * keyword(wp) determines if wp is one of the built-n functions if, - * switch or while. It seems that when an if statement looks like - * "if(" then getword above sucks in the '(' and so the search routine - * never finds what it is scanning for. Rather than rewrite doword, I hack - * in a test to see if the string forms a keyword. Then doword stops - * and returns the word "if" -strike - */ - -static int -keyword(wp) - Char *wp; -{ - static Char STRif[] = {'i', 'f', '\0'}; - static Char STRwhile[] = {'w', 'h', 'i', 'l', 'e', '\0'}; - static Char STRswitch[] = {'s', 'w', 'i', 't', 'c', 'h', '\0'}; - - if (!wp) - return (0); - - if ((Strcmp(wp, STRif) == 0) || (Strcmp(wp, STRwhile) == 0) - || (Strcmp(wp, STRswitch) == 0)) - return (1); - - return (0); -} - -static void -toend() -{ - if (whyles->w_end.type == F_SEEK && whyles->w_end.f_seek == 0) { - search(T_BREAK, 0, NULL); - btell(&whyles->w_end); - whyles->w_end.f_seek--; - } - else - bseek(&whyles->w_end); - wfree(); -} - -void -wfree() -{ - struct Ain o; - struct whyle *nwp; - - btell(&o); - - for (; whyles; whyles = nwp) { - struct whyle *wp = whyles; - nwp = wp->w_next; - - /* - * We free loops that have different seek types. - */ - if (wp->w_end.type != I_SEEK && wp->w_start.type == wp->w_end.type && - wp->w_start.type == o.type) { - if (wp->w_end.type == F_SEEK) { - if (o.f_seek >= wp->w_start.f_seek && - (wp->w_end.f_seek == 0 || o.f_seek < wp->w_end.f_seek)) - break; - } - else { - if (o.a_seek >= wp->w_start.a_seek && - (wp->w_end.a_seek == 0 || o.a_seek < wp->w_end.a_seek)) - break; - } - } - - if (wp->w_fe0) - blkfree(wp->w_fe0); - if (wp->w_fename) - xfree((ptr_t) wp->w_fename); - xfree((ptr_t) wp); - } -} - -void -/*ARGSUSED*/ -doecho(v, t) - Char **v; - struct command *t; -{ - xecho(' ', v); -} - -void -/*ARGSUSED*/ -doglob(v, t) - Char **v; - struct command *t; -{ - xecho(0, v); - (void) fflush(cshout); -} - -static void -xecho(sep, v) - int sep; - Char **v; -{ - Char *cp; - int nonl = 0; - - if (setintr) - (void) sigsetmask(sigblock(0) & ~sigmask(SIGINT)); - v++; - if (*v == 0) - return; - gflag = 0, tglob(v); - if (gflag) { - v = globall(v); - if (v == 0) - stderror(ERR_NAME | ERR_NOMATCH); - } - else { - v = gargv = saveblk(v); - trim(v); - } - if (sep == ' ' && *v && eq(*v, STRmn)) - nonl++, v++; - while ((cp = *v++) != NULL) { - int c; - - while ((c = *cp++) != '\0') - (void) vis_fputc(c | QUOTE, cshout); - - if (*v) - (void) vis_fputc(sep | QUOTE, cshout); - } - if (sep && nonl == 0) - (void) fputc('\n', cshout); - else - (void) fflush(cshout); - if (setintr) - (void) sigblock(sigmask(SIGINT)); - if (gargv) - blkfree(gargv), gargv = 0; -} - -void -/*ARGSUSED*/ -dosetenv(v, t) - Char **v; - struct command *t; -{ - Char *vp, *lp; - - v++; - if ((vp = *v++) == 0) { - Char **ep; - - if (setintr) - (void) sigsetmask(sigblock(0) & ~sigmask(SIGINT)); - for (ep = STR_environ; *ep; ep++) - (void) fprintf(cshout, "%s\n", vis_str(*ep)); - return; - } - if ((lp = *v++) == 0) - lp = STRNULL; - Setenv(vp, lp = globone(lp, G_APPEND)); - if (eq(vp, STRPATH)) { - importpath(lp); - dohash(NULL, NULL); - } - else if (eq(vp, STRLANG) || eq(vp, STRLC_CTYPE) || - eq(vp, STRLC_ALL) || eq(vp, STRLC_COLLATE)) { -#ifdef NLS - int k; - - (void) setlocale(LC_ALL, ""); - for (k = 0200; k <= 0377 && !Isprint(k); k++) - continue; - AsciiOnly = k > 0377; -#else - AsciiOnly = 0; -#endif /* NLS */ - } - xfree((ptr_t) lp); -} - -void -/*ARGSUSED*/ -dounsetenv(v, t) - Char **v; - struct command *t; -{ - Char **ep, *p, *n; - int i, maxi; - static Char *name = NULL; - - if (name) - xfree((ptr_t) name); - /* - * Find the longest environment variable - */ - for (maxi = 0, ep = STR_environ; *ep; ep++) { - for (i = 0, p = *ep; *p && *p != '='; p++, i++) - continue; - if (i > maxi) - maxi = i; - } - - name = (Char *) xmalloc((size_t) (maxi + 1) * sizeof(Char)); - - while (++v && *v) - for (maxi = 1; maxi;) - for (maxi = 0, ep = STR_environ; *ep; ep++) { - for (n = name, p = *ep; *p && *p != '='; *n++ = *p++) - continue; - *n = '\0'; - if (!Gmatch(name, *v)) - continue; - maxi = 1; - /* - * Delete name, and start again cause the environment changes - */ - Unsetenv(name); - if (eq(name, STRLANG) || eq(name, STRLC_CTYPE) || - eq(name, STRLC_ALL) || eq(name, STRLC_COLLATE)) { -#ifdef NLS - int k; - - (void) setlocale(LC_ALL, ""); - for (k = 0200; k <= 0377 && !Isprint(k); k++) - continue; - AsciiOnly = k > 0377; -#else - AsciiOnly = getenv("LANG") == NULL && - getenv("LC_ALL") == NULL && - getenv("LC_CTYPE") == NULL; -#endif /* NLS */ - } - break; - } - xfree((ptr_t) name); - name = NULL; -} - -void -Setenv(name, val) - Char *name, *val; -{ - Char **ep = STR_environ; - Char *cp, *dp; - Char *blk[2]; - Char **oep = ep; - - - for (; *ep; ep++) { - for (cp = name, dp = *ep; *cp && *cp == *dp; cp++, dp++) - continue; - if (*cp != 0 || *dp != '=') - continue; - cp = Strspl(STRequal, val); - xfree((ptr_t) * ep); - *ep = strip(Strspl(name, cp)); - xfree((ptr_t) cp); - blkfree((Char **) environ); - environ = short2blk(STR_environ); - return; - } - cp = Strspl(name, STRequal); - blk[0] = strip(Strspl(cp, val)); - xfree((ptr_t) cp); - blk[1] = 0; - STR_environ = blkspl(STR_environ, blk); - blkfree((Char **) environ); - environ = short2blk(STR_environ); - xfree((ptr_t) oep); -} - -static void -Unsetenv(name) - Char *name; -{ - Char **ep = STR_environ; - Char *cp, *dp; - Char **oep = ep; - - for (; *ep; ep++) { - for (cp = name, dp = *ep; *cp && *cp == *dp; cp++, dp++) - continue; - if (*cp != 0 || *dp != '=') - continue; - cp = *ep; - *ep = 0; - STR_environ = blkspl(STR_environ, ep + 1); - environ = short2blk(STR_environ); - *ep = cp; - xfree((ptr_t) cp); - xfree((ptr_t) oep); - return; - } -} - -void -/*ARGSUSED*/ -doumask(v, t) - Char **v; - struct command *t; -{ - Char *cp = v[1]; - int i; - - if (cp == 0) { - i = umask(0); - (void) umask(i); - (void) fprintf(cshout, "%o\n", i); - return; - } - i = 0; - while (Isdigit(*cp) && *cp != '8' && *cp != '9') - i = i * 8 + *cp++ - '0'; - if (*cp || i < 0 || i > 0777) - stderror(ERR_NAME | ERR_MASK); - (void) umask(i); -} - -typedef quad_t RLIM_TYPE; - -static struct limits { - int limconst; - char *limname; - int limdiv; - char *limscale; -} limits[] = { - { RLIMIT_CPU, "cputime", 1, "seconds" }, - { RLIMIT_FSIZE, "filesize", 1024, "kbytes" }, - { RLIMIT_DATA, "datasize", 1024, "kbytes" }, - { RLIMIT_STACK, "stacksize", 1024, "kbytes" }, - { RLIMIT_CORE, "coredumpsize", 1024, "kbytes" }, - { RLIMIT_RSS, "memoryuse", 1024, "kbytes" }, - { RLIMIT_MEMLOCK, "memorylocked", 1024, "kbytes" }, - { RLIMIT_NPROC, "maxproc", 1, "" }, - { RLIMIT_NOFILE, "openfiles", 1, "" }, - { RLIMIT_SBSIZE, "sbsize ", 1, "bytes" }, - { -1, NULL, 0, NULL } -}; - -static struct limits *findlim(); -static RLIM_TYPE getval(); -static void limtail(); -static void plim(); -static int setlim(); - -static struct limits * -findlim(cp) - Char *cp; -{ - struct limits *lp, *res; - - res = (struct limits *) NULL; - for (lp = limits; lp->limconst >= 0; lp++) - if (prefix(cp, str2short(lp->limname))) { - if (res) - stderror(ERR_NAME | ERR_AMBIG); - res = lp; - } - if (res) - return (res); - stderror(ERR_NAME | ERR_LIMIT); - /* NOTREACHED */ - return (0); -} - -void -/*ARGSUSED*/ -dolimit(v, t) - Char **v; - struct command *t; -{ - struct limits *lp; - RLIM_TYPE limit; - char hard = 0; - - v++; - if (*v && eq(*v, STRmh)) { - hard = 1; - v++; - } - if (*v == 0) { - for (lp = limits; lp->limconst >= 0; lp++) - plim(lp, hard); - return; - } - lp = findlim(v[0]); - if (v[1] == 0) { - plim(lp, hard); - return; - } - limit = getval(lp, v + 1); - if (setlim(lp, hard, limit) < 0) - stderror(ERR_SILENT); -} - -static RLIM_TYPE -getval(lp, v) - struct limits *lp; - Char **v; -{ - float f; - Char *cp = *v++; - - f = atof(short2str(cp)); - - while (Isdigit(*cp) || *cp == '.' || *cp == 'e' || *cp == 'E') - cp++; - if (*cp == 0) { - if (*v == 0) - return ((RLIM_TYPE) ((f + 0.5) * lp->limdiv)); - cp = *v; - } - switch (*cp) { - case ':': - if (lp->limconst != RLIMIT_CPU) - goto badscal; - return ((RLIM_TYPE) (f * 60.0 + atof(short2str(cp + 1)))); - case 'h': - if (lp->limconst != RLIMIT_CPU) - goto badscal; - limtail(cp, "hours"); - f *= 3600.0; - break; - case 'm': - if (lp->limconst == RLIMIT_CPU) { - limtail(cp, "minutes"); - f *= 60.0; - break; - } - *cp = 'm'; - limtail(cp, "megabytes"); - f *= 1024.0 * 1024.0; - break; - case 's': - if (lp->limconst != RLIMIT_CPU) - goto badscal; - limtail(cp, "seconds"); - break; - case 'M': - if (lp->limconst == RLIMIT_CPU) - goto badscal; - *cp = 'm'; - limtail(cp, "megabytes"); - f *= 1024.0 * 1024.0; - break; - case 'k': - if (lp->limconst == RLIMIT_CPU) - goto badscal; - limtail(cp, "kbytes"); - f *= 1024.0; - break; - case 'u': - limtail(cp, "unlimited"); - return (RLIM_INFINITY); - default: -badscal: - stderror(ERR_NAME | ERR_SCALEF); - } - f += 0.5; - if (f > (float) RLIM_INFINITY) - return RLIM_INFINITY; - else - return ((RLIM_TYPE) f); -} - -static void -limtail(cp, str) - Char *cp; - char *str; -{ - while (*cp && *cp == *str) - cp++, str++; - if (*cp) - stderror(ERR_BADSCALE, str); -} - - -/*ARGSUSED*/ -static void -plim(lp, hard) - struct limits *lp; - Char hard; -{ - struct rlimit rlim; - RLIM_TYPE limit; - - (void) fprintf(cshout, "%s \t", lp->limname); - - (void) getrlimit(lp->limconst, &rlim); - limit = hard ? rlim.rlim_max : rlim.rlim_cur; - - if (limit == RLIM_INFINITY) - (void) fprintf(cshout, "unlimited"); - else if (lp->limconst == RLIMIT_CPU) - psecs((long) limit); - else - (void) fprintf(cshout, "%ld %s", (long) (limit / lp->limdiv), - lp->limscale); - (void) fputc('\n', cshout); -} - -void -/*ARGSUSED*/ -dounlimit(v, t) - Char **v; - struct command *t; -{ - struct limits *lp; - int lerr = 0; - Char hard = 0; - - v++; - if (*v && eq(*v, STRmh)) { - hard = 1; - v++; - } - if (*v == 0) { - for (lp = limits; lp->limconst >= 0; lp++) - if (setlim(lp, hard, (RLIM_TYPE) RLIM_INFINITY) < 0) - lerr++; - if (lerr) - stderror(ERR_SILENT); - return; - } - while (*v) { - lp = findlim(*v++); - if (setlim(lp, hard, (RLIM_TYPE) RLIM_INFINITY) < 0) - stderror(ERR_SILENT); - } -} - -static int -setlim(lp, hard, limit) - struct limits *lp; - Char hard; - RLIM_TYPE limit; -{ - struct rlimit rlim; - - (void) getrlimit(lp->limconst, &rlim); - - if (hard) - rlim.rlim_max = limit; - else if (limit == RLIM_INFINITY && geteuid() != 0) - rlim.rlim_cur = rlim.rlim_max; - else - rlim.rlim_cur = limit; - - if (setrlimit(lp->limconst, &rlim) < 0) { - (void) fprintf(csherr, "%s: %s: Can't %s%s limit\n", bname, lp->limname, - limit == RLIM_INFINITY ? "remove" : "set", - hard ? " hard" : ""); - return (-1); - } - return (0); -} - -void -/*ARGSUSED*/ -dosuspend(v, t) - Char **v; - struct command *t; -{ - int ctpgrp; - - void (*old) __P((int)); - - if (loginsh) - stderror(ERR_SUSPLOG); - untty(); - - old = signal(SIGTSTP, SIG_DFL); - (void) kill(0, SIGTSTP); - /* the shell stops here */ - (void) signal(SIGTSTP, old); - - if (tpgrp != -1) { - ctpgrp = tcgetpgrp(FSHTTY); - while (ctpgrp != opgrp) { - old = signal(SIGTTIN, SIG_DFL); - (void) kill(0, SIGTTIN); - (void) signal(SIGTTIN, old); - } - (void) setpgid(0, shpgrp); - (void) tcsetpgrp(FSHTTY, shpgrp); - } -} - -/* This is the dreaded EVAL built-in. - * If you don't fiddle with file descriptors, and reset didfds, - * this command will either ignore redirection inside or outside - * its arguments, e.g. eval "date >x" vs. eval "date" >x - * The stuff here seems to work, but I did it by trial and error rather - * than really knowing what was going on. If tpgrp is zero, we are - * probably a background eval, e.g. "eval date &", and we want to - * make sure that any processes we start stay in our pgrp. - * This is also the case for "time eval date" -- stay in same pgrp. - * Otherwise, under stty tostop, processes will stop in the wrong - * pgrp, with no way for the shell to get them going again. -IAN! - */ -static Char **gv = NULL; -void -/*ARGSUSED*/ -doeval(v, t) - Char **v; - struct command *t; -{ - Char **oevalvec; - Char *oevalp; - int odidfds; - jmp_buf osetexit; - int my_reenter; - Char **savegv = gv; - int saveIN; - int saveOUT; - int saveERR; - int oSHIN; - int oSHOUT; - int oSHERR; - - UNREGISTER(v); - - oevalvec = evalvec; - oevalp = evalp; - odidfds = didfds; - oSHIN = SHIN; - oSHOUT = SHOUT; - oSHERR = SHERR; - - v++; - if (*v == 0) - return; - gflag = 0, tglob(v); - if (gflag) { - gv = v = globall(v); - gargv = 0; - if (v == 0) - stderror(ERR_NOMATCH); - v = copyblk(v); - } - else { - gv = NULL; - v = copyblk(v); - trim(v); - } - - saveIN = dcopy(SHIN, -1); - saveOUT = dcopy(SHOUT, -1); - saveERR = dcopy(SHERR, -1); - - getexit(osetexit); - - if ((my_reenter = setexit()) == 0) { - evalvec = v; - evalp = 0; - SHIN = dcopy(0, -1); - SHOUT = dcopy(1, -1); - SHERR = dcopy(2, -1); - didfds = 0; - process(0); - } - - evalvec = oevalvec; - evalp = oevalp; - doneinp = 0; - didfds = odidfds; - (void) close(SHIN); - (void) close(SHOUT); - (void) close(SHERR); - SHIN = dmove(saveIN, oSHIN); - SHOUT = dmove(saveOUT, oSHOUT); - SHERR = dmove(saveERR, oSHERR); - if (gv) - blkfree(gv), gv = NULL; - resexit(osetexit); - gv = savegv; - if (my_reenter) - stderror(ERR_SILENT); -} - -void -/*ARGSUSED*/ -doprintf(v, t) - Char **v; - struct command *t; -{ - Char **newv; - char **c; - extern int progprintf __P((int, char **)); - int ret; - - gflag = 0; - tglob(v); - if (gflag) { - newv = globall(v); - if (newv == 0) { - stderror(ERR_NAME | ERR_NOMATCH); - return; - } - v = newv; - gargv=0; - } - - ret = progprintf(blklen(v), c = short2blk(v)); - (void) fflush(cshout); - (void) fflush(csherr); - - blkfree((Char **) c); - if (ret) - stderror(ERR_SILENT); -} diff --git a/bin/csh/glob.c b/bin/csh/glob.c deleted file mode 100644 index 09c928a..0000000 --- a/bin/csh/glob.c +++ /dev/null @@ -1,961 +0,0 @@ -/*- - * Copyright (c) 1980, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -#if 0 -static char sccsid[] = "@(#)glob.c 8.1 (Berkeley) 5/31/93"; -#else -static const char rcsid[] = - "$FreeBSD$"; -#endif -#endif /* not lint */ - -#include <sys/param.h> -#include <glob.h> -#include <errno.h> -#include <string.h> -#include <unistd.h> -#if __STDC__ -# include <stdarg.h> -#else -# include <varargs.h> -#endif - -#include "csh.h" -#include "extern.h" - -static int noglob; -static int pargsiz, gargsiz; - -/* - * Values for gflag - */ -#define G_NONE 0 /* No globbing needed */ -#define G_GLOB 1 /* string contains *?[] characters */ -#define G_CSH 2 /* string contains ~`{ characters */ - -#define GLOBSPACE 100 /* Alloc increment */ - -#define LBRC '{' -#define RBRC '}' -#define LBRK '[' -#define RBRK ']' -#define EOS '\0' - -Char **gargv = NULL; -long gargc = 0; -Char **pargv = NULL; -long pargc = 0; - -/* - * globbing is now done in two stages. In the first pass we expand - * csh globbing idioms ~`{ and then we proceed doing the normal - * globbing if needed ?*[ - * - * Csh type globbing is handled in globexpand() and the rest is - * handled in glob() which is part of the 4.4BSD libc. - * - */ -static Char *globtilde __P((Char **, Char *)); -static Char **libglob __P((Char **)); -static Char **globexpand __P((Char **)); -static int globbrace __P((Char *, Char *, Char ***)); -static void expbrace __P((Char ***, Char ***, int)); -static int pmatch __P((Char *, Char *)); -static void pword __P((void)); -static void psave __P((int)); -static void backeval __P((Char *, bool)); -static int collate_range_cmp __P((int, int)); - -static int collate_range_cmp (c1, c2) - int c1, c2; -{ - static char s1[2], s2[2]; - int ret; - - c1 &= UCHAR_MAX; - c2 &= UCHAR_MAX; - if (c1 == c2) - return (0); - s1[0] = c1; - s2[0] = c2; - if ((ret = strcoll(s1, s2)) != 0) - return (ret); - return (c1 - c2); -} - -static Char * -globtilde(nv, s) - Char **nv, *s; -{ - Char gbuf[MAXPATHLEN], *gstart, *b, *u, *e; - - gstart = gbuf; - *gstart++ = *s++; - u = s; - for (b = gstart, e = &gbuf[MAXPATHLEN - 1]; - *s && *s != '/' && *s != ':' && b < e; - *b++ = *s++) - continue; - *b = EOS; - if (gethdir(gstart)) { - blkfree(nv); - if (*gstart) - stderror(ERR_UNKUSER, vis_str(gstart)); - else - stderror(ERR_NOHOME); - } - b = &gstart[Strlen(gstart)]; - while (*s) - *b++ = *s++; - *b = EOS; - --u; - xfree((ptr_t) u); - return (Strsave(gstart)); -} - -static int -globbrace(s, p, bl) - Char *s, *p, ***bl; -{ - int i, len; - Char *pm, *pe, *lm, *pl; - Char **nv, **vl; - Char gbuf[MAXPATHLEN]; - int size = GLOBSPACE; - - nv = vl = (Char **) xmalloc((size_t) sizeof(Char *) * size); - *vl = NULL; - - len = 0; - /* copy part up to the brace */ - for (lm = gbuf, p = s; *p != LBRC; *lm++ = *p++) - continue; - - /* check for balanced braces */ - for (i = 0, pe = ++p; *pe; pe++) - if (*pe == LBRK) { - /* Ignore everything between [] */ - for (++pe; *pe != RBRK && *pe != EOS; pe++) - continue; - if (*pe == EOS) { - blkfree(nv); - return (-RBRK); - } - } - else if (*pe == LBRC) - i++; - else if (*pe == RBRC) { - if (i == 0) - break; - i--; - } - - if (i != 0 || *pe == '\0') { - blkfree(nv); - return (-RBRC); - } - - for (i = 0, pl = pm = p; pm <= pe; pm++) - switch (*pm) { - case LBRK: - for (++pm; *pm != RBRK && *pm != EOS; pm++) - continue; - if (*pm == EOS) { - *vl = NULL; - blkfree(nv); - return (-RBRK); - } - break; - case LBRC: - i++; - break; - case RBRC: - if (i) { - i--; - break; - } - /* FALLTHROUGH */ - case ',': - if (i && *pm == ',') - break; - else { - Char savec = *pm; - - *pm = EOS; - (void) Strcpy(lm, pl); - (void) Strcat(gbuf, pe + 1); - *pm = savec; - *vl++ = Strsave(gbuf); - len++; - pl = pm + 1; - if (vl == &nv[size]) { - size += GLOBSPACE; - nv = (Char **) xrealloc((ptr_t) nv, (size_t) - size * sizeof(Char *)); - vl = &nv[size - GLOBSPACE]; - } - } - break; - default: - break; - } - *vl = NULL; - *bl = nv; - return (len); -} - - -static void -expbrace(nvp, elp, size) - Char ***nvp, ***elp; - int size; -{ - Char **vl, **el, **nv, *s; - - vl = nv = *nvp; - if (elp != NULL) - el = *elp; - else - for (el = vl; *el; el++) - continue; - - for (s = *vl; s; s = *++vl) { - Char *b; - Char **vp, **bp; - - /* leave {} untouched for find */ - if (s[0] == '{' && (s[1] == '\0' || (s[1] == '}' && s[2] == '\0'))) - continue; - if ((b = Strchr(s, '{')) != NULL) { - Char **bl; - int len; - - if ((len = globbrace(s, b, &bl)) < 0) { - xfree((ptr_t) nv); - stderror(ERR_MISSING, -len); - } - xfree((ptr_t) s); - if (len == 1) { - *vl-- = *bl; - xfree((ptr_t) bl); - continue; - } - len = blklen(bl); - if (&el[len] >= &nv[size]) { - int l, e; - - l = &el[len] - &nv[size]; - size += GLOBSPACE > l ? GLOBSPACE : l; - l = vl - nv; - e = el - nv; - nv = (Char **) xrealloc((ptr_t) nv, (size_t) - size * sizeof(Char *)); - vl = nv + l; - el = nv + e; - } - vp = vl--; - *vp = *bl; - len--; - for (bp = el; bp != vp; bp--) - bp[len] = *bp; - el += len; - vp++; - for (bp = bl + 1; *bp; *vp++ = *bp++) - continue; - xfree((ptr_t) bl); - } - - } - if (elp != NULL) - *elp = el; - *nvp = nv; -} - -static Char ** -globexpand(v) - Char **v; -{ - Char *s; - Char **nv, **vl, **el; - int size = GLOBSPACE; - - - nv = vl = (Char **) xmalloc((size_t) sizeof(Char *) * size); - *vl = NULL; - - /* - * Step 1: expand backquotes. - */ - while ((s = *v++) != NULL) { - if (Strchr(s, '`')) { - int i; - - (void) dobackp(s, 0); - for (i = 0; i < pargc; i++) { - *vl++ = pargv[i]; - if (vl == &nv[size]) { - size += GLOBSPACE; - nv = (Char **) xrealloc((ptr_t) nv, - (size_t) size * sizeof(Char *)); - vl = &nv[size - GLOBSPACE]; - } - } - xfree((ptr_t) pargv); - pargv = NULL; - } - else { - *vl++ = Strsave(s); - if (vl == &nv[size]) { - size += GLOBSPACE; - nv = (Char **) xrealloc((ptr_t) nv, (size_t) - size * sizeof(Char *)); - vl = &nv[size - GLOBSPACE]; - } - } - } - *vl = NULL; - - if (noglob) - return (nv); - - /* - * Step 2: expand braces - */ - el = vl; - expbrace(&nv, &el, size); - - /* - * Step 3: expand ~ - */ - vl = nv; - for (s = *vl; s; s = *++vl) - if (*s == '~') - *vl = globtilde(nv, s); - vl = nv; - return (vl); -} - -static Char * -handleone(str, vl, action) - Char *str, **vl; - int action; -{ - - Char *cp, **vlp = vl; - - switch (action) { - case G_ERROR: - setname(vis_str(str)); - blkfree(vl); - stderror(ERR_NAME | ERR_AMBIG); - break; - case G_APPEND: - trim(vlp); - str = Strsave(*vlp++); - do { - cp = Strspl(str, STRspace); - xfree((ptr_t) str); - str = Strspl(cp, *vlp); - xfree((ptr_t) cp); - } - while (*++vlp); - blkfree(vl); - break; - case G_IGNORE: - str = Strsave(strip(*vlp)); - blkfree(vl); - break; - default: - break; - } - return (str); -} - -static Char ** -libglob(vl) - Char **vl; -{ - int gflgs = GLOB_QUOTE | GLOB_NOMAGIC; - glob_t globv; - char *ptr; - int nonomatch = adrof(STRnonomatch) != 0, magic = 0, match = 0; - - if (!vl || !vl[0]) - return (vl); - - globv.gl_offs = 0; - globv.gl_pathv = 0; - globv.gl_pathc = 0; - - if (nonomatch) - gflgs |= GLOB_NOCHECK; - - do { - ptr = short2qstr(*vl); - switch (glob(ptr, gflgs, 0, &globv)) { - case GLOB_ABEND: - setname(vis_str(*vl)); - stderror(ERR_NAME | ERR_GLOB); - /* NOTREACHED */ - case GLOB_NOSPACE: - stderror(ERR_NOMEM); - /* NOTREACHED */ - default: - break; - } - if (globv.gl_flags & GLOB_MAGCHAR) { - match |= (globv.gl_matchc != 0); - magic = 1; - } - gflgs |= GLOB_APPEND; - } - while (*++vl); - vl = (globv.gl_pathc == 0 || (magic && !match && !nonomatch)) ? - NULL : blk2short(globv.gl_pathv); - globfree(&globv); - return (vl); -} - -Char * -globone(str, action) - Char *str; - int action; -{ - Char *v[2], **vl, **vo; - int gflg; - - noglob = adrof(STRnoglob) != 0; - gflag = 0; - v[0] = str; - v[1] = 0; - tglob(v); - gflg = gflag; - if (gflg == G_NONE) - return (strip(Strsave(str))); - - if (gflg & G_CSH) { - /* - * Expand back-quote, tilde and brace - */ - vo = globexpand(v); - if (noglob || (gflg & G_GLOB) == 0) { - if (vo[0] == NULL) { - xfree((ptr_t) vo); - return (Strsave(STRNULL)); - } - if (vo[1] != NULL) - return (handleone(str, vo, action)); - else { - str = strip(vo[0]); - xfree((ptr_t) vo); - return (str); - } - } - } - else if (noglob || (gflg & G_GLOB) == 0) - return (strip(Strsave(str))); - else - vo = v; - - vl = libglob(vo); - if ((gflg & G_CSH) && vl != vo) - blkfree(vo); - if (vl == NULL) { - setname(vis_str(str)); - stderror(ERR_NAME | ERR_NOMATCH); - } - if (vl[0] == NULL) { - xfree((ptr_t) vl); - return (Strsave(STRNULL)); - } - if (vl[1] != NULL) - return (handleone(str, vl, action)); - else { - str = strip(*vl); - xfree((ptr_t) vl); - return (str); - } -} - -Char ** -globall(v) - Char **v; -{ - Char **vl, **vo; - int gflg = gflag; - - if (!v || !v[0]) { - gargv = saveblk(v); - gargc = blklen(gargv); - return (gargv); - } - - noglob = adrof(STRnoglob) != 0; - - if (gflg & G_CSH) - /* - * Expand back-quote, tilde and brace - */ - vl = vo = globexpand(v); - else - vl = vo = saveblk(v); - - if (!noglob && (gflg & G_GLOB)) { - vl = libglob(vo); - if ((gflg & G_CSH) && vl != vo) - blkfree(vo); - } - else - trim(vl); - - gargc = vl ? blklen(vl) : 0; - return (gargv = vl); -} - -void -ginit() -{ - gargsiz = GLOBSPACE; - gargv = (Char **) xmalloc((size_t) sizeof(Char *) * gargsiz); - gargv[0] = 0; - gargc = 0; -} - -void -rscan(t, f) - Char **t; - void (*f) __P((int)); -{ - Char *p; - - while ((p = *t++) != NULL) - while (*p) - (*f) (*p++); -} - -void -trim(t) - Char **t; -{ - Char *p; - - while ((p = *t++) != NULL) - while (*p) - *p++ &= TRIM; -} - -void -tglob(t) - Char **t; -{ - Char *p, c; - - while ((p = *t++) != NULL) { - if (*p == '~' || *p == '=') - gflag |= G_CSH; - else if (*p == '{' && - (p[1] == '\0' || (p[1] == '}' && p[2] == '\0'))) - continue; - while ((c = *p++) != '\0') { - /* - * eat everything inside the matching backquotes - */ - if (c == '`') { - gflag |= G_CSH; - while (*p && *p != '`') - if (*p++ == '\\') { - if (*p) /* Quoted chars */ - p++; - else - break; - } - if (*p) /* The matching ` */ - p++; - else - break; - } - else if (c == '{') - gflag |= G_CSH; - else if (isglob(c)) - gflag |= G_GLOB; - } - } -} - -/* - * Command substitute cp. If literal, then this is a substitution from a - * << redirection, and so we should not crunch blanks and tabs, separating - * words only at newlines. - */ -Char ** -dobackp(cp, literal) - Char *cp; - bool literal; -{ - Char *lp, *rp; - Char *ep, word[MAXPATHLEN]; - - if (pargv) { -#ifdef notdef - abort(); -#endif - blkfree(pargv); - } - pargsiz = GLOBSPACE; - pargv = (Char **) xmalloc((size_t) sizeof(Char *) * pargsiz); - pargv[0] = NULL; - pargcp = pargs = word; - pargc = 0; - pnleft = MAXPATHLEN - 4; - for (;;) { - for (lp = cp; *lp != '`'; lp++) { - if (*lp == 0) { - if (pargcp != pargs) - pword(); - return (pargv); - } - psave(*lp); - } - lp++; - for (rp = lp; *rp && *rp != '`'; rp++) - if (*rp == '\\') { - rp++; - if (!*rp) - goto oops; - } - if (!*rp) - oops: stderror(ERR_UNMATCHED, '`'); - ep = Strsave(lp); - ep[rp - lp] = 0; - backeval(ep, literal); - cp = rp + 1; - } -} - -static void -backeval(cp, literal) - Char *cp; - bool literal; -{ - int icnt, c; - Char *ip; - struct command faket; - bool hadnl; - int pvec[2], quoted; - Char *fakecom[2], ibuf[BUFSIZ]; - char tibuf[BUFSIZ]; - - hadnl = 0; - icnt = 0; - quoted = (literal || (cp[0] & QUOTE)) ? QUOTE : 0; - faket.t_dtyp = NODE_COMMAND; - faket.t_dflg = 0; - faket.t_dlef = 0; - faket.t_drit = 0; - faket.t_dspr = 0; - faket.t_dcom = fakecom; - fakecom[0] = STRfakecom1; - fakecom[1] = 0; - - /* - * We do the psave job to temporarily change the current job so that the - * following fork is considered a separate job. This is so that when - * backquotes are used in a builtin function that calls glob the "current - * job" is not corrupted. We only need one level of pushed jobs as long as - * we are sure to fork here. - */ - psavejob(); - - /* - * It would be nicer if we could integrate this redirection more with the - * routines in sh.sem.c by doing a fake execute on a builtin function that - * was piped out. - */ - mypipe(pvec); - if (pfork(&faket, -1) == 0) { - struct wordent paraml; - struct command *t; - - (void) close(pvec[0]); - (void) dmove(pvec[1], 1); - (void) dmove(SHERR, 2); - initdesc(); - /* - * Bugfix for nested backquotes by Michael Greim <greim@sbsvax.UUCP>, - * posted to comp.bugs.4bsd 12 Sep. 1989. - */ - if (pargv) /* mg, 21.dec.88 */ - blkfree(pargv), pargv = 0, pargsiz = 0; - /* mg, 21.dec.88 */ - arginp = cp; - while (*cp) - *cp++ &= TRIM; - - /* - * In the child ``forget'' everything about current aliases or - * eval vectors. - */ - alvec = NULL; - evalvec = NULL; - alvecp = NULL; - evalp = NULL; - (void) lex(¶ml); - if (seterr) - stderror(ERR_OLD); - alias(¶ml); - t = syntax(paraml.next, ¶ml, 0); - if (seterr) - stderror(ERR_OLD); - if (t) - t->t_dflg |= F_NOFORK; - (void) signal(SIGTSTP, SIG_IGN); - (void) signal(SIGTTIN, SIG_IGN); - (void) signal(SIGTTOU, SIG_IGN); - execute(t, -1, NULL, NULL); - exitstat(); - } - xfree((ptr_t) cp); - (void) close(pvec[1]); - c = 0; - ip = NULL; - do { - int cnt = 0; - - for (;;) { - if (icnt == 0) { - int i; - - ip = ibuf; - do - icnt = read(pvec[0], tibuf, BUFSIZ); - while (icnt == -1 && errno == EINTR); - if (icnt <= 0) { - c = -1; - break; - } - for (i = 0; i < icnt; i++) - ip[i] = (unsigned char) tibuf[i]; - } - if (hadnl) - break; - --icnt; - c = (*ip++ & TRIM); - if (c == 0) - break; - if (c == '\n') { - /* - * Continue around the loop one more time, so that we can eat - * the last newline without terminating this word. - */ - hadnl = 1; - continue; - } - if (!quoted && (c == ' ' || c == '\t')) - break; - cnt++; - psave(c | quoted); - } - /* - * Unless at end-of-file, we will form a new word here if there were - * characters in the word, or in any case when we take text literally. - * If we didn't make empty words here when literal was set then we - * would lose blank lines. - */ - if (c != -1 && (cnt || literal)) - pword(); - hadnl = 0; - } while (c >= 0); - (void) close(pvec[0]); - pwait(); - prestjob(); -} - -static void -psave(c) - int c; -{ - if (--pnleft <= 0) - stderror(ERR_WTOOLONG); - *pargcp++ = c; -} - -static void -pword() -{ - psave(0); - if (pargc == pargsiz - 1) { - pargsiz += GLOBSPACE; - pargv = (Char **) xrealloc((ptr_t) pargv, - (size_t) pargsiz * sizeof(Char *)); - } - pargv[pargc++] = Strsave(pargs); - pargv[pargc] = NULL; - pargcp = pargs; - pnleft = MAXPATHLEN - 4; -} - -int -Gmatch(string, pattern) - Char *string, *pattern; -{ - Char **blk, **p; - int gpol = 1, gres = 0; - - if (*pattern == '^') { - gpol = 0; - pattern++; - } - - blk = (Char **) xmalloc(GLOBSPACE * sizeof(Char *)); - blk[0] = Strsave(pattern); - blk[1] = NULL; - - expbrace(&blk, NULL, GLOBSPACE); - - for (p = blk; *p; p++) - gres |= pmatch(string, *p); - - blkfree(blk); - return(gres == gpol); -} - -static int -pmatch(string, pattern) - Char *string, *pattern; -{ - Char stringc, patternc; - int match, negate_range; - Char rangec; - - for (;; ++string) { - stringc = *string & TRIM; - patternc = *pattern++; - switch (patternc) { - case 0: - return (stringc == 0); - case '?': - if (stringc == 0) - return (0); - break; - case '*': - if (!*pattern) - return (1); - while (*string) - if (Gmatch(string++, pattern)) - return (1); - return (0); - case '[': - match = 0; - if ((negate_range = (*pattern == '^')) != 0) - pattern++; - while ((rangec = *pattern++) != '\0') { - if (rangec == ']') - break; - if (match) - continue; - if (rangec == '-' && *(pattern-2) != '[' && *pattern != ']') { - match = ( collate_range_cmp(stringc, *pattern & TRIM) <= 0 - && collate_range_cmp(*(pattern-2) & TRIM, stringc) <= 0 - ); - pattern++; - } - else - match = (stringc == (rangec & TRIM)); - } - if (rangec == 0) - stderror(ERR_NAME | ERR_MISSING, ']'); - if (match == negate_range) - return (0); - break; - default: - if ((patternc & TRIM) != stringc) - return (0); - break; - - } - } -} - -void -Gcat(s1, s2) - Char *s1, *s2; -{ - Char *p, *q; - int n; - - for (p = s1; *p++;) - continue; - for (q = s2; *q++;) - continue; - n = (p - s1) + (q - s2) - 1; - if (++gargc >= gargsiz) { - gargsiz += GLOBSPACE; - gargv = (Char **) xrealloc((ptr_t) gargv, - (size_t) gargsiz * sizeof(Char *)); - } - gargv[gargc] = 0; - p = gargv[gargc - 1] = (Char *) xmalloc((size_t) n * sizeof(Char)); - for (q = s1; (*p++ = *q++) != '\0';) - continue; - for (p--, q = s2; (*p++ = *q++) != '\0';) - continue; -} - -#ifdef FILEC -int -sortscmp(a, b) - const ptr_t a, b; -{ -#if defined(NLS) && !defined(NOSTRCOLL) - char buf[2048]; -#endif - - if (!a) /* check for NULL */ - return (b ? 1 : 0); - if (!b) - return (-1); - - if (!*(Char **)a) /* check for NULL */ - return (*(Char **)b ? 1 : 0); - if (!*(Char **)b) - return (-1); - -#if defined(NLS) && !defined(NOSTRCOLL) - (void) strcpy(buf, short2str(*(Char **)a)); - return ((int) strcoll(buf, short2str(*(Char **)b))); -#else - return ((int) Strcmp(*(Char **)a, *(Char **)b)); -#endif -} -#endif /* FILEC */ diff --git a/bin/csh/hist.c b/bin/csh/hist.c deleted file mode 100644 index 2df74e1..0000000 --- a/bin/csh/hist.c +++ /dev/null @@ -1,188 +0,0 @@ -/*- - * Copyright (c) 1980, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -#if 0 -static char sccsid[] = "@(#)hist.c 8.1 (Berkeley) 5/31/93"; -#else -static const char rcsid[] = - "$FreeBSD$"; -#endif -#endif /* not lint */ - -#include <sys/types.h> -#if __STDC__ -# include <stdarg.h> -#else -# include <varargs.h> -#endif - -#include "csh.h" -#include "extern.h" - -static void hfree __P((struct Hist *)); -static void dohist1 __P((struct Hist *, int *, int, int)); -static void phist __P((struct Hist *, int)); - -void -savehist(sp) - struct wordent *sp; -{ - struct Hist *hp, *np; - int histlen = 0; - Char *cp; - - /* throw away null lines */ - if (sp->next->word[0] == '\n') - return; - cp = value(STRhistory); - if (*cp) { - Char *p = cp; - - while (*p) { - if (!Isdigit(*p)) { - histlen = 0; - break; - } - histlen = histlen * 10 + *p++ - '0'; - } - } - for (hp = &Histlist; (np = hp->Hnext) != NULL;) - if (eventno - np->Href >= histlen || histlen == 0) - hp->Hnext = np->Hnext, hfree(np); - else - hp = np; - (void) enthist(++eventno, sp, 1); -} - -struct Hist * -enthist(event, lp, docopy) - int event; - struct wordent *lp; - bool docopy; -{ - struct Hist *np; - - np = (struct Hist *) xmalloc((size_t) sizeof(*np)); - np->Hnum = np->Href = event; - if (docopy) { - copylex(&np->Hlex, lp); - } - else { - np->Hlex.next = lp->next; - lp->next->prev = &np->Hlex; - np->Hlex.prev = lp->prev; - lp->prev->next = &np->Hlex; - } - np->Hnext = Histlist.Hnext; - Histlist.Hnext = np; - return (np); -} - -static void -hfree(hp) - struct Hist *hp; -{ - - freelex(&hp->Hlex); - xfree((ptr_t) hp); -} - -void -/*ARGSUSED*/ -dohist(v, t) - Char **v; - struct command *t; -{ - int n, rflg = 0, hflg = 0; - - if (getn(value(STRhistory)) == 0) - return; - if (setintr) - (void) sigsetmask(sigblock(0) & ~sigmask(SIGINT)); - while (*++v && **v == '-') { - Char *vp = *v; - - while (*++vp) - switch (*vp) { - case 'h': - hflg++; - break; - case 'r': - rflg++; - break; - case '-': /* ignore multiple '-'s */ - break; - default: - stderror(ERR_HISTUS); - break; - } - } - if (*v) - n = getn(*v); - else { - n = getn(value(STRhistory)); - } - dohist1(Histlist.Hnext, &n, rflg, hflg); -} - -static void -dohist1(hp, np, rflg, hflg) - struct Hist *hp; - int *np, rflg, hflg; -{ - bool print = (*np) > 0; - - for (; hp != 0; hp = hp->Hnext) { - (*np)--; - hp->Href++; - if (rflg == 0) { - dohist1(hp->Hnext, np, rflg, hflg); - if (print) - phist(hp, hflg); - return; - } - if (*np >= 0) - phist(hp, hflg); - } -} - -static void -phist(hp, hflg) - struct Hist *hp; - int hflg; -{ - if (hflg == 0) - (void) fprintf(cshout, "%6d\t", hp->Hnum); - prlex(cshout, &hp->Hlex); -} diff --git a/bin/csh/init.c b/bin/csh/init.c deleted file mode 100644 index c290a6b..0000000 --- a/bin/csh/init.c +++ /dev/null @@ -1,139 +0,0 @@ -/*- - * Copyright (c) 1980, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -#if 0 -static char sccsid[] = "@(#)init.c 8.1 (Berkeley) 5/31/93"; -#else -static const char rcsid[] = - "$FreeBSD$"; -#endif -#endif /* not lint */ - -#if __STDC__ -# include <stdarg.h> -#else -# include <varargs.h> -#endif - -#include "csh.h" -#include "extern.h" - -#define INF 1000 - -struct biltins bfunc[] = -{ - { "@", dolet, 0, INF }, - { "alias", doalias, 0, INF }, - { "alloc", showall, 0, 1 }, - { "bg", dobg, 0, INF }, - { "break", dobreak, 0, 0 }, - { "breaksw", doswbrk, 0, 0 }, - { "case", dozip, 0, 1 }, - { "cd", dochngd, 0, INF }, - { "chdir", dochngd, 0, INF }, - { "continue", docontin, 0, 0 }, - { "default", dozip, 0, 0 }, - { "dirs", dodirs, 0, INF }, - { "echo", doecho, 0, INF }, - { "else", doelse, 0, INF }, - { "end", doend, 0, 0 }, - { "endif", dozip, 0, 0 }, - { "endsw", dozip, 0, 0 }, - { "eval", doeval, 0, INF }, - { "exec", execash, 1, INF }, - { "exit", doexit, 0, INF }, - { "fg", dofg, 0, INF }, - { "foreach", doforeach, 3, INF }, - { "glob", doglob, 0, INF }, - { "goto", dogoto, 1, 1 }, - { "hashstat", hashstat, 0, 0 }, - { "history", dohist, 0, 2 }, - { "if", doif, 1, INF }, - { "jobs", dojobs, 0, 1 }, - { "kill", dokill, 1, INF }, - { "limit", dolimit, 0, 3 }, - { "linedit", doecho, 0, INF }, - { "login", dologin, 0, 1 }, - { "logout", dologout, 0, 0 }, - { "nice", donice, 0, INF }, - { "nohup", donohup, 0, INF }, - { "notify", donotify, 0, INF }, - { "onintr", doonintr, 0, 2 }, - { "popd", dopopd, 0, INF }, - { "printf", doprintf, 1, INF }, - { "pushd", dopushd, 0, INF }, - { "rehash", dohash, 0, 0 }, - { "repeat", dorepeat, 2, INF }, - { "set", doset, 0, INF }, - { "setenv", dosetenv, 0, 2 }, - { "shift", shift, 0, 1 }, - { "source", dosource, 1, 2 }, - { "stop", dostop, 1, INF }, - { "suspend", dosuspend, 0, 0 }, - { "switch", doswitch, 1, INF }, - { "time", dotime, 0, INF }, - { "umask", doumask, 0, 1 }, - { "unalias", unalias, 1, INF }, - { "unhash", dounhash, 0, 0 }, - { "unlimit", dounlimit, 0, INF }, - { "unset", unset, 1, INF }, - { "unsetenv", dounsetenv, 1, INF }, - { "wait", dowait, 0, 0 }, - { "which", dowhich, 1, INF }, - { "while", dowhile, 1, INF } -}; -int nbfunc = sizeof bfunc / sizeof *bfunc; - -struct srch srchn[] = -{ - { "@", T_LET }, - { "break", T_BREAK }, - { "breaksw", T_BRKSW }, - { "case", T_CASE }, - { "default", T_DEFAULT }, - { "else", T_ELSE }, - { "end", T_END }, - { "endif", T_ENDIF }, - { "endsw", T_ENDSW }, - { "exit", T_EXIT }, - { "foreach", T_FOREACH }, - { "goto", T_GOTO }, - { "if", T_IF }, - { "label", T_LABEL }, - { "set", T_SET }, - { "switch", T_SWITCH }, - { "while", T_WHILE } -}; -int nsrchn = sizeof srchn / sizeof *srchn; - diff --git a/bin/csh/lex.c b/bin/csh/lex.c deleted file mode 100644 index 6ea61ac..0000000 --- a/bin/csh/lex.c +++ /dev/null @@ -1,1643 +0,0 @@ -/*- - * Copyright (c) 1980, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -#if 0 -static char sccsid[] = "@(#)lex.c 8.1 (Berkeley) 5/31/93"; -#else -static const char rcsid[] = - "$FreeBSD$"; -#endif -#endif /* not lint */ - -#include <sys/types.h> -#include <sys/ioctl.h> -#include <termios.h> -#include <errno.h> -#include <string.h> -#include <unistd.h> -#if __STDC__ -# include <stdarg.h> -#else -# include <varargs.h> -#endif - -#include "csh.h" -#include "extern.h" - -/* - * These lexical routines read input and form lists of words. - * There is some involved processing here, because of the complications - * of input buffering, and especially because of history substitution. - */ - -static Char *word __P((void)); -static int getC1 __P((int)); -static void getdol __P((void)); -static void getexcl __P((int)); -static struct Hist - *findev __P((Char *, bool)); -static void setexclp __P((Char *)); -static int bgetc __P((void)); -static void bfree __P((void)); -static struct wordent - *gethent __P((int)); -static int matchs __P((Char *, Char *)); -static int getsel __P((int *, int *, int)); -static struct wordent - *getsub __P((struct wordent *)); -static Char *subword __P((Char *, int, bool *)); -static struct wordent - *dosub __P((int, struct wordent *, bool)); - -/* - * Peekc is a peek character for getC, peekread for readc. - * There is a subtlety here in many places... history routines - * will read ahead and then insert stuff into the input stream. - * If they push back a character then they must push it behind - * the text substituted by the history substitution. On the other - * hand in several places we need 2 peek characters. To make this - * all work, the history routines read with getC, and make use both - * of ungetC and unreadc. The key observation is that the state - * of getC at the call of a history reference is such that calls - * to getC from the history routines will always yield calls of - * readc, unless this peeking is involved. That is to say that during - * getexcl the variables lap, exclp, and exclnxt are all zero. - * - * Getdol invokes history substitution, hence the extra peek, peekd, - * which it can ungetD to be before history substitutions. - */ -static Char peekc = 0, peekd = 0; -static Char peekread = 0; - -/* (Tail of) current word from ! subst */ -static Char *exclp = NULL; - -/* The rest of the ! subst words */ -static struct wordent *exclnxt = NULL; - -/* Count of remaining words in ! subst */ -static int exclc = 0; - -/* "Globp" for alias resubstitution */ -Char *alvecp = NULL; -int aret = F_SEEK; - -/* - * Labuf implements a general buffer for lookahead during lexical operations. - * Text which is to be placed in the input stream can be stuck here. - * We stick parsed ahead $ constructs during initial input, - * process id's from `$$', and modified variable values (from qualifiers - * during expansion in sh.dol.c) here. - */ -static Char labuf[BUFSIZ]; - -/* - * Lex returns to its caller not only a wordlist (as a "var" parameter) - * but also whether a history substitution occurred. This is used in - * the main (process) routine to determine whether to echo, and also - * when called by the alias routine to determine whether to keep the - * argument list. - */ -static bool hadhist = 0; - -/* - * Avoid alias expansion recursion via \!# - */ -int hleft; - -static Char getCtmp; - -#define getC(f) ((getCtmp = peekc) ? (peekc = 0, getCtmp) : getC1(f)) -#define ungetC(c) peekc = c -#define ungetD(c) peekd = c - -int -lex(hp) - struct wordent *hp; -{ - struct wordent *wdp; - int c; - - btell(&lineloc); - hp->next = hp->prev = hp; - hp->word = STRNULL; - hadhist = 0; - do - c = readc(0); - while (c == ' ' || c == '\t'); - if (c == HISTSUB && intty) - /* ^lef^rit from tty is short !:s^lef^rit */ - getexcl(c); - else - unreadc(c); - wdp = hp; - /* - * The following loop is written so that the links needed by freelex will - * be ready and rarin to go even if it is interrupted. - */ - do { - struct wordent *new; - - new = (struct wordent *) xmalloc((size_t) sizeof(*wdp)); - new->word = 0; - new->prev = wdp; - new->next = hp; - wdp->next = new; - wdp = new; - wdp->word = word(); - } while (wdp->word[0] != '\n'); - hp->prev = wdp; - return (hadhist); -} - -void -prlex(fp, sp0) - FILE *fp; - struct wordent *sp0; -{ - struct wordent *sp = sp0->next; - - for (;;) { - (void) fprintf(fp, "%s", vis_str(sp->word)); - sp = sp->next; - if (sp == sp0) - break; - if (sp->word[0] != '\n') - (void) fputc(' ', fp); - } -} - -void -copylex(hp, fp) - struct wordent *hp; - struct wordent *fp; -{ - struct wordent *wdp; - - wdp = hp; - fp = fp->next; - do { - struct wordent *new; - - new = (struct wordent *) xmalloc((size_t) sizeof(*wdp)); - new->prev = wdp; - new->next = hp; - wdp->next = new; - wdp = new; - wdp->word = Strsave(fp->word); - fp = fp->next; - } while (wdp->word[0] != '\n'); - hp->prev = wdp; -} - -void -freelex(vp) - struct wordent *vp; -{ - struct wordent *fp; - - while (vp->next != vp) { - fp = vp->next; - vp->next = fp->next; - xfree((ptr_t) fp->word); - xfree((ptr_t) fp); - } - vp->prev = vp; -} - -static Char * -word() -{ - Char c, c1; - Char *wp; - Char wbuf[BUFSIZ]; - bool dolflg; - int i; - - wp = wbuf; - i = BUFSIZ - 4; -loop: - while ((c = getC(DOALL)) == ' ' || c == '\t') - continue; - if (cmap(c, _META | _ESC)) - switch (c) { - case '&': - case '|': - case '<': - case '>': - *wp++ = c; - c1 = getC(DOALL); - if (c1 == c) - *wp++ = c1; - else - ungetC(c1); - goto ret; - - case '#': - if (intty) - break; - c = 0; - do { - c1 = c; - c = getC(0); - } while (c != '\n'); - if (c1 == '\\') - goto loop; - /* fall into ... */ - - case ';': - case '(': - case ')': - case '\n': - *wp++ = c; - goto ret; - - case '\\': - c = getC(0); - if (c == '\n') { - if (onelflg == 1) - onelflg = 2; - goto loop; - } - if (c != HIST) - *wp++ = '\\', --i; - c |= QUOTE; - } - c1 = 0; - dolflg = DOALL; - for (;;) { - if (c1) { - if (c == c1) { - c1 = 0; - dolflg = DOALL; - } - else if (c == '\\') { - c = getC(0); - if (c == HIST) - c |= QUOTE; - else { - if (c == '\n') - /* - * if (c1 == '`') c = ' '; else - */ - c |= QUOTE; - ungetC(c); - c = '\\'; - } - } - else if (c == '\n') { - seterror(ERR_UNMATCHED, c1); - ungetC(c); - break; - } - } - else if (cmap(c, _META | _QF | _QB | _ESC)) { - if (c == '\\') { - c = getC(0); - if (c == '\n') { - if (onelflg == 1) - onelflg = 2; - break; - } - if (c != HIST) - *wp++ = '\\', --i; - c |= QUOTE; - } - else if (cmap(c, _QF | _QB)) { /* '"` */ - c1 = c; - dolflg = c == '"' ? DOALL : DOEXCL; - } - else if (c != '#' || !intty) { - ungetC(c); - break; - } - } - if (--i > 0) { - *wp++ = c; - c = getC(dolflg); - } - else { - seterror(ERR_WTOOLONG); - wp = &wbuf[1]; - break; - } - } -ret: - *wp = 0; - return (Strsave(wbuf)); -} - -static int -getC1(flag) - int flag; -{ - Char c; - - while (1) { - if ((c = peekc) != '\0') { - peekc = 0; - return (c); - } - if (lap) { - if ((c = *lap++) == 0) - lap = 0; - else { - if (cmap(c, _META | _QF | _QB)) - c |= QUOTE; - return (c); - } - } - if ((c = peekd) != '\0') { - peekd = 0; - return (c); - } - if (exclp) { - if ((c = *exclp++) != '\0') - return (c); - if (exclnxt && --exclc >= 0) { - exclnxt = exclnxt->next; - setexclp(exclnxt->word); - return (' '); - } - exclp = 0; - exclnxt = 0; - } - if (exclnxt) { - exclnxt = exclnxt->next; - if (--exclc < 0) - exclnxt = 0; - else - setexclp(exclnxt->word); - continue; - } - c = readc(0); - if (c == '$' && (flag & DODOL)) { - getdol(); - continue; - } - if (c == HIST && (flag & DOEXCL)) { - getexcl(0); - continue; - } - break; - } - return (c); -} - -static void -getdol() -{ - Char *np, *ep; - Char name[4 * MAXVARLEN + 1]; - int c; - int sc; - bool special = 0, toolong; - - np = name, *np++ = '$'; - c = sc = getC(DOEXCL); - if (any("\t \n", c)) { - ungetD(c); - ungetC('$' | QUOTE); - return; - } - if (c == '{') - *np++ = c, c = getC(DOEXCL); - if (c == '#' || c == '?') - special++, *np++ = c, c = getC(DOEXCL); - *np++ = c; - switch (c) { - - case '<': - case '$': - case '!': - if (special) - seterror(ERR_SPDOLLT); - *np = 0; - addla(name); - return; - - case '\n': - ungetD(c); - np--; - seterror(ERR_NEWLINE); - *np = 0; - addla(name); - return; - - case '*': - if (special) - seterror(ERR_SPSTAR); - *np = 0; - addla(name); - return; - - default: - toolong = 0; - if (Isdigit(c)) { -#ifdef notdef - /* let $?0 pass for now */ - if (special) { - seterror(ERR_DIGIT); - *np = 0; - addla(name); - return; - } -#endif - /* we know that np < &name[4] */ - ep = &np[MAXVARLEN]; - while ((c = getC(DOEXCL)) != '\0'){ - if (!Isdigit(c)) - break; - if (np < ep) - *np++ = c; - else - toolong = 1; - } - } - else if (letter(c)) { - /* we know that np < &name[4] */ - ep = &np[MAXVARLEN]; - toolong = 0; - while ((c = getC(DOEXCL)) != '\0') { - /* Bugfix for ${v123x} from Chris Torek, DAS DEC-90. */ - if (!letter(c) && !Isdigit(c)) - break; - if (np < ep) - *np++ = c; - else - toolong = 1; - } - } - else { - *np = 0; - seterror(ERR_VARILL); - addla(name); - return; - } - if (toolong) { - seterror(ERR_VARTOOLONG); - *np = 0; - addla(name); - return; - } - break; - } - if (c == '[') { - *np++ = c; - /* - * Name up to here is a max of MAXVARLEN + 8. - */ - ep = &np[2 * MAXVARLEN + 8]; - do { - /* - * Michael Greim: Allow $ expansion to take place in selector - * expressions. (limits the number of characters returned) - */ - c = getC(DOEXCL | DODOL); - if (c == '\n') { - ungetD(c); - np--; - seterror(ERR_NLINDEX); - *np = 0; - addla(name); - return; - } - if (np < ep) - *np++ = c; - } while (c != ']'); - *np = '\0'; - if (np >= ep) { - seterror(ERR_SELOVFL); - addla(name); - return; - } - c = getC(DOEXCL); - } - /* - * Name up to here is a max of 2 * MAXVARLEN + 8. - */ - if (c == ':') { - /* - * if the :g modifier is followed by a newline, then error right away! - * -strike - */ - - int gmodflag = 0, amodflag = 0; - - do { - *np++ = c, c = getC(DOEXCL); - if (c == 'g' || c == 'a') { - if (c == 'g') - gmodflag++; - else - amodflag++; - *np++ = c; c = getC(DOEXCL); - } - if ((c == 'g' && !gmodflag) || (c == 'a' && !amodflag)) { - if (c == 'g') - gmodflag++; - else - amodflag++; - *np++ = c; c = getC(DOEXCL); - } - *np++ = c; - /* scan s// [eichin:19910926.0512EST] */ - if (c == 's') { - int delimcnt = 2; - int delim = getC(0); - *np++ = delim; - - if (!delim || letter(delim) - || Isdigit(delim) || any(" \t\n", delim)) { - seterror(ERR_BADSUBST); - break; - } - while ((c = getC(0)) != (-1)) { - *np++ = c; - if(c == delim) delimcnt--; - if(!delimcnt) break; - } - if(delimcnt) { - seterror(ERR_BADSUBST); - break; - } - c = 's'; - } - if (!any("htrqxes", c)) { - if ((amodflag || gmodflag) && c == '\n') - stderror(ERR_VARSYN); /* strike */ - seterror(ERR_VARMOD, c); - *np = 0; - addla(name); - return; - } - } - while ((c = getC(DOEXCL)) == ':'); - ungetD(c); - } - else - ungetD(c); - if (sc == '{') { - c = getC(DOEXCL); - if (c != '}') { - ungetD(c); - seterror(ERR_MISSING, '}'); - *np = 0; - addla(name); - return; - } - *np++ = c; - } - *np = 0; - addla(name); - return; -} - -void -addla(cp) - Char *cp; -{ - Char buf[BUFSIZ]; - - if (Strlen(cp) + (lap ? Strlen(lap) : 0) >= - (sizeof(labuf) - 4) / sizeof(Char)) { - seterror(ERR_EXPOVFL); - return; - } - if (lap) - (void) Strcpy(buf, lap); - (void) Strcpy(labuf, cp); - if (lap) - (void) Strcat(labuf, buf); - lap = labuf; -} - -static Char lhsb[32]; -static Char slhs[32]; -static Char rhsb[64]; -static int quesarg; - -static void -getexcl(sc) - int sc; -{ - struct wordent *hp, *ip; - int left, right, dol; - int c; - - if (sc == 0) { - sc = getC(0); - if (sc != '{') { - ungetC(sc); - sc = 0; - } - } - quesarg = -1; - lastev = eventno; - hp = gethent(sc); - if (hp == 0) - return; - hadhist = 1; - dol = 0; - if (hp == alhistp) - for (ip = hp->next->next; ip != alhistt; ip = ip->next) - dol++; - else - for (ip = hp->next->next; ip != hp->prev; ip = ip->next) - dol++; - left = 0, right = dol; - if (sc == HISTSUB) { - ungetC('s'), unreadc(HISTSUB), c = ':'; - goto subst; - } - c = getC(0); - if (!any(":^$*-%", c)) - goto subst; - left = right = -1; - if (c == ':') { - c = getC(0); - unreadc(c); - if (letter(c) || c == '&') { - c = ':'; - left = 0, right = dol; - goto subst; - } - } - else - ungetC(c); - if (!getsel(&left, &right, dol)) - return; - c = getC(0); - if (c == '*') - ungetC(c), c = '-'; - if (c == '-') { - if (!getsel(&left, &right, dol)) - return; - c = getC(0); - } -subst: - exclc = right - left + 1; - while (--left >= 0) - hp = hp->next; - if (sc == HISTSUB || c == ':') { - do { - hp = getsub(hp); - c = getC(0); - } while (c == ':'); - } - unreadc(c); - if (sc == '{') { - c = getC(0); - if (c != '}') - seterror(ERR_BADBANG); - } - exclnxt = hp; -} - -static struct wordent * -getsub(en) - struct wordent *en; -{ - Char *cp; - int delim; - int c; - int sc; - bool global; - Char orhsb[sizeof(rhsb) / sizeof(Char)]; - - do { - exclnxt = 0; - global = 0; - sc = c = getC(0); - if (c == 'g' || c == 'a') { - global |= (c == 'g') ? 1 : 2; - sc = c = getC(0); - } - if (((c =='g') && !(global & 1)) || ((c == 'a') && !(global & 2))) { - global |= (c == 'g') ? 1 : 2; - sc = c = getC(0); - } - - switch (c) { - case 'p': - justpr++; - return (en); - - case 'x': - case 'q': - global |= 1; - - /* fall into ... */ - - case 'h': - case 'r': - case 't': - case 'e': - break; - - case '&': - if (slhs[0] == 0) { - seterror(ERR_NOSUBST); - return (en); - } - (void) Strcpy(lhsb, slhs); - break; - -#ifdef notdef - case '~': - if (lhsb[0] == 0) - goto badlhs; - break; -#endif - - case 's': - delim = getC(0); - if (letter(delim) || Isdigit(delim) || any(" \t\n", delim)) { - unreadc(delim); - lhsb[0] = 0; - seterror(ERR_BADSUBST); - return (en); - } - cp = lhsb; - for (;;) { - c = getC(0); - if (c == '\n') { - unreadc(c); - break; - } - if (c == delim) - break; - if (cp > &lhsb[sizeof(lhsb) / sizeof(Char) - 2]) { - lhsb[0] = 0; - seterror(ERR_BADSUBST); - return (en); - } - if (c == '\\') { - c = getC(0); - if (c != delim && c != '\\') - *cp++ = '\\'; - } - *cp++ = c; - } - if (cp != lhsb) - *cp++ = 0; - else if (lhsb[0] == 0) { - seterror(ERR_LHS); - return (en); - } - cp = rhsb; - (void) Strcpy(orhsb, cp); - for (;;) { - c = getC(0); - if (c == '\n') { - unreadc(c); - break; - } - if (c == delim) - break; -#ifdef notdef - if (c == '~') { - if (&cp[Strlen(orhsb)] > &rhsb[sizeof(rhsb) / - sizeof(Char) - 2]) - goto toorhs; - (void) Strcpy(cp, orhsb); - cp = Strend(cp); - continue; - } -#endif - if (cp > &rhsb[sizeof(rhsb) / sizeof(Char) - 2]) { - seterror(ERR_RHSLONG); - return (en); - } - if (c == '\\') { - c = getC(0); - if (c != delim /* && c != '~' */ ) - *cp++ = '\\'; - } - *cp++ = c; - } - *cp++ = 0; - break; - - default: - if (c == '\n') - unreadc(c); - seterror(ERR_BADBANGMOD, c); - return (en); - } - (void) Strcpy(slhs, lhsb); - if (exclc) - en = dosub(sc, en, global); - } - while ((c = getC(0)) == ':'); - unreadc(c); - return (en); -} - -static struct wordent * -dosub(sc, en, global) - int sc; - struct wordent *en; - bool global; -{ - struct wordent lexi; - bool didsub = 0, didone = 0; - struct wordent *hp = &lexi; - struct wordent *wdp; - int i = exclc; - - wdp = hp; - while (--i >= 0) { - struct wordent *new = - (struct wordent *) xcalloc(1, sizeof *wdp); - - new->word = 0; - new->prev = wdp; - new->next = hp; - wdp->next = new; - wdp = new; - en = en->next; - if (en->word) { - Char *tword, *otword; - - if ((global & 1) || didsub == 0) { - tword = subword(en->word, sc, &didone); - if (didone) - didsub = 1; - if (global & 2) { - while (didone && tword != STRNULL) { - otword = tword; - tword = subword(otword, sc, &didone); - if (Strcmp(tword, otword) == 0) { - xfree((ptr_t) otword); - break; - } - else - xfree((ptr_t) otword); - } - } - } - else - tword = Strsave(en->word); - wdp->word = tword; - } - } - if (didsub == 0) - seterror(ERR_MODFAIL); - hp->prev = wdp; - return (&enthist(-1000, &lexi, 0)->Hlex); -} - -static Char * -subword(cp, type, adid) - Char *cp; - int type; - bool *adid; -{ - Char wbuf[BUFSIZ]; - Char *wp, *mp, *np; - int i; - - *adid = 0; - switch (type) { - - case 'r': - case 'e': - case 'h': - case 't': - case 'q': - case 'x': - wp = domod(cp, type); - if (wp == 0) - return (Strsave(cp)); - *adid = 1; - return (wp); - - default: - wp = wbuf; - i = BUFSIZ - 4; - for (mp = cp; *mp; mp++) - if (matchs(mp, lhsb)) { - for (np = cp; np < mp;) - *wp++ = *np++, --i; - for (np = rhsb; *np; np++) - switch (*np) { - - case '\\': - if (np[1] == '&') - np++; - /* fall into ... */ - - default: - if (--i < 0) { - seterror(ERR_SUBOVFL); - return (STRNULL); - } - *wp++ = *np; - continue; - - case '&': - i -= Strlen(lhsb); - if (i < 0) { - seterror(ERR_SUBOVFL); - return (STRNULL); - } - *wp = 0; - (void) Strcat(wp, lhsb); - wp = Strend(wp); - continue; - } - mp += Strlen(lhsb); - i -= Strlen(mp); - if (i < 0) { - seterror(ERR_SUBOVFL); - return (STRNULL); - } - *wp = 0; - (void) Strcat(wp, mp); - *adid = 1; - return (Strsave(wbuf)); - } - return (Strsave(cp)); - } -} - -Char * -domod(cp, type) - Char *cp; - int type; -{ - Char *wp, *xp; - int c; - - switch (type) { - - case 'x': - case 'q': - wp = Strsave(cp); - for (xp = wp; (c = *xp) != '\0'; xp++) - if ((c != ' ' && c != '\t') || type == 'q') - *xp |= QUOTE; - return (wp); - - case 'h': - case 't': - if (!any(short2str(cp), '/')) - return (type == 't' ? Strsave(cp) : 0); - wp = Strend(cp); - while (*--wp != '/') - continue; - if (type == 'h') - xp = Strsave(cp), xp[wp - cp] = 0; - else - xp = Strsave(wp + 1); - return (xp); - - case 'e': - case 'r': - wp = Strend(cp); - for (wp--; wp >= cp && *wp != '/'; wp--) - if (*wp == '.') { - if (type == 'e') - xp = Strsave(wp + 1); - else - xp = Strsave(cp), xp[wp - cp] = 0; - return (xp); - } - return (Strsave(type == 'e' ? STRNULL : cp)); - default: - break; - } - return (0); -} - -static int -matchs(str, pat) - Char *str, *pat; -{ - while (*str && *pat && *str == *pat) - str++, pat++; - return (*pat == 0); -} - -static int -getsel(al, ar, dol) - int *al, *ar; - int dol; -{ - int c = getC(0); - int i; - bool first = *al < 0; - - switch (c) { - - case '%': - if (quesarg == -1) { - seterror(ERR_BADBANGARG); - return (0); - } - if (*al < 0) - *al = quesarg; - *ar = quesarg; - break; - - case '-': - if (*al < 0) { - *al = 0; - *ar = dol - 1; - unreadc(c); - } - return (1); - - case '^': - if (*al < 0) - *al = 1; - *ar = 1; - break; - - case '$': - if (*al < 0) - *al = dol; - *ar = dol; - break; - - case '*': - if (*al < 0) - *al = 1; - *ar = dol; - if (*ar < *al) { - *ar = 0; - *al = 1; - return (1); - } - break; - - default: - if (Isdigit(c)) { - i = 0; - while (Isdigit(c)) { - i = i * 10 + c - '0'; - c = getC(0); - } - if (i < 0) - i = dol + 1; - if (*al < 0) - *al = i; - *ar = i; - } - else if (*al < 0) - *al = 0, *ar = dol; - else - *ar = dol - 1; - unreadc(c); - break; - } - if (first) { - c = getC(0); - unreadc(c); - if (any("-$*", c)) - return (1); - } - if (*al > *ar || *ar > dol) { - seterror(ERR_BADBANGARG); - return (0); - } - return (1); - -} - -static struct wordent * -gethent(sc) - int sc; -{ - struct Hist *hp; - Char *np; - int c; - int event; - bool back = 0; - - c = sc == HISTSUB ? HIST : getC(0); - if (c == HIST) { - if (alhistp) - return (alhistp); - event = eventno; - } - else - switch (c) { - - case ':': - case '^': - case '$': - case '*': - case '%': - ungetC(c); - if (lastev == eventno && alhistp) - return (alhistp); - event = lastev; - break; - - case '#': /* !# is command being typed in (mrh) */ - if (--hleft == 0) { - seterror(ERR_HISTLOOP); - return (0); - } - else - return (¶ml); - /* NOTREACHED */ - - case '-': - back = 1; - c = getC(0); - /* FALLTHROUGH */ - - default: - if (any("(=~", c)) { - unreadc(c); - ungetC(HIST); - return (0); - } - np = lhsb; - event = 0; - while (!cmap(c, _ESC | _META | _QF | _QB) && !any("^$*-%{}:", c)) { - if (event != -1 && Isdigit(c)) - event = event * 10 + c - '0'; - else - event = -1; - if (np < &lhsb[sizeof(lhsb) / sizeof(Char) - 2]) - *np++ = c; - c = getC(0); - } - unreadc(c); - if (np == lhsb) { - ungetC(HIST); - return (0); - } - *np++ = 0; - if (event != -1) { - /* - * History had only digits - */ - if (back) - event = eventno + (alhistp == 0) - (event ? event : 0); - break; - } - hp = findev(lhsb, 0); - if (hp) - lastev = hp->Hnum; - return (&hp->Hlex); - - case '?': - np = lhsb; - for (;;) { - c = getC(0); - if (c == '\n') { - unreadc(c); - break; - } - if (c == '?') - break; - if (np < &lhsb[sizeof(lhsb) / sizeof(Char) - 2]) - *np++ = c; - } - if (np == lhsb) { - if (lhsb[0] == 0) { - seterror(ERR_NOSEARCH); - return (0); - } - } - else - *np++ = 0; - hp = findev(lhsb, 1); - if (hp) - lastev = hp->Hnum; - return (&hp->Hlex); - } - - for (hp = Histlist.Hnext; hp; hp = hp->Hnext) - if (hp->Hnum == event) { - hp->Href = eventno; - lastev = hp->Hnum; - return (&hp->Hlex); - } - np = putn(event); - seterror(ERR_NOEVENT, vis_str(np)); - return (0); -} - -static struct Hist * -findev(cp, anyarg) - Char *cp; - bool anyarg; -{ - struct Hist *hp; - - for (hp = Histlist.Hnext; hp; hp = hp->Hnext) { - Char *dp; - Char *p, *q; - struct wordent *lp = hp->Hlex.next; - int argno = 0; - - /* - * The entries added by alias substitution don't have a newline but do - * have a negative event number. Savehist() trims off these entries, - * but it happens before alias expansion, too early to delete those - * from the previous command. - */ - if (hp->Hnum < 0) - continue; - if (lp->word[0] == '\n') - continue; - if (!anyarg) { - p = cp; - q = lp->word; - do - if (!*p) - return (hp); - while (*p++ == *q++); - continue; - } - do { - for (dp = lp->word; *dp; dp++) { - p = cp; - q = dp; - do - if (!*p) { - quesarg = argno; - return (hp); - } - while (*p++ == *q++); - } - lp = lp->next; - argno++; - } while (lp->word[0] != '\n'); - } - seterror(ERR_NOEVENT, vis_str(cp)); - return (0); -} - - -static void -setexclp(cp) - Char *cp; -{ - if (cp && cp[0] == '\n') - return; - exclp = cp; -} - -void -unreadc(c) - int c; -{ - peekread = c; -} - -int -readc(wanteof) - bool wanteof; -{ - int c; - static int sincereal; - - aret = F_SEEK; - if ((c = peekread) != '\0') { - peekread = 0; - return (c); - } -top: - aret = F_SEEK; - if (alvecp) { - aret = A_SEEK; - if ((c = *alvecp++) != '\0') - return (c); - if (alvec && *alvec) { - alvecp = *alvec++; - return (' '); - } - else { - aret = F_SEEK; - alvecp = NULL; - return('\n'); - } - } - if (alvec) { - if ((alvecp = *alvec) != '\0') { - alvec++; - goto top; - } - /* Infinite source! */ - return ('\n'); - } - if (evalp) { - aret = E_SEEK; - if ((c = *evalp++) != '\0') - return (c); - if (evalvec && *evalvec) { - evalp = *evalvec++; - return (' '); - } - aret = F_SEEK; - evalp = 0; - } - if (evalvec) { - if (evalvec == (Char **) 1) { - doneinp = 1; - reset(); - } - if ((evalp = *evalvec) != '\0') { - evalvec++; - goto top; - } - evalvec = (Char **) 1; - return ('\n'); - } - do { - if (arginp == (Char *) 1 || onelflg == 1) { - if (wanteof) - return (-1); - exitstat(); - } - if (arginp) { - if ((c = *arginp++) == 0) { - arginp = (Char *) 1; - return ('\n'); - } - return (c); - } -reread: - c = bgetc(); - if (c < 0) { - struct termios tty; - if (wanteof) - return (-1); - /* was isatty but raw with ignoreeof yields problems */ - if (tcgetattr(SHIN, &tty) == 0 && (tty.c_lflag & ICANON)) - { - /* was 'short' for FILEC */ - int ctpgrp; - - if (++sincereal > 25) - goto oops; - if (tpgrp != -1 && - (ctpgrp = tcgetpgrp(FSHTTY)) != -1 && - tpgrp != ctpgrp) { - (void) tcsetpgrp(FSHTTY, tpgrp); - (void) killpg((pid_t) ctpgrp, SIGHUP); - (void) fprintf(csherr, "Reset tty pgrp from %d to %d\n", - ctpgrp, tpgrp); - goto reread; - } - if (adrof(STRignoreeof)) { - if (loginsh) - (void) fprintf(csherr,"\nUse \"logout\" to logout.\n"); - else - (void) fprintf(csherr,"\nUse \"exit\" to leave csh.\n"); - reset(); - } - if (chkstop == 0) - panystop(1); - } - oops: - doneinp = 1; - reset(); - } - sincereal = 0; - if (c == '\n' && onelflg) - onelflg--; - } while (c == 0); - return (c); -} - -static int -bgetc() -{ - int buf, off, c; - -#ifdef FILEC - int numleft = 0, roomleft; - Char ttyline[BUFSIZ]; -#endif - char tbuf[BUFSIZ + 1]; - - if (cantell) { - if (fseekp < fbobp || fseekp > feobp) { - fbobp = feobp = fseekp; - (void) lseek(SHIN, fseekp, L_SET); - } - if (fseekp == feobp) { - int i; - - fbobp = feobp; - do - c = read(SHIN, tbuf, BUFSIZ); - while (c < 0 && errno == EINTR); - if (c <= 0) - return (-1); - for (i = 0; i < c; i++) - fbuf[0][i] = (unsigned char) tbuf[i]; - feobp += c; - } - c = fbuf[0][fseekp - fbobp]; - fseekp++; - return (c); - } - -again: - buf = (int) fseekp / BUFSIZ; - if (buf >= fblocks) { - Char **nfbuf = - (Char **) xcalloc((size_t) (fblocks + 2), - sizeof(Char **)); - - if (fbuf) { - (void) blkcpy(nfbuf, fbuf); - xfree((ptr_t) fbuf); - } - fbuf = nfbuf; - fbuf[fblocks] = (Char *) xcalloc(BUFSIZ, sizeof(Char)); - fblocks++; - if (!intty) - goto again; - } - if (fseekp >= feobp) { - buf = (int) feobp / BUFSIZ; - off = (int) feobp % BUFSIZ; - roomleft = BUFSIZ - off; - -#ifdef FILEC - roomleft = BUFSIZ - off; - for (;;) { - if (filec && intty) { - c = numleft ? numleft : tenex(ttyline, BUFSIZ); - if (c > roomleft) { - /* start with fresh buffer */ - feobp = fseekp = fblocks * BUFSIZ; - numleft = c; - goto again; - } - if (c > 0) - memmove(fbuf[buf] + off, ttyline, c * sizeof(Char)); - numleft = 0; - } - else { -#endif - c = read(SHIN, tbuf, roomleft); - if (c > 0) { - int i; - Char *ptr = fbuf[buf] + off; - - for (i = 0; i < c; i++) - ptr[i] = (unsigned char) tbuf[i]; - } -#ifdef FILEC - } -#endif - if (c >= 0) - break; - if (errno == EWOULDBLOCK) { - int off = 0; - - (void) ioctl(SHIN, FIONBIO, (ioctl_t) & off); - } - else if (errno != EINTR) - break; - } - if (c <= 0) - return (-1); - feobp += c; -#ifndef FILEC - goto again; -#else - if (filec && !intty) - goto again; -#endif - } - c = fbuf[buf][(int) fseekp % BUFSIZ]; - fseekp++; - return (c); -} - -static void -bfree() -{ - int sb, i; - - if (cantell) - return; - if (whyles) - return; - sb = (int) (fseekp - 1) / BUFSIZ; - if (sb > 0) { - for (i = 0; i < sb; i++) - xfree((ptr_t) fbuf[i]); - (void) blkcpy(fbuf, &fbuf[sb]); - fseekp -= BUFSIZ * sb; - feobp -= BUFSIZ * sb; - fblocks -= sb; - } -} - -void -bseek(l) - struct Ain *l; -{ - switch (aret = l->type) { - case E_SEEK: - evalvec = l->a_seek; - evalp = l->c_seek; - return; - case A_SEEK: - alvec = l->a_seek; - alvecp = l->c_seek; - return; - case F_SEEK: - fseekp = l->f_seek; - return; - default: - (void) fprintf(csherr, "Bad seek type %d\n", aret); - abort(); - } -} - -void -btell(l) - struct Ain *l; -{ - switch (l->type = aret) { - case E_SEEK: - l->a_seek = evalvec; - l->c_seek = evalp; - return; - case A_SEEK: - l->a_seek = alvec; - l->c_seek = alvecp; - return; - case F_SEEK: - l->f_seek = fseekp; - l->a_seek = NULL; - return; - default: - (void) fprintf(csherr, "Bad seek type %d\n", aret); - abort(); - } -} - -void -btoeof() -{ - (void) lseek(SHIN, (off_t) 0, L_XTND); - aret = F_SEEK; - fseekp = feobp; - alvec = NULL; - alvecp = NULL; - evalvec = NULL; - evalp = NULL; - wfree(); - bfree(); -} - -void -settell() -{ - cantell = 0; - if (arginp || onelflg || intty) - return; - if (lseek(SHIN, (off_t) 0, L_INCR) < 0 || errno == ESPIPE) - return; - fbuf = (Char **) xcalloc(2, sizeof(Char **)); - fblocks = 1; - fbuf[0] = (Char *) xcalloc(BUFSIZ, sizeof(Char)); - fseekp = fbobp = feobp = lseek(SHIN, (off_t) 0, L_INCR); - cantell = 1; -} diff --git a/bin/csh/misc.c b/bin/csh/misc.c deleted file mode 100644 index 56491d1..0000000 --- a/bin/csh/misc.c +++ /dev/null @@ -1,424 +0,0 @@ -/*- - * Copyright (c) 1980, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -#if 0 -static char sccsid[] = "@(#)misc.c 8.1 (Berkeley) 5/31/93"; -#else -static const char rcsid[] = - "$FreeBSD$"; -#endif -#endif /* not lint */ - -#include <sys/param.h> -#include <unistd.h> -#if __STDC__ -# include <stdarg.h> -#else -# include <varargs.h> -#endif - -#include "csh.h" -#include "extern.h" - -static int renum __P((int, int)); - -int -any(s, c) - char *s; - int c; -{ - if (!s) - return (0); /* Check for nil pointer */ - while (*s) - if (*s++ == c) - return (1); - return (0); -} - -void -setzero(cp, i) - char *cp; - int i; -{ - if (i != 0) - do - *cp++ = 0; - while (--i); -} - -char * -strsave(s) - char *s; -{ - char *n; - char *p; - - if (s == NULL) - s = ""; - for (p = s; *p++;) - continue; - n = p = (char *) xmalloc((size_t) ((p - s) * sizeof(char))); - while ((*p++ = *s++) != '\0') - continue; - return (n); -} - -Char ** -blkend(up) - Char **up; -{ - - while (*up) - up++; - return (up); -} - - -void -blkpr(fp, av) - FILE *fp; - Char **av; -{ - - for (; *av; av++) { - (void) fprintf(fp, "%s", vis_str(*av)); - if (av[1]) - (void) fprintf(fp, " "); - } -} - -int -blklen(av) - Char **av; -{ - int i = 0; - - while (*av++) - i++; - return (i); -} - -Char ** -blkcpy(oav, bv) - Char **oav; - Char **bv; -{ - Char **av = oav; - - while ((*av++ = *bv++) != NULL) - continue; - return (oav); -} - -Char ** -blkcat(up, vp) - Char **up, **vp; -{ - - (void) blkcpy(blkend(up), vp); - return (up); -} - -void -blkfree(av0) - Char **av0; -{ - Char **av = av0; - - if (!av0) - return; - for (; *av; av++) - xfree((ptr_t) * av); - xfree((ptr_t) av0); -} - -Char ** -saveblk(v) - Char **v; -{ - Char **newv = - (Char **) xcalloc((size_t) (blklen(v) + 1), sizeof(Char **)); - Char **onewv = newv; - - while (*v) - *newv++ = Strsave(*v++); - return (onewv); -} - -#ifdef NOTUSED -char * -strstr(s, t) - char *s, *t; -{ - do { - char *ss = s; - char *tt = t; - - do - if (*tt == '\0') - return (s); - while (*ss++ == *tt++); - } while (*s++ != '\0'); - return (NULL); -} - -#endif /* NOTUSED */ - -#ifndef SHORT_STRINGS -char * -strspl(cp, dp) - char *cp, *dp; -{ - char *ep; - char *p, *q; - - if (!cp) - cp = ""; - if (!dp) - dp = ""; - for (p = cp; *p++;) - continue; - for (q = dp; *q++;) - continue; - ep = (char *) xmalloc((size_t) (((p - cp) + (q - dp) - 1) * sizeof(char))); - for (p = ep, q = cp; *p++ = *q++;) - continue; - for (p--, q = dp; *p++ = *q++;) - continue; - return (ep); -} - -#endif - -Char ** -blkspl(up, vp) - Char **up, **vp; -{ - Char **wp = - (Char **) xcalloc((size_t) (blklen(up) + blklen(vp) + 1), - sizeof(Char **)); - - (void) blkcpy(wp, up); - return (blkcat(wp, vp)); -} - -Char -lastchr(cp) - Char *cp; -{ - - if (!cp) - return (0); - if (!*cp) - return (0); - while (cp[1]) - cp++; - return (*cp); -} - -/* - * This routine is called after an error to close up - * any units which may have been left open accidentally. - */ -void -closem() -{ - int f, flimit; - - for (f = 0, flimit = getdtablesize(); f < flimit; f++) - if (f != SHIN && f != SHOUT && f != SHERR && f != OLDSTD && - f != FSHTTY) - (void) close(f); -} - -void -donefds() -{ - (void) close(0); - (void) close(1); - (void) close(2); - - didfds = 0; -} - -/* - * Move descriptor i to j. - * If j is -1 then we just want to get i to a safe place, - * i.e. to a unit > 2. This also happens in dcopy. - */ -int -dmove(i, j) - int i, j; -{ - - if (i == j || i < 0) - return (i); - if (j >= 0) { - (void) dup2(i, j); - if (j != i) - (void) close(i); - return (j); - } - j = dcopy(i, j); - if (j != i) - (void) close(i); - return (j); -} - -int -dcopy(i, j) - int i, j; -{ - - if (i == j || i < 0 || (j < 0 && i > 2)) - return (i); - if (j >= 0) { - (void) dup2(i, j); - return (j); - } - (void) close(j); - return (renum(i, j)); -} - -static int -renum(i, j) - int i, j; -{ - int k = dup(i); - - if (k < 0) - return (-1); - if (j == -1 && k > 2) - return (k); - if (k != j) { - j = renum(k, j); - (void) close(k); - return (j); - } - return (k); -} - -/* - * Left shift a command argument list, discarding - * the first c arguments. Used in "shift" commands - * as well as by commands like "repeat". - */ -void -lshift(v, c) - Char **v; - int c; -{ - Char **u; - - for (u = v; *u && --c >= 0; u++) - xfree((ptr_t) *u); - (void) blkcpy(v, u); -} - -int -number(cp) - Char *cp; -{ - if (!cp) - return(0); - if (*cp == '-') { - cp++; - if (!Isdigit(*cp)) - return (0); - cp++; - } - while (*cp && Isdigit(*cp)) - cp++; - return (*cp == 0); -} - -Char ** -copyblk(v) - Char **v; -{ - Char **nv = (Char **) xcalloc((size_t) (blklen(v) + 1), sizeof(Char **)); - - return (blkcpy(nv, v)); -} - -#ifndef SHORT_STRINGS -char * -strend(cp) - char *cp; -{ - if (!cp) - return (cp); - while (*cp) - cp++; - return (cp); -} - -#endif /* SHORT_STRINGS */ - -Char * -strip(cp) - Char *cp; -{ - Char *dp = cp; - - if (!cp) - return (cp); - while ((*dp++ &= TRIM) != '\0') - continue; - return (cp); -} - -void -udvar(name) - Char *name; -{ - - setname(vis_str(name)); - stderror(ERR_NAME | ERR_UNDVAR); -} - -int -prefix(sub, str) - Char *sub, *str; -{ - - for (;;) { - if (*sub == 0) - return (1); - if (*str == 0) - return (0); - if (*sub++ != *str++) - return (0); - } -} diff --git a/bin/csh/parse.c b/bin/csh/parse.c deleted file mode 100644 index 4cb2fcf..0000000 --- a/bin/csh/parse.c +++ /dev/null @@ -1,702 +0,0 @@ -/*- - * Copyright (c) 1980, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -#if 0 -static char sccsid[] = "@(#)parse.c 8.1 (Berkeley) 5/31/93"; -#else -static const char rcsid[] = - "$FreeBSD$"; -#endif -#endif /* not lint */ - -#include <sys/types.h> -#include <string.h> -#if __STDC__ -# include <stdarg.h> -#else -# include <varargs.h> -#endif - -#include "csh.h" -#include "extern.h" - -static void asyntax __P((struct wordent *, struct wordent *)); -static void asyn0 __P((struct wordent *, struct wordent *)); -static void asyn3 __P((struct wordent *, struct wordent *)); -static struct wordent - *freenod __P((struct wordent *, struct wordent *)); -static struct command - *syn0 __P((struct wordent *, struct wordent *, int)); -static struct command - *syn1 __P((struct wordent *, struct wordent *, int)); -static struct command - *syn1a __P((struct wordent *, struct wordent *, int)); -static struct command - *syn1b __P((struct wordent *, struct wordent *, int)); -static struct command - *syn2 __P((struct wordent *, struct wordent *, int)); -static struct command - *syn3 __P((struct wordent *, struct wordent *, int)); - -#define ALEFT 21 /* max of 20 alias expansions */ -#define HLEFT 11 /* max of 10 history expansions */ -/* - * Perform aliasing on the word list lex - * Do a (very rudimentary) parse to separate into commands. - * If word 0 of a command has an alias, do it. - * Repeat a maximum of 20 times. - */ -static int aleft; -extern int hleft; -void -alias(lex) - struct wordent *lex; -{ - jmp_buf osetexit; - - aleft = ALEFT; - hleft = HLEFT; - getexit(osetexit); - (void) setexit(); - if (haderr) { - resexit(osetexit); - reset(); - } - if (--aleft == 0) - stderror(ERR_ALIASLOOP); - asyntax(lex->next, lex); - resexit(osetexit); -} - -static void -asyntax(p1, p2) - struct wordent *p1, *p2; -{ - while (p1 != p2) - if (any(";&\n", p1->word[0])) - p1 = p1->next; - else { - asyn0(p1, p2); - return; - } -} - -static void -asyn0(p1, p2) - struct wordent *p1; - struct wordent *p2; -{ - struct wordent *p; - int l = 0; - - for (p = p1; p != p2; p = p->next) - switch (p->word[0]) { - - case '(': - l++; - continue; - - case ')': - l--; - if (l < 0) - stderror(ERR_TOOMANYRP); - continue; - - case '>': - if (p->next != p2 && eq(p->next->word, STRand)) - p = p->next; - continue; - - case '&': - case '|': - case ';': - case '\n': - if (l != 0) - continue; - asyn3(p1, p); - asyntax(p->next, p2); - return; - } - if (l == 0) - asyn3(p1, p2); -} - -static void -asyn3(p1, p2) - struct wordent *p1; - struct wordent *p2; -{ - struct varent *ap; - struct wordent alout; - bool redid; - - if (p1 == p2) - return; - if (p1->word[0] == '(') { - for (p2 = p2->prev; p2->word[0] != ')'; p2 = p2->prev) - if (p2 == p1) - return; - if (p2 == p1->next) - return; - asyn0(p1->next, p2); - return; - } - ap = adrof1(p1->word, &aliases); - if (ap == 0) - return; - alhistp = p1->prev; - alhistt = p2; - alvec = ap->vec; - redid = lex(&alout); - alhistp = alhistt = 0; - alvec = 0; - if (seterr) { - freelex(&alout); - stderror(ERR_OLD); - } - if (p1->word[0] && eq(p1->word, alout.next->word)) { - Char *cp = alout.next->word; - - alout.next->word = Strspl(STRQNULL, cp); - xfree((ptr_t) cp); - } - p1 = freenod(p1, redid ? p2 : p1->next); - if (alout.next != &alout) { - p1->next->prev = alout.prev->prev; - alout.prev->prev->next = p1->next; - alout.next->prev = p1; - p1->next = alout.next; - xfree((ptr_t) alout.prev->word); - xfree((ptr_t) (alout.prev)); - } - reset(); /* throw! */ -} - -static struct wordent * -freenod(p1, p2) - struct wordent *p1, *p2; -{ - struct wordent *retp = p1->prev; - - while (p1 != p2) { - xfree((ptr_t) p1->word); - p1 = p1->next; - xfree((ptr_t) (p1->prev)); - } - retp->next = p2; - p2->prev = retp; - return (retp); -} - -#define PHERE 1 -#define PIN 2 -#define POUT 4 -#define PERR 8 - -/* - * syntax - * empty - * syn0 - */ -struct command * -syntax(p1, p2, flags) - struct wordent *p1, *p2; - int flags; -{ - - while (p1 != p2) - if (any(";&\n", p1->word[0])) - p1 = p1->next; - else - return (syn0(p1, p2, flags)); - return (0); -} - -/* - * syn0 - * syn1 - * syn1 & syntax - */ -static struct command * -syn0(p1, p2, flags) - struct wordent *p1, *p2; - int flags; -{ - struct wordent *p; - struct command *t, *t1; - int l; - - l = 0; - for (p = p1; p != p2; p = p->next) - switch (p->word[0]) { - - case '(': - l++; - continue; - - case ')': - l--; - if (l < 0) - seterror(ERR_TOOMANYRP); - continue; - - case '|': - if (p->word[1] == '|') - continue; - /* fall into ... */ - - case '>': - if (p->next != p2 && eq(p->next->word, STRand)) - p = p->next; - continue; - - case '&': - if (l != 0) - break; - if (p->word[1] == '&') - continue; - t1 = syn1(p1, p, flags); - if (t1->t_dtyp == NODE_LIST || - t1->t_dtyp == NODE_AND || - t1->t_dtyp == NODE_OR) { - t = (struct command *) xcalloc(1, sizeof(*t)); - t->t_dtyp = NODE_PAREN; - t->t_dflg = F_AMPERSAND | F_NOINTERRUPT; - t->t_dspr = t1; - t1 = t; - } - else - t1->t_dflg |= F_AMPERSAND | F_NOINTERRUPT; - t = (struct command *) xcalloc(1, sizeof(*t)); - t->t_dtyp = NODE_LIST; - t->t_dflg = 0; - t->t_dcar = t1; - t->t_dcdr = syntax(p, p2, flags); - return (t); - } - if (l == 0) - return (syn1(p1, p2, flags)); - seterror(ERR_TOOMANYLP); - return (0); -} - -/* - * syn1 - * syn1a - * syn1a ; syntax - */ -static struct command * -syn1(p1, p2, flags) - struct wordent *p1, *p2; - int flags; -{ - struct wordent *p; - struct command *t; - int l; - - l = 0; - for (p = p1; p != p2; p = p->next) - switch (p->word[0]) { - - case '(': - l++; - continue; - - case ')': - l--; - continue; - - case ';': - case '\n': - if (l != 0) - break; - t = (struct command *) xcalloc(1, sizeof(*t)); - t->t_dtyp = NODE_LIST; - t->t_dcar = syn1a(p1, p, flags); - t->t_dcdr = syntax(p->next, p2, flags); - if (t->t_dcdr == 0) - t->t_dcdr = t->t_dcar, t->t_dcar = 0; - return (t); - } - return (syn1a(p1, p2, flags)); -} - -/* - * syn1a - * syn1b - * syn1b || syn1a - */ -static struct command * -syn1a(p1, p2, flags) - struct wordent *p1, *p2; - int flags; -{ - struct wordent *p; - struct command *t; - int l = 0; - - for (p = p1; p != p2; p = p->next) - switch (p->word[0]) { - - case '(': - l++; - continue; - - case ')': - l--; - continue; - - case '|': - if (p->word[1] != '|') - continue; - if (l == 0) { - t = (struct command *) xcalloc(1, sizeof(*t)); - t->t_dtyp = NODE_OR; - t->t_dcar = syn1b(p1, p, flags); - t->t_dcdr = syn1a(p->next, p2, flags); - t->t_dflg = 0; - return (t); - } - continue; - } - return (syn1b(p1, p2, flags)); -} - -/* - * syn1b - * syn2 - * syn2 && syn1b - */ -static struct command * -syn1b(p1, p2, flags) - struct wordent *p1, *p2; - int flags; -{ - struct wordent *p; - struct command *t; - int l = 0; - - for (p = p1; p != p2; p = p->next) - switch (p->word[0]) { - - case '(': - l++; - continue; - - case ')': - l--; - continue; - - case '&': - if (p->word[1] == '&' && l == 0) { - t = (struct command *) xcalloc(1, sizeof(*t)); - t->t_dtyp = NODE_AND; - t->t_dcar = syn2(p1, p, flags); - t->t_dcdr = syn1b(p->next, p2, flags); - t->t_dflg = 0; - return (t); - } - continue; - } - return (syn2(p1, p2, flags)); -} - -/* - * syn2 - * syn3 - * syn3 | syn2 - * syn3 |& syn2 - */ -static struct command * -syn2(p1, p2, flags) - struct wordent *p1, *p2; - int flags; -{ - struct wordent *p, *pn; - struct command *t; - int l = 0; - int f; - - for (p = p1; p != p2; p = p->next) - switch (p->word[0]) { - - case '(': - l++; - continue; - - case ')': - l--; - continue; - - case '|': - if (l != 0) - continue; - t = (struct command *) xcalloc(1, sizeof(*t)); - f = flags | POUT; - pn = p->next; - if (pn != p2 && pn->word[0] == '&') { - f |= PERR; - t->t_dflg |= F_STDERR; - } - t->t_dtyp = NODE_PIPE; - t->t_dcar = syn3(p1, p, f); - if (pn != p2 && pn->word[0] == '&') - p = pn; - t->t_dcdr = syn2(p->next, p2, flags | PIN); - return (t); - } - return (syn3(p1, p2, flags)); -} - -static char RELPAR[] = {'<', '>', '(', ')', '\0'}; - -/* - * syn3 - * ( syn0 ) [ < in ] [ > out ] - * word word* [ < in ] [ > out ] - * KEYWORD ( word* ) word* [ < in ] [ > out ] - * - * KEYWORD = (@ exit foreach if set switch test while) - */ -static struct command * -syn3(p1, p2, flags) - struct wordent *p1, *p2; - int flags; -{ - struct wordent *p; - struct wordent *lp, *rp; - struct command *t; - int l; - Char **av; - int n, c; - bool specp = 0; - - if (p1 != p2) { - p = p1; -again: - switch (srchx(p->word)) { - - case T_ELSE: - p = p->next; - if (p != p2) - goto again; - break; - - case T_EXIT: - case T_FOREACH: - case T_IF: - case T_LET: - case T_SET: - case T_SWITCH: - case T_WHILE: - specp = 1; - break; - } - } - n = 0; - l = 0; - for (p = p1; p != p2; p = p->next) - switch (p->word[0]) { - - case '(': - if (specp) - n++; - l++; - continue; - - case ')': - if (specp) - n++; - l--; - continue; - - case '>': - case '<': - if (l != 0) { - if (specp) - n++; - continue; - } - if (p->next == p2) - continue; - if (any(RELPAR, p->next->word[0])) - continue; - n--; - continue; - - default: - if (!specp && l != 0) - continue; - n++; - continue; - } - if (n < 0) - n = 0; - t = (struct command *) xcalloc(1, sizeof(*t)); - av = (Char **) xcalloc((size_t) (n + 1), sizeof(Char **)); - t->t_dcom = av; - n = 0; - if (p2->word[0] == ')') - t->t_dflg = F_NOFORK; - lp = 0; - rp = 0; - l = 0; - for (p = p1; p != p2; p = p->next) { - c = p->word[0]; - switch (c) { - - case '(': - if (l == 0) { - if (lp != 0 && !specp) - seterror(ERR_BADPLP); - lp = p->next; - } - l++; - goto savep; - - case ')': - l--; - if (l == 0) - rp = p; - goto savep; - - case '>': - if (l != 0) - goto savep; - if (p->word[1] == '>') - t->t_dflg |= F_APPEND; - if (p->next != p2 && eq(p->next->word, STRand)) { - t->t_dflg |= F_STDERR, p = p->next; - if (flags & (POUT | PERR)) { - seterror(ERR_OUTRED); - continue; - } - } - if (p->next != p2 && eq(p->next->word, STRbang)) - t->t_dflg |= F_OVERWRITE, p = p->next; - if (p->next == p2) { - seterror(ERR_MISRED); - continue; - } - p = p->next; - if (any(RELPAR, p->word[0])) { - seterror(ERR_MISRED); - continue; - } - if ((flags & POUT) && ((flags & PERR) == 0 || t->t_drit)) - seterror(ERR_OUTRED); - else - t->t_drit = Strsave(p->word); - continue; - - case '<': - if (l != 0) - goto savep; - if (p->word[1] == '<') - t->t_dflg |= F_READ; - if (p->next == p2) { - seterror(ERR_MISRED); - continue; - } - p = p->next; - if (any(RELPAR, p->word[0])) { - seterror(ERR_MISRED); - continue; - } - if ((flags & PHERE) && (t->t_dflg & F_READ)) - seterror(ERR_REDPAR); - else if ((flags & PIN) || t->t_dlef) - seterror(ERR_INRED); - else - t->t_dlef = Strsave(p->word); - continue; - - savep: - if (!specp) - continue; - default: - if (l != 0 && !specp) - continue; - if (seterr == 0) - av[n] = Strsave(p->word); - n++; - continue; - } - } - if (lp != 0 && !specp) { - if (n != 0) - seterror(ERR_BADPLPS); - t->t_dtyp = NODE_PAREN; - t->t_dspr = syn0(lp, rp, PHERE); - } - else { - if (n == 0) - seterror(ERR_NULLCOM); - t->t_dtyp = NODE_COMMAND; - } - return (t); -} - -void -freesyn(t) - struct command *t; -{ - Char **v; - - if (t == 0) - return; - switch (t->t_dtyp) { - - case NODE_COMMAND: - for (v = t->t_dcom; *v; v++) - xfree((ptr_t) * v); - xfree((ptr_t) (t->t_dcom)); - xfree((ptr_t) t->t_dlef); - xfree((ptr_t) t->t_drit); - break; - case NODE_PAREN: - freesyn(t->t_dspr); - xfree((ptr_t) t->t_dlef); - xfree((ptr_t) t->t_drit); - break; - - case NODE_AND: - case NODE_OR: - case NODE_PIPE: - case NODE_LIST: - freesyn(t->t_dcar), freesyn(t->t_dcdr); - break; - } - xfree((ptr_t) t); -} diff --git a/bin/csh/pathnames.h b/bin/csh/pathnames.h deleted file mode 100644 index bcdb4ca..0000000 --- a/bin/csh/pathnames.h +++ /dev/null @@ -1,42 +0,0 @@ -/*- - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)pathnames.h 8.1 (Berkeley) 5/31/93 - * $FreeBSD$ - */ - -#define _PATH_BIN "/bin" -#define _PATH_DOTCSHRC "/etc/csh.cshrc" -#define _PATH_DOTLOGIN "/etc/csh.login" -#define _PATH_DOTLOGOUT "/etc/csh.logout" -#define _PATH_LOGIN "/usr/bin/login" -#define _PATH_USRBIN "/usr/bin" diff --git a/bin/csh/proc.c b/bin/csh/proc.c deleted file mode 100644 index a6631ec..0000000 --- a/bin/csh/proc.c +++ /dev/null @@ -1,1362 +0,0 @@ -/*- - * Copyright (c) 1980, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -#if 0 -static char sccsid[] = "@(#)proc.c 8.1 (Berkeley) 5/31/93"; -#else -static const char rcsid[] = - "$FreeBSD$"; -#endif -#endif /* not lint */ - -#include <sys/wait.h> -#include <errno.h> -#include <unistd.h> -#include <stdlib.h> -#include <string.h> -#if __STDC__ -# include <stdarg.h> -#else -# include <varargs.h> -#endif - -#include "csh.h" -#include "dir.h" -#include "proc.h" -#include "extern.h" - -#define BIGINDEX 9 /* largest desirable job index */ - -static struct rusage zru; - -static void pflushall __P((void)); -static void pflush __P((struct process *)); -static void pclrcurr __P((struct process *)); -static void padd __P((struct command *)); -static int pprint __P((struct process *, int)); -static void ptprint __P((struct process *)); -static void pads __P((Char *)); -static void pkill __P((Char **v, int)); -static struct process - *pgetcurr __P((struct process *)); -static void okpcntl __P((void)); - -/* - * pchild - called at interrupt level by the SIGCHLD signal - * indicating that at least one child has terminated or stopped - * thus at least one wait system call will definitely return a - * child's status. Top level routines (like pwait) must be sure - * to mask interrupts when playing with the proclist data structures! - */ -/* ARGUSED */ -void -pchild(notused) - int notused; -{ - struct process *pp; - struct process *fp; - int pid; - extern int insource; - int save_errno = errno; - union wait w; - int jobflags; - struct rusage ru; - -loop: - errno = 0; /* reset, just in case */ - pid = wait3(&w.w_status, - (setintr && (intty || insource) ? WNOHANG | WUNTRACED : WNOHANG), &ru); - - if (pid <= 0) { - if (errno == EINTR) { - errno = 0; - goto loop; - } - pnoprocesses = pid == -1; - errno = save_errno; - return; - } - for (pp = proclist.p_next; pp != NULL; pp = pp->p_next) - if (pid == pp->p_pid) - goto found; - goto loop; -found: - if (pid == atoi(short2str(value(STRchild)))) - unsetv(STRchild); - pp->p_flags &= ~(PRUNNING | PSTOPPED | PREPORTED); - if (WIFSTOPPED(w)) { - pp->p_flags |= PSTOPPED; - pp->p_reason = w.w_stopsig; - } - else { - if (pp->p_flags & (PTIME | PPTIME) || adrof(STRtime)) - (void) gettimeofday(&pp->p_etime, NULL); - - pp->p_rusage = ru; - if (WIFSIGNALED(w)) { - if (w.w_termsig == SIGINT) - pp->p_flags |= PINTERRUPTED; - else - pp->p_flags |= PSIGNALED; - if (w.w_coredump) - pp->p_flags |= PDUMPED; - pp->p_reason = w.w_termsig; - } - else { - pp->p_reason = w.w_retcode; - if (pp->p_reason != 0) - pp->p_flags |= PAEXITED; - else - pp->p_flags |= PNEXITED; - } - } - jobflags = 0; - fp = pp; - do { - if ((fp->p_flags & (PPTIME | PRUNNING | PSTOPPED)) == 0 && - !child && adrof(STRtime) && - fp->p_rusage.ru_utime.tv_sec + fp->p_rusage.ru_stime.tv_sec - >= atoi(short2str(value(STRtime)))) - fp->p_flags |= PTIME; - jobflags |= fp->p_flags; - } while ((fp = fp->p_friends) != pp); - pp->p_flags &= ~PFOREGND; - if (pp == pp->p_friends && (pp->p_flags & PPTIME)) { - pp->p_flags &= ~PPTIME; - pp->p_flags |= PTIME; - } - if ((jobflags & (PRUNNING | PREPORTED)) == 0) { - fp = pp; - do { - if (fp->p_flags & PSTOPPED) - fp->p_flags |= PREPORTED; - } while ((fp = fp->p_friends) != pp); - while (fp->p_pid != fp->p_jobid) - fp = fp->p_friends; - if (jobflags & PSTOPPED) { - if (pcurrent && pcurrent != fp) - pprevious = pcurrent; - pcurrent = fp; - } - else - pclrcurr(fp); - if (jobflags & PFOREGND) { - if (jobflags & (PSIGNALED | PSTOPPED | PPTIME) || -#ifdef IIASA - jobflags & PAEXITED || -#endif - !eq(dcwd->di_name, fp->p_cwd->di_name)) { - ; /* print in pjwait */ - } - /* PWP: print a newline after ^C */ - else if (jobflags & PINTERRUPTED) { - (void) vis_fputc('\r' | QUOTE, cshout); - (void) fputc('\n', cshout); - } - } - else { - if (jobflags & PNOTIFY || adrof(STRnotify)) { - (void) vis_fputc('\r' | QUOTE, cshout); - (void) fputc('\n', cshout); - (void) pprint(pp, NUMBER | NAME | REASON); - if ((jobflags & PSTOPPED) == 0) - pflush(pp); - } - else { - fp->p_flags |= PNEEDNOTE; - neednote++; - } - } - } - goto loop; -} - -void -pnote() -{ - struct process *pp; - int flags; - int omask; - - neednote = 0; - for (pp = proclist.p_next; pp != NULL; pp = pp->p_next) { - if (pp->p_flags & PNEEDNOTE) { - omask = sigblock(sigmask(SIGCHLD)); - pp->p_flags &= ~PNEEDNOTE; - flags = pprint(pp, NUMBER | NAME | REASON); - if ((flags & (PRUNNING | PSTOPPED)) == 0) - pflush(pp); - (void) sigsetmask(omask); - } - } -} - -/* - * pwait - wait for current job to terminate, maintaining integrity - * of current and previous job indicators. - */ -void -pwait() -{ - struct process *fp, *pp; - int omask; - - /* - * Here's where dead procs get flushed. - */ - omask = sigblock(sigmask(SIGCHLD)); - for (pp = (fp = &proclist)->p_next; pp != NULL; pp = (fp = pp)->p_next) - if (pp->p_pid == 0) { - fp->p_next = pp->p_next; - xfree((ptr_t) pp->p_command); - if (pp->p_cwd && --pp->p_cwd->di_count == 0) - if (pp->p_cwd->di_next == 0) - dfree(pp->p_cwd); - xfree((ptr_t) pp); - pp = fp; - } - (void) sigsetmask(omask); - pjwait(pcurrjob); -} - - -/* - * pjwait - wait for a job to finish or become stopped - * It is assumed to be in the foreground state (PFOREGND) - */ -void -pjwait(pp) - struct process *pp; -{ - struct process *fp; - int jobflags, reason; - int omask; - - while (pp->p_pid != pp->p_jobid) - pp = pp->p_friends; - fp = pp; - - do { - if ((fp->p_flags & (PFOREGND | PRUNNING)) == PRUNNING) - (void) fprintf(csherr, "BUG: waiting for background job!\n"); - } while ((fp = fp->p_friends) != pp); - /* - * Now keep pausing as long as we are not interrupted (SIGINT), and the - * target process, or any of its friends, are running - */ - fp = pp; - omask = sigblock(sigmask(SIGCHLD)); - for (;;) { - (void) sigblock(sigmask(SIGCHLD)); - jobflags = 0; - do - jobflags |= fp->p_flags; - while ((fp = (fp->p_friends)) != pp); - if ((jobflags & PRUNNING) == 0) - break; -#ifdef JOBDEBUG - (void) fprintf(csherr, "starting to sigpause for SIGCHLD on %d\n", - fp->p_pid); -#endif /* JOBDEBUG */ - (void) sigpause(omask & ~sigmask(SIGCHLD)); - } - (void) sigsetmask(omask); - if (tpgrp > 0) /* get tty back */ - (void) tcsetpgrp(FSHTTY, tpgrp); - if ((jobflags & (PSIGNALED | PSTOPPED | PTIME)) || - !eq(dcwd->di_name, fp->p_cwd->di_name)) { - if (jobflags & PSTOPPED) { - (void) fputc('\n', cshout); - if (adrof(STRlistjobs)) { - Char *jobcommand[3]; - - jobcommand[0] = STRjobs; - if (eq(value(STRlistjobs), STRlong)) - jobcommand[1] = STRml; - else - jobcommand[1] = NULL; - jobcommand[2] = NULL; - - dojobs(jobcommand, NULL); - (void) pprint(pp, SHELLDIR); - } - else - (void) pprint(pp, AREASON | SHELLDIR); - } - else - (void) pprint(pp, AREASON | SHELLDIR); - } - if ((jobflags & (PINTERRUPTED | PSTOPPED)) && setintr && - (!gointr || !eq(gointr, STRminus))) { - if ((jobflags & PSTOPPED) == 0) - pflush(pp); - pintr1(0); - /* NOTREACHED */ - } - reason = 0; - fp = pp; - do { - if (fp->p_reason) - reason = fp->p_flags & (PSIGNALED | PINTERRUPTED) ? - fp->p_reason | META : fp->p_reason; - } while ((fp = fp->p_friends) != pp); - if ((reason != 0) && (adrof(STRprintexitvalue))) { - (void) fprintf(cshout, "Exit %d\n", reason); - } - set(STRstatus, putn(reason)); - if (reason && exiterr) - exitstat(); - pflush(pp); -} - -/* - * dowait - wait for all processes to finish - */ -void -/*ARGSUSED*/ -dowait(v, t) - Char **v; - struct command *t; -{ - struct process *pp; - int omask; - - pjobs++; - omask = sigblock(sigmask(SIGCHLD)); -loop: - for (pp = proclist.p_next; pp; pp = pp->p_next) - if (pp->p_pid && /* pp->p_pid == pp->p_jobid && */ - pp->p_flags & PRUNNING) { - (void) sigpause(0); - goto loop; - } - (void) sigsetmask(omask); - pjobs = 0; -} - -/* - * pflushall - flush all jobs from list (e.g. at fork()) - */ -static void -pflushall() -{ - struct process *pp; - - for (pp = proclist.p_next; pp != NULL; pp = pp->p_next) - if (pp->p_pid) - pflush(pp); -} - -/* - * pflush - flag all process structures in the same job as the - * the argument process for deletion. The actual free of the - * space is not done here since pflush is called at interrupt level. - */ -static void -pflush(pp) - struct process *pp; -{ - struct process *np; - int idx; - - if (pp->p_pid == 0) { - (void) fprintf(csherr, "BUG: process flushed twice"); - return; - } - while (pp->p_pid != pp->p_jobid) - pp = pp->p_friends; - pclrcurr(pp); - if (pp == pcurrjob) - pcurrjob = 0; - idx = pp->p_index; - np = pp; - do { - np->p_index = np->p_pid = 0; - np->p_flags &= ~PNEEDNOTE; - } while ((np = np->p_friends) != pp); - if (idx == pmaxindex) { - for (np = proclist.p_next, idx = 0; np; np = np->p_next) - if (np->p_index > idx) - idx = np->p_index; - pmaxindex = idx; - } -} - -/* - * pclrcurr - make sure the given job is not the current or previous job; - * pp MUST be the job leader - */ -static void -pclrcurr(pp) - struct process *pp; -{ - - if (pp == pcurrent) - if (pprevious != NULL) { - pcurrent = pprevious; - pprevious = pgetcurr(pp); - } - else { - pcurrent = pgetcurr(pp); - pprevious = pgetcurr(pp); - } - else if (pp == pprevious) - pprevious = pgetcurr(pp); -} - -/* +4 here is 1 for '\0', 1 ea for << >& >> */ -static Char command[PMAXLEN + 4]; -static int cmdlen; -static Char *cmdp; - -/* - * palloc - allocate a process structure and fill it up. - * an important assumption is made that the process is running. - */ -void -palloc(pid, t) - int pid; - struct command *t; -{ - struct process *pp; - int i; - - pp = (struct process *) xcalloc(1, (size_t) sizeof(struct process)); - pp->p_pid = pid; - pp->p_flags = t->t_dflg & F_AMPERSAND ? PRUNNING : PRUNNING | PFOREGND; - if (t->t_dflg & F_TIME) - pp->p_flags |= PPTIME; - cmdp = command; - cmdlen = 0; - padd(t); - *cmdp++ = 0; - if (t->t_dflg & F_PIPEOUT) { - pp->p_flags |= PPOU; - if (t->t_dflg & F_STDERR) - pp->p_flags |= PERR; - } - pp->p_command = Strsave(command); - if (pcurrjob) { - struct process *fp; - - /* careful here with interrupt level */ - pp->p_cwd = 0; - pp->p_index = pcurrjob->p_index; - pp->p_friends = pcurrjob; - pp->p_jobid = pcurrjob->p_pid; - for (fp = pcurrjob; fp->p_friends != pcurrjob; fp = fp->p_friends) - continue; - fp->p_friends = pp; - } - else { - pcurrjob = pp; - pp->p_jobid = pid; - pp->p_friends = pp; - pp->p_cwd = dcwd; - dcwd->di_count++; - if (pmaxindex < BIGINDEX) - pp->p_index = ++pmaxindex; - else { - struct process *np; - - for (i = 1;; i++) { - for (np = proclist.p_next; np; np = np->p_next) - if (np->p_index == i) - goto tryagain; - pp->p_index = i; - if (i > pmaxindex) - pmaxindex = i; - break; - tryagain:; - } - } - if (pcurrent == NULL) - pcurrent = pp; - else if (pprevious == NULL) - pprevious = pp; - } - pp->p_next = proclist.p_next; - proclist.p_next = pp; - (void) gettimeofday(&pp->p_btime, NULL); -} - -static void -padd(t) - struct command *t; -{ - Char **argp; - - if (t == 0) - return; - switch (t->t_dtyp) { - - case NODE_PAREN: - pads(STRLparensp); - padd(t->t_dspr); - pads(STRspRparen); - break; - - case NODE_COMMAND: - for (argp = t->t_dcom; *argp; argp++) { - pads(*argp); - if (argp[1]) - pads(STRspace); - } - break; - - case NODE_OR: - case NODE_AND: - case NODE_PIPE: - case NODE_LIST: - padd(t->t_dcar); - switch (t->t_dtyp) { - case NODE_OR: - pads(STRspor2sp); - break; - case NODE_AND: - pads(STRspand2sp); - break; - case NODE_PIPE: - pads(STRsporsp); - break; - case NODE_LIST: - pads(STRsemisp); - break; - } - padd(t->t_dcdr); - return; - } - if ((t->t_dflg & F_PIPEIN) == 0 && t->t_dlef) { - pads((t->t_dflg & F_READ) ? STRspLarrow2sp : STRspLarrowsp); - pads(t->t_dlef); - } - if ((t->t_dflg & F_PIPEOUT) == 0 && t->t_drit) { - pads((t->t_dflg & F_APPEND) ? STRspRarrow2 : STRspRarrow); - if (t->t_dflg & F_STDERR) - pads(STRand); - pads(STRspace); - pads(t->t_drit); - } -} - -static void -pads(cp) - Char *cp; -{ - int i; - - /* - * Avoid the Quoted Space alias hack! Reported by: - * sam@john-bigboote.ICS.UCI.EDU (Sam Horrocks) - */ - if (cp[0] == STRQNULL[0]) - cp++; - - i = Strlen(cp); - - if (cmdlen >= PMAXLEN) - return; - if (cmdlen + i >= PMAXLEN) { - (void) Strcpy(cmdp, STRsp3dots); - cmdlen = PMAXLEN; - cmdp += 4; - return; - } - (void) Strcpy(cmdp, cp); - cmdp += i; - cmdlen += i; -} - -/* - * psavejob - temporarily save the current job on a one level stack - * so another job can be created. Used for { } in exp6 - * and `` in globbing. - */ -void -psavejob() -{ - - pholdjob = pcurrjob; - pcurrjob = NULL; -} - -/* - * prestjob - opposite of psavejob. This may be missed if we are interrupted - * somewhere, but pendjob cleans up anyway. - */ -void -prestjob() -{ - - pcurrjob = pholdjob; - pholdjob = NULL; -} - -/* - * pendjob - indicate that a job (set of commands) has been completed - * or is about to begin. - */ -void -pendjob() -{ - struct process *pp, *tp; - - if (pcurrjob && (pcurrjob->p_flags & (PFOREGND | PSTOPPED)) == 0) { - pp = pcurrjob; - while (pp->p_pid != pp->p_jobid) - pp = pp->p_friends; - (void) fprintf(cshout, "[%d]", pp->p_index); - tp = pp; - do { - (void) fprintf(cshout, " %d", pp->p_pid); - pp = pp->p_friends; - } while (pp != tp); - (void) fputc('\n', cshout); - } - pholdjob = pcurrjob = 0; -} - -/* - * pprint - print a job - */ -static int -pprint(pp, flag) - struct process *pp; - bool flag; -{ - int status, reason; - struct process *tp; - int jobflags, pstatus; - bool hadnl = 1; /* did we just have a newline */ - char *format; - - (void) fpurge(cshout); - - while (pp->p_pid != pp->p_jobid) - pp = pp->p_friends; - if (pp == pp->p_friends && (pp->p_flags & PPTIME)) { - pp->p_flags &= ~PPTIME; - pp->p_flags |= PTIME; - } - tp = pp; - status = reason = -1; - jobflags = 0; - do { - jobflags |= pp->p_flags; - pstatus = pp->p_flags & PALLSTATES; - if (tp != pp && !hadnl && !(flag & FANCY) && - ((pstatus == status && pp->p_reason == reason) || - !(flag & REASON))) { - (void) fputc(' ', cshout); - hadnl = 0; - } - else { - if (tp != pp && !hadnl) { - (void) fputc('\n', cshout); - hadnl = 1; - } - if (flag & NUMBER) { - if (pp == tp) - (void) fprintf(cshout, "[%d]%s %c ", pp->p_index, - pp->p_index < 10 ? " " : "", - pp == pcurrent ? '+' : - (pp == pprevious ? '-' : ' ')); - else - (void) fprintf(cshout, " "); - hadnl = 0; - } - if (flag & FANCY) { - (void) fprintf(cshout, "%5d ", pp->p_pid); - hadnl = 0; - } - if (flag & (REASON | AREASON)) { - if (flag & NAME) - format = "%-23s"; - else - format = "%s"; - if (pstatus == status) - if (pp->p_reason == reason) { - (void) fprintf(cshout, format, ""); - hadnl = 0; - goto prcomd; - } - else - reason = pp->p_reason; - else { - status = pstatus; - reason = pp->p_reason; - } - switch (status) { - - case PRUNNING: - (void) fprintf(cshout, format, "Running "); - hadnl = 0; - break; - - case PINTERRUPTED: - case PSTOPPED: - case PSIGNALED: - /* - * tell what happened to the background job - * From: Michael Schroeder - * <mlschroe@immd4.informatik.uni-erlangen.de> - */ - if ((flag & REASON) - || ((flag & AREASON) - && reason != SIGINT - && (reason != SIGPIPE - || (pp->p_flags & PPOU) == 0))) { - (void) fprintf(cshout, format, - sys_siglist[(unsigned char) - pp->p_reason]); - hadnl = 0; - } - break; - - case PNEXITED: - case PAEXITED: - if (flag & REASON) { - if (pp->p_reason) - (void) fprintf(cshout, "Exit %-18d", pp->p_reason); - else - (void) fprintf(cshout, format, "Done"); - hadnl = 0; - } - break; - - default: - (void) fprintf(csherr, "BUG: status=%-9o", status); - } - } - } -prcomd: - if (flag & NAME) { - (void) fprintf(cshout, "%s", vis_str(pp->p_command)); - if (pp->p_flags & PPOU) - (void) fprintf(cshout, " |"); - if (pp->p_flags & PERR) - (void) fputc('&', cshout); - hadnl = 0; - } - if (flag & (REASON | AREASON) && pp->p_flags & PDUMPED) { - (void) fprintf(cshout, " (core dumped)"); - hadnl = 0; - } - if (tp == pp->p_friends) { - if (flag & AMPERSAND) { - (void) fprintf(cshout, " &"); - hadnl = 0; - } - if (flag & JOBDIR && - !eq(tp->p_cwd->di_name, dcwd->di_name)) { - (void) fprintf(cshout, " (wd: "); - dtildepr(value(STRhome), tp->p_cwd->di_name); - (void) fputc(')', cshout); - hadnl = 0; - } - } - if (pp->p_flags & PPTIME && !(status & (PSTOPPED | PRUNNING))) { - if (!hadnl) - (void) fprintf(cshout, "\n\t"); - prusage(&zru, &pp->p_rusage, &pp->p_etime, - &pp->p_btime); - hadnl = 1; - } - if (tp == pp->p_friends) { - if (!hadnl) { - (void) fputc('\n', cshout); - hadnl = 1; - } - if (flag & SHELLDIR && !eq(tp->p_cwd->di_name, dcwd->di_name)) { - (void) fprintf(cshout, "(wd now: "); - dtildepr(value(STRhome), dcwd->di_name); - (void) fprintf(cshout, ")\n"); - hadnl = 1; - } - } - } while ((pp = pp->p_friends) != tp); - if (jobflags & PTIME && (jobflags & (PSTOPPED | PRUNNING)) == 0) { - if (jobflags & NUMBER) - (void) fprintf(cshout, " "); - ptprint(tp); - hadnl = 1; - } - (void) fflush(cshout); - return (jobflags); -} - -static void -ptprint(tp) - struct process *tp; -{ - struct timeval tetime, diff; - static struct timeval ztime; - struct rusage ru; - static struct rusage zru; - struct process *pp = tp; - - ru = zru; - tetime = ztime; - do { - ruadd(&ru, &pp->p_rusage); - tvsub(&diff, &pp->p_etime, &pp->p_btime); - if (timercmp(&diff, &tetime, >)) - tetime = diff; - } while ((pp = pp->p_friends) != tp); - prusage(&zru, &ru, &tetime, &ztime); -} - -/* - * dojobs - print all jobs - */ -void -/*ARGSUSED*/ -dojobs(v, t) - Char **v; - struct command *t; -{ - struct process *pp; - int flag = NUMBER | NAME | REASON; - int i; - - if (chkstop) - chkstop = 2; - if (*++v) { - if (v[1] || !eq(*v, STRml)) - stderror(ERR_JOBS); - flag |= FANCY | JOBDIR; - } - for (i = 1; i <= pmaxindex; i++) - for (pp = proclist.p_next; pp; pp = pp->p_next) - if (pp->p_index == i && pp->p_pid == pp->p_jobid) { - pp->p_flags &= ~PNEEDNOTE; - if (!(pprint(pp, flag) & (PRUNNING | PSTOPPED))) - pflush(pp); - break; - } -} - -/* - * dofg - builtin - put the job into the foreground - */ -void -/*ARGSUSED*/ -dofg(v, t) - Char **v; - struct command *t; -{ - struct process *pp; - - okpcntl(); - ++v; - do { - pp = pfind(*v); - pstart(pp, 1); - pjwait(pp); - } while (*v && *++v); -} - -/* - * %... - builtin - put the job into the foreground - */ -void -/*ARGSUSED*/ -dofg1(v, t) - Char **v; - struct command *t; -{ - struct process *pp; - - okpcntl(); - pp = pfind(v[0]); - pstart(pp, 1); - pjwait(pp); -} - -/* - * dobg - builtin - put the job into the background - */ -void -/*ARGSUSED*/ -dobg(v, t) - Char **v; - struct command *t; -{ - struct process *pp; - - okpcntl(); - ++v; - do { - pp = pfind(*v); - pstart(pp, 0); - } while (*v && *++v); -} - -/* - * %... & - builtin - put the job into the background - */ -void -/*ARGSUSED*/ -dobg1(v, t) - Char **v; - struct command *t; -{ - struct process *pp; - - pp = pfind(v[0]); - pstart(pp, 0); -} - -/* - * dostop - builtin - stop the job - */ -void -/*ARGSUSED*/ -dostop(v, t) - Char **v; - struct command *t; -{ - pkill(++v, SIGSTOP); -} - -/* - * dokill - builtin - superset of kill (1) - */ -void -/*ARGSUSED*/ -dokill(v, t) - Char **v; - struct command *t; -{ - int signum = SIGTERM; - char *name; - - v++; - if (v[0] && v[0][0] == '-') { - if (v[0][1] == 'l') { - for (signum = 1; signum < NSIG; signum++) { - (void) fprintf(cshout, "%s ", sys_signame[signum]); - if (signum == NSIG / 2) - (void) fputc('\n', cshout); - } - (void) fputc('\n', cshout); - return; - } - if (Isdigit(v[0][1])) { - signum = atoi(short2str(v[0] + 1)); - if (signum < 0 || signum > NSIG) - stderror(ERR_NAME | ERR_BADSIG); - } - else { - name = short2str(&v[0][1]); - if (!strncasecmp(name, "sig", 3)) - name += 3; - - for (signum = 1; signum < NSIG; signum++) - if (!strcasecmp(sys_signame[signum], name)) - break; - - if (signum == NSIG) { - setname(vis_str(&v[0][1])); - stderror(ERR_NAME | ERR_UNKSIG); - } - } - v++; - } - pkill(v, signum); -} - -static void -pkill(v, signum) - Char **v; - int signum; -{ - struct process *pp, *np; - int jobflags = 0; - int pid, err1 = 0; - int omask; - Char *cp; - - omask = sigmask(SIGCHLD); - if (setintr) - omask |= sigmask(SIGINT); - omask = sigblock(omask) & ~omask; - gflag = 0, tglob(v); - if (gflag) { - v = globall(v); - if (v == 0) - stderror(ERR_NAME | ERR_NOMATCH); - } - else { - v = gargv = saveblk(v); - trim(v); - } - - while (v && (cp = *v)) { - if (*cp == '%') { - np = pp = pfind(cp); - do - jobflags |= np->p_flags; - while ((np = np->p_friends) != pp); - switch (signum) { - - case SIGSTOP: - case SIGTSTP: - case SIGTTIN: - case SIGTTOU: - if ((jobflags & PRUNNING) == 0) { - (void) fprintf(csherr, "%s: Already suspended\n", - vis_str(cp)); - err1++; - goto cont; - } - break; - /* - * suspend a process, kill -CONT %, then type jobs; the shell - * says it is suspended, but it is running; thanks jaap.. - */ - case SIGCONT: - pstart(pp, 0); - goto cont; - } - if (killpg((pid_t) pp->p_jobid, signum) < 0) { - (void) fprintf(csherr, "%s: %s\n", vis_str(cp), - strerror(errno)); - err1++; - } - if (signum == SIGTERM || signum == SIGHUP) - (void) killpg((pid_t) pp->p_jobid, SIGCONT); - } - else if (!(Isdigit(*cp) || *cp == '-')) - stderror(ERR_NAME | ERR_JOBARGS); - else { - pid = atoi(short2str(cp)); - if (kill((pid_t) pid, signum) < 0) { - (void) fprintf(csherr, "%d: %s\n", pid, strerror(errno)); - err1++; - goto cont; - } - if (signum == SIGTERM || signum == SIGHUP) - (void) kill((pid_t) pid, SIGCONT); - } -cont: - v++; - } - if (gargv) - blkfree(gargv), gargv = 0; - (void) sigsetmask(omask); - if (err1) - stderror(ERR_SILENT); -} - -/* - * pstart - start the job in foreground/background - */ -void -pstart(pp, foregnd) - struct process *pp; - int foregnd; -{ - struct process *np; - int omask; - long jobflags = 0; - - omask = sigblock(sigmask(SIGCHLD)); - np = pp; - do { - jobflags |= np->p_flags; - if (np->p_flags & (PRUNNING | PSTOPPED)) { - np->p_flags |= PRUNNING; - np->p_flags &= ~PSTOPPED; - if (foregnd) - np->p_flags |= PFOREGND; - else - np->p_flags &= ~PFOREGND; - } - } while ((np = np->p_friends) != pp); - if (!foregnd) - pclrcurr(pp); - (void) pprint(pp, foregnd ? NAME | JOBDIR : NUMBER | NAME | AMPERSAND); - if (foregnd) - (void) tcsetpgrp(FSHTTY, pp->p_jobid); - if (jobflags & PSTOPPED) - (void) killpg((pid_t) pp->p_jobid, SIGCONT); - (void) sigsetmask(omask); -} - -void -panystop(neednl) - bool neednl; -{ - struct process *pp; - - chkstop = 2; - for (pp = proclist.p_next; pp; pp = pp->p_next) - if (pp->p_flags & PSTOPPED) - stderror(ERR_STOPPED, neednl ? "\n" : ""); -} - -struct process * -pfind(cp) - Char *cp; -{ - struct process *pp, *np; - - if (cp == 0 || cp[1] == 0 || eq(cp, STRcent2) || eq(cp, STRcentplus)) { - if (pcurrent == NULL) - stderror(ERR_NAME | ERR_JOBCUR); - return (pcurrent); - } - if (eq(cp, STRcentminus) || eq(cp, STRcenthash)) { - if (pprevious == NULL) - stderror(ERR_NAME | ERR_JOBPREV); - return (pprevious); - } - if (Isdigit(cp[1])) { - int idx = atoi(short2str(cp + 1)); - - for (pp = proclist.p_next; pp; pp = pp->p_next) - if (pp->p_index == idx && pp->p_pid == pp->p_jobid) - return (pp); - stderror(ERR_NAME | ERR_NOSUCHJOB); - } - np = NULL; - for (pp = proclist.p_next; pp; pp = pp->p_next) - if (pp->p_pid == pp->p_jobid) { - if (cp[1] == '?') { - Char *dp; - - for (dp = pp->p_command; *dp; dp++) { - if (*dp != cp[2]) - continue; - if (prefix(cp + 2, dp)) - goto match; - } - } - else if (prefix(cp + 1, pp->p_command)) { - match: - if (np) - stderror(ERR_NAME | ERR_AMBIG); - np = pp; - } - } - if (np) - return (np); - stderror(ERR_NAME | (cp[1] == '?' ? ERR_JOBPAT : ERR_NOSUCHJOB)); - /* NOTREACHED */ - return (0); -} - - -/* - * pgetcurr - find most recent job that is not pp, preferably stopped - */ -static struct process * -pgetcurr(pp) - struct process *pp; -{ - struct process *np; - struct process *xp = NULL; - - for (np = proclist.p_next; np; np = np->p_next) - if (np != pcurrent && np != pp && np->p_pid && - np->p_pid == np->p_jobid) { - if (np->p_flags & PSTOPPED) - return (np); - if (xp == NULL) - xp = np; - } - return (xp); -} - -/* - * donotify - flag the job so as to report termination asynchronously - */ -void -/*ARGSUSED*/ -donotify(v, t) - Char **v; - struct command *t; -{ - struct process *pp; - - pp = pfind(*++v); - pp->p_flags |= PNOTIFY; -} - -/* - * Do the fork and whatever should be done in the child side that - * should not be done if we are not forking at all (like for simple builtin's) - * Also do everything that needs any signals fiddled with in the parent side - * - * Wanttty tells whether process and/or tty pgrps are to be manipulated: - * -1: leave tty alone; inherit pgrp from parent - * 0: already have tty; manipulate process pgrps only - * 1: want to claim tty; manipulate process and tty pgrps - * It is usually just the value of tpgrp. - */ - -int -pfork(t, wanttty) - struct command *t; /* command we are forking for */ - int wanttty; -{ - int pid; - bool ignint = 0; - int pgrp; - int omask; - - /* - * A child will be uninterruptible only under very special conditions. - * Remember that the semantics of '&' is implemented by disconnecting the - * process from the tty so signals do not need to ignored just for '&'. - * Thus signals are set to default action for children unless: we have had - * an "onintr -" (then specifically ignored) we are not playing with - * signals (inherit action) - */ - if (setintr) - ignint = (tpgrp == -1 && (t->t_dflg & F_NOINTERRUPT)) - || (gointr && eq(gointr, STRminus)); - /* - * Check for maximum nesting of 16 processes to avoid Forking loops - */ - if (child == 16) - stderror(ERR_NESTING, 16); - /* - * Hold SIGCHLD until we have the process installed in our table. - */ - omask = sigblock(sigmask(SIGCHLD)); - while ((pid = fork()) < 0) - if (setintr == 0) - (void) sleep(FORKSLEEP); - else { - (void) sigsetmask(omask); - stderror(ERR_NOPROC); - } - if (pid == 0) { - settimes(); - pgrp = pcurrjob ? pcurrjob->p_jobid : getpid(); - pflushall(); - pcurrjob = NULL; - child++; - if (setintr) { - setintr = 0; /* until I think otherwise */ - /* - * Children just get blown away on SIGINT, SIGQUIT unless "onintr - * -" seen. - */ - (void) signal(SIGINT, ignint ? SIG_IGN : SIG_DFL); - (void) signal(SIGQUIT, ignint ? SIG_IGN : SIG_DFL); - if (wanttty >= 0) { - /* make stoppable */ - (void) signal(SIGTSTP, SIG_DFL); - (void) signal(SIGTTIN, SIG_DFL); - (void) signal(SIGTTOU, SIG_DFL); - } - (void) signal(SIGTERM, parterm); - } - else if (tpgrp == -1 && (t->t_dflg & F_NOINTERRUPT)) { - (void) signal(SIGINT, SIG_IGN); - (void) signal(SIGQUIT, SIG_IGN); - } - pgetty(wanttty, pgrp); - /* - * Nohup and nice apply only to NODE_COMMAND's but it would be nice - * (?!?) if you could say "nohup (foo;bar)" Then the parser would have - * to know about nice/nohup/time - */ - if (t->t_dflg & F_NOHUP) - (void) signal(SIGHUP, SIG_IGN); - if (t->t_dflg & F_NICE) - (void) setpriority(PRIO_PROCESS, 0, t->t_nice); - } - else { - if (wanttty >= 0) - (void) setpgid(pid, pcurrjob ? pcurrjob->p_jobid : pid); - palloc(pid, t); - (void) sigsetmask(omask); - } - - return (pid); -} - -static void -okpcntl() -{ - if (tpgrp == -1) - stderror(ERR_JOBCONTROL); - if (tpgrp == 0) - stderror(ERR_JOBCTRLSUB); -} - -/* - * if we don't have vfork(), things can still go in the wrong order - * resulting in the famous 'Stopped (tty output)'. But some systems - * don't permit the setpgid() call, (these are more recent secure - * systems such as ibm's aix). Then we'd rather print an error message - * than hang the shell! - * I am open to suggestions how to fix that. - */ -void -pgetty(wanttty, pgrp) - int wanttty, pgrp; -{ - int omask = 0; - - /* - * christos: I am blocking the tty signals till I've set things - * correctly.... - */ - if (wanttty > 0) - omask = sigblock(sigmask(SIGTSTP)|sigmask(SIGTTIN)|sigmask(SIGTTOU)); - /* - * From: Michael Schroeder <mlschroe@immd4.informatik.uni-erlangen.de> - * Don't check for tpgrp >= 0 so even non-interactive shells give - * background jobs process groups Same for the comparison in the other part - * of the #ifdef - */ - if (wanttty >= 0) - if (setpgid(0, pgrp) == -1) { - (void) fprintf(csherr, "csh: setpgid error.\n"); - xexit(0); - } - - if (wanttty > 0) { - (void) tcsetpgrp(FSHTTY, pgrp); - (void) sigsetmask(omask); - } - - if (tpgrp > 0) - tpgrp = 0; /* gave tty away */ -} diff --git a/bin/csh/proc.h b/bin/csh/proc.h deleted file mode 100644 index 0aa5259..0000000 --- a/bin/csh/proc.h +++ /dev/null @@ -1,102 +0,0 @@ -/*- - * Copyright (c) 1980, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)proc.h 8.1 (Berkeley) 5/31/93 - * $FreeBSD$ - */ - -/* - * Structure for each process the shell knows about: - * allocated and filled by pcreate. - * flushed by pflush; freeing always happens at top level - * so the interrupt level has less to worry about. - * processes are related to "friends" when in a pipeline; - * p_friends links makes a circular list of such jobs - */ -struct process { - struct process *p_next; /* next in global "proclist" */ - struct process *p_friends; /* next in job list (or self) */ - struct directory *p_cwd; /* cwd of the job (only in head) */ - short unsigned p_flags; /* various job status flags */ - char p_reason; /* reason for entering this state */ - int p_index; /* shorthand job index */ - int p_pid; - int p_jobid; /* pid of job leader */ - /* if a job is stopped/background p_jobid gives its pgrp */ - struct timeval p_btime; /* begin time */ - struct timeval p_etime; /* end time */ - struct rusage p_rusage; - Char *p_command; /* first PMAXLEN chars of command */ -}; - -/* flag values for p_flags */ -#define PRUNNING (1<<0) /* running */ -#define PSTOPPED (1<<1) /* stopped */ -#define PNEXITED (1<<2) /* normally exited */ -#define PAEXITED (1<<3) /* abnormally exited */ -#define PSIGNALED (1<<4) /* terminated by a signal != SIGINT */ - -#define PALLSTATES (PRUNNING|PSTOPPED|PNEXITED|PAEXITED|PSIGNALED|PINTERRUPTED) -#define PNOTIFY (1<<5) /* notify async when done */ -#define PTIME (1<<6) /* job times should be printed */ -#define PAWAITED (1<<7) /* top level is waiting for it */ -#define PFOREGND (1<<8) /* started in shells pgrp */ -#define PDUMPED (1<<9) /* process dumped core */ -#define PERR (1<<10) /* diagnostic output also piped out */ -#define PPOU (1<<11) /* piped output */ -#define PREPORTED (1<<12) /* status has been reported */ -#define PINTERRUPTED (1<<13) /* job stopped via interrupt signal */ -#define PPTIME (1<<14) /* time individual process */ -#define PNEEDNOTE (1<<15) /* notify as soon as practical */ - -#define PMAXLEN 80 - -/* defines for arguments to pprint */ -#define NUMBER 01 -#define NAME 02 -#define REASON 04 -#define AMPERSAND 010 -#define FANCY 020 -#define SHELLDIR 040 /* print shell's dir if not the same */ -#define JOBDIR 0100 /* print job's dir if not the same */ -#define AREASON 0200 - -struct process proclist; /* list head of all processes */ -bool pnoprocesses; /* pchild found nothing to wait for */ - -struct process *pholdjob; /* one level stack of current jobs */ - -struct process *pcurrjob; /* current job */ -struct process *pcurrent; /* current job in table */ -struct process *pprevious; /* previous job in table */ - -int pmaxindex; /* current maximum job index */ diff --git a/bin/csh/sem.c b/bin/csh/sem.c deleted file mode 100644 index ee7eb20..0000000 --- a/bin/csh/sem.c +++ /dev/null @@ -1,650 +0,0 @@ -/*- - * Copyright (c) 1980, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -#if 0 -static char sccsid[] = "@(#)sem.c 8.1 (Berkeley) 5/31/93"; -#else -static const char rcsid[] = - "$FreeBSD$"; -#endif -#endif /* not lint */ - -#include <sys/param.h> -#include <sys/ioctl.h> -#include <sys/stat.h> -#include <errno.h> -#include <fcntl.h> -#include <string.h> -#include <unistd.h> -#if __STDC__ -# include <stdarg.h> -#else -# include <varargs.h> -#endif - -#include "csh.h" -#include "proc.h" -#include "extern.h" - -static void vffree __P((int)); -static Char *splicepipe __P((struct command *t, Char *)); -static void doio __P((struct command *t, int *, int *)); -static void chkclob __P((char *)); - -void -execute(t, wanttty, pipein, pipeout) - struct command *t; - int wanttty, *pipein, *pipeout; -{ - bool forked = 0; - struct biltins *bifunc; - int pid = 0; - int pv[2]; - - static int csigmask; - - static int ocsigmask; - static int onosigchld = 0; - static int nosigchld = 0; - - UNREGISTER(forked); - UNREGISTER(bifunc); - UNREGISTER(wanttty); - - if (t == 0) - return; - - if (t->t_dflg & F_AMPERSAND) - wanttty = 0; - switch (t->t_dtyp) { - - case NODE_COMMAND: - if ((t->t_dcom[0][0] & (QUOTE | TRIM)) == QUOTE) - (void) Strcpy(t->t_dcom[0], t->t_dcom[0] + 1); - if ((t->t_dflg & F_REPEAT) == 0) - Dfix(t); /* $ " ' \ */ - if (t->t_dcom[0] == 0) - return; - /* fall into... */ - - case NODE_PAREN: - if (t->t_dflg & F_PIPEOUT) - mypipe(pipeout); - /* - * Must do << early so parent will know where input pointer should be. - * If noexec then this is all we do. - */ - if (t->t_dflg & F_READ) { - (void) close(0); - heredoc(t->t_dlef); - if (noexec) - (void) close(0); - } - - set(STRstatus, Strsave(STR0)); - - /* - * This mess is the necessary kludge to handle the prefix builtins: - * nice, nohup, time. These commands can also be used by themselves, - * and this is not handled here. This will also work when loops are - * parsed. - */ - while (t->t_dtyp == NODE_COMMAND) - if (eq(t->t_dcom[0], STRnice)) - if (t->t_dcom[1]) - if (strchr("+-", t->t_dcom[1][0])) - if (t->t_dcom[2]) { - setname("nice"); - t->t_nice = - getn(t->t_dcom[1]); - lshift(t->t_dcom, 2); - t->t_dflg |= F_NICE; - } - else - break; - else { - t->t_nice = 4; - lshift(t->t_dcom, 1); - t->t_dflg |= F_NICE; - } - else - break; - else if (eq(t->t_dcom[0], STRnohup)) - if (t->t_dcom[1]) { - t->t_dflg |= F_NOHUP; - lshift(t->t_dcom, 1); - } - else - break; - else if (eq(t->t_dcom[0], STRtime)) - if (t->t_dcom[1]) { - t->t_dflg |= F_TIME; - lshift(t->t_dcom, 1); - } - else - break; - else - break; - - /* is it a command */ - if (t->t_dtyp == NODE_COMMAND) { - /* - * Check if we have a builtin function and remember which one. - */ - bifunc = isbfunc(t); - if (noexec) { - /* - * Continue for builtins that are part of the scripting language - */ - if (bifunc->bfunct != dobreak && bifunc->bfunct != docontin && - bifunc->bfunct != doelse && bifunc->bfunct != doend && - bifunc->bfunct != doforeach && bifunc->bfunct != dogoto && - bifunc->bfunct != doif && bifunc->bfunct != dorepeat && - bifunc->bfunct != doswbrk && bifunc->bfunct != doswitch && - bifunc->bfunct != dowhile && bifunc->bfunct != dozip) - break; - } - } - else { /* not a command */ - bifunc = NULL; - if (noexec) - break; - } - - /* - * We fork only if we are timed, or are not the end of a parenthesized - * list and not a simple builtin function. Simple meaning one that is - * not pipedout, niced, nohupped, or &'d. It would be nice(?) to not - * fork in some of these cases. - */ - /* - * Prevent forking cd, pushd, popd, chdir cause this will cause the - * shell not to change dir! - */ - if (bifunc && (bifunc->bfunct == dochngd || - bifunc->bfunct == dopushd || - bifunc->bfunct == dopopd)) - t->t_dflg &= ~(F_NICE); - if (((t->t_dflg & F_TIME) || ((t->t_dflg & F_NOFORK) == 0 && - (!bifunc || t->t_dflg & - (F_PIPEOUT | F_AMPERSAND | F_NICE | F_NOHUP)))) || - /* - * We have to fork for eval too. - */ - (bifunc && (t->t_dflg & (F_PIPEIN | F_PIPEOUT)) != 0 && - bifunc->bfunct == doeval)) { - if (t->t_dtyp == NODE_PAREN || - t->t_dflg & (F_REPEAT | F_AMPERSAND) || bifunc) { - forked++; - /* - * We need to block SIGCHLD here, so that if the process does - * not die before we can set the process group - */ - if (wanttty >= 0 && !nosigchld) { - csigmask = sigblock(sigmask(SIGCHLD)); - nosigchld = 1; - } - - pid = pfork(t, wanttty); - if (pid == 0 && nosigchld) { - (void) sigsetmask(csigmask); - nosigchld = 0; - } - else if (pid != 0 && (t->t_dflg & F_AMPERSAND)) - backpid = pid; - - } - else { - int ochild, osetintr, ohaderr, odidfds; - int oSHIN, oSHOUT, oSHERR, oOLDSTD, otpgrp; - int omask; - - /* - * Prepare for the vfork by saving everything that the child - * corrupts before it exec's. Note that in some signal - * implementations which keep the signal info in user space - * (e.g. Sun's) it will also be necessary to save and restore - * the current sigvec's for the signals the child touches - * before it exec's. - */ - if (wanttty >= 0 && !nosigchld && !noexec) { - csigmask = sigblock(sigmask(SIGCHLD)); - nosigchld = 1; - } - omask = sigblock(sigmask(SIGCHLD) | sigmask(SIGINT)); - ochild = child; - osetintr = setintr; - ohaderr = haderr; - odidfds = didfds; - oSHIN = SHIN; - oSHOUT = SHOUT; - oSHERR = SHERR; - oOLDSTD = OLDSTD; - otpgrp = tpgrp; - ocsigmask = csigmask; - onosigchld = nosigchld; - Vsav = Vdp = 0; - Vexpath = 0; - Vt = 0; - pid = vfork(); - - if (pid < 0) { - (void) sigsetmask(omask); - stderror(ERR_NOPROC); - } - forked++; - if (pid) { /* parent */ - child = ochild; - setintr = osetintr; - haderr = ohaderr; - didfds = odidfds; - SHIN = oSHIN; - SHOUT = oSHOUT; - SHERR = oSHERR; - OLDSTD = oOLDSTD; - tpgrp = otpgrp; - csigmask = ocsigmask; - nosigchld = onosigchld; - - xfree((ptr_t) Vsav); - Vsav = 0; - xfree((ptr_t) Vdp); - Vdp = 0; - xfree((ptr_t) Vexpath); - Vexpath = 0; - blkfree((Char **) Vt); - Vt = 0; - /* this is from pfork() */ - palloc(pid, t); - (void) sigsetmask(omask); - } - else { /* child */ - /* this is from pfork() */ - int pgrp; - bool ignint = 0; - - if (nosigchld) { - (void) sigsetmask(csigmask); - nosigchld = 0; - } - - if (setintr) - ignint = - (tpgrp == -1 && - (t->t_dflg & F_NOINTERRUPT)) - || (gointr && eq(gointr, STRminus)); - pgrp = pcurrjob ? pcurrjob->p_jobid : getpid(); - child++; - if (setintr) { - setintr = 0; - if (ignint) { - (void) signal(SIGINT, SIG_IGN); - (void) signal(SIGQUIT, SIG_IGN); - } - else { - (void) signal(SIGINT, vffree); - (void) signal(SIGQUIT, SIG_DFL); - } - - if (wanttty >= 0) { - (void) signal(SIGTSTP, SIG_DFL); - (void) signal(SIGTTIN, SIG_DFL); - (void) signal(SIGTTOU, SIG_DFL); - } - - (void) signal(SIGTERM, parterm); - } - else if (tpgrp == -1 && - (t->t_dflg & F_NOINTERRUPT)) { - (void) signal(SIGINT, SIG_IGN); - (void) signal(SIGQUIT, SIG_IGN); - } - - pgetty(wanttty, pgrp); - if (t->t_dflg & F_NOHUP) - (void) signal(SIGHUP, SIG_IGN); - if (t->t_dflg & F_NICE) - (void) setpriority(PRIO_PROCESS, 0, t->t_nice); - } - - } - } - if (pid != 0) { - /* - * It would be better if we could wait for the whole job when we - * knew the last process had been started. Pwait, in fact, does - * wait for the whole job anyway, but this test doesn't really - * express our intentions. - */ - if (didfds == 0 && t->t_dflg & F_PIPEIN) { - (void) close(pipein[0]); - (void) close(pipein[1]); - } - if ((t->t_dflg & F_PIPEOUT) == 0) { - if (nosigchld) { - (void) sigsetmask(csigmask); - nosigchld = 0; - } - if ((t->t_dflg & F_AMPERSAND) == 0) - pwait(); - } - break; - } - doio(t, pipein, pipeout); - if (t->t_dflg & F_PIPEOUT) { - (void) close(pipeout[0]); - (void) close(pipeout[1]); - } - /* - * Perform a builtin function. If we are not forked, arrange for - * possible stopping - */ - if (bifunc) { - func(t, bifunc); - if (forked) - exitstat(); - break; - } - if (t->t_dtyp != NODE_PAREN) { - doexec(NULL, t); - /* NOTREACHED */ - } - /* - * For () commands must put new 0,1,2 in FSH* and recurse - */ - OLDSTD = dcopy(0, FOLDSTD); - SHOUT = dcopy(1, FSHOUT); - SHERR = dcopy(2, FSHERR); - (void) close(SHIN); - SHIN = -1; - didfds = 0; - wanttty = -1; - t->t_dspr->t_dflg |= t->t_dflg & F_NOINTERRUPT; - execute(t->t_dspr, wanttty, NULL, NULL); - exitstat(); - - case NODE_PIPE: - t->t_dcar->t_dflg |= F_PIPEOUT | - (t->t_dflg & (F_PIPEIN | F_AMPERSAND | F_STDERR | F_NOINTERRUPT)); - execute(t->t_dcar, wanttty, pipein, pv); - t->t_dcdr->t_dflg |= F_PIPEIN | (t->t_dflg & - (F_PIPEOUT | F_AMPERSAND | F_NOFORK | F_NOINTERRUPT)); - if (wanttty > 0) - wanttty = 0; /* got tty already */ - execute(t->t_dcdr, wanttty, pv, pipeout); - break; - - case NODE_LIST: - if (t->t_dcar) { - t->t_dcar->t_dflg |= t->t_dflg & F_NOINTERRUPT; - execute(t->t_dcar, wanttty, NULL, NULL); - /* - * In strange case of A&B make a new job after A - */ - if (t->t_dcar->t_dflg & F_AMPERSAND && t->t_dcdr && - (t->t_dcdr->t_dflg & F_AMPERSAND) == 0) - pendjob(); - } - if (t->t_dcdr) { - t->t_dcdr->t_dflg |= t->t_dflg & - (F_NOFORK | F_NOINTERRUPT); - execute(t->t_dcdr, wanttty, NULL, NULL); - } - break; - - case NODE_OR: - case NODE_AND: - if (t->t_dcar) { - t->t_dcar->t_dflg |= t->t_dflg & F_NOINTERRUPT; - execute(t->t_dcar, wanttty, NULL, NULL); - if ((getn(value(STRstatus)) == 0) != - (t->t_dtyp == NODE_AND)) - return; - } - if (t->t_dcdr) { - t->t_dcdr->t_dflg |= t->t_dflg & - (F_NOFORK | F_NOINTERRUPT); - execute(t->t_dcdr, wanttty, NULL, NULL); - } - break; - } - /* - * Fall through for all breaks from switch - * - * If there will be no more executions of this command, flush all file - * descriptors. Places that turn on the F_REPEAT bit are responsible for - * doing donefds after the last re-execution - */ - if (didfds && !(t->t_dflg & F_REPEAT)) - donefds(); -} - -static void -vffree(i) -int i; -{ - Char **v; - - if ((v = gargv) != NULL) { - gargv = 0; - xfree((ptr_t) v); - } - if ((v = pargv) != NULL) { - pargv = 0; - xfree((ptr_t) v); - } - _exit(i); -} - -/* - * Expand and glob the words after an i/o redirection. - * If more than one word is generated, then update the command vector. - * - * This is done differently in all the shells: - * 1. in the Bourne shell and ksh globbing is not performed - * 2. Bash/csh say ambiguous - * 3. zsh does i/o to/from all the files - * 4. itcsh concatenates the words. - * - * I don't know what is best to do. I think that Ambiguous is better - * than restructuring the command vector, because the user can get - * unexpected results. In any case, the command vector restructuring - * code is present and the user can choose it by setting noambiguous - */ -static Char * -splicepipe(t, cp) - struct command *t; - Char *cp; /* word after < or > */ -{ - Char *blk[2]; - - if (adrof(STRnoambiguous)) { - Char **pv; - - blk[0] = Dfix1(cp); /* expand $ */ - blk[1] = NULL; - - gflag = 0, tglob(blk); - if (gflag) { - pv = globall(blk); - if (pv == NULL) { - setname(vis_str(blk[0])); - xfree((ptr_t) blk[0]); - stderror(ERR_NAME | ERR_NOMATCH); - } - gargv = NULL; - if (pv[1] != NULL) { /* we need to fix the command vector */ - Char **av = blkspl(t->t_dcom, &pv[1]); - xfree((ptr_t) t->t_dcom); - t->t_dcom = av; - } - xfree((ptr_t) blk[0]); - blk[0] = pv[0]; - xfree((ptr_t) pv); - } - } - else { - blk[0] = globone(blk[1] = Dfix1(cp), G_ERROR); - xfree((ptr_t) blk[1]); - } - return(blk[0]); -} - -/* - * Perform io redirection. - * We may or maynot be forked here. - */ -static void -doio(t, pipein, pipeout) - struct command *t; - int *pipein, *pipeout; -{ - int fd; - Char *cp; - int flags = t->t_dflg; - - if (didfds || (flags & F_REPEAT)) - return; - if ((flags & F_READ) == 0) {/* F_READ already done */ - if (t->t_dlef) { - char tmp[MAXPATHLEN+1]; - - /* - * so < /dev/std{in,out,err} work - */ - (void) dcopy(SHIN, 0); - (void) dcopy(SHOUT, 1); - (void) dcopy(SHERR, 2); - cp = splicepipe(t, t->t_dlef); - (void) strncpy(tmp, short2str(cp), MAXPATHLEN); - tmp[MAXPATHLEN] = '\0'; - xfree((ptr_t) cp); - if ((fd = open(tmp, O_RDONLY)) < 0) - stderror(ERR_SYSTEM, tmp, strerror(errno)); - (void) dmove(fd, 0); - } - else if (flags & F_PIPEIN) { - (void) close(0); - (void) dup(pipein[0]); - (void) close(pipein[0]); - (void) close(pipein[1]); - } - else if ((flags & F_NOINTERRUPT) && tpgrp == -1) { - (void) close(0); - (void) open(_PATH_DEVNULL, O_RDONLY); - } - else { - (void) close(0); - (void) dup(OLDSTD); - (void) ioctl(0, FIONCLEX, NULL); - } - } - if (t->t_drit) { - char tmp[MAXPATHLEN+1]; - - cp = splicepipe(t, t->t_drit); - (void) strncpy(tmp, short2str(cp), MAXPATHLEN); - tmp[MAXPATHLEN] = '\0'; - xfree((ptr_t) cp); - /* - * so > /dev/std{out,err} work - */ - (void) dcopy(SHOUT, 1); - (void) dcopy(SHERR, 2); - if ((flags & F_APPEND) && -#ifdef O_APPEND - (fd = open(tmp, O_WRONLY | O_APPEND)) >= 0); -#else - (fd = open(tmp, O_WRONLY)) >= 0) - (void) lseek(1, (off_t) 0, L_XTND); -#endif - else { - if (!(flags & F_OVERWRITE) && adrof(STRnoclobber)) { - if (flags & F_APPEND) - stderror(ERR_SYSTEM, tmp, strerror(errno)); - chkclob(tmp); - } - if ((fd = creat(tmp, 0666)) < 0) - stderror(ERR_SYSTEM, tmp, strerror(errno)); - } - (void) dmove(fd, 1); - } - else if (flags & F_PIPEOUT) { - (void) close(1); - (void) dup(pipeout[1]); - } - else { - (void) close(1); - (void) dup(SHOUT); - (void) ioctl(1, FIONCLEX, NULL); - } - - (void) close(2); - if (flags & F_STDERR) { - (void) dup(1); - } - else { - (void) dup(SHERR); - (void) ioctl(2, FIONCLEX, NULL); - } - didfds = 1; -} - -void -mypipe(pv) - int *pv; -{ - - if (pipe(pv) < 0) - goto oops; - pv[0] = dmove(pv[0], -1); - pv[1] = dmove(pv[1], -1); - if (pv[0] >= 0 && pv[1] >= 0) - return; -oops: - stderror(ERR_PIPE); -} - -static void -chkclob(cp) - char *cp; -{ - struct stat stb; - - if (stat(cp, &stb) < 0) - return; - if (S_ISCHR(stb.st_mode)) - return; - stderror(ERR_EXISTS, cp); -} diff --git a/bin/csh/set.c b/bin/csh/set.c deleted file mode 100644 index af6c6cd..0000000 --- a/bin/csh/set.c +++ /dev/null @@ -1,847 +0,0 @@ -/*- - * Copyright (c) 1980, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -#if 0 -static char sccsid[] = "@(#)set.c 8.1 (Berkeley) 5/31/93"; -#else -static const char rcsid[] = - "$FreeBSD$"; -#endif -#endif /* not lint */ - -#include <sys/types.h> -#if __STDC__ -# include <stdarg.h> -#else -# include <varargs.h> -#endif -#include <unistd.h> - -#include "csh.h" -#include "extern.h" - -static Char *getinx __P((Char *, int *)); -static void asx __P((Char *, int, Char *)); -static struct varent - *getvx __P((Char *, int)); -static Char *xset __P((Char *, Char ***)); -static Char *operate __P((int, Char *, Char *)); -static void putn1 __P((int)); -static struct varent - *madrof __P((Char *, struct varent *)); -static void unsetv1 __P((struct varent *)); -static void exportpath __P((Char **)); -static void balance __P((struct varent *, int, int)); - - -/* - * C Shell - */ - -void -/*ARGSUSED*/ -doset(v, t) - Char **v; - struct command *t; -{ - Char *p; - Char *vp, op; - Char **vecp; - bool hadsub; - int subscr; - - v++; - p = *v++; - if (p == 0) { - prvars(); - return; - } - do { - hadsub = 0; - vp = p; - if (letter(*p)) - for (; alnum(*p); p++) - continue; - if (vp == p || !letter(*vp)) - stderror(ERR_NAME | ERR_VARBEGIN); - if ((p - vp) > MAXVARLEN) { - stderror(ERR_NAME | ERR_VARTOOLONG); - return; - } - if (*p == '[') { - hadsub++; - p = getinx(p, &subscr); - } - if ((op = *p) != '\0') { - *p++ = 0; - if (*p == 0 && *v && **v == '(') - p = *v++; - } - else if (*v && eq(*v, STRequal)) { - op = '=', v++; - if (*v) - p = *v++; - } - if (op && op != '=') - stderror(ERR_NAME | ERR_SYNTAX); - if (eq(p, STRLparen)) { - Char **e = v; - - if (hadsub) - stderror(ERR_NAME | ERR_SYNTAX); - for (;;) { - if (!*e) - stderror(ERR_NAME | ERR_MISSING, ')'); - if (**e == ')') - break; - e++; - } - p = *e; - *e = 0; - vecp = saveblk(v); - set1(vp, vecp, &shvhed); - *e = p; - v = e + 1; - } - else if (hadsub) - asx(vp, subscr, Strsave(p)); - else - set(vp, Strsave(p)); - if (eq(vp, STRpath)) { - exportpath(adrof(STRpath)->vec); - dohash(NULL, NULL); - } - else if (eq(vp, STRhistchars)) { - Char *pn = value(STRhistchars); - - HIST = *pn++; - HISTSUB = *pn; - } - else if (eq(vp, STRuser)) { - Setenv(STRUSER, value(vp)); - Setenv(STRLOGNAME, value(vp)); - } - else if (eq(vp, STRwordchars)) { - word_chars = value(vp); - } - else if (eq(vp, STRterm)) - Setenv(STRTERM, value(vp)); - else if (eq(vp, STRhome)) { - Char *cp; - - cp = Strsave(value(vp)); /* get the old value back */ - - /* - * convert to canonical pathname (possibly resolving symlinks) - */ - cp = dcanon(cp, cp); - - set(vp, Strsave(cp)); /* have to save the new val */ - - /* and now mirror home with HOME */ - Setenv(STRHOME, cp); - /* fix directory stack for new tilde home */ - dtilde(); - xfree((ptr_t) cp); - } -#ifdef FILEC - else if (eq(vp, STRfilec)) - filec = 1; -#endif - } while ((p = *v++) != NULL); -} - -static Char * -getinx(cp, ip) - Char *cp; - int *ip; -{ - - *ip = 0; - *cp++ = 0; - while (*cp && Isdigit(*cp)) - *ip = *ip * 10 + *cp++ - '0'; - if (*cp++ != ']') - stderror(ERR_NAME | ERR_SUBSCRIPT); - return (cp); -} - -static void -asx(vp, subscr, p) - Char *vp; - int subscr; - Char *p; -{ - struct varent *v = getvx(vp, subscr); - - xfree((ptr_t) v->vec[subscr - 1]); - v->vec[subscr - 1] = globone(p, G_APPEND); -} - -static struct varent * -getvx(vp, subscr) - Char *vp; - int subscr; -{ - struct varent *v = adrof(vp); - - if (v == 0) - udvar(vp); - if (subscr < 1 || subscr > blklen(v->vec)) - stderror(ERR_NAME | ERR_RANGE); - return (v); -} - -void -/*ARGSUSED*/ -dolet(v, t) - Char **v; - struct command *t; -{ - Char *p; - Char *vp, c, op; - bool hadsub; - int subscr; - - v++; - p = *v++; - if (p == 0) { - prvars(); - return; - } - do { - hadsub = 0; - vp = p; - if (letter(*p)) - for (; alnum(*p); p++) - continue; - if (vp == p || !letter(*vp)) - stderror(ERR_NAME | ERR_VARBEGIN); - if ((p - vp) > MAXVARLEN) - stderror(ERR_NAME | ERR_VARTOOLONG); - if (*p == '[') { - hadsub++; - p = getinx(p, &subscr); - } - if (*p == 0 && *v) - p = *v++; - if ((op = *p) != '\0') - *p++ = 0; - else - stderror(ERR_NAME | ERR_ASSIGN); - - if (*p == '\0' && *v == NULL) - stderror(ERR_NAME | ERR_ASSIGN); - - vp = Strsave(vp); - if (op == '=') { - c = '='; - p = xset(p, &v); - } - else { - c = *p++; - if (any("+-", c)) { - if (c != op || *p) - stderror(ERR_NAME | ERR_UNKNOWNOP); - p = Strsave(STR1); - } - else { - if (any("<>", op)) { - if (c != op) - stderror(ERR_NAME | ERR_UNKNOWNOP); - c = *p++; - stderror(ERR_NAME | ERR_SYNTAX); - } - if (c != '=') - stderror(ERR_NAME | ERR_UNKNOWNOP); - p = xset(p, &v); - } - } - if (op == '=') - if (hadsub) - asx(vp, subscr, p); - else - set(vp, p); - else if (hadsub) { - struct varent *gv = getvx(vp, subscr); - - asx(vp, subscr, operate(op, gv->vec[subscr - 1], p)); - } - else - set(vp, operate(op, value(vp), p)); - if (eq(vp, STRpath)) { - exportpath(adrof(STRpath)->vec); - dohash(NULL, NULL); - } - xfree((ptr_t) vp); - if (c != '=') - xfree((ptr_t) p); - } while ((p = *v++) != NULL); -} - -static Char * -xset(cp, vp) - Char *cp, ***vp; -{ - Char *dp; - - if (*cp) { - dp = Strsave(cp); - --(*vp); - xfree((ptr_t) ** vp); - **vp = dp; - } - return (putn(expr(vp))); -} - -static Char * -operate(op, vp, p) - int op; - Char *vp, *p; -{ - Char opr[2]; - Char *vec[5]; - Char **v = vec; - Char **vecp = v; - int i; - - if (op != '=') { - if (*vp) - *v++ = vp; - opr[0] = op; - opr[1] = 0; - *v++ = opr; - if (op == '<' || op == '>') - *v++ = opr; - } - *v++ = p; - *v++ = 0; - i = expr(&vecp); - if (*vecp) - stderror(ERR_NAME | ERR_EXPRESSION); - return (putn(i)); -} - -static Char *putp; - -Char * -putn(n) - int n; -{ - int num; - static Char number[15]; - - putp = number; - if (n < 0) { - n = -n; - *putp++ = '-'; - } - num = 2; /* confuse lint */ - if (sizeof(int) == num && ((unsigned int) n) == 0x8000) { - *putp++ = '3'; - n = 2768; -#ifdef pdp11 - } -#else - } - else { - num = 4; /* confuse lint */ - if (sizeof(int) == num && ((unsigned int) n) == 0x80000000) { - *putp++ = '2'; - n = 147483648; - } - } -#endif - putn1(n); - *putp = 0; - return (Strsave(number)); -} - -static void -putn1(n) - int n; -{ - if (n > 9) - putn1(n / 10); - *putp++ = n % 10 + '0'; -} - -int -getn(cp) - Char *cp; -{ - int n; - int sign; - - sign = 0; - if (cp[0] == '+' && cp[1]) - cp++; - if (*cp == '-') { - sign++; - cp++; - if (!Isdigit(*cp)) - stderror(ERR_NAME | ERR_BADNUM); - } - n = 0; - while (Isdigit(*cp)) - n = n * 10 + *cp++ - '0'; - if (*cp) - stderror(ERR_NAME | ERR_BADNUM); - return (sign ? -n : n); -} - -Char * -value1(var, head) - Char *var; - struct varent *head; -{ - struct varent *vp; - - vp = adrof1(var, head); - return (vp == 0 || vp->vec[0] == 0 ? STRNULL : vp->vec[0]); -} - -static struct varent * -madrof(pat, vp) - Char *pat; - struct varent *vp; -{ - struct varent *vp1; - - for (; vp; vp = vp->v_right) { - if (vp->v_left && (vp1 = madrof(pat, vp->v_left))) - return vp1; - if (Gmatch(vp->v_name, pat)) - return vp; - } - return vp; -} - -struct varent * -adrof1(name, v) - Char *name; - struct varent *v; -{ - int cmp; - - v = v->v_left; - while (v && ((cmp = *name - *v->v_name) || - (cmp = Strcmp(name, v->v_name)))) - if (cmp < 0) - v = v->v_left; - else - v = v->v_right; - return v; -} - -/* - * The caller is responsible for putting value in a safe place - */ -void -set(var, val) - Char *var, *val; -{ - Char **vec = (Char **) xmalloc((size_t) (2 * sizeof(Char **))); - - vec[0] = val; - vec[1] = 0; - set1(var, vec, &shvhed); -} - -void -set1(var, vec, head) - Char *var, **vec; - struct varent *head; -{ - Char **oldv = vec; - - gflag = 0; - tglob(oldv); - if (gflag) { - vec = globall(oldv); - if (vec == 0) { - blkfree(oldv); - stderror(ERR_NAME | ERR_NOMATCH); - return; - } - blkfree(oldv); - gargv = 0; - } - setq(var, vec, head); -} - - -void -setq(name, vec, p) - Char *name, **vec; - struct varent *p; -{ - struct varent *c; - int f; - - f = 0; /* tree hangs off the header's left link */ - while ((c = p->v_link[f]) != NULL) { - if ((f = *name - *c->v_name) == 0 && - (f = Strcmp(name, c->v_name)) == 0) { - blkfree(c->vec); - goto found; - } - p = c; - f = f > 0; - } - p->v_link[f] = c = (struct varent *) xmalloc((size_t) sizeof(struct varent)); - c->v_name = Strsave(name); - c->v_bal = 0; - c->v_left = c->v_right = 0; - c->v_parent = p; - balance(p, f, 0); -found: - trim(c->vec = vec); -} - -void -/*ARGSUSED*/ -unset(v, t) - Char **v; - struct command *t; -{ - unset1(v, &shvhed); -#ifdef FILEC - if (adrof(STRfilec) == 0) - filec = 0; -#endif - if (adrof(STRhistchars) == 0) { - HIST = '!'; - HISTSUB = '^'; - } - if (adrof(STRwordchars) == 0) - word_chars = STR_WORD_CHARS; -} - -void -unset1(v, head) - Char *v[]; - struct varent *head; -{ - struct varent *vp; - int cnt; - - while (*++v) { - cnt = 0; - while ((vp = madrof(*v, head->v_left)) != NULL) - unsetv1(vp), cnt++; - if (cnt == 0) - setname(vis_str(*v)); - } -} - -void -unsetv(var) - Char *var; -{ - struct varent *vp; - - if ((vp = adrof1(var, &shvhed)) == 0) - udvar(var); - unsetv1(vp); -} - -static void -unsetv1(p) - struct varent *p; -{ - struct varent *c, *pp; - int f; - - /* - * Free associated memory first to avoid complications. - */ - blkfree(p->vec); - xfree((ptr_t) p->v_name); - /* - * If p is missing one child, then we can move the other into where p is. - * Otherwise, we find the predecessor of p, which is guaranteed to have no - * right child, copy it into p, and move it's left child into it. - */ - if (p->v_right == 0) - c = p->v_left; - else if (p->v_left == 0) - c = p->v_right; - else { - for (c = p->v_left; c->v_right; c = c->v_right) - continue; - p->v_name = c->v_name; - p->vec = c->vec; - p = c; - c = p->v_left; - } - /* - * Move c into where p is. - */ - pp = p->v_parent; - f = pp->v_right == p; - if ((pp->v_link[f] = c) != NULL) - c->v_parent = pp; - /* - * Free the deleted node, and rebalance. - */ - xfree((ptr_t) p); - balance(pp, f, 1); -} - -void -setNS(cp) - Char *cp; -{ - set(cp, Strsave(STRNULL)); -} - -void -/*ARGSUSED*/ -shift(v, t) - Char **v; - struct command *t; -{ - struct varent *argv; - Char *name; - - v++; - name = *v; - if (name == 0) - name = STRargv; - else - (void) strip(name); - argv = adrof(name); - if (argv == 0) - udvar(name); - if (argv->vec[0] == 0) - stderror(ERR_NAME | ERR_NOMORE); - lshift(argv->vec, 1); -} - -static void -exportpath(val) - Char **val; -{ - Char exppath[BUFSIZ]; - - exppath[0] = 0; - if (val) - while (*val) { - if (Strlen(*val) + Strlen(exppath) + 2 > BUFSIZ) { - (void) fprintf(csherr, - "Warning: ridiculously long PATH truncated\n"); - break; - } - if (**val != '/' && (euid == 0 || uid == 0) && - (intact || (intty && isatty(SHOUT)))) - (void) fprintf(csherr, - "Warning: exported path contains relative components.\n"); - (void) Strcat(exppath, *val++); - if (*val == 0 || eq(*val, STRRparen)) - break; - (void) Strcat(exppath, STRcolon); - } - Setenv(STRPATH, exppath); -} - -#ifndef lint - /* - * Lint thinks these have null effect - */ - /* macros to do single rotations on node p */ -#define rright(p) (\ - t = (p)->v_left,\ - (t)->v_parent = (p)->v_parent,\ - ((p)->v_left = t->v_right) ? (t->v_right->v_parent = (p)) : 0,\ - (t->v_right = (p))->v_parent = t,\ - (p) = t) -#define rleft(p) (\ - t = (p)->v_right,\ - (t)->v_parent = (p)->v_parent,\ - ((p)->v_right = t->v_left) ? (t->v_left->v_parent = (p)) : 0,\ - (t->v_left = (p))->v_parent = t,\ - (p) = t) -#else -struct varent * -rleft(p) - struct varent *p; -{ - return (p); -} -struct varent * -rright(p) - struct varent *p; -{ - return (p); -} - -#endif /* ! lint */ - - -/* - * Rebalance a tree, starting at p and up. - * F == 0 means we've come from p's left child. - * D == 1 means we've just done a delete, otherwise an insert. - */ -static void -balance(p, f, d) - struct varent *p; - int f, d; -{ - struct varent *pp; - -#ifndef lint - struct varent *t; /* used by the rotate macros */ - -#endif - int ff; - - /* - * Ok, from here on, p is the node we're operating on; pp is it's parent; f - * is the branch of p from which we have come; ff is the branch of pp which - * is p. - */ - for (; (pp = p->v_parent) != NULL; p = pp, f = ff) { - ff = pp->v_right == p; - if (f ^ d) { /* right heavy */ - switch (p->v_bal) { - case -1: /* was left heavy */ - p->v_bal = 0; - break; - case 0: /* was balanced */ - p->v_bal = 1; - break; - case 1: /* was already right heavy */ - switch (p->v_right->v_bal) { - case 1: /* single rotate */ - pp->v_link[ff] = rleft(p); - p->v_left->v_bal = 0; - p->v_bal = 0; - break; - case 0: /* single rotate */ - pp->v_link[ff] = rleft(p); - p->v_left->v_bal = 1; - p->v_bal = -1; - break; - case -1: /* double rotate */ - (void) rright(p->v_right); - pp->v_link[ff] = rleft(p); - p->v_left->v_bal = - p->v_bal < 1 ? 0 : -1; - p->v_right->v_bal = - p->v_bal > -1 ? 0 : 1; - p->v_bal = 0; - break; - } - break; - } - } - else { /* left heavy */ - switch (p->v_bal) { - case 1: /* was right heavy */ - p->v_bal = 0; - break; - case 0: /* was balanced */ - p->v_bal = -1; - break; - case -1: /* was already left heavy */ - switch (p->v_left->v_bal) { - case -1: /* single rotate */ - pp->v_link[ff] = rright(p); - p->v_right->v_bal = 0; - p->v_bal = 0; - break; - case 0: /* single rotate */ - pp->v_link[ff] = rright(p); - p->v_right->v_bal = -1; - p->v_bal = 1; - break; - case 1: /* double rotate */ - (void) rleft(p->v_left); - pp->v_link[ff] = rright(p); - p->v_left->v_bal = - p->v_bal < 1 ? 0 : -1; - p->v_right->v_bal = - p->v_bal > -1 ? 0 : 1; - p->v_bal = 0; - break; - } - break; - } - } - /* - * If from insert, then we terminate when p is balanced. If from - * delete, then we terminate when p is unbalanced. - */ - if ((p->v_bal == 0) ^ d) - break; - } -} - -void -plist(p) - struct varent *p; -{ - struct varent *c; - int len; - - if (setintr) - (void) sigsetmask(sigblock(0) & ~sigmask(SIGINT)); - - for (;;) { - while (p->v_left) - p = p->v_left; -x: - if (p->v_parent == 0) /* is it the header? */ - return; - len = blklen(p->vec); - (void) fprintf(cshout, "%s\t", short2str(p->v_name)); - if (len != 1) - (void) fputc('(', cshout); - blkpr(cshout, p->vec); - if (len != 1) - (void) fputc(')', cshout); - (void) fputc('\n', cshout); - if (p->v_right) { - p = p->v_right; - continue; - } - do { - c = p; - p = p->v_parent; - } while (p->v_right == c); - goto x; - } -} diff --git a/bin/csh/str.c b/bin/csh/str.c deleted file mode 100644 index e205e22..0000000 --- a/bin/csh/str.c +++ /dev/null @@ -1,472 +0,0 @@ -/*- - * Copyright (c) 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -#if 0 -static char sccsid[] = "@(#)str.c 8.1 (Berkeley) 5/31/93"; -#else -static const char rcsid[] = - "$FreeBSD$"; -#endif -#endif /* not lint */ - -#define MALLOC_INCR 128 - -/* - * tc.str.c: Short string package - * This has been a lesson of how to write buggy code! - */ - -#include <sys/types.h> -#if __STDC__ -# include <stdarg.h> -#else -# include <varargs.h> -#endif -#include <vis.h> - -#include "csh.h" -#include "extern.h" - -#ifdef SHORT_STRINGS - -Char ** -blk2short(src) - char **src; -{ - size_t n; - Char **sdst, **dst; - - /* - * Count - */ - for (n = 0; src[n] != NULL; n++) - continue; - sdst = dst = (Char **) xmalloc((size_t) ((n + 1) * sizeof(Char *))); - - for (; *src != NULL; src++) - *dst++ = SAVE(*src); - *dst = NULL; - return (sdst); -} - -char ** -short2blk(src) - Char **src; -{ - size_t n; - char **sdst, **dst; - - /* - * Count - */ - for (n = 0; src[n] != NULL; n++) - continue; - sdst = dst = (char **) xmalloc((size_t) ((n + 1) * sizeof(char *))); - - for (; *src != NULL; src++) - *dst++ = strsave(short2str(*src)); - *dst = NULL; - return (sdst); -} - -Char * -str2short(src) - char *src; -{ - static Char *sdst; - static size_t dstsize = 0; - Char *dst, *edst; - - if (src == NULL) - return (NULL); - - if (sdst == (NULL)) { - dstsize = MALLOC_INCR; - sdst = (Char *) xmalloc((size_t) dstsize * sizeof(Char)); - } - - dst = sdst; - edst = &dst[dstsize]; - while (*src) { - *dst++ = (Char) ((unsigned char) *src++); - if (dst == edst) { - dstsize += MALLOC_INCR; - sdst = (Char *) xrealloc((ptr_t) sdst, - (size_t) dstsize * sizeof(Char)); - edst = &sdst[dstsize]; - dst = &edst[-MALLOC_INCR]; - } - } - *dst = 0; - return (sdst); -} - -char * -short2str(src) - Char *src; -{ - static char *sdst = NULL; - static size_t dstsize = 0; - char *dst, *edst; - - if (src == NULL) - return (NULL); - - if (sdst == NULL) { - dstsize = MALLOC_INCR; - sdst = (char *) xmalloc((size_t) dstsize * sizeof(char)); - } - dst = sdst; - edst = &dst[dstsize]; - while (*src) { - *dst++ = (char) *src++; - if (dst == edst) { - dstsize += MALLOC_INCR; - sdst = (char *) xrealloc((ptr_t) sdst, - (size_t) dstsize * sizeof(char)); - edst = &sdst[dstsize]; - dst = &edst[-MALLOC_INCR]; - } - } - *dst = 0; - return (sdst); -} - -Char * -s_strcpy(dst, src) - Char *dst, *src; -{ - Char *sdst; - - sdst = dst; - while ((*dst++ = *src++) != '\0') - continue; - return (sdst); -} - -Char * -s_strncpy(dst, src, n) - Char *dst, *src; - size_t n; -{ - Char *sdst; - - if (n == 0) - return(dst); - - sdst = dst; - do - if ((*dst++ = *src++) == '\0') { - while (--n != 0) - *dst++ = '\0'; - return(sdst); - } - while (--n != 0); - return (sdst); -} - -Char * -s_strcat(dst, src) - Char *dst, *src; -{ - short *sdst; - - sdst = dst; - while (*dst++) - continue; - --dst; - while ((*dst++ = *src++) != '\0') - continue; - return (sdst); -} - -#ifdef NOTUSED -Char * -s_strncat(dst, src, n) - Char *dst, *src; - size_t n; -{ - Char *sdst; - - if (n == 0) - return (dst); - - sdst = dst; - - while (*dst++) - continue; - --dst; - - do - if ((*dst++ = *src++) == '\0') - return(sdst); - while (--n != 0) - continue; - - *dst = '\0'; - return (sdst); -} - -#endif - -Char * -s_strchr(str, ch) - Char *str; - int ch; -{ - do - if (*str == ch) - return (str); - while (*str++); - return (NULL); -} - -Char * -s_strrchr(str, ch) - Char *str; - int ch; -{ - Char *rstr; - - rstr = NULL; - do - if (*str == ch) - rstr = str; - while (*str++); - return (rstr); -} - -size_t -s_strlen(str) - Char *str; -{ - size_t n; - - for (n = 0; *str++; n++) - continue; - return (n); -} - -int -s_strcmp(str1, str2) - Char *str1, *str2; -{ - for (; *str1 && *str1 == *str2; str1++, str2++) - continue; - /* - * The following case analysis is necessary so that characters which look - * negative collate low against normal characters but high against the - * end-of-string NUL. - */ - if (*str1 == '\0' && *str2 == '\0') - return (0); - else if (*str1 == '\0') - return (-1); - else if (*str2 == '\0') - return (1); - else - return (*str1 - *str2); -} - -int -s_strncmp(str1, str2, n) - Char *str1, *str2; - size_t n; -{ - if (n == 0) - return (0); - do { - if (*str1 != *str2) { - /* - * The following case analysis is necessary so that characters - * which look negative collate low against normal characters - * but high against the end-of-string NUL. - */ - if (*str1 == '\0') - return (-1); - else if (*str2 == '\0') - return (1); - else - return (*str1 - *str2); - break; - } - if (*str1 == '\0') - return(0); - str1++, str2++; - } while (--n != 0); - return(0); -} - -Char * -s_strsave(s) - Char *s; -{ - Char *n; - Char *p; - - if (s == 0) - s = STRNULL; - for (p = s; *p++;) - continue; - n = p = (Char *) xmalloc((size_t) ((p - s) * sizeof(Char))); - while ((*p++ = *s++) != '\0') - continue; - return (n); -} - -Char * -s_strspl(cp, dp) - Char *cp, *dp; -{ - Char *ep; - Char *p, *q; - - if (!cp) - cp = STRNULL; - if (!dp) - dp = STRNULL; - for (p = cp; *p++;) - continue; - for (q = dp; *q++;) - continue; - ep = (Char *) xmalloc((size_t) - (((p - cp) + (q - dp) - 1) * sizeof(Char))); - for (p = ep, q = cp; (*p++ = *q++) != '\0';) - continue; - for (p--, q = dp; (*p++ = *q++) != '\0';) - continue; - return (ep); -} - -Char * -s_strend(cp) - Char *cp; -{ - if (!cp) - return (cp); - while (*cp) - cp++; - return (cp); -} - -Char * -s_strstr(s, t) - Char *s, *t; -{ - do { - Char *ss = s; - Char *tt = t; - - do - if (*tt == '\0') - return (s); - while (*ss++ == *tt++); - } while (*s++ != '\0'); - return (NULL); -} -#endif /* SHORT_STRINGS */ - -char * -short2qstr(src) - Char *src; -{ - static char *sdst = NULL; - static size_t dstsize = 0; - char *dst, *edst; - - if (src == NULL) - return (NULL); - - if (sdst == NULL) { - dstsize = MALLOC_INCR; - sdst = (char *) xmalloc((size_t) dstsize * sizeof(char)); - } - dst = sdst; - edst = &dst[dstsize]; - while (*src) { - if (*src & QUOTE) { - *dst++ = '\\'; - if (dst == edst) { - dstsize += MALLOC_INCR; - sdst = (char *) xrealloc((ptr_t) sdst, - (size_t) dstsize * sizeof(char)); - edst = &sdst[dstsize]; - dst = &edst[-MALLOC_INCR]; - } - } - *dst++ = (char) *src++; - if (dst == edst) { - dstsize += MALLOC_INCR; - sdst = (char *) xrealloc((ptr_t) sdst, - (size_t) dstsize * sizeof(char)); - edst = &sdst[dstsize]; - dst = &edst[-MALLOC_INCR]; - } - } - *dst = 0; - return (sdst); -} - -/* - * XXX: Should we worry about QUOTE'd chars? - */ -char * -vis_str(cp) - Char *cp; -{ - static char *sdst = NULL; - static size_t dstsize = 0; - size_t n; - Char *dp; - - if (cp == NULL) - return (NULL); - - for (dp = cp; *dp++;) - continue; - n = ((dp - cp) << 2) + 1; /* 4 times + NULL */ - if (dstsize < n) { - sdst = (char *) (dstsize ? - xrealloc(sdst, (size_t) n * sizeof(char)) : - xmalloc((size_t) n * sizeof(char))); - dstsize = n; - } - /* - * XXX: When we are in AsciiOnly we want all characters >= 0200 to - * be encoded, but currently there is no way in vis to do that. - */ - (void) strvis(sdst, short2str(cp), VIS_NOSLASH); - return (sdst); -} - diff --git a/bin/csh/tc.defs.c b/bin/csh/tc.defs.c new file mode 100644 index 0000000..484e72b --- /dev/null +++ b/bin/csh/tc.defs.c @@ -0,0 +1,2709 @@ +/* $FreeBSD$ */ + +/* Do not edit this file, make creates it */ +/* $Header: /src/pub/tcsh/host.defs,v 1.25 1999/04/20 07:48:41 christos Exp $ */ +/* + * host.defs: Hosttype/Machtype etc. + */ +/*- + * Copyright (c) 1980, 1991 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include "sh.h" + +RCSID("$Id: host.defs,v 1.25 1999/04/20 07:48:41 christos Exp $") + + + +#if (defined(mips) || defined(__mips)) && (defined(MIPSEL) || defined(__MIPSEL)) +# define M_mipsel +#endif + + +#if (defined(mips) || defined(__mips)) && (defined(MIPSEB) || defined(__MIPSEB)) +# define M_mipseb +#endif + + +#if (defined(i386) || defined(__i386__)) +# define M_i386 +#endif + + +#if (defined(i486) || defined(__i486__)) +# define M_i486 +#endif + + +#if (defined(i586) || defined(__i586__)) +# define M_i586 +#endif + + +#if (defined(M_i386) || defined(M_i486) || defined(M_i586)) +# define M_intel +#endif + + + + +#if defined(ns32000) +static char * +isamultimax(flag) + int flag; +{ + if (access("/Umax.image", F_OK) == 0) + return "multimax"; + else + return flag ? "mach" : "ns32000"; +} +#endif + + + + +#if defined(cray) +/* + * On crays, find the current machine type via the target() syscall + * We need ctype.h to convert the name returned to lower case + */ +# include <sys/target.h> +# include <ctype.h> +# include <string.h> + +/* From: hpa@hook.eecs.nwu.edu (H. Peter Anvin) */ +static char * +getcray() +{ +# ifdef MC_GET_SYSTEM /* If we have target() */ + struct target data; + + if (target(MC_GET_SYSTEM, &data) != -1) { + static char hosttype_buf[sizeof(data.mc_pmt)+1]; + char *p = (char *) &(data.mc_pmt); + char *q = hosttype_buf; + int n; + + /* + * Copy to buffer and convert to lower case + * String may not be null-terminated, so keep a counter + */ + for (n = 0; *p && n < sizeof(data.mc_pmt); n++) + *q++ = tolower(p[n]); + + *q = '\0'; + + /* replace dashes with underscores if present */ + while ((q = strchr(hosttype_buf, '-')) != NULL) + *q = '_'; + return hosttype_buf; /* Return in static buffer */ + } + else +# endif /* MC_GET_SYSTEM */ + return "cray"; /* target() failed */ +} +#endif + + + + +#if defined(convex) +/* + * On convex, find the current machine type via the getsysinfo() syscall + */ +#include <sys/sysinfo.h> + +/* From: fox@convex.com (David DeSimone) */ +static char * +getconvex() +{ + struct system_information sysinfo; + static char result[8]; + + if (getsysinfo(SYSINFO_SIZE, &sysinfo) == -1) + return "convex"; + + switch(sysinfo.cpu_type) { +#ifdef SI_CPUTYPE_C1 + case SI_CPUTYPE_C1: + return "c1"; +#endif + +#ifdef SI_CPUTYPE_C2 + case SI_CPUTYPE_C2: + return "c2"; +#endif + +#ifdef SI_CPUTYPE_C2MP + case SI_CPUTYPE_C2MP: + (void) strcpy(result, "c2X0"); + result[2] = sysinfo.cpu_count + '0'; + return result; +#endif + +#ifdef SI_CPUTYPE_C34 + case SI_CPUTYPE_C34: + (void) strcpy(result, "c34X0"); + result[3] = sysinfo.cpu_count + '0'; + return result; +#endif + +#ifdef SI_CPUTYPE_C38 + case SI_CPUTYPE_C38: + (void) strcpy(result, "c38X0"); + result[3] = sysinfo.cpu_count + '0'; + return result; +#endif + +#ifdef SI_CPUTYPE_C46 + case SI_CPUTYPE_C46: + (void) strcpy(result, "c46X0"); + result[3] = sysinfo.cpu_count + '0'; + return result; +#endif + + default: + return "convex"; + } +} +#endif + + +void +getmachine() +{ + char *hosttype; + char *ostype; + char *vendor; + char *machtype; + + + + + +#if defined(__PARAGON__) + /* Intel Paragon running OSF/1 */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "intel"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "paragon"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "osf1"; +# endif +# if (defined(M_i386)) && !defined(_machtype_) +# define _machtype_ + machtype = "i386"; +# endif +#endif + + + + +#if defined(AMIX) + /* Amiga running Amix 2.02 */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "commodore"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "amiga"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "Amix"; +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = "m68k"; +# endif +#endif + + + + +#if defined(accel) + /* celerity Accel */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "celerity"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "celerityACCEL"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "unix"; +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = "accel"; +# endif +#endif + + + + +#if defined(_VMS_POSIX) + /* digital vax or alpha running vms posix */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "dec"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "VMS-POSIX"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "vms"; +# endif +# if (defined(__alpha)) && !defined(_machtype_) +# define _machtype_ + machtype = "alpha"; +# endif +# if (defined(__vax) || defined(vax)) && !defined(_machtype_) +# define _machtype_ + machtype = "vax"; +# endif +# if (defined(__vax__)) && !defined(_machtype_) +# define _machtype_ + machtype = "vax"; +# endif +#endif + + + + +#if defined(__hp_osf) + /* Hewlett Packard running OSF/1 */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "hp"; +# endif +# if (defined(__pa_risc)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "hp9000s700-osf1"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "hp-osf1"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "osf1"; +# endif +# if (defined(__pa_risc)) && !defined(_machtype_) +# define _machtype_ + machtype = "pa_risc"; +# endif +#endif + + + + +#if defined(hp9000) + /* Hewlett Packard running MORE/bsd */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "hp"; +# endif +# if (defined(hp300)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "hp300"; +# endif +# if (defined(hp800)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "hp800"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "hp9000"; +# endif +# if (defined(BSD4_4)) && !defined(_ostype_) +# define _ostype_ + ostype = "bsd44"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "mtXinu"; +# endif +# if (defined(hp300)) && !defined(_machtype_) +# define _machtype_ + machtype = "m68k"; +# endif +# if (defined(hp800)) && !defined(_machtype_) +# define _machtype_ + machtype = "pa_risc"; +# endif +#endif + + + + +#if defined(hpux) || defined(__hpux) + /* Hewlett Packard running HP/UX */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "hp"; +# endif +# if (defined(__hp9000s700)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "hp9000s700"; +# endif +# if (defined(__hp9000s800) || defined(hp9000s800)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "hp9000s800"; +# endif +# if (defined(hp9000s500)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "hp9000s500"; +# endif +# if (defined(__hp9000s300) || defined(hp9000s300)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "hp9000s300"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "hp"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "hpux"; +# endif +# if (defined(__hp9000s700)) && !defined(_machtype_) +# define _machtype_ + machtype = "pa_risc"; +# endif +# if (defined(__hp9000s800) || defined(hp9000s800)) && !defined(_machtype_) +# define _machtype_ + machtype = "pa_risc"; +# endif +# if (defined(hp9000s500)) && !defined(_machtype_) +# define _machtype_ + machtype = "m68k"; +# endif +# if (defined(__hp9000s300) || defined(hp9000s300)) && !defined(_machtype_) +# define _machtype_ + machtype = "m68k"; +# endif +#endif + + + + +#if defined(apollo) + /* Hewlett Packard apollo running Domain/OS */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "hp"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "apollo"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "DomainOS"; +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = "m68k"; +# endif +#endif + + + + +#if defined(sun) || defined(__sun__) + /* Sun Microsystems series 2 workstation (68010 based) */ + /* Sun Microsystems series 3 workstation (68020 based) */ + /* Sun Microsystems 386i workstation (386 based) */ + /* Sun Microsystems series 4 workstation (SPARC based) */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "sun"; +# endif +# if (defined(M_i386) && !defined(__SVR4)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "sun386i"; +# endif +# if (defined(M_i386) && defined(__SVR4)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "i86pc"; +# endif +# if (defined(mc68010) || defined(__mc68010__)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "sun2"; +# endif +# if (defined(mc68020) || defined(__mc68020__)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "sun3"; +# endif +# if (defined(sparc) || defined(__sparc__)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "sun4"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "sun"; +# endif +# if (defined(SUNOS3)) && !defined(_ostype_) +# define _ostype_ + ostype = "sunos3"; +# endif +# if (defined(SUNOS4)) && !defined(_ostype_) +# define _ostype_ + ostype = "sunos4"; +# endif +# if (defined(SOLARIS2)) && !defined(_ostype_) +# define _ostype_ + ostype = "solaris"; +# endif +# if (defined(mc68010) || defined(__mc68010__)) && !defined(_machtype_) +# define _machtype_ + machtype = "m68k"; +# endif +# if (defined(mc68020) || defined(__mc68020__)) && !defined(_machtype_) +# define _machtype_ + machtype = "m68k"; +# endif +# if (defined(sparc) || defined(__sparc__)) && !defined(_machtype_) +# define _machtype_ + machtype = "sparc"; +# endif +# if (defined(M_i386)) && !defined(_machtype_) +# define _machtype_ + machtype = "i386"; +# endif +#endif + + + + +#if defined(pyr) + /* Pyramid Technology */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "pyramid"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "pyramid"; +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = "pyramid"; +# endif +#endif + + + + +#if defined(hcx) || defined(_CX_UX) + /* Harris Tahoe running CX/UX */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "harris"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "hcx"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "hcx"; +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = "tahoe"; +# endif +#endif + + + + +#if defined(tahoe) + /* Harris Tahoe */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "harris"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "tahoe"; +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = "tahoe"; +# endif +#endif + + + + +#if defined(ibm032) + /* RT running IBM AOS4.3 or MACH */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "ibm"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "rt"; +# endif +# if (defined(MACH)) && !defined(_ostype_) +# define _ostype_ + ostype = "mach"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "aos"; +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = "ibm032"; +# endif +#endif + + + + +#if defined(aiws) + /* RT running IBM aix2.x */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "ibm"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "rtpc"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "aix"; +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = "ibm032"; +# endif +#endif + + + + +#if defined(_AIX370) + /* IBM/370 running aix */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "ibm"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "aix370"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "aix"; +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = "ibm370"; +# endif +#endif + + + + +#if defined(_IBMESA) + /* IBM/ESA running aix */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "ibm"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "aixESA"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "aix"; +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = "esa"; +# endif +#endif + + + + +#if defined(_IBMR2) + /* IBM/RS6000 running aix */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "ibm"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "rs6000"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "aix"; +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = "rs6000"; +# endif +#endif + + + + +#if defined(_AIXPS2) + /* IBM/PS2 running aix */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "ibm"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "ps2"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "aix"; +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = "i386"; +# endif +#endif + + + + +#if defined(OREO) + /* Macintosh running AU/X */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "apple"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "mac2"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "aux"; +# endif +# if (defined(mc68020)) && !defined(_machtype_) +# define _machtype_ + machtype = "m68k"; +# endif +#endif + + + + +#if defined(u3b20d) + /* AT&T 3B/20 series running SVR2/3 */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "att"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "att3b20"; +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = "u3b20"; +# endif +#endif + + + + +#if defined(u3b15) + /* AT&T 3B/15 series running SVR2/3 */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "att"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "att3b15"; +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = "u3b15"; +# endif +#endif + + + + +#if defined(u3b5) + /* AT&T 3B/5 series running SVR2/3 */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "att"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "att3b5"; +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = "u3b5"; +# endif +#endif + + + + +#if defined(u3b2) + /* AT&T 3B/2 series running SVR2/3 */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "att"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "att3b2"; +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = "u3b2"; +# endif +#endif + + + + +#if defined(UNIXPC) + /* AT&T UnixPC att3b1/att7300 */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "att"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "unixpc"; +# endif +# if (defined(u3b1)) && !defined(_machtype_) +# define _machtype_ + machtype = "u3b1"; +# endif +# if (defined(att7300)) && !defined(_machtype_) +# define _machtype_ + machtype = "att7300"; +# endif +#endif + + + + +#if defined(_MINIX) + /* Andy Tanenbaum's minix */ +# if (defined(M_i386)) && !defined(_vendor_) +# define _vendor_ + vendor = "intel"; +# endif +# if (defined(M_i386)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "minix386"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "minix"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "minix"; +# endif +# if (defined(M_i386)) && !defined(_machtype_) +# define _machtype_ + machtype = "i386"; +# endif +#endif + + + + +#if defined(linux) + /* Linus Torvalds's linux */ +# if (defined(M_intel)) && !defined(_vendor_) +# define _vendor_ + vendor = "intel"; +# endif +# if (defined(M_i586)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "i586-linux"; +# endif +# if (defined(M_i486)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "i486-linux"; +# endif +# if (defined(M_i386)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "i386-linux"; +# endif +# if (!defined(PPC)) && !defined(_ostype_) +# define _ostype_ + ostype = "linux"; +# endif +# if (defined(PPC)) && !defined(_ostype_) +# define _ostype_ + ostype = "mklinux"; +# endif +# if (defined(M_i586)) && !defined(_machtype_) +# define _machtype_ + machtype = "i586"; +# endif +# if (defined(M_i486)) && !defined(_machtype_) +# define _machtype_ + machtype = "i486"; +# endif +# if (defined(M_i386)) && !defined(_machtype_) +# define _machtype_ + machtype = "i386"; +# endif +# if (defined(__alpha)) && !defined(_vendor_) +# define _vendor_ + vendor = "dec"; +# endif +# if (defined(PPC)) && !defined(_vendor_) +# define _vendor_ + vendor = "apple"; +# endif +# if (defined(__alpha)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "alpha"; +# endif +# if (defined(PPC)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "powerpc"; +# endif +# if (defined(__alpha)) && !defined(_machtype_) +# define _machtype_ + machtype = "alpha"; +# endif +# if (defined(PPC)) && !defined(_machtype_) +# define _machtype_ + machtype = "powerpc"; +# endif +#endif + + + + +#if defined(__EMX__) + /* OS/2 EMX [unix emulation under OS/2] */ +# if (defined(M_intel)) && !defined(_vendor_) +# define _vendor_ + vendor = "intel"; +# endif +# if (defined(M_i386)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "i386-emx"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "os2"; +# endif +# if (defined(M_i386)) && !defined(_machtype_) +# define _machtype_ + machtype = "i386"; +# endif +#endif + + + + +#if defined(__NetBSD__) + /* NetBSD */ +# if (defined(arm32)) && !defined(_vendor_) +# define _vendor_ + vendor = "acorn"; +# endif +# if (defined(alpha)) && !defined(_vendor_) +# define _vendor_ + vendor = "digital"; +# endif +# if (defined(amiga)) && !defined(_vendor_) +# define _vendor_ + vendor = "commodore"; +# endif +# if (defined(atari)) && !defined(_vendor_) +# define _vendor_ + vendor = "atari"; +# endif +# if (defined(hp300)) && !defined(_vendor_) +# define _vendor_ + vendor = "hp"; +# endif +# if (defined(M_intel)) && !defined(_vendor_) +# define _vendor_ + vendor = "intel"; +# endif +# if (defined(m68k)) && !defined(_vendor_) +# define _vendor_ + vendor = "motorola"; +# endif +# if (defined(mac68k)) && !defined(_vendor_) +# define _vendor_ + vendor = "apple"; +# endif +# if (defined(pc532)) && !defined(_vendor_) +# define _vendor_ + vendor = "national-semi"; +# endif +# if (defined(pmax) || defined(mips)) && !defined(_vendor_) +# define _vendor_ + vendor = "dec"; +# endif +# if (defined(M_mipsel)) && !defined(_vendor_) +# define _vendor_ + vendor = "dec"; +# endif +# if (defined(sparc)) && !defined(_vendor_) +# define _vendor_ + vendor = "sun"; +# endif +# if (defined(sun3)) && !defined(_vendor_) +# define _vendor_ + vendor = "sun"; +# endif +# if (defined(vax)) && !defined(_vendor_) +# define _vendor_ + vendor = "digital"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "NetBSD"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "NetBSD"; +# endif +# if (defined(arm32)) && !defined(_machtype_) +# define _machtype_ + machtype = "arm32"; +# endif +# if (defined(sparc)) && !defined(_machtype_) +# define _machtype_ + machtype = "sparc"; +# endif +# if (defined(mc68020)) && !defined(_machtype_) +# define _machtype_ + machtype = "m68k"; +# endif +# if (defined(M_i386)) && !defined(_machtype_) +# define _machtype_ + machtype = "i386"; +# endif +# if (defined(M_mipsel)) && !defined(_machtype_) +# define _machtype_ + machtype = "mipsel"; +# endif +# if (defined(M_mipseb)) && !defined(_machtype_) +# define _machtype_ + machtype = "mipseb"; +# endif +# if (defined(mips)) && !defined(_machtype_) +# define _machtype_ + machtype = "mips"; +# endif +# if (defined(pc532)) && !defined(_machtype_) +# define _machtype_ + machtype = "pc532"; +# endif +# if (defined(vax)) && !defined(_machtype_) +# define _machtype_ + machtype = "vax"; +# endif +# if (defined(alpha)) && !defined(_machtype_) +# define _machtype_ + machtype = "alpha"; +# endif +#endif + + + + +#if defined(__FreeBSD__) + /* FreeBSD */ +# if (defined(__alpha)) && !defined(_vendor_) +# define _vendor_ + vendor = "digital"; +# endif +# if (defined(M_intel)) && !defined(_vendor_) +# define _vendor_ + vendor = "intel"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "FreeBSD"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "FreeBSD"; +# endif +# if (defined(__alpha)) && !defined(_machtype_) +# define _machtype_ + machtype = "alpha"; +# endif +# if (defined(M_i386)) && !defined(_machtype_) +# define _machtype_ + machtype = "i386"; +# endif +#endif + + + + +#if defined(__386BSD__) + /* Bill Jolitz's 386BSD */ +# if (defined(M_intel)) && !defined(_vendor_) +# define _vendor_ + vendor = "intel"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "386BSD"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "386BSD"; +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = "i386"; +# endif +#endif + + + + +#if defined(bsdi) + /* BSDI's unix */ +# if (defined(M_intel)) && !defined(_vendor_) +# define _vendor_ + vendor = "intel"; +# endif +# if (defined(sparc)) && !defined(_vendor_) +# define _vendor_ + vendor = "sun"; +# endif +# if (defined(__powerpc__)) && !defined(_vendor_) +# define _vendor_ + vendor = "motorola"; +# endif +# if (defined(M_intel)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "bsd386"; +# endif +# if (defined(sparc)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "bsd-sparc"; +# endif +# if (defined(__powerpc__)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "bsd-powerpc"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "bsdi"; +# endif +# if (defined(M_i386)) && !defined(_machtype_) +# define _machtype_ + machtype = "i386"; +# endif +# if (defined(sparc)) && !defined(_machtype_) +# define _machtype_ + machtype = "sparc"; +# endif +# if (defined(__powerpc__)) && !defined(_machtype_) +# define _machtype_ + machtype = "powerpc"; +# endif +#endif + + + + +#if defined(COHERENT) + /* COHERENT's unix */ +# if (defined(_I386)) && !defined(_vendor_) +# define _vendor_ + vendor = "intel"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "coh386"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "coherent"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "coherent"; +# endif +# if (defined(_I386)) && !defined(_machtype_) +# define _machtype_ + machtype = "i386"; +# endif +#endif + + + +#if defined(SCO) + /* SCO UNIX System V/386 Release 3.2 */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "sco"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "sco386"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "sco_unix"; +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = "i386"; +# endif +#endif + + + +#if defined(M_XENIX) && !defined(M_UNIX) + /* SCO XENIX */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "sco"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "sco_xenix"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "sco_xenix"; +# endif +# if (defined(M_I386)) && !defined(_machtype_) +# define _machtype_ + machtype = "i386"; +# endif +# if (defined(M_I286)) && !defined(_machtype_) +# define _machtype_ + machtype = "i286"; +# endif +#endif + + + + +#if defined(ISC) || defined(ISC202) + /* Interactive Unix */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "isc"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "isc386"; +# endif +# if (defined(POSIX)) && !defined(_ostype_) +# define _ostype_ + ostype = "POSIX"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "SVR3"; +# endif +# if (defined(M_i386)) && !defined(_machtype_) +# define _machtype_ + machtype = "i386"; +# endif +#endif + + + + +#if defined(INTEL) + /* Intel Unix */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "intel"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "intel386"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "intel_unix"; +# endif +# if (defined(M_i386)) && !defined(_machtype_) +# define _machtype_ + machtype = "i386"; +# endif +#endif + + + + +#if defined(MACH) + /* cmu's mach */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "cmu"; +# endif +# if (defined(M_i386)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "i386-mach"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "mach"; +# endif +# if (defined(M_i386)) && !defined(_machtype_) +# define _machtype_ + machtype = "i386"; +# endif +#endif + + + + +#if defined(alliant) + /* Alliants FSX */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "alliant"; +# endif +# if (defined(mc68000)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "alliant-fx80"; +# endif +# if (defined(i860)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "alliant-fx2800"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "alliant"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "fsx"; +# endif +# if (defined(mc68000)) && !defined(_machtype_) +# define _machtype_ + machtype = "mc68000"; +# endif +# if (defined(i860)) && !defined(_machtype_) +# define _machtype_ + machtype = "i860"; +# endif +#endif + + + + +#if defined(_FTX) + /* Stratus Computer, Inc FTX2 (i860 based) */ + /* Stratus Computer, Inc FTX3 (HPPA based) */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "stratus"; +# endif +# if (defined(i860) && defined(_FTX)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "atlantic"; +# endif +# if (defined(__hppa) && defined(_FTX)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "continuum"; +# endif +# if (defined(i860) && defined(_FTX)) && !defined(_ostype_) +# define _ostype_ + ostype = "ftx2"; +# endif +# if (defined(__hppa) && defined(_FTX)) && !defined(_ostype_) +# define _ostype_ + ostype = "ftx3"; +# endif +# if (defined(i860)) && !defined(_machtype_) +# define _machtype_ + machtype = "i860"; +# endif +# if (defined(__hppa)) && !defined(_machtype_) +# define _machtype_ + machtype = "hppa"; +# endif +#endif + + + + +#if defined(sequent) || defined(_SEQUENT_) + /* Sequent Balance (32000 based) */ + /* Sequent Symmetry running DYNIX/ptx (386/486 based) */ + /* Sequent Symmetry running DYNIX 3 (386/486 based) */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "sequent"; +# endif +# if (defined(M_i386) && defined(sequent)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "symmetry"; +# endif +# if (defined(M_i386)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "ptx"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "balance"; +# endif +# if (defined(M_i386) && !defined(sequent)) && !defined(_ostype_) +# define _ostype_ + ostype = "ptx"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "dynix3"; +# endif +# if (defined(M_i386)) && !defined(_machtype_) +# define _machtype_ + machtype = "i386"; +# endif +# if (defined(ns32000)) && !defined(_machtype_) +# define _machtype_ + machtype = "ns32000"; +# endif +#endif + + + + +#if defined(ns32000) + /* Encore Computer Corp. Multimax (32000 based) */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "encore"; +# endif +# if (defined(CMUCS)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "multimax"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = isamultimax(0); +# endif +# if (defined(CMUCS)) && !defined(_ostype_) +# define _ostype_ + ostype = "mach"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = isamultimax(1); +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = "ns32000"; +# endif +#endif + + + + +#if defined(iconuxv) + /* Icon 88k running Unix */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "icon"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "icon"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "iconuxv"; +# endif +# if (defined(m88k) || defined(__m88k__)) && !defined(_machtype_) +# define _machtype_ + machtype = "m88k"; +# endif +#endif + + + + +#if defined(_CRAY) && defined(_CRAYCOM) + /* Cray Computer Corp. running CSOS */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "ccc"; +# endif +# if (defined(_CRAY2)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "cray"; +# endif +# if (defined(_CRAY3)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "cray"; +# endif +# if (defined(_CRAY4)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "cray"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "CSOS"; +# endif +# if (defined(_CRAY2)) && !defined(_machtype_) +# define _machtype_ + machtype = "cray2"; +# endif +# if (defined(_CRAY3)) && !defined(_machtype_) +# define _machtype_ + machtype = "cray3"; +# endif +# if (defined(_CRAY4)) && !defined(_machtype_) +# define _machtype_ + machtype = "cray4"; +# endif +#endif + + + + +#if defined(cray) && !defined(_CRAYMPP) + /* Cray Research Inc. PVP running UNICOS */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "cri"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = getcray(); +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "unicos"; +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = getcray(); +# endif +#endif + + + + +#if defined(cray) && defined(_CRAYT3D) + /* Cray Research Inc. running UNICOS MAX */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "cri"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = getcray(); +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "unicosmax"; +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = getcray(); +# endif +#endif + + + + +#if defined(cray) && defined(_CRAYT3E) + /* Cray Research Inc. running UNICOS/mk */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "cri"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = getcray(); +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "unicosmk"; +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = getcray(); +# endif +#endif + + + + +#if defined(convex) + /* Convex */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "convex"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "convex"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "convexos"; +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = getconvex(); +# endif +#endif + + + + +#if defined(butterfly) + /* BBN Butterfly 1000 */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "bbn"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "butterfly"; +# endif +# if (defined(mc68020) || defined(__mc68020__)) && !defined(_machtype_) +# define _machtype_ + machtype = "m68k"; +# endif +#endif + + + + +#if defined(NeXT) + /* NeXTStep */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "next"; +# endif +# if (defined(mc68020) || defined(__mc68020__)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "next"; +# endif +# if (defined(M_i386) || defined(__i386__)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "intel-pc"; +# endif +# if (defined(hppa) || defined(__hppa__)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "hp"; +# endif +# if (defined(sparc) || defined(__sparc__)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "sun"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "nextstep"; +# endif +# if (defined(mc68020) || defined(__mc68020__)) && !defined(_machtype_) +# define _machtype_ + machtype = "m68k"; +# endif +# if (defined(M_i386) || defined(__i386__)) && !defined(_machtype_) +# define _machtype_ + machtype = "i386"; +# endif +# if (defined(hppa) || defined(__hppa__)) && !defined(_machtype_) +# define _machtype_ + machtype = "hppa"; +# endif +# if (defined(sparc) || defined(__sparc__)) && !defined(_machtype_) +# define _machtype_ + machtype = "sparc"; +# endif +#endif + + + + +#if defined(__APPLE__) + /* Rhapsody */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "apple"; +# endif +# if (defined(__i386__)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "intel-pc"; +# endif +# if (defined(__ppc__)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "macintosh"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "rhapsody"; +# endif +# if (defined(__i386__)) && !defined(_machtype_) +# define _machtype_ + machtype = "i386"; +# endif +# if (defined(__ppc__)) && !defined(_machtype_) +# define _machtype_ + machtype = "powerpc"; +# endif +#endif + + + + +#if defined(sony_news) + /* Sony NEWS 800 or 1700 workstation */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "sony"; +# endif +# if (defined(mips)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "news_mips"; +# endif +# if (defined(mc68020) || defined(__mc68020__)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "news_m68k"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "News"; +# endif +# if (defined(mc68020) || defined(__mc68020__)) && !defined(_machtype_) +# define _machtype_ + machtype = "m68k"; +# endif +# if (defined(M_mipsel)) && !defined(_machtype_) +# define _machtype_ + machtype = "mipsel"; +# endif +# if (defined(M_mipseb)) && !defined(_machtype_) +# define _machtype_ + machtype = "mipseb"; +# endif +#endif + + + + +#if defined(sgi) + /* Silicon Graphics */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "sgi"; +# endif +# if (defined(M_mipsel)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "iris4d"; +# endif +# if (defined(M_mipseb)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "iris4d"; +# endif +# if (defined(mc68000)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "iris3d"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "irix"; +# endif +# if (defined(M_mipsel)) && !defined(_machtype_) +# define _machtype_ + machtype = "mipsel"; +# endif +# if (defined(M_mipseb)) && !defined(_machtype_) +# define _machtype_ + machtype = "mipseb"; +# endif +# if (defined(mc68000)) && !defined(_machtype_) +# define _machtype_ + machtype = "mc68000"; +# endif +#endif + + + + +#if defined(ultrix) || defined(__ultrix) + /* Digital's Ultrix */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "dec"; +# endif +# if (defined(M_mipsel)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "decstation"; +# endif +# if (defined(M_mipseb)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "decmips"; +# endif +# if (defined(vax) || defined(__vax)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "vax"; +# endif +# if (defined(__vax__)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "vax"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "ultrix"; +# endif +# if (defined(M_mipsel)) && !defined(_machtype_) +# define _machtype_ + machtype = "mipsel"; +# endif +# if (defined(M_mipseb)) && !defined(_machtype_) +# define _machtype_ + machtype = "mipseb"; +# endif +# if (defined(vax) || defined (__vax)) && !defined(_machtype_) +# define _machtype_ + machtype = "vax"; +# endif +# if (defined(__vax__)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "vax"; +# endif +#endif + + + + +#if defined(MIPS) + /* Mips OS */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "mips"; +# endif +# if (defined(M_mipsel)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "mips"; +# endif +# if (defined(M_mipseb)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "mips"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "mips"; +# endif +# if (defined(M_mipsel)) && !defined(_machtype_) +# define _machtype_ + machtype = "mipsel"; +# endif +# if (defined(M_mipseb)) && !defined(_machtype_) +# define _machtype_ + machtype = "mipseb"; +# endif +#endif + + + + +#if defined(DECOSF1) + /* Digital's alpha running osf1 */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "dec"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "osf1"; +# endif +# if (defined(__alpha)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "alpha"; +# endif +# if (defined(__alpha)) && !defined(_machtype_) +# define _machtype_ + machtype = "alpha"; +# endif +#endif + + + + +#if defined(Lynx) + /* Lynx OS 2.1 */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "Lynx"; +# endif +# if (defined(M_mipsel)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "lynxos-mips"; +# endif +# if (defined(M_mipseb)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "lynxos-mips"; +# endif +# if (defined(M_i386)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "lynxos-i386"; +# endif +# if (defined(i860) || defined(__i860__)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "lynxos-i860"; +# endif +# if (defined(m68k)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "lynxos-m68k"; +# endif +# if (defined(m88k)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "lynxos-m88k"; +# endif +# if (defined(sparc)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "lynxos-sparc"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "lynxos-unknown"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "LynxOS"; +# endif +# if (defined(M_mipsel)) && !defined(_machtype_) +# define _machtype_ + machtype = "mipsel"; +# endif +# if (defined(M_mipseb)) && !defined(_machtype_) +# define _machtype_ + machtype = "mipseb"; +# endif +# if (defined(M_i386)) && !defined(_machtype_) +# define _machtype_ + machtype = "i386"; +# endif +# if (defined(i860) || defined(__i860__)) && !defined(_machtype_) +# define _machtype_ + machtype = "i860"; +# endif +# if (defined(m68k)) && !defined(_machtype_) +# define _machtype_ + machtype = "m68k"; +# endif +# if (defined(m88k)) && !defined(_machtype_) +# define _machtype_ + machtype = "m88k"; +# endif +# if (defined(sparc)) && !defined(_machtype_) +# define _machtype_ + machtype = "sparc"; +# endif +#endif + + + + +#if defined(masscomp) + /* Masscomp */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "masscomp"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "masscomp"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "masscomp"; +# endif +#endif + + + +#if defined(__MACHTEN__) + /* Machintosh */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "Tenon"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "Macintosh"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "MachTen"; +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = "Macintosh"; +# endif +#endif + + + + + +#if defined(GOULD_NP1) + /* Gould */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "gould"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "gould_np1"; +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = "gould"; +# endif +#endif + + + + +#if defined(MULTIFLOW) + /* Multiflow running 4.3BSD */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "multiflow"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "multiflow"; +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = "multiflow"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "bsd43"; +# endif +#endif + + + + +#if defined(SXA) + /* PFU/Fujitsu A-xx computer */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "sxa"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "pfa50"; +# endif +# if (defined(_BSDX_)) && !defined(_ostype_) +# define _ostype_ + ostype = "e60-bsdx"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "e60"; +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = "pfa50"; +# endif +#endif + + + + +#if defined(titan) + /* (St)Ardent Titan */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "ardent"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "titan"; +# endif +#endif + + + + +#if defined(stellar) + /* Stellar */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "stellar"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "stellar"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "stellix"; +# endif +#endif + + + + +#if defined(atari) + /* Atari TT running SVR4. This machine was never */ + /* commercially available. */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "atari"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "atari"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "asv"; +# endif +#endif + + + + +#if defined(OPUS) + /* ??? */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "opus"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "opus"; +# endif +#endif + + + + +#if defined(eta10) + /* ETA running SVR3 */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "eta"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "eta10"; +# endif +#endif + + + + +#if defined(hk68) + /* Heurikon HK68 running Uniplus+ 5.0 */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "heurikon"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "hk68"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "uniplus"; +# endif +#endif + + + + +#if defined(NDIX) + /* Norsk Data ND 500/5000 running Ndix */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "norsk"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "nd500"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "ndix"; +# endif +#endif + + + + +#if defined(AMIGA) + /* Amiga running AmigaOS+GG */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "commodore"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "amiga"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "AmigaOS"; +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = "m68k"; +# endif +#endif + + + + +#if defined(uts) + /* Amdahl running uts 2.1 */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "amdahl"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "amdahl"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "uts"; +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = "amdahl"; +# endif +#endif + + + + +#if defined(UTek) + /* Tektronix 4300 running UTek (BSD 4.2 / 68020 based) */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "tektronix"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "tek4300"; +# endif +#endif + + + + +#if defined(UTekV) + /* Tektronix XD88/10 running UTekV 3.2e (SVR3/88100 based) */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "tektronix"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "tekXD88"; +# endif +#endif + + + + +#if defined(__DGUX__) + /* Data-General AViiON running DGUX */ +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "aviion"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "dgux"; +# endif +# if !defined(_vendor_) +# define _vendor_ + vendor = "dg"; +# endif +# if (defined(__m88k__)) && !defined(_machtype_) +# define _machtype_ + machtype = "m88k"; +# endif +# if (defined(__i386__)) && !defined(_machtype_) +# define _machtype_ + machtype = "pentium"; +# endif +#endif + + + + +#if defined(sysV68) + /* Motorola MPC running System V/68 R32V2 (SVR3/68020 based) */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "motorola"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "sysV68"; +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = "m68k"; +# endif +#endif + + + + +#if defined(supermax) + /* DDE Supermax running System V/68 R3 (SVR3/68020 based) */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "supermax"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "supermax"; +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = "m68k"; +# endif +#endif + + + + +#if defined(sysV88) + /* Motorola MPC running System V/88 R32V2 (SVR3/88100 based) */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "motorola"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "sysV88"; +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = "m88k"; +# endif +#endif + + + + +#if defined(__clipper__) + /* Clipper Chipset (Intergraph) */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "intergraph"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "clipper"; +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = "clipper"; +# endif +#endif + + + + +#if defined(SNI) || defined(sinix) + /* Siemens Nixdorf Informationssysteme SINIX */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "sni"; +# endif +# if (defined(M_intel)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "wx200i"; +# endif +# if (defined(MIPSEB)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "rm400"; +# endif +# if (defined(sinix)) && !defined(_ostype_) +# define _ostype_ + ostype = "sinix"; +# endif +# if (defined(M_i586)) && !defined(_machtype_) +# define _machtype_ + machtype = "i586"; +# endif +# if (defined(M_i486)) && !defined(_machtype_) +# define _machtype_ + machtype = "i486"; +# endif +# if (defined(M_i386)) && !defined(_machtype_) +# define _machtype_ + machtype = "i386"; +# endif +# if (defined(M_mipsel)) && !defined(_machtype_) +# define _machtype_ + machtype = "mipsel"; +# endif +# if (defined(M_mipseb)) && !defined(_machtype_) +# define _machtype_ + machtype = "mipseb"; +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = "mips"; +# endif +#endif + + + +#if defined(_OSD_POSIX) + /* Siemens Nixdorf Informationssysteme BS2000 POSIX (mainframe, EBCDIC) */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "sni"; +# endif +# if (defined(M_intel)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "bs2000"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "posix"; +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = "bs2000"; +# endif +#endif + + + +#if defined(_SX) + /* NEC Corporation (SX-4) */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "nec"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "superux"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "sx4"; +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = "sx4"; +# endif +#endif + + + +#if !defined(SOLARIS2) && (SYSVREL == 4) + /* Unix System V Release 4.0 */ +# if (defined(DELL)) && !defined(_vendor_) +# define _vendor_ + vendor = "dell"; +# endif +# if (defined(M_i386)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "i386"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "svr4"; +# endif +# if (defined(M_i386)) && !defined(_machtype_) +# define _machtype_ + machtype = "i386"; +# endif +#endif + + + +#if defined(__uxp__) || defined(__uxps__) + /* FUJITSU DS/90 7000 */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "fujitsu"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "ds90"; +# endif +# if !defined(_ostype_) +# define _ostype_ + ostype = "sysv4"; +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = "sparc"; +# endif +#endif + + + +#if defined(_UWIN) + /* AT&T Research Unix for Windows */ +# if !defined(_vendor_) +# define _vendor_ + vendor = "att"; +# endif +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "win32.i386"; +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = "i386"; +# endif +#endif + + + + +#if defined(mc68000) || defined(__mc68000__) || defined(mc68k32) || defined(m68k) || defined(mc68010) || defined(mc68020) +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "m68k"; +# endif +# if (defined(m68k)) && !defined(_vendor_) +# define _vendor_ + vendor = "motorola"; +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = "m68k"; +# endif +#endif + + + + +#if defined(m88k) || defined(__m88k__) +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "m88k"; +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = "m88k"; +# endif +#endif + + + + +#if defined(M_intel) +# if (defined(M_i586)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "i586"; +# endif +# if (defined(M_i486)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "i486"; +# endif +# if (defined(M_i386)) && !defined(_hosttype_) +# define _hosttype_ + hosttype = "i386"; +# endif +# if !defined(_vendor_) +# define _vendor_ + vendor = "intel"; +# endif +# if (defined(M_i586)) && !defined(_machtype_) +# define _machtype_ + machtype = "i586"; +# endif +# if (defined(M_i486)) && !defined(_machtype_) +# define _machtype_ + machtype = "i486"; +# endif +# if (defined(M_i386)) && !defined(_machtype_) +# define _machtype_ + machtype = "i386"; +# endif +#endif + + + + +#if defined(sparc) || defined(__sparc__) +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "sparc"; +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = "sparc"; +# endif +#endif + + + + +#if defined(i860) || defined(__i860__) +# if !defined(_hosttype_) +# define _hosttype_ + hosttype = "i860"; +# endif +# if !defined(_machtype_) +# define _machtype_ + machtype = "i860"; +# endif +#endif + + + + +#if defined(osf1) +# if !defined(_ostype_) +# define _ostype_ + ostype = "osf1"; +# endif +#endif + + + + +#if SYSVREL == 0 +# if (defined(BSD4_4)) && !defined(_ostype_) +# define _ostype_ + ostype = "bsd44"; +# endif +# if (defined(BSD)) && !defined(_ostype_) +# define _ostype_ + ostype = "bsd"; +# endif +# if (defined(POSIX)) && !defined(_ostype_) +# define _ostype_ + ostype = "posix"; +# endif +# if (defined(unix) || defined(__unix__)) && !defined(_ostype_) +# define _ostype_ + ostype = "unix"; +# endif +#endif + + + + +#if SYSVREL == 1 +# if !defined(_ostype_) +# define _ostype_ + ostype = "svr1"; +# endif +#endif + + + + +#if SYSVREL == 2 +# if !defined(_ostype_) +# define _ostype_ + ostype = "svr2"; +# endif +#endif + + + + +#if SYSVREL == 3 +# if !defined(_ostype_) +# define _ostype_ + ostype = "svr3"; +# endif +#endif + + + + +#if SYSVREL == 4 +# if !defined(_ostype_) +# define _ostype_ + ostype = "svr4"; +# endif +#endif + + +#ifndef _hosttype_ + hosttype = "unknown"; +#endif +#ifndef _ostype_ + ostype = "unknown"; +#endif +#ifndef _vendor_ + vendor = "unknown"; +#endif +#ifndef _machtype_ + machtype = "unknown"; +#endif + tsetenv(STRHOSTTYPE, str2short(hosttype)); + tsetenv(STRVENDOR, str2short(vendor)); + tsetenv(STROSTYPE, str2short(ostype)); + tsetenv(STRMACHTYPE, str2short(machtype)); +} /* end setmachine */ diff --git a/bin/csh/time.c b/bin/csh/time.c deleted file mode 100644 index bda3874..0000000 --- a/bin/csh/time.c +++ /dev/null @@ -1,321 +0,0 @@ -/*- - * Copyright (c) 1980, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -#if 0 -static char sccsid[] = "@(#)time.c 8.1 (Berkeley) 5/31/93"; -#else -static const char rcsid[] = - "$FreeBSD$"; -#endif -#endif /* not lint */ - -#include <sys/types.h> -#if __STDC__ -# include <stdarg.h> -#else -# include <varargs.h> -#endif - -#include "csh.h" -#include "extern.h" - -/* - * C Shell - routines handling process timing and niceing - */ -static void pdeltat __P((struct timeval *, struct timeval *)); - -void -settimes() -{ - struct rusage ruch; - - (void) gettimeofday(&time0, NULL); - (void) getrusage(RUSAGE_SELF, &ru0); - (void) getrusage(RUSAGE_CHILDREN, &ruch); - ruadd(&ru0, &ruch); -} - -/* - * dotime is only called if it is truly a builtin function and not a - * prefix to another command - */ -void -/*ARGSUSED*/ -dotime(v, t) - Char **v; - struct command *t; -{ - struct timeval timedol; - struct rusage ru1, ruch; - - (void) getrusage(RUSAGE_SELF, &ru1); - (void) getrusage(RUSAGE_CHILDREN, &ruch); - ruadd(&ru1, &ruch); - (void) gettimeofday(&timedol, NULL); - prusage(&ru0, &ru1, &timedol, &time0); -} - -/* - * donice is only called when it on the line by itself or with a +- value - */ -void -/*ARGSUSED*/ -donice(v, t) - Char **v; - struct command *t; -{ - Char *cp; - int nval = 0; - - v++, cp = *v++; - if (cp == 0) - nval = 4; - else if (*v == 0 && any("+-", cp[0])) - nval = getn(cp); - (void) setpriority(PRIO_PROCESS, 0, nval); -} - -void -ruadd(ru, ru2) - struct rusage *ru, *ru2; -{ - tvadd(&ru->ru_utime, &ru2->ru_utime); - tvadd(&ru->ru_stime, &ru2->ru_stime); - if (ru2->ru_maxrss > ru->ru_maxrss) - ru->ru_maxrss = ru2->ru_maxrss; - - ru->ru_ixrss += ru2->ru_ixrss; - ru->ru_idrss += ru2->ru_idrss; - ru->ru_isrss += ru2->ru_isrss; - ru->ru_minflt += ru2->ru_minflt; - ru->ru_majflt += ru2->ru_majflt; - ru->ru_nswap += ru2->ru_nswap; - ru->ru_inblock += ru2->ru_inblock; - ru->ru_oublock += ru2->ru_oublock; - ru->ru_msgsnd += ru2->ru_msgsnd; - ru->ru_msgrcv += ru2->ru_msgrcv; - ru->ru_nsignals += ru2->ru_nsignals; - ru->ru_nvcsw += ru2->ru_nvcsw; - ru->ru_nivcsw += ru2->ru_nivcsw; -} - -void -prusage(r0, r1, e, b) - struct rusage *r0, *r1; - struct timeval *e, *b; -{ - time_t t = - (r1->ru_utime.tv_sec - r0->ru_utime.tv_sec) * 100 + - (r1->ru_utime.tv_usec - r0->ru_utime.tv_usec) / 10000 + - (r1->ru_stime.tv_sec - r0->ru_stime.tv_sec) * 100 + - (r1->ru_stime.tv_usec - r0->ru_stime.tv_usec) / 10000; - char *cp; - long i; - struct varent *vp = adrof(STRtime); - - int ms = - (e->tv_sec - b->tv_sec) * 100 + (e->tv_usec - b->tv_usec) / 10000; - - cp = "%Uu %Ss %E %P %X+%Dk %I+%Oio %Fpf+%Ww"; - - if (vp && vp->vec[0] && vp->vec[1]) - cp = short2str(vp->vec[1]); - - for (; *cp; cp++) - if (*cp != '%') - (void) fputc(*cp, cshout); - else if (cp[1]) - switch (*++cp) { - - case 'U': /* user CPU time used */ - pdeltat(&r1->ru_utime, &r0->ru_utime); - break; - - case 'S': /* system CPU time used */ - pdeltat(&r1->ru_stime, &r0->ru_stime); - break; - - case 'E': /* elapsed (wall-clock) time */ - pcsecs((long) ms); - break; - - case 'P': /* percent time spent running */ - /* check if it did not run at all */ - i = (ms == 0) ? 0 : (t * 1000 / ms); - /* nn.n% */ - (void) fprintf(cshout, "%ld.%01ld%%", i / 10, i % 10); - break; - - case 'W': /* number of swaps */ - i = r1->ru_nswap - r0->ru_nswap; - (void) fprintf(cshout, "%ld", i); - break; - - case 'X': /* (average) shared text size */ - (void) fprintf(cshout, "%ld", t == 0 ? 0L : - (r1->ru_ixrss - r0->ru_ixrss) / t); - break; - - case 'D': /* (average) unshared data size */ - (void) fprintf(cshout, "%ld", t == 0 ? 0L : - (r1->ru_idrss + r1->ru_isrss - - (r0->ru_idrss + r0->ru_isrss)) / t); - break; - - case 'K': /* (average) total data memory used */ - (void) fprintf(cshout, "%ld", t == 0 ? 0L : - ((r1->ru_ixrss + r1->ru_isrss + r1->ru_idrss) - - (r0->ru_ixrss + r0->ru_idrss + r0->ru_isrss)) / t); - break; - - case 'M': /* max. Resident Set Size */ - (void) fprintf(cshout, "%ld", r1->ru_maxrss / 2L); - break; - - case 'F': /* page faults */ - (void) fprintf(cshout, "%ld", r1->ru_majflt - r0->ru_majflt); - break; - - case 'R': /* page reclaims */ - (void) fprintf(cshout, "%ld", r1->ru_minflt - r0->ru_minflt); - break; - - case 'I': /* FS blocks in */ - (void) fprintf(cshout, "%ld", r1->ru_inblock - r0->ru_inblock); - break; - - case 'O': /* FS blocks out */ - (void) fprintf(cshout, "%ld", r1->ru_oublock - r0->ru_oublock); - break; - - case 'r': /* socket messages received */ - (void) fprintf(cshout, "%ld", r1->ru_msgrcv - r0->ru_msgrcv); - break; - - case 's': /* socket messages sent */ - (void) fprintf(cshout, "%ld", r1->ru_msgsnd - r0->ru_msgsnd); - break; - - case 'k': /* number of signals received */ - (void) fprintf(cshout, "%ld", r1->ru_nsignals-r0->ru_nsignals); - break; - - case 'w': /* num. voluntary context switches (waits) */ - (void) fprintf(cshout, "%ld", r1->ru_nvcsw - r0->ru_nvcsw); - break; - - case 'c': /* num. involuntary context switches */ - (void) fprintf(cshout, "%ld", r1->ru_nivcsw - r0->ru_nivcsw); - break; - } - (void) fputc('\n', cshout); -} - -static void -pdeltat(t1, t0) - struct timeval *t1, *t0; -{ - struct timeval td; - - tvsub(&td, t1, t0); - (void) fprintf(cshout, "%ld.%01ld", td.tv_sec, td.tv_usec / 100000L); -} - -void -tvadd(tsum, t0) - struct timeval *tsum, *t0; -{ - - tsum->tv_sec += t0->tv_sec; - tsum->tv_usec += t0->tv_usec; - if (tsum->tv_usec >= 1000000) - tsum->tv_sec++, tsum->tv_usec -= 1000000; -} - -void -tvsub(tdiff, t1, t0) - struct timeval *tdiff, *t1, *t0; -{ - - tdiff->tv_sec = t1->tv_sec - t0->tv_sec; - tdiff->tv_usec = t1->tv_usec - t0->tv_usec; - if (tdiff->tv_usec < 0) - tdiff->tv_sec--, tdiff->tv_usec += 1000000; -} - -#define P2DIG(i) (void) fprintf(cshout, "%d%d", (i) / 10, (i) % 10) - -void -psecs(l) - long l; -{ - int i; - - i = l / 3600; - if (i) { - (void) fprintf(cshout, "%d:", i); - i = l % 3600; - P2DIG(i / 60); - goto minsec; - } - i = l; - (void) fprintf(cshout, "%d", i / 60); -minsec: - i %= 60; - (void) fputc(':', cshout); - P2DIG(i); -} - -void -pcsecs(l) /* PWP: print mm:ss.dd, l is in sec*100 */ - long l; -{ - int i; - - i = l / 360000; - if (i) { - (void) fprintf(cshout, "%d:", i); - i = (l % 360000) / 100; - P2DIG(i / 60); - goto minsec; - } - i = l / 100; - (void) fprintf(cshout, "%d", i / 60); -minsec: - i %= 60; - (void) fputc(':', cshout); - P2DIG(i); - (void) fputc('.', cshout); - P2DIG((int) (l % 100)); -} |