#! /bin/sh
#
#	@(#)Newgnt	3.33	92/05/21	Copyright 1991 Sun Microsystems


#	Revisions 
#		3.26	920608	Added -b option (c/c++ source browser flag
#					in generated Makefile ) JT
#		3.25	910813	Made -n option okay - BD
#		3.23	910722	Removed fix for post-beta cps - BD
#		3.22	910614	Reworked messages to conform to gxv
#		3.20	910526	Took out GUIDEHOME echo
#		3.19/20	910524	Added TNTGUIDEHOME back in! 
#		3.18	910524	Added fix for post-beta cps - BD
#				Changed TNTGUIDEHOME to GUIDEHOME - BD
#		3.17	910521	Added DOMAKE = 0 for helponly - BD
#		3.16	910520	Added -x  - BD
#		3.14/5	910516	New inheritance for .old
#		3.11	910510	Added -s option changed P to p
#		3.10	910502	Removed spare echo
#		3.9	910430	Implemented .c rename to .c.old 
#		3.8	910429	Fixed syntax error ;; line 96
#				Added -d option
#		3.7	910422	Took out GNT stuff
#		3.5	910205	Made default project directory "."
#		3.4	910104	Took out makefile creation (no more foo.make)
#		3.3		Fixed up Makefile
#		3.2		Added creation of:
#					Directories tmp and src
#		3.1		Adapted to new command line arguements
#				for GNT3
#		1.5		Adding {file}_t_gen.ps to allow customizing
#		1.20		New naming scheme
#		1.21		C++ output as .cc files, general cleanup
#				-t, -C, -m, -n, and -o options added
#				Fixed -S to not expect parameter.
#		------ Renumbered when moved to `new-world' ------
#		1.3		Added `generate:' target to generated Makefile
#				Remove ${file}.make in `clobber:' target.
#				Added header comments to generated Makefile.
#		1.4		Added GNT variable to generated Makefile.
#		1.5		Added C++ rules comment to generated Makefile
#		1.6		Added clean and clobber rules to generated
#				Instead of including ${file}.make, recur.
#				Necessary to make generate work after clobber.
#		1.7		Fixed up some chats
#		1.8		Exit immediatly if a subprog returns error.
#		1.9		Was quietly dieing if no flags specified.
#		1.10		Added 'P' option for portable
#		1.11		Fixed P and changed o to s
#		1.12		Changed order so interface is generated first
#		1.13		Took out g2ps -- no longer used
#		1.14		Took out uitocb -- also no longer used
#		1.15		Changed options to new choices
#		1.16		Fixed bug
#		1.17		Changed -n to -m
#		1.18		Fixed prompt

#   gnt Shell Script for controlling creation of TNTGuide Files
#
#   Options:
#	-C	Output c++.  
#	-a	Allows portable code generation
#	-M	Do not execute make after creating files.
#	-v	Verbose.
#	-b	Source browser output flag in Makefile for cc or CC.
#	-s	Silent
#	-S	Produce PostScript which uses sharable subclasses.
#	-P	Arguement is project name
#	-u	Do not include Postscript files within the object module
#	-i	Localized version of postscript file, do not  make string file
#	-I	Create i18n message file
#	-L	Argument is target locale
#	-d	Download all on startup
#	-h	Helpfile only
#	-x	Extract strings only
#
#    Input:
#         {file}.G is the Guide Input File
#
#    Output:
#
#         Unconditional:
#
#         Prototype Make creates {file}
#
chat () {
    if  [ $VERBOSE -eq 1 ]; then
	echo "$@"
    fi
}

mchat () {
    if [ $SILENT -eq 0 ]; then
	echo "$@"
    fi
}
    

# Exit immediatly on error
set -e

CMDLINE="$@"

USAGE="Usage: $0 [options] interface"

VERBOSE=0
SILENT=0
SRC_BROWSER=0
DOMAKE=1
HELPONLY=0
STRINGSONLY=0
OPTIND=1
OPTIONS=-
PORTABLE=0
KRC=1
NEEDDASH=0
DOWNLOADALL=0
HASPROJECT=0
PROJECT=0
PROJECTDIR=.
file=

M=;
CODE_EXT=.c;

# Now parse the given options
while getopts xhsbndMHvCSakp:uiIL: c
do
    case $c in
	C)	# C++
		CODE_EXT=.cc;;
	a)	# ANSI (Portable) Code Generation
		PORTABLE=1;
		if [ $NEEDDASH -eq 1 ];
		    then 
		    OPTIONS="$OPTIONS -";
		    NEEDDASH=0
		    fi;
		OPTIONS="${OPTIONS}a";;
	k)	# K & R Code Generation
		KRC=1;
		CODE_EXT=.c;
		if [ $NEEDDASH -eq 1 ];
		    then 
		    OPTIONS="$OPTIONS -";
		    NEEDDASH=0
		    fi;
		OPTIONS="${OPTIONS}k";;
	s)	# SILENT OPERATION
		SILENT=1;
		if [ $NEEDDASH -eq 1 ];
		    then 
		    OPTIONS="$OPTIONS -";
		    NEEDDASH=0
		    fi;
		OPTIONS="${OPTIONS}s";;
	b)	# SOURCE BROWSER COMPILATION
		SRC_BROWSER=1;
		if [ $NEEDDASH -eq 1 ];
		    then 
		    OPTIONS="$OPTIONS -";
		    NEEDDASH=0
		    fi;
		OPTIONS="${OPTIONS}b";;
	n)	# Do not do the code merge 	
		if [ $NEEDDASH -eq 1 ];
		    then 
		    OPTIONS="$OPTIONS -";
		    NEEDDASH=0
		    fi;
		OPTIONS="${OPTIONS}n";;
	h)	# Create only the help file	
		HELPONLY=1;
		if [ $NEEDDASH -eq 1 ];
		    then 
		    OPTIONS="$OPTIONS -";
		    NEEDDASH=0
		    fi;
		OPTIONS="${OPTIONS}h";
		DOMAKE=0;;
	x)	# Extract the strings only
		STRINGSONLY=1;
		if [ $NEEDDASH -eq 1 ];
		    then 
		    OPTIONS="$OPTIONS -";
		    NEEDDASH=0
		    fi;
		OPTIONS="${OPTIONS}x";
		DOMAKE=0;;
	M)	# No make
		DOMAKE=0;;
	v)	# Verbose
		VERBOSE=1;
		if [ $NEEDDASH -eq 1 ];
		    then 
		    OPTIONS="$OPTIONS -";
		    NEEDDASH=0;
		    fi;
		OPTIONS=${OPTIONS}v;;
	d)	# Download all
		if [ $NEEDDASH -eq 1 ];
		    then
		    OPTIONS="$OPTIONS -";
		    NEEDDASH=0
		    fi;
		OPTIONS="${OPTIONS}d";;
	S)	# Use subclassing
		if [ $NEEDDASH -eq 1 ];
		    then 
		    OPTIONS="$OPTIONS -";
		    NEEDDASH=0;
		    fi;
		OPTIONS="${OPTIONS}S";;
	p)	HASPROJECT=1;
		PROJECT=$OPTARG
		if [ $NEEDDASH -eq 1 ];
		    then 
		    OPTIONS="$OPTIONS -";
		    NEEDDASH=0;
		    fi;
		OPTIONS="${OPTIONS}p $PROJECT";
		NEEDDASH=1;;
	u)	# Do not compile postscript into the main file
		if [ $NEEDDASH -eq 1 ];
		    then 
		    OPTIONS="$OPTIONS -";
		    NEEDDASH=0;
		    fi;
		OPTIONS="${OPTIONS}u";;
	d)	# Download all interfaces at startup
		if [ $NEEDDASH -eq 1 ];
		    then 
		    OPTIONS="$OPTIONS -";
		    NEEDDASH=0;
		    fi;
		OPTIONS="${OPTIONS}d";;
	i)	# Localized version of Postscript file, no string file needed
		if [ $NEEDDASH -eq 1 ];
		    then 
		    OPTIONS="$OPTIONS -";
		    NEEDDASH=0;
		    fi;
		OPTIONS="${OPTIONS}i";;
	I)	# Create the message file for localization
		if [ $NEEDDASH -eq 1 ];
		    then 
		    OPTIONS="$OPTIONS -";
		    NEEDDASH=0;
		    fi;
		OPTIONS="${OPTIONS}I";;
	L)	if [ $NEEDDASH -eq 1 ];
		    then 
		    OPTIONS="$OPTIONS -";
		    NEEDDASH=0;
		    fi;
		OPTIONS="${OPTIONS}L $OPTARG";
		NEEDDASH=1;;
	H)	# Help Message
		echo USAGE;
		echo
		echo Options:
		echo "-C            C++ Compatible"
		echo "-a            Ansi C Compatible"
		echo "-M            Do not execute make"
		echo "-v            Verbose mode"
    		echo "-b            Source browser compilation"
		echo "-s            Silent mode, no messages"
		echo "-S            Use subclassing"
		echo "-p project    Specifiy a project to generate code for"
		echo "-u            Do not include Postscript files in executable"
		echo "-i            Localized version of postscript file"
		echo "-I            Create message file for localization"
		echo "-L locale     Argument is locale code"
		echo "-d            Download entire interface on startup"
		echo "-n            Do not merge code into .c file"
		echo "-h            Generate only the help file"
		echo "-x            Extract the message file only"
	        echo "-H            Print this Message"
		exit 2;;
	\?)	# Unrecognized parameter
		echo USAGE;
		echo
		echo Options:
		echo "-C            C++ Compatible"
		echo "-a            Ansi C Compatible"
		echo "-M            Do not execute make"
		echo "-v            Verbose mode"
    		echo "-b            Source browser compilation"
		echo "-s            Silent mode, no messages"
		echo "-S            Use subclassing"
		echo "-p project    Specifiy a project to generate code for"
		echo "-u            Do not include Postscript files in executable"
		echo "-i            Localized version of postscript file"
		echo "-I            Create message file for localization"
		echo "-L locale     Argument is locale code"
		echo "-d            Download entire interface on startup"
		echo "-n            Do not merge code into .c file"
		echo "-h            Generate only the help file"
		echo "-x            Extract the message file only"
		echo "-H            Print this Message"
		exit 2;;
    esac
done


# `shift 0' seems to quietly die...
if [ $OPTIND != 1 ] ; then shift `expr $OPTIND - 1` ; fi

if [ $# != 1 ]; then
    if [  $HASPROJECT -eq 0 ]; then
    echo $USAGE
    echo "-C            C++ Compatible"
    echo "-a            Ansi C Compatible"
    echo "-k            K & R C Code Generation"
    echo "-M            Do not execute make"
    echo "-v            Verbose mode"
    echo "-b            Source browser compilation"
    echo "-s            Silent mode, no messages"
    echo "-S            Use subclassing"
    echo "-p project    Specifiy a project to generate code for"
    echo "-u            Do not include Postscript files in executable"
    echo "-i            Localized version of postscript file"
    echo "-I            Create message file for localization"
    echo "-L locale     Argument is locale code"
    echo "-d            Download entire interface on startup"
    echo "-n            Do not merge code into .c file"
    echo "-h            Generate only the help file"
    echo "-x            Extract the message file only"
    echo "-H            Print this Message"
    exit 2
    fi
fi
if [ $NEEDDASH -eq 1 ];
    then 
    OPTIONS="$OPTIONS -"
    NEEDDASH=0
    fi

#OPTIONS=${OPTIONS}${M:-s}
if [ "$CODE_EXT" = ".c" ]; then
	OPTIONS="${OPTIONS}k"
else
	OPTIONS="${OPTIONS}C"
fi

chat "Options: $OPTIONS"

if [ $TNTGUIDEHOME ]; then
        PROGDIR=${TNTGUIDEHOME}/
else
        PROGDIR=${GUIDEHOME}/bin/
fi

if  [ $# = 1 ]; then
	file=`basename $* .G`
fi

if [ $HASPROJECT -eq 0 ]
then
	if [ -s ${file}.G ] 
	then
		chat "Processing $file"
		PROJECT=$file
	else
		echo $file.G does not exist
		exit 
    	fi
else
    PROJECTFILE=`basename $PROJECT .P`
    PROJECTDIR=`dirname $PROJECT`
    if [ -s ${PROJECTDIR}/${PROJECTFILE}.P ]
	then
	    chat "Processing Project $PROJECTFILE"
	else
	    echo ${PROJECTDIR}/${PROJECTFILE}.P does not exist
	    exit
	fi
fi

PROJECTDIR=${PROJECTDIR}/

if [  -s ${PROJECTDIR}/${PROJECT}${CODE_EXT} ]; then
    if [  -s ${PROJECTDIR}/${PROJECT}${CODE_EXT}.old ]; then
	rm ${PROJECTDIR}/${PROJECT}${CODE_EXT}.old
    fi
    mv ${PROJECTDIR}/${PROJECT}${CODE_EXT} ${PROJECTDIR}/${PROJECT}${CODE_EXT}.old
fi

if [ ! -s ${PROJECTDIR}/src ]; then
    chat "Creating source Directory ${PROJECTDIR}src"
    mkdir ${PROJECTDIR}src
fi

if [ ! -s ${PROJECTDIR}/tmp ]; then
    chat "Creating temporary Directory ${PROJECTDIR}tmp"
    mkdir ${PROJECTDIR}tmp
fi


#
# Finally, create the various output files
#
    if [ $HELPONLY -eq 0 ]; then
	mchat "Running Postscript Code Generator "
	genui	 $OPTIONS ${file};
    fi
    
mchat "Running Client side Helpfile and Makefile Generator "
cside  $OPTIONS ${file}

#
#    Make the prototype {file} using the conditional compilations
#
if  [ $DOMAKE -eq 1 ]; then
	echo
	echo	Making ${PROJECT} using Makefile
	echo
	make
fi
