xref: /onnv-gate/usr/src/lib/libast/common/comp/conf.sh (revision 4887:feebf9260c2e)
1*4887Schin########################################################################
2*4887Schin#                                                                      #
3*4887Schin#               This software is part of the ast package               #
4*4887Schin#           Copyright (c) 1985-2007 AT&T Knowledge Ventures            #
5*4887Schin#                      and is licensed under the                       #
6*4887Schin#                  Common Public License, Version 1.0                  #
7*4887Schin#                      by AT&T Knowledge Ventures                      #
8*4887Schin#                                                                      #
9*4887Schin#                A copy of the License is available at                 #
10*4887Schin#            http://www.opensource.org/licenses/cpl1.0.txt             #
11*4887Schin#         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         #
12*4887Schin#                                                                      #
13*4887Schin#              Information and Software Systems Research               #
14*4887Schin#                            AT&T Research                             #
15*4887Schin#                           Florham Park NJ                            #
16*4887Schin#                                                                      #
17*4887Schin#                 Glenn Fowler <gsf@research.att.com>                  #
18*4887Schin#                  David Korn <dgk@research.att.com>                   #
19*4887Schin#                   Phong Vo <kpv@research.att.com>                    #
20*4887Schin#                                                                      #
21*4887Schin########################################################################
22*4887Schin: generate getconf and limits info
23*4887Schin#
24*4887Schin# @(#)conf.sh (AT&T Research) 2007-04-02
25*4887Schin#
26*4887Schin# this script generates these files from the table file in the first arg
27*4887Schin# the remaining args are the C compiler name and flags
28*4887Schin#
29*4887Schin#	conflim.h	supplemental limits.h definitions
30*4887Schin#	conftab.h	readonly string table definitions
31*4887Schin#	conftab.c	readonly string table data
32*4887Schin#
33*4887Schin# you may think it should be simpler
34*4887Schin# but you shall be confused anyway
35*4887Schin#
36*4887Schin
37*4887Schincase $-:$BASH_VERSION in
38*4887Schin*x*:[0123456789]*)	: bash set -x is broken :; set +ex ;;
39*4887Schinesac
40*4887Schin
41*4887SchinLC_ALL=C
42*4887Schinexport LC_ALL
43*4887Schin
44*4887Schincommand=conf
45*4887Schin
46*4887Schinshell=`eval 'x=123&&integer n=\${#x}\${x#1?}&&((n==330/(10)))&&echo ksh' 2>/dev/null`
47*4887Schin
48*4887Schinappend=0
49*4887Schindebug=
50*4887Schinextra=0
51*4887Schinkeep_call='*'
52*4887Schinkeep_name='*'
53*4887Schintrace=
54*4887Schinverbose=0
55*4887Schinwhile	:
56*4887Schindo	case $1 in
57*4887Schin	-a)	append=1 ;;
58*4887Schin	-c*)	keep_call=${1#-?} ;;
59*4887Schin	-d*)	debug=$1 ;;
60*4887Schin	-l)	extra=1 ;;
61*4887Schin	-n*)	keep_name=${1#-?} ;;
62*4887Schin	-t)	trace=1 ;;
63*4887Schin	-v)	verbose=1 ;;
64*4887Schin	-*)	echo "Usage: $command [-a] [-ccall-pattern] [-dN] [-l] [-nname_pattern] [-t] [-v] conf.tab" >&2; exit 2 ;;
65*4887Schin	*)	break ;;
66*4887Schin	esac
67*4887Schin	shift
68*4887Schindone
69*4887Schinhead='#include "FEATURE/standards"
70*4887Schin#include "FEATURE/common"'
71*4887Schintail='#include "FEATURE/param"'
72*4887Schingenerated="/* : : generated by $command from $1 : : */"
73*4887Schinhdr=
74*4887Schinifs=${IFS-'
75*4887Schin	 '}
76*4887Schinnl='
77*4887Schin'
78*4887Schinsp=' '
79*4887Schinob='{'
80*4887Schincb='}'
81*4887Schinsym=[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_]*
82*4887Schintmp=conf.tmp
83*4887Schincase $verbose:$debug$trace in
84*4887Schin1:?*)	echo "$command: debug=$debug trace=$trace keep_call=$keep_call keep_name=$keep_name" >&2 ;;
85*4887Schinesac
86*4887Schincase $trace in
87*4887Schin1)	PS4='+$LINENO+ '; set -x ;;
88*4887Schinesac
89*4887Schin
90*4887Schincase $# in
91*4887Schin0)	case $extra in
92*4887Schin	0)	echo "$command: table argument expected" >&2
93*4887Schin		exit 1
94*4887Schin		;;
95*4887Schin	esac
96*4887Schin	tab=/dev/null
97*4887Schin	;;
98*4887Schin*)	tab=$1
99*4887Schin	shift
100*4887Schin	if	test ! -f $tab
101*4887Schin	then	echo "$command: $tab: cannot read" >&2
102*4887Schin		exit 1
103*4887Schin	fi
104*4887Schin	;;
105*4887Schinesac
106*4887Schincase $# in
107*4887Schin0)	cc=cc ;;
108*4887Schin*)	cc=$* ;;
109*4887Schinesac
110*4887Schin
111*4887Schinrm -f $tmp.*
112*4887Schincase $debug in
113*4887Schin'')	trap "code=\$?; rm -f $tmp.*; exit \$code" 0 1 2 ;;
114*4887Schinesac
115*4887Schin
116*4887Schin# determine the intmax_t printf format
117*4887Schin
118*4887Schincat > $tmp.c <<!
119*4887Schin${head}
120*4887Schinint
121*4887Schinmain()
122*4887Schin{
123*4887Schin#if _ast_intmax_long
124*4887Schin	return 1;
125*4887Schin#else
126*4887Schin	return 0;
127*4887Schin#endif
128*4887Schin}
129*4887Schin!
130*4887Schinif	$cc -o $tmp.exe $tmp.c >/dev/null 2>&1 && ./$tmp.exe
131*4887Schinthen	LL='ll'
132*4887Schinelse	LL='l'
133*4887Schinfi
134*4887Schin
135*4887Schin# set up the names and keys
136*4887Schin
137*4887Schinkeys=
138*4887Schinstandards=
139*4887Schin
140*4887Schincase $append$extra in
141*4887Schin00)	case $verbose in
142*4887Schin	1)	echo "$command: read $tab" >&2 ;;
143*4887Schin	esac
144*4887Schin	exec < $tab
145*4887Schin	while	:
146*4887Schin	do	IFS=""
147*4887Schin		read line
148*4887Schin		eof=$?
149*4887Schin		IFS=$ifs
150*4887Schin		case $eof in
151*4887Schin		0)	;;
152*4887Schin		*)	break ;;
153*4887Schin		esac
154*4887Schin		case $line in
155*4887Schin		""|\#*)	;;
156*4887Schin		*)	set x $line
157*4887Schin			shift; name=$1
158*4887Schin			shift; standard=$1
159*4887Schin			shift; call=$1
160*4887Schin			shift; section=$1
161*4887Schin			shift; flags=$1
162*4887Schin			alternates=
163*4887Schin			define=
164*4887Schin			values=
165*4887Schin			script=
166*4887Schin			headers=
167*4887Schin			while	:
168*4887Schin			do	shift
169*4887Schin				case $# in
170*4887Schin				0)	break ;;
171*4887Schin				esac
172*4887Schin				case $1 in
173*4887Schin				":")	shift
174*4887Schin					eval script='$'script_$1
175*4887Schin					break
176*4887Schin					;;
177*4887Schin				*"{")	case $1 in
178*4887Schin					"sh{")	script="# $name" ;;
179*4887Schin					*)	script= ;;
180*4887Schin					esac
181*4887Schin					shift
182*4887Schin					args="$*"
183*4887Schin					IFS=""
184*4887Schin					while	read line
185*4887Schin					do	case $line in
186*4887Schin						"}")	break ;;
187*4887Schin						esac
188*4887Schin						script=$script$nl$line
189*4887Schin					done
190*4887Schin					IFS=$ifs
191*4887Schin					break
192*4887Schin					;;
193*4887Schin				*.h)	case $shell in
194*4887Schin					ksh)	f=${1%.h} ;;
195*4887Schin					*)	f=`echo $1 | sed 's,\.h$,,'` ;;
196*4887Schin					esac
197*4887Schin					case " $hdr " in
198*4887Schin					*" $f "*)
199*4887Schin						headers=$headers$nl#include$sp'<'$1'>'
200*4887Schin						;;
201*4887Schin					*" -$f- "*)
202*4887Schin						;;
203*4887Schin					*)	if	iffe -n - hdr $f | grep -q _hdr_$f
204*4887Schin						then	hdr="$hdr $f"
205*4887Schin							headers=$headers$nl#include$sp'<'$1'>'
206*4887Schin						else	hdr="$hdr -$f-"
207*4887Schin						fi
208*4887Schin						;;
209*4887Schin					esac
210*4887Schin					;;
211*4887Schin				*)	values=$values$sp$1
212*4887Schin					case $1 in
213*4887Schin					$sym)	echo "$1" >> $tmp.v ;;
214*4887Schin					esac
215*4887Schin					;;
216*4887Schin				esac
217*4887Schin			done
218*4887Schin			case " $standards " in
219*4887Schin			*" $standard "*)
220*4887Schin				;;
221*4887Schin			*)	standards="$standards $standard"
222*4887Schin				;;
223*4887Schin			esac
224*4887Schin			case $name:$flags in
225*4887Schin			*:*S*)	;;
226*4887Schin			VERSION)flags="${flags}S" ;;
227*4887Schin			esac
228*4887Schin			case $name in
229*4887Schin			*VERSION*)key=${standard}${section} ;;
230*4887Schin			*)	  key= ;;
231*4887Schin			esac
232*4887Schin			case $key in
233*4887Schin			''|*_)	key=${key}${name} ;;
234*4887Schin			*)	key=${key}_${name} ;;
235*4887Schin			esac
236*4887Schin			eval sys='$'CONF_call_${key}
237*4887Schin			case $sys in
238*4887Schin			?*)	call=$sys ;;
239*4887Schin			esac
240*4887Schin			case $call in
241*4887Schin			SI)	sys=CS ;;
242*4887Schin			*)	sys=$call ;;
243*4887Schin			esac
244*4887Schin			key=${sys}_${key}
245*4887Schin			keys="$keys$nl$key"
246*4887Schin			eval CONF_name_${key}='$'name
247*4887Schin			eval CONF_standard_${key}='$'standard
248*4887Schin			eval CONF_call_${key}='$'call
249*4887Schin			eval CONF_section_${key}='$'section
250*4887Schin			eval CONF_flags_${key}='$'flags
251*4887Schin			eval CONF_define_${key}='$'define
252*4887Schin			eval CONF_values_${key}='$'values
253*4887Schin			eval CONF_script_${key}='$'script
254*4887Schin			eval CONF_args_${key}='$'args
255*4887Schin			eval CONF_headers_${key}='$'headers
256*4887Schin			eval CONF_keys_${name}=\"'$'CONF_keys_${name} '$'key\"
257*4887Schin			;;
258*4887Schin		esac
259*4887Schin	done
260*4887Schin	;;
261*4887Schinesac
262*4887Schincase $debug in
263*4887Schin-d1)	for key in $keys
264*4887Schin	do	eval name=\"'$'CONF_name_$key\"
265*4887Schin		case $name in
266*4887Schin		?*)	eval standard=\"'$'CONF_standard_$key\"
267*4887Schin			eval call=\"'$'CONF_call_$key\"
268*4887Schin			eval section=\"'$'CONF_section_$key\"
269*4887Schin			eval flags=\"'$'CONF_flags_$key\"
270*4887Schin			eval define=\"'$'CONF_define_$key\"
271*4887Schin			eval values=\"'$'CONF_values_$key\"
272*4887Schin			eval script=\"'$'CONF_script_$key\"
273*4887Schin			eval args=\"'$'CONF_args_$key\"
274*4887Schin			eval headers=\"'$'CONF_headers_$key\"
275*4887Schin			printf "%29s %35s %8s %2s %1d %5s %s$nl" "$name" "$key" "$standard" "$call" "$section" "$flags" "$define${values:+$sp=$values}${headers:+$sp$headers$nl}${script:+$sp$ob$script$nl$cb}"
276*4887Schin			;;
277*4887Schin		esac
278*4887Schin	done
279*4887Schin	exit
280*4887Schin	;;
281*4887Schinesac
282*4887Schin
283*4887Schinsysteminfo='
284*4887Schin#if !defined(SYS_NMLEN)
285*4887Schin#define SYS_NMLEN	9
286*4887Schin#endif
287*4887Schin#include <sys/systeminfo.h>'
288*4887Schinecho "$systeminfo" > $tmp.c
289*4887Schin$cc -E $tmp.c >/dev/null 2>&1 || systeminfo=
290*4887Schin
291*4887Schin# check for native getconf(1)
292*4887Schin
293*4887SchinCONF_getconf=
294*4887SchinCONF_getconf_a=
295*4887Schinfor d in /usr/bin /bin /usr/sbin /sbin
296*4887Schindo	if	test -x $d/getconf
297*4887Schin	then	case `$d/getconf --?-version 2>&1` in
298*4887Schin		*"AT&T"*"Research"*)
299*4887Schin			: presumably an implementation also configured from conf.tab
300*4887Schin			;;
301*4887Schin		*)	CONF_getconf=$d/getconf
302*4887Schin			if	$CONF_getconf -a >/dev/null 2>&1
303*4887Schin			then	CONF_getconf_a=-a
304*4887Schin			fi
305*4887Schin			;;
306*4887Schin		esac
307*4887Schin		break
308*4887Schin	fi
309*4887Schindone
310*4887Schinexport CONF_getconf CONF_getconf_a
311*4887Schin
312*4887Schincase $verbose in
313*4887Schin1)	echo "$command: check ${CONF_getconf:+$CONF_getconf(1),}confstr(2),pathconf(2),sysconf(2),sysinfo(2) configuration names" >&2 ;;
314*4887Schinesac
315*4887Schin{
316*4887Schin	echo "#include <unistd.h>$systeminfo
317*4887Schinint i = 0;" > $tmp.c
318*4887Schin	$cc -E $tmp.c
319*4887Schin} |
320*4887Schinsed \
321*4887Schin	-e '/^#[^0123456789]*1[ 	]*".*".*/!d' \
322*4887Schin	-e 's/^#[^0123456789]*1[ 	]*"\(.*\)".*/\1/' |
323*4887Schinsort -u > $tmp.f
324*4887Schin{
325*4887Schinsed \
326*4887Schin	-e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789]/ /g' \
327*4887Schin	-e 's/[ 	][ 	]*/\n/g' \
328*4887Schin	`cat $tmp.f` 2>/dev/null |
329*4887Schin	egrep '^(SI|_(CS|PC|SC|SI))_.'
330*4887Schin	case $CONF_getconf_a in
331*4887Schin	?*)	$CONF_getconf $CONF_getconf_a | sed 's,[=:    ].*,,'
332*4887Schin		;;
333*4887Schin	*)	case $CONF_getconf in
334*4887Schin		?*)	for v in `strings $CONF_getconf | grep '^[ABCDEFGHIJKLMNOPQRSTUVWXYZ_][ABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789]*$'`
335*4887Schin			do	if	$CONF_getconf $v >/dev/null
336*4887Schin				then	echo $v
337*4887Schin				fi
338*4887Schin			done
339*4887Schin			;;
340*4887Schin		esac
341*4887Schin		;;
342*4887Schin	esac 2>/dev/null
343*4887Schin} |
344*4887Schinegrep -v '^_[ABCDEFGHIJKLMNOPQRSTUVWXYZ]+_(COUNT|LAST|N|STR)$' |
345*4887Schinsort -u > $tmp.g
346*4887Schin{
347*4887Schin	grep '^_' $tmp.g
348*4887Schin	grep '^[^_]' $tmp.g
349*4887Schin} > $tmp.t
350*4887Schinmv $tmp.t $tmp.g
351*4887Schincase $debug in
352*4887Schin-d2)	exit ;;
353*4887Schinesac
354*4887Schin
355*4887SchinHOST=`package | sed -e 's,[0123456789.].*,,' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`
356*4887Schincase $HOST in
357*4887Schin'')	HOST=SYSTEM ;;
358*4887Schinesac
359*4887Schin
360*4887Schinexec < $tmp.g
361*4887Schin
362*4887Schinwhile	read line
363*4887Schindo	flags=F
364*4887Schin	section=
365*4887Schin	underscore=
366*4887Schin	define=$line
367*4887Schin	IFS=_
368*4887Schin	set $line
369*4887Schin	IFS=$ifs
370*4887Schin	case $1 in
371*4887Schin	'')	case $# in
372*4887Schin		0)	continue ;;
373*4887Schin		esac
374*4887Schin		shift
375*4887Schin		;;
376*4887Schin	esac
377*4887Schin	case $1 in
378*4887Schin	CS|PC|SC|SI)
379*4887Schin		call=$1
380*4887Schin		shift
381*4887Schin		standard=$1
382*4887Schin		;;
383*4887Schin	*)	flags=${flags}R
384*4887Schin		standard=$1
385*4887Schin		while	:
386*4887Schin		do	case $# in
387*4887Schin			0)	continue 2 ;;
388*4887Schin			esac
389*4887Schin			shift
390*4887Schin			case $1 in
391*4887Schin			CS|PC|SC|SI)
392*4887Schin				call=$1
393*4887Schin				shift
394*4887Schin				break
395*4887Schin				;;
396*4887Schin			O|o|OLD|old)
397*4887Schin				continue 2
398*4887Schin				;;
399*4887Schin			esac
400*4887Schin			standard=${standard}_$1
401*4887Schin		done
402*4887Schin		;;
403*4887Schin	esac
404*4887Schin	case $1 in
405*4887Schin	SET)	continue ;;
406*4887Schin	esac
407*4887Schin	case $standard in
408*4887Schin	_*)	standard=`echo $standard | sed 's,^_*,,'` ;;
409*4887Schin	esac
410*4887Schin	case " $standards " in
411*4887Schin	*" $standard "*)
412*4887Schin		;;
413*4887Schin	*)	case $standard in
414*4887Schin		[0123456789]*)
415*4887Schin			section=$standard
416*4887Schin			standard=POSIX
417*4887Schin			;;
418*4887Schin		*[0123456789])
419*4887Schin			eval `echo $standard | sed 's,\(.*\)\([0123456789]*\),standard=\1 section=\2,'`
420*4887Schin			;;
421*4887Schin		esac
422*4887Schin		;;
423*4887Schin	esac
424*4887Schin	case $flags in
425*4887Schin	*R*)	case $call in
426*4887Schin		SI)	;;
427*4887Schin		*)	underscore=U ;;
428*4887Schin		esac
429*4887Schin		;;
430*4887Schin	*)	case " $standards " in
431*4887Schin		" C ")	shift
432*4887Schin			;;
433*4887Schin		*" $standard "*)
434*4887Schin			case $call in
435*4887Schin			SI)	;;
436*4887Schin			*)	flags=${flags}P
437*4887Schin				underscore=U
438*4887Schin				;;
439*4887Schin			esac
440*4887Schin			shift
441*4887Schin			;;
442*4887Schin		*)	standard=
443*4887Schin			;;
444*4887Schin		esac
445*4887Schin		;;
446*4887Schin	esac
447*4887Schin	case $standard in
448*4887Schin	'')	standard=$HOST
449*4887Schin		case $call in
450*4887Schin		SI)	;;
451*4887Schin		*)	underscore=U ;;
452*4887Schin		esac
453*4887Schin		case $call in
454*4887Schin		CS|PC|SC)
455*4887Schin			case $define in
456*4887Schin			_${call}_*)
457*4887Schin				standard=POSIX
458*4887Schin				;;
459*4887Schin			esac
460*4887Schin			;;
461*4887Schin		esac
462*4887Schin		;;
463*4887Schin	esac
464*4887Schin	part=$section
465*4887Schin	case $section in
466*4887Schin	'')	section=1
467*4887Schin		case $standard in
468*4887Schin		POSIX|XOPEN) part=$section ;;
469*4887Schin		esac
470*4887Schin		;;
471*4887Schin	esac
472*4887Schin	name=
473*4887Schin	while	:
474*4887Schin	do	case $# in
475*4887Schin		0)	break ;;
476*4887Schin		esac
477*4887Schin		case $name in
478*4887Schin		'')	name=$1 ;;
479*4887Schin		*)	name=${name}_$1 ;;
480*4887Schin		esac
481*4887Schin		shift
482*4887Schin	done
483*4887Schin	case $name in
484*4887Schin	'')	;;
485*4887Schin	CONFORMANCE|FS_3D|HOSTTYPE|LIBPATH|LIBPREFIX|LIBSUFFIX|PATH_ATTRIBUTES|PATH_RESOLVE|UNIVERSE)
486*4887Schin		;;
487*4887Schin	*)	values=
488*4887Schin		script=
489*4887Schin		args=
490*4887Schin		headers=
491*4887Schin		case $name in
492*4887Schin		V[123456789]_*|V[123456789][0123456789]_*)	underscore=VW ;;
493*4887Schin		esac
494*4887Schin		case $call in
495*4887Schin		CS|SI)	key=CS ;;
496*4887Schin		*)	key=$call ;;
497*4887Schin		esac
498*4887Schin		case $name in
499*4887Schin		*VERSION*)key=${key}_${standard}${part} ;;
500*4887Schin		esac
501*4887Schin		key=${key}_${name}
502*4887Schin		eval x='$'CONF_keys_$name
503*4887Schin		case $x in
504*4887Schin		'')	eval x='$'CONF_name_$key
505*4887Schin			case $x in
506*4887Schin			'')	case $call in
507*4887Schin				SI)	flags=O$flags ;;
508*4887Schin				esac
509*4887Schin				case $underscore in
510*4887Schin				?*)	flags=${flags}${underscore} ;;
511*4887Schin				esac
512*4887Schin				old=QQ
513*4887Schin				case $name in
514*4887Schin				*VERSION*)old=${old}_${standard}${part} ;;
515*4887Schin				esac
516*4887Schin				old=${old}_${name}
517*4887Schin				eval x='$'CONF_name_$old
518*4887Schin				case $x in
519*4887Schin				?*)	eval CONF_name_$old=
520*4887Schin					eval flags='$'flags'$'CONF_flags_$old
521*4887Schin					eval values='$'CONF_values_$old
522*4887Schin					eval script='$'CONF_script_$old
523*4887Schin					eval args='$'CONF_args_$old
524*4887Schin					eval headers='$'CONF_headers_$old
525*4887Schin					;;
526*4887Schin				esac
527*4887Schin				keys="$keys$nl$key"
528*4887Schin				eval CONF_name_${key}='$'name
529*4887Schin				eval CONF_standard_${key}='$'standard
530*4887Schin				eval CONF_call_${key}='$'call
531*4887Schin				eval CONF_section_${key}='$'section
532*4887Schin				eval CONF_flags_${key}=d'$'flags
533*4887Schin				eval CONF_define_${key}='$'define
534*4887Schin				eval CONF_values_${key}='$'values
535*4887Schin				eval CONF_script_${key}='$'script
536*4887Schin				eval CONF_args_${key}='$'args
537*4887Schin				eval CONF_headers_${key}='$'headers
538*4887Schin				;;
539*4887Schin			*)	eval x='$'CONF_define_$key
540*4887Schin				case $x in
541*4887Schin				?*)	case $call in
542*4887Schin					CS)	eval x='$'CONF_call_$key
543*4887Schin						case $x in
544*4887Schin						SI)	;;
545*4887Schin						*)	define= ;;
546*4887Schin						esac
547*4887Schin						;;
548*4887Schin					*)	define=
549*4887Schin						;;
550*4887Schin					esac
551*4887Schin					;;
552*4887Schin				esac
553*4887Schin				case $define in
554*4887Schin				?*)	eval CONF_define_${key}='$'define
555*4887Schin					eval CONF_call_${key}='$'call
556*4887Schin					eval x='$'CONF_call_${key}
557*4887Schin					case $x in
558*4887Schin					QQ)	;;
559*4887Schin					*)	case $flags in
560*4887Schin						*R*)	flags=R ;;
561*4887Schin						*)	flags= ;;
562*4887Schin						esac
563*4887Schin						;;
564*4887Schin					esac
565*4887Schin					case $call in
566*4887Schin					SI)	flags=O$flags ;;
567*4887Schin					esac
568*4887Schin					eval CONF_flags_${key}=d'$'flags'$'CONF_flags_${key}
569*4887Schin					;;
570*4887Schin				esac
571*4887Schin				old=QQ
572*4887Schin				case $name in
573*4887Schin				*VERSION*)old=${old}_${standard}${part} ;;
574*4887Schin				esac
575*4887Schin				old=${old}_${name}
576*4887Schin				eval CONF_name_$old=
577*4887Schin			esac
578*4887Schin			;;
579*4887Schin		*)	for key in $x
580*4887Schin			do	eval x='$'CONF_call_${key}
581*4887Schin				case $x in
582*4887Schin				XX)	eval CONF_call_${key}=QQ
583*4887Schin					eval CONF_flags_${key}=S'$'CONF_flags_${key}
584*4887Schin					;;
585*4887Schin				esac
586*4887Schin			done
587*4887Schin		esac
588*4887Schin		;;
589*4887Schin	esac
590*4887Schindone
591*4887Schin
592*4887Schin# sort keys by name
593*4887Schin
594*4887Schinkeys=`for key in $keys
595*4887Schindo	eval echo '$'CONF_name_$key '$'key
596*4887Schindone | sort -u | sed 's,.* ,,'`
597*4887Schincase $debug in
598*4887Schin-d3)	for key in $keys
599*4887Schin	do	eval name=\"'$'CONF_name_$key\"
600*4887Schin		case $name in
601*4887Schin		?*)	eval standard=\"'$'CONF_standard_$key\"
602*4887Schin			eval call=\"'$'CONF_call_$key\"
603*4887Schin			eval section=\"'$'CONF_section_$key\"
604*4887Schin			eval flags=\"'$'CONF_flags_$key\"
605*4887Schin			eval define=\"'$'CONF_define_$key\"
606*4887Schin			eval values=\"'$'CONF_values_$key\"
607*4887Schin			eval script=\"'$'CONF_script_$key\"
608*4887Schin			eval headers=\"'$'CONF_headers_$key\"
609*4887Schin			printf "%29s %35s %8s %2s %1d %5s %s$nl" "$name" "$key" "$standard" "$call" "$section" "$flags" "$define${values:+$sp=$values}${headers:+$sp$headers$nl}${script:+$sp$ob$script$nl$cb}"
610*4887Schin			;;
611*4887Schin		esac
612*4887Schin	done
613*4887Schin	exit
614*4887Schin	;;
615*4887Schinesac
616*4887Schin
617*4887Schin# mark the dups CONF_PREFIXED
618*4887Schin
619*4887Schinprev_key=
620*4887Schinprev_name=
621*4887Schinfor key in $keys
622*4887Schindo	eval name=\"'$'CONF_name_$key\"
623*4887Schin	case $name in
624*4887Schin	'')	continue
625*4887Schin		;;
626*4887Schin	$prev_name)
627*4887Schin		eval p='$'CONF_flags_${prev_key}
628*4887Schin		eval c='$'CONF_flags_${key}
629*4887Schin		case $p:$c in
630*4887Schin		*L*:*L*);;
631*4887Schin		*L*:*)	c=L${c} ;;
632*4887Schin		*:*L*)	p=L${p} ;;
633*4887Schin		*)	p=P$p c=P$c ;;
634*4887Schin		esac
635*4887Schin		eval CONF_flags_${prev_key}=$p
636*4887Schin		eval CONF_flags_${key}=$c
637*4887Schin		;;
638*4887Schin	esac
639*4887Schin	prev_name=$name
640*4887Schin	prev_key=$key
641*4887Schindone
642*4887Schin
643*4887Schin# collect all the macros/enums
644*4887Schin
645*4887Schinfor key in $keys
646*4887Schindo	eval name=\"'$'CONF_name_$key\"
647*4887Schin	case $name in
648*4887Schin	'')		continue ;;
649*4887Schin	$keep_name)	;;
650*4887Schin	*)		continue ;;
651*4887Schin	esac
652*4887Schin	eval call=\"'$'CONF_call_$key\"
653*4887Schin	case $call in
654*4887Schin	$keep_call)	;;
655*4887Schin	*)		continue ;;
656*4887Schin	esac
657*4887Schin	eval standard=\"'$'CONF_standard_$key\"
658*4887Schin	eval section=\"'$'CONF_section_$key\"
659*4887Schin	eval flags=\"'$'CONF_flags_$key\"
660*4887Schin	eval define=\"'$'CONF_define_$key\"
661*4887Schin	eval values=\"'$'CONF_values_$key\"
662*4887Schin	eval script=\"'$'CONF_script_$key\"
663*4887Schin	eval args=\"'$'CONF_args_$key\"
664*4887Schin	eval headers=\"'$'CONF_headers_$key\"
665*4887Schin	conf_name=$name
666*4887Schin	case $call in
667*4887Schin	QQ)	call=XX
668*4887Schin		for c in SC PC CS
669*4887Schin		do	case $flags in
670*4887Schin			*S*)	case $section in
671*4887Schin				1)	eval x='$'CONF_call_${c}_${standard}_${name} ;;
672*4887Schin				*)	eval x='$'CONF_call_${c}_${standard}${section}_${name} ;;
673*4887Schin				esac
674*4887Schin				;;
675*4887Schin			*)	eval x='$'CONF_call_${c}_${name}
676*4887Schin				;;
677*4887Schin			esac
678*4887Schin			case $x in
679*4887Schin			?*)	call=$x
680*4887Schin				break
681*4887Schin				;;
682*4887Schin			esac
683*4887Schin		done
684*4887Schin		case $call in
685*4887Schin		XX)	for c in SC PC CS
686*4887Schin			do	echo "_${c}_${name}"
687*4887Schin				case $flags in
688*4887Schin				*S*)	case $section in
689*4887Schin					1)	echo "_${c}_${standard}_${name}" ;;
690*4887Schin					*)	echo "_${c}_${standard}${section}_${name}" ;;
691*4887Schin					esac
692*4887Schin					;;
693*4887Schin				esac
694*4887Schin			done
695*4887Schin			;;
696*4887Schin		esac
697*4887Schin		;;
698*4887Schin	esac
699*4887Schin	case $call in
700*4887Schin	CS|PC|SC|SI|XX)
701*4887Schin		;;
702*4887Schin	*)	echo "$command: $name: $call: invalid call" >&2
703*4887Schin		exit 1
704*4887Schin		;;
705*4887Schin	esac
706*4887Schin	case $flags in
707*4887Schin	*[ABEGHIJQTYZabcefghijklmnopqrstuvwxyz_123456789]*)
708*4887Schin		echo "$command: $name: $flags: invalid flag(s)" >&2
709*4887Schin		exit 1
710*4887Schin		;;
711*4887Schin	esac
712*4887Schin	case $section in
713*4887Schin	[01])	;;
714*4887Schin	*)	case $flags in
715*4887Schin		*N*)	;;
716*4887Schin		*)	name=${section}_${name} ;;
717*4887Schin		esac
718*4887Schin		standard=${standard}${section}
719*4887Schin		;;
720*4887Schin	esac
721*4887Schin	case $call in
722*4887Schin	XX)	;;
723*4887Schin	*)	case $flags in
724*4887Schin		*d*)	conf_op=${define} ;;
725*4887Schin		*O*)	conf_op=${call}_${name} ;;
726*4887Schin		*R*)	conf_op=_${standard}_${call}_${name} ;;
727*4887Schin		*S*)	conf_op=_${call}_${standard}_${name} ;;
728*4887Schin		*)	conf_op=_${call}_${name} ;;
729*4887Schin		esac
730*4887Schin		echo "${conf_op}"
731*4887Schin		;;
732*4887Schin	esac
733*4887Schin	case $standard:$flags in
734*4887Schin	C:*)	;;
735*4887Schin	*:*L*)	echo "${conf_name}"
736*4887Schin		echo "_${standard}_${conf_name}"
737*4887Schin		;;
738*4887Schin	*:*M*)	case $section in
739*4887Schin		1)	echo "_${standard}_${conf_name}" ;;
740*4887Schin		*)	echo "_${standard}${section}_${conf_name}" ;;
741*4887Schin		esac
742*4887Schin		;;
743*4887Schin	esac
744*4887Schindone > $tmp.q
745*4887Schinsort -u < $tmp.q > $tmp.t
746*4887Schinmv $tmp.t $tmp.q
747*4887Schinsort -u < $tmp.v > $tmp.t
748*4887Schinmv $tmp.t $tmp.v
749*4887Schincase $debug in
750*4887Schin-d4)	exit ;;
751*4887Schinesac
752*4887Schin
753*4887Schin# test all the macros in a few batches (some compilers have an error limit)
754*4887Schin
755*4887Schindefined() # list-file
756*4887Schin{
757*4887Schin	: > $tmp.p
758*4887Schin	while	:
759*4887Schin	do	{
760*4887Schin			cat <<!
761*4887Schin${head}
762*4887Schin#include <sys/types.h>
763*4887Schin#include <limits.h>
764*4887Schin#include <unistd.h>$systeminfo$headers
765*4887Schin${tail}
766*4887Schin#undef conf
767*4887Schinunsigned int conf[] = {
768*4887Schin!
769*4887Schin			sed 's/$/,/' $1
770*4887Schin			echo "};"
771*4887Schin		} > $tmp.c
772*4887Schin		[[ -f $tmp.1.c ]] || cp $tmp.c $tmp.1.c
773*4887Schin		if	$cc -c $tmp.c > $tmp.e 2>&1
774*4887Schin		then	break
775*4887Schin		fi
776*4887Schin		[[ -f $tmp.1.e ]] || cp $tmp.e $tmp.1.e
777*4887Schin		snl='\
778*4887Schin'
779*4887Schin		sed "s/[^_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789][^_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789]*/${snl}/g" $tmp.e |
780*4887Schin		grep '^[_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz][_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789]*$' |
781*4887Schin		sort -u > $tmp.n
782*4887Schin		cmp -s $tmp.n $tmp.p && break
783*4887Schin		fgrep -x -v -f $tmp.n $1 > $tmp.y
784*4887Schin		mv $tmp.y $1
785*4887Schin		mv $tmp.n $tmp.p
786*4887Schin	done
787*4887Schin	{
788*4887Schin		cat <<!
789*4887Schin${head}
790*4887Schin#include <sys/types.h>
791*4887Schin#include <limits.h>
792*4887Schin#include <unistd.h>$systeminfo$headers
793*4887Schin${tail}
794*4887Schin#undef conf
795*4887Schin!
796*4887Schin		sed 's/.*/conf "&" = &/' $1
797*4887Schin	} > $tmp.c
798*4887Schin	$cc -E $tmp.c 2>/dev/null |
799*4887Schin	sed -e '/conf[ 	]*".*"[ 	]*=[ 	]*/!d' -e '/[_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789][ 	]*(/!d' -e 's/.*"\(.*\)".*/\1/' > $tmp.n
800*4887Schin	if	test -s $tmp.n
801*4887Schin	then	fgrep -x -v -f $tmp.n $1 > $tmp.y
802*4887Schin		mv $tmp.y $1
803*4887Schin	fi
804*4887Schin}
805*4887Schin
806*4887Schincase $verbose in
807*4887Schin1)	echo "$command: check macros/enums as static initializers" >&2 ;;
808*4887Schinesac
809*4887Schindefined $tmp.q
810*4887Schindefined $tmp.v
811*4887Schincase $debug in
812*4887Schin-d5)	exit ;;
813*4887Schinesac
814*4887Schin
815*4887Schin# mark the constant macros/enums
816*4887Schin
817*4887Schinexec < $tmp.q
818*4887Schinwhile	read line
819*4887Schindo	eval CONF_const_${line}=1
820*4887Schindone
821*4887Schinexec < $tmp.v
822*4887Schinwhile	read line
823*4887Schindo	eval CONF_const_${line}=1
824*4887Schindone
825*4887Schin
826*4887Schin# mark the string literal values
827*4887Schin
828*4887Schin{
829*4887Schin	cat <<!
830*4887Schin${head}
831*4887Schin#include <sys/types.h>
832*4887Schin#include <limits.h>
833*4887Schin#include <unistd.h>$systeminfo$headers
834*4887Schin${tail}
835*4887Schin#undef conf
836*4887Schin!
837*4887Schin	sed 's/.*/conf "&" = &/' $tmp.q
838*4887Schin} > $tmp.c
839*4887Schin$cc -E $tmp.c 2>/dev/null |
840*4887Schinsed -e '/conf[ 	]*".*"[ 	]*=[ 	]*"/!d' -e 's/.*"\([^"]*\)".*/\1/' > $tmp.e
841*4887Schinexec < $tmp.e
842*4887Schinwhile	read line
843*4887Schindo	eval CONF_string_${line}=1
844*4887Schindone
845*4887Schin
846*4887Schin# walk through the table
847*4887Schin
848*4887Schincase $shell in
849*4887Schinksh)	integer len name_max ;;
850*4887Schinesac
851*4887Schinname_max=1
852*4887Schinexport tmp name standard call cc
853*4887Schin
854*4887Schinfor key in $keys
855*4887Schindo	eval name=\"'$'CONF_name_$key\"
856*4887Schin	case $name in
857*4887Schin	'')		continue ;;
858*4887Schin	$keep_name)	;;
859*4887Schin	*)		continue ;;
860*4887Schin	esac
861*4887Schin	eval call=\"'$'CONF_call_$key\"
862*4887Schin	case $call in
863*4887Schin	$keep_call)	;;
864*4887Schin	*)		continue ;;
865*4887Schin	esac
866*4887Schin	eval standard=\"'$'CONF_standard_$key\"
867*4887Schin	eval section=\"'$'CONF_section_$key\"
868*4887Schin	eval flags=\"'$'CONF_flags_$key\"
869*4887Schin	eval define=\"'$'CONF_define_$key\"
870*4887Schin	eval values=\"'$'CONF_values_$key\"
871*4887Schin	eval script=\"'$'CONF_script_$key\"
872*4887Schin	eval args=\"'$'CONF_args_$key\"
873*4887Schin	eval headers=\"'$'CONF_headers_$key\"
874*4887Schin	conf_name=$name
875*4887Schin	case $call in
876*4887Schin	QQ)	call=XX
877*4887Schin		for c in SC PC CS
878*4887Schin		do	case $flags in
879*4887Schin			*S*)	case $section in
880*4887Schin				1)	eval x='$'CONF_call_${c}_${standard}_${name} ;;
881*4887Schin				*)	eval x='$'CONF_call_${c}_${standard}${section}_${name} ;;
882*4887Schin				esac
883*4887Schin				;;
884*4887Schin			*)	eval x='$'CONF_call_${c}_${name}
885*4887Schin				;;
886*4887Schin			esac
887*4887Schin			case $x in
888*4887Schin			?*)	call=$x
889*4887Schin				break
890*4887Schin				;;
891*4887Schin			esac
892*4887Schin		done
893*4887Schin		case $call in
894*4887Schin		XX)	for c in SC PC CS
895*4887Schin			do	case $flags in
896*4887Schin				*S*)	case $section in
897*4887Schin					1)	eval x='$'CONF_const__${c}_${standard}_${name} ;;
898*4887Schin					*)	eval x='$'CONF_const__${c}_${standard}${section}_${name} ;;
899*4887Schin					esac
900*4887Schin					;;
901*4887Schin				*)	eval x='$'CONF_const__${c}_${name}
902*4887Schin					;;
903*4887Schin				esac
904*4887Schin				case $x in
905*4887Schin				1)	call=$c
906*4887Schin					break
907*4887Schin					;;
908*4887Schin				esac
909*4887Schin			done
910*4887Schin			;;
911*4887Schin		esac
912*4887Schin		case $call in
913*4887Schin		XX)	case $standard in
914*4887Schin			C)	standard=POSIX ;;
915*4887Schin			esac
916*4887Schin			case $flags in
917*4887Schin			*L*)	flags=lFU ;;
918*4887Schin			*)	flags=FU ;;
919*4887Schin			esac
920*4887Schin			;;
921*4887Schin		esac
922*4887Schin		;;
923*4887Schin	esac
924*4887Schin	case " $standards " in
925*4887Schin	*" $standard "*)
926*4887Schin		;;
927*4887Schin	*)	standards="$standards $standard"
928*4887Schin		;;
929*4887Schin	esac
930*4887Schin	conf_standard=CONF_${standard}
931*4887Schin	case $call in
932*4887Schin	CS)	conf_call=CONF_confstr
933*4887Schin		;;
934*4887Schin	PC)	conf_call=CONF_pathconf
935*4887Schin		;;
936*4887Schin	SC)	conf_call=CONF_sysconf
937*4887Schin		;;
938*4887Schin	SI)	conf_call=CONF_sysinfo
939*4887Schin		;;
940*4887Schin	XX)	conf_call=CONF_nop
941*4887Schin		;;
942*4887Schin	esac
943*4887Schin	conf_op=-1
944*4887Schin	for s in _${call}_${standard}${section}_${name} _${call}_${standard}_${name} _${call}_${section}_${name} _${call}_${name} ${call}_${name}
945*4887Schin	do	eval x='$'CONF_const_${s}
946*4887Schin		case $x in
947*4887Schin		1)	conf_op=${s}
948*4887Schin			break
949*4887Schin			;;
950*4887Schin		esac
951*4887Schin	done
952*4887Schin	conf_section=$section
953*4887Schin	conf_flags=0
954*4887Schin	case $flags in
955*4887Schin	*C*)	conf_flags="${conf_flags}|CONF_DEFER_CALL" ;;
956*4887Schin	esac
957*4887Schin	case $flags in
958*4887Schin	*D*)	conf_flags="${conf_flags}|CONF_DEFER_MM" ;;
959*4887Schin	esac
960*4887Schin	case $flags in
961*4887Schin	*F*)	conf_flags="${conf_flags}|CONF_FEATURE" ;;
962*4887Schin	esac
963*4887Schin	case $flags in
964*4887Schin	*L*)	conf_flags="${conf_flags}|CONF_LIMIT" ;;
965*4887Schin	esac
966*4887Schin	case $flags in
967*4887Schin	*M*)	conf_flags="${conf_flags}|CONF_MINMAX" ;;
968*4887Schin	esac
969*4887Schin	case $flags in
970*4887Schin	*N*)	conf_flags="${conf_flags}|CONF_NOSECTION" ;;
971*4887Schin	esac
972*4887Schin	case $flags in
973*4887Schin	*P*)	conf_flags="${conf_flags}|CONF_PREFIXED" ;;
974*4887Schin	esac
975*4887Schin	case $flags in
976*4887Schin	*S*)	conf_flags="${conf_flags}|CONF_STANDARD" ;;
977*4887Schin	esac
978*4887Schin	case $flags in
979*4887Schin	*U*)	conf_flags="${conf_flags}|CONF_UNDERSCORE" ;;
980*4887Schin	esac
981*4887Schin	case $flags in
982*4887Schin	*V*)	conf_flags="${conf_flags}|CONF_NOUNDERSCORE" ;;
983*4887Schin	esac
984*4887Schin	case $flags in
985*4887Schin	*W*)	conf_flags="${conf_flags}|CONF_PREFIX_ONLY" ;;
986*4887Schin	esac
987*4887Schin	case $shell in
988*4887Schin	ksh)	conf_flags=${conf_flags#0?} ;;
989*4887Schin	esac
990*4887Schin	case $debug in
991*4887Schin	?*)	case $standard in
992*4887Schin		????)	sep=" " ;;
993*4887Schin		???)	sep="  " ;;
994*4887Schin		??)	sep="   " ;;
995*4887Schin		?)	sep="    " ;;
996*4887Schin		*)	sep="" ;;
997*4887Schin		esac
998*4887Schin		echo "$command: test: $sep$standard $call $name" >&2
999*4887Schin		;;
1000*4887Schin	esac
1001*4887Schin	case $call in
1002*4887Schin	CS|SI)	conf_flags="${conf_flags}|CONF_STRING"
1003*4887Schin		string=1
1004*4887Schin		;;
1005*4887Schin	*)	eval string='$'CONF_string_${key}
1006*4887Schin		;;
1007*4887Schin	esac
1008*4887Schin	conf_limit=0
1009*4887Schin	case $flags in
1010*4887Schin	*[Ll]*)	d=
1011*4887Schin		case ${conf_name} in
1012*4887Schin		LONG_MAX|SSIZE_MAX)
1013*4887Schin			x=
1014*4887Schin			;;
1015*4887Schin		*)	eval x='$'CONF_const_${conf_name}
1016*4887Schin			;;
1017*4887Schin		esac
1018*4887Schin		case $x in
1019*4887Schin		'')	for s in ${values}
1020*4887Schin			do	case $s in
1021*4887Schin				$sym)	eval x='$'CONF_const_${s}
1022*4887Schin					case $x in
1023*4887Schin					1)	eval a='$'CONF_const_${standard}_${s}
1024*4887Schin						case $a in
1025*4887Schin						$x)	x= ;;
1026*4887Schin						*)	x=$s ;;
1027*4887Schin						esac
1028*4887Schin						break
1029*4887Schin						;;
1030*4887Schin					esac
1031*4887Schin					;;
1032*4887Schin				[0123456789]*|[-+][0123456789]*)
1033*4887Schin					d=$s
1034*4887Schin					break
1035*4887Schin					;;
1036*4887Schin				esac
1037*4887Schin			done
1038*4887Schin			case ${x:+1}:$flags:$conf_op in
1039*4887Schin			:*:-1|:*X*:*)
1040*4887Schin				case $verbose in
1041*4887Schin				1)	echo "$command: probe for ${conf_name} <limits.h> value" >&2 ;;
1042*4887Schin				esac
1043*4887Schin				x=
1044*4887Schin				case $CONF_getconf in
1045*4887Schin				?*)	if	$CONF_getconf $conf_name > $tmp.x 2>/dev/null
1046*4887Schin					then	x=`cat $tmp.x`
1047*4887Schin						case $x in
1048*4887Schin						undefined)	x= ;;
1049*4887Schin						esac
1050*4887Schin					fi
1051*4887Schin					;;
1052*4887Schin				esac
1053*4887Schin				case ${x:+1} in
1054*4887Schin				'')	case $script in
1055*4887Schin					'#'*)	echo "$script" > $tmp.sh
1056*4887Schin						chmod +x $tmp.sh
1057*4887Schin						x=`./$tmp.sh 2>/dev/null`
1058*4887Schin						;;
1059*4887Schin					'')	case $conf_name in
1060*4887Schin						SIZE_*|U*|*_MAX)
1061*4887Schin							f="%${LL}u"
1062*4887Schin							t="unsigned _ast_intmax_t"
1063*4887Schin							;;
1064*4887Schin						*)	f="%${LL}d"
1065*4887Schin							t="_ast_intmax_t"
1066*4887Schin							;;
1067*4887Schin						esac
1068*4887Schin						cat > $tmp.c <<!
1069*4887Schin${head}
1070*4887Schin#include <stdio.h>
1071*4887Schin#include <sys/types.h>
1072*4887Schin#include <limits.h>
1073*4887Schin#include <unistd.h>$systeminfo$headers
1074*4887Schin${tail}
1075*4887Schinint
1076*4887Schinmain()
1077*4887Schin{
1078*4887Schin	printf("$f\n", ($t)$conf_name);
1079*4887Schin	return 0;
1080*4887Schin}
1081*4887Schin!
1082*4887Schin						;;
1083*4887Schin					*)	cat > $tmp.c <<!
1084*4887Schin${head}
1085*4887Schin#include <sys/types.h>
1086*4887Schin#include <limits.h>
1087*4887Schin#include <unistd.h>$systeminfo$headers
1088*4887Schin${tail}
1089*4887Schin${script}
1090*4887Schin!
1091*4887Schin						;;
1092*4887Schin					esac
1093*4887Schin					case $args in
1094*4887Schin					'')	set "" ;;
1095*4887Schin					*)	eval set '""' '"'$args'"'; shift ;;
1096*4887Schin					esac
1097*4887Schin					for a
1098*4887Schin					do	case $script in
1099*4887Schin						'#'*)	./$tmp.sh $a > $tmp.x 2>/dev/null
1100*4887Schin							x=$?
1101*4887Schin							;;
1102*4887Schin						*)	$cc $a -o $tmp.exe $tmp.c >/dev/null 2>&1 && ./$tmp.exe > $tmp.x 2>/dev/null
1103*4887Schin							x=$?
1104*4887Schin							;;
1105*4887Schin						esac
1106*4887Schin						case $x in
1107*4887Schin						0)	x=`cat $tmp.x`
1108*4887Schin							case $x in
1109*4887Schin							"-")	x=$a ;;
1110*4887Schin							esac
1111*4887Schin							break
1112*4887Schin							;;
1113*4887Schin						*)	x=
1114*4887Schin							;;
1115*4887Schin						esac
1116*4887Schin					done
1117*4887Schin					;;
1118*4887Schin				esac
1119*4887Schin				case $x in
1120*4887Schin				'')	x=$d ;;
1121*4887Schin				esac
1122*4887Schin				;;
1123*4887Schin			esac
1124*4887Schin			case ${x:+1}:$flags:$conf_op in
1125*4887Schin			1:*:-1|1:*X*:*)
1126*4887Schin				conf_limit=$x
1127*4887Schin				case $flags in
1128*4887Schin				*L*)	;;
1129*4887Schin				*)	conf_flags="${conf_flags}|CONF_LIMIT" ;;
1130*4887Schin				esac
1131*4887Schin				conf_flags="${conf_flags}|CONF_LIMIT_DEF"
1132*4887Schin				case $string:$x in
1133*4887Schin				1:*)	cat >> $tmp.l <<!
1134*4887Schinprintf("#ifndef ${conf_name}\n");
1135*4887Schinprintf("#define ${conf_name} \"${x}\"\n");
1136*4887Schinprintf("#endif\n");
1137*4887Schin!
1138*4887Schin					;;
1139*4887Schin				*:U*)	cat >> $tmp.l <<!
1140*4887Schinprintf("#ifndef ${conf_name}\n");
1141*4887Schinprintf("#ifndef ${x}\n");
1142*4887Schinprintf("#define ${x} %lu\n", ${x});
1143*4887Schinprintf("#endif\n");
1144*4887Schinprintf("#define ${conf_name} ${x}\n");
1145*4887Schinprintf("#endif\n");
1146*4887Schin!
1147*4887Schin					;;
1148*4887Schin				*:$sym)	cat >> $tmp.l <<!
1149*4887Schinprintf("#ifndef ${conf_name}\n");
1150*4887Schinprintf("#ifndef ${x}\n");
1151*4887Schinprintf("#define ${x} %ld\n", ${x});
1152*4887Schinprintf("#endif\n");
1153*4887Schinprintf("#define ${conf_name} ${x}\n");
1154*4887Schinprintf("#endif\n");
1155*4887Schin!
1156*4887Schin					;;
1157*4887Schin				*)	cat >> $tmp.l <<!
1158*4887Schinprintf("#ifndef ${conf_name}\n");
1159*4887Schinprintf("#define ${conf_name} ${x}\n");
1160*4887Schinprintf("#endif\n");
1161*4887Schin!
1162*4887Schin					;;
1163*4887Schin				esac
1164*4887Schin				;;
1165*4887Schin			esac
1166*4887Schin			;;
1167*4887Schin		esac
1168*4887Schin		;;
1169*4887Schin	esac
1170*4887Schin	case $section in
1171*4887Schin	[01])	;;
1172*4887Schin	*)	case $flags in
1173*4887Schin		*N*)	;;
1174*4887Schin		*)	name=${section}_${name} ;;
1175*4887Schin		esac
1176*4887Schin		standard=${standard}${section}
1177*4887Schin		;;
1178*4887Schin	esac
1179*4887Schin	conf_minmax=0
1180*4887Schin	case $call:$standard:$flags in
1181*4887Schin	*:C:*M*)for s in _${standard}_${conf_name} ${values}
1182*4887Schin		do	case $s in
1183*4887Schin			$sym)	;;
1184*4887Schin			*)	conf_minmax=$s
1185*4887Schin				conf_flags="${conf_flags}|CONF_MINMAX_DEF"
1186*4887Schin				break
1187*4887Schin				;;
1188*4887Schin			esac
1189*4887Schin		done
1190*4887Schin		;;
1191*4887Schin	*:C:*)	;;
1192*4887Schin	[CPSX][CSX]:*:*[FM]*)
1193*4887Schin		x=
1194*4887Schin		for s in _${standard}_${conf_name} ${values}
1195*4887Schin		do	case $s in
1196*4887Schin			$sym)	eval x='$'CONF_const_${s} ;;
1197*4887Schin			*)	x=1 ;;
1198*4887Schin			esac
1199*4887Schin			case $x in
1200*4887Schin			1)	conf_minmax=$s
1201*4887Schin				case $flags in
1202*4887Schin				*M*)	conf_flags="${conf_flags}|CONF_MINMAX_DEF" ;;
1203*4887Schin				esac
1204*4887Schin				break
1205*4887Schin				;;
1206*4887Schin			esac
1207*4887Schin		done
1208*4887Schin		case ${x:+1}:${script:+1} in
1209*4887Schin		:1)	case $verbose in
1210*4887Schin			1)	echo "$command: probe for _${standard}_${conf_name} minmax value" >&2 ;;
1211*4887Schin			esac
1212*4887Schin			case $CONF_getconf in
1213*4887Schin			?*)	if	$CONF_getconf _${standard}_${conf_name} > $tmp.x 2>/dev/null
1214*4887Schin				then	x=`cat $tmp.x`
1215*4887Schin					case $x in
1216*4887Schin					undefined)	x= ;;
1217*4887Schin					esac
1218*4887Schin				fi
1219*4887Schin				;;
1220*4887Schin			esac
1221*4887Schin			case $x in
1222*4887Schin			'')	case $script in
1223*4887Schin				'#'*)	echo "$script" > $tmp.sh
1224*4887Schin					chmod +x $tmp.sh
1225*4887Schin					x=`./$tmp.sh 2>/dev/null`
1226*4887Schin					;;
1227*4887Schin				*)	cat > $tmp.c <<!
1228*4887Schin${head}
1229*4887Schin#include <sys/types.h>
1230*4887Schin#include <limits.h>
1231*4887Schin#include <unistd.h>$systeminfo$headers
1232*4887Schin${tail}
1233*4887Schin${script}
1234*4887Schin!
1235*4887Schin					;;
1236*4887Schin				esac
1237*4887Schin				case $args in
1238*4887Schin				'')	set "" ;;
1239*4887Schin				*)	eval set '""' "$args"; shift ;;
1240*4887Schin				esac
1241*4887Schin				for a
1242*4887Schin				do	case $script in
1243*4887Schin					'#'*)	./$tmp.sh $a > $tmp.x 2>/dev/null
1244*4887Schin						x=$?
1245*4887Schin						;;
1246*4887Schin					*)	$cc $a -o $tmp.exe $tmp.c >/dev/null 2>&1 && ./$tmp.exe > $tmp.x 2>/dev/null
1247*4887Schin						x=$?
1248*4887Schin						;;
1249*4887Schin					esac
1250*4887Schin					case $x in
1251*4887Schin					0)	x=`cat $tmp.x`
1252*4887Schin						case $x in
1253*4887Schin						"-")	x=$a ;;
1254*4887Schin						esac
1255*4887Schin						break
1256*4887Schin						;;
1257*4887Schin					*)	x=
1258*4887Schin						;;
1259*4887Schin					esac
1260*4887Schin				done
1261*4887Schin				;;
1262*4887Schin			esac
1263*4887Schin			case $x in
1264*4887Schin			?*)	conf_minmax=$x
1265*4887Schin				case $flags in
1266*4887Schin				*M*)	conf_flags="${conf_flags}|CONF_MINMAX_DEF" ;;
1267*4887Schin				esac
1268*4887Schin				;;
1269*4887Schin			esac
1270*4887Schin			;;
1271*4887Schin		esac
1272*4887Schin		;;
1273*4887Schin	esac
1274*4887Schin	case $string in
1275*4887Schin	1)	conf_limit="{ 0, $conf_limit }" conf_minmax="{ 0, $conf_minmax }"
1276*4887Schin		;;
1277*4887Schin	*)	case $conf_limit in
1278*4887Schin		0[xX]*|-*|+*|[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_]*)
1279*4887Schin			;;
1280*4887Schin		*[!0123456789abcdefABCDEF]*)
1281*4887Schin			conf_limit=0
1282*4887Schin			;;
1283*4887Schin		*[!0123456789]*)
1284*4887Schin			conf_limit=0x$conf_limit
1285*4887Schin			;;
1286*4887Schin		esac
1287*4887Schin		case $conf_minmax in
1288*4887Schin		0[xX]*|-*|+*|[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_]*)
1289*4887Schin			;;
1290*4887Schin		*[!0123456789abcdefABCDEF]*)
1291*4887Schin			conf_minmax=0
1292*4887Schin			;;
1293*4887Schin		*[!0123456789]*)
1294*4887Schin			conf_minmax=0x$conf_minmax
1295*4887Schin			;;
1296*4887Schin		esac
1297*4887Schin		conf_limit="{ $conf_limit, 0 }" conf_minmax="{ $conf_minmax, 0 }"
1298*4887Schin		;;
1299*4887Schin	esac
1300*4887Schin	echo "{ \"$conf_name\", $conf_limit, $conf_minmax, $conf_flags, $conf_standard, $conf_section, $conf_call, $conf_op },"
1301*4887Schin	case $shell in
1302*4887Schin	ksh)	len=${#conf_name}
1303*4887Schin		if	((len>=name_max))
1304*4887Schin		then	((name_max=len+1))
1305*4887Schin		fi
1306*4887Schin		;;
1307*4887Schin	*)	len=`echo ${conf_name} | wc -c`
1308*4887Schin		if	expr \( $len - 1 \) \>= ${name_max} >/dev/null
1309*4887Schin		then	name_max=$len
1310*4887Schin		fi
1311*4887Schin		;;
1312*4887Schin	esac
1313*4887Schindone > $tmp.t
1314*4887Schincase $debug in
1315*4887Schin-d6)	exit ;;
1316*4887Schinesac
1317*4887Schin
1318*4887Schin# conf string table
1319*4887Schin
1320*4887Schinbase=conftab
1321*4887Schincase $verbose in
1322*4887Schin1)	echo "$command: generate ${base}.h string table header" >&2 ;;
1323*4887Schinesac
1324*4887Schincase $shell in
1325*4887Schinksh)	((name_max=name_max+3)); ((name_max=name_max/4*4)) ;; # bsd /bin/sh !
1326*4887Schin*)	name_max=`expr \( $name_max + 3 \) / 4 \* 4` ;;
1327*4887Schinesac
1328*4887Schin{
1329*4887Schincat <<!
1330*4887Schin#pragma prototyped
1331*4887Schin
1332*4887Schin#ifndef _CONFTAB_H
1333*4887Schin#define _CONFTAB_H
1334*4887Schin$systeminfo
1335*4887Schin
1336*4887Schin${generated}
1337*4887Schin
1338*4887Schin#define conf		_ast_conf_data
1339*4887Schin#define conf_elements	_ast_conf_ndata
1340*4887Schin
1341*4887Schin#define prefix		_ast_conf_prefix
1342*4887Schin#define prefix_elements	_ast_conf_nprefix
1343*4887Schin
1344*4887Schin#define CONF_nop	0
1345*4887Schin#define	CONF_confstr	1
1346*4887Schin#define CONF_pathconf	2
1347*4887Schin#define CONF_sysconf	3
1348*4887Schin#define CONF_sysinfo	4
1349*4887Schin
1350*4887Schin!
1351*4887Schinindex=0
1352*4887Schinfor standard in $standards
1353*4887Schindo	echo "#define CONF_${standard}	${index}"
1354*4887Schin	case $shell in
1355*4887Schin	ksh)	((index=index+1)) ;;
1356*4887Schin	*)	index=`expr ${index} + 1` ;;
1357*4887Schin	esac
1358*4887Schindone
1359*4887Schinecho "#define CONF_call	${index}"
1360*4887Schincase $CONF_getconf in
1361*4887Schin?*)	echo
1362*4887Schin	echo "#define _pth_getconf	\"$CONF_getconf\""
1363*4887Schin	case $CONF_getconf_a in
1364*4887Schin	?*)	echo "#define _pth_getconf_a	\"$CONF_getconf_a\"" ;;
1365*4887Schin	esac
1366*4887Schin	;;
1367*4887Schinesac
1368*4887Schincat <<!
1369*4887Schin
1370*4887Schin#define CONF_DEFER_CALL		0x0001
1371*4887Schin#define CONF_DEFER_MM		0x0002
1372*4887Schin#define CONF_FEATURE		0x0004
1373*4887Schin#define CONF_LIMIT		0x0008
1374*4887Schin#define CONF_LIMIT_DEF		0x0010
1375*4887Schin#define CONF_MINMAX		0x0020
1376*4887Schin#define CONF_MINMAX_DEF		0x0040
1377*4887Schin#define CONF_NOSECTION		0x0080
1378*4887Schin#define CONF_NOUNDERSCORE	0x0100
1379*4887Schin#define CONF_PREFIX_ONLY	0x0200
1380*4887Schin#define CONF_PREFIXED		0x0400
1381*4887Schin#define CONF_STANDARD		0x0800
1382*4887Schin#define CONF_STRING		0x1000
1383*4887Schin#define CONF_UNDERSCORE		0x2000
1384*4887Schin#define CONF_USER		0x4000
1385*4887Schin
1386*4887Schinstruct Conf_s; typedef struct Conf_s Conf_t;
1387*4887Schin
1388*4887Schintypedef int (*Conf_f)(Conf_t*, intmax_t*, char**);
1389*4887Schin
1390*4887Schintypedef struct Value_s
1391*4887Schin{
1392*4887Schin	intmax_t	number;
1393*4887Schin	const char*	string;
1394*4887Schin} Value_t;
1395*4887Schin
1396*4887Schinstruct Conf_s
1397*4887Schin{
1398*4887Schin	const char	name[${name_max}];
1399*4887Schin	Value_t		limit;
1400*4887Schin	Value_t		minmax;
1401*4887Schin	short		flags;
1402*4887Schin	short		standard;
1403*4887Schin	short		section;
1404*4887Schin	short		call;
1405*4887Schin	short		op;
1406*4887Schin};
1407*4887Schin
1408*4887Schintypedef struct Prefix_s
1409*4887Schin{
1410*4887Schin	const char	name[16];
1411*4887Schin	short		length;
1412*4887Schin	short		standard;
1413*4887Schin	short		call;
1414*4887Schin} Prefix_t;
1415*4887Schin
1416*4887Schinextern const Conf_t	conf[];
1417*4887Schinextern int		conf_elements;
1418*4887Schin
1419*4887Schinextern const Prefix_t	prefix[];
1420*4887Schinextern int		prefix_elements;
1421*4887Schin
1422*4887Schin#endif
1423*4887Schin!
1424*4887Schin} > $tmp.1
1425*4887Schinproto < $tmp.1 > $tmp.2
1426*4887Schincase $debug in
1427*4887Schin-d7)	echo $command: $tmp.2 ${base}.h ;;
1428*4887Schin*)	cmp -s $tmp.2 ${base}.h 2>/dev/null || mv $tmp.2 ${base}.h ;;
1429*4887Schinesac
1430*4887Schin
1431*4887Schincase $verbose in
1432*4887Schin1)	echo "$command: generate ${base}.c string table" >&2 ;;
1433*4887Schinesac
1434*4887Schin{
1435*4887Schincat <<!
1436*4887Schin#pragma prototyped
1437*4887Schin${head}
1438*4887Schin#include <sys/types.h>
1439*4887Schin#include <limits.h>
1440*4887Schin#include <unistd.h>$systeminfo$headers
1441*4887Schin${tail}
1442*4887Schin#include "${base}.h"
1443*4887Schin
1444*4887Schin${generated}
1445*4887Schin
1446*4887Schin/*
1447*4887Schin * prefix strings -- the first few are indexed by Conf_t.standard
1448*4887Schin */
1449*4887Schin
1450*4887Schinconst Prefix_t prefix[] =
1451*4887Schin{
1452*4887Schin!
1453*4887Schinfor standard in $standards
1454*4887Schindo	case $shell in
1455*4887Schin	ksh)	len=${#standard} ;;
1456*4887Schin	*)	len=`echo ${standard} | wc -c`; len=`expr $len - 1` ;;
1457*4887Schin	esac
1458*4887Schin	echo "	\"${standard}\",	${len},	CONF_${standard},	-1,"
1459*4887Schindone
1460*4887Schincat <<!
1461*4887Schin	"XX",		2,	CONF_POSIX,	CONF_nop,
1462*4887Schin	"CS",		2,	CONF_POSIX,	CONF_confstr,
1463*4887Schin	"PC",		2,	CONF_POSIX,	CONF_pathconf,
1464*4887Schin	"SC",		2,	CONF_POSIX,	CONF_sysconf,
1465*4887Schin	"SI",		2,	CONF_SVID,	CONF_sysinfo,
1466*4887Schin};
1467*4887Schin
1468*4887Schinint	prefix_elements = (int)sizeof(prefix) / (int)sizeof(prefix[0]);
1469*4887Schin
1470*4887Schin/*
1471*4887Schin * conf strings sorted in ascending order
1472*4887Schin */
1473*4887Schin
1474*4887Schinconst Conf_t conf[] =
1475*4887Schin{
1476*4887Schin!
1477*4887Schincat $tmp.t
1478*4887Schincat <<!
1479*4887Schin};
1480*4887Schin
1481*4887Schinint	conf_elements = (int)sizeof(conf) / (int)sizeof(conf[0]);
1482*4887Schin!
1483*4887Schin} > $tmp.3
1484*4887Schinproto < $tmp.3 > $tmp.4
1485*4887Schincase $debug in
1486*4887Schin-d7)	echo $command: $tmp.4 ${base}.c ;;
1487*4887Schin*)	cmp -s $tmp.4 ${base}.c 2>/dev/null || mv $tmp.4 ${base}.c ;;
1488*4887Schinesac
1489*4887Schin
1490*4887Schin# limits.h generation code
1491*4887Schin
1492*4887Schinbase=conflim
1493*4887Schincase $verbose in
1494*4887Schin1)	echo "$command: generate ${base}.h supplemental <limits.h> values" >&2 ;;
1495*4887Schinesac
1496*4887Schin{
1497*4887Schincat <<!
1498*4887Schin${generated}
1499*4887Schin
1500*4887Schin/*
1501*4887Schin * supplemental <limits.h> values
1502*4887Schin */
1503*4887Schin
1504*4887Schin!
1505*4887Schintest -f $tmp.l && cat $tmp.l
1506*4887Schin} > $tmp.5
1507*4887Schincase $debug in
1508*4887Schin-d7)	echo $command: $tmp.5 ${base}.h ;;
1509*4887Schin*)	cmp -s $tmp.5 ${base}.h 2>/dev/null || mv $tmp.5 ${base}.h ;;
1510*4887Schinesac
1511*4887Schinexit 0
1512