funclen 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. #!/bin/rc
  2. # funclen [file]... - print lengths of C functions in file(s)
  3. # assumes the one true brace style (V7 kernel style).
  4. # added some slight tolerance for bogus styles.
  5. exec awk '
  6. /^(#|\/\/)|;[\t ]*$|\\$|"\)|^[\t ]*\*/ { next }
  7. /^((static|void|unsigned|int|u?v?long|double|char|struct[\t ]+[a-z_0-9]+)[\t ]*)*(\*[\t ]*)*[a-zA-Z0-9_µμ]+( +__P)? *\(/ {
  8. # function name
  9. paren = index($0, "(")
  10. prelude = substr($0, 1, paren-1)
  11. n = split(prelude, fields)
  12. funcname = fields[n]
  13. }
  14. /^{/ { # function or struct start
  15. if (funcname == "")
  16. next
  17. if (start != 0)
  18. print "unclosed function " funcname " at " FILENAME ":" FNR \
  19. >"/fd/2"
  20. start = FNR
  21. file = FILENAME
  22. }
  23. /^}[^();]*($|\/\*|\/\/)/ && $0 !~ "^}[^*/]*[;={]" {
  24. # function end, not struct end
  25. if (start == 0 || file != FILENAME || funcname == "")
  26. print "unopened function or macro end at " \
  27. FILENAME ":" FNR >"/fd/2"
  28. else
  29. print FNR - start "\t" FILENAME ":" start "," FNR "\t" \
  30. funcname "()"
  31. start = 0 # function has ended
  32. funcname = ""
  33. }
  34. END {
  35. if (start != 0)
  36. print "unclosed function " funcname " at " FILENAME ":" FNR \
  37. >"/fd/2"
  38. }
  39. ' $*