V10/cmd/troff/cvt


awk '

/^{/ {
	if (prev != "") {
		# comments can be trouble (e.g. ffree())
		if ( (c = match(prev, /\/\*.*\*\/$/)) != 0 ) {
			comment = substr(prev, c)
			sub(/\/\*.*\*\/$/, "", prev)
		} else comment = ""

		x = prev

		# isolate argument list
		sub(/^[^(]*\(/, "", x)
		sub(/\)[^)]*$/, "", x)

		# find the names in it
		n = split(x, args)
		arglist = ""
		for (i = 2; i <= n; i += 2)
			arglist = arglist args[i]
		gsub(/\(\*f\)\(Tchar\)/, "f", arglist)	# special case for n4.c
		gsub(/\[[0-9]+\]/, "", arglist)		#     for n8.c
		gsub(/[*()\[\]]/, "", arglist)		# discard noise characters *()[]
		gsub(/,/, ", ", arglist)		# space nicely
		sub(/\(.*\)/, "(" arglist ")", prev)	# reconstruct
		print prev comment

		# argument declarations
		gsub(/,/, ";", x)
		gsub(/\(\*f\)\(Tchar\)/, "(*f)()", x)	# special case for n4.c
		if (x != "")
			print "\t" x ";"
	}
	prev = $0
	next
}

{	print prev
	prev = $0
}

END { print prev }
' $*