peter@ria.ccs.uwo.ca (Peter Marshall) (10/05/90)
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? I'll try to follow this group for a while (not my usual haunt) but e-mail responses would be preferred. I'll summarize to this group if I get anything interesting back. -- -- Peter Marshall, Data Comm. Manager CCS, NSC, U. of Western Ontario, London, Canada N6A 5B7 (519)661-2111x6032 peter.marshall@uwo.ca pm@uwovax (BITNET); peter@ria.uucp
jpr@jpradley.uucp (Jean-Pierre Radley) (10/14/90)
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