home *** CD-ROM | disk | FTP | other *** search
- From: jpr@jpradley.uucp (Jean-Pierre Radley)
- Newsgroups: alt.sources
- Subject: [comp.lang.c] Re: Converting long variable names to names <8 characters
- Message-ID: <1990Oct14.202826.13577@math.lsa.umich.edu>
- Date: 14 Oct 90 20:28:26 GMT
-
- Archive-name: unique-nms/13-Oct-90
- Original-posting-by: jpr@jpradley.uucp (Jean-Pierre Radley)
- Original-subject: Re: Converting long variable names to names <8 characters
- Reposted-by: emv@math.lsa.umich.edu (Edward Vielmetti)
-
- [Reposted from comp.lang.c.
- Comments on this service to emv@math.lsa.umich.edu (Edward Vielmetti).]
-
- In article <1091@ria.ccs.uwo.ca> peter@ria.ccs.uwo.ca (Peter Marshall) writes:
- >
- >Most code these days uses variables that have more than 8 significant
- >characters. I recently purchased a system (a convergent CG1000
- >Miniframe -- a Motorola 68010 based system) that has a compiler that
- >has the original 8 character limit on variable names. I haven't been
- >able to find a conversion routine that would systematically convert
- >long names to shorter ones. Is there such a beast?
- >
- >One of the primary candidates for conversion would be the gcc
- >compiler. Once it is running, I suspect that file name problems would
- >be either eliminated or at least reduced (I have not yet determined
- >the limitations of the linker). Is there either a version of gcc that
- >has been hand converted to 8 character names or a binary that would be
- >compatible with my machine available?
-
-
- By our late friend Fred Buck:
-
-
- :
- # Name: unique_nms
- #
- # Usage: unique_nms [ -y ] [ -v ] [ tagfilename ]
- #
- # Description: from the set of C source files in the current directory
- # (i.e., *.c and *.h), detects function names that aren't unique within
- # their first seven characters, and rewrites each reference to such
- # functions (including their definitions) with a unique prefix.
- #
- # If a tagfilename is specified, then the specified tagfilename is
- # taken to be a file created by 'ctags', representing the contents of
- # the C source files in the current directory, and up to date. If no
- # tagfilename is specified, "tags" is assumed to be the tagfilename.
- # The script prompts for whether to restrict the edit to the files
- # specifically mentioned in the tagfile, regardless of whether a
- # tagfilename is specified on the command line.
- #
- # If the "-y" (for "yes" or "affirmative") switch is present, no
- # prompting will occur; the responses to all ordinary prompts will be
- # assumed to be "yes".
- #
- # If the "-v" (for "void") switch is present, then if a tags file must
- # be built, it will be built from copies of the specified source files
- # with references to the "void" type removed. This is for versions of
- # 'ctags' that don't know about the "void" data type. The implementation
- # is crude, requiring a physical copy of each source file so as not to
- # disturb the original. The Tandy 6000 requires this switch for any
- # source fileset that contains "void" functions.
- #
- # Notes: this script generates a 'sed' scriptfile called "sedfile$$"
- # where "$$" is the current process number. This file can be referred
- # to to keep track of changes made in the original source files; it's
- # pretty easy to reverse the changes made by this script with simple
- # massaging of the sedfile and re-running 'sed'.
- #
- # Copyright: this script was written by Fred Buck, who hereby releases
- # it into the public domain and expressly waives all copyright or
- # similar rights with respect to it. This script is public property.
- # However, liability is disclaimed for any consequences of use of
- # this script.
-
- trap "rm -f TEMP$$ *@ tags$$ /tmp/tag$$; exit 1" 1 2 15
-
- # affirmative mode?
- if [ $# -gt 0 -a "$1" = "-y" ]
- then
- AFFIRM="yes"
- shift
- else
- AFFIRM="no"
- fi
-
- # anti-void mode?
- if [ $# -gt 0 -a "$1" = "-v" ]
- then
- VOID="yes"
- shift
- else
- VOID="no"
- fi
-
-
- # usage section
- case $# in
- 0)
- TAGFILE="tags" ;;
- 1) if [ ! -r $1 ]
- then
- echo "$0: can't open $1"
- exit 1
- else
- TAGFILE="$1"
- fi ;;
- *) echo "usage: $0 [ -y ] [ -v ] [ tagfilename ]"
- exit 1 ;;
- esac
-
- # check for readability of specified tags file
- if [ ! -r "$TAGFILE" ]
- then
- if [ "$AFFIRM" = "no" ]
- then
- echo -n "'tags' file doesn't exist; generate it? "
- read yesno
- case $yesno in
- [Yy]*) ;;
- *) echo "can't work without a tags file"
- exit 1 ;;
- esac
- fi
- echo "calling 'ctags'....."
- if [ "$VOID" = "no" ]
- then
- ctags *.c *.h
- else
- for SFILE in *.c *.h
- do
- 0<$SFILE sed \
- -e 's/^void//'\
- -e 's/^static void/static/'\
- 1>$SFILE@
- done
- ctags *.c@ *.h@
- mv tags tags$$
- TAGFILE=/tmp/tag$$
- 0<tags$$ sed 's/@//' 1>$TAGFILE
- rm tags$$
- fi
- else
- echo "The tags file is stamped as follows:"
- echo
- ls -l ./$TAGFILE
- echo
- if [ "$AFFIRM" = "no" ]
- then
- echo -n "Use it? "
- read yesno
- case $yesno in
- [Yy]*) echo "OK." ;;
- *) echo "can't work without a tags file"
- exit 1 ;;
- esac
- fi
- fi
-
- # get to work
-
- # first, find names ambiguous in 1st 7 chars;
- # and build a sed scriptfile to disambiguate 'em
- # (scriptfile will be sedfile$$). This logic
- # will accommodate up to about seventeen
- # thousand ambiguous function names, with
- # gradually increasing probability that
- # some "[A-Z][A-Z][A-Z]_*" names may become
- # ambiguous.
- echo "Building edit scriptfile for ambiguous function names....."
- 0<$TAGFILE awk '
- BEGIN {
- a = "ABCDEFGFHIJKLMNOPQRSTUVWXYZ"
- i1 = 1
- i2 = 0
- i3 = 0
- l1 = 1
- l2 = 0
- l3 = 0
- }
- { if (substr($1,1,7) == prevsub) {
- prefix = substr(a,i3,l3) substr(a,i2,l2) substr(a,i1,l1)
- printf "s/^%s(/%s_&/\n", $1, prefix
- printf "s/\\([^_]\\)\\(%s(\\)/\\1%s_\\2/g\n", $1, prefix
- printf "s/\\([, \t]\\)\\(%s[^A-Za-z0-9_]\\)/\\1%s_\\2/g\n", \
- $1, prefix
- ++i1
- if (i1 > 26) {
- i1 = 1
- ++i2
- l2 = 1
- }
- if (i2 > 26) {
- i2 = 1
- ++i3
- l3 = 1
- }
- if (i3 > 26) exit(1)
- }
- }
- { prevsub = substr($1,1,7)
- }' 1>sedfile$$
-
- if [ $? -gt 0 ]
- then
- echo "Fatal error: 'awk' failure" 1>&2
- exit 1
- fi
-
- # if the sedfile is empty, bail out
- if [ ! -s sedfile$$ ]
- then
- echo "All names in '$TAGFILE' are unique within the first 7 characters."
- rm -f sedfile$$ /tmp/tag$$
- exit 0
- fi
-
- # let the user look over the sedfile first
- if [ "$AFFIRM" = "no" ]
- then
- echo "Sed command file contains:"
- /usr/bin/less sedfile$$
- echo -n " -- go ahead with edit? "
- read yesno
- case $yesno in
- [Yy]*) echo ;;
- *) exit 1 ;;
- esac
- echo -n "Restrict edit to files mentioned in '$TAGFILE'? "
- read yesno
- case $yesno in
- [Yy]*) TARGETS=`0<$TAGFILE awk '{ print $2 }' | sort -u` ;;
- *) TARGETS=`echo *.c *.h` ;;
- esac
- else
- echo "Restricting edit to files mentioned in '$TAGFILE'."
- TARGETS=`0<$TAGFILE awk '{ print $2 }' | sort -u`
- fi
- echo "About to edit: $TARGETS" | tr '\012' ' '
- echo
-
- # finally, run the 'sed' commandfile on
- # the files mentioned in $TAGFILE
- for FILE in $TARGETS
- do
- echo "Editing $FILE:"
- 0<$FILE sed -f sedfile$$ 1>TEMP$$
- if [ $? -eq 0 ]
- then
- mv TEMP$$ $FILE
- echo " $FILE successfully edited"
- else
- echo " Can't edit $FILE!"
- fi
- done
- rm -f TEMP$$
- --
- Jean-Pierre Radley HIGH-Q jpr@jpradley CIS: 72160,1341
-