aboutsummaryrefslogtreecommitdiff
path: root/gnu/lib/libg++/genclass/genclass.sh
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/lib/libg++/genclass/genclass.sh')
-rw-r--r--gnu/lib/libg++/genclass/genclass.sh452
1 files changed, 452 insertions, 0 deletions
diff --git a/gnu/lib/libg++/genclass/genclass.sh b/gnu/lib/libg++/genclass/genclass.sh
new file mode 100644
index 000000000000..08d510754ad2
--- /dev/null
+++ b/gnu/lib/libg++/genclass/genclass.sh
@@ -0,0 +1,452 @@
+#!/bin/sh
+
+# Copyright (C) 1989 Free Software Foundation, Inc.
+#
+# genclass program enhanced by Wendell C. Baker
+# (original by Doug Lea (dl@rocky.oswego.edu))
+
+#This file is part of GNU libg++.
+
+#GNU libg++ is free software; you can redistribute it and/or modify
+#it under the terms of the GNU General Public License as published by
+#the Free Software Foundation; either version 1, or (at your option)
+#any later version.
+
+#GNU libg++ is distributed in the hope that it will be useful,
+#but WITHOUT ANY WARRANTY; without even the implied warranty of
+#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+#GNU General Public License for more details.
+
+#You should have received a copy of the GNU General Public License
+#along with GNU libg++; see the file COPYING. If not, write to
+#the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+
+
+#
+# genclass -list [proto ...]
+# genclass -catalog [proto ...]
+# genclass type1 {ref|val} proto [out_prefix]
+# genclass -2 type1 {ref|val} type2 {ref, val} proto [out_prefix]
+#
+# Generate classes from prototypes
+#
+name=genclass ;
+usage="
+ $name -list [proto ...]
+ $name -catalog [proto ...]
+ $name type1 {ref|val} proto [out_prefix]
+ $name -2 type1 {ref|val} type2 {ref|val} proto [out_prefix]" ;
+
+case "$1" in
+-usage)
+ #
+ # -usage
+ #
+ echo "usage: $usage" 1>&2 ;
+ exit 0;
+ ;;
+-version)
+ #
+ # -version
+ #
+ # <VERSION> is substituted by the build process.
+ # We currently use the libg++ version number (extracted from ../Makefile).
+ echo "$name: version <VERSION>" ;
+ exit 0;
+ ;;
+-requires)
+ #
+ # -requires
+ #
+ # The following line should contain any nonstandard programs
+ # which must be in the users's path (i.e. not referenced by a
+ # fullpath);it allows one to check a script for dependencies
+ # without exhaustively testing its usages.
+ # ... in this case genclass depends on nothing else.
+ echo ;
+ exit 0;
+ ;;
+esac ;
+
+# pull it in from the environment
+[ "$TRACE" = "" ] || set -xv
+
+# Search in standard g++ prototype directory and in the current directory
+# NOTE: this variable is edited by the install process
+PROTODIR=/projects/gnu-cygnus/gnu-cygnus-2/mips/lib/g++-include/gen
+
+pwd=`pwd`
+
+case "$1" in
+-catalog*|-list*)
+ #
+ # genclass -catalog [proto ...]
+ # genclass -list [proto ...]
+ #
+ option="$1" ;
+ shift ;
+
+ case $# in
+ 0)
+ #
+ # -catalog
+ # -list
+ #
+ select=all ;
+ select_pattern=p ;
+ ;;
+ *)
+ #
+ # -catalog proto ...
+ # -list proto ...
+ #
+ select="$@" ;
+ select_pattern= ;
+ for i in $@ ; do
+ select_pattern="\
+$select_pattern
+/.*$i\$/ p
+" ;
+ done ;
+
+ ;;
+ esac ;
+
+ #
+ # select_pattern is now a (possibly-vacuous) newline-
+ # separated list of patterns of the form:
+ #
+ # /.*Proto1$/ p
+ # /.*Proto2$/ p
+ # /.*Proto3$/ p
+ #
+ # or select_pattern is simply ``p'' to select everything
+
+ # Hmmm... not all systems have a fmt program; should we
+ # just go ahead and use ``nroff -Tcrt | cat -s'' here?
+ fmt='nroff -Tcrt | cat -s'
+ #fmt=fmt ;
+
+ case "$option" in
+ -catalog*)
+ #
+ # -catalog [proto ...]
+ #
+ echo "\
+Catalog of ${name} class templates
+directories searched:
+ $PROTODIR
+ $pwd
+selecting: $select
+classes available:" ;
+ ;;
+ -list*)
+ #
+ # -list [proto ...]
+ #
+ # no need to do anything (the list is coming out next)
+ ;;
+ esac ;
+
+# The sed script does the following:
+# - If it does not end in a .ccP or .hP then
+# it's not a template and we are not intereseted.
+# - Get rid of pathname components [s;.*/;;]
+# - Just take the template names
+# - change quoting conventions and select off what we want to see
+# -if it did not pass the patterns, kill it
+
+ ls $pwd $PROTODIR | sed -e '
+/\.ccP$/ !{
+ /\.hP$/ !{
+ d
+ }
+}
+s;.*/;;
+s/\.ccP$//
+s/\.hP$//
+' -e "$select_pattern
+d
+" | sort -u | case "$option" in
+ -catalog*)
+ # The library catalog information preceded the list
+ # format the list, and tab in in a bit to make it readable.
+ # Re-evaluate $fmt because it might contain a shell command
+ eval $fmt | sed -e 's/.*/ &/' ;
+ ;;
+ -list*)
+ # nothing special, just let the sorted list dribble out
+ # we must use cat to receive (and reproduce) the incoming list
+ cat ;
+ ;;
+ esac ;
+ exit 0;
+ ;;
+-2)
+ #
+ # genclass -2 type1 {ref|val} type2 {ref|val} proto [out_prefix]
+ #
+ N=2 ;
+
+ case $# in
+ 6) # genclass -2 type1 {ref|val} type2 {ref|val} proto
+ ;;
+ 7) # genclass -2 type1 {ref|val} type2 {ref|val} proto out_prefix
+ ;;
+ *)
+ echo "usage: $usage" 1>&2 ;
+ exit 1;
+ esac ;
+ shift ;
+ ;;
+*)
+ #
+ # genclass type1 {ref|val} proto [out_prefix]
+ #
+ N=1 ;
+
+ case $# in
+ 3) # genclass type1 {ref|val} proto
+ ;;
+ 4) # genclass type1 {ref|val} proto out_prefix
+ ;;
+ *)
+ echo "usage: $usage" 1>&2 ;
+ exit 1;
+ esac ;
+ ;;
+esac
+
+#
+# Args are now (the point being the leading ``-2'' is gone)
+#
+# type1 {ref|val} proto [out_prefix]
+# type1 {ref|val} type2 {ref|val} proto [out_prefix]
+#
+
+#
+# Quote all of the $1 $2 etc references to guard against
+# dynamic syntax errors due to vacuous arguments (i.e. '')
+# as sometimes occurs when genclass is used from a Makefile
+#
+
+T1="$1";
+T1NAME="$T1." ;
+T1SEDNAME="$T1" ;
+
+case "$2" in
+ref)
+ T1ACC="\&" ;
+ ;;
+val)
+ T1ACC=" " ;
+ ;;
+*)
+ echo "${name}: Must specify type1 access as ref or val" 1>&2 ;
+ echo "usage: $usage" 1>&2 ;
+ exit 1;
+ ;;
+esac
+
+# N is either 1 or 2
+
+case $N in
+1)
+ #
+ # type1 {ref|val} proto [out_prefix]
+ #
+ class="$3" ;
+
+ T2="" ;
+ T2ACC="" ;
+ ;;
+2)
+ #
+ # type1 {ref|val} type2 {ref|val} proto [out_prefix]
+ #
+ class="$5" ;
+
+ T2="$3";
+ T2NAME="$T2." ;
+ T2SEDNAME="$T2" ;
+
+ case "$4" in
+ ref)
+ T2ACC="\&" ;
+ ;;
+ val)
+ T2ACC=" " ;
+ ;;
+ *)
+ echo "${name}: Must specify type2 access: ref or val" 1>&2 ;
+ echo "usage: $usage" 1>&2 ;
+ exit 1;;
+ esac;
+ ;;
+esac
+
+defaultprefix="$T1NAME$T2NAME" ;
+
+case $# in
+3) # type1 {ref|val} proto
+ replaceprefix="N" ;
+ prefix="$defaultprefix" ;
+ ;;
+5) # type1 {ref|val} type2 {ref|val} proto
+ replaceprefix="N" ;
+ prefix="$defaultprefix" ;
+ ;;
+4) # type1 {ref|val} proto out_prefix
+ prefix="$4" ;
+ replaceprefix="Y" ;
+ ;;
+6) # type1 {ref|val} type2 {ref|val} proto out_prefix
+ prefix="$6" ;
+ replaceprefix="Y" ;
+ ;;
+*)
+ echo "${name}: too many arguments" 1>&2 ;
+ echo "usage: $usage" 1>&2 ;
+ exit 1;
+ ;;
+esac ;
+
+src_h=$class.hP
+src_cc=$class.ccP
+out_h=$prefix$class.h;
+out_cc=$prefix$class.cc ;
+
+#
+# Note #1: The .h and .cc parts are done separately
+# in case only a .h exists for the prototype
+#
+# Note #2: Bind the .h and .cc parts to the fullpath
+# directories at the same time to ensure consistency.
+#
+
+if [ -f $pwd/$src_h ] ; then
+ fullsrc_h=$pwd/$src_h ;
+ fullsrc_cc=$pwd/$src_cc ;
+elif [ -f $PROTODIR/$src_h ] ; then
+ fullsrc_h=$PROTODIR/$src_h ;
+ fullsrc_cc=$PROTODIR/$src_cc ;
+else
+ echo "${name}: there is no prototype for class $class - file $src_h" 1>&2 ;
+ $0 -list ;
+ exit 1;
+fi
+
+CASES="$N$replaceprefix" ;
+# CASES is one of { 2Y 2N 1Y 1N }
+
+#
+# WATCHOUT - we have no way of checking whether or not
+# the proper case type is being used with the prototype.
+#
+# For example, we have no way of ensuring that any of
+# Map variants are specified with the -2 argument set
+# Further, we have no way of ensuring that -2 is not
+# used with the prototypes which require only one.
+#
+# The second problem is not serious because it still
+# results in correctly-generated C++ code; the first
+# problem is serious because it results in C++ code that
+# still has ``<C>'' and ``<C&>'' syntax inside it. Such
+# code of course will not compile.
+#
+# SO THE BEST WE CAN DO - is check for the presence of
+# <C> and <C&> AFTER the thing has been generated.
+#
+
+case $CASES in
+2Y) # Two output substitutions, change the prefix
+ sed < $fullsrc_h > $out_h -e "
+s/<T>/$T1/g
+s/<T&>/$T1$T1ACC/g
+s/<C>/$T2/g
+s/<C&>/$T2$T2ACC/g
+s/$T1SEDNAME\.$T2SEDNAME\./$prefix/g
+s/$T1SEDNAME\./$prefix/g
+s/$T2SEDNAME\./$prefix/g
+" ;
+ ;;
+2N) # Two output substitutions, use the default prefix
+ sed < $fullsrc_h > $out_h -e "
+s/<T>/$T1/g
+s/<T&>/$T1$T1ACC/g
+s/<C>/$T2/g
+s/<C&>/$T2$T2ACC/g
+" ;
+ ;;
+1Y) # One output substitution, change the prefix
+ sed < $fullsrc_h > $out_h -e "
+s/<T>/$T1/g
+s/<T&>/$T1$T1ACC/g
+s/$T1SEDNAME\./$prefix/g
+" ;
+ ;;
+1N) # One output substitution, use the default prefix
+ sed < $fullsrc_h > $out_h -e "
+s/<T>/$T1/g
+s/<T&>/$T1$T1ACC/g
+" ;
+ ;;
+esac
+
+if egrep '<C&?>' $out_h > /dev/null ; then
+ echo "${name}: the $class class requires the -2 syntax for the 2nd type" 1>&2 ;
+ echo "usage: $usage" 1>&2 ;
+ # the user does not get to see the mistakes (he might try to compile it)
+ rm $out_h ;
+ exit 1;
+fi ;
+
+if [ ! -f $fullsrc_cc ] ; then
+ echo "${name}: warning, class has a .h but no .cc file" 1>&2 ;
+ exit 0;
+fi
+
+case $CASES in
+2Y) # Two output substitutions, change the prefix
+ sed < $fullsrc_cc > $out_cc -e "
+s/<T>/$T1/g
+s/<T&>/$T1$T1ACC/g
+s/<C>/$T2/g
+s/<C&>/$T2$T2ACC/g
+s/$T1SEDNAME\.$T2SEDNAME\./$prefix/g
+s/$T1SEDNAME\./$prefix/g
+s/$T2SEDNAME\./$prefix/g
+"
+ ;;
+2N) # Two output substitutions, use the default prefix
+ sed < $fullsrc_cc > $out_cc -e "
+s/<T>/$T1/g
+s/<T&>/$T1$T1ACC/g
+s/<C>/$T2/g
+s/<C&>/$T2$T2ACC/g
+"
+ ;;
+1Y) # One output substitution, change the prefix
+ sed < $fullsrc_cc > $out_cc -e "
+s/<T>/$T1/g
+s/<T&>/$T1$T1ACC/g
+s/$T1SEDNAME\./$prefix/g
+"
+ ;;
+1N) # One output substitution, use the default prefix
+ sed < $fullsrc_cc > $out_cc -e "
+s/<T>/$T1/g
+s/<T&>/$T1$T1ACC/g
+"
+ ;;
+esac
+
+if egrep '<C&?>' $out_h $out_cc > /dev/null ; then
+ echo "${name}: the $class class requires the -2 syntax for the 2nd type" 1>&2 ;
+ echo "usage: $usage" 1>&2 ;
+ # the user does not get to see the mistakes (he might try to compile it)
+ rm $out_h $out_cc ;
+ exit 1;
+fi ;
+
+exit 0;