diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 10690d95f6..0c756113c9 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,42 @@ 2002-12-01 13:30 UTC+0100 Foo Bar */ +2007-04-12 13:55 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/include/hbpp.h + * harbour/include/hbcomp.h + * harbour/source/compiler/hbgenerr.c + * harbour/source/compiler/ppcomp.c + * harbour/source/pp/ppcore.c + * harbour/source/pp/pplib.c + * harbour/utils/hbpp/hbpp.c + * harbour/utils/hbpp/hbppcore.c + * harbour/utils/hbpp/hbppdef.h + * changed error and warning messages to const char * + + * harbour/source/compiler/genhrb.c + * rewritten to work on memory buffers and with new compiler code + + * harbour/include/hbcomp.h + * harbour/include/hbcompdf.h + * harbour/source/compiler/hbmain.c + * harbour/source/main/harbour.c + + added LANG_PORT_OBJ_BUF which allow to generate .hrb files into + memory buffers + + * harbour/source/compiler/hbcmplib.c + + added HB_COMPILEBUF() functions which returns compiled .hrb file + as string item + + * harbour/source/vm/runner.c + + added support for executing compiled .hrb files stored in string + items in __HRBRUN() function - it works just like in __HRBLOAD() + + * harbour/harbour.spec + * harbour/utils/hbrun/hbrun.prg + + added default include directories to hbrun + * use HB_COMPILEBUF() instead of HB_COMPILE() to eliminate temporary + files + 2007-04-12 11:14 UTC+0300 Chen Kedem * source/rtl/tget.prg ! Fix bug#1672233 - Picture masks for Logical GET variables. diff --git a/harbour/harbour.spec b/harbour/harbour.spec index ad6ccf5431..c8a02c9666 100644 --- a/harbour/harbour.spec +++ b/harbour/harbour.spec @@ -351,6 +351,7 @@ if [ "%{!?_with_static:1}" ] then unset HB_GTALLEG export L_USR="${CC_L_USR} -L${HB_LIB_INSTALL} -l%{name} -lncurses %{!?_without_gtsln:-lslang} %{!?_without_gpm:-lgpm} %{!?_without_x11:-L/usr/X11R6/%{_lib} -lX11}" + export PRG_USR="\"-D_DEFAULT_INC_DIR='${_DEFAULT_INC_DIR}'\" ${PRG_USR}" for utl in hbmake hbrun hbpp hbdoc do diff --git a/harbour/include/hbcomp.h b/harbour/include/hbcomp.h index b568cdd39f..5544fd81d8 100644 --- a/harbour/include/hbcomp.h +++ b/harbour/include/hbcomp.h @@ -179,8 +179,8 @@ extern void hb_compLoopKill( HB_COMP_DECL ); extern void hb_compRTVariableKill( HB_COMP_DECL ); extern void hb_compElseIfKill( HB_COMP_DECL ); -extern void hb_compGenError( HB_COMP_DECL, char * szErrors[], char cPrefix, int iError, const char * szError1, const char * szError2 ); /* generic parsing error management function */ -extern void hb_compGenWarning( HB_COMP_DECL, char * szWarnings[], char cPrefix, int iWarning, const char * szWarning1, const char * szWarning2); /* generic parsing warning management function */ +extern void hb_compGenError( HB_COMP_DECL, const char * szErrors[], char cPrefix, int iError, const char * szError1, const char * szError2 ); /* generic parsing error management function */ +extern void hb_compGenWarning( HB_COMP_DECL, const char * szWarnings[], char cPrefix, int iWarning, const char * szWarning1, const char * szWarning2); /* generic parsing warning management function */ extern BOOL hb_compForEachVarError( HB_COMP_DECL, char * ); /* checks if it is FOR EACH enumerator variable and generates a warning */ @@ -270,7 +270,7 @@ extern BOOL hb_compCheckUnclosedStru( HB_COMP_DECL ); #define HB_GEN_FUNC3( func, p1,p2,p3 ) hb_compGen##func( p1, p2, p3, HB_COMP_PARAM ) #define HB_GEN_FUNC4( func, p1,p2,p3,p4 ) hb_compGen##func( p1, p2, p3, p4, HB_COMP_PARAM ) -extern int compMain( int argc, char * argv[] ); +extern int hb_compMain( int argc, char * argv[], BYTE ** pBufPtr, ULONG * pulSize ); extern void hb_compExprLstDealloc( HB_COMP_DECL ); extern HB_EXPR_PTR hb_compExprGenStatement( HB_EXPR_PTR, HB_COMP_DECL ); @@ -331,12 +331,14 @@ extern void hb_compStripFuncLines( PFUNCTION pFunc ); /* output related functions defined in gen*.c */ extern void hb_compGenCCode( HB_COMP_DECL, PHB_FNAME ); /* generates the C language output */ +extern void hb_compGenPortObj( HB_COMP_DECL, PHB_FNAME ); /* generates the portable objects */ extern void hb_compGenILCode( HB_COMP_DECL, PHB_FNAME ); /* generates the .NET IL language output */ extern void hb_compGenJava( HB_COMP_DECL, PHB_FNAME ); /* generates the Java language output */ -extern void hb_compGenPortObj( HB_COMP_DECL, PHB_FNAME ); /* generates the portable objects */ extern void hb_compGenObj32( HB_COMP_DECL, PHB_FNAME ); /* generates OBJ 32 bits */ extern void hb_compGenCObj( HB_COMP_DECL, PHB_FNAME ); /* generates platform dependant object module */ +extern void hb_compGenBufPortObj( HB_COMP_DECL, BYTE ** pBufPtr, ULONG * pulSize ); /* generates the portable objects to memory buffer */ + extern void hb_compGenCRealCode( HB_COMP_DECL, PFUNCTION pFunc, FILE * yyc ); extern void hb_compGenCString( FILE * yyc, BYTE * pText, ULONG ulLen ); @@ -348,14 +350,14 @@ extern void hb_compIdentifierClose( HB_COMP_DECL ); /* release the table of iden /* global readonly variables used by compiler */ -extern char * hb_comp_szErrors[]; -extern char * hb_comp_szWarnings[]; +extern const char * hb_comp_szErrors[]; +extern const char * hb_comp_szWarnings[]; /* table with PCODEs' length */ -extern const BYTE hb_comp_pcode_len[]; +extern const BYTE hb_comp_pcode_len[]; /* file handle for error messages */ -extern FILE *hb_comp_errFile; +extern FILE * hb_comp_errFile; /* identifier types for hb_compIdentifierNew() */ #define HB_IDENT_STATIC 0 diff --git a/harbour/include/hbcompdf.h b/harbour/include/hbcompdf.h index 250187eadc..3f223d1ace 100644 --- a/harbour/include/hbcompdf.h +++ b/harbour/include/hbcompdf.h @@ -70,6 +70,7 @@ typedef enum LANG_OBJ32, /* DOS/Windows 32 bits */ LANG_JAVA, /* Java */ LANG_PORT_OBJ, /* Portable objects */ + LANG_PORT_OBJ_BUF, /* Portable objects in memory buffer */ LANG_OBJ_MODULE /* Platform dependant object module */ } LANGUAGES; /* supported Harbour output languages */ @@ -593,6 +594,9 @@ typedef struct _HB_COMP PHB_FNAME pOutPath; PHB_FNAME pPpoPath; + ULONG ulOutBufSize; /* memory output buffer size */ + BYTE * pOutBuf; /* memory output buffer address */ + ULONG lastLinePos; /* position of last opcode with line number */ int lastLine; /* last generated in PCODE line number */ int currLine; /* currently compiled line number */ diff --git a/harbour/include/hbpp.h b/harbour/include/hbpp.h index 7ba6850ca5..b3a44d36e9 100644 --- a/harbour/include/hbpp.h +++ b/harbour/include/hbpp.h @@ -92,7 +92,7 @@ typedef HB_PP_CLOSE_FUNC_( HB_PP_CLOSE_FUNC ); typedef HB_PP_CLOSE_FUNC * PHB_PP_CLOSE_FUNC; /* function to generate errors */ -#define HB_PP_ERROR_FUNC_( func ) void func( void *, char **, char, int, const char *, const char * ) +#define HB_PP_ERROR_FUNC_( func ) void func( void *, const char **, char, int, const char *, const char * ) typedef HB_PP_ERROR_FUNC_( HB_PP_ERROR_FUNC ); typedef HB_PP_ERROR_FUNC * PHB_PP_ERROR_FUNC; diff --git a/harbour/source/compiler/genhrb.c b/harbour/source/compiler/genhrb.c index ac56f0cee1..475f146612 100644 --- a/harbour/source/compiler/genhrb.c +++ b/harbour/source/compiler/genhrb.c @@ -9,6 +9,9 @@ * Copyright 1999 Eddie Runia * www - http://www.harbour-project.org * + * Copyright 2007 Przemyslaw Czerpak + * rewritten to work on memory buffers and with new compiler code + * * 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 of the License, or @@ -32,15 +35,104 @@ #define SYM_FUNC 1 /* Defined function */ #define SYM_EXTERN 2 /* Previously defined function */ +static PFUNCTION hb_compFirstFunc( HB_COMP_DECL ) +{ + PFUNCTION pFunc = HB_COMP_PARAM->functions.pFirst; + if( ! HB_COMP_PARAM->fStartProc ) + pFunc = pFunc->pNext; + return pFunc; +} + +static ULONG hb_compHrbSize( HB_COMP_DECL, ULONG * pulSymbols, ULONG * pulFunctions ) +{ + PFUNCTION pFunc; + PCOMSYMBOL pSym; + ULONG ulSize; + + * pulSymbols = * pulFunctions = 0; + + /* count total size */ + ulSize = 10; /* signature[4] + version[2] + symbols_number[4] */ + pSym = HB_COMP_PARAM->symbols.pFirst; + while( pSym ) + { + ( * pulSymbols )++; + ulSize += strlen( pSym->szName ) + 3; /* \0 + symscope[1] + symtype[1] */ + pSym = pSym->pNext; + } + ulSize += 4; /* functions_number[4] */ + /* Generate functions data */ + pFunc = hb_compFirstFunc( HB_COMP_PARAM ); + while( pFunc ) + { + ( * pulFunctions )++; + ulSize += strlen( pFunc->szName ) + 5 + pFunc->lPCodePos; /* \0 + func_size[4] + function_body */ + pFunc = pFunc->pNext; + } + + return ulSize; +} + +void hb_compGenBufPortObj( HB_COMP_DECL, BYTE ** pBufPtr, ULONG * pulSize ) +{ + PFUNCTION pFunc; + PCOMSYMBOL pSym; + ULONG ulSymbols, ulFunctions, ulLen; + BYTE * ptr; + + * pulSize = hb_compHrbSize( HB_COMP_PARAM, &ulSymbols, &ulFunctions ); + /* additional 0 byte is for passing buffer directly as string item */ + ptr = * pBufPtr = ( BYTE * ) hb_xgrab( * pulSize + 1 ); + + memcpy( ptr, "\300HRB", 4 ); /* signature */ + ptr += 4; + HB_PUT_LE_UINT16( ptr, 2 ); /* version number */ + ptr += 2; + + HB_PUT_LE_UINT32( ptr, ulSymbols ); /* number of symbols */ + ptr += 4; + /* generate the symbol table */ + pSym = HB_COMP_PARAM->symbols.pFirst; + while( pSym ) + { + ulLen = strlen( pSym->szName ) + 1; + memcpy( ptr, pSym->szName, ulLen ); + ptr += ulLen; + *ptr++ = pSym->cScope; + /* symbol type */ + /* if( hb_compFunctionFind( HB_COMP_PARAM, pSym->szName ) ) */ + if( pSym->cScope & HB_FS_LOCAL ) + *ptr++ = SYM_FUNC; /* function defined in this module */ + else if( hb_compFunCallFind( HB_COMP_PARAM, pSym->szName ) ) + *ptr++ = SYM_EXTERN; /* external function */ + else + *ptr++ = SYM_NOLINK; /* other symbol */ + pSym = pSym->pNext; + } + + HB_PUT_LE_UINT32( ptr, ulFunctions ); /* number of functions */ + ptr += 4; + /* generate functions data */ + pFunc = hb_compFirstFunc( HB_COMP_PARAM ); + while( pFunc ) + { + ulLen = strlen( pFunc->szName ) + 1; + memcpy( ptr, pFunc->szName, ulLen ); + ptr += ulLen; + HB_PUT_LE_UINT32( ptr, pFunc->lPCodePos ); /* function size */ + ptr += 4; + memcpy( ptr, pFunc->pCode, pFunc->lPCodePos ); /* function body */ + ptr += pFunc->lPCodePos; + pFunc = pFunc->pNext; + } +} + void hb_compGenPortObj( HB_COMP_DECL, PHB_FNAME pFileName ) { char szFileName[ _POSIX_PATH_MAX + 1 ]; - PFUNCTION pFunc /*= HB_COMP_PARAM->functions.pFirst*/; - PCOMSYMBOL pSym = HB_COMP_PARAM->symbols.pFirst; - ULONG lPCodePos; - LONG lSymbols; - ULONG ulCodeLength; - FILE * yyc; /* file handle for C output */ + ULONG ulSize; + BYTE * pHrbBody; + FILE * yyc; if( ! pFileName->szExtension ) pFileName->szExtension = ".hrb"; @@ -59,88 +151,12 @@ void hb_compGenPortObj( HB_COMP_DECL, PHB_FNAME pFileName ) fflush( stdout ); } - /* writes the symbol table */ - - lSymbols = 0; /* Count number of symbols */ - while( pSym ) - { - lSymbols++; - pSym = pSym->pNext; - } - fputc( ( BYTE ) 192, yyc ); - fputs( "HRB", yyc ); - fputc( 2, yyc ); - fputc( 0, yyc ); - - fputc( ( BYTE ) ( ( lSymbols ) & 255 ), yyc ); /* Write number symbols */ - fputc( ( BYTE ) ( ( lSymbols >> 8 ) & 255 ), yyc ); - fputc( ( BYTE ) ( ( lSymbols >> 16 ) & 255 ), yyc ); - fputc( ( BYTE ) ( ( lSymbols >> 24 ) & 255 ), yyc ); - - pSym = HB_COMP_PARAM->symbols.pFirst; - while( pSym ) - { - fputs( pSym->szName, yyc ); - fputc( 0, yyc ); - fputc( pSym->cScope, yyc ); - - /* specify the function address if it is a defined function or an - external called function */ - -#if 0 - if( hb_compFunctionFind( HB_COMP_PARAM, pSym->szName ) ) -#else - if( pSym->cScope & HB_FS_LOCAL ) -#endif - fputc( SYM_FUNC, yyc ); /* function defined in this module */ - else if( hb_compFunCallFind( HB_COMP_PARAM, pSym->szName ) ) - fputc( SYM_EXTERN, yyc ); /* external function */ - else - fputc( SYM_NOLINK, yyc ); /* other symbol */ - pSym = pSym->pNext; - } - - pFunc = HB_COMP_PARAM->functions.pFirst; - if( ! HB_COMP_PARAM->fStartProc ) - pFunc = pFunc->pNext; - - lSymbols = 0; /* Count number of symbols */ - while( pFunc ) - { - lSymbols++; - pFunc = pFunc->pNext; - } - fputc( ( BYTE ) ( ( lSymbols ) & 255 ), yyc ); /* Write number symbols */ - fputc( ( BYTE ) ( ( lSymbols >> 8 ) & 255 ), yyc ); - fputc( ( BYTE ) ( ( lSymbols >> 16 ) & 255 ), yyc ); - fputc( ( BYTE ) ( ( lSymbols >> 24 ) & 255 ), yyc ); - - /* Generate functions data - */ - pFunc = HB_COMP_PARAM->functions.pFirst; - if( ! HB_COMP_PARAM->fStartProc ) - pFunc = pFunc->pNext; - - while( pFunc ) - { - fputs( pFunc->szName, yyc ); - fputc( 0, yyc ); - ulCodeLength = pFunc->lPCodePos; - fputc( ( BYTE ) ( ( ulCodeLength ) & 255 ), yyc ); /* Write size */ - fputc( ( BYTE ) ( ( ulCodeLength >> 8 ) & 255 ), yyc ); - fputc( ( BYTE ) ( ( ulCodeLength >> 16 ) & 255 ), yyc ); - fputc( ( BYTE ) ( ( ulCodeLength >> 24 ) & 255 ), yyc ); - - lPCodePos = 0; - while( lPCodePos < pFunc->lPCodePos ) - fputc( pFunc->pCode[ lPCodePos++ ], yyc ); - - pFunc = pFunc->pNext; - } + hb_compGenBufPortObj( HB_COMP_PARAM, &pHrbBody, &ulSize ); + fwrite( pHrbBody, ulSize, 1, yyc ); + hb_xfree( pHrbBody ); fclose( yyc ); if( ! HB_COMP_PARAM->fQuiet ) printf( "Done.\n" ); } - diff --git a/harbour/source/compiler/hbcmplib.c b/harbour/source/compiler/hbcmplib.c index 7306c493ca..ddde920d0e 100644 --- a/harbour/source/compiler/hbcmplib.c +++ b/harbour/source/compiler/hbcmplib.c @@ -53,19 +53,83 @@ #include "hbapi.h" #include "hbcomp.h" -HB_FUNC( HB_COMPILE ) +static void hb_compGenArgList( int iFirst, int * pArgC, char *** pArgV ) { + PHB_ITEM pParam, pItem; + ULONG ul; int iPCount = hb_pcount(), argc = 0, i; - char ** argv, * szParam; + char ** argv; - argv = ( char ** ) hb_xgrab( sizeof( char * ) * ( iPCount + 1 ) ); - for( i = 1; i <= iPCount; ++i ) + for( i = iFirst; i <= iPCount; ++i ) { - szParam = hb_parc( i ); - if( szParam ) - argv[ argc++ ] = szParam; + pParam = hb_param( i, HB_IT_ARRAY | HB_IT_STRING ); + if( pParam ) + { + if( HB_IS_ARRAY( pParam ) ) + { + ul = hb_arrayLen( pParam ); + if( ul ) do + { + pItem = hb_arrayGetItemPtr( pParam, ul ); + if( pItem && HB_IS_STRING( pItem ) ) + ++argc; + } + while( --ul ); + } + else if( HB_IS_STRING( pParam ) ) + ++argc; + } + } + + argv = ( char ** ) hb_xgrab( sizeof( char * ) * ( argc + 1 ) ); + argc = 0; + for( i = iFirst; i <= iPCount; ++i ) + { + pParam = hb_param( i, HB_IT_ARRAY | HB_IT_STRING ); + if( pParam ) + { + if( HB_IS_ARRAY( pParam ) ) + { + ul = hb_arrayLen( pParam ); + if( ul ) do + { + pItem = hb_arrayGetItemPtr( pParam, ul ); + if( pItem && HB_IS_STRING( pItem ) ) + argv[ argc++ ] = hb_itemGetCPtr( pItem ); + } + while( --ul ); + } + else if( HB_IS_STRING( pParam ) ) + argv[ argc++ ] = hb_itemGetCPtr( pParam ); + } } argv[ argc ] = NULL; - hb_retni( compMain( argc, argv ) ); + + * pArgC = argc; + * pArgV = argv; +} + +HB_FUNC( HB_COMPILE ) +{ + int argc; + char ** argv; + + hb_compGenArgList( 1, &argc, &argv ); + + hb_retni( hb_compMain( argc, argv, NULL, NULL ) ); hb_xfree( argv ); } + +HB_FUNC( HB_COMPILEBUF ) +{ + int iResult, argc; + char ** argv; + BYTE * pBuffer; + ULONG ulLen; + + hb_compGenArgList( 1, &argc, &argv ); + iResult = hb_compMain( argc, argv, &pBuffer, &ulLen ); + hb_xfree( argv ); + if( iResult == EXIT_SUCCESS && pBuffer ) + hb_retclen_buffer( ( char * ) pBuffer, ulLen ); +} diff --git a/harbour/source/compiler/hbgenerr.c b/harbour/source/compiler/hbgenerr.c index 30a3ce6511..146d340556 100644 --- a/harbour/source/compiler/hbgenerr.c +++ b/harbour/source/compiler/hbgenerr.c @@ -29,7 +29,7 @@ #include "hbcomp.h" /* Table with parse errors */ -char * hb_comp_szErrors[] = +const char * hb_comp_szErrors[] = { "Statement not allowed outside of procedure or function", "Redefinition of procedure or function: '%s'", @@ -103,7 +103,7 @@ char * hb_comp_szErrors[] = /* NOTE: The first character stores the warning's level that triggers this * warning. The warning's level is set by -w command line option. */ -char * hb_comp_szWarnings[] = +const char * hb_comp_szWarnings[] = { "1Ambiguous reference: '%s'", "1Ambiguous reference, assuming memvar: '%s'", @@ -138,7 +138,7 @@ char * hb_comp_szWarnings[] = "0Invalid variable '%s' for enumerator message" }; -void hb_compGenError( HB_COMP_DECL, char * szErrors[], char cPrefix, int iError, const char * szError1, const char * szError2 ) +void hb_compGenError( HB_COMP_DECL, const char * szErrors[], char cPrefix, int iError, const char * szError1, const char * szError2 ) { if( !HB_COMP_PARAM->fExit && ( cPrefix == 'F' || !HB_COMP_PARAM->fError ) ) { @@ -164,9 +164,9 @@ void hb_compGenError( HB_COMP_DECL, char * szErrors[], char cPrefix, int iError, } } -void hb_compGenWarning( HB_COMP_DECL, char * szWarnings[], char cPrefix, int iWarning, const char * szWarning1, const char * szWarning2) +void hb_compGenWarning( HB_COMP_DECL, const char * szWarnings[], char cPrefix, int iWarning, const char * szWarning1, const char * szWarning2) { - char * szText = szWarnings[ iWarning - 1 ]; + const char * szText = szWarnings[ iWarning - 1 ]; if( !HB_COMP_PARAM->fExit && ( szText[ 0 ] - '0' <= HB_COMP_PARAM->iWarnings ) ) { diff --git a/harbour/source/compiler/hbmain.c b/harbour/source/compiler/hbmain.c index e0efd0aa12..4cd399396c 100644 --- a/harbour/source/compiler/hbmain.c +++ b/harbour/source/compiler/hbmain.c @@ -67,7 +67,6 @@ extern unsigned _stklen = UINT_MAX; #endif -static void hb_compGenOutput( HB_COMP_DECL, int ); static void hb_compCompileEnd( HB_COMP_DECL ); static int hb_compCompile( HB_COMP_DECL, char * szPrg, BOOL bSingleFile ); @@ -116,12 +115,13 @@ static void hb_compMainExit( HB_COMP_DECL ) hb_xfree( pAutoOpen ); } - hb_comp_free( HB_COMP_PARAM ); + if( HB_COMP_PARAM->pOutBuf ) + hb_xfree( HB_COMP_PARAM->pOutBuf ); - hb_xexit(); + hb_comp_free( HB_COMP_PARAM ); } -int compMain( int argc, char * argv[] ) +int hb_compMain( int argc, char * argv[], BYTE ** pBufPtr, ULONG * pulSize ) { HB_COMP_DECL; int iStatus = EXIT_SUCCESS; @@ -130,7 +130,7 @@ int compMain( int argc, char * argv[] ) #if defined( HOST_OS_UNIX_COMPATIBLE ) hb_comp_errFile = stderr; -#else +#else hb_comp_errFile = stdout; #endif @@ -148,6 +148,11 @@ int compMain( int argc, char * argv[] ) hb_compChkCompilerSwitch( HB_COMP_PARAM, argc, argv ); if( !HB_COMP_PARAM->fExit ) { + if( pBufPtr && pulSize ) + { + HB_COMP_PARAM->iLanguage = LANG_PORT_OBJ_BUF; + } + if( HB_COMP_PARAM->fLogo ) hb_compPrintLogo(); @@ -205,6 +210,22 @@ int compMain( int argc, char * argv[] ) if( HB_COMP_PARAM->iErrorCount > 0 ) iStatus = EXIT_FAILURE; + if( pBufPtr && pulSize ) + { + if( iStatus == EXIT_SUCCESS ) + { + * pBufPtr = HB_COMP_PARAM->pOutBuf; + * pulSize = HB_COMP_PARAM->ulOutBufSize; + HB_COMP_PARAM->pOutBuf = NULL; + HB_COMP_PARAM->ulOutBufSize = 0; + } + else + { + * pBufPtr = NULL; + * pulSize = 0; + } + } + hb_compMainExit( HB_COMP_PARAM ); return iStatus; @@ -4268,6 +4289,10 @@ static void hb_compGenOutput( HB_COMP_DECL, int iLanguage ) hb_compGenPortObj( HB_COMP_PARAM, HB_COMP_PARAM->pFileName ); break; + case LANG_PORT_OBJ_BUF: + hb_compGenBufPortObj( HB_COMP_PARAM, &HB_COMP_PARAM->pOutBuf, &HB_COMP_PARAM->ulOutBufSize ); + break; + case LANG_OBJ_MODULE: hb_compGenCObj( HB_COMP_PARAM, HB_COMP_PARAM->pFileName ); break; diff --git a/harbour/source/compiler/ppcomp.c b/harbour/source/compiler/ppcomp.c index 371ef9440d..efe461eeb5 100644 --- a/harbour/source/compiler/ppcomp.c +++ b/harbour/source/compiler/ppcomp.c @@ -31,7 +31,7 @@ #include static void hb_pp_ErrorGen( void * cargo, - char * szMsgTable[], char cPrefix, int iErrorCode, + const char * szMsgTable[], char cPrefix, int iErrorCode, const char * szParam1, const char * szParam2 ) { HB_COMP_DECL = ( HB_COMP_PTR ) cargo; diff --git a/harbour/source/main/harbour.c b/harbour/source/main/harbour.c index dfccb9dd4b..912c982096 100644 --- a/harbour/source/main/harbour.c +++ b/harbour/source/main/harbour.c @@ -55,7 +55,12 @@ int main( int argc, char * argv[] ) { - return compMain( argc, argv ); + int iResult; + + iResult = hb_compMain( argc, argv, NULL, NULL ); + hb_xexit(); + + return iResult; } /* ------------------------------------------------------------------------- */ diff --git a/harbour/source/pp/ppcore.c b/harbour/source/pp/ppcore.c index 93a556f297..4fb3173614 100644 --- a/harbour/source/pp/ppcore.c +++ b/harbour/source/pp/ppcore.c @@ -99,13 +99,13 @@ /* warning messages */ -static char * hb_pp_szWarnings[] = +static const char * hb_pp_szWarnings[] = { "1Redefinition or duplicate definition of #define %s" /* C1005 */ }; /* error messages */ -static char * hb_pp_szErrors[] = +static const char * hb_pp_szErrors[] = { "Illegal character: '\\x%s'", /* C2004 */ "Unterminated string: '%s'", /* C2007 */ @@ -218,7 +218,7 @@ static void hb_pp_disp( PHB_PP_STATE pState, const char * szMessage ) static void hb_pp_error( PHB_PP_STATE pState, char type, int iError, const char * szParam ) { - char ** szMsgTable = type == 'W' ? hb_pp_szWarnings : hb_pp_szErrors; + const char ** szMsgTable = type == 'W' ? hb_pp_szWarnings : hb_pp_szErrors; if( pState->pErrorFunc ) { diff --git a/harbour/source/pp/pplib.c b/harbour/source/pp/pplib.c index 78f237c0fe..4f43e31147 100644 --- a/harbour/source/pp/pplib.c +++ b/harbour/source/pp/pplib.c @@ -58,7 +58,7 @@ #include "hbapierr.h" #include "hbvm.h" -static void hb_pp_ErrorMessage( void * cargo, char * szMsgTable[], +static void hb_pp_ErrorMessage( void * cargo, const char * szMsgTable[], char cPrefix, int iCode, const char * szParam1, const char * szParam2 ) { diff --git a/harbour/source/vm/runner.c b/harbour/source/vm/runner.c index 829c8a2539..3f68c63a5b 100644 --- a/harbour/source/vm/runner.c +++ b/harbour/source/vm/runner.c @@ -92,6 +92,8 @@ typedef struct PHB_SYMBOLS pModuleSymbols; } HRB_BODY, * PHRB_BODY; +static const BYTE szHead[] = { 192,'H','R','B' }; + #define SYM_NOLINK 0 /* Symbol does not have to be linked */ #define SYM_FUNC 1 /* Defined function */ @@ -100,7 +102,6 @@ typedef struct static int hb_hrbReadHead( char * szBody, ULONG ulBodySize, ULONG * pulBodyOffset ) { - BYTE szHead[] = { (BYTE)192,'H','R','B' }; char * pVersion; HB_TRACE(HB_TR_DEBUG, ("hb_hrbReadHead(%p,%lu,%p)", szBody, ulBodySize, pulBodyOffset )); @@ -108,7 +109,7 @@ static int hb_hrbReadHead( char * szBody, ULONG ulBodySize, ULONG * pulBodyOffse if( ulBodySize < 6 || memcmp( szHead, szBody, 4 ) ) return 0; - pVersion = szBody + *pulBodyOffset + 4; + pVersion = szBody + 4; *pulBodyOffset += 6; return HB_PCODE_MKSHORT( pVersion ); @@ -572,47 +573,43 @@ static void hb_hrbDo( PHRB_BODY pHrbBody, int argc, char * argv[] ) */ HB_FUNC( __HRBRUN ) { - int argc = hb_pcount(); + ULONG ulLen = hb_parclen( 1 ); - if( argc >= 1 && ISCHAR( 1 ) ) + if( ulLen > 0 ) { - PHRB_BODY pHrbBody = hb_hrbLoadFromFile( hb_parc( 1 ) ); + char * fileOrBody = hb_parc( 1 ); + PHRB_BODY pHrbBody; + + if( ulLen > 4 && memcmp( szHead, fileOrBody, 4 ) == 0 ) + pHrbBody = hb_hrbLoad( fileOrBody, ulLen ); + else + pHrbBody = hb_hrbLoadFromFile( fileOrBody ); if( pHrbBody ) { + int argc = hb_pcount(), i; char **argv = NULL; - int i; if( argc > 1 ) { argv = (char**) hb_xgrab( sizeof(char*) * (argc-1) ); - for( i=0; i 0 ) { - BYTE szHead[] = { 192,'H','R','B' }; char * fileOrBody = hb_parc( 1 ); PHRB_BODY pHrbBody; - /* If parameter string */ - if( fileOrBody && ulLen > 4 && memcmp( szHead, fileOrBody, 4 ) == 0 ) - { + if( ulLen > 4 && memcmp( szHead, fileOrBody, 4 ) == 0 ) pHrbBody = hb_hrbLoad( fileOrBody, ulLen ); - } else - { pHrbBody = hb_hrbLoadFromFile( fileOrBody ); - } if( pHrbBody ) { @@ -646,24 +637,18 @@ HB_FUNC( __HRBLOAD ) argv = ( char ** ) hb_xgrab( sizeof( char * ) * ( argc - 1 ) ); for( i = 0; i < argc - 1; i++ ) - { argv[i] = hb_parcx( i + 2 ); - } } hb_hrbInit( pHrbBody, argc - 1, argv ); if( argv ) - { hb_xfree( argv ); - } } hb_retptr( ( void *) pHrbBody ); } else - { hb_errRT_BASE( EG_ARG, 9998, NULL, "__HRBLOAD", HB_ERR_ARGS_BASEPARAMS ); - } } HB_FUNC( __HRBDO ) @@ -681,22 +666,16 @@ HB_FUNC( __HRBDO ) argv = ( char ** ) hb_xgrab( sizeof( char * ) * ( argc - 1 ) ); for( i = 0; i < argc - 1; i++ ) - { argv[i] = hb_parcx( i + 2 ); - } } hb_hrbDo( pHrbBody, argc - 1, argv ); if( argv ) - { hb_xfree( argv ); - } } else - { hb_errRT_BASE( EG_ARG, 9999, NULL, "__HRBDO", HB_ERR_ARGS_BASEPARAMS ); - } } HB_FUNC( __HRBUNLOAD ) @@ -704,13 +683,9 @@ HB_FUNC( __HRBUNLOAD ) PHRB_BODY pHrbBody = ( PHRB_BODY ) hb_parptr( 1 ); if( pHrbBody ) - { hb_hrbUnLoad( pHrbBody ); - } else - { hb_errRT_BASE( EG_ARG, 9999, NULL, "__HRBUNLOAD", HB_ERR_ARGS_BASEPARAMS ); - } } HB_FUNC( __HRBGETFU ) @@ -731,14 +706,10 @@ HB_FUNC( __HRBGETFU ) hb_xfree( szName ); if( ulPos < pHrbBody->ulSymbols ) - { hb_itemPutSymbol( hb_stackReturnItem(), pHrbBody->pSymRead + ulPos ); - } } else - { hb_errRT_BASE( EG_ARG, 9999, NULL, "__HRBGETFU", HB_ERR_ARGS_BASEPARAMS ); - } } HB_FUNC( __HRBDOFU ) @@ -754,14 +725,10 @@ HB_FUNC( __HRBDOFU ) hb_vmPushNil(); for( i = 2; i <= argc; i++ ) /* Push other params */ - { hb_vmPush( hb_stackItemFromBase( i ) ); - } hb_vmDo( argc - 1 ); /* Run function */ } else - { hb_errRT_BASE( EG_ARG, 9999, NULL, "__HRBDOFU", HB_ERR_ARGS_BASEPARAMS ); - } } diff --git a/harbour/utils/hbpp/hbpp.c b/harbour/utils/hbpp/hbpp.c index 5edba57919..85a9b11f8b 100644 --- a/harbour/utils/hbpp/hbpp.c +++ b/harbour/utils/hbpp/hbpp.c @@ -448,7 +448,7 @@ static void AddSearchPath( char * szPath, HB_PATHNAMES * * pSearchList ) pPath->szPath = szPath; } -void hb_compGenError( HB_COMP_DECL, char * _szErrors[], char cPrefix, int iError, const char * szError1, const char * szError2 ) +void hb_compGenError( HB_COMP_DECL, const char * _szErrors[], char cPrefix, int iError, const char * szError1, const char * szError2 ) { HB_TRACE(HB_TR_DEBUG, ("hb_compGenError(%p, %c, %d, %s, %s)", _szErrors, cPrefix, iError, szError1, szError2)); @@ -464,7 +464,7 @@ void hb_compGenError( HB_COMP_DECL, char * _szErrors[], char cPrefix, int iError */ } -void hb_compGenWarning( HB_COMP_DECL, char* _szWarnings[], char cPrefix, int iWarning, const char * szWarning1, const char * szWarning2) +void hb_compGenWarning( HB_COMP_DECL, const char* _szWarnings[], char cPrefix, int iWarning, const char * szWarning1, const char * szWarning2) { HB_TRACE(HB_TR_DEBUG, ("hb_compGenWarning(%p, %c, %d, %s, %s)", _szWarnings, cPrefix, iWarning, szWarning1, szWarning2)); @@ -472,7 +472,7 @@ void hb_compGenWarning( HB_COMP_DECL, char* _szWarnings[], char cPrefix, int iWa if( s_iWarnings ) { - char *szText = _szWarnings[ iWarning - 1 ]; + const char *szText = _szWarnings[ iWarning - 1 ]; if( (szText[ 0 ] - '0') <= s_iWarnings ) { diff --git a/harbour/utils/hbpp/hbppcore.c b/harbour/utils/hbpp/hbppcore.c index af3e24fd2a..d45d9795f1 100644 --- a/harbour/utils/hbpp/hbppcore.c +++ b/harbour/utils/hbpp/hbppcore.c @@ -208,7 +208,7 @@ char *hb_pp_STD_CH = NULL; static BOOL s_bArray = FALSE; /* Table with parse errors */ -char *hb_pp_szErrors[] = { +const char *hb_pp_szErrors[] = { "Can\'t open #include file: \'%s\'; %s", "#else does not match #ifdef", "#endif does not match #ifdef", @@ -233,7 +233,7 @@ char *hb_pp_szErrors[] = { }; /* Table with warnings */ -char *hb_pp_szWarnings[] = { +const char *hb_pp_szWarnings[] = { "1Redefinition or duplicate definition of #define %s", "1No directives in command definitions file" }; diff --git a/harbour/utils/hbpp/hbppdef.h b/harbour/utils/hbpp/hbppdef.h index 7555b492ed..b390922590 100644 --- a/harbour/utils/hbpp/hbppdef.h +++ b/harbour/utils/hbpp/hbppdef.h @@ -147,8 +147,8 @@ extern int hb_comp_iLinePRG; extern int hb_pp_lInclude; extern int * hb_pp_aCondCompile; extern int hb_pp_nCondCompile; -extern char * hb_pp_szErrors[]; -extern char * hb_pp_szWarnings[]; +extern const char * hb_pp_szErrors[]; +extern const char * hb_pp_szWarnings[]; extern int hb_pp_nEmptyStrings; extern int hb_pp_LastOutLine; extern int hb_pp_StreamBlock; diff --git a/harbour/utils/hbrun/hbrun.prg b/harbour/utils/hbrun/hbrun.prg index 6939f8e5df..9702f94f25 100644 --- a/harbour/utils/hbrun/hbrun.prg +++ b/harbour/utils/hbrun/hbrun.prg @@ -72,7 +72,7 @@ collision with user function in HRB file with that name. [ckedem] */ FUNCTION _APPMAIN( cHRBFile, ... ) - LOCAL xRetVal, cPRGFile, cRMFile, cPath, cName, cExt, cDrive + LOCAL xRetVal, cPath, cName, cExt, cDrive, aIncDir IF Empty( cHRBFile ) OutStd( "Harbour Runner" + HB_OSNewLine() +; @@ -81,29 +81,33 @@ FUNCTION _APPMAIN( cHRBFile, ... ) "Syntax: hbrun [parameters]" + HB_OSNewLine() + ; HB_OSNewLine() +; "Note: Linked with " + Version() + HB_OSNewLine() ) + ERRORLEVEL( 1 ) ELSE HB_FNAMESPLIT( cHRBFile, @cPath, @cName, @cExt, @cDrive ) - IF LOWER( cExt ) == ".prg" - cPRGFile := cHRBFile - xRetVal := HB_FTEMPCREATE(,,, @cHRBFile ) - IF xRetVal == -1 - RETURN xRetVal - ENDIF - FCLOSE( xRetVal ) - FERASE( cHRBFile ) - HB_FNAMESPLIT( cHRBFile, @cPath, @cName, @cExt, @cDrive ) - cRMFile := cHRBFile := HB_FNAMEMERGE( cPath, cName, ".hrb", cDrive ) - xRetVal := HB_COMPILE( HB_ARGV( 0 ), "-n", "-w", "-es2", "-q0", ; - "-gh", "-o"+cHRBFile, cPRGFile ) - IF xRetVal != 0 - RETURN xRetVal - ENDIF - ENDIF - xRetVal := __hrbRun( cHRBFile, ... ) - ENDIF - IF !EMPTY( cRMFile ) - FERASE( cRMFile ) + IF LOWER( cExt ) == ".prg" + aIncDir := {} +#ifdef _DEFAULT_INC_DIR + AADD( aIncDir, "-I" + _DEFAULT_INC_DIR ) +#endif + cPath := getenv( "HB_INC_INSTALL" ) + IF !EMPTY( cPath ) + AADD( aIncDir, "-I" + cPath ) + ENDIF +#ifdef __PLATFORM__UNIX + AADD( aIncDir, "-I/usr/include/harbour" ) + AADD( aIncDir, "-I/usr/local/include/harbour" ) +#endif + cHRBFile := HB_COMPILEBUF( HB_ARGV( 0 ), "-n", "-w", "-es2", "-q0", ; + aIncDir, cHRBFile ) + IF cHRBFile == NIL + ERRORLEVEL( 1 ) + ELSE + xRetVal := __hrbRun( cHRBFile, ... ) + ENDIF + ELSE + xRetVal := __hrbRun( cHRBFile, ... ) + ENDIF ENDIF RETURN xRetVal