1#! /bin/sh
2# $Id: headers.sh,v 1.10 2012/03/20 08:45:21 tom Exp $
3# vi:ts=4 sw=4
4#
5# Adjust includes for header files that reside in a subdirectory of
6# /usr/include, etc.
7#
8# Options:
9#	-c CFG	specify an alternate name for config.h
10#	-d DIR	target directory
11#	-e FILE	extra editing commands, e.g., for manpage references
12#	-h FILE install the given file in subdirectory DIR rather than parent
13#	-i    	create/update the headers.sed script
14#	-p PKG	specify the package name
15#	-s DIR	source directory
16#	-t TYPE renaming for manpage-sections
17#	-x PRG	install-program (plus options, the whole value in quotes)
18#
19# Other parameters are assumed to be provided only for the install scenario.
20
21SCRIPT=headers.sed
22MYFILE=headers.tmp
23
24OPT_C=config.h
25OPT_D=
26OPT_E=
27OPT_H=
28OPT_I=n
29OPT_P=
30OPT_S=
31OPT_T=
32OPT_X=install
33
34while test $# != 0
35do
36	case $1 in
37	-c)	# CFG	specify an alternate name for config.h
38		shift
39		OPT_C="$1"
40		;;
41	-d)	# DIR	target directory
42		shift
43		OPT_D="$1"
44		;;
45	-e)	# FILE	extra sed-commands
46		shift
47		OPT_E="$OPT_E -f $1"
48		;;
49	-h)	# FILE	special-case of header in subdirectory
50		shift
51		OPT_H="$1"
52		;;
53	-i)	# create the headers.sed script
54		if test "$OPT_I" = n
55		then
56			rm -f $SCRIPT
57		fi
58		OPT_I=y
59
60		if ( test -n "$OPT_D" )
61		then
62			if ( test -n "$OPT_S" && test -d "$OPT_S" )
63			then
64				LEAF=`basename $OPT_D`
65				case $OPT_D in
66				/*/include/$LEAF)
67					END=`basename $OPT_D`
68					for i in $OPT_S/*.h
69					do
70						NAME=`basename $i`
71						if test -z "$OPT_H" || test "$OPT_H" != "$NAME"
72						then
73							echo "s%<$NAME>%<$END/$NAME>%g" >> $SCRIPT
74						fi
75					done
76					;;
77				*)
78					echo "" >> $SCRIPT
79					;;
80				esac
81				OPT_S=
82				if test -f $SCRIPT ; then
83					sort -u $SCRIPT >$MYFILE
84					rm -f $SCRIPT
85					mv $MYFILE $SCRIPT
86				fi
87			fi
88		fi
89
90		if test -n "$OPT_P"
91		then
92			for name in `
93			egrep "#define[ 	][ 	]*[A-Z]" $OPT_C \
94				| sed	-e 's/^#define[ 	][ 	]*//' \
95					-e 's/[ 	].*//' \
96				| fgrep -v GCC_ \
97				| sort -u \
98				| egrep -v "^${OPT_P}_"`
99			do
100				echo "s%\\<$name\\>%${OPT_P}_$name%g" >>$SCRIPT
101			done
102			if test -f $SCRIPT ; then
103				sort -u $SCRIPT >$MYFILE
104				rm -f $SCRIPT
105				mv $MYFILE $SCRIPT
106			fi
107			OPT_P=
108		fi
109		;;
110	-p)	# PKG	specify the package name
111		shift
112		OPT_P="$1"
113		;;
114	-s)	# DIR	source directory
115		shift
116		OPT_S="$1"
117		;;
118	-t)	# rename suffix of target
119		shift
120		OPT_T="$1"
121		;;
122	-x)	# PRG	install-program (plus options, the whole value in quotes)
123		shift
124		OPT_X="$1"
125		;;
126	*)
127		FILE=$1
128
129		SHOW=`basename $FILE`
130		TMPSRC=${TMPDIR-/tmp}/${SHOW}$$
131
132		echo "	... $SHOW"
133		test -f $OPT_S/$FILE && FILE="$OPT_S/$FILE"
134
135		if test -f "$FILE"
136		then
137			rm -f $TMPSRC
138			sed -f $SCRIPT $OPT_E $FILE > $TMPSRC
139			NAME=`basename $FILE`
140			if test -n "$OPT_T" ; then
141				NAME=`echo "$NAME" | sed -e 's/\.[^.]*$//'`.$OPT_T
142			fi
143
144			# Just in case someone gzip'd manpages,
145			# remove the conflicting copy.
146			test -f $OPT_D/$NAME.gz && rm -f $OPT_D/$NAME.gz
147
148			eval $OPT_X $TMPSRC $OPT_D/$NAME
149			rm -f $TMPSRC
150		fi
151		;;
152	esac
153	shift
154done
155