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 }
' $*
|