#!/bin/sh
#
# $Id$
#
# prints IBM VisualAge and XLC/C++ version
#
##############################################################################
#
# Licensed to the Apache Software  Foundation (ASF) under one or more
# contributor  license agreements.  See  the NOTICE  file distributed
# with  this  work  for  additional information  regarding  copyright
# ownership.   The ASF  licenses this  file to  you under  the Apache
# License, Version  2.0 (the  "License"); you may  not use  this file
# except in  compliance with the License.   You may obtain  a copy of
# the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the  License is distributed on an  "AS IS" BASIS,
# WITHOUT  WARRANTIES OR CONDITIONS  OF ANY  KIND, either  express or
# implied.   See  the License  for  the  specific language  governing
# permissions and limitations under the License.
#
# Copyright 1999-2007 Rogue Wave Software, Inc.
#
##############################################################################
#
# reported versions and patches they correspond to:
#
# version    release/patch
# --------   -------------

# 10.0.0.0   XLC/C++ 10

# 9.0.0.6    XLC/C++ 9 August 2008 PTF
# 9.0.0.5    XLC/C++ 9 July 2008 PTF
# 9.0.0.4    XLC/C++ 9 April 2008 PTF
# 9.0.0.3    XLC/C++ 9 January 2008 PTF
# 9.0.0.2    XLC/C++ 9 October 2007 PTF
# 9.0.0.1    N/A
# 9.0.0.0    XLC/C++ 9

# 8.0.0.19   XLC/C++ 8 May 2008 PTF
# 8.0.0.18   XLC/C++ 8 February 2008 PTF
# 8.0.0.17   XLC/C++ 8 November 2007 PTF
# 8.0.0.16   XLC/C++ 8 August 2007 PTF
# 8.0.0.15   XLC/C++ 8 July 2007 PTF
# 8.0.0.14   XLC/C++ 8 May 2007 PTF
# 8.0.0.13   XLC/C++ 8 February 2007 PTF
# 8.0.0.12   XLC/C++ 8 December 2006 PTF
# 8.0.0.11   XLC/C++ 8 August 2006 PTF
# 8.0.0.10   XLC/C++ 8 June 2006 PTF
# 8.0.0.x    N/A for 3 <= x <= 9
# 8.0.0.2    XLC/C++ 8 May 2006 PTF
# 8.0.0.1    XLC/C++ 8 March 2006 PTF
# 8.0.0.0    XLC/C++ 8

# 7.0.0.9    VisualAge 7 Feb 2007 PTF
# 7.0.0.8    VisualAge 7 October 2006 PTF
# 7.0.0.7    VisualAge 7 August 2006 PTF
# 7.0.0.6    VisualAge 7 April 2006 PTF
# 7.0.0.5    VisualAge 7 January 2006 PTF
# 7.0.0.4    VisualAge 7 November 2005 PTF
# 7.0.0.3    VisualAge 7 August05 PTF
# 7.0.0.2    VisualAge 7 May 2005 PTF
# 7.0.0.1    VisualAge 7 November 2004 PTF
# 7.0.0.0    VisualAge 7

# 6.0.0.17   VisualAge 6, November 2006 PTF
# 6.0.0.14   VisualAge 6, September 2005 PTF
# 6.0.0.0    VisualAge 6

if [ $# -gt 0 ]; then
    CXX=$1
else
    CXX=xlC
fi


xlcout=/tmp/$CXX_version.$$.out

$CXX -qversion >$xlcout 2>&1

if [ $? -eq 0 ]; then
    # VisualAge 7.0, 2005/8/31 or later
    version=`grep "Version:" $xlcout \
             | awk '{ if ($1 == "Version:") print $2; \
                      else if ($4 == "Version") print $5; \
                      else print $7; }'`
    rm $xlcout

    # collapse consecutive leading zeros
    echo $version | awk 'BEGIN { FS="." }{ print (0 + $1) "." (0 + $2) "." (0 + $3) "." (0 + $4) }'
    exit
fi

# check to see if this is the base 7.0
grep "V7" $xlcout > /dev/null 2>&1
v7_or_6=$?

if [ $v7_or_6 -ne 0 ]; then
    # if it's not 7.0 see if it's 6.0
    grep "version 6.0" $xlcout > /dev/null 2>&1
    v7_or_6=$?
fi

if [ $v7_or_6 -eq 0 ]; then

    # VisualAge 6.0 or 7.0 (unpatched)
    tmpsrc=/tmp/$CXX_version.$$.cpp
    tmpobj=/tmp/$CXX_version.$$.o

    echo "#pragma comment(compiler)" > $tmpsrc
    echo "int main() { }" >> $tmpsrc

    $CXX -c $tmpsrc -o $tmpobj
    status=$?

    if [ $status -eq 0 ]; then
        version=`strings $tmpobj \
                 | sed -n 's/.*Version \([^ ]*\) *.*/\1/p' \
                 | tail -1`
    fi

    rm -f $tmpsrc $tmpobj $xlcout 2>/dev/null

    if [ "$version" = "" ]; then
        version=`$CXX -qversion \
                 | awk '{ if ($4 == "Version") print $5; else print $7; }'`
    fi

    echo $version | sed "s/[^0-9]*\([0-9].*\)/\1/"
    exit
fi

# VisualAge 5.0 (and prior?)
echo >> $xlcout
sed "s/.*version \(.*\)/\1/" $xlcout
rm $xlcout
