summaryrefslogtreecommitdiff
path: root/mcon/U/Options.U
blob: 0985d3ed666115217c6a78746084e2dbd413e12c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
?RCS: $Id: Options.U,v 3.0.1.7 1997/02/28 15:08:15 ram Exp $
?RCS:
?RCS: Copyright (c) 1991-1993, Raphael Manfredi
?RCS: 
?RCS: You may redistribute only under the terms of the Artistic Licence,
?RCS: as specified in the README file that comes with the distribution.
?RCS: You may reuse parts of this distribution only within the terms of
?RCS: that same Artistic Licence; a copy of which may be found at the root
?RCS: of the source tree for dist 3.0.
?RCS:
?RCS: $Log: Options.U,v $
?RCS: Revision 3.0.1.7  1997/02/28  15:08:15  ram
?RCS: patch61: optdef.sh now starts with a "startsh"
?RCS: patch61: moved some code from Head.U
?RCS:
?RCS: Revision 3.0.1.6  1995/09/25  09:14:46  ram
?RCS: patch59: protected option parsing code against 'echo -*' option failure
?RCS:
?RCS: Revision 3.0.1.5  1995/05/12  12:04:52  ram
?RCS: patch54: added -K option for experts
?RCS:
?RCS: Revision 3.0.1.4  1995/01/30  14:27:52  ram
?RCS: patch49: this unit now exports file optdef.sh, not a variable
?RCS:
?RCS: Revision 3.0.1.3  1995/01/11  15:19:00  ram
?RCS: patch45: new -O option allowing -D and -U to override config.sh setttings
?RCS: patch45: file optdef.sh is no longer removed after sourcing
?RCS:
?RCS: Revision 3.0.1.2  1994/10/29  15:58:06  ram
?RCS: patch36: ensure option definition file is removed before appending
?RCS: patch36: protect variable definitions with spaces in them
?RCS:
?RCS: Revision 3.0.1.1  1994/06/20  06:55:44  ram
?RCS: patch30: now uses new me symbol to tag error messages
?RCS: patch30: new -D and -U options to define/undef symbols (JHI)
?RCS:
?RCS: Revision 3.0  1993/08/18  12:05:14  ram
?RCS: Baseline for dist 3.0 netwide release.
?RCS:
?X:
?X: Command line parsing. It is really important that the variables used here
?X:	be not listed in the MAKE line, or they will be saved in config.sh and
?X: loading this file to fetch default answers would clobber the values set
?X:	herein.
?X:
?MAKE:Options: startsh
?MAKE:	-pick wipe $@ %<
?V:reuseval alldone error realsilent silent extractsh fastread \
	override knowitall: config_sh
?T:arg symbol
?F:./optdef.sh
: produce awk script to parse command line options
cat >options.awk <<'EOF'
BEGIN {
	optstr = "dD:eEf:hKOrsSU:V";	# getopt-style specification

	len = length(optstr);
	for (i = 1; i <= len; i++) {
		c = substr(optstr, i, 1);
?X: some older awk's do not have the C ?: construct
		if (i < len) a = substr(optstr, i + 1, 1); else a = "";
		if (a == ":") {
			arg[c] = 1;
			i++;
		}
		opt[c] = 1;
	}
}
{
	expect = 0;
	str = $0;
	if (substr(str, 1, 1) != "-") {
		printf("'%s'\n", str);
		next;
	}
	len = length($0);
	for (i = 2; i <= len; i++) {
		c = substr(str, i, 1);
		if (!opt[c]) {
			printf("-%s\n", substr(str, i));
			next;
		}
		printf("-%s\n", c);
		if (arg[c]) {
			if (i < len)
				printf("'%s'\n", substr(str, i + 1));
			else
				expect = 1;
			next;
		}
	}
}
END {
	if (expect)
		print "?";
}
EOF

: process the command line options
?X: Use "$@" to keep arguments with spaces in them from being split apart.
?X: For the same reason, awk will output quoted arguments and the final eval
?X: removes them and sets a proper $* array. An 'X' is prependend to each
?X: argument before being fed to echo to guard against 'echo -x', where -x
?X: would be understood as an echo option! It is removed before feeding awk.
set X `for arg in "$@"; do echo "X$arg"; done |
	sed -e s/X// | awk -f options.awk`
eval "set $*"
shift
rm -f options.awk

: set up default values
fastread=''
reuseval=false
config_sh=''
alldone=''
error=''
silent=''
extractsh=''
override=''
knowitall=''
rm -f optdef.sh
cat >optdef.sh <<EOS
$startsh
EOS

?X:
?X: Given that we now have the possibility to execute Configure remotely
?X: thanks to the new src.U support, we have to face the possibility
?X: of having to ask where the source lie, which means we need the Myread.U
?X: stuff and possibly other things that might echo something on the
?X: screen...
?X:
?X: That's not pretty, and might be confusing in 99% of the time. So...
?X: We introduce a new realsilent variable which is set when -s is given,
?X: and we force silent=true if -S is supplied. The Extractall.U unit
?X: will then undo the >&4 redirection based on the value of the
?X: realsilent variable... -- RAM, 18/93/96
?X:

: option parsing
while test $# -gt 0; do
	case "$1" in
	-d) shift; fastread=yes;;
	-e) shift; alldone=cont;;
	-f)
		shift
		cd ..
		if test -r "$1"; then
			config_sh="$1"
		else
			echo "$me: cannot read config file $1." >&2
			error=true
		fi
		cd UU
		shift;;
	-h) shift; error=true;;
	-r) shift; reuseval=true;;
	-s) shift; silent=true; realsilent=true;;
	-E) shift; alldone=exit;;
	-K) shift; knowitall=true;;
	-O) shift; override=true;;
	-S) shift; silent=true; extractsh=true;;
	-D)
		shift
		case "$1" in
		*=)
			echo "$me: use '-U symbol=', not '-D symbol='." >&2
			echo "$me: ignoring -D $1" >&2
			;;
		*=*) echo "$1" | \
				sed -e "s/'/'\"'\"'/g" -e "s/=\(.*\)/='\1'/" >> optdef.sh;;
		*) echo "$1='define'" >> optdef.sh;;
		esac
		shift
		;;
	-U)
		shift
		case "$1" in
		*=) echo "$1" >> optdef.sh;;
		*=*)
			echo "$me: use '-D symbol=val', not '-U symbol=val'." >&2
			echo "$me: ignoring -U $1" >&2
			;;
		*) echo "$1='undef'" >> optdef.sh;;
		esac
		shift
		;;
	-V) echo "$me generated by metaconfig <VERSION> PL<PATCHLEVEL>." >&2
		exit 0;;
	--) break;;
	-*) echo "$me: unknown option $1" >&2; shift; error=true;;
	*) break;;
	esac
done

case "$error" in
true)
	cat >&2 <<EOM
Usage: $me [-dehrsEKOSV] [-f config.sh] [-D symbol] [-D symbol=value]
                 [-U symbol] [-U symbol=]
  -d : use defaults for all answers.
  -e : go on without questioning past the production of config.sh.
  -f : specify an alternate default configuration file.
  -h : print this help message and exit (with an error status).
  -r : reuse C symbols value if possible (skips costly nm extraction).
  -s : silent mode, only echoes questions and essential information.
  -D : define symbol to have some value:
         -D symbol         symbol gets the value 'define'
         -D symbol=value   symbol gets the value 'value'
  -E : stop at the end of questions, after having produced config.sh.
  -K : do not use unless you know what you are doing.
  -O : let -D and -U override definitions from loaded configuration file.
  -S : perform variable substitutions on all .SH files (can mix with -f)
  -U : undefine symbol:
         -U symbol    symbol gets the value 'undef'
         -U symbol=   symbol gets completely empty
  -V : print version number and exit (with a zero status).
EOM
	exit 1
	;;
esac

?X:
?X: Unless they specified both -d and -e/E, make sure we're running
?X: interactively, i.e. attached to a terminal. Moved from Head.U to be able
?X: to handle batch configurations...
?X:
?X: We have to hardwire the Configure name and cannot use $me, since if they
?X: said 'sh <Configure', then $me is 'sh'...
?X:
: Sanity checks
case "$fastread$alldone" in
yescont|yesexit) ;;
*)
	if test ! -t 0; then
		echo "Say 'sh Configure', not 'sh <Configure'"
		exit 1
	fi
	;;
esac

?X: In silent mode, the standard output is closed. Questions are asked by
?X: outputing on file descriptor #4, which is the original stdout descriptor.
?X: This filters out all the "junk", since all the needed information is written
?X: on #4. Note that ksh will not let us redirect output if the file descriptor
?X: has not be defined yet, unlike sh, hence the following line...--RAM.
exec 4>&1
case "$silent" in
true) exec 1>/dev/null;;
esac

: run the defines and the undefines, if any, but leave the file out there...
touch optdef.sh
. ./optdef.sh