home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume6 / fdecs < prev    next >
Text File  |  1989-03-21  |  5KB  |  242 lines

  1. Newsgroups: comp.sources.misc
  2. From: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  3. Message-Id: <8903141605.AA01288@m10ux>
  4. Subject: v06i073: fdecs - generate pANS prototypes from K&R C code
  5. Reply-To: mnc@m10ux.UUCP (52171.3-Michael Condict-- MHx5911 (MH0000)M999)
  6.  
  7. Posting-number: Volume 6, Issue 73
  8. Submitted-by: mnc@m10ux.UUCP (52171.3-Michael Condict-- MHx5911 (MH0000)M999)
  9. Archive-name: fdecs
  10.  
  11. [My, there's a lot of this kind of thing floating around recently.  ++bsa]
  12.  
  13. This shell script (fdecs) extracts ANSI-C function prototype declarations,
  14. suitable for use in a .h file, from C source files that contain old-style
  15. function definitions.  See the comment at the top of fdecs for more info.
  16.  
  17. The only option is "-Idir", which causes the C source to be run through the
  18. C preprocessor before the prototype extraction is done.
  19.  
  20. Mike Condict
  21.  
  22. ---------------------------- cut here --------------------------------------
  23. #!/bin/sh
  24. # This is a shar archive.
  25. # The rest of this file is a shell script which will extract:
  26. #
  27. # fdecs fdecs1.sed fdecs2.sed fdecs3.sed
  28. #
  29. # To extract the files from this shell archive file simply
  30. # create a directory for this file, move the archive file
  31. # to it and enter the command
  32. #
  33. #    sh filename
  34. # The files will be extracted automatically.
  35. # Note: Do not use csh.
  36. #
  37. # Archive created: Tue Mar 14 10:29:50 EST 1989
  38. #
  39. echo x - fdecs
  40. sed 's/^X//' > fdecs << '@FUNKY STUFF@'
  41.  
  42. # This script, given C source files, finds all the function definitions
  43. # of the form "type_decl f(a,b,...) type_decl a; type_decl b; ... { body }",
  44. # and outputs a file of extern function declarations suitable for a .h file.
  45. # There need not be a type_decl for each argument (defaults to int) and the
  46. # type_decl's can be in a different order from the arg list.  Multiple args
  47. # can be declared in the standard abbreviated fashion: "int a, *b;".
  48. #
  49. # The only restriction is that the type_decl's must be no more complicated
  50. # than what can be formed with type words, names, "*" and "[]".  That is the
  51. # type_decl's may not contain "struct ... {...}" or "float (*x)()" although,
  52. # e.g., "struct A" is allowed.
  53. #
  54. # The output is one line of the form 
  55. #
  56. #    type_decl f(type_decl a, type_decl b, . . . );
  57. #
  58. # for each function f defined in the source files, i.e. a legal ANSI-C
  59. # function prototype.
  60.  
  61. SEDDIR=~mnc/src/fdecs
  62.  
  63. Iflag=""
  64. while [ "$#" -gt 0 ]; do
  65.     case "$1" in
  66.     -I*)    Iflag="$Iflag $1"; shift
  67.         ;;
  68.     -*)    echo "Usage: $0 [ -Iincl_dir ] ... file ..."
  69.         echo "       (use -I only if C preprocessor is wanted)"
  70.         exit 1
  71.         ;;
  72.     *)    break ;;
  73.     esac
  74. done
  75.  
  76. if [ "$#" -eq 0 ] ; then
  77.     sed -f $SEDDIR/fdecs1.sed |
  78.     sed -f $SEDDIR/fdecs2.sed | sed -f $SEDDIR/fdecs3.sed
  79. elif [ "X$Iflag" != X ] ; then
  80.     # User wants to run the C files through the preprocessor, with
  81.     # the specified -I flag.  We delete the contents of the
  82.     # .h files from the preprocessor's output.  We also need to
  83.     # delete any occurrences of '^$filename:', which some versions
  84.     # of cc -E put out at the beginning of every file:
  85.     cc -E $Iflag "$@" | \
  86.         sed -e '#n No automatic printing
  87.  
  88.             # Delete contents of included .h files:
  89.             : chkhdr
  90.             /^# [1-9][0-9]* ".*\.h"/{
  91.                 : delhdr
  92.                     n
  93.                 /^#/!b delhdr
  94.                 b chkhdr
  95.             }
  96.             # Delete "filename:" inserted by "cc -E":
  97.             /^[^     ]*\.[ch]:[     ]*$/d
  98.             ' \
  99.             -f $SEDDIR/fdecs1.sed \
  100.             -e 'p' |
  101.         sed -f $SEDDIR/fdecs2.sed | sed -f $SEDDIR/fdecs3.sed
  102. else
  103.     sed -f $SEDDIR/fdecs1.sed "$@" |
  104.         sed -f $SEDDIR/fdecs2.sed | sed -f $SEDDIR/fdecs3.sed
  105. fi
  106. @FUNKY STUFF@
  107. ls -l fdecs
  108. echo x - fdecs1.sed
  109. sed 's/^X//' > fdecs1.sed << '@FUNKY STUFF@'
  110.  
  111. : morebs
  112. /\\$/ {
  113.     N
  114.     s/\\\n//
  115.     b morebs
  116. }
  117.  
  118. /^[     ]*$/d
  119.  
  120. : delcom
  121. /\/\*/{
  122.     s/@/ /g
  123.     s:/\*:@:
  124.  
  125.     : morecm
  126.     /\*\//!{
  127.         s/@.*/@/
  128.         N
  129.         b morecm
  130.     }
  131.  
  132.     s/\$/ /g
  133.  
  134.     s:\*/:$:
  135.     s/@[^$]*\$/ /
  136.  
  137.     b delcom
  138. }
  139.  
  140. /^#/d
  141.  
  142. s/\\"/ /g
  143. s/"[^"]*"/0/g
  144. s/\\'/ /g
  145. s/'[^']*'/0/g
  146.  
  147. /^[     ]*$/d
  148. @FUNKY STUFF@
  149. ls -l fdecs1.sed
  150. echo x - fdecs2.sed
  151. sed 's/^X//' > fdecs2.sed << '@FUNKY STUFF@'
  152. : delcbrc
  153. /{/{
  154.     s/{[^{}]*/{/g
  155.     : getcbrc
  156.     /}/!{
  157.         N
  158.         s/{[^{}]*/{/g
  159.         b getcbrc
  160.     }
  161.     s/{[^{}]*}/#/g
  162.     b delcbrc
  163. }
  164. s/#/{}/g
  165. @FUNKY STUFF@
  166. ls -l fdecs2.sed
  167. echo x - fdecs3.sed
  168. sed 's/^X//' > fdecs3.sed << '@FUNKY STUFF@'
  169.  
  170.  
  171. : doline
  172.  
  173.  
  174. : getsbr
  175. /[;{]/!{
  176.     N
  177.     b getsbr
  178. }
  179.  
  180. s/\n/ /g
  181. s/[     ][     ]*/ /g
  182.  
  183.  
  184. /;/{
  185.     /^[^;]*) *[a-zA-Z_{]/!{
  186.         s/^[^;]*;//
  187.         /^ *$/d
  188.         b doline
  189.     }
  190. }
  191.  
  192.  
  193. /[;)] *{}/!{
  194.     N
  195.     b doline
  196. }
  197.  
  198. s/^  *//
  199. s/( */(/g
  200. s/ *)/)/g
  201. s/ *, */, /g
  202. s/ *; */; /g
  203. s/ *\*/ \*/g
  204. s/\*  */\*/g
  205.  
  206.  
  207.  
  208. /() *{/b no_arg
  209.     s/, /, %/g
  210.     s/(/(, %/
  211.  
  212.     t more_t
  213.     : more_t
  214.         s/, %\([A-Za-z_][A-Za-z0-9_]*\)\(.*[);] *\)\([A-Za-z_][A-Za-z0-9_{} ]*\)\( *\)\(\**\1[][]*\)\([,;]\)/, \3 \5\2\3\4@\6/
  215.         s/, %\([A-Za-z_][A-Za-z0-9_]*\)\(.*[);] *\)\([A-Za-z_][A-Za-z0-9_{} ]*\)\( [^;]*, %\)\(\**\1[][]*\)\([,;]\)/, \3 \5\2\3\4@\6/
  216.     t more_t
  217.     
  218.     s/(, /(/
  219.     
  220.     s/%/int /g
  221.  
  222.     s?(\([^)]*\)).*?(\1);?
  223.  
  224.     / register/{
  225.         s/\([A-Za-z_0-9]\) register\([^A-Za-z0-9_]\)/\1\2/g
  226.         s/ register\([^A-Za-z0-9_][^A-Za-z0-9_]*[A-Za-z_][A-Za-z0-9_]*\),/ int\1,/g
  227.         s/ register\([^A-Za-z0-9_]\)/ \1/g
  228.     }
  229.  
  230.     s/   */ /g
  231.  
  232.     b done_a
  233. : no_arg
  234.     s/).*/void);/
  235. : done_a
  236. @FUNKY STUFF@
  237. ls -l fdecs3.sed
  238. # The following exit is to ensure that extra garbage 
  239. # after the end of the shar file will be ignored.
  240. exit 0
  241.