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