1*7dd7cddfSDavid du Colombier /* 2*7dd7cddfSDavid du Colombier * command trees for compile/execute 3*7dd7cddfSDavid du Colombier */ 4*7dd7cddfSDavid du Colombier 5*7dd7cddfSDavid du Colombier /* $Id: tree.h,v 1.3 1994/05/31 13:34:34 michael Exp $ */ 6*7dd7cddfSDavid du Colombier 7*7dd7cddfSDavid du Colombier #define NOBLOCK ((struct op *)NULL) 8*7dd7cddfSDavid du Colombier #define NOWORD ((char *)NULL) 9*7dd7cddfSDavid du Colombier #define NOWORDS ((char **)NULL) 10*7dd7cddfSDavid du Colombier 11*7dd7cddfSDavid du Colombier /* 12*7dd7cddfSDavid du Colombier * Description of a command or an operation on commands. 13*7dd7cddfSDavid du Colombier */ 14*7dd7cddfSDavid du Colombier struct op { 15*7dd7cddfSDavid du Colombier short type; /* operation type, see below */ 16*7dd7cddfSDavid du Colombier union { /* WARNING: newtp(), tcopy() use evalflags = 0 to clear union */ 17*7dd7cddfSDavid du Colombier short evalflags; /* TCOM: arg expansion eval() flags */ 18*7dd7cddfSDavid du Colombier short ksh_func; /* TFUNC: function x (vs x()) */ 19*7dd7cddfSDavid du Colombier } u; 20*7dd7cddfSDavid du Colombier char **args; /* arguments to a command */ 21*7dd7cddfSDavid du Colombier char **vars; /* variable assignments */ 22*7dd7cddfSDavid du Colombier struct ioword **ioact; /* IO actions (eg, < > >>) */ 23*7dd7cddfSDavid du Colombier struct op *left, *right; /* descendents */ 24*7dd7cddfSDavid du Colombier char *str; /* word for case; identifier for for, 25*7dd7cddfSDavid du Colombier * select, and functions; 26*7dd7cddfSDavid du Colombier * path to execute for TEXEC; 27*7dd7cddfSDavid du Colombier * time hook for TCOM. 28*7dd7cddfSDavid du Colombier */ 29*7dd7cddfSDavid du Colombier int lineno; /* TCOM/TFUNC: LINENO for this */ 30*7dd7cddfSDavid du Colombier }; 31*7dd7cddfSDavid du Colombier 32*7dd7cddfSDavid du Colombier /* Tree.type values */ 33*7dd7cddfSDavid du Colombier #define TEOF 0 34*7dd7cddfSDavid du Colombier #define TCOM 1 /* command */ 35*7dd7cddfSDavid du Colombier #define TPAREN 2 /* (c-list) */ 36*7dd7cddfSDavid du Colombier #define TPIPE 3 /* a | b */ 37*7dd7cddfSDavid du Colombier #define TLIST 4 /* a ; b */ 38*7dd7cddfSDavid du Colombier #define TOR 5 /* || */ 39*7dd7cddfSDavid du Colombier #define TAND 6 /* && */ 40*7dd7cddfSDavid du Colombier #define TBANG 7 /* ! */ 41*7dd7cddfSDavid du Colombier #define TDBRACKET 8 /* [[ .. ]] */ 42*7dd7cddfSDavid du Colombier #define TFOR 9 43*7dd7cddfSDavid du Colombier #define TSELECT 10 44*7dd7cddfSDavid du Colombier #define TCASE 11 45*7dd7cddfSDavid du Colombier #define TIF 12 46*7dd7cddfSDavid du Colombier #define TWHILE 13 47*7dd7cddfSDavid du Colombier #define TUNTIL 14 48*7dd7cddfSDavid du Colombier #define TELIF 15 49*7dd7cddfSDavid du Colombier #define TPAT 16 /* pattern in case */ 50*7dd7cddfSDavid du Colombier #define TBRACE 17 /* {c-list} */ 51*7dd7cddfSDavid du Colombier #define TASYNC 18 /* c & */ 52*7dd7cddfSDavid du Colombier #define TFUNCT 19 /* function name { command; } */ 53*7dd7cddfSDavid du Colombier #define TTIME 20 /* time pipeline */ 54*7dd7cddfSDavid du Colombier #define TEXEC 21 /* fork/exec eval'd TCOM */ 55*7dd7cddfSDavid du Colombier #define TCOPROC 22 /* coprocess |& */ 56*7dd7cddfSDavid du Colombier 57*7dd7cddfSDavid du Colombier /* 58*7dd7cddfSDavid du Colombier * prefix codes for words in command tree 59*7dd7cddfSDavid du Colombier */ 60*7dd7cddfSDavid du Colombier #define EOS 0 /* end of string */ 61*7dd7cddfSDavid du Colombier #define CHAR 1 /* unquoted character */ 62*7dd7cddfSDavid du Colombier #define QCHAR 2 /* quoted character */ 63*7dd7cddfSDavid du Colombier #define COMSUB 3 /* $() substitution (0 terminated) */ 64*7dd7cddfSDavid du Colombier #define EXPRSUB 4 /* $(()) substitution (0 terminated) */ 65*7dd7cddfSDavid du Colombier #define OQUOTE 5 /* opening " or ' */ 66*7dd7cddfSDavid du Colombier #define CQUOTE 6 /* closing " or ' */ 67*7dd7cddfSDavid du Colombier #define OSUBST 7 /* opening ${ subst (followed by { or X) */ 68*7dd7cddfSDavid du Colombier #define CSUBST 8 /* closing } of above (followed by } or X) */ 69*7dd7cddfSDavid du Colombier #define OPAT 9 /* open pattern: *(, @(, etc. */ 70*7dd7cddfSDavid du Colombier #define SPAT 10 /* separate pattern: | */ 71*7dd7cddfSDavid du Colombier #define CPAT 11 /* close pattern: ) */ 72*7dd7cddfSDavid du Colombier 73*7dd7cddfSDavid du Colombier /* 74*7dd7cddfSDavid du Colombier * IO redirection 75*7dd7cddfSDavid du Colombier */ 76*7dd7cddfSDavid du Colombier struct ioword { 77*7dd7cddfSDavid du Colombier int unit; /* unit affected */ 78*7dd7cddfSDavid du Colombier int flag; /* action (below) */ 79*7dd7cddfSDavid du Colombier char *name; /* file name (unused if heredoc) */ 80*7dd7cddfSDavid du Colombier char *delim; /* delimiter for <<,<<- */ 81*7dd7cddfSDavid du Colombier char *heredoc;/* content of heredoc */ 82*7dd7cddfSDavid du Colombier }; 83*7dd7cddfSDavid du Colombier 84*7dd7cddfSDavid du Colombier /* ioword.flag - type of redirection */ 85*7dd7cddfSDavid du Colombier #define IOTYPE 0xF /* type: bits 0:3 */ 86*7dd7cddfSDavid du Colombier #define IOREAD 0x1 /* < */ 87*7dd7cddfSDavid du Colombier #define IOWRITE 0x2 /* > */ 88*7dd7cddfSDavid du Colombier #define IORDWR 0x3 /* <>: todo */ 89*7dd7cddfSDavid du Colombier #define IOHERE 0x4 /* << (here file) */ 90*7dd7cddfSDavid du Colombier #define IOCAT 0x5 /* >> */ 91*7dd7cddfSDavid du Colombier #define IODUP 0x6 /* <&/>& */ 92*7dd7cddfSDavid du Colombier #define IOEVAL BIT(4) /* expand in << */ 93*7dd7cddfSDavid du Colombier #define IOSKIP BIT(5) /* <<-, skip ^\t* */ 94*7dd7cddfSDavid du Colombier #define IOCLOB BIT(6) /* >|, override -o noclobber */ 95*7dd7cddfSDavid du Colombier #define IORDUP BIT(7) /* x<&y (as opposed to x>&y) */ 96*7dd7cddfSDavid du Colombier #define IONAMEXP BIT(8) /* name has been expanded */ 97*7dd7cddfSDavid du Colombier 98*7dd7cddfSDavid du Colombier /* execute/exchild flags */ 99*7dd7cddfSDavid du Colombier #define XEXEC BIT(0) /* execute without forking */ 100*7dd7cddfSDavid du Colombier #define XFORK BIT(1) /* fork before executing */ 101*7dd7cddfSDavid du Colombier #define XBGND BIT(2) /* command & */ 102*7dd7cddfSDavid du Colombier #define XPIPEI BIT(3) /* input is pipe */ 103*7dd7cddfSDavid du Colombier #define XPIPEO BIT(4) /* output is pipe */ 104*7dd7cddfSDavid du Colombier #define XPIPE (XPIPEI|XPIPEO) /* member of pipe */ 105*7dd7cddfSDavid du Colombier #define XXCOM BIT(5) /* `...` command */ 106*7dd7cddfSDavid du Colombier #define XPCLOSE BIT(6) /* exchild: close close_fd in parent */ 107*7dd7cddfSDavid du Colombier #define XCCLOSE BIT(7) /* exchild: close close_fd in child */ 108*7dd7cddfSDavid du Colombier #define XERROK BIT(8) /* non-zero exit ok (for set -e) */ 109*7dd7cddfSDavid du Colombier #define XCOPROC BIT(9) /* starting a co-process */ 110*7dd7cddfSDavid du Colombier #define XTIME BIT(10) /* timeing TCOM command */ 111*7dd7cddfSDavid du Colombier #define XINTACT BIT(11) /* OS2: proc started from interactive session */ 112*7dd7cddfSDavid du Colombier 113*7dd7cddfSDavid du Colombier /* 114*7dd7cddfSDavid du Colombier * flags to control expansion of words (assumed by t->evalflags to fit 115*7dd7cddfSDavid du Colombier * in a short) 116*7dd7cddfSDavid du Colombier */ 117*7dd7cddfSDavid du Colombier #define DOBLANK BIT(0) /* perform blank interpretation */ 118*7dd7cddfSDavid du Colombier #define DOGLOB BIT(1) /* expand [?* */ 119*7dd7cddfSDavid du Colombier #define DOPAT BIT(2) /* quote *?[ */ 120*7dd7cddfSDavid du Colombier #define DOTILDE BIT(3) /* normal ~ expansion (first char) */ 121*7dd7cddfSDavid du Colombier #define DONTRUNCOMMAND BIT(4) /* do not run $(command) things */ 122*7dd7cddfSDavid du Colombier #define DOASNTILDE BIT(5) /* assignment ~ expansion (after =, :) */ 123*7dd7cddfSDavid du Colombier #define DOBRACE_ BIT(6) /* used by expand(): do brace expansion */ 124*7dd7cddfSDavid du Colombier #define DOMAGIC_ BIT(7) /* used by expand(): string contains MAGIC */ 125*7dd7cddfSDavid du Colombier #define DOTEMP_ BIT(8) /* ditto : in word part of ${..[%#=?]..} */ 126*7dd7cddfSDavid du Colombier #define DOVACHECK BIT(9) /* var assign check (for typeset, set, etc) */ 127*7dd7cddfSDavid du Colombier #define DOMARKDIRS BIT(10) /* force markdirs behaviour */ 128*7dd7cddfSDavid du Colombier 129*7dd7cddfSDavid du Colombier /* 130*7dd7cddfSDavid du Colombier * The arguments of [[ .. ]] expressions are kept in t->args[] and flags 131*7dd7cddfSDavid du Colombier * indicating how the arguments have been munged are kept in t->vars[]. 132*7dd7cddfSDavid du Colombier * The contents of t->vars[] are stuffed strings (so they can be treated 133*7dd7cddfSDavid du Colombier * like all other t->vars[]) in which the second character is the one that 134*7dd7cddfSDavid du Colombier * is examined. The DB_* defines are the values for these second characters. 135*7dd7cddfSDavid du Colombier */ 136*7dd7cddfSDavid du Colombier #define DB_NORM 1 /* normal argument */ 137*7dd7cddfSDavid du Colombier #define DB_OR 2 /* || -> -o conversion */ 138*7dd7cddfSDavid du Colombier #define DB_AND 3 /* && -> -a conversion */ 139*7dd7cddfSDavid du Colombier #define DB_BE 4 /* an inserted -BE */ 140*7dd7cddfSDavid du Colombier #define DB_PAT 5 /* a pattern argument */ 141