diff --git a/harbour/ChangeLog b/harbour/ChangeLog index dca24fcd07..be58bd2311 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -1,3 +1,28 @@ +20000501-15:45 GMT+1 Ryszard Glab + + *source/rtl/filesys.c + * added support for file locks under Unix compatible OS + TODO: check the append locks + * commit operation cannot be performed by closing a + duplicated file handle - it releases all locks for + this file on Unix compatible OS + + *source/vm/hvm.c + *include/hbvm.h + * added hb_vmEvalBlock() for a codeblock evaluation - it is + passing no arguments to a codeblock + * added hb_vmEvalBlockV() for a codeblock evaluation - it is + using a variable number of arguments + + *source/rdd/dbcmd.c + * fixed bug in defEvalBlock + * fixed to call hb_vmEvalBlock() + * some common parts moved into separate functions + + *include/hbcomp.h + * changed 'BYTE iJumps' into 'ULONG iJumps' to stop reallocation + error mentioned by Victor + 20000501-15:37 GMT+1 Victor Szakats * source/rtl/teditor.prg diff --git a/harbour/include/hbcomp.h b/harbour/include/hbcomp.h index 7843591a64..fe65bee5a6 100644 --- a/harbour/include/hbcomp.h +++ b/harbour/include/hbcomp.h @@ -115,8 +115,8 @@ typedef struct __FUNC int iStaticsBase; /* base for this function statics */ ULONG * pNOOPs; /* pointer to the NOOP array */ ULONG * pJumps; /* pointer to the Jumps array */ - int iNOOPs; /* NOOPs Counter */ - BYTE iJumps; /* Jumps Counter */ + ULONG iNOOPs; /* NOOPs Counter */ + ULONG iJumps; /* Jumps Counter */ BYTE pStack[512]; /* Compile Time Stack */ SHORT iStackIndex; /* Compile Time Stack Index */ struct __FUNC * pOwner; /* pointer to the function/procedure that owns the codeblock */ diff --git a/harbour/include/hbvm.h b/harbour/include/hbvm.h index 4f1c402119..531a7cd464 100644 --- a/harbour/include/hbvm.h +++ b/harbour/include/hbvm.h @@ -72,6 +72,9 @@ extern void hb_vmMessage( PHB_SYMB pSymMsg ); /* sends a message to an object /* Execution */ extern void hb_vmDo( USHORT uiParams ); /* invoke the virtual machine */ extern void hb_vmFunction( USHORT uiParams ); /* executes a function saving its result */ +extern PHB_ITEM hb_vmEvalBlock( PHB_ITEM pBlockItem ); /* executes passed codeblock with no arguments */ +/* executes passed codeblock with variable number of arguments */ +extern PHB_ITEM hb_vmEvalBlockV( PHB_ITEM pBlockItem, USHORT uiArgCount, ... ); /* Push */ extern void hb_vmPush( PHB_ITEM pItem ); /* pushes a generic item onto the stack */ diff --git a/harbour/source/rdd/dbcmd.c b/harbour/source/rdd/dbcmd.c index e4e1aa848f..3ff5df96d6 100644 --- a/harbour/source/rdd/dbcmd.c +++ b/harbour/source/rdd/dbcmd.c @@ -296,29 +296,21 @@ static ERRCODE defEval( AREAP pArea, LPDBEVALINFO pEvalInfo ) { if( pEvalInfo->dbsci.itmCobWhile ) { - hb_vmPushSymbol( &hb_symEval ); - hb_vmPush( pEvalInfo->dbsci.itmCobWhile ); - hb_vmDo( 0 ); - bWhile = hb_itemGetL( &hb_stack.Return ); + bWhile = hb_itemGetL( hb_vmEvalBlock( pEvalInfo->dbsci.itmCobWhile ) ); } else bWhile = TRUE; if( pEvalInfo->dbsci.itmCobFor ) { - hb_vmPushSymbol( &hb_symEval ); - hb_vmPush( pEvalInfo->dbsci.itmCobFor ); - hb_vmDo( 0 ); - bFor = hb_itemGetL( &hb_stack.Return ); + bFor = hb_itemGetL( hb_vmEvalBlock( pEvalInfo->dbsci.itmCobFor ) ); } else bFor = TRUE; if( bWhile && bFor ) { - hb_vmPushSymbol( &hb_symEval ); - hb_vmPush( pEvalInfo->itmBlock ); - hb_vmDo( 0 ); + hb_vmEvalBlock( pEvalInfo->itmBlock ); } } return SUCCESS; @@ -338,10 +330,7 @@ static ERRCODE defEval( AREAP pArea, LPDBEVALINFO pEvalInfo ) if( pEvalInfo->dbsci.itmCobWhile ) { - hb_vmPushSymbol( &hb_symEval ); - hb_vmPush( pEvalInfo->dbsci.itmCobWhile ); - hb_vmDo( 0 ); - bWhile = hb_itemGetL( &hb_stack.Return ); + bWhile = hb_itemGetL( hb_vmEvalBlock( pEvalInfo->dbsci.itmCobWhile ) ); if( !bWhile ) break; } @@ -350,19 +339,14 @@ static ERRCODE defEval( AREAP pArea, LPDBEVALINFO pEvalInfo ) if( pEvalInfo->dbsci.itmCobFor ) { - hb_vmPushSymbol( &hb_symEval ); - hb_vmPush( pEvalInfo->dbsci.itmCobFor ); - hb_vmDo( 0 ); - bFor = hb_itemGetL( &hb_stack.Return ); + bFor = hb_itemGetL( hb_vmEvalBlock( pEvalInfo->dbsci.itmCobFor ) ); } else bFor = TRUE; if( bFor && bWhile ) { - hb_vmPushSymbol( &hb_symEval ); - hb_vmPush( pEvalInfo->itmBlock ); - hb_vmDo( 0 ); + hb_vmEvalBlock( pEvalInfo->itmBlock ); } SELF_SKIP( pArea, 1 ); SELF_EOF( pArea, &bEof ); @@ -373,9 +357,11 @@ static ERRCODE defEval( AREAP pArea, LPDBEVALINFO pEvalInfo ) static ERRCODE defEvalBlock( AREAP pArea, PHB_ITEM pBlock ) { + PHB_ITEM pResult; + HB_TRACE(HB_TR_DEBUG, ("defEvalBlock(%p, %p)", pArea, pBlock)); - if( !pBlock && !HB_IS_BLOCK( pBlock ) ) + if( !pBlock || !HB_IS_BLOCK( pBlock ) ) { PHB_ITEM pError; @@ -387,12 +373,10 @@ static ERRCODE defEvalBlock( AREAP pArea, PHB_ITEM pBlock ) return FAILURE; } - hb_vmPushSymbol( &hb_symEval ); - hb_vmPush( pBlock ); - hb_vmDo( 0 ); + pResult = hb_vmEvalBlock( pBlock ); if( !pArea->valResult ) pArea->valResult = hb_itemNew( NULL ); - hb_itemCopy( pArea->valResult, &hb_stack.Return ); + hb_itemCopy( pArea->valResult, pResult ); return SUCCESS; } @@ -691,11 +675,8 @@ static ERRCODE defSkipFilter( AREAP pArea, LONG lUpDown ) /* SET FILTER TO */ if( pArea->dbfi.fFilter ) { - hb_vmPushSymbol( &hb_symEval ); - hb_vmPush( pArea->dbfi.itmCobExpr ); - hb_vmDo( 0 ); - if( HB_IS_LOGICAL( &hb_stack.Return ) && - !hb_itemGetL( &hb_stack.Return ) ) + PHB_ITEM pResult = hb_vmEvalBlock( pArea->dbfi.itmCobExpr ); + if( HB_IS_LOGICAL( pResult ) && !hb_itemGetL( pResult ) ) { SELF_SKIPRAW( pArea, 1 ); continue; @@ -726,11 +707,8 @@ static ERRCODE defSkipFilter( AREAP pArea, LONG lUpDown ) /* SET FILTER TO */ if( pArea->dbfi.fFilter ) { - hb_vmPushSymbol( &hb_symEval ); - hb_vmPush( pArea->dbfi.itmCobExpr ); - hb_vmDo( 0 ); - if( HB_IS_LOGICAL( &hb_stack.Return ) && - !hb_itemGetL( &hb_stack.Return ) ) + PHB_ITEM pResult = hb_vmEvalBlock( pArea->dbfi.itmCobExpr ); + if( HB_IS_LOGICAL( pResult ) && !hb_itemGetL( pResult ) ) { SELF_SKIPRAW( pArea, 1 ); continue; @@ -1060,6 +1038,74 @@ ERRCODE hb_rddInherit( PRDDFUNCS pTable, PRDDFUNCS pSubTable, PRDDFUNCS pSuperTa return SUCCESS; } +/* closes (if requested) and releases the current area preparing it + * to be used with a new database +*/ +void hb_rddReleaseCurrentArea( BOOL bClose ) +{ + if( bClose ) + SELF_CLOSE( ( AREAP ) s_pCurrArea->pArea ); + SELF_RELEASE( ( AREAP ) s_pCurrArea->pArea ); + + if( s_pWorkAreas == s_pCurrArea ) + { + s_pWorkAreas = s_pCurrArea->pNext; + if( s_pWorkAreas ) + s_pWorkAreas->pPrev = NULL; + } + else + { + if( s_pCurrArea->pPrev ) + s_pCurrArea->pPrev->pNext = s_pCurrArea->pNext; + if( s_pCurrArea->pNext ) + s_pCurrArea->pNext->pPrev = s_pCurrArea->pPrev; + } + + hb_xfree( s_pCurrArea->pArea ); + hb_xfree( s_pCurrArea ); + s_pCurrArea = NULL; +} + +/* Prepares a new area node +*/ +LPAREANODE hb_rddNewAreaNode( LPRDDNODE pRddNode, USHORT uiRddID ) +{ + LPAREANODE pCurrArea = ( LPAREANODE ) hb_xgrab( sizeof( AREANODE ) ); + + if( pRddNode->uiAreaSize == 0 ) /* Calculate the size of WorkArea */ + { + USHORT uiSize; + + uiSize = sizeof( AREA ); /* Default Size Area */ + pCurrArea->pArea = ( AREAP ) hb_xgrab( uiSize ); + memset( pCurrArea->pArea, 0, uiSize ); + ( ( AREAP ) pCurrArea->pArea )->lprfsHost = &pRddNode->pTable; + + /* Need more space? */ + SELF_STRUCTSIZE( ( AREAP ) pCurrArea->pArea, &uiSize ); + if( uiSize > sizeof( AREA ) ) /* Size of Area changed */ + pCurrArea->pArea = ( AREAP ) hb_xrealloc( pCurrArea->pArea, uiSize ); + + pRddNode->uiAreaSize = uiSize; /* Update the size of WorkArea */ + } + else + { + pCurrArea->pArea = ( AREAP ) hb_xgrab( pRddNode->uiAreaSize ); + memset( pCurrArea->pArea, 0, pRddNode->uiAreaSize ); + ( ( AREAP ) pCurrArea->pArea )->lprfsHost = &pRddNode->pTable; + } + + ( ( AREAP ) pCurrArea->pArea )->rddID = uiRddID; + + pCurrArea->pPrev = NULL; + pCurrArea->pNext = NULL; + + SELF_NEW( ( AREAP ) pCurrArea->pArea ); + + return pCurrArea; +} + + /* * Function for getting current workarea pointer */ @@ -1568,26 +1614,7 @@ HB_FUNC( DBCLOSEAREA ) if( !s_pCurrArea ) return; - SELF_CLOSE( ( AREAP ) s_pCurrArea->pArea ); - SELF_RELEASE( ( AREAP ) s_pCurrArea->pArea ); - - if( s_pWorkAreas == s_pCurrArea ) - { - s_pWorkAreas = s_pCurrArea->pNext; - if( s_pWorkAreas ) - s_pWorkAreas->pPrev = NULL; - } - else - { - if( s_pCurrArea->pPrev ) - s_pCurrArea->pPrev->pNext = s_pCurrArea->pNext; - if( s_pCurrArea->pNext ) - s_pCurrArea->pNext->pPrev = s_pCurrArea->pPrev; - } - - hb_xfree( s_pCurrArea->pArea ); - hb_xfree( s_pCurrArea ); - s_pCurrArea = NULL; + hb_rddReleaseCurrentArea( TRUE ); /* close before releasing */ } HB_FUNC( DBCOMMIT ) @@ -1627,18 +1654,13 @@ HB_FUNC( __DBCONTINUE ) SELF_EOF( ( AREAP ) s_pCurrArea->pArea, &bEof ); if( bEof ) return; - hb_vmPushSymbol( &hb_symEval ); - hb_vmPush( ( ( AREAP ) s_pCurrArea->pArea )->dbsi.itmCobFor ); - hb_vmDo( 0 ); - ( ( AREAP ) s_pCurrArea->pArea )->fFound = hb_itemGetL( &hb_stack.Return ); + + ( ( AREAP ) s_pCurrArea->pArea )->fFound = hb_itemGetL( hb_vmEvalBlock( ( ( AREAP ) s_pCurrArea->pArea )->dbsi.itmCobFor ) ); while( !bEof && !( ( AREAP ) s_pCurrArea->pArea )->fFound ) { SELF_SKIP( ( AREAP ) s_pCurrArea->pArea, 1 ); SELF_EOF( ( AREAP ) s_pCurrArea->pArea, &bEof ); - hb_vmPushSymbol( &hb_symEval ); - hb_vmPush( ( ( AREAP ) s_pCurrArea->pArea )->dbsi.itmCobFor ); - hb_vmDo( 0 ); - ( ( AREAP ) s_pCurrArea->pArea )->fFound = hb_itemGetL( &hb_stack.Return ); + ( ( AREAP ) s_pCurrArea->pArea )->fFound = hb_itemGetL( hb_vmEvalBlock( ( ( AREAP ) s_pCurrArea->pArea )->dbsi.itmCobFor ) ); } } @@ -1714,60 +1736,14 @@ HB_FUNC( DBCREATE ) hb_rddSelectFirstAvailable(); else if( s_pCurrArea ) /* If current WorkArea is in use then close it */ { - SELF_CLOSE( ( AREAP ) s_pCurrArea->pArea ); - SELF_RELEASE( ( AREAP ) s_pCurrArea->pArea ); - - if( s_pWorkAreas == s_pCurrArea ) - { - s_pWorkAreas = s_pCurrArea->pNext; - if( s_pWorkAreas ) - s_pWorkAreas->pPrev = NULL; - } - else - { - if( s_pCurrArea->pPrev ) - s_pCurrArea->pPrev->pNext = s_pCurrArea->pNext; - if( s_pCurrArea->pNext ) - s_pCurrArea->pNext->pPrev = s_pCurrArea->pPrev; - } - - hb_xfree( s_pCurrArea->pArea ); - hb_xfree( s_pCurrArea ); - s_pCurrArea = NULL; + hb_rddReleaseCurrentArea( TRUE ); /* close before releasing */ } } /* Create a new WorkArea node */ - s_pCurrArea = ( LPAREANODE ) hb_xgrab( sizeof( AREANODE ) ); + s_pCurrArea = hb_rddNewAreaNode( pRddNode, uiRddID ); - if( pRddNode->uiAreaSize == 0 ) /* Calculate the size of WorkArea */ - { - uiSize = sizeof( AREA ); /* Default Size Area */ - s_pCurrArea->pArea = ( AREAP ) hb_xgrab( uiSize ); - memset( s_pCurrArea->pArea, 0, uiSize ); - ( ( AREAP ) s_pCurrArea->pArea )->lprfsHost = &pRddNode->pTable; - - /* Need more space? */ - SELF_STRUCTSIZE( ( AREAP ) s_pCurrArea->pArea, &uiSize ); - if( uiSize > sizeof( AREA ) ) /* Size of Area changed */ - s_pCurrArea->pArea = ( AREAP ) hb_xrealloc( s_pCurrArea->pArea, uiSize ); - - pRddNode->uiAreaSize = uiSize; /* Update the size of WorkArea */ - } - else - { - s_pCurrArea->pArea = ( AREAP ) hb_xgrab( pRddNode->uiAreaSize ); - memset( s_pCurrArea->pArea, 0, pRddNode->uiAreaSize ); - ( ( AREAP ) s_pCurrArea->pArea )->lprfsHost = &pRddNode->pTable; - } - - ( ( AREAP ) s_pCurrArea->pArea )->rddID = uiRddID; - - s_pCurrArea->pPrev = NULL; - s_pCurrArea->pNext = NULL; - - SELF_NEW( ( AREAP ) s_pCurrArea->pArea ); if( SELF_CREATEFIELDS( ( AREAP ) s_pCurrArea->pArea, pStruct ) == FAILURE ) { SELF_RELEASE( ( AREAP ) s_pCurrArea->pArea ); @@ -2029,19 +2005,13 @@ HB_FUNC( __DBLOCATE ) return; if( hb_itemType( pWhile ) == HB_IT_BLOCK ) { - hb_vmPushSymbol( &hb_symEval ); - hb_vmPush( pWhile ); - hb_vmDo( 0 ); - bWhile = hb_itemGetL( &hb_stack.Return ); + bWhile = hb_itemGetL( hb_vmEvalBlock( pWhile ) ); } else bWhile = hb_itemGetL( pWhile ); if( hb_itemType( pFor ) == HB_IT_BLOCK ) { - hb_vmPushSymbol( &hb_symEval ); - hb_vmPush( pFor ); - hb_vmDo( 0 ); - bFor = hb_itemGetL( &hb_stack.Return ); + bFor = hb_itemGetL( hb_vmEvalBlock( pFor ) ); ( ( AREAP ) s_pCurrArea->pArea )->fFound = ( bWhile && bFor ); } else @@ -2055,19 +2025,13 @@ HB_FUNC( __DBLOCATE ) return; if( hb_itemType( pWhile ) == HB_IT_BLOCK ) { - hb_vmPushSymbol( &hb_symEval ); - hb_vmPush( pWhile ); - hb_vmDo( 0 ); - bWhile = hb_itemGetL( &hb_stack.Return ); + bWhile = hb_itemGetL( hb_vmEvalBlock( pWhile ) ); } else bWhile = hb_itemGetL( pWhile ); if( hb_itemType( pFor ) == HB_IT_BLOCK ) { - hb_vmPushSymbol( &hb_symEval ); - hb_vmPush( pFor ); - hb_vmDo( 0 ); - bFor = hb_itemGetL( &hb_stack.Return ); + bFor = hb_itemGetL( hb_vmEvalBlock( pFor ) ); } else bFor = hb_itemGetL( pFor ); @@ -2077,19 +2041,13 @@ HB_FUNC( __DBLOCATE ) SELF_EOF( ( AREAP ) s_pCurrArea->pArea, &bEof ); if( hb_itemType( pWhile ) == HB_IT_BLOCK ) { - hb_vmPushSymbol( &hb_symEval ); - hb_vmPush( pWhile ); - hb_vmDo( 0 ); - bWhile = hb_itemGetL( &hb_stack.Return ); + bWhile = hb_itemGetL( hb_vmEvalBlock( pWhile ) ); } else bWhile = hb_itemGetL( pWhile ); if( hb_itemType( pFor ) == HB_IT_BLOCK ) { - hb_vmPushSymbol( &hb_symEval ); - hb_vmPush( pFor ); - hb_vmDo( 0 ); - bFor = hb_itemGetL( &hb_stack.Return ); + bFor = hb_itemGetL( hb_vmEvalBlock( pFor ) ); } else bFor = hb_itemGetL( pFor ); @@ -2103,19 +2061,13 @@ HB_FUNC( __DBLOCATE ) return; if( hb_itemType( pWhile ) == HB_IT_BLOCK ) { - hb_vmPushSymbol( &hb_symEval ); - hb_vmPush( pWhile ); - hb_vmDo( 0 ); - bWhile = hb_itemGetL( &hb_stack.Return ); + bWhile = hb_itemGetL( hb_vmEvalBlock( pWhile ) ); } else bWhile = hb_itemGetL( pWhile ); if( hb_itemType( pFor ) == HB_IT_BLOCK ) { - hb_vmPushSymbol( &hb_symEval ); - hb_vmPush( pFor ); - hb_vmDo( 0 ); - bFor = hb_itemGetL( &hb_stack.Return ); + bFor = hb_itemGetL( hb_vmEvalBlock( pFor ) ); } else bFor = hb_itemGetL( pFor ); @@ -2125,19 +2077,13 @@ HB_FUNC( __DBLOCATE ) SELF_EOF( ( AREAP ) s_pCurrArea->pArea, &bEof ); if( hb_itemType( pWhile ) == HB_IT_BLOCK ) { - hb_vmPushSymbol( &hb_symEval ); - hb_vmPush( pWhile ); - hb_vmDo( 0 ); - bWhile = hb_itemGetL( &hb_stack.Return ); + bWhile = hb_itemGetL( hb_vmEvalBlock( pWhile ) ); } else bWhile = hb_itemGetL( pWhile ); if( hb_itemType( pFor ) == HB_IT_BLOCK ) { - hb_vmPushSymbol( &hb_symEval ); - hb_vmPush( pFor ); - hb_vmDo( 0 ); - bFor = hb_itemGetL( &hb_stack.Return ); + bFor = hb_itemGetL( hb_vmEvalBlock( pFor ) ); } else bFor = hb_itemGetL( pFor ); @@ -2152,10 +2098,7 @@ HB_FUNC( __DBLOCATE ) return; if( hb_itemType( pFor ) == HB_IT_BLOCK ) { - hb_vmPushSymbol( &hb_symEval ); - hb_vmPush( pFor ); - hb_vmDo( 0 ); - bFor = hb_itemGetL( &hb_stack.Return ); + bFor = hb_itemGetL( hb_vmEvalBlock( pFor ) ); } else bFor = hb_itemGetL( pFor ); @@ -2165,10 +2108,7 @@ HB_FUNC( __DBLOCATE ) SELF_EOF( ( AREAP ) s_pCurrArea->pArea, &bEof ); if( hb_itemType( pFor ) == HB_IT_BLOCK ) { - hb_vmPushSymbol( &hb_symEval ); - hb_vmPush( pFor ); - hb_vmDo( 0 ); - bFor = hb_itemGetL( &hb_stack.Return ); + bFor = hb_itemGetL( hb_vmEvalBlock( pFor ) ); } else bFor = hb_itemGetL( pFor ); @@ -2486,7 +2426,7 @@ HB_FUNC( DBUSEAREA ) char * szDriver, * szFileName; LPRDDNODE pRddNode; LPAREANODE pAreaNode; - USHORT uiSize, uiRddID, uiLen; + USHORT uiRddID, uiLen; ULONG ulLen; DBOPENINFO pInfo; PHB_FNAME pFileName; @@ -2500,26 +2440,7 @@ HB_FUNC( DBUSEAREA ) hb_rddSelectFirstAvailable(); else if( s_pCurrArea ) /* If current WorkArea is in use then close it */ { - SELF_CLOSE( ( AREAP ) s_pCurrArea->pArea ); - SELF_RELEASE( ( AREAP ) s_pCurrArea->pArea ); - - if( s_pWorkAreas == s_pCurrArea ) - { - s_pWorkAreas = s_pCurrArea->pNext; - if( s_pWorkAreas ) - s_pWorkAreas->pPrev = NULL; - } - else - { - if( s_pCurrArea->pPrev ) - s_pCurrArea->pPrev->pNext = s_pCurrArea->pNext; - if( s_pCurrArea->pNext ) - s_pCurrArea->pNext->pPrev = s_pCurrArea->pPrev; - } - - hb_xfree( s_pCurrArea->pArea ); - hb_xfree( s_pCurrArea ); - s_pCurrArea = NULL; + hb_rddReleaseCurrentArea( TRUE ); /* close before releasing */ } hb_rddCheck(); @@ -2568,35 +2489,7 @@ HB_FUNC( DBUSEAREA ) /* Create a new WorkArea node */ - s_pCurrArea = ( LPAREANODE ) hb_xgrab( sizeof( AREANODE ) ); - - if( pRddNode->uiAreaSize == 0 ) /* Calculate the size of WorkArea */ - { - uiSize = sizeof( AREA ); /* Default Size Area */ - s_pCurrArea->pArea = ( AREAP ) hb_xgrab( uiSize ); - memset( s_pCurrArea->pArea, 0, uiSize ); - ( ( AREAP ) s_pCurrArea->pArea )->lprfsHost = &pRddNode->pTable; - - /* Need more space? */ - SELF_STRUCTSIZE( ( AREAP ) s_pCurrArea->pArea, &uiSize ); - if( uiSize > sizeof( AREA ) ) /* Size of Area changed */ - s_pCurrArea->pArea = ( AREAP ) hb_xrealloc( s_pCurrArea->pArea, uiSize ); - - pRddNode->uiAreaSize = uiSize; /* Update the size of WorkArea */ - } - else - { - s_pCurrArea->pArea = ( AREAP ) hb_xgrab( pRddNode->uiAreaSize ); - memset( s_pCurrArea->pArea, 0, pRddNode->uiAreaSize ); - ( ( AREAP ) s_pCurrArea->pArea )->lprfsHost = &pRddNode->pTable; - } - - ( ( AREAP ) s_pCurrArea->pArea )->rddID = uiRddID; - - s_pCurrArea->pPrev = NULL; - s_pCurrArea->pNext = NULL; - - SELF_NEW( ( AREAP ) s_pCurrArea->pArea ); + s_pCurrArea = hb_rddNewAreaNode( pRddNode, uiRddID ); szFileName = ( char * ) hb_xgrab( _POSIX_PATH_MAX + 3 ); strcpy( szFileName, hb_parc( 3 ) ); diff --git a/harbour/source/rtl/filesys.c b/harbour/source/rtl/filesys.c index 36b33ca4f9..a088bf1cd3 100644 --- a/harbour/source/rtl/filesys.c +++ b/harbour/source/rtl/filesys.c @@ -936,6 +936,48 @@ BOOL hb_fsLock ( FHANDLE hFileHandle, ULONG ulStart, hb_fsSeek( hFileHandle, ulOldPos, FS_SET ); } +#elif defined(__GNUC__) && defined(HB_OS_UNIX) + errno = 0; + { + /* TODO: check for append locks (SEEK_END) + */ + struct flock lock_info; + + switch( uiMode ) + { + case FL_LOCK: + { + lock_info.l_type = F_WRLCK; + lock_info.l_start = ulStart; + lock_info.l_len = ulLength; + lock_info.l_whence = SEEK_SET; /* start from the beginning of the file */ + lock_info.l_pid = getpid(); + iResult = fcntl( hFileHandle, F_SETLK, &lock_info ); + if( iResult < 0 ) + iResult = FALSE; /* lock failed */ + else + iResult = TRUE; /* lock was successful */ + } + break; + + case FL_UNLOCK: + { + lock_info.l_type = F_UNLCK; /* unlock */ + lock_info.l_start = ulStart; + lock_info.l_len = ulLength; + lock_info.l_whence = SEEK_SET; + lock_info.l_pid = getpid(); + iResult = fcntl( hFileHandle, F_SETLK, &lock_info ); + if( iResult < 0 ) + iResult = 0; /* lock failed */ + } + break; + + default: + iResult = 0; + } + } + s_uiErrorLast = errno; #else iResult = 1; @@ -950,7 +992,11 @@ void hb_fsCommit( FHANDLE hFileHandle ) { HB_TRACE(HB_TR_DEBUG, ("hb_fsCommit(%p)", hFileHandle)); -#if defined(HB_FS_FILE_IO) && !defined(HB_OS_OS2) +#if defined(__WATCOMC__) + + _dos_commit( hFileHandle ); + +#elif defined(HB_FS_FILE_IO) && !defined(HB_OS_OS2) && !defined(HB_OS_UNIX) { int dup_handle; @@ -976,6 +1022,12 @@ void hb_fsCommit( FHANDLE hFileHandle ) s_uiErrorLast = errno; } +#elif defined(HB_OS_UNIX) + /* NOTE: close() functions releases all lock regardles if it is an + * original or duplicated file handle + */ + s_uiErrorLast = FS_ERROR; + #else s_uiErrorLast = FS_ERROR; diff --git a/harbour/source/vm/hvm.c b/harbour/source/vm/hvm.c index d90d8c9df4..07ed403b49 100644 --- a/harbour/source/vm/hvm.c +++ b/harbour/source/vm/hvm.c @@ -2806,6 +2806,46 @@ static HARBOUR hb_vmDoBlock( void ) hb_stack.pBase->item.asSymbol.lineno = uiLine; } +/* Evaluates a passed codeblock item with no arguments passed to a codeblock +*/ +HB_ITEM_PTR hb_vmEvalBlock( HB_ITEM_PTR pBlock ) +{ + HB_TRACE(HB_TR_DEBUG, ("hb_vmEvalBlock(%p)", pBlock)); + + hb_vmPushSymbol( &hb_symEval ); + hb_vmPush( pBlock ); + hb_vmDo( 0 ); + return &hb_stack.Return; +} + +/* Evaluates a codeblock item using passed additional arguments + * pBlock = an item of codeblock type to evaluate + * uiArgCount = number of arguments passed to a codeblock + * ... = the list of arguments of type PHB_ITEM + * + *for example: + * retVal = hb_vmEvalBlockV( pBlock, 2, pParam1, pParam2 ); +*/ +HB_ITEM_PTR hb_vmEvalBlockV( HB_ITEM_PTR pBlock, USHORT uiArgCount, ... ) +{ + va_list va; + USHORT i; + + HB_TRACE(HB_TR_DEBUG, ("hb_vmEvalBlockV(%p, %hu, ...)", pBlock, uiArgCount)); + + hb_vmPushSymbol( &hb_symEval ); + hb_vmPush( pBlock ); + + va_start( va, uiArgCount ); + for( i=1; i<= uiArgCount; i++ ) + hb_vmPush( va_arg( va, PHB_ITEM ) ); + va_end( va ); + + hb_vmDo( uiArgCount ); + + return &hb_stack.Return; +} + void hb_vmFunction( USHORT uiParams ) { HB_TRACE(HB_TR_DEBUG, ("hb_vmFunction(%hu)", uiParams));