From 7311612b6bdaa8776f239ba289ccbdbbbf02a45f Mon Sep 17 00:00:00 2001 From: Przemyslaw Czerpak Date: Tue, 6 May 2008 00:44:50 +0000 Subject: [PATCH] 2008-05-06 02:44 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) * harbour/bin/hb-func.sh ! do not add .exe suffix if user added it explicitly in W32/DOS builds * harbour/source/vm/dynsym.c * added internal error when size of dynamic table exceed maximal size % small optimization in hb_dynsymFind() function * harbour/source/pp/ppcore.c * added support for generating #line directives in strictly Clipper compatible way even if they are redundant. It can be enabled by HB_PP_STRICT_LINEINFO_TOKEN compiler time macro, f.e. using environment variables: set C_USR=-DHB_PP_STRICT_LINEINFO_TOKEN %C_USR% and making clean build. --- harbour/ChangeLog | 16 +++++ harbour/bin/hb-func.sh | 3 +- harbour/source/pp/ppcore.c | 126 +++++++++++++++++++++++-------------- harbour/source/vm/dynsym.c | 27 ++++---- 4 files changed, 112 insertions(+), 60 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index e2b71cd6b2..8568ab55f7 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,22 @@ 2008-12-31 13:59 UTC+0100 Foo Bar */ +2008-05-06 02:44 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/bin/hb-func.sh + ! do not add .exe suffix if user added it explicitly in W32/DOS builds + + * harbour/source/vm/dynsym.c + * added internal error when size of dynamic table exceed maximal size + % small optimization in hb_dynsymFind() function + + * harbour/source/pp/ppcore.c + * added support for generating #line directives in strictly Clipper + compatible way even if they are redundant. It can be enabled + by HB_PP_STRICT_LINEINFO_TOKEN compiler time macro, f.e. using + environment variables: + set C_USR=-DHB_PP_STRICT_LINEINFO_TOKEN %C_USR% + and making clean build. + 2008-05-05 11:31 UTC+0100 Miguel Angel Marchuet Frutos * include/hbmemory.ch diff --git a/harbour/bin/hb-func.sh b/harbour/bin/hb-func.sh index 879d7cf4ec..dcd1c6fa2b 100755 --- a/harbour/bin/hb-func.sh +++ b/harbour/bin/hb-func.sh @@ -481,7 +481,8 @@ fi FOUTC="\${DIROUT}/\${FILEOUT%.*}.c" FOUTO="\${DIROUT}/\${FILEOUT%.*}.o" FOUTE="\${DIROUT}/\${FILEOUT%.[Pp][Rr][Gg]}" -FOUTE="\${FOUTE%.[oc]}${hb_exesuf}" +FOUTE="\${FOUTE%.[oc]}" +FOUTE="\${FOUTE%${hb_exesuf}}${hb_exesuf}" hb_cc() { diff --git a/harbour/source/pp/ppcore.c b/harbour/source/pp/ppcore.c index f0d7613f36..7e60b261e1 100644 --- a/harbour/source/pp/ppcore.c +++ b/harbour/source/pp/ppcore.c @@ -53,9 +53,15 @@ /* #define HB_PP_MULTILINE_STRING */ /* #define HB_C52_STRICT */ /* #define HB_PP_NO_LINEINFO_TOKEN */ +/* #define HB_PP_STRICT_LINEINFO_TOKEN */ #define _HB_PP_INTERNAL +#if defined( HB_PP_STRICT_LINEINFO_TOKEN ) && \ + defined( HB_PP_NO_LINEINFO_TOKEN ) +# undef HB_PP_NO_LINEINFO_TOKEN +#endif + #include "hbpp.h" #include "hbver.h" #include "hbdate.h" @@ -1993,43 +1999,6 @@ static void hb_pp_stateFree( PHB_PP_STATE pState ) hb_xfree( pState ); } -static void hb_pp_includeFile( PHB_PP_STATE pState, char * szFileName, BOOL fSysFile ) -{ - if( pState->iFiles >= HB_PP_MAX_INCLUDED_FILES ) - { - hb_pp_error( pState, 'F', HB_PP_ERR_NESTED_INCLUDES, NULL ); - } - else - { - BOOL fNested = FALSE; - PHB_PP_FILE pFile = hb_pp_FileNew( pState, szFileName, fSysFile, &fNested, - NULL, TRUE, pState->pOpenFunc ); - if( pFile ) - { - pFile->pPrev = pState->pFile; - pState->pFile = pFile; - pState->iFiles++; - pFile->fGenLineInfo = TRUE; - } - else if( fNested ) - hb_pp_error( pState, 'F', HB_PP_ERR_NESTED_INCLUDES, NULL ); - else - hb_pp_error( pState, 'F', HB_PP_ERR_CANNOT_OPEN_FILE, szFileName ); - } -} - -static void hb_pp_includeClose( PHB_PP_STATE pState ) -{ - PHB_PP_FILE pFile = pState->pFile; - - pState->pFile = pFile->pPrev; - pState->iFiles--; - if( pState->pFile ) - pState->pFile->fGenLineInfo = TRUE; - - hb_pp_FileFree( pState, pFile, pState->pCloseFunc ); -} - static PHB_PP_TOKEN hb_pp_streamFuncGet( PHB_PP_TOKEN pToken, PHB_PP_TOKEN * pFuncPtr ) { hb_pp_tokenListFree( pFuncPtr ); @@ -4667,6 +4636,21 @@ static void hb_pp_condCompileElif( PHB_PP_STATE pState, PHB_PP_TOKEN pToken ) } } +#if !defined( HB_PP_NO_LINEINFO_TOKEN ) +static void hb_pp_lineTokens( PHB_PP_TOKEN ** pTokenPtr, char * szFileName, int iLine ) +{ + char szLine[ 12 ]; + + snprintf( szLine, sizeof( szLine ), "%d", iLine ); + hb_pp_tokenAdd( pTokenPtr, "#", 1, 0, HB_PP_TOKEN_DIRECTIVE | HB_PP_TOKEN_STATIC ); + hb_pp_tokenAdd( pTokenPtr, "line", 4, 0, HB_PP_TOKEN_KEYWORD | HB_PP_TOKEN_STATIC ); + hb_pp_tokenAdd( pTokenPtr, szLine, strlen( szLine ), 1, HB_PP_TOKEN_NUMBER ); + if( szFileName ) + hb_pp_tokenAdd( pTokenPtr, szFileName, strlen( szFileName ), 1, HB_PP_TOKEN_STRING ); + hb_pp_tokenAdd( pTokenPtr, "\n", 1, 0, HB_PP_TOKEN_EOL | HB_PP_TOKEN_STATIC ); +} +#endif + static void hb_pp_genLineTokens( PHB_PP_STATE pState ) { pState->pNextTokenPtr = &pState->pTokenOut; @@ -4676,16 +4660,8 @@ static void hb_pp_genLineTokens( PHB_PP_STATE pState ) #else if( pState->pFile->fGenLineInfo ) { - char szLine[ 12 ]; - - snprintf( szLine, sizeof( szLine ), "%d", pState->pFile->iCurrentLine ); - hb_pp_tokenAdd( &pState->pNextTokenPtr, "#", 1, 0, HB_PP_TOKEN_DIRECTIVE | HB_PP_TOKEN_STATIC ); - hb_pp_tokenAdd( &pState->pNextTokenPtr, "line", 4, 0, HB_PP_TOKEN_KEYWORD | HB_PP_TOKEN_STATIC ); - hb_pp_tokenAdd( &pState->pNextTokenPtr, szLine, strlen( szLine ), 1, HB_PP_TOKEN_NUMBER ); - if( pState->pFile->szFileName ) - hb_pp_tokenAdd( &pState->pNextTokenPtr, pState->pFile->szFileName, - strlen( pState->pFile->szFileName ), 1, HB_PP_TOKEN_STRING ); - hb_pp_tokenAdd( &pState->pNextTokenPtr, "\n", 1, 0, HB_PP_TOKEN_EOL | HB_PP_TOKEN_STATIC ); + hb_pp_lineTokens( &pState->pNextTokenPtr, pState->pFile->szFileName, + pState->pFile->iCurrentLine ); pState->pFile->fGenLineInfo = FALSE; } else if( pState->pFile->iLastLine < pState->pFile->iCurrentLine ) @@ -4700,6 +4676,62 @@ static void hb_pp_genLineTokens( PHB_PP_STATE pState ) #endif } +static void hb_pp_includeFile( PHB_PP_STATE pState, char * szFileName, BOOL fSysFile ) +{ + if( pState->iFiles >= HB_PP_MAX_INCLUDED_FILES ) + { + hb_pp_error( pState, 'F', HB_PP_ERR_NESTED_INCLUDES, NULL ); + } + else + { + BOOL fNested = FALSE; + PHB_PP_FILE pFile = hb_pp_FileNew( pState, szFileName, fSysFile, &fNested, + NULL, TRUE, pState->pOpenFunc ); + if( pFile ) + { +#if defined( HB_PP_STRICT_LINEINFO_TOKEN ) + pState->pNextTokenPtr = &pState->pTokenOut; + if( pState->pFile->fGenLineInfo ) + { + hb_pp_lineTokens( &pState->pNextTokenPtr, pState->pFile->szFileName, + pState->pFile->iCurrentLine ); + pState->pFile->fGenLineInfo = FALSE; + } + hb_pp_lineTokens( &pState->pNextTokenPtr, szFileName, 1 ); +#else + pFile->fGenLineInfo = TRUE; +#endif + pFile->pPrev = pState->pFile; + pState->pFile = pFile; + pState->iFiles++; + } + else if( fNested ) + hb_pp_error( pState, 'F', HB_PP_ERR_NESTED_INCLUDES, NULL ); + else + hb_pp_error( pState, 'F', HB_PP_ERR_CANNOT_OPEN_FILE, szFileName ); + } +} + +static void hb_pp_includeClose( PHB_PP_STATE pState ) +{ + PHB_PP_FILE pFile = pState->pFile; + + pState->pFile = pFile->pPrev; + pState->iFiles--; + +#if defined( HB_PP_STRICT_LINEINFO_TOKEN ) + if( pFile->fGenLineInfo ) + { + pState->pNextTokenPtr = &pState->pTokenOut; + hb_pp_lineTokens( &pState->pNextTokenPtr, pFile->szFileName, pFile->iCurrentLine + 1 ); + } +#endif + if( pState->pFile ) + pState->pFile->fGenLineInfo = TRUE; + + hb_pp_FileFree( pState, pFile, pState->pCloseFunc ); +} + static void hb_pp_preprocessToken( PHB_PP_STATE pState ) { while( !pState->pTokenOut && pState->pFile ) diff --git a/harbour/source/vm/dynsym.c b/harbour/source/vm/dynsym.c index 361db9e857..db28d83d4c 100644 --- a/harbour/source/vm/dynsym.c +++ b/harbour/source/vm/dynsym.c @@ -53,6 +53,7 @@ #include "hbvmopt.h" #include "hbapi.h" #include "hbapiitm.h" +#include "hbapierr.h" #include "hbstack.h" typedef struct @@ -221,21 +222,26 @@ HB_EXPORT PHB_DYNS hb_dynsymNew( PHB_SYMB pSymbol ) /* creates a new dynamic } if( s_uiDynSymbols == 0 ) /* Do we have any symbols ? */ + { pDynSym = s_pDynItems[ 0 ].pDynSym; /* Point to first symbol */ /* *<1>* Remember we already got this one */ + s_uiDynSymbols++; + } else { /* We want more symbols ! */ - s_pDynItems = ( PDYNHB_ITEM ) hb_xrealloc( s_pDynItems, ( s_uiDynSymbols + 1 ) * sizeof( DYNHB_ITEM ) ); + if( ++s_uiDynSymbols == 0 ) + hb_errInternal( 6004, "Internal error: size of dynamic symbol table exceed", NULL, NULL ); - memmove( &s_pDynItems[ s_uiClosestDynSym + 1 ], - &s_pDynItems[ s_uiClosestDynSym ], - sizeof( DYNHB_ITEM ) * ( s_uiDynSymbols - s_uiClosestDynSym ) ); + s_pDynItems = ( PDYNHB_ITEM ) hb_xrealloc( s_pDynItems, s_uiDynSymbols * sizeof( DYNHB_ITEM ) ); + + memmove( &s_pDynItems[ s_uiClosestDynSym + 1 ], + &s_pDynItems[ s_uiClosestDynSym ], + sizeof( DYNHB_ITEM ) * ( s_uiDynSymbols - s_uiClosestDynSym - 1 ) ); pDynSym = ( PHB_DYNS ) hb_xgrab( sizeof( HB_DYNS ) ); s_pDynItems[ s_uiClosestDynSym ].pDynSym = pDynSym; /* Enter DynSym */ } - s_uiDynSymbols++; /* Got one more symbol */ pDynSym->pSymbol = pSymbol; pDynSym->hMemvar = 0; pDynSym->uiArea = 0; @@ -332,12 +338,10 @@ HB_EXPORT PHB_DYNS hb_dynsymFind( const char * szName ) if( s_pDynItems == NULL ) { - s_pDynItems = ( PDYNHB_ITEM ) hb_xgrab( sizeof( DYNHB_ITEM ) ); /* Grab array */ + s_pDynItems = ( PDYNHB_ITEM ) hb_xgrab( sizeof( DYNHB_ITEM ) ); /* Grab array */ s_pDynItems->pDynSym = ( PHB_DYNS ) hb_xgrab( sizeof( HB_DYNS ) ); - /* Always grab a first symbol. Never an empty bucket. *<1>* */ + /* Always grab a first symbol. Never an empty bucket. *<1>* */ memset( s_pDynItems->pDynSym, 0, sizeof( HB_DYNS ) ); - - return NULL; } else { @@ -361,7 +365,7 @@ HB_EXPORT PHB_DYNS hb_dynsymFind( const char * szName ) USHORT uiFirst = 0; USHORT uiLast = s_uiDynSymbols; - USHORT uiMiddle = uiLast / 2; + USHORT uiMiddle = uiLast >> 1; s_uiClosestDynSym = uiMiddle; /* Start in the middle */ @@ -384,8 +388,7 @@ HB_EXPORT PHB_DYNS hb_dynsymFind( const char * szName ) uiFirst = uiMiddle + 1; s_uiClosestDynSym = uiFirst; } - - uiMiddle = uiFirst + ( ( uiLast - uiFirst ) / 2 ); + uiMiddle = ( uiFirst + uiLast ) >> 1; } }