Files
harbour-core/harbour/include/hbmacro.h
Przemyslaw Czerpak 8d38c093b4 2006-11-17 13:30 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/include/hbapi.h
  * harbour/source/common/hbstr.c
  * harbour/source/compiler/harbour.l
  * harbour/source/macro/macro.l
  * harbour/source/macro/macro.slx
  * harbour/source/compiler/harbour.slx
    * changed parameters in function: hb_compStrToNum() now the string
      size is passed explicitly so it can work with strings which does
      not have trailing ASCII NUL character.

  * harbour/source/macro/macro.y
    * indenting

  * harbour/include/hbmacro.h
  * harbour/source/common/hbstr.c
  * harbour/source/macro/macro.l
  * harbour/source/macro/macro.y
    * added two new functions for macro compiler: hb_macroLexNew() and
      hb_macroLexDelete() to clearly separate lexer from grammar parser.

  * harbour/source/compiler/harbour.l
  * harbour/source/common/hbstr.c
  * harbour/source/pp/ppcore.c
    * added error generation for wrong e"..." strings and fixed \" quoting
    * removed \q quoting

  * harbour/source/pp/ppcore.c
  * harbour/source/pp/ppgen.c
    * added small description in headers

  * harbour/common.mak
  * harbour/source/pp/Makefile
  * harbour/source/pp/pplib.c
  + harbour/source/pp/pplib2.c
  * harbour/include/hbextern.ch
    + added auto destructor for allocated PP context, it's not longer
      necessary to execute __PP_FREE() so this function was moved from
      the standard .prg API to file with backward compatible functions
    * changed __PREPROCESS() to __PP_PROCESS()
    * moved setting std rules to separate file so now if user uses PP
      with only his own rules we are not forcing linking static tables
      which are quite huge (over 100kb)
      To include stdandard rules in static binaries user should add
      to his code:
         REQUEST __PP_STDRULES

  + harbour/source/pp/pplib3.c
    * old PP functions for backward compatibility:
         __PPADDRULE(), __PREPROCESS(), __PP_FREE()
      Please note that using this function is not MT safe. They should
      work like with old PP code. Using any of this function automatically
      forces linking __PP_STDRULES
2006-11-17 12:29:24 +00:00

162 lines
7.0 KiB
C

/*
* $Id$
*/
/*
* Harbour Project source code:
* Header file for the Macro compiler
*
* Copyright 1999 Ryszard Glab
* www - http://www.harbour-project.org
*
* This program 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 2, or (at your option)
* any later version.
*
* This program 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 this software; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307 USA (or visit the web site http://www.gnu.org/).
*
* As a special exception, the Harbour Project gives permission for
* additional uses of the text contained in its release of Harbour.
*
* The exception is that, if you link the Harbour libraries with other
* files to produce an executable, this does not by itself cause the
* resulting executable to be covered by the GNU General Public License.
* Your use of that executable is in no way restricted on account of
* linking the Harbour library code into it.
*
* This exception does not however invalidate any other reasons why
* the executable file might be covered by the GNU General Public License.
*
* This exception applies only to the code released by the Harbour
* Project under the name Harbour. If you copy code from other
* Harbour Project or Free Software Foundation releases into a copy of
* Harbour, as the General Public License permits, the exception does
* not apply to the code that you add in this way. To avoid misleading
* anyone as to the status of such modified files, you must delete
* this exception notice from them.
*
* If you write modifications of your own for Harbour, it is your choice
* whether to permit this exception to apply to your modifications.
* If you do not wish that, delete this exception notice.
*
*/
#ifndef HB_MACRO_H_
#define HB_MACRO_H_
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <ctype.h>
#include <time.h>
/* Standard parameters passed to macro aware functions
*/
#define HB_BISON_PTR void *
#define HB_MACRO_PARAM pMacro
#define HB_MACRO_DECL HB_BISON_PTR HB_MACRO_PARAM
#include "hbapi.h"
#include "hbapiitm.h"
#include "hbapierr.h"
#include "hbvm.h"
#include "hbexprop.h"
#include "hbpcode.h"
#include "hbmacro.ch"
HB_EXTERN_BEGIN
/* flags for compilation process
*/
#define HB_MACRO_GEN_PUSH 1 /* generate PUSH pcodes */
#define HB_MACRO_GEN_POP 2 /* generate POP pcodes */
#define HB_MACRO_GEN_ALIASED 4 /* force aliased variable */
#define HB_MACRO_GEN_TYPE 8 /* check the type of expression (from TYPE() function) */
#define HB_MACRO_GEN_PARE 16 /* generate parentesized list */
#define HB_MACRO_GEN_LIST 32 /* generate push operation for every comma separated expressions */
#define HB_MACRO_DEALLOCATE 128 /* macro structure is allocated on the heap */
/* values returned from compilation process
*/
#define HB_MACRO_OK 0 /* macro compiled successfully */
#define HB_MACRO_FAILURE 1 /* syntax error */
/* additional status of compilation
*/
#define HB_MACRO_CONT 1 /* everything is OK so far */
#define HB_MACRO_TOO_COMPLEX 2 /* compiled expression is too complex */
#define HB_MACRO_UDF 4 /* code uses UDF function (info used by TYPE function) */
#define HB_MACRO_UNKN_SYM 8 /* requested symbol was not found in runtime symbol table */
#define HB_MACRO_UNKN_VAR 16 /* requested variable doesn't exist */
/* Global functions
*/
extern void hb_macroError( int iError, HB_BISON_PTR pMacro );
extern int hb_macroYYParse( HB_MACRO_PTR pMacro );
extern ULONG hb_macroSetMacro( BOOL bSet, ULONG ulFlag );
extern ULONG hb_macroAutoSetMacro( ULONG ulFlag );
extern BOOL hb_macroLexNew( HB_MACRO_PTR pMacro );
extern void hb_macroLexDelete( HB_MACRO_PTR pMacro );
extern void hb_compGenPCode1( BYTE byte, HB_BISON_PTR pMacro );
extern void hb_compGenPData1( BYTE byte, HB_BISON_PTR pMacro );
extern void hb_compGenPCode2( BYTE byte1, BYTE byte2, HB_BISON_PTR pMacro );
extern void hb_compGenPCode3( BYTE byte1, BYTE byte2, BYTE byte3, HB_BISON_PTR pMacro );
extern void hb_compGenPCode4( BYTE byte1, BYTE byte2, BYTE byte3, BYTE byte4, HB_BISON_PTR pMacro );
extern void hb_compGenPCodeN( BYTE * pBuffer, ULONG ulSize, HB_BISON_PTR pMacro );
/* Size of pcode buffer incrementation
*/
#define HB_PCODE_SIZE 512
/* Bison requires (void *) pointer - some code needs HB_MACRO_PTR pointer
*/
#define HB_MACRO_DATA ( (HB_MACRO_PTR) HB_MACRO_PARAM )
#define HB_PCODE_DATA ( HB_MACRO_DATA->pCodeInfo )
/* Declarations for functions macro.c */
extern int hb_compLocalVarGetPos( char * szVarName, HB_BISON_PTR pMacro );
extern ULONG hb_compGenJump( LONG lOffset, HB_BISON_PTR pMacro );
extern ULONG hb_compGenJumpFalse( LONG lOffset, HB_BISON_PTR pMacro );
extern void hb_compGenJumpThere( ULONG ulFrom, ULONG ulTo, HB_BISON_PTR pMacro );
extern void hb_compGenJumpHere( ULONG ulOffset, HB_BISON_PTR pMacro );
extern ULONG hb_compGenJumpTrue( LONG lOffset, HB_BISON_PTR pMacro );
extern void hb_compMemvarGenPCode( BYTE bPCode, char * szVarName, HB_BISON_PTR pMacro );
extern void hb_compGenPushSymbol( char * szSymbolName, BOOL bFunction, BOOL bAlias, HB_BISON_PTR pMacro );
extern void hb_compGenPushLong( HB_LONG lNumber, HB_BISON_PTR pMacro );
extern void hb_compGenPushDate( HB_LONG lNumber, HB_BISON_PTR pMacro );
extern void hb_compGenMessage( char * szMsgName, BOOL bIsObject, HB_BISON_PTR pMacro );
extern void hb_compGenMessageData( char * szMsg, BOOL bIsObject, HB_BISON_PTR pMacro );
extern void hb_compGenPopVar( char * szVarName, HB_BISON_PTR pMacro );
extern void hb_compGenPopAliasedVar( char * szVarName,
BOOL bPushAliasValue,
char * szAlias,
long lWorkarea, HB_BISON_PTR pMacro );
extern void hb_compGenPushVar( char * szVarName, BOOL bMacroVar, HB_BISON_PTR pMacro );
extern void hb_compGenPushVarRef( char * szVarName, HB_BISON_PTR pMacro );
extern void hb_compGenPushAliasedVar( char * szVarName,
BOOL bPushAliasValue,
char * szAlias,
long lWorkarea, HB_BISON_PTR pMacro );
extern void hb_compGenPushLogical( int iTrueFalse, HB_BISON_PTR pMacro );
extern void hb_compGenPushDouble( double dNumber, BYTE bWidth, BYTE bDec, HB_BISON_PTR pMacro );
extern void hb_compGenPushFunCall( char * szFunName, HB_BISON_PTR pMacro );
extern void hb_compGenPushString( char * szText, ULONG ulStrLen, HB_BISON_PTR pMacro );
extern void hb_compCodeBlockStart( HB_BISON_PTR pMacro );
extern void hb_compCodeBlockEnd( HB_BISON_PTR pMacro );
HB_EXTERN_END
#endif /* HB_MACRO_H_ */