xref: /titanic_41/usr/src/lib/libpp/common/pp.probe (revision 3fb517f786391b507780c78aabb8d98bfea9efe9)
1:
2# Glenn Fowler
3# AT&T Research
4#
5# @(#)pp.probe (AT&T Research) 2009-02-02
6#
7# C probe for libpp
8#
9# NOTE: C.probe must be included or .'d here
10#
11
12ppdef=$dir/pp.def
13ppkey=$dir/pp.key
14ppsym=$dir/ppsym
15for f in $ppdef $ppkey $ppsym
16do	test -f $f || { echo "$0: $f: not found" >&4; exit 1 ;}
17done
18
19sed -e "/^#/d" -e "s/[ 	].*//" < $ppdef > all.pp
20
21system=
22release=
23version=
24architecture=
25cpu=
26model=
27machine=
28undef_predef=
29
30#
31# path cleanup
32#
33
34for i in stdinclude usrinclude
35do	eval o='$'$i
36	v=$o
37	case $v in
38	*//*)	v=`echo $v | sed 's,///*,/,g'` ;;
39	esac
40	if	(test . -ef "`pwd`")
41	then	k=
42		for x in $v
43		do	case $x in
44			*/../*|*/..)
45				case $x in
46				/*)	a=/ ;;
47				*)	a= ;;
48				esac
49				IFS=/
50				set '' $x
51				IFS=$ifs
52				r=
53				for d
54				do	r="$d $r"
55				done
56				p=
57				g=
58				for d in $r
59				do	case $d in
60					..)	g="$g $d" ;;
61					*)	case $g in
62						'')	case $p in
63							'')	p=$d ;;
64							*)	p=$d/$p ;;
65							esac
66							;;
67						*)	set $g
68							shift
69							g=$*
70							;;
71						esac
72						;;
73					esac
74				done
75				case $a in
76				'')	for d in $g
77					do	p=$d/$p
78					done
79					;;
80				*)	p=$a$p
81					;;
82				esac
83				case $p in
84				/)	continue ;;
85				esac
86				test $x -ef $p && x=$p
87				;;
88			esac
89			k="$k $x"
90		done
91		set '' $k
92		shift
93		v=$1
94		case $# in
95		0)	;;
96		*)	shift
97			while	:
98			do	case $# in
99				0)	break ;;
100				esac
101				k=
102				for d
103				do	for j in $v
104					do	test $d -ef $j && continue 2
105					done
106					k="$k $d"
107				done
108				set '' $k
109				case $# in
110				1)	break ;;
111				esac
112				shift
113				v="$v $1"
114				shift
115			done
116			;;
117		esac
118	fi
119	case $v in
120	$o)	;;
121	*)	eval $i='$'v ;;
122	esac
123done
124
125id="::IDENT::`date`::IDENT::"
126echo '#assert test(ok)
127#if #test(ok)
128#else
129(
130#endif' > assert.$src
131echo '#ifdef __BASE_FILE__
132int ok;
133#else
134(
135#endif' > basefile.$src
136cat > catlit1.i <<'!'
137char test[] = "te"
138"st";
139!
140cat > catlit2.i <<'!'
141char test[] = "te\
142st";
143!
144echo '#define g(a,b) a ## b
145volatile int a;
146const int g(x,y)=1;
147extern int c(int);' > compat.$src
148echo > cpp.$src
149echo "#defincl <x.h>" > defincl.$src
150echo 'int a$b;' > dollar.$src
151echo "#eject" > eject.$src
152echo "#if 0
153(
154#else if 1
155int x;
156#else
157(
158#endif" > elseif.$src
159echo "#define _CAT(a,b,c) a##b##c
160#define hdra	hdrx
161#define hdr	_CAT(<,hdra,.h>)
162#include hdr" > hdra.$src
163echo "#define _XAT(a,b,c) a##b##c
164#define _CAT(a,b,c) _XAT(a,b,c)
165#define hdra	hdrx
166#define hdr	_CAT(<,hdra,.h>)
167#include hdr" > hdrx.$src
168echo "int f(){return 0;}" > hdrx.h
169echo "#ident \"$id\"" > ident.$src
170echo "#import \"import.h\"" > import.$src
171echo "int aaa;" > import.h
172echo "#include <inc_next.h>" > inc_next.$src
173mkdir inc0 inc1
174echo "#include_next <inc_next.h>" > inc0/inc_next.h
175echo 'char s[] = "INCLUDE_NEXT";' > inc1/inc_next.h
176echo '# 1 "linefile.i"
177
178# 1 "linefile.i"
179
180int i;' > linefile1.i
181echo '# 1 "linefile.i"
182
183# 1
184
185int i;' > linefile2.i
186echo "int i = 0;" > lineid1.i
187echo '# 1 "t.c"
188int i = 0;' > lineid2.i
189echo '# 1 "t.c"
190int i = 0;' > lineid3.$src
191echo "#include <stdio.h>" > linetype.$src
192echo '#include <sys/types.h>
193main()
194{
195	return sizeof(LONGLONG) != 8;
196}' > longlong.$src
197echo '#include "once.h"
198#include "once.h"' > once.$src
199echo '#ifdef once
200allmultiple
201#else
202#define once
203#endif' > once.h
204echo "extern int a,b;int f(){return a + = b;}" > opspace.$src
205echo "int f(){return(0);} // ((" > pluscom.$src
206echo "class x {int n;} m;" > plusplus.$src
207echo > preinc.$src
208echo '// splice \
209(
210int x = 1;' > plusspl.$src
211echo "int stdc_default_value = __STDC__ ;" > stdc.$src
212echo 'char xxx[] = "abc
213(";' > span.$src
214echo '#define g(a,b) a\
215b
216int ab,xy;
217#define xy XY
218char* g(x,y);' > splice.$src
219{
220echo 'int a\                        '
221echo 'b = 1;'
222} > splicesp.$src
223echo '#define g(a,b) a/**/b
224int g(x,y)=1;' > trans.$src
225echo '#define m 65
226#define xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 65
227#define xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 64
228#define xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 63
229#define xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 62
230#define xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 61
231#define xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 60
232#define xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 59
233#define xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 58
234#define xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 57
235#define xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 56
236#define xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 55
237#define xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 54
238#define xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 53
239#define xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 52
240#define xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 51
241#define xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 50
242#define xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 49
243#define xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 48
244#define xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 47
245#define xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 46
246#define xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 45
247#define xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 44
248#define xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 43
249#define xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 42
250#define xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 41
251#define xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 40
252#define xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 39
253#define xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 38
254#define xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 37
255#define xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 36
256#define xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 35
257#define xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 34
258#define xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 33
259#define xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 32
260#define xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 31
261#define xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 30
262#define xxxxxxxxxxxxxxxxxxxxxxxxxxxxx 29
263#define xxxxxxxxxxxxxxxxxxxxxxxxxxxx 28
264#define xxxxxxxxxxxxxxxxxxxxxxxxxxx 27
265#define xxxxxxxxxxxxxxxxxxxxxxxxxx 26
266#define xxxxxxxxxxxxxxxxxxxxxxxxx 25
267#define xxxxxxxxxxxxxxxxxxxxxxxx 24
268#define xxxxxxxxxxxxxxxxxxxxxxx 23
269#define xxxxxxxxxxxxxxxxxxxxxx 22
270#define xxxxxxxxxxxxxxxxxxxxx 21
271#define xxxxxxxxxxxxxxxxxxxx 20
272#define xxxxxxxxxxxxxxxxxxx 19
273#define xxxxxxxxxxxxxxxxxx 18
274#define xxxxxxxxxxxxxxxxx 17
275#define xxxxxxxxxxxxxxxx 16
276#define xxxxxxxxxxxxxxx 15
277#define xxxxxxxxxxxxxx 14
278#define xxxxxxxxxxxxx 13
279#define xxxxxxxxxxxx 12
280#define xxxxxxxxxxx 11
281#define xxxxxxxxxx 10
282#define xxxxxxxxx 9
283#define xxxxxxxx 8
284#define xxxxxxx 7
285#define xxxxxx 6
286#define xxxxx 5
287#define xxxx 4
288#define xxx 3
289#define xx 2
290#define x 1
291#if xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx != m
292xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
293#endif' > truncate.$src
294cat > zeof.c <<'!'
295char* foo = "az";
296!
297
298allmultiple=
299assert=
300basefile=
301compatibility=1
302defincl=
303dollar=
304eject=
305elseif=
306headerexpand=
307headerexpandall=
308hostedtransition=
309ident=
310import=
311include_next=
312linefile=
313lineid=
314linetype=
315nocatliteral=
316opspace=
317pluscom=
318plusplus=
319plussplice=
320redef=
321reguard=
322reserved=
323spaceout=
324splicecat=
325splicespace=
326strict=
327stringspan=
328transition=
329truncate=
330zeof=
331
332$cc -c assert.$src && assert=1
333
334$cc -c basefile.$src && basefile=__BASE_FILE__
335
336if	$cc -E defincl.$src
337then	case "`$cc -E defincl.$src | grep -c 'defincl'`" in
338	0)	defincl=1 ;;
339	esac
340fi
341
342if	$cc -c catlit1.i 2>e
343then	if	$cc -c catlit2.i 2>f
344	then	if	test `wc -c < f` -gt `wc -c < e`
345		then	nocatliteral=1
346		fi
347	else	nocatliteral=1
348	fi
349fi
350
351$cc -c dollar.$src && dollar=1
352
353$cc -c elseif.$src && elseif=1
354
355if	$cc -I. -c hdra.$src
356then	headerexpandall=1
357elif	$cc -I. -c hdrx.$src
358then	headerexpand=1
359fi
360
361if	$cc -E eject.$src
362then	case "`$cc -E eject.$src | grep -c 'eject'`" in
363	0)	eject=1 ;;
364	esac
365fi
366
367$cc -S ident.$src && grep "$id" ident.s && ident=1
368
369{ $cc -E import.$src | grep aaa ;} && import=1
370
371{ $cc -E -Iinc0 -Iinc1 inc_next.$src | grep INCLUDE_NEXT ;} && include_next=1
372
373if	$cc -c linefile1.i
374then	$cc -c linefile2.i
375	case $? in
376	0)	;;
377	*)	linefile=1 ;;
378	esac
379fi
380
381if	$cc -c lineid1.i 2>b
382then	$cc -c lineid2.i 2>e
383	c=$?
384else	$cc -c lineid3.c 2>e
385	c=$?
386fi
387case $c in
3880)	case `wc -l < b` in
389	`wc -l < e`)	;;
390	*)		lineid=line ;;
391	esac
392	;;
393*)	lineid=line
394	;;
395esac
396
397if	$cc -E linetype.$src | grep '^[ 	]*#[ 	]*[0123456789]*[ 	]*".*"[ 	]*[12]' > linetype
398then	if	grep '^[ 	]*#[ 	]*[0123456789]*[ 	]*".*"[ 	]*[12][ 	][ 	]*3' linetype
399	then	linetype=2
400	else	linetype=1
401	fi
402fi
403
404{ $cc -E once.$src | grep allmultiple ;} && allmultiple=1
405
406$cc -c plusplus.$src && plusplus=1
407
408$cc -c span.$src && stringspan=1
409
410$cc -c splice.$src && splicecat=1
411
412$cc -c splicesp.$src && splicespace=1
413
414exec < $ppkey
415while	read keyword type alternate comment
416do	case $keyword in
417	.)	break ;;
418	""|"#")	continue ;;
419	esac
420	case $type in
421	""|".")	type= ;;
422	*)	type="=$type" ;;
423	esac
424	for pre in '' _ __
425	do	for suf in '' _ __
426		do	case $suf in
427			'')	sep= ;;
428			*)	sep=. ;;
429			esac
430			case ,,$alternate, in
431			*,$pre$sep$suf,*)
432				key=$pre$keyword$suf
433				undef="$undef $key"
434				echo "int f(){
435	int	$key = 0;
436	return $key;
437}
438#undef	$key
439int g(){
440	int	$key = 0;
441	return $key;
442}" > key.$src
443				$cc -c key.$src >/dev/null 2>&1 || reserved="$reserved $key$type"
444				;;
445			esac
446		done
447	done
448done
449
450$cc -c opspace.$src && opspace=1
451
452case $plusplus in
453"")	$cc -c compat.$src && compatibility=
454	$cc -c pluscom.$src && pluscom=1
455	;;
456esac
457case $plusplus$pluscom in
458?*)	$cc -c plusspl.$src || plussplice=1 ;;
459esac
460case $plusplus in
461?*)	mkdir reguard
462	cd reguard
463	echo '#include "ptrone.h"
464#include "ptrdef.h"
465int main () { return gt(2,1) + gt(2.0,1.0); }' > ptr.$src
466	echo '#include "ptrone.h"
467template<class T> int gt(T a, T b) { return a > b; }' > ptrdef.$src
468	echo 'template<class T> int gt(T a, T b);' > ptrdef.h
469	echo '/* empty */' > ptrone.h
470	if	$cc -E ptr.$src > x.i && $cc x.i
471	then	echo '#ifndef _PTRONE_H
472#define _PTRONE_H
473static int xxx;
474#endif' > ptrone.h
475		if	$cc -E ptr.$src > x.i && echo "#define _PTRONE_H" >> x.i && $cc x.i
476		then	reguard=1
477		fi
478	fi
479	cd ..
480	rm -rf reguard
481	;;
482esac
483
484stdc=`$cc -E stdc.$src | sed -e '/stdc_default_value/!d' -e 's/.*=[ 	]*//' -e 's/[ 	]*;.*//'`
485case $stdc in
4860)		$cc -c trans.$src && transition=1 ;;
487[0123456789]*)	;;
488*)		stdc= ;;
489esac
490
491truncate=`$cc -E truncate.$src | grep '^[ 	]*[0123456789]'`
492$cc -c zeof.c || zeof=1
493
494echo "$predef" >> all.pp
495{
496	case $ppopt$ppenv in
497	?*)	ppcmd=cpp
498		ppdir=.
499		eval $ppenv '$'cc -Dmycpp -E '$'ppopt cpp.$src
500		;;
501	esac
502	eval set x $probe_verbose
503	shift
504	x=
505	for o in "$@"
506	do	set x `$cc $o -c cpp.$src 2>&1`
507		while	:
508		do	shift
509			case $# in
510			0)	break ;;
511			esac
512			case $1 in
513			*[\\/]rm)
514				;;
515			[\\/]*)	case " $x " in
516				*" $1 "*)	;;
517				*)		test -x $1 && x="$x $1" ;;
518				esac
519				;;
520			esac
521		done
522		case $x in
523		?*)	for f in $x
524			do	cp $f x && chmod u+w x && strip x && f=x
525				$ppsym < $f
526			done
527			break
528			;;
529		esac
530	done
531} 3>&- 3>&1 >/dev/null |
532	sed -e '/^ppsymbol$/d' -e '/^.$/d' -e '/^..$/d' -e '/[ABCDEFGHIJKLMNOPQRSTUVWXYZ].*[abcdefghijklmnopqrstuvwxyz]/d' -e '/[abcdefghijklmnopqrstuvwxyz].*[ABCDEFGHIJKLMNOPQRSTUVWXYZ]/d' |
533	cat - all.pp |
534	sort -u |
535	{
536	for i in 0 1 2 3 4 5
537	do	echo "struct { char* name; long value; } predef[] = {" > cpp$i.$src
538	done
539	while read sym junk
540	do	case $sym in
541		_*)	set 0 ${sym}
542			;;
543		*_)	continue
544			;;
545		[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ]*)
546			set 1 ${sym} 2 _${sym} 3 _${sym}_ 4 __${sym} 5 __${sym}__
547			;;
548		*)	continue
549			;;
550		esac
551		while	:
552		do	case $# in
553			0|1)	break ;;
554			esac
555			{
556			echo "#ifdef $2"
557			echo "\"$2\" , (long) $2 -1,"
558			echo "#endif"
559			} >> cpp$1.$src
560			shift
561			shift
562		done
563	done
564	for i in 0 1 2 3 4 5
565	do	echo "\"\", 0 };" >> cpp$i.$src
566	done
567	}
568preval="`for i in 0 1 2 3 4 5;do $cc -E cpp$i.$src;done | sed -e '/\".*\".*,.*,/!d' -e 's/[^\"]*\"\\([^\"]*\\)\"[ 	]*,[ 	]*([ 	]*long[ 	]*)[ 	]*\\(.*\\)[ 	]*-[ 	]*1[ 	]*,[ 	]*\$/\\1 \\2 =/g'` `$cc -dM -E stdc.$src | sed -e '/[ 	]*#[ 	]*define/!d' -e '/\"/d' -e 's/[ 	]*#[ 	]*define[ 	]*\\([abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]*\\)[ 	]*\\(.*\\)/\\1 \\2 =/'`"
569
570for i in bufld namei quota reboot utsname vfs
571do	echo "#include <sys/$i.h>" > t.$src
572	if	$cc -E t.$src
573	then	x=1
574	else	x=0
575	fi
576	eval sys_$i=$x
577done
578
579echo "char* fun() { return (char*)__FUNCTION__; }
580int main() { return !fun(); }" > fun.$src
581rm -f fun.exe
582if	$cc -o fun.exe fun.$src && test -x fun.exe
583then	undef_predef="$undef_predef __FUNCTION__"
584fi
585
586case "`grep -c '__STDC__[-0 	]*[=!]=[ 	]*0' $usrinclude/stdio.h 2>/dev/null`" in
5870)	;;
588*)	hostedtransition=1 ;;
589esac
590
591mapinclude=
592for i in builtins
593do	echo "#include <$i.h>" > t.$src
594	if	$cc -E t.$src
595	then	mapinclude="$mapinclude <$i.h>=\".\""
596	fi
597done
598
599#
600# the payoff
601#
602
603exec >&3
604
605case "$compatibility:$transition:$dollar" in
606::)	strict=1 ;;
607esac
608case $version_stamp in
609?*)	echo "/* $version_stamp" ;;
610*)	echo "/* $cc" ;;
611esac
612echo "*/"
613case $plusplus:$stdc in
6141:?*)	preval="$preval = __STDC__ $stdc ="
615	redef="$redef __STDC__"
616	;;
617esac
618ppbuiltin=0
619set x $preval
620shift
621case $# in
6220)	;;
623*)	echo
624	echo "#pragma pp:predefined"
625	predef=
626	while	:
627	do	case $# in
628		0)	break ;;
629		esac
630		m=$1
631		shift
632		case $m in
633		*'('*)	i=`echo "$m" | sed 's,(.*,,'` ;;
634		*)	i=$m ;;
635		esac
636		predef="$predef
637$i"
638		eval predef_$i=0
639		while	:
640		do	case $1 in
641			'=')	break ;;
642			*)	shift ;;
643			esac
644		done
645		while	:
646		do	case $1 in
647			'=')	shift ;;
648			*)	break ;;
649			esac
650		done
651	done
652	for i in $undef
653	do	case " $redef " in
654		*" $i "*)	;;
655		*)		eval predef_$i=3 ;;
656		esac
657	done
658	set $preval
659	while	:
660	do	case $# in
661		0)	break ;;
662		esac
663		m=$1
664		shift
665		case $m in
666		*'('*)	i=`echo "$m" | sed 's,(.*,,'` ;;
667		*)	i=$m ;;
668		esac
669		case $i in
670		'=')	continue ;;
671		esac
672		v=
673		while	:
674		do	case $1 in
675			'=')	break ;;
676			esac
677			v="$v $1"
678			shift
679		done
680		while	:
681		do	case $1 in
682			'=')	shift ;;
683			*)	break ;;
684			esac
685		done
686		case $i in
687		__LCC__)strict=2 ;;
688		_*)	;;
689		*)	eval j=\$predef_$i
690			case $j in
691			0)	eval predef_$i=1
692				echo "#define $m$v"
693				case $strict in
694				1)	strict= ;;
695				esac
696				;;
697			esac
698			;;
699		esac
700	done
701	nopredef=0
702	while	:
703	do	set $preval
704		while	:
705		do	case $# in
706			0)	break ;;
707			esac
708			m=$1
709			shift
710			case $m in
711			*'('*)	i=`echo "$m" | sed 's,(.*,,'` ;;
712			*)	i=$m ;;
713			esac
714			v=
715			while	:
716			do	case $1 in
717				'=')	break ;;
718				esac
719				v="$v $1"
720				shift
721			done
722			while	:
723			do	case $1 in
724				'=')	shift ;;
725				*)	break ;;
726				esac
727			done
728			case $nopredef in
729			2)	;;
730			*)	case $v in
731				' '*' '*)
732					nopredef=1
733					continue
734					;;
735				' '[0123456789]*|' '"'"*"'"*)
736					;;
737				*)	case $1 in
738					_*)	;;
739					*)	nopredef=1
740						continue
741						;;
742					esac
743					;;
744				esac
745				;;
746			esac
747			eval j=\$predef_$i
748			case $j in
749			0)	case $ppbuiltin in
750				2)	echo "#pragma pp:builtin"
751					ppbuiltin=1
752					;;
753				esac
754				eval predef_$i=2
755				echo "#define $m$v"
756				;;
757			1)	case $m in
758				$i)	eval predef_$i=2
759					eval j=\$predef___${i}__
760					case $j in
761					[12])	;;
762					*)	case $ppbuiltin in
763						2)	echo "#pragma pp:builtin"
764							ppbuiltin=1
765							;;
766						esac
767						eval predef___${i}__=2
768						echo "#define __${i}__$v"
769						;;
770					esac
771					;;
772				esac
773				;;
774			esac
775		done
776		case $nopredef in
777		2)	break ;;
778		esac
779		echo "#pragma pp:nopredefined"
780		case $nopredef in
781		0)	break ;;
782		esac
783		ppbuiltin=2
784		nopredef=2
785	done
786	;;
787esac
788case $basefile in
789?*)	case $ppbuiltin in
790	0|2)	ppbuiltin=1
791		echo "#pragma pp:builtin"
792		;;
793	esac
794	echo "#define $basefile	#(BASE)"
795	;;
796esac
797case $ppbuiltin in
7981)	echo "#pragma pp:nobuiltin" ;;
799esac
800
801eval set x $probe_longlong
802shift
803x=
804for o in "$@"
805do	rm -f longlong.$exe
806	if	$cc -DLONGLONG="$o" -o longlong.$exe longlong.$src &&
807		./longlong.$exe
808	then	x=1
809		break
810	fi
811done
812case $x in
813'')	eval set x $probe_longlong_t
814	shift
815	for o in "$@"
816	do	rm -f longlong.$exe
817		if	$cc -DLONGLONG="$o" -o longlong.$exe longlong.$src &&
818			./longlong.$exe
819		then	echo "#define <long long> $o"
820			break
821		fi
822	done
823	;;
824esac
825
826echo
827for i in `echo "$predef" | sed -e 's/^__*\(.*\)_*\$/\1/' -e '/^[abcdefghijklmnopqrstuvwxyz][abcdefghijklmnopqrstuvwxyz]*[0123456789][abcdefghijklmnopqrstuvwxyz0123456789]*\$/!d'` `echo "$predef" | sed -e 's/^__*\(.*\)_*\$/\1/' -e '/^[abcdefghijklmnopqrstuvwxyz][abcdefghijklmnopqrstuvwxyz]*\$/!d'`
828do	case $i in
829	*ix)	;;
830	*)	architecture=$i
831		break
832		;;
833	esac
834done
835for i in `sed -e '/^#/d' -e '/:architecture:/!d' -e 's/[ 	].*//' < $ppdef`
836do	eval j="\" \$predef_$i \$predef__${i} \$predef__${i}_ \$predef___${i} \$predef___${i}__ \""
837	case $j in
838	*" 2 "*)architecture=$i
839		break
840		;;
841	esac
842done
843for i in `sed -e '/^#/d' -e '/:machine:/!d' -e 's/[ 	].*//' < $ppdef`
844do	eval j="\" \$predef_$i \$predef__${i} \$predef__${i}_ \$predef___${i} \$predef___${i}__ \""
845	case $j in
846	*" 2 "*)machine="$machine $i" ;;
847	esac
848done
849case $sys_bufld$sys_reboot$sys_utsname in
8501??)	release=research
851	version=9
852	;;
85301?)	release=bsd
854	case $sys_quota in
855	0)	case $sys_vfs in
856		0)	version=4.1
857			;;
858		esac
859		;;
860	1)	case $sys_namei in
861		0)	version=4.2
862			;;
863		1)	version=4.3
864			;;
865		esac
866		;;
867	esac
868	;;
869001)	release=V
870	;;
871esac
872for i in `sed -e '/^#/d' -e '/:release:/!d' -e 's/[ 	].*//' < $ppdef`
873do	eval j=\$predef_$i
874	case $j in
875	2)	release="$release $i" ;;
876	esac
877done
878for i in `sed -e '/^#/d' -e '/:system:/!d' -e 's/[ 	].*//' < $ppdef`
879do	eval j=\$predef_$i
880	case $j in
881	2)	system="$system $i" ;;
882	esac
883done
884case $release in
885topix)	release="$release V"
886	;;
887esac
888case $assert in
889?*)	for i in $predef
890	do	case $i in
891		_*|*_)	;;
892		*)	for p in architecture cpu machine system
893			do	echo "#if #$p($i)
894eval \"case \\\" \$$p \\\" in *\\\" $i \\\"*) ;; *) $p=\\\"$i \$$p\\\" ;; esac\"
895: avoid string literal concatenation
896#endif"
897			done
898			;;
899		esac
900	done > t.$src
901	eval "`$cc -E t.$src`"
902	set x x $prepred
903	while	:
904	do	shift
905		shift
906		case $# in
907		[01])	break ;;
908		esac
909		eval "
910			case \" \$$1 \" in
911			*\" $2 \"*) ;;
912			*) $1=\"$2 \$$1\" ;;
913			esac
914		"
915	done
916	;;
917esac
918case $system in
919"")	system=unix ;;
920esac
921case $architecture in
922ibm|uts|u370)	model=370
923		architecture=ibm
924		;;
925m*68*)		architecture=m68000
926		for i in $predef
927		do	case $i in
928			m*68*[123456789][0123456789])
929				model=`echo $i | sed 's/.*\(..\)/\1/'`
930				break
931				;;
932			esac
933		done
934		;;
935u3b?*)		model=`echo $architecture | sed 's/u3b//'`
936		architecture=3b
937		;;
938u3b)		case $model in
939		"")	model=20 ;;
940		esac
941		architecture=3b
942		;;
943vax[0123456789]*)
944		model=`echo $architecture | sed 's/vax//'`
945		architecture=vax
946		;;
947hp[0123456789]*s[0123456789])
948		case $release in
949		[abcdefghijklmnopqrstuvwxyz]*.[abcdefghijklmnopqrstuvwxyz]*.*)
950			version=$release
951			release=V
952			;;
953		esac
954		architecture="$architecture `echo $architecture | sed 's/s.*//'`"
955		;;
956esac
957case $hosttype in
958*.*)	i=`echo $hosttype | sed -e 's,.*\.,,'` ;;
959*)	i=$hosttype ;;
960esac
961case $i in
962unknown);;
963?*)	case " $architecture " in
964	*" $i "*) ;;
965	*)	architecture="$architecture $i" ;;
966	esac
967	;;
968esac
969case $architecture in
970"")	echo "$cc: warning: architecture not determined" >&4
971	set x $machine
972	architecture=$2
973	;;
974esac
975echo "#define #hosttype($hosttype)"
976for i in $system
977do	echo "#define #system($i)"
978done
979case $release in
980"")	echo "#define #release()" ;;
981*)	for i in $release
982	do	echo "#define #release($i)"
983		case $i in
984		V)	echo "#define #release(system5)" ;; # compatibility
985		esac
986	done
987	;;
988esac
989echo "#define #version($version)"
990case $architecture in
991"")	echo "#define #architecture()" ;;
992*)	for i in `echo $architecture | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
993	do	echo "#define #architecture($i)"
994	done
995	;;
996esac
997echo "#define #model($model)"
998case $machine in
999"")	case $architecture:$model in
1000	?*:?*)	set x $architecture; machine="$2/$model $architecture" ;;
1001	*)	machine=$architecture ;;
1002	esac
1003	;;
1004*)	machine="$machine $architecture"
1005	;;
1006esac
1007case $machine in
1008"")	echo "#define #machine()" ;;
1009*)	j=
1010	for i in `echo $machine | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
1011	do	case " $i " in
1012		*" $j "*)
1013			;;
1014		*)	j="$j $i"
1015			echo "#define #machine($i)"
1016			;;
1017		esac
1018	done
1019	;;
1020esac
1021for i in $cpu
1022do	echo "#define #cpu($i)"
1023done
1024echo "#define #addressing()"
1025for i in $ATTRIBUTES
1026do	eval d=\$$i
1027	n=`echo $i | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
1028	echo "#define #$n($d)"
1029done
1030case $stdc in
1031?*)	echo "#define #dialect(ansi)" ;;
1032esac
1033case $plusplus in
1034?*)	echo "#define #dialect(C++)" ;;
1035esac
1036case $hosted in
1037"")	echo "#define #dialect(cross)" ;;
1038esac
1039case $so:$dynamic:$static in
1040::)	;;
1041*)	echo "#define #dialect(dynamic)" ;;
1042esac
1043echo
1044case $undef_predef in
1045?*)	for m in $undef_predef
1046	do	echo "#undef	$m"
1047	done
1048	echo
1049	;;
1050esac
1051case $plusplus in
1052?*)	echo "#pragma pp:plusplus" ;;
1053esac
1054case $reserved in
1055?*)	echo "#pragma pp:reserved" $reserved ;;
1056esac
1057case $nocatliteral in
1058?*)	echo "#pragma pp:nocatliteral" ;;
1059esac
1060case $opspace in
1061?*)	echo "#pragma pp:opspace" ;;
1062esac
1063case $pluscom in
1064?*)	echo "#pragma pp:pluscomment" ;;
1065esac
1066case $plussplice in
1067?*)	echo "#pragma pp:plussplice" ;;
1068esac
1069case $reguard in
1070?*)	echo "#pragma pp:reguard" ;;
1071esac
1072case $splicecat in
1073?*)	echo "#pragma pp:splicecat" ;;
1074esac
1075case $splicespace in
1076?*)	echo "#pragma pp:splicespace" ;;
1077esac
1078case $stringspan in
1079?*)	echo "#pragma pp:stringspan" ;;
1080esac
1081case $stdc in
1082"")	echo "#pragma pp:compatibility"
1083	;;
10840)	echo "#pragma pp:transition"
1085	;;
10861)	case $strict in
1087	?*)	echo "#pragma pp:strict" ;;
1088	esac
1089	;;
1090esac
1091case $hostedtransition in
10921)	echo "#pragma pp:hostedtransition" ;;
1093esac
1094case $stdc in
1095?*)	case $ppopt$ppenv in
1096	"")	spaceout=1
1097		echo "#pragma pp:spaceout"
1098		;;
1099	esac
1100	;;
1101esac
1102case $truncate in
1103?*)	echo "#pragma pp:truncate $truncate" ;;
1104esac
1105case $zeof in
1106?*)	echo "#pragma pp:zeof" ;;
1107esac
1108case $dollar in
11091)	echo '#pragma pp:id "$"' ;;
1110esac
1111cdir=-I+C
1112hdir=-I+H
1113set x $stdinclude
1114while	:
1115do	shift
1116	case $# in
1117	0)	break ;;
1118	esac
1119	case $1 in
1120	$cdir|$hdir)
1121		;;
1122	-I+C)	cdir=$1
1123		echo "#pragma pp:nocdir"
1124		;;
1125	-I-C)	cdir=$1
1126		echo "#pragma pp:cdir"
1127		;;
1128	-I+H)	hdir=$1
1129		echo "#pragma pp:nohostdir"
1130		;;
1131	-I-H)	hdir=$1
1132		echo "#pragma pp:hostdir"
1133		;;
1134	-I*)	;;
1135	*)	echo "#pragma pp:include \"$1\""
1136		;;
1137	esac
1138done
1139case $usrinclude in
1140/usr/include)
1141	;;
1142?*)	echo "#pragma pp:standard \"$usrinclude\""
1143	;;
1144esac
1145case $plusplus in
1146?*)	case $usrinclude in
1147	?*)	if	grep plusplus $usrinclude/ctype.h >/dev/null 2>&1
1148		then	echo '#pragma pp:nocdir "-"'
1149		fi
1150		;;
1151	esac
1152	;;
1153esac
1154case $mapinclude in
1155?*)	echo "#pragma pp:mapinclude hosted$mapinclude" ;;
1156esac
1157case $linefile in
1158?*)	echo "#pragma pp:linefile" ;;
1159esac
1160case $lineid in
1161?*)	echo "#pragma pp:lineid line" ;;
1162esac
1163case $linetype in
11641)	echo "#pragma pp:linetype" ;;
1165?*)	echo "#pragma pp:linetype $linetype" ;;
1166esac
1167case $allmultiple in
1168"")	echo "#pragma pp:noallmultiple" ;;
1169esac
1170case $defincl in
11711)	echo '#pragma pp:map "/#(pragma )?defincl>/"' ;;
1172esac
1173case $eject in
11741)	echo '#pragma pp:map "/#(pragma )?eject>/"' ;;
1175esac
1176case $elseif in
11771)	echo "#pragma pp:elseif" ;;
1178esac
1179case $headerexpand in
11801)	echo "#pragma pp:headerexpand" ;;
1181esac
1182case $headerexpandall in
11831)	echo "#pragma pp:headerexpandall" ;;
1184esac
1185case $ident in
11861)	echo '#pragma pp:map "/#(pragma )?ident>/" "/#(pragma )?/###/"' ;;
1187*)	echo '#pragma pp:map "/#(pragma )?ident>/"' ;;
1188esac
1189case $import in
11901)	echo '#pragma pp:map "/#(pragma )?import>/" "/#(pragma )?import(.*)/__STDPP__IMPORT__(\2)/"
1191#macdef __STDPP__IMPORT__(x)
1192#pragma pp:noallmultiple
1193#include x
1194#pragma pp:allmultiple
1195#endmac' ;;
1196esac
1197case $include_next in
11981)	echo '#pragma pp:map "/#include_next>/" ",[^\<]*\<,#include <.../,"' ;;
1199esac
1200echo '#pragma pp:map "/#pragma lint:/" ",#pragma lint:(.*),##/*\1*/,u"'
1201echo '#pragma pp:map "/#(pragma )?sccs>/"'
1202
1203case $stdc:$spaceout in
12041:)	case ' '$reserved' ' in
1205	*' 'asm' '*|*' 'asm=*)
1206		echo "#macdef asm"
1207		echo "#pragma pp:spaceout"
1208		echo "#undef asm"
1209		echo "asm"
1210		echo "#endmac"
1211		;;
1212	esac
1213	;;
1214esac
1215
1216if	$cc -E preinc.$src > preinc.out
1217then	for f in `sed -e 's,\\\\,/,g' -e 's,"[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz]:/,"/,g' -e '/^#[line 	]*[0123456789][0123456789]*[ 	][ 	]*"[\\/]/!d' -e 's/^#[line 	]*[0123456789][0123456789]*[ 	][ 	]*".*[\\/]\(.*\)".*/\1/' preinc.out | sort -u`
1218	do	case $f in
1219		*preinc.$src*)
1220			;;
1221		*)	echo "#include <$f>"
1222			;;
1223		esac
1224	done
1225fi
1226