home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 October
/
usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso
/
misc
/
volume6
/
fdecs
< prev
next >
Wrap
Text File
|
1989-03-21
|
5KB
|
242 lines
Newsgroups: comp.sources.misc
From: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
Message-Id: <8903141605.AA01288@m10ux>
Subject: v06i073: fdecs - generate pANS prototypes from K&R C code
Reply-To: mnc@m10ux.UUCP (52171.3-Michael Condict-- MHx5911 (MH0000)M999)
Posting-number: Volume 6, Issue 73
Submitted-by: mnc@m10ux.UUCP (52171.3-Michael Condict-- MHx5911 (MH0000)M999)
Archive-name: fdecs
[My, there's a lot of this kind of thing floating around recently. ++bsa]
This shell script (fdecs) extracts ANSI-C function prototype declarations,
suitable for use in a .h file, from C source files that contain old-style
function definitions. See the comment at the top of fdecs for more info.
The only option is "-Idir", which causes the C source to be run through the
C preprocessor before the prototype extraction is done.
Mike Condict
---------------------------- cut here --------------------------------------
#!/bin/sh
# This is a shar archive.
# The rest of this file is a shell script which will extract:
#
# fdecs fdecs1.sed fdecs2.sed fdecs3.sed
#
# To extract the files from this shell archive file simply
# create a directory for this file, move the archive file
# to it and enter the command
#
# sh filename
#
# The files will be extracted automatically.
# Note: Do not use csh.
#
# Archive created: Tue Mar 14 10:29:50 EST 1989
#
echo x - fdecs
sed 's/^X//' > fdecs << '@FUNKY STUFF@'
# This script, given C source files, finds all the function definitions
# of the form "type_decl f(a,b,...) type_decl a; type_decl b; ... { body }",
# and outputs a file of extern function declarations suitable for a .h file.
# There need not be a type_decl for each argument (defaults to int) and the
# type_decl's can be in a different order from the arg list. Multiple args
# can be declared in the standard abbreviated fashion: "int a, *b;".
#
# The only restriction is that the type_decl's must be no more complicated
# than what can be formed with type words, names, "*" and "[]". That is the
# type_decl's may not contain "struct ... {...}" or "float (*x)()" although,
# e.g., "struct A" is allowed.
#
# The output is one line of the form
#
# type_decl f(type_decl a, type_decl b, . . . );
#
# for each function f defined in the source files, i.e. a legal ANSI-C
# function prototype.
SEDDIR=~mnc/src/fdecs
Iflag=""
while [ "$#" -gt 0 ]; do
case "$1" in
-I*) Iflag="$Iflag $1"; shift
;;
-*) echo "Usage: $0 [ -Iincl_dir ] ... file ..."
echo " (use -I only if C preprocessor is wanted)"
exit 1
;;
*) break ;;
esac
done
if [ "$#" -eq 0 ] ; then
sed -f $SEDDIR/fdecs1.sed |
sed -f $SEDDIR/fdecs2.sed | sed -f $SEDDIR/fdecs3.sed
elif [ "X$Iflag" != X ] ; then
# User wants to run the C files through the preprocessor, with
# the specified -I flag. We delete the contents of the
# .h files from the preprocessor's output. We also need to
# delete any occurrences of '^$filename:', which some versions
# of cc -E put out at the beginning of every file:
cc -E $Iflag "$@" | \
sed -e '#n No automatic printing
# Delete contents of included .h files:
: chkhdr
/^# [1-9][0-9]* ".*\.h"/{
: delhdr
n
/^#/!b delhdr
b chkhdr
}
# Delete "filename:" inserted by "cc -E":
/^[^ ]*\.[ch]:[ ]*$/d
' \
-f $SEDDIR/fdecs1.sed \
-e 'p' |
sed -f $SEDDIR/fdecs2.sed | sed -f $SEDDIR/fdecs3.sed
else
sed -f $SEDDIR/fdecs1.sed "$@" |
sed -f $SEDDIR/fdecs2.sed | sed -f $SEDDIR/fdecs3.sed
fi
@FUNKY STUFF@
ls -l fdecs
echo x - fdecs1.sed
sed 's/^X//' > fdecs1.sed << '@FUNKY STUFF@'
: morebs
/\\$/ {
N
s/\\\n//
b morebs
}
/^[ ]*$/d
: delcom
/\/\*/{
s/@/ /g
s:/\*:@:
: morecm
/\*\//!{
s/@.*/@/
N
b morecm
}
s/\$/ /g
s:\*/:$:
s/@[^$]*\$/ /
b delcom
}
/^#/d
s/\\"/ /g
s/"[^"]*"/0/g
s/\\'/ /g
s/'[^']*'/0/g
/^[ ]*$/d
@FUNKY STUFF@
ls -l fdecs1.sed
echo x - fdecs2.sed
sed 's/^X//' > fdecs2.sed << '@FUNKY STUFF@'
: delcbrc
/{/{
s/{[^{}]*/{/g
: getcbrc
/}/!{
N
s/{[^{}]*/{/g
b getcbrc
}
s/{[^{}]*}/#/g
b delcbrc
}
s/#/{}/g
@FUNKY STUFF@
ls -l fdecs2.sed
echo x - fdecs3.sed
sed 's/^X//' > fdecs3.sed << '@FUNKY STUFF@'
: doline
: getsbr
/[;{]/!{
N
b getsbr
}
s/\n/ /g
s/[ ][ ]*/ /g
/;/{
/^[^;]*) *[a-zA-Z_{]/!{
s/^[^;]*;//
/^ *$/d
b doline
}
}
/[;)] *{}/!{
N
b doline
}
s/^ *//
s/( */(/g
s/ *)/)/g
s/ *, */, /g
s/ *; */; /g
s/ *\*/ \*/g
s/\* */\*/g
/() *{/b no_arg
s/, /, %/g
s/(/(, %/
t more_t
: more_t
s/, %\([A-Za-z_][A-Za-z0-9_]*\)\(.*[);] *\)\([A-Za-z_][A-Za-z0-9_{} ]*\)\( *\)\(\**\1[][]*\)\([,;]\)/, \3 \5\2\3\4@\6/
s/, %\([A-Za-z_][A-Za-z0-9_]*\)\(.*[);] *\)\([A-Za-z_][A-Za-z0-9_{} ]*\)\( [^;]*, %\)\(\**\1[][]*\)\([,;]\)/, \3 \5\2\3\4@\6/
t more_t
s/(, /(/
s/%/int /g
s?(\([^)]*\)).*?(\1);?
/ register/{
s/\([A-Za-z_0-9]\) register\([^A-Za-z0-9_]\)/\1\2/g
s/ register\([^A-Za-z0-9_][^A-Za-z0-9_]*[A-Za-z_][A-Za-z0-9_]*\),/ int\1,/g
s/ register\([^A-Za-z0-9_]\)/ \1/g
}
s/ */ /g
b done_a
: no_arg
s/).*/void);/
: done_a
@FUNKY STUFF@
ls -l fdecs3.sed
# The following exit is to ensure that extra garbage
# after the end of the shar file will be ignored.
exit 0