From e0aa40573c4b63746e4d7ca7a914cdb7a65735aa Mon Sep 17 00:00:00 2001 From: Przemyslaw Czerpak Date: Mon, 21 May 2007 11:21:20 +0000 Subject: [PATCH] 2007-05-21 13:20 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) * harbour/source/pp/ppcore.c ! fixed E"..." ! added new hack for strings inside [] --- harbour/ChangeLog | 5 ++++ harbour/source/pp/ppcore.c | 51 ++++++++++++++++++++++++++++++++------ 2 files changed, 48 insertions(+), 8 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index bac4e452f7..81b6c594c4 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,11 @@ 2002-12-01 13:30 UTC+0100 Foo Bar */ +2007-05-21 13:20 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/source/pp/ppcore.c + ! fixed E"..." + ! added new hack for strings inside [] + 2007-05-21 13:11 UTC+0100 Miguel Angel Marchuet (miguelangel/at/marchuet.net) * contrib/bmdbfcdx/bmdbfcdx1.c * minor warning fix on os/2 compile. diff --git a/harbour/source/pp/ppcore.c b/harbour/source/pp/ppcore.c index 7912368506..26b6ecb8b3 100644 --- a/harbour/source/pp/ppcore.c +++ b/harbour/source/pp/ppcore.c @@ -688,9 +688,10 @@ static void hb_pp_readLine( PHB_PP_STATE pState ) } } -static BOOL hb_pp_canQuote( BOOL fQuote, char * pBuffer, ULONG ulLen, ULONG * pulAt ) +static BOOL hb_pp_canQuote( BOOL fQuote, char * pBuffer, ULONG ulLen, + ULONG ul, ULONG * pulAt ) { - ULONG ul = 0; + char cQuote = 0; /* * TODO: this is Clipper compatible but it breaks valid code so we may @@ -700,9 +701,43 @@ static BOOL hb_pp_canQuote( BOOL fQuote, char * pBuffer, ULONG ulLen, ULONG * pu { if( pBuffer[ ul ] == ']' ) { - * pulAt = ul; + if( cQuote && !fQuote ) + { + ULONG u = ul + 1; + cQuote = 0; + while( u < ulLen ) + { + if( cQuote ) + { + if( pBuffer[ u ] == cQuote ) + cQuote = 0; + } + else if( pBuffer[ u ] == '`' ) + cQuote = '\''; + else if( pBuffer[ u ] == '\'' || pBuffer[ u ] == '"' ) + cQuote = pBuffer[ u ]; + else if( pBuffer[ u ] == '[' ) + hb_pp_canQuote( TRUE, pBuffer, ulLen, u + 1, &u ); + ++u; + } + fQuote = cQuote == 0; + } + if( fQuote ) + * pulAt = ul; return fQuote; } + else if( !fQuote ) + { + if( cQuote ) + { + if( pBuffer[ ul ] == cQuote ) + cQuote = 0; + } + else if( pBuffer[ ul ] == '`' ) + cQuote = '\''; + else if( pBuffer[ ul ] == '\'' || pBuffer[ ul ] == '"' ) + cQuote = pBuffer[ ul ]; + } ++ul; } return FALSE; @@ -1020,7 +1055,7 @@ static void hb_pp_getLine( PHB_PP_STATE pState ) { ULONG ulStrip, u; - if( ch == 'e' ) + if( ch != '"' ) ++ul; while( ++ul < ulLen && pBuffer[ ul ] != '"' ) { @@ -1058,7 +1093,7 @@ static void hb_pp_getLine( PHB_PP_STATE pState ) break; } #endif - u = ch == 'e' ? 2 : 1; + u = ch != '"' ? 2 : 1; ulStrip = ul - u; hb_strRemEscSeq( pBuffer + u, &ulStrip ); hb_pp_tokenAddNext( pState, pBuffer + u, ulStrip, @@ -1119,10 +1154,10 @@ static void hb_pp_getLine( PHB_PP_STATE pState ) else if( ch == '[' && !pState->fDirective && hb_pp_canQuote( pState->fCanNextLine || HB_PP_TOKEN_CANQUOTE( pState->iLastType ), - pBuffer + 1, ulLen - 1, &ul ) ) + pBuffer, ulLen, 1, &ul ) ) { - hb_pp_tokenAddNext( pState, pBuffer + 1, ul, HB_PP_TOKEN_STRING ); - ul += 2; + hb_pp_tokenAddNext( pState, pBuffer + 1, ul - 1, HB_PP_TOKEN_STRING ); + ++ul; } else if( ( ch == '/' || ch == '&' ) && ulLen > 1 && pBuffer[ 1 ] == ch ) {