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