#! /bin/sh
# $Id$
# adapt yacc template for C++ use

# Copyright (C) 1995 Technische Universitaet Braunschweig, Germany.
# Written by Andreas Zeller <zeller@gnu.org>.
# 
# This file is part of DDD.
# 
# DDD 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 3 of the License, or (at your option) any later version.
# 
# DDD 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 DDD -- see the file COPYING.
# If not, see <http://www.gnu.org/licenses/>.
# 
# DDD is the data display debugger.
# For details, see the DDD World-Wide-Web page, 
# `http://www.gnu.org/software/ddd/',
# or send a mail to the DDD developers <ddd@gnu.org>.

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!g"
  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.cc;;
    y.tab.h) target=y.tab.hh;;
  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 'Bison parser' $file > /dev/null
    if [ $? = 0 ]; then
      yaccpar=bison
    fi
  
    if [ "$yaccpar" = "" ]; then
      echo "$this: cannot determine yaccpar type -- reverting to bison" >&2
      yaccpar=bison
    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
