#! /bin/sh
# $Id: yacctoC,v 1.6 1997/04/25 06:41:17 zeller Exp $
# adapt yacc template for C++ use

# Copyright (C) 1995 Technische Universitaet Braunschweig, Germany.
# Written by Andreas Zeller <zeller@ips.cs.tu-bs.de>.
# 
# This file is part of the ICE Library.
# 
# The ICE Library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Library General Public
# License as published by the Free Software Foundation; either
# version 2 of the License, or (at your option) any later version.
# 
# The ICE Library 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 Library General Public License for more details.
# 
# You should have received a copy of the GNU Library General Public
# License along with the ICE Library -- see the file COPYING.LIB.
# If not, write to the Free Software Foundation, Inc.,
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
# 
# ICE is the incremental configuration engine.
# Contact ice@ips.cs.tu-bs.de for details.

this=`basename $0`
path=`dirname $0`

if [ ! -f y.tab.c -a ! -f y.tab.h ]; then
  echo $this: neither y.tab.c nor y.tab.h found >&2
  exit 1
fi

# prefer system V sed (does not strip initial space)
sed=sed
if [ -f /usr/5bin/sed ]; then
  sed=/usr/5bin/sed
fi

static=cat
if [ "$1" = -static ]; then
  static="/bin/sh $path/make-static"
  shift
fi

prefix=cat
if [ "$1" = -prefix ]; then
  prefix="$sed s!yy!$2!"
  shift 2
fi

if [ $# != 0 ]; then
  echo "$this: usage: $this [-static] [-prefix PREFIX]" >&2
  exit 1
fi
  
for file in y.tab.c y.tab.h; do

  if [ ! -f $file ]; then
    continue
  fi

  case $file in
    y.tab.c) target=y.tab.C;;
    y.tab.h) target=y.tab.H;;
  esac

  head $file | grep "using $this" > /dev/null
  if [ $? = 0 ]; then
    echo $this: $file is already in C++ format >&2
    continue
  fi

  if [ $file = y.tab.c ]; then
    grep '@(#)yaccpar.*SMI' $file > /dev/null
    if [ $? = 0 ]; then
      yaccpar=sun
    fi

    grep '@(#).*com/cmd/lang/yacc/yaccpar' $file > /dev/null     
    if [ $? = 0 ]; then
      yaccpar=bison
    fi

    grep 'Bison parser' $file > /dev/null
    if [ $? = 0 ]; then
      yaccpar=bison
    fi
  
    if [ "$yaccpar" = "" ]; then
      echo "$this: cannot determine yaccpar type -- fix y.tab.c manually" >&2
      exit 1
    fi
    
    script=$path/$this.$yaccpar
  else
    script=$path/$this.h
  fi
  
  $sed -f $script $file | $static | $prefix > $target

  diff -D__cplusplus $file $target > y.tmp
  $sed -e 's!#else *__cplusplus$!#else!
  s!#endif *__cplusplus$!#endif /* __cplusplus */!' y.tmp > $file

done
rm -f y.tmp
exit 0
