1da2e3ebdSchin /*********************************************************************** 2da2e3ebdSchin * * 3da2e3ebdSchin * This software is part of the ast package * 4*b30d1939SAndy Fiddaman * Copyright (c) 1982-2012 AT&T Intellectual Property * 5da2e3ebdSchin * and is licensed under the * 6*b30d1939SAndy Fiddaman * Eclipse Public License, Version 1.0 * 77c2fbfb3SApril Chin * by AT&T Intellectual Property * 8da2e3ebdSchin * * 9da2e3ebdSchin * A copy of the License is available at * 10*b30d1939SAndy Fiddaman * http://www.eclipse.org/org/documents/epl-v10.html * 11*b30d1939SAndy Fiddaman * (with md5 checksum b35adb5213ca9657e911e9befb180842) * 12da2e3ebdSchin * * 13da2e3ebdSchin * Information and Software Systems Research * 14da2e3ebdSchin * AT&T Research * 15da2e3ebdSchin * Florham Park NJ * 16da2e3ebdSchin * * 17da2e3ebdSchin * David Korn <dgk@research.att.com> * 18da2e3ebdSchin * * 19da2e3ebdSchin ***********************************************************************/ 20da2e3ebdSchin #pragma prototyped 21da2e3ebdSchin #ifndef _SHNODES_H 22da2e3ebdSchin #define _SHNODES_H 1 23da2e3ebdSchin /* 24da2e3ebdSchin * UNIX shell 25da2e3ebdSchin * Written by David Korn 26da2e3ebdSchin * 27da2e3ebdSchin */ 28da2e3ebdSchin 29da2e3ebdSchin 30da2e3ebdSchin #include <ast.h> 31da2e3ebdSchin #include "argnod.h" 32da2e3ebdSchin 33da2e3ebdSchin /* command tree for tretyp */ 34da2e3ebdSchin #define FINT (02<<COMBITS) /* non-interruptable */ 35da2e3ebdSchin #define FAMP (04<<COMBITS) /* background */ 36da2e3ebdSchin #define FPIN (010<<COMBITS) /* input is a pipe */ 37da2e3ebdSchin #define FPOU (040<<COMBITS) /* output is a pipe */ 38da2e3ebdSchin #define FPCL (0100<<COMBITS) /* close the pipe */ 39da2e3ebdSchin #define FCOOP (0200<<COMBITS) /* cooperating process */ 40da2e3ebdSchin #define FSHOWME (0400<<COMBITS) /* set for showme commands */ 41*b30d1939SAndy Fiddaman #define FALTPIPE (02000<<COMBITS) /* alternate pipes &| */ 42da2e3ebdSchin #define FPOSIX (02<<COMBITS) /* posix semantics function */ 43da2e3ebdSchin #define FLINENO (04<<COMBITS) /* for/case has line number */ 44*b30d1939SAndy Fiddaman #define FOPTGET (0200<<COMBITS) /* function calls getopts */ 45da2e3ebdSchin 46da2e3ebdSchin #define TNEGATE (01<<COMBITS) /* ! inside [[...]] */ 47da2e3ebdSchin #define TBINARY (02<<COMBITS) /* binary operator in [[...]] */ 48da2e3ebdSchin #define TUNARY (04<<COMBITS) /* unary operator in [[...]] */ 49da2e3ebdSchin #define TTEST (010<<COMBITS) 50da2e3ebdSchin #define TPAREN (TBINARY|TUNARY) 51da2e3ebdSchin #define TSHIFT (COMBITS+4) 52da2e3ebdSchin #define TNSPACE (TFUN|COMSCAN) 53da2e3ebdSchin 54da2e3ebdSchin #define TCOM 0 55da2e3ebdSchin #define TPAR 1 56da2e3ebdSchin #define TFIL 2 57da2e3ebdSchin #define TLST 3 58da2e3ebdSchin #define TIF 4 59da2e3ebdSchin #define TWH 5 60da2e3ebdSchin #define TUN (TWH|COMSCAN) 61da2e3ebdSchin #define TTST 6 62da2e3ebdSchin #define TSW 7 63da2e3ebdSchin #define TAND 8 64da2e3ebdSchin #define TORF 9 65da2e3ebdSchin #define TFORK 10 66da2e3ebdSchin #define TFOR 11 67da2e3ebdSchin #define TSELECT (TFOR|COMSCAN) 68da2e3ebdSchin #define TARITH 12 69da2e3ebdSchin #define TTIME 13 70da2e3ebdSchin #define TSETIO 14 71da2e3ebdSchin #define TFUN 15 72da2e3ebdSchin 73da2e3ebdSchin /* this node is a proforma for those that follow */ 74da2e3ebdSchin 75da2e3ebdSchin struct trenod 76da2e3ebdSchin { 77da2e3ebdSchin int tretyp; 78da2e3ebdSchin struct ionod *treio; 79da2e3ebdSchin }; 80da2e3ebdSchin 81da2e3ebdSchin 82da2e3ebdSchin struct forknod 83da2e3ebdSchin { 84da2e3ebdSchin int forktyp; 85da2e3ebdSchin struct ionod *forkio; 86da2e3ebdSchin Shnode_t *forktre; 87da2e3ebdSchin int forkline; 88da2e3ebdSchin }; 89da2e3ebdSchin 90da2e3ebdSchin 91da2e3ebdSchin struct ifnod 92da2e3ebdSchin { 93da2e3ebdSchin int iftyp; 94da2e3ebdSchin Shnode_t *iftre; 95da2e3ebdSchin Shnode_t *thtre; 96da2e3ebdSchin Shnode_t *eltre; 97da2e3ebdSchin }; 98da2e3ebdSchin 99da2e3ebdSchin struct whnod 100da2e3ebdSchin { 101da2e3ebdSchin int whtyp; 102da2e3ebdSchin Shnode_t *whtre; 103da2e3ebdSchin Shnode_t *dotre; 104da2e3ebdSchin struct arithnod *whinc; 105da2e3ebdSchin }; 106da2e3ebdSchin 107da2e3ebdSchin struct fornod 108da2e3ebdSchin { 109da2e3ebdSchin int fortyp; 110da2e3ebdSchin char *fornam; 111da2e3ebdSchin Shnode_t *fortre; 112da2e3ebdSchin struct comnod *forlst; 113da2e3ebdSchin int forline; 114da2e3ebdSchin }; 115da2e3ebdSchin 116da2e3ebdSchin struct swnod 117da2e3ebdSchin { 118da2e3ebdSchin int swtyp; 119da2e3ebdSchin struct argnod *swarg; 120da2e3ebdSchin struct regnod *swlst; 121da2e3ebdSchin struct ionod *swio; 122da2e3ebdSchin int swline; 123da2e3ebdSchin }; 124da2e3ebdSchin 125da2e3ebdSchin struct regnod 126da2e3ebdSchin { 127da2e3ebdSchin struct argnod *regptr; 128da2e3ebdSchin Shnode_t *regcom; 129da2e3ebdSchin struct regnod *regnxt; 130da2e3ebdSchin char regflag; 131da2e3ebdSchin }; 132da2e3ebdSchin 133da2e3ebdSchin struct parnod 134da2e3ebdSchin { 135da2e3ebdSchin int partyp; 136da2e3ebdSchin Shnode_t *partre; 137da2e3ebdSchin }; 138da2e3ebdSchin 139da2e3ebdSchin struct lstnod 140da2e3ebdSchin { 141da2e3ebdSchin int lsttyp; 142da2e3ebdSchin Shnode_t *lstlef; 143da2e3ebdSchin Shnode_t *lstrit; 144da2e3ebdSchin }; 145da2e3ebdSchin 146da2e3ebdSchin /* tst is same as lst, but with extra field for line number */ 147da2e3ebdSchin struct tstnod 148da2e3ebdSchin { 149da2e3ebdSchin struct lstnod tstlst; 150da2e3ebdSchin int tstline; 151da2e3ebdSchin }; 152da2e3ebdSchin 153da2e3ebdSchin struct functnod 154da2e3ebdSchin { 155da2e3ebdSchin int functtyp; 156da2e3ebdSchin char *functnam; 157da2e3ebdSchin Shnode_t *functtre; 158da2e3ebdSchin int functline; 159da2e3ebdSchin off_t functloc; 160da2e3ebdSchin struct slnod *functstak; 161da2e3ebdSchin struct comnod *functargs; 162da2e3ebdSchin }; 163da2e3ebdSchin 164da2e3ebdSchin struct arithnod 165da2e3ebdSchin { 166da2e3ebdSchin int artyp; 167da2e3ebdSchin int arline; 168da2e3ebdSchin struct argnod *arexpr; 169da2e3ebdSchin void *arcomp; 170da2e3ebdSchin }; 171da2e3ebdSchin 172da2e3ebdSchin 173da2e3ebdSchin /* types of ionodes stored in iofile */ 1747c2fbfb3SApril Chin #define IOUFD 0x3f /* file descriptor number mask */ 1757c2fbfb3SApril Chin #define IOPUT 0x40 /* > redirection operator */ 1767c2fbfb3SApril Chin #define IOAPP 0x80 /* >> redirection operator */ 1777c2fbfb3SApril Chin #define IODOC 0x100 /* << redirection operator */ 1787c2fbfb3SApril Chin #define IOMOV 0x200 /* <& or >& operators */ 1797c2fbfb3SApril Chin #define IOCLOB 0x400 /* noclobber bit */ 1807c2fbfb3SApril Chin #define IORDW 0x800 /* <> redirection operator */ 1817c2fbfb3SApril Chin #define IORAW 0x1000 /* no expansion needed for filename */ 1827c2fbfb3SApril Chin #define IOSTRG 0x2000 /* here-document stored as incore string */ 1837c2fbfb3SApril Chin #define IOSTRIP 0x4000 /* strip leading tabs for here-document */ 1847c2fbfb3SApril Chin #define IOQUOTE 0x8000 /* here-document delimiter was quoted */ 1857c2fbfb3SApril Chin #define IOVNM 0x10000 /* iovname field is non-zero */ 1867c2fbfb3SApril Chin #define IOLSEEK 0x20000 /* seek operators <# or ># */ 1877c2fbfb3SApril Chin #define IOARITH 0x40000 /* arithmetic seek <# ((expr)) */ 1887c2fbfb3SApril Chin #define IOREWRITE 0x80000 /* arithmetic seek <# ((expr)) */ 1897c2fbfb3SApril Chin #define IOCOPY IOCLOB /* copy skipped lines onto standard output */ 19034f9b3eeSRoland Mainz #define IOPROCSUB IOARITH /* process substitution redirection */ 191da2e3ebdSchin 192da2e3ebdSchin union Shnode_u 193da2e3ebdSchin { 194da2e3ebdSchin struct argnod arg; 195da2e3ebdSchin struct ionod io; 196da2e3ebdSchin struct whnod wh; 197da2e3ebdSchin struct swnod sw; 198da2e3ebdSchin struct ifnod if_; 199da2e3ebdSchin struct dolnod dol; 200da2e3ebdSchin struct comnod com; 201da2e3ebdSchin struct trenod tre; 202da2e3ebdSchin struct forknod fork; 203da2e3ebdSchin struct fornod for_; 204da2e3ebdSchin struct regnod reg; 205da2e3ebdSchin struct parnod par; 206da2e3ebdSchin struct lstnod lst; 207da2e3ebdSchin struct tstnod tst; 208da2e3ebdSchin struct functnod funct; 209da2e3ebdSchin struct arithnod ar; 210da2e3ebdSchin }; 211da2e3ebdSchin 2127c2fbfb3SApril Chin extern void sh_freeup(Shell_t*); 213da2e3ebdSchin extern void sh_funstaks(struct slnod*,int); 214*b30d1939SAndy Fiddaman extern Sfio_t *sh_subshell(Shell_t*,Shnode_t*, volatile int, int); 215da2e3ebdSchin #if defined(__EXPORT__) && defined(_BLD_DLL) && defined(_BLD_shell) 216da2e3ebdSchin __EXPORT__ 217da2e3ebdSchin #endif 218da2e3ebdSchin extern int sh_tdump(Sfio_t*, const Shnode_t*); 2197c2fbfb3SApril Chin extern Shnode_t *sh_trestore(Shell_t*, Sfio_t*); 220da2e3ebdSchin 221da2e3ebdSchin #endif /* _SHNODES_H */ 222