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.
This commit is contained in:
Przemyslaw Czerpak
2008-05-06 00:44:50 +00:00
parent 63c9ed7c80
commit 7311612b6b
4 changed files with 112 additions and 60 deletions

View File

@@ -8,6 +8,22 @@
2008-12-31 13:59 UTC+0100 Foo Bar <foo.bar@foobar.org>
*/
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 <miguelangel@marchuet.net>
* include/hbmemory.ch

View File

@@ -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()
{

View File

@@ -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 )

View File

@@ -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;
}
}