1235609Sgber#! /bin/sh
2235609Sgber# mkh - pull headers out of C source
3235609Sgber# $FreeBSD: releng/11.0/lib/libc/regex/grot/mkh 92971 2002-03-22 19:45:43Z obrien $
4235609SgberPATH=/bin:/usr/bin ; export PATH
5235609Sgber
6235609Sgber# egrep pattern to pick out marked lines
7235609Sgberegrep='^ =([ 	]|$)'
8235609Sgber
9235609Sgber# Sed program to process marked lines into lines for the header file.
10235609Sgber# The markers have already been removed.  Two things are done here:  removal
11235609Sgber# of backslashed newlines, and some fudging of comments.  The first is done
12235609Sgber# because -o needs to have prototypes on one line to strip them down.
13235609Sgber# Getting comments into the output is tricky; we turn C++-style // comments
14235609Sgber# into /* */ comments, after altering any existing */'s to avoid trouble.
15235609Sgberpeel='	/\\$/N
16235609Sgber	/\\\n[ 	]*/s///g
17235609Sgber	/\/\//s;\*/;* /;g
18235609Sgber	/\/\//s;//\(.*\);/*\1 */;'
19235609Sgber
20235609Sgberfor a
21235609Sgberdo
22235609Sgber	case "$a" in
23235609Sgber	-o)	# old (pre-function-prototype) compiler
24235609Sgber		# add code to comment out argument lists
25235609Sgber		peel="$peel
26235609Sgber			"'/^\([^#\/][^\/]*[a-zA-Z0-9_)]\)(\(.*\))/s;;\1(/*\2*/);'
27235609Sgber		shift
28235609Sgber		;;
29235609Sgber	-b)	# funny Berkeley __P macro
30235609Sgber		peel="$peel
31235609Sgber			"'/^\([^#\/][^\/]*[a-zA-Z0-9_)]\)(\(.*\))/s;;\1 __P((\2));'
32235609Sgber		shift
33235609Sgber		;;
34235609Sgber	-s)	# compiler doesn't like `static foo();'
35235609Sgber		# add code to get rid of the `static'
36235609Sgber		peel="$peel
37235609Sgber			"'/^static[ 	][^\/]*[a-zA-Z0-9_)](.*)/s;static.;;'
38235609Sgber		shift
39235609Sgber		;;
40235609Sgber	-p)	# private declarations
41235609Sgber		egrep='^ ==([ 	]|$)'
42235609Sgber		shift
43235609Sgber		;;
44235609Sgber	-i)	# wrap in #ifndef, argument is name
45235609Sgber		ifndef="$2"
46235609Sgber		shift ; shift
47235609Sgber		;;
48235609Sgber	*)	break
49235609Sgber		;;
50235609Sgber	esac
51235609Sgberdone
52235609Sgber
53235609Sgberif test " $ifndef" != " "
54235609Sgberthen
55235609Sgber	echo "#ifndef $ifndef"
56235609Sgber	echo "#define	$ifndef	/* never again */"
57235609Sgberfi
58235609Sgberecho "/* ========= begin header generated by $0 ========= */"
59235609Sgberecho '#ifdef __cplusplus'
60235609Sgberecho 'extern "C" {'
61235609Sgberecho '#endif'
62235609Sgberfor f
63235609Sgberdo
64235609Sgber	echo
65235609Sgber	echo "/* === $f === */"
66235609Sgber	egrep "$egrep" $f | sed 's/^ ==*[ 	]//;s/^ ==*$//' | sed "$peel"
67235609Sgber	echo
68235609Sgberdone
69235609Sgberecho '#ifdef __cplusplus'
70235609Sgberecho '}'
71235609Sgberecho '#endif'
72235609Sgberecho "/* ========= end header generated by $0 ========= */"
73235609Sgberif test " $ifndef" != " "
74235609Sgberthen
75235609Sgber	echo "#endif"
76235609Sgberfi
77235609Sgberexit 0
78235609Sgber