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