ChangeLog 2003-10-20 13:45 UTC+0100 Ryszard Glab

This commit is contained in:
Ryszard Glab
2003-10-20 11:16:21 +00:00
parent 36a75f86b2
commit c6eea5cd0f
12 changed files with 88 additions and 33 deletions

View File

@@ -18,5 +18,3 @@ obj
obj/*
lib
lib/*
myapps
myapps/*

View File

@@ -8,6 +8,33 @@
2002-12-01 23:12 UTC+0100 Foo Bar <foo.bar@foobar.org>
*/
2003-10-20 13:45 UTC+0100 Ryszard Glab <rglab@przesiew.imid.med.pl>
* .cvsignore
* Restored previous version
* include/hbexpra.c
* include/hbexprb.c
* include/hbexprc.c
* include/hbexprop.h
* source/common/expropt1.c
* source/compiler/exproptb.c
* source/compiler/exproptc.c
* source/compiler/harbour.sly
* fixed declaration mismatch in Simplex version
* fixed generation of string's pcode
(introduced with my previous changes)
* source/pp/ppcore.c
* fixed support for stringify match markers <""> and <()> in Flex
version (for example &var.1 have to be expanded into "&var.1"
instead of var.1 since this is not a valid Clipper expression)
NOTICE! In Simplex version this is not fixed because it is
used as a hack to correctly support macro variables in GET
command.
* tests/testget.prg
* MEMVAR declaration was added
2003-10-20 11:37 UTC+0300 Alexander Kresin <alex@belacy.belgorod.su>
* include/hbapi.h
* The declaration of hb_objSendMsg() added.

View File

@@ -380,7 +380,7 @@ HB_EXPR_PTR hb_compExprNewFunCall( HB_EXPR_PTR pName, HB_EXPR_PTR pParms )
/* Search for {|| &(cMacro) }. */
else if( pElem->ExprType == HB_ET_CODEBLOCK )
{
HB_EXPR_PTR pBlock = pElem->value.asList.pExprList;
HB_EXPR_PTR pBlock = pElem->value.asCodeblock.pExprList;
/* Search for macros {|| &cMacro }. */
if( pBlock->ExprType == HB_ET_MACRO )

View File

@@ -177,8 +177,10 @@ static HB_EXPR_FUNC( hb_compExprUseNegate );
static void hb_compExprCodeblockPush( HB_EXPR_PTR, HB_MACRO_DECL );
#else
static void hb_compExprCodeblockPush( HB_EXPR_PTR );
#if !defined(SIMPLEX)
static void hb_compExprCodeblockEarly( HB_EXPR_PTR );
#endif
#endif
HB_EXPR_FUNC_PTR hb_comp_ExprTable[] = {
hb_compExprUseDummy,
@@ -347,13 +349,21 @@ static HB_EXPR_FUNC( hb_compExprUseString )
case HB_EA_PUSH_PCODE:
{
char *szDupl;
BOOL bUseTextSubst;
BOOL bValidMacro;
szDupl = hb_strupr( hb_strdup( pSelf->value.asString.string ) );
HB_EXPR_PCODE2( hb_compGenPushString, pSelf->value.asString.string, pSelf->ulLength + 1 );
HB_EXPR_GENPCODE1( hb_compGenPCode1, HB_P_MACROTEXT );
if( ! hb_compExprIsValidMacro( szDupl ) )
hb_compErrorMacro( pSelf->value.asString.string );
bValidMacro = hb_compExprIsValidMacro( szDupl, &bUseTextSubst );
if( bUseTextSubst )
{
if( bValidMacro )
HB_EXPR_GENPCODE1( hb_compGenPCode1, HB_P_MACROTEXT );
else
hb_compErrorMacro( pSelf->value.asString.string );
}
hb_xfree( szDupl );
}
break;
case HB_EA_POP_PCODE:
@@ -532,9 +542,10 @@ static void hb_compExprCodeblockEarly( HB_EXPR_PTR pSelf )
*/
HB_EXPR_PTR pNew;
char *szDupl;
BOOL bUseTextSubst;
szDupl = hb_strupr( hb_strdup( pSelf->value.asCodeblock.string ) );
if( !hb_compExprIsValidMacro( szDupl ) )
if( !hb_compExprIsValidMacro( szDupl, &bUseTextSubst ) )
{
hb_compErrorCodeblock( pSelf->value.asCodeblock.string );
hb_compErrorMacro( pSelf->value.asCodeblock.string );

View File

@@ -416,13 +416,14 @@ ULONG hb_compExprReduceList( HB_EXPR_PTR pExpr )
return ulCnt;
}
BOOL hb_compExprIsValidMacro( char * szText )
BOOL hb_compExprIsValidMacro( char * szText, BOOL *pbUseTextSubst )
{
char * pTmp = szText;
BOOL bTextSubst;
BOOL bMacroText = TRUE;
while( (( pTmp = strchr( pTmp, '&' ) ) != NULL) && bMacroText )
*pbUseTextSubst = FALSE; /* no valid macro expression */
while( ((pTmp = strchr( pTmp, '&' )) != NULL) && bMacroText )
{
/* Check if macro operator is used inside a string
* Macro operator is ignored if it is the last char or
@@ -464,6 +465,7 @@ BOOL hb_compExprIsValidMacro( char * szText )
*pTmp = cSave;
#endif
}
*pbUseTextSubst |= bTextSubst;
}
return bMacroText;

View File

@@ -309,11 +309,7 @@ HB_EXPR_PTR hb_compExprNewLong( LONG );
HB_EXPR_PTR hb_compExprNewString( char * );
HB_EXPR_PTR hb_compExprNewLogical( int );
HB_EXPR_PTR hb_compExprNewSelf( void );
#if defined(SIMPLEX)
HB_EXPR_PTR hb_compExprNewCodeBlock( void );
#else
HB_EXPR_PTR hb_compExprNewCodeBlock( char *, BOOL, BOOL );
#endif
HB_EXPR_PTR hb_compExprNewArray( HB_EXPR_PTR );
HB_EXPR_PTR hb_compExprNewVar( char * );
HB_EXPR_PTR hb_compExprNewAliasVar( HB_EXPR_PTR, HB_EXPR_PTR );
@@ -375,7 +371,7 @@ int hb_compExprType( HB_EXPR_PTR );
void hb_compExprFree( HB_EXPR_PTR, HB_MACRO_DECL );
void hb_compExprErrorType( HB_EXPR_PTR, HB_MACRO_DECL );
HB_EXPR_PTR hb_compExprListStrip( HB_EXPR_PTR, HB_MACRO_DECL );
BOOL hb_compExprIsValidMacro( char * );
BOOL hb_compExprIsValidMacro( char *, BOOL * );
void hb_compExprCBVarDel( HB_CBVAR_PTR );
HB_EXPR_PTR hb_compExprReducePlusStrings( HB_EXPR_PTR, HB_EXPR_PTR, HB_MACRO_DECL );

View File

@@ -216,11 +216,7 @@ HB_EXPR_PTR hb_compExprNewLong( long lValue )
}
#if defined(SIMPLEX)
HB_EXPR_PTR hb_compExprNewCodeBlock( void )
#else
HB_EXPR_PTR hb_compExprNewCodeBlock( char *string, BOOL isMacro, BOOL lateEval )
#endif
{
HB_EXPR_PTR pExpr;
@@ -231,15 +227,9 @@ HB_EXPR_PTR hb_compExprNewCodeBlock( char *string, BOOL isMacro, BOOL lateEval )
pExpr->value.asCodeblock.pExprList = NULL;
pExpr->value.asCodeblock.pLocals = NULL; /* this will hold local variables declarations */
pExpr->ValType = HB_EV_CODEBLOCK;
#if defined(SIMPLEX)
pExpr->value.asCodeblock.string = NULL;
pExpr->value.asCodeblock.isMacro = FALSE;
pExpr->value.asCodeblock.lateEval = FALSE;
#else
pExpr->value.asCodeblock.string = string;
pExpr->value.asCodeblock.isMacro = isMacro;
pExpr->value.asCodeblock.lateEval = lateEval;
#endif
return pExpr;
}
@@ -403,8 +393,10 @@ HB_EXPR_PTR hb_compExprNewMacro( HB_EXPR_PTR pMacroExpr, unsigned char cMacroOp,
* ? &var.ext // this is invalid
*/
char *szDupl;
BOOL bUseTextSubst;
szDupl = hb_strupr( hb_strdup( szName ) );
if( ! hb_compExprIsValidMacro( szDupl ) )
if( ! hb_compExprIsValidMacro( szDupl, &bUseTextSubst ) )
hb_compErrorMacro( szName );
hb_xfree( szDupl );

View File

@@ -5,6 +5,6 @@
/* hbexprb.c is also included from ../macro/macro.c
* However it produces a slighty different code if used in
* macro compiler (there is an additional parameter passed to some functions)
* 10 - ignore this magic number - this is used to force compilation
* 11 - ignore this magic number - this is used to force compilation
*/
#include "hbexprb.c"

View File

@@ -5,6 +5,6 @@
/* hbexprc.c is also included from ../macro/macro.c
* However it produces a slighty different code if used in
* macro compiler (there is an additional parameter passed to some functions)
* 2 - ignore this magic number - this is used to force compilation
* 4 - ignore this magic number - this is used to force compilation
*/
#include "hbexprc.c"

View File

@@ -1049,7 +1049,7 @@ Get : _Get_ GetVar ','
pSetGetBlock = hb_compExprNewCodeBlock(NULL,0,0);
pSetGetBlock = hb_compExprCBVarAdd( pSetGetBlock, "_1", ' ' );
hb_compExprAddListExpr( pSetGetBlock, pIIF );
hb_compExprAddCodeblockExpr( pSetGetBlock, pIIF );
pGetArgList = hb_compExprNewArgList( pSetGetBlock );
}
@@ -1142,9 +1142,9 @@ GetA : _Get_ GetVarArray { pGetArgList = hb_compExprNewArgList( $2 ); bTra
GetAExt ')' { $$ = hb_compExprNewFunCall( hb_compExprNewFunName( "__GETA"), pGetArgList ); pGetArgList = NULL; }
;
GetVarArray : Variable ArrayIndex { pGetVarArray = $2; $$ = hb_compExprAddListExpr( hb_compExprNewCodeBlock(NULL,0,0), $1 ); }
| ObjectData ArrayIndex { pGetVarArray = $2; $$ = hb_compExprAddListExpr( hb_compExprNewCodeBlock(NULL,0,0), $1 ); }
| AliasVar ArrayIndex { pGetVarArray = $2; $$ = hb_compExprAddListExpr( hb_compExprNewCodeBlock(NULL,0,0), $1 ); }
GetVarArray : Variable ArrayIndex { pGetVarArray = $2; $$ = hb_compExprAddCodeblockExpr( hb_compExprNewCodeBlock(NULL,0,0), $1 ); }
| ObjectData ArrayIndex { pGetVarArray = $2; $$ = hb_compExprAddCodeblockExpr( hb_compExprNewCodeBlock(NULL,0,0), $1 ); }
| AliasVar ArrayIndex { pGetVarArray = $2; $$ = hb_compExprAddCodeblockExpr( hb_compExprNewCodeBlock(NULL,0,0), $1 ); }
| MacroVar ArrayIndex {
pGetVarArray = $2; $$ = hb_compExprNewNil();

View File

@@ -2754,6 +2754,7 @@ static int ReplacePattern( char patttype, char * expreal, int lenreal, char * pt
lenitem = (ifou)? ifou-1:lenreal;
if( *expreal != '\0' )
{
#if defined(SIMPLEX)
/* Ron Pinkas added 2000-01-21 */
if( *expreal == '&' )
{
@@ -2769,6 +2770,7 @@ static int ReplacePattern( char patttype, char * expreal, int lenreal, char * pt
hb_pp_Stuff( expreal + 1, ptro, lenitem, 0, lenres );
}
else /* END Ron Pinkas 2000-01-21 */
#endif
{
i = (ifou)? 3:2;
pp_rQuotes( expreal, sQuotes );
@@ -2785,6 +2787,14 @@ static int ReplacePattern( char patttype, char * expreal, int lenreal, char * pt
}
else
{
#if defined(SIMPLEX)
/* rglab 2003-10-19
* SIMPLEX specific solution guarded with #ifdef
* because this creates incorrect syntax:
* @ 0,0 GET &var.1 => _GET_( &var.1, var.1, )
* in FLEX we need a correct Clipper syntax:
* @ 0,0 GET &var.1 => _GET_( &var.1, "&var.1", )
*/
/* Ron Pinkas added 2000-01-21 */
if( *expreal == '&' )
{
@@ -2797,6 +2807,7 @@ static int ReplacePattern( char patttype, char * expreal, int lenreal, char * pt
hb_pp_Stuff( expreal + 1, ptro, lenreal - 1, 4, lenres );
}
else /* END Ron Pinkas 2000-01-21 */
#endif
{
pp_rQuotes( expreal, sQuotes );
hb_pp_Stuff( sQuotes, ptro, 2, 4, lenres );
@@ -2817,6 +2828,7 @@ static int ReplacePattern( char patttype, char * expreal, int lenreal, char * pt
lenitem = (ifou)? ifou-1:lenreal;
if( *expreal != '\0' )
{
#if defined(SIMPLEX)
if( !lenitem || *expreal == '(' || (*expreal=='&' && lenreal>1) ||
( *expreal=='\"' && *(expreal+lenitem-1)=='\"' ) ||
( *expreal == '\'' && *(expreal+lenitem-1)=='\'' ) )
@@ -2832,6 +2844,14 @@ static int ReplacePattern( char patttype, char * expreal, int lenreal, char * pt
}
hb_pp_Stuff( ( *expreal=='&' ) ? expreal + 1 : expreal, ptro,
lenitem, 0, lenres );
#else
if( !lenitem || *expreal == '(' ||
( *expreal=='\"' && *(expreal+lenitem-1)=='\"' ) ||
( *expreal == '\'' && *(expreal+lenitem-1)=='\'' ) )
{
if( ifou ) lenitem++;
hb_pp_Stuff( expreal, ptro, lenitem, 0, lenres );
#endif
}
else
{
@@ -2850,6 +2870,7 @@ static int ReplacePattern( char patttype, char * expreal, int lenreal, char * pt
}
while( ifou > 0 );
}
#if defined(SIMPLEX)
else if( !lenreal || *expreal == '(' || (*expreal=='&' && lenreal>1) ||
( *expreal == '\"' && *( expreal + lenreal - 1 ) == '\"' ) ||
( *expreal == '\'' && *( expreal + lenreal - 1 ) == '\'' ) )
@@ -2866,6 +2887,14 @@ static int ReplacePattern( char patttype, char * expreal, int lenreal, char * pt
hb_pp_Stuff( ( *expreal == '&' ) ? expreal + 1 : expreal, ptro,
( *expreal == '&' ) ? lenreal - 1 : lenreal, 4, lenres );
}
#else
else if( !lenreal || *expreal == '(' ||
( *expreal == '\"' && *( expreal + lenreal - 1 ) == '\"' ) ||
( *expreal == '\'' && *( expreal + lenreal - 1 ) == '\'' ) )
{
hb_pp_Stuff( expreal, ptro, lenreal, 4, lenres );
}
#endif
else
{
pp_rQuotes( expreal, sQuotes );

View File

@@ -1,7 +1,7 @@
Procedure Main()
LOCAL GetList := {}, cVar := "Hello"
MEMVAR aVar, nIndex, cMacro
MEMVAR aVar, nIndex, cMacro, cEarly, cEarly2, cLate
PRIVATE aVar := { "World", "Again" }, nIndex := 1, cMacro := "cEarly", cEarly := {"Early"}, cLate := "Late!", cEarly2 := {"Early2"}
CLS