From 6f4309fb1e18891aa02fb231f306a1115d4ddac8 Mon Sep 17 00:00:00 2001 From: Norbert Thiebaud Date: Fri, 19 Aug 2011 20:31:38 -0500 Subject: use native yacc/bison support in rsc rather than a sub-make --- rsc/Executable_rsc.mk | 16 ++- rsc/Module_rsc.mk | 1 - rsc/inc/rsclex.hxx | 131 ++++++++++++++++++++ rsc/source/parser/Makefile | 36 ------ rsc/source/parser/rscibas.cxx | 4 +- rsc/source/parser/rscicpx.cxx | 4 +- rsc/source/parser/rscinit.cxx | 4 +- rsc/source/parser/rsclex.cxx | 4 +- rsc/source/parser/rsclex.hxx | 131 -------------------- rsc/source/parser/rscyacc.cxx | 270 ------------------------------------------ rsc/source/parser/rscyacc.y | 246 +++++++++++++++++++++++++++++++++++++- 11 files changed, 394 insertions(+), 453 deletions(-) create mode 100644 rsc/inc/rsclex.hxx delete mode 100644 rsc/source/parser/Makefile delete mode 100644 rsc/source/parser/rsclex.hxx delete mode 100644 rsc/source/parser/rscyacc.cxx diff --git a/rsc/Executable_rsc.mk b/rsc/Executable_rsc.mk index ec8945fea2e9..71b0cc07889c 100644 --- a/rsc/Executable_rsc.mk +++ b/rsc/Executable_rsc.mk @@ -28,13 +28,12 @@ $(eval $(call gb_Executable_Executable,rsc)) -$(eval $(call gb_Executable_add_package_headers,rsc,rsc_yacc)) $(eval $(call gb_Executable_set_include,rsc,\ $$(INCLUDE) \ - -I$(realpath $(SRCDIR)/rsc/inc) \ - -I$(realpath $(SRCDIR)/rsc/inc/pch) \ - -I$(realpath $(WORKDIR))/CustomTarget/rsc/source/parser \ + -I$(SRCDIR)/rsc/inc \ + -I$(SRCDIR)/rsc/inc/pch \ + -I$(WORKDIR)/GenCxxObject/rsc/source/parser \ )) $(eval $(call gb_Executable_add_api,rsc,\ @@ -54,6 +53,14 @@ $(eval $(call gb_Executable_add_linked_libs,rsc,\ $(gb_STDLIBS) \ )) +$(eval $(call gb_Executable_add_grammars,rsc,\ + rsc/source/parser/rscyacc, \ + rsc/source/parser/rscibas \ + rsc/source/parser/rscicpx \ + rsc/source/parser/rscinit \ + rsc/source/parser/rsclex \ +)) + $(eval $(call gb_Executable_add_exception_objects,rsc,\ rsc/source/misc/rscdbl \ rsc/source/misc/rsclst \ @@ -65,7 +72,6 @@ $(eval $(call gb_Executable_add_exception_objects,rsc,\ rsc/source/parser/rsckey \ rsc/source/parser/rsclex \ rsc/source/parser/rscpar \ - rsc/source/parser/rscyacc \ rsc/source/prj/gui \ rsc/source/prj/start \ rsc/source/res/rscall \ diff --git a/rsc/Module_rsc.mk b/rsc/Module_rsc.mk index 490e573ac502..8464c9327754 100644 --- a/rsc/Module_rsc.mk +++ b/rsc/Module_rsc.mk @@ -34,7 +34,6 @@ $(eval $(call gb_Module_add_targets,rsc,\ $(if $(filter DESKTOP,$(BUILD_TYPE)),$(eval $(call gb_Module_add_targets,rsc,\ Executable_rsc \ - Package_yacc \ ))) # vim: set noet sw=4 ts=4: diff --git a/rsc/inc/rsclex.hxx b/rsc/inc/rsclex.hxx new file mode 100644 index 000000000000..c861e89402f6 --- /dev/null +++ b/rsc/inc/rsclex.hxx @@ -0,0 +1,131 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org 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 Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#include + +#include +#include +#include + +// a buffer for unique strings +class StringContainer +{ + boost::unordered_set< rtl::OString, rtl::OStringHash > m_aStrings; +public: + StringContainer() {} + ~StringContainer() {} + + const char* putString( const char* pString ); +}; + + +enum MODE_ENUM { MODE_MODELESS, MODE_APPLICATIONMODAL, MODE_SYSTEMMODAL }; + +enum JUSTIFY_ENUM { JUST_CENTER, JUST_RIGHT, JUST_LEFT }; + +enum SHOW_ENUM { SHOW_NORMAL, SHOW_MINIMIZED, SHOW_MAXIMIZED }; + +enum ENUMHEADER { HEADER_NAME, HEADER_NUMBER }; + +enum REF_ENUM { TYPE_NOTHING, TYPE_REF, TYPE_COPY }; + +struct RSCHEADER { + RscTop * pClass; + RscExpType nName1; + REF_ENUM nTyp; + RscTop * pRefClass; + RscExpType nName2; +}; + +/************** O b j e c t s t a c k ************************************/ +struct Node { + Node* pPrev; + RSCINST aInst; + sal_uInt32 nTupelRec; // Rekursionstiefe fuer Tupel + Node() { pPrev = NULL; nTupelRec = 0; }; +}; + +class ObjectStack { + private : + Node* pRoot; + public : + + ObjectStack () { pRoot = NULL; } + + const RSCINST & Top () { return pRoot->aInst; } + sal_Bool IsEmpty() { return( pRoot == NULL ); } + void IncTupelRec() { pRoot->nTupelRec++; } + void DecTupelRec() { pRoot->nTupelRec--; } + sal_uInt32 TupelRecCount() const { return pRoot->nTupelRec; } + void Push( RSCINST aInst ) + { + Node* pTmp; + + pTmp = pRoot; + pRoot = new Node; + pRoot->aInst = aInst; + pRoot->pPrev = pTmp; + } + void Pop() + { + Node* pTmp; + + pTmp = pRoot; + pRoot = pTmp->pPrev; + delete pTmp; + } +}; + +/****************** F o r w a r d s **************************************/ +#if defined( RS6000 ) +extern "C" int yyparse(); // forward Deklaration fuer erzeugte Funktion +extern "C" void yyerror( char * ); +extern "C" int yylex( void ); +#elif defined ( SOLARIS ) +extern "C" int yyparse(); // forward Deklaration fuer erzeugte Funktion +extern "C" void yyerror( const char * ); +extern "C" int yylex( void ); +#else +#if defined ( GCC ) || (_MSC_VER >= 1400) +int yyparse(); // forward Deklaration fuer erzeugte Funktion +#else +yyparse(); // forward Deklaration fuer erzeugte Funktion +#endif +void yyerror( char * ); +int yylex( void ); +#endif + +class RscTypCont; +class RscFileInst; + +extern RscTypCont* pTC; +extern RscFileInst * pFI; +extern RscExpression * pExp; +extern ObjectStack S; +extern StringContainer* pStringContainer; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/rsc/source/parser/Makefile b/rsc/source/parser/Makefile deleted file mode 100644 index 29039d8729aa..000000000000 --- a/rsc/source/parser/Makefile +++ /dev/null @@ -1,36 +0,0 @@ -# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- -# Version: MPL 1.1 / GPLv3+ / LGPLv3+ -# -# The contents of this file are subject to the Mozilla Public License Version -# 1.1 (the "License"); you may not use this file except in compliance with -# the License or as specified alternatively below. You may obtain a copy of -# the License at http://www.mozilla.org/MPL/ -# -# Software distributed under the License is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -# for the specific language governing rights and limitations under the -# License. -# -# The Initial Developer of the Original Code is -# Matúš Kukan -# Portions created by the Initial Developer are Copyright (C) 2011 the -# Initial Developer. All Rights Reserved. -# -# Major Contributor(s): -# -# For minor contributions see the git repository. -# -# Alternatively, the contents of this file may be used under the terms of -# either the GNU General Public License Version 3 or later (the "GPLv3+"), or -# the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"), -# in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable -# instead of those above. - -BISON := bison - -all : yyrscyacc.cxx -yyrscyacc.cxx : $(realpath $(SRC_ROOT)/rsc/source/parser/rscyacc.y) - $(BISON) -d -o $@ $< - -.PHONY: all -# vim: set noet sw=4 ts=4: diff --git a/rsc/source/parser/rscibas.cxx b/rsc/source/parser/rscibas.cxx index f2456cfca257..057c338e778e 100644 --- a/rsc/source/parser/rscibas.cxx +++ b/rsc/source/parser/rscibas.cxx @@ -47,8 +47,8 @@ #include -#include "rsclex.hxx" -#include +#include +#include #include diff --git a/rsc/source/parser/rscicpx.cxx b/rsc/source/parser/rscicpx.cxx index 072f1f085649..e915445de107 100644 --- a/rsc/source/parser/rscicpx.cxx +++ b/rsc/source/parser/rscicpx.cxx @@ -43,8 +43,8 @@ #include #include -#include "rsclex.hxx" -#include +#include +#include /************************************************************************* |* RscTypCont::InsWinBit() diff --git a/rsc/source/parser/rscinit.cxx b/rsc/source/parser/rscinit.cxx index c16c9826dbf7..259c6f38edec 100644 --- a/rsc/source/parser/rscinit.cxx +++ b/rsc/source/parser/rscinit.cxx @@ -51,8 +51,8 @@ #include #include -#include "rsclex.hxx" -#include +#include +#include /****************** M a c r o s ******************************************/ #define INS_WINBIT( pClass, WinBit ) \ diff --git a/rsc/source/parser/rsclex.cxx b/rsc/source/parser/rsclex.cxx index e9e4a0ebb9d0..db3d794ee1ec 100644 --- a/rsc/source/parser/rsclex.cxx +++ b/rsc/source/parser/rsclex.cxx @@ -44,8 +44,8 @@ #include #include -#include "rsclex.hxx" -#include +#include +#include #include #include diff --git a/rsc/source/parser/rsclex.hxx b/rsc/source/parser/rsclex.hxx deleted file mode 100644 index c861e89402f6..000000000000 --- a/rsc/source/parser/rsclex.hxx +++ /dev/null @@ -1,131 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org 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 Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ -#include - -#include -#include -#include - -// a buffer for unique strings -class StringContainer -{ - boost::unordered_set< rtl::OString, rtl::OStringHash > m_aStrings; -public: - StringContainer() {} - ~StringContainer() {} - - const char* putString( const char* pString ); -}; - - -enum MODE_ENUM { MODE_MODELESS, MODE_APPLICATIONMODAL, MODE_SYSTEMMODAL }; - -enum JUSTIFY_ENUM { JUST_CENTER, JUST_RIGHT, JUST_LEFT }; - -enum SHOW_ENUM { SHOW_NORMAL, SHOW_MINIMIZED, SHOW_MAXIMIZED }; - -enum ENUMHEADER { HEADER_NAME, HEADER_NUMBER }; - -enum REF_ENUM { TYPE_NOTHING, TYPE_REF, TYPE_COPY }; - -struct RSCHEADER { - RscTop * pClass; - RscExpType nName1; - REF_ENUM nTyp; - RscTop * pRefClass; - RscExpType nName2; -}; - -/************** O b j e c t s t a c k ************************************/ -struct Node { - Node* pPrev; - RSCINST aInst; - sal_uInt32 nTupelRec; // Rekursionstiefe fuer Tupel - Node() { pPrev = NULL; nTupelRec = 0; }; -}; - -class ObjectStack { - private : - Node* pRoot; - public : - - ObjectStack () { pRoot = NULL; } - - const RSCINST & Top () { return pRoot->aInst; } - sal_Bool IsEmpty() { return( pRoot == NULL ); } - void IncTupelRec() { pRoot->nTupelRec++; } - void DecTupelRec() { pRoot->nTupelRec--; } - sal_uInt32 TupelRecCount() const { return pRoot->nTupelRec; } - void Push( RSCINST aInst ) - { - Node* pTmp; - - pTmp = pRoot; - pRoot = new Node; - pRoot->aInst = aInst; - pRoot->pPrev = pTmp; - } - void Pop() - { - Node* pTmp; - - pTmp = pRoot; - pRoot = pTmp->pPrev; - delete pTmp; - } -}; - -/****************** F o r w a r d s **************************************/ -#if defined( RS6000 ) -extern "C" int yyparse(); // forward Deklaration fuer erzeugte Funktion -extern "C" void yyerror( char * ); -extern "C" int yylex( void ); -#elif defined ( SOLARIS ) -extern "C" int yyparse(); // forward Deklaration fuer erzeugte Funktion -extern "C" void yyerror( const char * ); -extern "C" int yylex( void ); -#else -#if defined ( GCC ) || (_MSC_VER >= 1400) -int yyparse(); // forward Deklaration fuer erzeugte Funktion -#else -yyparse(); // forward Deklaration fuer erzeugte Funktion -#endif -void yyerror( char * ); -int yylex( void ); -#endif - -class RscTypCont; -class RscFileInst; - -extern RscTypCont* pTC; -extern RscFileInst * pFI; -extern RscExpression * pExp; -extern ObjectStack S; -extern StringContainer* pStringContainer; - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/rsc/source/parser/rscyacc.cxx b/rsc/source/parser/rscyacc.cxx deleted file mode 100644 index f812523d9dc1..000000000000 --- a/rsc/source/parser/rscyacc.cxx +++ /dev/null @@ -1,270 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org 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 Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_rsc.hxx" -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "rsclex.hxx" - -/************** V a r i a b l e n ****************************************/ -ObjectStack S; -RscTop * pCurClass; -sal_uInt32 nCurMask; -char szErrBuf[ 100 ]; - -/************** H i l f s F u n k t i o n e n ****************************/ -RSCINST GetVarInst( const RSCINST & rInst, const char * pVarName ) -{ - RSCINST aInst; - - aInst = rInst.pClass->GetVariable( rInst, pHS->getID( pVarName ), - RSCINST() ); - - if( !aInst.pData ) - pTC->pEH->Error( ERR_NOVARIABLENAME, rInst.pClass, RscId() ); - - return( aInst ); -} - -void SetNumber( const RSCINST & rInst, const char * pVarName, sal_Int32 lValue ) -{ - RSCINST aInst; - - aInst = GetVarInst( rInst, pVarName ); - - if( aInst.pData ){ - ERRTYPE aError; - aError = aInst.pClass->SetNumber( aInst, lValue ); - - if( aError.IsError() ) - pTC->pEH->Error( aError, aInst.pClass, RscId() ); - } -} - -void SetConst( const RSCINST & rInst, const char * pVarName, - Atom nValueId, sal_Int32 nVal ) -{ - RSCINST aInst; - - aInst = GetVarInst( rInst, pVarName ); - if( aInst.pData ) - { - ERRTYPE aError; - aError = aInst.pClass->SetConst( aInst, nValueId, nVal ); - - if( aError.IsError() ) - pTC->pEH->Error( aError, aInst.pClass, RscId() ); - } -} - -void SetString( const RSCINST & rInst, const char * pVarName, const char * pStr ) -{ - RSCINST aInst; - - aInst = GetVarInst( rInst, pVarName ); - if( aInst.pData ){ - ERRTYPE aError; - aError = aInst.pClass->SetString( aInst, pStr ); - - if( aError.IsError() ) - pTC->pEH->Error( aError, aInst.pClass, RscId() ); - } -} - -RscId MakeRscId( RscExpType aExpType ) -{ - if( !aExpType.IsNothing() ) - { - sal_Int32 lValue(0); - - if( !aExpType.Evaluate( &lValue ) ) - pTC->pEH->Error( ERR_ZERODIVISION, NULL, RscId() ); - if( lValue < 1 || lValue > (sal_Int32)0x7FFF ) - { - pTC->pEH->Error( ERR_IDRANGE, NULL, RscId(), - rtl::OString::valueOf(lValue).getStr() ); - } - - if( aExpType.IsDefinition() ) - return RscId( aExpType.aExp.pDef ); - else - return RscId( lValue ); - } - return RscId(); -} - -sal_Bool DoClassHeader( RSCHEADER * pHeader, sal_Bool bMember ) -{ - RSCINST aCopyInst; - RscId aName1 = MakeRscId( pHeader->nName1 ); - RscId aName2 = MakeRscId( pHeader->nName2 ); - - if( pHeader->pRefClass ) - aCopyInst.pClass = pHeader->pRefClass; - else - aCopyInst.pClass = pHeader->pClass; - - if( TYPE_COPY == pHeader->nTyp ) - { - ObjNode * pCopyObj = aCopyInst.pClass->GetObjNode( aName2 ); - - if( !pCopyObj ) - { - ByteString aMsg( pHS->getString( aCopyInst.pClass->GetId() ) ); - aMsg += ' '; - aMsg += aName2.GetName(); - pTC->pEH->Error( ERR_NOCOPYOBJ, pHeader->pClass, aName1, - aMsg.GetBuffer() ); - } - else - aCopyInst.pData = pCopyObj->GetRscObj(); - } - - if( bMember ) - { - // Angabe von Superklassen oder abgeleiteten Klassen ist jetzt erlaubt - if( S.Top().pClass->InHierarchy( pHeader->pClass ) - || pHeader->pClass->InHierarchy( S.Top().pClass) ) - { - if( aCopyInst.IsInst() ) - { - RSCINST aTmpI( S.Top() ); - aTmpI.pClass->Destroy( aTmpI ); - aTmpI.pClass->Create( &aTmpI, aCopyInst ); - }; - } - else - pTC->pEH->Error( ERR_FALSETYPE, S.Top().pClass, aName1, - pHS->getString( pHeader->pClass->GetId() ) ); - } - else - { - if( S.IsEmpty() ) - { - if( (sal_Int32)aName1 < 256 ) - pTC->pEH->Error( WRN_GLOBALID, pHeader->pClass, aName1 ); - - if( aCopyInst.IsInst() ) - S.Push( pHeader->pClass->Create( NULL, aCopyInst ) ); - else - S.Push( pHeader->pClass->Create( NULL, RSCINST() ) ); - - ObjNode * pNode = new ObjNode( aName1, S.Top().pData, - pFI->GetFileIndex() ); - pTC->pEH->StdOut( ".", RscVerbosityVerbose ); - - if( !aName1.IsId() ) - pTC->pEH->Error( ERR_IDEXPECTED, pHeader->pClass, aName1 ); - else if( !pHeader->pClass->PutObjNode( pNode ) ) - pTC->pEH->Error( ERR_DOUBLEID, pHeader->pClass, aName1 ); - } - else - { - RSCINST aTmpI; - ERRTYPE aError; - - if( (sal_Int32)aName1 >= 256 && aName1.IsId() ) - pTC->pEH->Error( WRN_LOCALID, pHeader->pClass, aName1 ); - aError = S.Top().pClass->GetElement( S.Top(), aName1, - pHeader->pClass, aCopyInst, &aTmpI ); - - if( aError.IsWarning() ) - pTC->pEH->Error( aError, pHeader->pClass, aName1 ); - else if( aError.IsError() ) - { - if( ERR_CONT_INVALIDTYPE == aError ) - pTC->pEH->Error( aError, S.Top().pClass, aName1, - pHS->getString( pHeader->pClass->GetId() ) ); - else - pTC->pEH->Error( aError, S.Top().pClass, aName1 ); - S.Top().pClass->GetElement( S.Top(), RscId(), - pHeader->pClass, RSCINST(), &aTmpI ); - - if( !aTmpI.IsInst() ) - return( sal_False ); - } - S.Push( aTmpI ); - }; - }; - if( TYPE_REF == pHeader->nTyp ) - { - ERRTYPE aError; - - aError = S.Top().pClass->SetRef( S.Top(), aName2 ); - pTC->pEH->Error( aError, S.Top().pClass, aName1 ); - } - - return( sal_True ); -} - -RSCINST GetFirstTupelEle( const RSCINST & rTop ) -{ // Aufwaertskompatible, Tupel probieren - RSCINST aInst; - ERRTYPE aErr; - - aErr = rTop.pClass->GetElement( rTop, RscId(), NULL, RSCINST(), &aInst ); - if( !aErr.IsError() ) - aInst = aInst.pClass->GetTupelVar( aInst, 0, RSCINST() ); - return aInst; -} - -/************** Y a c c C o d e ****************************************/ -//#define YYDEBUG 1 - -#define TYPE_Atom 0 -#define TYPE_RESID 1 - -#ifdef UNX -#define YYMAXDEPTH 2000 -#else -#define YYMAXDEPTH 800 -#endif - -#if defined _MSC_VER -#pragma warning(push, 1) -#pragma warning(disable:4129 4273 4701 4702) -#endif -#include "yyrscyacc.cxx" -#if defined _MSC_VER -#pragma warning(pop) -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/rsc/source/parser/rscyacc.y b/rsc/source/parser/rscyacc.y index 24240d184236..3477fdcc2c35 100644 --- a/rsc/source/parser/rscyacc.y +++ b/rsc/source/parser/rscyacc.y @@ -1,3 +1,5 @@ +%{ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /************************************************************************* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. @@ -25,9 +27,244 @@ * ************************************************************************/ -%{ +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_rsc.hxx" +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +/************** V a r i a b l e n ****************************************/ +ObjectStack S; +RscTop * pCurClass; +sal_uInt32 nCurMask; +char szErrBuf[ 100 ]; + +/************** H i l f s F u n k t i o n e n ****************************/ +RSCINST GetVarInst( const RSCINST & rInst, const char * pVarName ) +{ + RSCINST aInst; + + aInst = rInst.pClass->GetVariable( rInst, pHS->getID( pVarName ), + RSCINST() ); + + if( !aInst.pData ) + pTC->pEH->Error( ERR_NOVARIABLENAME, rInst.pClass, RscId() ); + + return( aInst ); +} + +void SetNumber( const RSCINST & rInst, const char * pVarName, sal_Int32 lValue ) +{ + RSCINST aInst; + + aInst = GetVarInst( rInst, pVarName ); + + if( aInst.pData ){ + ERRTYPE aError; + aError = aInst.pClass->SetNumber( aInst, lValue ); + + if( aError.IsError() ) + pTC->pEH->Error( aError, aInst.pClass, RscId() ); + } +} + +void SetConst( const RSCINST & rInst, const char * pVarName, + Atom nValueId, sal_Int32 nVal ) +{ + RSCINST aInst; + + aInst = GetVarInst( rInst, pVarName ); + if( aInst.pData ) + { + ERRTYPE aError; + aError = aInst.pClass->SetConst( aInst, nValueId, nVal ); + + if( aError.IsError() ) + pTC->pEH->Error( aError, aInst.pClass, RscId() ); + } +} + +void SetString( const RSCINST & rInst, const char * pVarName, const char * pStr ) +{ + RSCINST aInst; + + aInst = GetVarInst( rInst, pVarName ); + if( aInst.pData ){ + ERRTYPE aError; + aError = aInst.pClass->SetString( aInst, pStr ); + + if( aError.IsError() ) + pTC->pEH->Error( aError, aInst.pClass, RscId() ); + } +} + +RscId MakeRscId( RscExpType aExpType ) +{ + if( !aExpType.IsNothing() ) + { + sal_Int32 lValue(0); + + if( !aExpType.Evaluate( &lValue ) ) + pTC->pEH->Error( ERR_ZERODIVISION, NULL, RscId() ); + if( lValue < 1 || lValue > (sal_Int32)0x7FFF ) + { + pTC->pEH->Error( ERR_IDRANGE, NULL, RscId(), + rtl::OString::valueOf(lValue).getStr() ); + } + + if( aExpType.IsDefinition() ) + return RscId( aExpType.aExp.pDef ); + else + return RscId( lValue ); + } + return RscId(); +} + +sal_Bool DoClassHeader( RSCHEADER * pHeader, sal_Bool bMember ) +{ + RSCINST aCopyInst; + RscId aName1 = MakeRscId( pHeader->nName1 ); + RscId aName2 = MakeRscId( pHeader->nName2 ); + + if( pHeader->pRefClass ) + aCopyInst.pClass = pHeader->pRefClass; + else + aCopyInst.pClass = pHeader->pClass; + + if( TYPE_COPY == pHeader->nTyp ) + { + ObjNode * pCopyObj = aCopyInst.pClass->GetObjNode( aName2 ); + + if( !pCopyObj ) + { + ByteString aMsg( pHS->getString( aCopyInst.pClass->GetId() ) ); + aMsg += ' '; + aMsg += aName2.GetName(); + pTC->pEH->Error( ERR_NOCOPYOBJ, pHeader->pClass, aName1, + aMsg.GetBuffer() ); + } + else + aCopyInst.pData = pCopyObj->GetRscObj(); + } + + if( bMember ) + { + // Angabe von Superklassen oder abgeleiteten Klassen ist jetzt erlaubt + if( S.Top().pClass->InHierarchy( pHeader->pClass ) + || pHeader->pClass->InHierarchy( S.Top().pClass) ) + { + if( aCopyInst.IsInst() ) + { + RSCINST aTmpI( S.Top() ); + aTmpI.pClass->Destroy( aTmpI ); + aTmpI.pClass->Create( &aTmpI, aCopyInst ); + }; + } + else + pTC->pEH->Error( ERR_FALSETYPE, S.Top().pClass, aName1, + pHS->getString( pHeader->pClass->GetId() ) ); + } + else + { + if( S.IsEmpty() ) + { + if( (sal_Int32)aName1 < 256 ) + pTC->pEH->Error( WRN_GLOBALID, pHeader->pClass, aName1 ); + + if( aCopyInst.IsInst() ) + S.Push( pHeader->pClass->Create( NULL, aCopyInst ) ); + else + S.Push( pHeader->pClass->Create( NULL, RSCINST() ) ); + + ObjNode * pNode = new ObjNode( aName1, S.Top().pData, + pFI->GetFileIndex() ); + pTC->pEH->StdOut( ".", RscVerbosityVerbose ); + + if( !aName1.IsId() ) + pTC->pEH->Error( ERR_IDEXPECTED, pHeader->pClass, aName1 ); + else if( !pHeader->pClass->PutObjNode( pNode ) ) + pTC->pEH->Error( ERR_DOUBLEID, pHeader->pClass, aName1 ); + } + else + { + RSCINST aTmpI; + ERRTYPE aError; + + if( (sal_Int32)aName1 >= 256 && aName1.IsId() ) + pTC->pEH->Error( WRN_LOCALID, pHeader->pClass, aName1 ); + aError = S.Top().pClass->GetElement( S.Top(), aName1, + pHeader->pClass, aCopyInst, &aTmpI ); + + if( aError.IsWarning() ) + pTC->pEH->Error( aError, pHeader->pClass, aName1 ); + else if( aError.IsError() ) + { + if( ERR_CONT_INVALIDTYPE == aError ) + pTC->pEH->Error( aError, S.Top().pClass, aName1, + pHS->getString( pHeader->pClass->GetId() ) ); + else + pTC->pEH->Error( aError, S.Top().pClass, aName1 ); + S.Top().pClass->GetElement( S.Top(), RscId(), + pHeader->pClass, RSCINST(), &aTmpI ); + + if( !aTmpI.IsInst() ) + return( sal_False ); + } + S.Push( aTmpI ); + }; + }; + if( TYPE_REF == pHeader->nTyp ) + { + ERRTYPE aError; + + aError = S.Top().pClass->SetRef( S.Top(), aName2 ); + pTC->pEH->Error( aError, S.Top().pClass, aName1 ); + } + + return( sal_True ); +} + +RSCINST GetFirstTupelEle( const RSCINST & rTop ) +{ // Aufwaertskompatible, Tupel probieren + RSCINST aInst; + ERRTYPE aErr; + + aErr = rTop.pClass->GetElement( rTop, RscId(), NULL, RSCINST(), &aInst ); + if( !aErr.IsError() ) + aInst = aInst.pClass->GetTupelVar( aInst, 0, RSCINST() ); + return aInst; +} + +/************** Y a c c C o d e ****************************************/ +//#define YYDEBUG 1 + +#define TYPE_Atom 0 +#define TYPE_RESID 1 + +#ifdef UNX +#define YYMAXDEPTH 2000 +#else +#define YYMAXDEPTH 800 +#endif + +#if defined _MSC_VER +#pragma warning(push, 1) +#pragma warning(disable:4129 4273 4701 4702) +#endif #if defined __GNUC__ -#pragma GCC system_header +#pragma GCC diagnostic ignored "-Wwrite-strings" #elif defined __SUNPRO_CC #pragma disable_warn #endif @@ -1113,6 +1350,11 @@ line_number } ; +%% +#if defined _MSC_VER +#pragma warning(pop) +#endif +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -- cgit