# $Id$
# Adapt YACC output for C++ usage
# (Happens to be working on my Sun using SunOS 4.1.1)

# 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>.

# Declare functions
1i\
// This file was modified for -*- C++ -*-\
// using $RCSfile$ $Revision$\
extern void yyerror(const char *s);\
extern int yylex();\

# Undeclare malloc and realloc (not needed in C++ version)
s!extern char \*malloc(), \*realloc();!// &!

# Adapt yytoks[] to disable warnings
\!^yytoktype!,\!^}!s![^,]*,[^,]*!{&}!

# Make YYSTYPE a struct such that we can store class objects
# (use anonymous unions to save space!)
s!^typedef union\(.*\)$!typedef struct _YYSTYPE \1!

# Make sure we use new/delete instead of malloc/free
# (a MUST if we use class objects)

# (y*)malloc(x*sizeof(y)) -> new x[y]
s!([^\*]*\* *) *malloc *(\([^\*]*\)\* *sizeof *(\([^)]*\)) *)!new \2[\1]!g

# free(x) -> delete[] x
s!free *(\([^)]*\))!delete[] \1!g

# realloc -> own code
\!.*yymaxdepth += YYMAXDEPTH!,\!}!c\
			int new_yymaxdepth = yymaxdepth + YYMAXDEPTH;\
			YYSTYPE *new_yyv = new YYSTYPE [new_yymaxdepth];\
			int *new_yys = new int [new_yymaxdepth];\
			if (new_yyv == 0 || new_yys == 0)\
			{\
				yyerror( "yacc stack overflow" );\
				return(1);\
			}\
			for (unsigned yycopy = 0; yycopy < yymaxdepth; \
			     yycopy++)\
			{\
				new_yyv[yycopy] = yyv[yycopy];\
				new_yys[yycopy] = yys[yycopy];\
			}\
			yymaxdepth = new_yymaxdepth;\
			delete[] yyv; yyv = new_yyv;\
			delete[] yys; yys = new_yys;
