#!/bin/sh -
##
##   newvers -- setup new program version file
##   Copyright (c) 1994-1997 Ralf S. Engelschall, <rse@engelschall.com>
##
VERSION="2.0"
DATE="01 Jan 1997"

#   print version information line
print_version () {
    echo "This is NEWVERS, Version $VERSION ($DATE)"
}

#   give general help information
print_help () {
cat <<'EOT'
NEWVERS -- generate/maintain a version information file
Copyright (c) 1994-1997 Ralf S. Engelschall, <rse@engelschall.com>

NEWVERS will create and update a version information file,
which can be setup as a C source file or a Perl source file.

Examples:
    $ newvers -m c -p TestProg version.c
    $ newvers -m perl -p TestProg version.pl
EOT
}

#   give usage information
print_usage () {
cat <<'EOT'
Usage: newvers [options] versionfile
    Options are:
        -l<lang>        set language to one of "c", "perl" 
        -p<progname>    set program name
        -r<v>.<r>.<p>   set release version string
        -i{v|r|p}       increase version, revision or patchlevel (default)
        -d              display current version only
        -D              display current version only (incl. date)
        -V              print NEWVERS version
        -h              print help page
EOT
}

#   process the argument line
LANG=unknown
PROGNAME="-UNKNOWN-"
VERSION=unknown
REPORT=NO
REPORTFULL=NO
INCREASE=p
set -- `getopt l:p:r:i:dDVh $*`
if [ $? != 0 ]; then
    print_usage
    exit 2
fi
for opt in $*; do
    case $opt in
        -l)  LANG=$2;          shift; shift  ;;
        -p)  PROGNAME=$2;      shift; shift  ;;
        -r)  VERSION=$2;       shift; shift  ;;
        -i)  INCREASE=$2;      shift; shift  ;;
        -d)  REPORT=YES;              shift ;;
        -D)  REPORT=YES; REPORTFULL=YES; shift ;;
        -V)  print_version;           exit 0 ;;  
        -h)  print_help; print_usage; exit 0 ;;  
        --)                    shift; break  ;;
    esac
done
case $# in
    1) VERSIONFILE=$1 ;;
    *) print_usage; exit 1 ;;
esac

#   determine language
if [ "$LANG" = "unknown" ]; then
    case $VERSIONFILE in
        *.c  ) LANG=c    ;;
        *.pl ) LANG=perl ;;
    esac
fi

##   determine version
if [ "$VERSION" = "unknown" ]; then
    if [ -r "$VERSIONFILE" ]; then
        #   grep out current information
        id=`grep '"[0-9]*.[0-9]*.[0-9]* ([0-9]*-[0-9]*-[0-9]*)"' $VERSIONFILE | \
            head -1 | \
            sed -e 's%.*"\([0-9]*\.[0-9]*\.[0-9]*\) (\([0-9]*-[0-9]*-[0-9]*\)).*%\1.\2%'`
        version=`echo $id | awk -F. '{ print $1 }'`
        revision=`echo $id | awk -F. '{ print $2 }'`
        patchlevel=`echo $id | awk -F. '{ print $3 }'`
        date=`echo $id | awk -F. '{ print $4 }'`

        if [ $REPORT = NO ]; then
            if [ $INCREASE = p ]; then
                patchlevel=`expr $patchlevel + 1`
            else
                if [ $INCREASE = r ]; then
                    revision=`expr $revision + 1`
                    patchlevel=0
                else
                    if [ $INCREASE = v ]; then
                        version=`expr $version + 1`
                        revision=0
                        patchlevel=0
                    fi
                fi
            fi
        fi

    else
        #   intialise to first version
        version=1
        revision=0
        patchlevel=0
        date=`date '+%d-%m-19%y'`
    fi
else
    #   take given version
    version=`echo $VERSION | awk -F. '{ print $1 }'`
    revision=`echo $VERSION | awk -F. '{ print $2 }'`
    patchlevel=`echo $VERSION | awk -F. '{ print $3 }'`
    date=`date '+%d-%m-19%y'`
fi

if [ $REPORT = YES ]; then
    if [ $REPORTFULL = YES ]; then
        echo "$version.$revision.$patchlevel ($date)"
    else
        echo "$version.$revision.$patchlevel"
    fi
    exit 0;
else
    echo "new version: $version.$revision.$patchlevel ($date)"
fi

#   create date string
year=`date '+19%y'`
month=`date '+%m'`
day=`date '+%d'`

#   create the version file according the the selected language  
tmpfile="/tmp/newvers.tmp.$$"
rm -f $tmpfile
case $LANG in
    c )
        cat >$tmpfile <<'EOF'
/* !! This file was automatically generated by NEWVERS !! */

/* for logfiles, etc. */
char @PROGNAME@_Version[] =
    "@VERSION@.@REVISION@.@PATCHLEVEL@ (@DAY@-@MONTH@-@YEAR@)";

/* interactive 'hello' string to identify us to the user */
char @PROGNAME@_Hello[] = 
    "This is @PROGNAME@ Version @VERSION@.@REVISION@.@PATCHLEVEL@ (@DAY@-@MONTH@-@YEAR@)";

/* a GNU --version output */
char @PROGNAME@_GNUVersion[] =
    "@PROGNAME@ Version @VERSION@.@REVISION@.@PATCHLEVEL@";

/* a UNIX what(1) id string */
char @PROGNAME@_WhatID[] =
    "@(#)@PROGNAME@ Version @VERSION@.@REVISION@.@PATCHLEVEL@ (@DAY@-@MONTH@-@YEAR@)";

/* a RCS ident(1) id string */
char @PROGNAME@_RCSIdentID[] =
    "$Id: @PROGNAME@ @VERSION@.@REVISION@.@PATCHLEVEL@ @DAY@-@MONTH@-@YEAR@ $";

/* a WWW id string */
char @PROGNAME@_WebID[] =
    "@PROGNAME@/@VERSION@.@REVISION@.@PATCHLEVEL@";

EOF
        ;;
    perl )
        cat >$tmpfile <<'EOF'
# !! This file was automatically generated by NEWVERS !!

package Vers;

# for logfiles, etc.
$@PROGNAME@_Version =
    "@VERSION@.@REVISION@.@PATCHLEVEL@ (@DAY@-@MONTH@-@YEAR@)";

# interactive 'hello' string to identify us to the user
$@PROGNAME@_Hello = 
    "This is @PROGNAME@ Version @VERSION@.@REVISION@.@PATCHLEVEL@ (@DAY@-@MONTH@-@YEAR@)";

# a GNU --version output
$@PROGNAME@_GNUVersion =
    "@PROGNAME@ Version @VERSION@.@REVISION@.@PATCHLEVEL@";

# a UNIX what(1) id string
$@PROGNAME@_WhatID =
    "@(#)@PROGNAME@ Version @VERSION@.@REVISION@.@PATCHLEVEL@ (@DAY@-@MONTH@-@YEAR@)";

# a RCS ident(1) id string
$@PROGNAME@_RCSIdentID =
    "\$Id: @PROGNAME@ @VERSION@.@REVISION@.@PATCHLEVEL@ @DAY@-@MONTH@-@YEAR@ \$";

# a WWW id string
$@PROGNAME@_WebID =
    "@PROGNAME@/@VERSION@.@REVISION@.@PATCHLEVEL@";
1;
EOF
        ;;
    * ) print_usage; exit 1
        ;;
esac

rm -f $VERSIONFILE
sed \
-e "s|@PROGNAME@|$PROGNAME|g" \
-e "s|@VERSION@|$version|g" \
-e "s|@REVISION@|$revision|g" \
-e "s|@PATCHLEVEL@|$patchlevel|g" \
-e "s|@YEAR@|$year|g" \
-e "s|@MONTH@|$month|g" \
-e "s|@DAY@|$day|g" <$tmpfile >$VERSIONFILE
rm -f $tmpfile

##EOF##
