1*b30d1939SAndy Fiddaman: 2*b30d1939SAndy Fiddaman# 3*b30d1939SAndy Fiddaman# Glenn Fowler 4*b30d1939SAndy Fiddaman# AT&T Bell Laboratories 5*b30d1939SAndy Fiddaman# 6*b30d1939SAndy Fiddaman# make abstract machine executor with state 7*b30d1939SAndy Fiddaman# 8*b30d1939SAndy Fiddaman# @(#)mamexec (gsf@research.att.com) 07/17/94 9*b30d1939SAndy Fiddaman# 10*b30d1939SAndy Fiddaman# mamexec [ -dfins ] [ target ... ] < mam-file 11*b30d1939SAndy Fiddaman# 12*b30d1939SAndy Fiddaman# NOTE: variables defined in this script may conflict with 13*b30d1939SAndy Fiddaman# mam-file variables 14*b30d1939SAndy Fiddaman# 15*b30d1939SAndy Fiddaman 16*b30d1939SAndy Fiddaman_command_=mamexec 17*b30d1939SAndy Fiddaman_debug_=: 18*b30d1939SAndy Fiddaman_diff_=. 19*b30d1939SAndy Fiddaman_error_='exit 1' 20*b30d1939SAndy Fiddaman_exec_=eval 21*b30d1939SAndy Fiddaman_force_= 22*b30d1939SAndy Fiddaman_list_= 23*b30d1939SAndy Fiddaman_same_=. 24*b30d1939SAndy Fiddaman_set_= 25*b30d1939SAndy Fiddaman_silent_= 26*b30d1939SAndy Fiddaman_state_list_=MAMlist 27*b30d1939SAndy Fiddaman_state_time_=MAMtime 28*b30d1939SAndy Fiddaman_tmp_=/tmp/mam.$$.mam 29*b30d1939SAndy Fiddaman 30*b30d1939SAndy Fiddamantrap 'rm -f $_tmp_' 0 31*b30d1939SAndy Fiddamantrap 'exit 2' 1 2 32*b30d1939SAndy Fiddamanwhile : 33*b30d1939SAndy Fiddamando case $# in 34*b30d1939SAndy Fiddaman 0) break ;; 35*b30d1939SAndy Fiddaman esac 36*b30d1939SAndy Fiddaman case $1 in 37*b30d1939SAndy Fiddaman --) shift 38*b30d1939SAndy Fiddaman break 39*b30d1939SAndy Fiddaman ;; 40*b30d1939SAndy Fiddaman -*) case $1 in 41*b30d1939SAndy Fiddaman -*[abceghjklmopqrtuvwxyz_A-Z0-9]*) # [!...] not portable 42*b30d1939SAndy Fiddaman echo "Usage: $_command_ [ -dfins ] [ target ... ] < mam-file" >&2; exit 2 43*b30d1939SAndy Fiddaman ;; 44*b30d1939SAndy Fiddaman *) case $1 in 45*b30d1939SAndy Fiddaman *d*) _debug_="eval echo $_command_: debug: >&2" ;; 46*b30d1939SAndy Fiddaman esac 47*b30d1939SAndy Fiddaman case $1 in 48*b30d1939SAndy Fiddaman *f*) _force_=1 ;; 49*b30d1939SAndy Fiddaman esac 50*b30d1939SAndy Fiddaman case $1 in 51*b30d1939SAndy Fiddaman *i*) _error_=: ;; 52*b30d1939SAndy Fiddaman esac 53*b30d1939SAndy Fiddaman case $1 in 54*b30d1939SAndy Fiddaman *n*) _exec_=echo ;; 55*b30d1939SAndy Fiddaman esac 56*b30d1939SAndy Fiddaman case $1 in 57*b30d1939SAndy Fiddaman *s*) _silent_=1 ;; 58*b30d1939SAndy Fiddaman esac 59*b30d1939SAndy Fiddaman ;; 60*b30d1939SAndy Fiddaman esac 61*b30d1939SAndy Fiddaman ;; 62*b30d1939SAndy Fiddaman *) break 63*b30d1939SAndy Fiddaman ;; 64*b30d1939SAndy Fiddaman esac 65*b30d1939SAndy Fiddaman shift 66*b30d1939SAndy Fiddamandone 67*b30d1939SAndy Fiddaman_select_= 68*b30d1939SAndy Fiddamanwhile : 69*b30d1939SAndy Fiddamando case $# in 70*b30d1939SAndy Fiddaman 0) break ;; 71*b30d1939SAndy Fiddaman esac 72*b30d1939SAndy Fiddaman case $1 in 73*b30d1939SAndy Fiddaman *=*) eval $1 74*b30d1939SAndy Fiddaman ;; 75*b30d1939SAndy Fiddaman *) case $_select_ in 76*b30d1939SAndy Fiddaman "") _select_=$1 ;; 77*b30d1939SAndy Fiddaman *) _select_="$_select_|$1" ;; 78*b30d1939SAndy Fiddaman esac 79*b30d1939SAndy Fiddaman ;; 80*b30d1939SAndy Fiddaman esac 81*b30d1939SAndy Fiddaman shift 82*b30d1939SAndy Fiddamandone 83*b30d1939SAndy Fiddamancase $_select_ in 84*b30d1939SAndy Fiddaman"") _select_="*" ;; 85*b30d1939SAndy Fiddamanesac 86*b30d1939SAndy Fiddaman(set -e; false || true) && _set_=e || echo $_command_: command errors ignored because of shell botch >&2 87*b30d1939SAndy Fiddamancase $_silent_ in 88*b30d1939SAndy Fiddaman"") _set_=x$_set_ 89*b30d1939SAndy Fiddaman ;; 90*b30d1939SAndy Fiddaman*) case $_exec_ in 91*b30d1939SAndy Fiddaman "echo") _exec_=: ;; 92*b30d1939SAndy Fiddaman esac 93*b30d1939SAndy Fiddaman ;; 94*b30d1939SAndy Fiddamanesac 95*b30d1939SAndy Fiddamancase $_exec_ in 96*b30d1939SAndy Fiddaman"eval") _begin_="(" 97*b30d1939SAndy Fiddaman _end_=") </dev/null" 98*b30d1939SAndy Fiddaman case $_set_ in 99*b30d1939SAndy Fiddaman ?*) _set_="set -$_set_;" ;; 100*b30d1939SAndy Fiddaman esac 101*b30d1939SAndy Fiddaman ;; 102*b30d1939SAndy Fiddaman*) _set_= 103*b30d1939SAndy Fiddaman ;; 104*b30d1939SAndy Fiddamanesac 105*b30d1939SAndy Fiddaman 106*b30d1939SAndy Fiddamanif test -f $_state_list_ -a -f $_state_time_ 107*b30d1939SAndy Fiddamanthen mamstate $_state_list_ < $_state_list_ | sort > $_tmp_ 108*b30d1939SAndy Fiddaman for _i_ in `comm -12 $_state_time_ $_tmp_ | sed 's/ .*//'` 109*b30d1939SAndy Fiddaman do case $_same_ in 110*b30d1939SAndy Fiddaman .) _same_=$_i_ ;; 111*b30d1939SAndy Fiddaman *) _same_="$_same_|$_i_" ;; 112*b30d1939SAndy Fiddaman esac 113*b30d1939SAndy Fiddaman done 114*b30d1939SAndy Fiddamanfi 115*b30d1939SAndy Fiddaman 116*b30d1939SAndy Fiddaman_index_=_ 117*b30d1939SAndy Fiddaman_match_= 118*b30d1939SAndy Fiddamancase `(echo ok | (read -r a; echo $a) 2>/dev/null)` in 119*b30d1939SAndy Fiddamanok) _read_='read -r' 120*b30d1939SAndy Fiddaman ;; 121*b30d1939SAndy Fiddaman*) # read strips \ -- thanks a lot 122*b30d1939SAndy Fiddaman # tmp file avoids char at a time read 123*b30d1939SAndy Fiddaman _read_=read 124*b30d1939SAndy Fiddaman sed 's/\\/\\\\/g' > $_tmp_ 125*b30d1939SAndy Fiddaman exec < $_tmp_ 126*b30d1939SAndy Fiddaman rm -f $_tmp_ 127*b30d1939SAndy Fiddaman ;; 128*b30d1939SAndy Fiddamanesac 129*b30d1939SAndy Fiddaman_old_=1 130*b30d1939SAndy Fiddaman_ifs_=$IFS 131*b30d1939SAndy Fiddamanwhile IFS=' '; $_read_ _op_ _arg_ _val_ 132*b30d1939SAndy Fiddamando IFS=$_ifs_ 133*b30d1939SAndy Fiddaman case $_op_ in 134*b30d1939SAndy Fiddaman "note") continue 135*b30d1939SAndy Fiddaman ;; 136*b30d1939SAndy Fiddaman "info") case $_arg_ in 137*b30d1939SAndy Fiddaman "mam") _old_= ;; 138*b30d1939SAndy Fiddaman esac 139*b30d1939SAndy Fiddaman continue 140*b30d1939SAndy Fiddaman ;; 141*b30d1939SAndy Fiddaman "setv") eval _data_='$'$_arg_ 142*b30d1939SAndy Fiddaman case $_index_:$_data_ in 143*b30d1939SAndy Fiddaman __*:*|*:) 144*b30d1939SAndy Fiddaman case $_exec_ in 145*b30d1939SAndy Fiddaman "eval") ;; 146*b30d1939SAndy Fiddaman *) echo "$_arg_=$_val_" ;; 147*b30d1939SAndy Fiddaman esac 148*b30d1939SAndy Fiddaman eval $_arg_="$_val_" "</dev/null" 149*b30d1939SAndy Fiddaman ;; 150*b30d1939SAndy Fiddaman esac 151*b30d1939SAndy Fiddaman case $_arg_:$mam_cc_L in 152*b30d1939SAndy Fiddaman "CC:") ( 153*b30d1939SAndy Fiddaman set - 154*b30d1939SAndy Fiddaman mkdir /tmp/mam$$ 155*b30d1939SAndy Fiddaman cd /tmp/mam$$ 156*b30d1939SAndy Fiddaman echo 'main(){return 0;}' > main.c 157*b30d1939SAndy Fiddaman code=1 158*b30d1939SAndy Fiddaman if $CC -c main.c 2>/dev/null 159*b30d1939SAndy Fiddaman then if $CC -L. main.o -lc 2>/dev/null 160*b30d1939SAndy Fiddaman then $CC -L. main.o -lc > libc.a 2>/dev/null || code=0 161*b30d1939SAndy Fiddaman fi 162*b30d1939SAndy Fiddaman fi 163*b30d1939SAndy Fiddaman cd /tmp 164*b30d1939SAndy Fiddaman rm -rf /tmp/mam$$ 165*b30d1939SAndy Fiddaman exit $code 166*b30d1939SAndy Fiddaman ) </dev/null && mam_cc_L=' ' 167*b30d1939SAndy Fiddaman ;; 168*b30d1939SAndy Fiddaman esac 169*b30d1939SAndy Fiddaman continue 170*b30d1939SAndy Fiddaman ;; 171*b30d1939SAndy Fiddaman "make") eval _name_$_index_=$_name_ 172*b30d1939SAndy Fiddaman eval _prev_$_index_=$_prev_ 173*b30d1939SAndy Fiddaman eval _cmds_$_index_='"$_cmds_"' 174*b30d1939SAndy Fiddaman eval _attr_$_index_=$_attr_ 175*b30d1939SAndy Fiddaman eval _name_=$_arg_ 176*b30d1939SAndy Fiddaman _prev_=$_index_ 177*b30d1939SAndy Fiddaman case " $_val_ " in 178*b30d1939SAndy Fiddaman *" metarule "*) _attr_=m$_attr_ ;; 179*b30d1939SAndy Fiddaman esac 180*b30d1939SAndy Fiddaman _cmds_= 181*b30d1939SAndy Fiddaman eval " case \"$_name_\" in 182*b30d1939SAndy Fiddaman $_select_) 183*b30d1939SAndy Fiddaman case \"$_select_\" in 184*b30d1939SAndy Fiddaman \"*\") _select_=$_name_ ;; 185*b30d1939SAndy Fiddaman esac 186*b30d1939SAndy Fiddaman _match_=1 187*b30d1939SAndy Fiddaman _attr_=x$_attr_ 188*b30d1939SAndy Fiddaman ;; 189*b30d1939SAndy Fiddaman esac" 190*b30d1939SAndy Fiddaman case $_force_ in 191*b30d1939SAndy Fiddaman "") eval " case \"$_name_\" in 192*b30d1939SAndy Fiddaman $_diff_)_attr_=u$_attr_ ;; 193*b30d1939SAndy Fiddaman $_same_);; 194*b30d1939SAndy Fiddaman *) _attr_=u$_attr_ ;; 195*b30d1939SAndy Fiddaman esac" 196*b30d1939SAndy Fiddaman ;; 197*b30d1939SAndy Fiddaman *) _attr_=u$_attr_ 198*b30d1939SAndy Fiddaman ;; 199*b30d1939SAndy Fiddaman esac 200*b30d1939SAndy Fiddaman case $_attr_ in 201*b30d1939SAndy Fiddaman *u*) case $_diff_ in 202*b30d1939SAndy Fiddaman .) _diff_=$_name_ ;; 203*b30d1939SAndy Fiddaman *) _diff_="$_diff_|$_name_" ;; 204*b30d1939SAndy Fiddaman esac 205*b30d1939SAndy Fiddaman ;; 206*b30d1939SAndy Fiddaman esac 207*b30d1939SAndy Fiddaman _index_=_$_index_ 208*b30d1939SAndy Fiddaman eval _name_$_index_=$_name_ 209*b30d1939SAndy Fiddaman eval _prev_$_index_=$_prev_ 210*b30d1939SAndy Fiddaman eval _cmds_$_index_=$_cmds_ 211*b30d1939SAndy Fiddaman eval _attr_$_index_=$_attr_ 212*b30d1939SAndy Fiddaman eval _list_='"'"$_list_"' 213*b30d1939SAndy Fiddaman'$_name_'"' 214*b30d1939SAndy Fiddaman continue 215*b30d1939SAndy Fiddaman ;; 216*b30d1939SAndy Fiddaman "prev") case $_force_ in 217*b30d1939SAndy Fiddaman "") eval " case \"$_arg_\" in 218*b30d1939SAndy Fiddaman $_diff_)_attr_=u$_attr_ ;; 219*b30d1939SAndy Fiddaman $_same_) ;; 220*b30d1939SAndy Fiddaman *) _attr_=u$_attr_ ;; 221*b30d1939SAndy Fiddaman esac" 222*b30d1939SAndy Fiddaman ;; 223*b30d1939SAndy Fiddaman *) _attr_=u$_attr_ 224*b30d1939SAndy Fiddaman ;; 225*b30d1939SAndy Fiddaman esac 226*b30d1939SAndy Fiddaman continue 227*b30d1939SAndy Fiddaman ;; 228*b30d1939SAndy Fiddaman esac 229*b30d1939SAndy Fiddaman case $_index_ in 230*b30d1939SAndy Fiddaman _) echo $_op_: missing make op >&2; continue ;; 231*b30d1939SAndy Fiddaman esac 232*b30d1939SAndy Fiddaman case $_op_ in 233*b30d1939SAndy Fiddaman "attr") case $_val_ in 234*b30d1939SAndy Fiddaman "meta"|"suff") _attr_=m$_attr_ ;; 235*b30d1939SAndy Fiddaman esac 236*b30d1939SAndy Fiddaman ;; 237*b30d1939SAndy Fiddaman "exec"|"....") 238*b30d1939SAndy Fiddaman case $_old_ in 239*b30d1939SAndy Fiddaman "") _arg_=$_val_ 240*b30d1939SAndy Fiddaman ;; 241*b30d1939SAndy Fiddaman *) case $_val_ in 242*b30d1939SAndy Fiddaman ?*) _arg_="$_arg_ $_val_" ;; 243*b30d1939SAndy Fiddaman esac 244*b30d1939SAndy Fiddaman ;; 245*b30d1939SAndy Fiddaman esac 246*b30d1939SAndy Fiddaman case $_cmds_ in 247*b30d1939SAndy Fiddaman "") _cmds_=$_arg_ 248*b30d1939SAndy Fiddaman ;; 249*b30d1939SAndy Fiddaman *) _cmds_="$_cmds_ 250*b30d1939SAndy Fiddaman$_arg_" 251*b30d1939SAndy Fiddaman ;; 252*b30d1939SAndy Fiddaman esac 253*b30d1939SAndy Fiddaman ;; 254*b30d1939SAndy Fiddaman "done") eval _arg_=$_arg_ 255*b30d1939SAndy Fiddaman _prop_= 256*b30d1939SAndy Fiddaman case $_arg_ in 257*b30d1939SAndy Fiddaman $_name_)case $_attr_ in 258*b30d1939SAndy Fiddaman *m*) ;; 259*b30d1939SAndy Fiddaman *x*u*|*u*x*) 260*b30d1939SAndy Fiddaman case $_cmds_ in 261*b30d1939SAndy Fiddaman "") case $_attr_ in 262*b30d1939SAndy Fiddaman *u*) _prop_=u ;; 263*b30d1939SAndy Fiddaman esac 264*b30d1939SAndy Fiddaman ;; 265*b30d1939SAndy Fiddaman *) $_exec_ "$_begin_$_set_$_cmds_$_end_" || 266*b30d1939SAndy Fiddaman { 267*b30d1939SAndy Fiddaman _code_=$? 268*b30d1939SAndy Fiddaman case $_set_ in 269*b30d1939SAndy Fiddaman *-*e*) ;; 270*b30d1939SAndy Fiddaman *) case $_cmds_ in 271*b30d1939SAndy Fiddaman *if*then*fi*|"||") _code_=0 ;; 272*b30d1939SAndy Fiddaman esac 273*b30d1939SAndy Fiddaman ;; 274*b30d1939SAndy Fiddaman esac 275*b30d1939SAndy Fiddaman case $_code_ in 276*b30d1939SAndy Fiddaman 0) ;; 277*b30d1939SAndy Fiddaman *) echo "*** exit code $_code_ making $_name_" >&2 278*b30d1939SAndy Fiddaman $_error_ 279*b30d1939SAndy Fiddaman ;; 280*b30d1939SAndy Fiddaman esac 281*b30d1939SAndy Fiddaman } 282*b30d1939SAndy Fiddaman _prop_=u 283*b30d1939SAndy Fiddaman ;; 284*b30d1939SAndy Fiddaman esac 285*b30d1939SAndy Fiddaman ;; 286*b30d1939SAndy Fiddaman esac 287*b30d1939SAndy Fiddaman _index_=$_prev_ 288*b30d1939SAndy Fiddaman eval _name_='$'_name_$_index_ 289*b30d1939SAndy Fiddaman eval _prev_='$'_prev_$_index_ 290*b30d1939SAndy Fiddaman eval _cmds_='$'_cmds_$_index_ 291*b30d1939SAndy Fiddaman eval _attr_=$_prop_'$'_attr_$_index_ 292*b30d1939SAndy Fiddaman ;; 293*b30d1939SAndy Fiddaman *) echo $_val_: $_op_ $_name_ expected >&2 294*b30d1939SAndy Fiddaman ;; 295*b30d1939SAndy Fiddaman esac 296*b30d1939SAndy Fiddaman ;; 297*b30d1939SAndy Fiddaman esac 298*b30d1939SAndy Fiddamandone 299*b30d1939SAndy FiddamanIFS=$_ifs_ 300*b30d1939SAndy Fiddamancase $_match_ in 301*b30d1939SAndy Fiddaman"") echo "$_command_: don't know how to make $_select_" >&2; $_error_ ;; 302*b30d1939SAndy Fiddamanesac 303*b30d1939SAndy Fiddamancase $_exec_ in 304*b30d1939SAndy Fiddaman"eval") echo "$_list_" > $_state_list_ 305*b30d1939SAndy Fiddaman mamstate $_state_list_ < $_state_list_ | sort > $_state_time_ 306*b30d1939SAndy Fiddaman ;; 307*b30d1939SAndy Fiddamanesac 308