/**************************************************************
 *
 * 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.
 *
 *************************************************************/



#ifndef _CODEGEN_HXX
#define _CODEGEN_HXX

class SbiImage;
class SbiParser;
class SbModule;
#include "opcodes.hxx"
#include "buffer.hxx"

class SbiCodeGen { 				// Code-Erzeugung:
	SbiParser* pParser;			// fuer Fehlermeldungen, Line, Column etc.
	SbModule& rMod;				// aktuelles Modul
	SbiBuffer aCode;	  			// Code-Puffer
	short  nLine, nCol;			// Zeile, Spalte fuer Stmnt-Befehl
	short  nForLevel;			// #29955 for-Schleifen-Ebene
	sal_Bool bStmnt;				// sal_True: Statement-Opcode liegt an
public:
	SbiCodeGen( SbModule&, SbiParser*, short );
	SbiParser* GetParser() { return pParser; }
	SbModule& GetModule() { return rMod; }
	sal_uInt32 Gen( SbiOpcode );
	sal_uInt32 Gen( SbiOpcode, sal_uInt32 );
	sal_uInt32 Gen( SbiOpcode, sal_uInt32, sal_uInt32 );
	void Patch( sal_uInt32 o, sal_uInt32 v ){ aCode.Patch( o, v ); }
	void BackChain( sal_uInt32 off )	{ aCode.Chain( off );  }
	void Statement();
	void GenStmnt();			// evtl. Statement-Opcode erzeugen
	sal_uInt32 GetPC();
	sal_uInt32 GetOffset()				{ return GetPC() + 1; }
	void Save();

	// #29955 for-Schleifen-Ebene pflegen
	void IncForLevel( void ) { nForLevel++; }
	void DecForLevel( void ) { nForLevel--; }

	static sal_uInt32 calcNewOffSet( sal_uInt8* pCode, sal_uInt16 nOffset );
	static sal_uInt16 calcLegacyOffSet( sal_uInt8* pCode, sal_uInt32 nOffset );

};

template < class T, class S >
class PCodeBuffConvertor
{
	T m_nSize; //
	sal_uInt8* m_pStart;
	sal_uInt8* m_pCnvtdBuf;
	S m_nCnvtdSize; //

	//  Disable usual copying symantics and bodgy default ctor
	PCodeBuffConvertor();
	PCodeBuffConvertor(const PCodeBuffConvertor& );
	PCodeBuffConvertor& operator = ( const PCodeBuffConvertor& );
public:
	PCodeBuffConvertor( sal_uInt8* pCode, T nSize ): m_nSize( nSize ),  m_pStart( pCode ), m_pCnvtdBuf( NULL ), m_nCnvtdSize( 0 ){ convert(); }
	S GetSize(){ return m_nCnvtdSize; }
	void convert();
	// Caller owns the buffer returned
	sal_uInt8* GetBuffer() { return m_pCnvtdBuf; }
};

// #111897 PARAM_INFO flags start at 0x00010000 to not
// conflict with DefaultId in SbxParamInfo::nUserData
#define PARAM_INFO_PARAMARRAY		0x0010000
#define PARAM_INFO_WITHBRACKETS		0x0020000

#endif
