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