1/*********************************************************************** 2* * 3* This software is part of the ast package * 4* Copyright (c) 1982-2011 AT&T Intellectual Property * 5* and is licensed under the * 6* Common Public License, Version 1.0 * 7* by AT&T Intellectual Property * 8* * 9* A copy of the License is available at * 10* http://www.opensource.org/licenses/cpl1.0.txt * 11* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * 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 (010<<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 75struct trenod 76{ 77 int tretyp; 78 struct ionod *treio; 79}; 80 81 82struct forknod 83{ 84 int forktyp; 85 struct ionod *forkio; 86 Shnode_t *forktre; 87 int forkline; 88}; 89 90 91struct ifnod 92{ 93 int iftyp; 94 Shnode_t *iftre; 95 Shnode_t *thtre; 96 Shnode_t *eltre; 97}; 98 99struct whnod 100{ 101 int whtyp; 102 Shnode_t *whtre; 103 Shnode_t *dotre; 104 struct arithnod *whinc; 105}; 106 107struct fornod 108{ 109 int fortyp; 110 char *fornam; 111 Shnode_t *fortre; 112 struct comnod *forlst; 113 int forline; 114}; 115 116struct swnod 117{ 118 int swtyp; 119 struct argnod *swarg; 120 struct regnod *swlst; 121 struct ionod *swio; 122 int swline; 123}; 124 125struct regnod 126{ 127 struct argnod *regptr; 128 Shnode_t *regcom; 129 struct regnod *regnxt; 130 char regflag; 131}; 132 133struct parnod 134{ 135 int partyp; 136 Shnode_t *partre; 137}; 138 139struct 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 */ 147struct tstnod 148{ 149 struct lstnod tstlst; 150 int tstline; 151}; 152 153struct 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 164struct 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 192union 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 212extern void sh_freeup(Shell_t*); 213extern void sh_funstaks(struct slnod*,int); 214extern Sfio_t *sh_subshell(Shell_t*,Shnode_t*, int, int); 215#if defined(__EXPORT__) && defined(_BLD_DLL) && defined(_BLD_shell) 216 __EXPORT__ 217#endif 218extern int sh_tdump(Sfio_t*, const Shnode_t*); 219extern Shnode_t *sh_trestore(Shell_t*, Sfio_t*); 220 221#endif /* _SHNODES_H */ 222