xref: /freebsd/lib/libc/regex/grot/mkh (revision d0b2dbfa0ecf2bbc9709efc5e20baf8e4b44bbbf)
18ca5c256SDaniel C. Sobral#! /bin/sh
28ca5c256SDaniel C. Sobral# mkh - pull headers out of C source
38ca5c256SDaniel C. SobralPATH=/bin:/usr/bin ; export PATH
48ca5c256SDaniel C. Sobral
58ca5c256SDaniel C. Sobral# egrep pattern to pick out marked lines
68ca5c256SDaniel C. Sobralegrep='^ =([ 	]|$)'
78ca5c256SDaniel C. Sobral
88ca5c256SDaniel C. Sobral# Sed program to process marked lines into lines for the header file.
98ca5c256SDaniel C. Sobral# The markers have already been removed.  Two things are done here:  removal
108ca5c256SDaniel C. Sobral# of backslashed newlines, and some fudging of comments.  The first is done
118ca5c256SDaniel C. Sobral# because -o needs to have prototypes on one line to strip them down.
128ca5c256SDaniel C. Sobral# Getting comments into the output is tricky; we turn C++-style // comments
138ca5c256SDaniel C. Sobral# into /* */ comments, after altering any existing */'s to avoid trouble.
148ca5c256SDaniel C. Sobralpeel='	/\\$/N
158ca5c256SDaniel C. Sobral	/\\\n[ 	]*/s///g
168ca5c256SDaniel C. Sobral	/\/\//s;\*/;* /;g
178ca5c256SDaniel C. Sobral	/\/\//s;//\(.*\);/*\1 */;'
188ca5c256SDaniel C. Sobral
198ca5c256SDaniel C. Sobralfor a
208ca5c256SDaniel C. Sobraldo
218ca5c256SDaniel C. Sobral	case "$a" in
228ca5c256SDaniel C. Sobral	-o)	# old (pre-function-prototype) compiler
238ca5c256SDaniel C. Sobral		# add code to comment out argument lists
248ca5c256SDaniel C. Sobral		peel="$peel
258ca5c256SDaniel C. Sobral			"'/^\([^#\/][^\/]*[a-zA-Z0-9_)]\)(\(.*\))/s;;\1(/*\2*/);'
268ca5c256SDaniel C. Sobral		shift
278ca5c256SDaniel C. Sobral		;;
288ca5c256SDaniel C. Sobral	-b)	# funny Berkeley __P macro
298ca5c256SDaniel C. Sobral		peel="$peel
304b74b098SDavid E. O'Brien			"'/^\([^#\/][^\/]*[a-zA-Z0-9_)]\)(\(.*\))/s;;\1 __P((\2));'
318ca5c256SDaniel C. Sobral		shift
328ca5c256SDaniel C. Sobral		;;
338ca5c256SDaniel C. Sobral	-s)	# compiler doesn't like `static foo();'
348ca5c256SDaniel C. Sobral		# add code to get rid of the `static'
358ca5c256SDaniel C. Sobral		peel="$peel
368ca5c256SDaniel C. Sobral			"'/^static[ 	][^\/]*[a-zA-Z0-9_)](.*)/s;static.;;'
378ca5c256SDaniel C. Sobral		shift
388ca5c256SDaniel C. Sobral		;;
398ca5c256SDaniel C. Sobral	-p)	# private declarations
408ca5c256SDaniel C. Sobral		egrep='^ ==([ 	]|$)'
418ca5c256SDaniel C. Sobral		shift
428ca5c256SDaniel C. Sobral		;;
438ca5c256SDaniel C. Sobral	-i)	# wrap in #ifndef, argument is name
448ca5c256SDaniel C. Sobral		ifndef="$2"
458ca5c256SDaniel C. Sobral		shift ; shift
468ca5c256SDaniel C. Sobral		;;
478ca5c256SDaniel C. Sobral	*)	break
488ca5c256SDaniel C. Sobral		;;
498ca5c256SDaniel C. Sobral	esac
508ca5c256SDaniel C. Sobraldone
518ca5c256SDaniel C. Sobral
528ca5c256SDaniel C. Sobralif test " $ifndef" != " "
538ca5c256SDaniel C. Sobralthen
548ca5c256SDaniel C. Sobral	echo "#ifndef $ifndef"
558ca5c256SDaniel C. Sobral	echo "#define	$ifndef	/* never again */"
568ca5c256SDaniel C. Sobralfi
578ca5c256SDaniel C. Sobralecho "/* ========= begin header generated by $0 ========= */"
588ca5c256SDaniel C. Sobralecho '#ifdef __cplusplus'
598ca5c256SDaniel C. Sobralecho 'extern "C" {'
608ca5c256SDaniel C. Sobralecho '#endif'
618ca5c256SDaniel C. Sobralfor f
628ca5c256SDaniel C. Sobraldo
638ca5c256SDaniel C. Sobral	echo
648ca5c256SDaniel C. Sobral	echo "/* === $f === */"
658ca5c256SDaniel C. Sobral	egrep "$egrep" $f | sed 's/^ ==*[ 	]//;s/^ ==*$//' | sed "$peel"
668ca5c256SDaniel C. Sobral	echo
678ca5c256SDaniel C. Sobraldone
688ca5c256SDaniel C. Sobralecho '#ifdef __cplusplus'
698ca5c256SDaniel C. Sobralecho '}'
708ca5c256SDaniel C. Sobralecho '#endif'
718ca5c256SDaniel C. Sobralecho "/* ========= end header generated by $0 ========= */"
728ca5c256SDaniel C. Sobralif test " $ifndef" != " "
738ca5c256SDaniel C. Sobralthen
748ca5c256SDaniel C. Sobral	echo "#endif"
758ca5c256SDaniel C. Sobralfi
768ca5c256SDaniel C. Sobralexit 0
77