2004-03-08 19:50 UTC+0300 Alexander Kresin <alex@belacy.belgorod.su>

This commit is contained in:
Alexander S.Kresin
2004-03-08 16:49:56 +00:00
parent a03bd59f6e
commit 35d723904d
22 changed files with 5503 additions and 4668 deletions

File diff suppressed because it is too large Load Diff

3935
harbour/ChangeLog.014 Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -202,6 +202,7 @@ extern ULONG hb_fsAttrToRaw( USHORT uiAttr );
extern USHORT hb_fsAttrEncode( const char * szAttr );
extern char * hb_fsAttrDecode( USHORT uiAttr, char * szAttr );
extern BYTE * hb_filecase ( char * ); /* Convert string to environment case */
extern BYTE HB_EXPORT * hb_fileNameConv(char *str) ;
#if defined(HB_EXTERN_C)
}

View File

@@ -118,6 +118,8 @@ extern int hb_matherr (HB_MATH_EXCEPTION * pexc);
extern HB_MATH_HANDLERPROC hb_mathSetHandler (HB_MATH_HANDLERPROC handlerproc);
extern HB_MATH_HANDLERPROC hb_mathGetHandler (void);
extern double hb_random_num( void );
/* include defines from math.ch */
#include <math.ch>

View File

@@ -53,17 +53,19 @@
#ifndef HB_RDDCDX_H_
#define HB_RDDCDX_H_
#include "hbsetup.h"
#include "hbapirdd.h"
#include "hbdbferr.h"
#ifndef HB_CDP_SUPPORT_OFF
#include "hbapicdp.h"
#endif
#define HB_EXTERNAL_RDDDBF_USE
#include "hbrdddbf.h"
#if defined(HB_EXTERN_C)
extern "C" {
#endif
/* CDX constants and defaults */
#define CDX_INDEXEXT ".cdx"
#define CDX_MAXKEY 240
@@ -72,10 +74,10 @@ extern "C" {
#define CDX_INT_FREESPACE 500
#define CDX_EXT_FREESPACE 488
#define CDX_DUMMYNODE 0xFFFFFFFFL
#define CDX_LOCKOFFSET 0x7FFFFFFEL
#define CDX_LOCKSIZE 1L
//#define CDX_LOCKOFFSET 0x7FFFFFFEL
//#define CDX_LOCKSIZE 1L
#define CDX_STACKSIZE 64
#define CDX_PAGECACHESIZE 16
#define CDX_PAGECACHESIZE 8
#define CDX_NODE_BRANCH 0
#define CDX_NODE_ROOT 1
#define CDX_NODE_LEAF 2
@@ -113,7 +115,7 @@ extern "C" {
#define CURKEY_ISSET(pTag) (((pTag)->curKeyState & (CDX_CURKEY_NOTEXIST | CDX_CURKEY_UNDEF)) == 0)
#define CURKEY_REC(pTag) ((((pTag)->curKeyState & CDX_CURKEY_REC) != 0) ? (pTag)->curKey->rec : 0)
#define CURKEY_VAL(pTag) ((((pTag)->curKeyState & CDX_CURKEY_VAL) != 0) ? (pTag)->curKey->val : NULL)
#define CURKEY_REFRESH(pTag)
#define CURKEY_REFRESH(pTag)
*/
#define HB_CDXMAXKEY( x ) ((USHORT) ((x) > CDX_MAXKEY ? CDX_MAXKEY : (x)))
@@ -147,7 +149,7 @@ typedef struct _CDXTAGHEADER
BYTE forExpPos[ 2 ]; /* offset of filter expression */
BYTE forExpLen[ 2 ]; /* length of filter expression */
BYTE keyExpPos[ 2 ]; /* offset of key expression */
BYTE keyExpLen[ 2 ]; /* length of key expression */
BYTE keyExpLen[ 2 ]; /* length of key expression */
BYTE keyExpPool[ CDX_PAGELEN ];
} CDXTAGHEADER;
typedef CDXTAGHEADER * LPCDXTAGHEADER;
@@ -232,7 +234,7 @@ typedef struct _CDXPAGE
SHORT bufKeyLen; /* and maybe temporary overwriten when adding */
SHORT iFree; /* new key to interior node record. */
BYTE * pKeyBuf; /* pointer to uncompressed leaf page key pool */
//SHORT iKeyInBuf;
/* SHORT iKeyInBuf; */
struct _CDXPAGE * Owner;
struct _CDXPAGE * Child;
@@ -320,6 +322,11 @@ typedef struct _CDXINDEX
LPCDXLIST freeLst; /* list of free pages in index file */
int lockWrite; /* number of write lock set */
int lockRead; /* number of read lock set */
ULONG ulLockPos; /* readlock position for CL53 lock scheme */
#ifdef HB_CDX_DBGCODE
BOOL RdLck;
BOOL WrLck;
#endif
BOOL fChanged; /* changes written to index, need upadte ulVersion */
ULONG ulVersion; /* network version/update flag */
} CDXINDEX;
@@ -391,10 +398,12 @@ typedef struct _CDXAREA
BOOL fDeleted; /* TRUE if record is deleted */
BOOL fUpdateHeader; /* Update header of file */
BOOL fFLocked; /* TRUE if file is locked */
BOOL fHeaderLocked; /* TRUE if DBF header is locked */
LPDBRELINFO lpdbPendingRel; /* Pointer to parent rel struct */
BYTE bYear; /* Last update */
BYTE bMonth;
BYTE bDay;
BYTE bLockType; /* Type of locking shemes */
ULONG * pLocksPos; /* List of records locked */
ULONG ulNumLocksPos; /* Number of records locked */
#ifndef HB_CDP_SUPPORT_OFF

View File

@@ -66,6 +66,40 @@ extern "C" {
#define DBF_TABLEEXT ".dbf"
/* DBF lock */
#define DBF_LOCKPOS 1000000000L
/* DBF locking schemes */
#define DBF_LOCKPOS_CLIP 1000000000L
#define DBF_LOCKPOS_CL53 1000000000L
#define DBF_LOCKPOS_VFP 0x40000000L
#define DBF_LOCKPOS_VFPX 0x7ffffffeL
#define DBF_LOCKDIR_CLIP 1
#define DBF_LOCKDIR_CL53 1
#define DBF_LOCKDIR_VFP 2 /* lock forward at at record offset */
#define DBF_LOCKDIR_VFPX -1
#define DBF_FLCKSIZE_CLIP 1000000000L
#define DBF_FLCKSIZE_CL53 1000000000L
#define DBF_FLCKSIZE_VFP 0x3ffffffdL
#define DBF_FLCKSIZE_VFPX 0x07ffffffL
#define DBF_RLCKSIZE_CLIP 1L
#define DBF_RLCKSIZE_CL53 1L
#define DBF_RLCKSIZE_VFP 1L
#define DBF_RLCKSIZE_VFPX 1L
#define IDX_LOCKPOS_CLIP 1000000000L
#define IDX_LOCKPOS_CL53 0xfffeffffL
#define IDX_LOCKPOS_VFP 0x7ffffffeL
#define IDX_LOCKPOOL_CLIP 0L
#define IDX_LOCKPOOL_CL53 0x00010000L
#define IDX_LOCKPOOL_VFP 0L
#ifdef OS_UNIX_COMPATIBLE
#define DBF_EXLUSIVE_LOCKPOS 0x7fffffffL
#define DBF_EXLUSIVE_LOCKSIZE 1L
#endif
@@ -134,10 +168,12 @@ typedef struct _DBFAREA
BOOL fDeleted; /* TRUE if record is deleted */
BOOL fUpdateHeader; /* Update header of file */
BOOL fFLocked; /* TRUE if file is locked */
BOOL fHeaderLocked; /* TRUE if DBF header is locked */
LPDBRELINFO lpdbPendingRel; /* Pointer to parent rel struct */
BYTE bYear; /* Last update */
BYTE bMonth;
BYTE bDay;
BYTE bLockType; /* Type of locking shemes */
ULONG * pLocksPos; /* List of records locked */
ULONG ulNumLocksPos; /* Number of records locked */
PHB_CODEPAGE cdPage; /* Area's codepage pointer */
@@ -150,7 +186,7 @@ typedef DBFAREA * LPDBFAREA;
#endif
#ifndef HB_EXTRANAL_RDDDBF_USE
#ifndef HB_EXTERNAL_RDDDBF_USE
/*
* -- DBF METHODS --
@@ -256,7 +292,13 @@ static BOOL hb_dbfExists( PHB_ITEM pItemTable, PHB_ITEM pItemIndex );
#define hb_dbfWhoCares NULL
#endif /* HB_EXTRANAL_RDDDBF_USE */
#endif /* HB_EXTERNAL_RDDDBF_USE */
extern ULONG HB_EXPORT hb_dbfGetMemoBlock( DBFAREAP pArea, USHORT uiIndex );
extern void HB_EXPORT hb_dbfPutMemoBlock( DBFAREAP pArea, USHORT uiIndex, ULONG ulBlock );
extern ERRCODE HB_EXPORT hb_dbfGetEGcode( ERRCODE errCode );
extern BOOL HB_EXPORT hb_dbfLockIdxFile( FHANDLE hFile, BYTE bScheme, USHORT usMode, ULONG *pPoolPos );
extern BOOL HB_EXPORT hb_dbfLockIdxGetData( BYTE bScheme, ULONG *ulPos, ULONG *ulPool );
#if defined(HB_EXTERN_C)
}

View File

@@ -59,7 +59,7 @@
#ifndef HB_CDP_SUPPORT_OFF
#include "hbapicdp.h"
#endif
#define HB_EXTRANAL_RDDDBF_USE
#define HB_EXTERNAL_RDDDBF_USE
#include "hbrdddbf.h"
#if defined(HB_EXTERN_C)

View File

@@ -53,20 +53,20 @@
#ifndef HB_RDDFPT_H_
#define HB_RDDFPT_H_
#include "hbsetup.h"
#include "hbdbf.h"
#include "hbdbferr.h"
#include "hbapirdd.h"
#ifndef HB_CDP_SUPPORT_OFF
#include "hbapicdp.h"
#endif
#define HB_EXTRANAL_RDDDBF_USE
#define HB_EXTERNAL_RDDDBF_USE
#include "hbrdddbf.h"
#if defined(HB_EXTERN_C)
extern "C" {
#endif
/* MEMO constants and defaults */
#define FPT_MEMOEXT ".fpt"
#define FPT_LOCKPOS 0x00000000L
@@ -115,16 +115,20 @@ extern "C" {
#define FPTIT_FLEX_LONG 0x03F6
#define FPTIT_FLEX_DOUBLE 0x03F8
#define FPTIT_FLEXAR_ARAY 0x0C
#define FPTIT_FLEXAR_NIL 0x00
#define FPTIT_FLEXAR_TRUE 0x19
#define FPTIT_FLEXAR_FALSE 0x1A
#define FPTIT_FLEXAR_DATE 0x0E
#define FPTIT_FLEXAR_BYTE 0x12
#define FPTIT_FLEXAR_SHORT 0x13
#define FPTIT_FLEXAR_LONG 0x20
#define FPTIT_FLEXAR_DBL 0x0F
#define FPTIT_FLEXAR_STR 0x07
#define FPTIT_FLEXAR_ARAY 0x0C
#define FPTIT_FLEXAR_NIL 0x00
#define FPTIT_FLEXAR_TRUE 0x19
#define FPTIT_FLEXAR_FALSE 0x1A
#define FPTIT_FLEXAR_DATE 0x0E
#define FPTIT_FLEXAR_BYTE1 0x11
#define FPTIT_FLEXAR_BYTE 0x12
#define FPTIT_FLEXAR_BYTE2 0x1D
#define FPTIT_FLEXAR_SHORT 0x13
#define FPTIT_FLEXAR_SHORT2 0x1E
#define FPTIT_FLEXAR_LONG 0x20
#define FPTIT_FLEXAR_DBL 0x0F
#define FPTIT_FLEXAR_STR 0x07
#define FPTIT_FLEXAR_NUL 0x18
/*
#define HB_IT_NIL ( ( USHORT ) 0x0000 )
@@ -311,8 +315,4 @@ static ERRCODE hb_fptWriteDBHeader( FPTAREAP pArea );
}
#endif
extern ULONG hb_dbfGetMemoBlock( DBFAREAP pArea, USHORT uiIndex );
extern void hb_dbfPutMemoBlock( DBFAREAP pArea, USHORT uiIndex, ULONG ulBlock );
extern ERRCODE hb_dbfGetEGcode( ERRCODE errCode );
#endif /* HB_RDDFPT */

View File

@@ -283,10 +283,12 @@ typedef struct _NTXAREA
BOOL fDeleted; /* TRUE if record is deleted */
BOOL fUpdateHeader; /* Update header of file */
BOOL fFLocked; /* TRUE if file is locked */
BOOL fHeaderLocked; /* TRUE if DBF header is locked */
LPDBRELINFO lpdbPendingRel; /* Pointer to parent rel struct */
BYTE bYear; /* Last update */
BYTE bMonth;
BYTE bDay;
BYTE bLockType; /* Type of locking shemes */
ULONG * pLocksPos; /* List of records locked */
ULONG ulNumLocksPos; /* Number of records locked */
PHB_CODEPAGE cdPage; /* Area's codepage pointer */

View File

@@ -128,7 +128,8 @@ typedef enum
HB_SET_FILECASE = 102,
HB_SET_DIRCASE = 103,
HB_SET_DIRSEPARATOR = 104,
HB_SET_EOF = 105
HB_SET_EOF = 105,
HB_SET_DBFLOCKSCHEME = 106
} HB_set_enum;
@@ -192,12 +193,18 @@ typedef struct
char HB_SET_DIRSEPARATOR;
int HB_SET_VIDEOMODE;
BOOL HB_SET_WRAP;
int HB_SET_DBFLOCKSCHEME;
} HB_SET_STRUCT;
#define HB_SET_CASE_MIXED 0
#define HB_SET_CASE_LOWER 1
#define HB_SET_CASE_UPPER 2
#define HB_SET_DBFLOCK_DEFAULT 0
#define HB_SET_DBFLOCK_CLIP 1
#define HB_SET_DBFLOCK_CL53 2
#define HB_SET_DBFLOCK_VFP 3
extern HB_SET_STRUCT hb_set;
extern void hb_setInitialize( void );

View File

@@ -257,6 +257,7 @@ RTL_LIB_OBJS = \
$(OBJ_DIR)\gtapiu.obj \
$(OBJ_DIR)\gx.obj \
$(OBJ_DIR)\hardcr.obj \
$(OBJ_DIR)\hbrandom.obj \
$(OBJ_DIR)\idle.obj \
$(OBJ_DIR)\inkey.obj \
$(OBJ_DIR)\is.obj \
@@ -1535,6 +1536,10 @@ $(OBJ_DIR)\hardcr.obj : $(RTL_DIR)\hardcr.c
$(CC) $(CLIBFLAGS) -o$@ $**
tlib $(RTL_LIB) $(ARFLAGS) -+$@,,
$(OBJ_DIR)\hbrandom.obj : $(RTL_DIR)\hbrandom.c
$(CC) $(CLIBFLAGS) -o$@ $**
tlib $(RTL_LIB) $(ARFLAGS) -+$@,,
$(OBJ_DIR)\idle.obj : $(RTL_DIR)\idle.c
$(CC) $(CLIBFLAGS) -o$@ $**
tlib $(RTL_LIB) $(ARFLAGS) -+$@,,

View File

@@ -310,6 +310,7 @@ RTL_LIB_OBJS = \
$(OBJ_DIR)\gtapiu.obj \
$(OBJ_DIR)\gx.obj \
$(OBJ_DIR)\hardcr.obj \
$(OBJ_DIR)\hbrandom.obj \
$(OBJ_DIR)\idle.obj \
$(OBJ_DIR)\inkey.obj \
$(OBJ_DIR)\is.obj \

View File

@@ -274,6 +274,7 @@ RTL_LIB_OBJS = \
$(OBJ_DIR)\gtapiu.obj \
$(OBJ_DIR)\gx.obj \
$(OBJ_DIR)\hardcr.obj \
$(OBJ_DIR)\hbrandom.obj \
$(OBJ_DIR)\idle.obj \
$(OBJ_DIR)\inkey.obj \
$(OBJ_DIR)\is.obj \

View File

@@ -60,10 +60,11 @@
#include "hbapilng.h"
#include "hbset.h"
#include "hbdate.h"
#include "hbmath.h"
#include "hbdbsort.h"
#include "error.ch"
#include <errno.h>
# include "hbapicdp.h"
#include "hbapicdp.h"
extern PHB_CODEPAGE s_cdpage;
#define __PRG_SOURCE__ __FILE__
@@ -289,36 +290,44 @@ static BOOL hb_dbfWriteRecord( DBFAREAP pArea )
/*
* Unlock all records.
*/
static void hb_dbfUnlockAllRecords( DBFAREAP pArea )
static ERRCODE hb_dbfUnlockAllRecords( DBFAREAP pArea )
{
ULONG ulCount;
ERRCODE uiError = SUCCESS;
HB_TRACE(HB_TR_DEBUG, ("hb_dbfUnlockAllRecords(%p, %p)", pArea ));
if( pArea->pLocksPos )
{
ULONG ulCount;
uiError = SELF_GOCOLD( ( AREAP ) pArea );
for( ulCount = 0; ulCount < pArea->ulNumLocksPos; ulCount++ )
SELF_RAWLOCK( ( AREAP ) pArea, REC_UNLOCK, pArea->pLocksPos[ ulCount ] );
hb_xfree( pArea->pLocksPos );
pArea->pLocksPos = NULL;
}
pArea->ulNumLocksPos = 0;
return uiError;
}
/*
* Unlock a records.
*/
static void hb_dbfUnlockRecord( DBFAREAP pArea, ULONG ulRecNo )
static ERRCODE hb_dbfUnlockRecord( DBFAREAP pArea, ULONG ulRecNo )
{
ERRCODE uiError = SUCCESS;
ULONG ulCount, * pList;
HB_TRACE(HB_TR_DEBUG, ("hb_dbfUnlockRecord(%p, %lu)", pArea, ulRecNo));
if( ulRecNo <= 0 )
ulRecNo = 1;
/* Search the locked record */
for( ulCount = 0; ulCount < pArea->ulNumLocksPos &&
pArea->pLocksPos[ ulCount ] != ulRecNo; ulCount++ );
if( SELF_RAWLOCK( ( AREAP ) pArea, REC_UNLOCK, ulRecNo ) == SUCCESS )
if( ulCount < pArea->ulNumLocksPos )
{
uiError = SELF_GOCOLD( ( AREAP ) pArea );
SELF_RAWLOCK( ( AREAP ) pArea, REC_UNLOCK, ulRecNo );
if( pArea->ulNumLocksPos == 1 ) /* Delete the list */
{
hb_xfree( pArea->pLocksPos );
@@ -327,23 +336,16 @@ static void hb_dbfUnlockRecord( DBFAREAP pArea, ULONG ulRecNo )
}
else /* Resize the list */
{
/* Search the locked record */
for( ulCount = 0; ulCount < pArea->ulNumLocksPos; ulCount++ )
{
if( pArea->pLocksPos[ ulCount ] == ulRecNo )
{
pList = pArea->pLocksPos + ulCount;
memmove( pList, pList + 1, ( pArea->ulNumLocksPos - ulCount - 1 ) *
sizeof( ULONG ) );
pArea->pLocksPos = ( ULONG * ) hb_xrealloc( pArea->pLocksPos,
( pArea->ulNumLocksPos - 1 ) *
sizeof( ULONG ) );
pArea->ulNumLocksPos --;
return;
}
}
pList = pArea->pLocksPos + ulCount;
memmove( pList, pList + 1, ( pArea->ulNumLocksPos - ulCount - 1 ) *
sizeof( ULONG ) );
pArea->pLocksPos = ( ULONG * ) hb_xrealloc( pArea->pLocksPos,
( pArea->ulNumLocksPos - 1 ) *
sizeof( ULONG ) );
pArea->ulNumLocksPos --;
}
}
return uiError;
}
/*
@@ -364,6 +366,7 @@ static ERRCODE hb_dbfLockRecord( DBFAREAP pArea, ULONG ulRecNo, BOOL * pResult,
return SUCCESS;
}
/* TODO: what is this ??? */
if( ulRecNo <= 0 )
ulRecNo = 1;
@@ -399,10 +402,8 @@ static ERRCODE hb_dbfLockRecord( DBFAREAP pArea, ULONG ulRecNo, BOOL * pResult,
* pResult = TRUE;
if( !pArea->fPositioned )
hb_dbfGoTo( pArea, pArea->ulRecNo );
/*
else
else if ( !pArea->fRecordChanged )
pArea->fValidBuffer = FALSE;
*/
}
else
* pResult = FALSE;
@@ -424,11 +425,11 @@ static ERRCODE hb_dbfLockFile( DBFAREAP pArea, BOOL * pResult )
hb_dbfUnlockAllRecords( pArea );
SELF_RAWLOCK( ( AREAP ) pArea, FILE_LOCK, 0 );
* pResult = pArea->fFLocked;
if( !pArea->fPositioned )
hb_dbfGoTo( pArea, pArea->ulRecNo );
else
else if ( !pArea->fRecordChanged )
pArea->fValidBuffer = FALSE;
}
else
@@ -440,12 +441,18 @@ static ERRCODE hb_dbfLockFile( DBFAREAP pArea, BOOL * pResult )
/*
* Unlock a file.
*/
static void hb_dbfUnlockFile( DBFAREAP pArea )
static ERRCODE hb_dbfUnlockFile( DBFAREAP pArea )
{
ERRCODE uiError = SUCCESS;
HB_TRACE(HB_TR_DEBUG, ("hb_dbfUnlockFile(%p)", pArea));
if( pArea->fFLocked )
{
uiError = SELF_GOCOLD( ( AREAP ) pArea );
SELF_RAWLOCK( ( AREAP ) pArea, FILE_UNLOCK, 0 );
}
return uiError;
}
/*
@@ -587,6 +594,85 @@ void hb_dbfPutMemoBlock( DBFAREAP pArea, USHORT uiIndex, ULONG ulBlock )
}
}
/*
* Get information about locking schemes for additional files (MEMO, INDEX)
* This function is common for different MEMO implementation
* so I left it in DBF.
*/
BOOL HB_EXPORT hb_dbfLockIdxGetData( BYTE bScheme, ULONG *ulPos, ULONG *ulPool )
{
switch ( bScheme )
{
case HB_SET_DBFLOCK_CLIP:
*ulPos = IDX_LOCKPOS_CLIP;
*ulPool = IDX_LOCKPOOL_CLIP;
break;
case HB_SET_DBFLOCK_CL53:
*ulPos = IDX_LOCKPOS_CL53;
*ulPool = IDX_LOCKPOOL_CL53;
break;
case HB_SET_DBFLOCK_VFP:
*ulPos = IDX_LOCKPOS_VFP;
*ulPool = IDX_LOCKPOOL_VFP;
break;
default:
return FALSE;
}
return TRUE;
}
/*
* Set lock using current locking schemes in additional files (MEMO, INDEX)
* This function is common for different MEMO implementation
* so I left it in DBF.
*/
BOOL HB_EXPORT hb_dbfLockIdxFile( FHANDLE hFile, BYTE bScheme, USHORT usMode, ULONG *pPoolPos )
{
ULONG ulPos, ulPool, ulSize = 1;
BOOL fRet = FALSE, fWait;
if ( !hb_dbfLockIdxGetData( bScheme, &ulPos, &ulPool ) )
return fRet;
do
{
switch ( usMode & FL_MASK )
{
case FL_LOCK:
if ( ulPool )
{
if ( ( usMode & FLX_SHARED ) != 0 )
*pPoolPos = (ULONG) ( hb_random_num() * ulPool ) + 1;
else
{
*pPoolPos = 0;
ulSize = ulPool + 1;
}
}
break;
case FL_UNLOCK:
if ( ulPool )
{
if ( ! *pPoolPos )
ulSize = ulPool + 1;
}
break;
default:
return FALSE;
}
fRet = hb_fsLock( hFile, ulPos + *pPoolPos, ulSize, usMode );
fWait = ( !fRet && ( usMode & FLX_WAIT ) != 0 && ( usMode & FL_MASK ) == FL_LOCK );
/* TODO: call special error handler (LOCKHANDLER) hiere if fWait */
} while ( fWait );
return fRet;
}
/*
* -- DBF METHODS --
*/
@@ -821,9 +907,6 @@ static ERRCODE hb_dbfAppend( DBFAREAP pArea, BOOL bUnLockAll )
HB_TRACE(HB_TR_DEBUG, ("hb_dbfAppend(%p, %d)", pArea, (int) bUnLockAll));
if( SELF_GOCOLD( ( AREAP ) pArea ) == FAILURE )
return FAILURE;
if( pArea->fReadonly )
{
pError = hb_errNew();
@@ -835,6 +918,9 @@ static ERRCODE hb_dbfAppend( DBFAREAP pArea, BOOL bUnLockAll )
return FAILURE;
}
if( SELF_GOCOLD( ( AREAP ) pArea ) == FAILURE )
return FAILURE;
/* Reset parent rel struct */
pArea->lpdbPendingRel = NULL;
@@ -1079,17 +1165,15 @@ static ERRCODE hb_dbfGoCold( DBFAREAP pArea )
pArea->fRecordChanged = FALSE;
if( !pArea->fAppend )
if( pArea->fAppend )
{
pArea->fUpdateHeader = TRUE;
else
pArea->fAppend = FALSE;
}
/* Update header */
if( pArea->fShared )
if( pArea->fShared && pArea->fUpdateHeader )
SELF_WRITEDBHEADER( ( AREAP ) pArea );
/* hb_dbfWriteDBHeader( pArea ); */
pArea->fAppend = FALSE;
}
return SUCCESS;
}
@@ -1448,9 +1532,42 @@ static ERRCODE hb_dbfCreate( DBFAREAP pArea, LPDBOPENINFO pCreateInfo )
HB_TRACE(HB_TR_DEBUG, ("hb_dbfCreate(%p, %p)", pArea, pCreateInfo));
pError = NULL;
/* Try create */
do
{
pArea->hDataFile = hb_spCreate( pCreateInfo->abName, FC_NORMAL );
if( pArea->hDataFile == FS_ERROR )
{
if( !pError )
{
pError = hb_errNew();
hb_errPutGenCode( pError, EG_CREATE );
hb_errPutSubCode( pError, EDBF_CREATE_DBF );
hb_errPutDescription( pError, hb_langDGetErrorDesc( EG_CREATE ) );
hb_errPutFileName( pError, ( char * ) pCreateInfo->abName );
hb_errPutFlags( pError, EF_CANRETRY );
}
bRetry = ( SELF_ERROR( ( AREAP ) pArea, pError ) == E_RETRY );
}
else
bRetry = FALSE;
} while( bRetry );
if( pError )
{
hb_errRelease( pError );
}
if( pArea->hDataFile == FS_ERROR )
{
return FAILURE;
}
pArea->szDataFileName = (char *) hb_xgrab( strlen( (char * ) pCreateInfo->abName)+1 );
strcpy( pArea->szDataFileName, ( char * ) pCreateInfo->abName );
uiSize = pArea->uiFieldCount * sizeof( DBFFIELD );
pBuffer = ( DBFFIELD * ) hb_xgrab( uiSize );
pArea->uiRecordLen = 1;
bHasMemo = FALSE;
@@ -1504,36 +1621,6 @@ static ERRCODE hb_dbfCreate( DBFAREAP pArea, LPDBOPENINFO pCreateInfo )
pBuffer[ uiCount ] = dbField;
}
pError = NULL;
/* Try create */
do
{
pArea->hDataFile = hb_spCreate( pCreateInfo->abName, FC_NORMAL );
if( pArea->hDataFile == FS_ERROR )
{
if( !pError )
{
pError = hb_errNew();
hb_errPutGenCode( pError, EG_CREATE );
hb_errPutSubCode( pError, EDBF_CREATE_DBF );
hb_errPutDescription( pError, hb_langDGetErrorDesc( EG_CREATE ) );
hb_errPutFileName( pError, ( char * ) pCreateInfo->abName );
hb_errPutFlags( pError, EF_CANRETRY );
}
bRetry = ( SELF_ERROR( ( AREAP ) pArea, pError ) == E_RETRY );
}
else
bRetry = FALSE;
} while( bRetry );
if( pError )
hb_errRelease( pError );
if( pArea->hDataFile == FS_ERROR )
{
hb_xfree( pBuffer );
return FAILURE;
}
pArea->fShared = pCreateInfo->fShared;
pArea->ulRecCount = 0;
pArea->uiHeaderLen = sizeof( DBFHEADER ) + uiSize + 2;
@@ -1575,7 +1662,7 @@ static ERRCODE hb_dbfCreate( DBFAREAP pArea, LPDBOPENINFO pCreateInfo )
hb_xfree( pFileName );
pFileExt = hb_itemPutC( NULL, "" );
SELF_INFO( ( AREAP ) pArea, DBI_MEMOEXT, pFileExt );
strncat( pArea->szMemoFileName, hb_itemGetCPtr( pFileExt ),
strncat( pArea->szMemoFileName, pFileExt->item.asString.value,
_POSIX_PATH_MAX - strlen( pArea->szMemoFileName ) );
hb_itemRelease( pFileExt );
tmp = pCreateInfo->abName;
@@ -1678,7 +1765,7 @@ static ERRCODE hb_dbfNewArea( DBFAREAP pArea )
static ERRCODE hb_dbfOpen( DBFAREAP pArea, LPDBOPENINFO pOpenInfo )
{
USHORT uiFlags, uiFields, uiSize, uiCount;
BOOL bRetry, bError;
BOOL bRetry, bError, bLock;
PHB_ITEM pError, pFileExt;
PHB_FNAME pFileName;
char * szFileName;
@@ -1688,17 +1775,21 @@ static ERRCODE hb_dbfOpen( DBFAREAP pArea, LPDBOPENINFO pOpenInfo )
HB_TRACE(HB_TR_DEBUG, ("hb_dbfOpen(%p, %p)", pArea, pOpenInfo));
pArea->szDataFileName = (char *) hb_xgrab( strlen( (char * ) pOpenInfo->abName)+1 );
strcpy( pArea->szDataFileName, ( char * ) pOpenInfo->abName );
pArea->atomAlias = hb_dynsymGet( ( char * ) pOpenInfo->atomAlias );
if( ( ( PHB_DYNS ) pArea->atomAlias )->hArea )
{
hb_errRT_DBCMD( EG_DUPALIAS, EDBCMD_DUPALIAS, NULL, ( char * ) pOpenInfo->atomAlias );
hb_xfree( pArea->szDataFileName );
return FAILURE;
}
if ( !pArea->bLockType )
{
if ( hb_set.HB_SET_DBFLOCKSCHEME )
pArea->bLockType = hb_set.HB_SET_DBFLOCKSCHEME;
else
pArea->bLockType = HB_SET_DBFLOCK_CLIP;
}
( ( PHB_DYNS ) pArea->atomAlias )->hArea = pOpenInfo->uiArea;
if( pOpenInfo->cdpId )
{
@@ -1724,7 +1815,20 @@ static ERRCODE hb_dbfOpen( DBFAREAP pArea, LPDBOPENINFO pOpenInfo )
/* Try open */
do
{
bLock = FALSE;
pArea->hDataFile = hb_spOpen( pOpenInfo->abName, uiFlags );
#ifdef DBF_EXLUSIVE_LOCKPOS
if( pArea->hDataFile != FS_ERROR )
{
if ( !hb_fsLock( pArea->hDataFile, DBF_EXLUSIVE_LOCKPOS, DBF_EXLUSIVE_LOCKSIZE,
FL_LOCK | ( pArea->fShared ? FLX_SHARED : FLX_EXCLUSIVE ) ) )
{
hb_fsClose( pArea->hDataFile );
pArea->hDataFile = FS_ERROR;
bLock = TRUE;
}
}
#endif
if( pArea->hDataFile == FS_ERROR )
{
if( !pError )
@@ -1738,7 +1842,7 @@ static ERRCODE hb_dbfOpen( DBFAREAP pArea, LPDBOPENINFO pOpenInfo )
* Temporary fix for neterr() support and Clipper compatibility,
* should be revised with a better solution.
*/
if ( hb_fsError() == EACCES )
if ( hb_fsError() == EACCES || bLock )
hb_errPutOsCode( pError, 32 );
else
hb_errPutOsCode( pError, hb_fsError() );
@@ -1763,6 +1867,10 @@ static ERRCODE hb_dbfOpen( DBFAREAP pArea, LPDBOPENINFO pOpenInfo )
return FAILURE;
}
/* Allocate only after succesfully open file */
pArea->szDataFileName = (char *) hb_xgrab( strlen( (char * ) pOpenInfo->abName)+1 );
strcpy( pArea->szDataFileName, ( char * ) pOpenInfo->abName );
/* Read file header and exit if error */
if( SELF_READDBHEADER( ( AREAP ) pArea ) == FAILURE )
{
@@ -1919,6 +2027,9 @@ static ERRCODE hb_dbfOpen( DBFAREAP pArea, LPDBOPENINFO pOpenInfo )
pArea->pRecord = ( BYTE * ) hb_xgrab( pArea->uiRecordLen );
pArea->fValidBuffer = FALSE;
/* Update the number of record for corrupted headers */
pArea->ulRecCount = hb_dbfCalcRecCount( pArea );
/* Position cursor at the first record */
return SELF_GOTOP( ( AREAP ) pArea );
}
@@ -2046,6 +2157,9 @@ static ERRCODE hb_dbfSort( DBFAREAP pArea, LPDBSORTINFO pSortInfo )
HB_TRACE(HB_TR_DEBUG, ("hb_dbfSort(%p, %p)", pArea, pSortInfo));
if( SELF_GOCOLD( ( AREAP ) pArea ) == FAILURE )
return FAILURE;
if( !hb_dbQSortInit( &dbQuickSort, pSortInfo, pArea->uiRecordLen ) )
return FAILURE;
@@ -2312,45 +2426,140 @@ static ERRCODE hb_dbfSetFilter( DBFAREAP pArea, LPDBFILTERINFO pFilterInfo )
*/
static ERRCODE hb_dbfRawLock( DBFAREAP pArea, USHORT uiAction, ULONG ulRecNo )
{
ERRCODE uiErr = SUCCESS;
ULONG ulPos, ulFlSize, ulRlSize;
SHORT iDir;
BOOL fLck;
HB_TRACE(HB_TR_DEBUG, ("hb_dbfRawLock(%p, %hu, %lu)", pArea, uiAction, ulRecNo));
switch( uiAction )
if( pArea->fShared )
{
case FILE_LOCK:
if( pArea->fShared && !pArea->fFLocked )
pArea->fFLocked = hb_fsLock( pArea->hDataFile, DBF_LOCKPOS + 1, DBF_LOCKPOS, FL_LOCK );
break;
switch( pArea->bLockType )
{
case HB_SET_DBFLOCK_CLIP:
ulPos = DBF_LOCKPOS_CLIP;
iDir = DBF_LOCKDIR_CLIP;
ulFlSize = DBF_FLCKSIZE_CLIP;
ulRlSize = DBF_RLCKSIZE_CLIP;
break;
case FILE_UNLOCK:
if( pArea->fShared && pArea->fFLocked )
pArea->fFLocked = !hb_fsLock( pArea->hDataFile, DBF_LOCKPOS + 1, DBF_LOCKPOS, FL_UNLOCK );
break;
case HB_SET_DBFLOCK_CL53:
ulPos = DBF_LOCKPOS_CL53;
iDir = DBF_LOCKDIR_CL53;
ulFlSize = DBF_FLCKSIZE_CL53;
ulRlSize = DBF_RLCKSIZE_CL53;
break;
case APPEND_LOCK:
case REC_LOCK:
if( pArea->fShared && !pArea->fFLocked )
if( !hb_fsLock( pArea->hDataFile, DBF_LOCKPOS + ulRecNo, 1, FL_LOCK ) )
return FAILURE;
break;
case HB_SET_DBFLOCK_VFP:
if ( pArea->fHasTags )
{
ulPos = DBF_LOCKPOS_VFPX;
iDir = DBF_LOCKDIR_VFPX;
ulFlSize = DBF_FLCKSIZE_VFPX;
ulRlSize = DBF_RLCKSIZE_VFPX;
}
else
{
ulPos = DBF_LOCKPOS_VFP;
iDir = DBF_LOCKDIR_VFP;
ulFlSize = DBF_FLCKSIZE_VFP;
ulRlSize = DBF_RLCKSIZE_VFP;
}
break;
case APPEND_UNLOCK:
case REC_UNLOCK:
if( pArea->fShared && !pArea->fFLocked )
if( !hb_fsLock( pArea->hDataFile, DBF_LOCKPOS + ulRecNo, 1, FL_UNLOCK ) )
return FAILURE;
break;
case HEADER_LOCK:
if( pArea->fShared && !pArea->fFLocked )
if( !hb_fsLock( pArea->hDataFile, DBF_LOCKPOS, 1, FL_LOCK ) )
return FAILURE;
break;
case HEADER_UNLOCK:
if( pArea->fShared && !pArea->fFLocked )
if( !hb_fsLock( pArea->hDataFile, DBF_LOCKPOS, 1, FL_UNLOCK ) )
return FAILURE;
break;
default:
return FAILURE;
}
switch( uiAction )
{
case FILE_LOCK:
if( !pArea->fFLocked )
{
if ( iDir < 0 )
fLck = hb_fsLock( pArea->hDataFile, ulPos - ulFlSize, ulFlSize, FL_LOCK );
else
fLck = hb_fsLock( pArea->hDataFile, ulPos + 1, ulFlSize, FL_LOCK );
if( !fLck )
uiErr = FAILURE;
else
pArea->fFLocked = TRUE;
}
break;
case FILE_UNLOCK:
if( pArea->fFLocked )
{
if ( iDir < 0 )
fLck = hb_fsLock( pArea->hDataFile, ulPos - ulFlSize, ulFlSize, FL_UNLOCK );
else
fLck = hb_fsLock( pArea->hDataFile, ulPos + 1, ulFlSize, FL_UNLOCK );
if( !fLck )
uiErr = FAILURE;
pArea->fFLocked = FALSE;
}
break;
case REC_LOCK:
if( !pArea->fFLocked )
{
if ( iDir < 0 )
fLck = hb_fsLock( pArea->hDataFile, ulPos - ulRecNo, ulRlSize, FL_LOCK );
else if ( iDir == 2 )
fLck = hb_fsLock( pArea->hDataFile, ulPos + ( ulRecNo - 1 ) * pArea->uiRecordLen + pArea->uiHeaderLen, ulRlSize, FL_LOCK );
else
fLck = hb_fsLock( pArea->hDataFile, ulPos + ulRecNo, ulRlSize, FL_LOCK );
if( !fLck )
uiErr = FAILURE;
}
break;
case REC_UNLOCK:
if( !pArea->fFLocked )
{
if ( iDir < 0 )
fLck = hb_fsLock( pArea->hDataFile, ulPos - ulRecNo, ulRlSize, FL_UNLOCK );
else if ( iDir == 2 )
fLck = hb_fsLock( pArea->hDataFile, ulPos + ( ulRecNo - 1 ) * pArea->uiRecordLen + pArea->uiHeaderLen, ulRlSize, FL_UNLOCK );
else
fLck = hb_fsLock( pArea->hDataFile, ulPos + ulRecNo, ulRlSize, FL_UNLOCK );
if( !fLck )
uiErr = FAILURE;
}
break;
case APPEND_LOCK:
case HEADER_LOCK:
if( !pArea->fHeaderLocked )
{
do
{
fLck = hb_fsLock( pArea->hDataFile, ulPos, 1, FL_LOCK | FLX_WAIT );
/* TODO: call special error handler (LOCKHANDLER) hiere if !fLck */
} while ( !fLck );
if( !fLck )
uiErr = FAILURE;
else
pArea->fHeaderLocked = TRUE;
}
break;
case APPEND_UNLOCK:
case HEADER_UNLOCK:
if( pArea->fHeaderLocked )
{
if( !hb_fsLock( pArea->hDataFile, ulPos, 1, FL_UNLOCK ) )
uiErr = FAILURE;
pArea->fHeaderLocked = FALSE;
}
break;
}
}
return SUCCESS;
return uiErr;
}
/*
@@ -2400,13 +2609,13 @@ static ERRCODE hb_dbfUnLock( DBFAREAP pArea, ULONG ulRecNo )
{
if( pArea->ulNumLocksPos > 0 )
{
uiError = SELF_GOCOLD( ( AREAP ) pArea );
SELF_GOCOLD( ( AREAP ) pArea );
/* Unlock all records? */
if( ulRecNo == 0 )
hb_dbfUnlockAllRecords( pArea );
uiError = hb_dbfUnlockAllRecords( pArea );
else if( hb_dbfIsLocked( pArea, ulRecNo ) )
hb_dbfUnlockRecord( pArea, ulRecNo );
uiError = hb_dbfUnlockRecord( pArea, ulRecNo );
}
if( pArea->fFLocked )
{
@@ -2475,7 +2684,11 @@ static ERRCODE hb_dbfReadDBHeader( DBFAREAP pArea )
{
hb_fsSeek( pArea->hDataFile, 0, FS_SET );
if( hb_fsRead( pArea->hDataFile, ( BYTE * ) &dbHeader, sizeof( DBFHEADER ) ) != sizeof( DBFHEADER ) ||
( dbHeader.bVersion != 0x03 && dbHeader.bVersion != 0x83 && dbHeader.bVersion != 0xF5 ) )
( dbHeader.bVersion != 0x03 && // dBase III
dbHeader.bVersion != 0x30 && // VisualFoxPro 6.0
dbHeader.bVersion != 0x83 && // dBase III w/memo
dbHeader.bVersion != 0xF5 // FoxPro??? w/memo
) )
{
bError = TRUE;
if( !pError )
@@ -2517,8 +2730,9 @@ static ERRCODE hb_dbfReadDBHeader( DBFAREAP pArea )
*/
static ERRCODE hb_dbfWriteDBHeader( DBFAREAP pArea )
{
BOOL fLck = FALSE;
DBFHEADER dbfHeader;
long lYear, lMonth, lDay;
LONG lYear, lMonth, lDay;
HB_TRACE(HB_TR_DEBUG, ("hb_dbfWriteDBHeader(%p)", pArea));
@@ -2534,7 +2748,12 @@ static ERRCODE hb_dbfWriteDBHeader( DBFAREAP pArea )
/* Update record count */
if( pArea->fShared )
{
SELF_RAWLOCK( ( AREAP ) pArea, HEADER_LOCK, 0 );
if( !pArea->fHeaderLocked )
{
if( SELF_RAWLOCK( ( AREAP ) pArea, HEADER_LOCK, 0 ) == FAILURE )
return FAILURE;
fLck = TRUE;
}
pArea->ulRecCount = hb_dbfCalcRecCount( pArea );
}
@@ -2544,7 +2763,7 @@ static ERRCODE hb_dbfWriteDBHeader( DBFAREAP pArea )
hb_fsSeek( pArea->hDataFile, 0, FS_SET );
hb_fsWrite( pArea->hDataFile, ( BYTE * ) &dbfHeader, sizeof( DBFHEADER ) );
pArea->fUpdateHeader = FALSE;
if( pArea->fShared )
if( fLck )
SELF_RAWLOCK( ( AREAP ) pArea, HEADER_UNLOCK, 0 );
return SUCCESS;
}

File diff suppressed because it is too large Load Diff

View File

@@ -77,6 +77,8 @@
#if (__BORLANDC__ > 1040) /* Use this only above Borland C++ 3.1 */
#pragma option -a1 /* byte alignment */
#elif defined(_MSC_VER)
#pragma pack(push, 1)
#elif defined(__GNUC__)
#pragma pack(1)
#elif defined(__WATCOMC__)
@@ -135,7 +137,6 @@ typedef struct _SORTSWAPPAGE
} SORTSWAPPAGE;
typedef SORTSWAPPAGE * LPSORTSWAPPAGE;
typedef struct _SORTSWAPITEM
{
ULONG recno;
@@ -146,6 +147,8 @@ typedef SORTSWAPITEM * LPSORTSWAPITEM;
#if (__BORLANDC__ > 1040) /* Use this only above Borland C++ 3.1 */
#pragma option -a /* default alignment */
#elif defined(_MSC_VER)
#pragma pack(pop)
#elif defined(__GNUC__)
#pragma pack()
#elif defined(__WATCOMC__)

View File

@@ -272,11 +272,15 @@ HB_INIT_SYMBOLS_END( dbffpt1__InitSymbols )
*/
static BOOL hb_fptFileLockEx( FPTAREAP pArea )
{
BOOL bRet;
BOOL fRet;
while ( ! ( bRet = hb_fsLock( pArea->hMemoFile, FPT_LOCKPOS, FPT_LOCKSIZE,
FL_LOCK | FLX_EXCLUSIVE | FLX_WAIT ) ) );
return bRet;
do
{
fRet = hb_fsLock( pArea->hMemoFile, FPT_LOCKPOS, FPT_LOCKSIZE,
FL_LOCK | FLX_EXCLUSIVE | FLX_WAIT );
} while ( !fRet );
return fRet;
}
/*
@@ -284,11 +288,15 @@ static BOOL hb_fptFileLockEx( FPTAREAP pArea )
*/
static BOOL hb_fptFileLockSh( FPTAREAP pArea )
{
BOOL bRet;
BOOL fRet;
while ( ! ( bRet = hb_fsLock( pArea->hMemoFile, FPT_LOCKPOS, FPT_LOCKSIZE,
FL_LOCK | FLX_SHARED | FLX_WAIT ) ) );
return bRet;
do
{
fRet = hb_fsLock( pArea->hMemoFile, FPT_LOCKPOS, FPT_LOCKSIZE,
FL_LOCK | FLX_SHARED | FLX_WAIT );
} while ( !fRet );
return fRet;
}
/*
@@ -399,7 +407,7 @@ static void hb_fptPackGCitems( LPMEMOGCTABLE pGCtable )
free block list table */
for( i = 0; i < pGCtable->usItems; i++ )
{
if ( pGCtable->pGCitems[i].ulOffset != 0 &&
if ( pGCtable->pGCitems[i].ulOffset != 0 &&
pGCtable->pGCitems[i].ulSize != 0 )
{
ulEnd = pGCtable->pGCitems[i].ulOffset + pGCtable->pGCitems[i].ulSize;
@@ -430,7 +438,7 @@ static void hb_fptPackGCitems( LPMEMOGCTABLE pGCtable )
/* remove empty items */
for( i = j = 0; i < pGCtable->usItems; i++ )
{
if ( pGCtable->pGCitems[i].ulOffset != 0 &&
if ( pGCtable->pGCitems[i].ulOffset != 0 &&
pGCtable->pGCitems[i].ulSize != 0 )
{
if ( i > j )
@@ -451,8 +459,11 @@ static ERRCODE hb_fptWriteGCitems( FPTAREAP pArea, LPMEMOGCTABLE pGCtable, USHOR
{
FPTBLOCK fptBlock;
ERRCODE errCode = SUCCESS;
int i, iStart, iStop;
int i /* ,iStart, iStop */ ;
HB_SYMBOL_UNUSED( usItem ) ;
/*
if ( usItem == 0 )
{
iStart = 0;
@@ -463,14 +474,16 @@ static ERRCODE hb_fptWriteGCitems( FPTAREAP pArea, LPMEMOGCTABLE pGCtable, USHOR
iStart = usItem;
iStop = usItem + 1;
}
*/
for( i = 0; i < pGCtable->usItems; i++ )
{
if ( pGCtable->pGCitems[i].fChanged )
{
HB_PUT_BE_ULONG( &fptBlock.type, FPTIT_FLEX_UNUSED );
HB_PUT_BE_ULONG( &fptBlock.size, pArea->uiMemoBlockSize *
HB_PUT_BE_ULONG( fptBlock.type, FPTIT_FLEX_UNUSED );
HB_PUT_BE_ULONG( fptBlock.size, pArea->uiMemoBlockSize *
pGCtable->pGCitems[i].ulSize - sizeof( FPTBLOCK ) );
hb_fsSeek( pArea->hMemoFile, pGCtable->pGCitems[i].ulOffset *
hb_fsSeek( pArea->hMemoFile, pGCtable->pGCitems[i].ulOffset *
pArea->uiMemoBlockSize, FS_SET );
if ( hb_fsWrite( pArea->hMemoFile, ( BYTE * ) &fptBlock,
sizeof( FPTBLOCK ) ) != sizeof( FPTBLOCK ) )
@@ -500,7 +513,7 @@ static ERRCODE hb_fptGCfreeBlock( FPTAREAP pArea, LPMEMOGCTABLE pGCtable,
if( hb_fsRead( pArea->hMemoFile, ( BYTE * ) &fptBlock,
sizeof( FPTBLOCK ) ) == sizeof( FPTBLOCK ) )
{
ulByteSize = HB_GET_BE_ULONG( &fptBlock.size ) + sizeof( FPTBLOCK );
ulByteSize = HB_GET_BE_ULONG( fptBlock.size ) + sizeof( FPTBLOCK );
}
}
else
@@ -514,7 +527,7 @@ static ERRCODE hb_fptGCfreeBlock( FPTAREAP pArea, LPMEMOGCTABLE pGCtable,
{
return EDBF_CORRUPT;
}
if ( ulOffset + ulSize == pGCtable->ulNextBlock )
{
pGCtable->ulNextBlock -= ulSize;
@@ -545,7 +558,7 @@ static ERRCODE hb_fptGCfreeBlock( FPTAREAP pArea, LPMEMOGCTABLE pGCtable,
}
if ( !fChanged )
{
if ( pGCtable->usItems < pGCtable->usMaxItem )
if ( pGCtable->usItems <= pGCtable->usMaxItem )
{
if ( pGCtable->pGCitems == NULL )
{
@@ -558,7 +571,7 @@ static ERRCODE hb_fptGCfreeBlock( FPTAREAP pArea, LPMEMOGCTABLE pGCtable,
}
else if ( pGCtable->pGCitems[ 1 ].ulSize < ulSize )
{
if ( pGCtable->ulNextBlock == pGCtable->pGCitems[ 1 ].ulOffset +
if ( pGCtable->ulNextBlock == pGCtable->pGCitems[ 1 ].ulOffset +
pGCtable->pGCitems[ 1 ].ulSize )
{
pGCtable->ulNextBlock -= pGCtable->pGCitems[ 1 ].ulSize;
@@ -667,14 +680,14 @@ static ERRCODE hb_fptReadGCdata( FPTAREAP pArea, LPMEMOGCTABLE pGCtable )
hb_fsSeek( pArea->hMemoFile, 0, FS_SET );
if ( hb_fsRead( pArea->hMemoFile, ( BYTE * ) &pGCtable->fptHeader, sizeof( FPTHEADER ) ) >= 512 )
{
pGCtable->ulNextBlock = HB_GET_BE_ULONG( &pGCtable->fptHeader.nextBlock );
pGCtable->ulNextBlock = HB_GET_BE_ULONG( pGCtable->fptHeader.nextBlock );
if ( pArea->bMemoType == MEMO_FPT_SIX ||
if ( pArea->bMemoType == MEMO_FPT_SIX ||
pArea->bMemoType == MEMO_FPT_SIXHB )
{
pGCtable->bType = MEMO_FPT_SIX;
pGCtable->usMaxItem = MAX_SIXFREEBLOCKS;
pGCtable->usItems = HB_GET_LE_USHORT( &pGCtable->fptHeader.nGCitems );
pGCtable->usItems = HB_GET_LE_USHORT( pGCtable->fptHeader.nGCitems );
if ( pGCtable->usItems > pGCtable->usMaxItem )
{
return EDBF_CORRUPT;
@@ -689,7 +702,7 @@ static ERRCODE hb_fptReadGCdata( FPTAREAP pArea, LPMEMOGCTABLE pGCtable )
pGCtable->pGCitems[i].fChanged = FALSE;
}
}
else if ( pArea->bMemoType == MEMO_FPT_FLEX ||
else if ( pArea->bMemoType == MEMO_FPT_FLEX ||
pArea->bMemoType == MEMO_FPT_HB ||
pArea->bMemoType == MEMO_FPT_CLIP )
{
@@ -698,22 +711,22 @@ static ERRCODE hb_fptReadGCdata( FPTAREAP pArea, LPMEMOGCTABLE pGCtable )
pGCtable->bType = MEMO_FPT_FLEX;
pGCtable->usMaxItem = MAX_FLEXFREEBLOCKS;
pGCtable->ulRevPage = HB_GET_LE_ULONG( &pGCtable->fptHeader.flexRev );
pGCtable->ulDirPage = HB_GET_LE_ULONG( &pGCtable->fptHeader.flexDir );
pGCtable->ulCounter = HB_GET_LE_ULONG( &pGCtable->fptHeader.counter );
pGCtable->ulRevPage = HB_GET_LE_ULONG( pGCtable->fptHeader.flexRev );
pGCtable->ulDirPage = HB_GET_LE_ULONG( pGCtable->fptHeader.flexDir );
pGCtable->ulCounter = HB_GET_LE_ULONG( pGCtable->fptHeader.counter );
if ( pGCtable->ulDirPage )
{
hb_fsSeek( pArea->hMemoFile, pGCtable->ulDirPage, FS_SET );
if ( hb_fsRead( pArea->hMemoFile, ( BYTE * ) &fptBlock,
sizeof( FPTBLOCK ) ) != sizeof( FPTBLOCK ) ||
HB_GET_BE_ULONG( &fptBlock.type ) != FPTIT_FLEX_GC )
HB_GET_BE_ULONG( fptBlock.type ) != FPTIT_FLEX_GC )
{
return EDBF_CORRUPT;
}
pGCtable->ulSize = HB_GET_BE_ULONG( &fptBlock.size );
pGCtable->ulSize = HB_GET_BE_ULONG( fptBlock.size );
bPageBuf = ( BYTE * ) hb_xgrab( pGCtable->ulSize );
if ( hb_fsRead( pArea->hMemoFile, bPageBuf, ( USHORT ) pGCtable->ulSize ) !=
pGCtable->ulSize )
if ( hb_fsRead( pArea->hMemoFile, bPageBuf, ( USHORT ) pGCtable->ulSize ) !=
( USHORT ) pGCtable->ulSize )
{
hb_xfree( bPageBuf );
return EDBF_CORRUPT;
@@ -721,7 +734,7 @@ static ERRCODE hb_fptReadGCdata( FPTAREAP pArea, LPMEMOGCTABLE pGCtable )
pGCtable->usMaxItem = (USHORT ) ( ( pGCtable->ulSize - 2 ) >> 3 );
pGCtable->usItems = ( HB_GET_LE_USHORT( bPageBuf ) - 3 ) >> 2;
pGCtable->pGCitems = ( LPMEMOGCITEM ) hb_xgrab( sizeof( MEMOGCITEM ) *
pGCtable->pGCitems = ( LPMEMOGCITEM ) hb_xgrab( sizeof( MEMOGCITEM ) *
( HB_MIN( pGCtable->usItems, pGCtable->usMaxItem ) + 1 ) );
for( i = 0; i < pGCtable->usItems; i++ )
@@ -759,7 +772,7 @@ static ERRCODE hb_fptWriteGCdata( FPTAREAP pArea, LPMEMOGCTABLE pGCtable )
{
if ( pGCtable->bType == MEMO_FPT_SIX )
{
HB_PUT_LE_USHORT( &pGCtable->fptHeader.nGCitems, pGCtable->usItems );
HB_PUT_LE_USHORT( pGCtable->fptHeader.nGCitems, pGCtable->usItems );
memset( pGCtable->fptHeader.reserved2, 0, sizeof( pGCtable->fptHeader.reserved2 ) );
j = ( pGCtable->usItems > pGCtable->usMaxItem ) ?
pGCtable->usItems - pGCtable->usMaxItem : 0;
@@ -814,8 +827,8 @@ static ERRCODE hb_fptWriteGCdata( FPTAREAP pArea, LPMEMOGCTABLE pGCtable )
FPTBLOCK fptBlock;
BYTE *bPageBuf;
HB_PUT_BE_ULONG( &fptBlock.type, FPTIT_FLEX_GC );
HB_PUT_BE_ULONG( &fptBlock.size, pGCtable->ulSize );
HB_PUT_BE_ULONG( fptBlock.type, FPTIT_FLEX_GC );
HB_PUT_BE_ULONG( fptBlock.size, pGCtable->ulSize );
bPageBuf = ( BYTE * ) hb_xgrab( pGCtable->ulSize );
memset( bPageBuf, 0xAD, pGCtable->ulSize );
HB_PUT_LE_USHORT( bPageBuf, ( (USHORT) pGCtable->usItems << 2 ) + 3 );
@@ -832,7 +845,7 @@ static ERRCODE hb_fptWriteGCdata( FPTAREAP pArea, LPMEMOGCTABLE pGCtable )
if ( hb_fsWrite( pArea->hMemoFile, ( BYTE * ) &fptBlock,
sizeof( FPTBLOCK ) ) != sizeof( FPTBLOCK ) ||
hb_fsWrite( pArea->hMemoFile, bPageBuf,
( USHORT ) pGCtable->ulSize ) != pGCtable->ulSize )
( USHORT ) pGCtable->ulSize ) != ( USHORT ) pGCtable->ulSize )
{
errCode = EDBF_WRITE;
}
@@ -849,16 +862,16 @@ static ERRCODE hb_fptWriteGCdata( FPTAREAP pArea, LPMEMOGCTABLE pGCtable )
if ( hb_fsWrite( pArea->hMemoFile, ( BYTE * ) &fptBlock,
sizeof( FPTBLOCK ) ) != sizeof( FPTBLOCK ) ||
hb_fsWrite( pArea->hMemoFile, bPageBuf,
( USHORT )pGCtable->ulSize ) != pGCtable->ulSize )
( USHORT )pGCtable->ulSize ) != ( USHORT ) pGCtable->ulSize )
{
errCode = EDBF_WRITE;
}
}
hb_xfree( bPageBuf );
}
HB_PUT_LE_ULONG( &pGCtable->fptHeader.flexRev, pGCtable->ulRevPage );
HB_PUT_LE_ULONG( &pGCtable->fptHeader.flexDir, pGCtable->ulDirPage );
HB_PUT_LE_ULONG( &pGCtable->fptHeader.counter, pGCtable->ulCounter );
HB_PUT_LE_ULONG( pGCtable->fptHeader.flexRev, pGCtable->ulRevPage );
HB_PUT_LE_ULONG( pGCtable->fptHeader.flexDir, pGCtable->ulDirPage );
HB_PUT_LE_ULONG( pGCtable->fptHeader.counter, pGCtable->ulCounter );
}
if ( pGCtable->bChanged > 1 && errCode == SUCCESS )
@@ -867,9 +880,9 @@ static ERRCODE hb_fptWriteGCdata( FPTAREAP pArea, LPMEMOGCTABLE pGCtable )
}
if ( errCode == SUCCESS )
{
HB_PUT_BE_ULONG( &pGCtable->fptHeader.nextBlock, pGCtable->ulNextBlock );
HB_PUT_BE_ULONG( pGCtable->fptHeader.nextBlock, pGCtable->ulNextBlock );
hb_fsSeek( pArea->hMemoFile, 0, FS_SET );
if ( hb_fsWrite( pArea->hMemoFile, ( BYTE * ) &pGCtable->fptHeader, ( USHORT )ulHdrSize ) != ulHdrSize )
if ( hb_fsWrite( pArea->hMemoFile, ( BYTE * ) &pGCtable->fptHeader, ( USHORT )ulHdrSize ) != ( USHORT ) ulHdrSize )
{
errCode = EDBF_WRITE;
}
@@ -906,7 +919,7 @@ static ULONG hb_fptGetMemoLen( FPTAREAP pArea, USHORT uiIndex )
sizeof( FPTBLOCK ) ) != sizeof( FPTBLOCK ) )
return 0;
return HB_GET_BE_ULONG( &fptBlock.size );
return HB_GET_BE_ULONG( fptBlock.size );
}
/*
@@ -1047,6 +1060,7 @@ static ERRCODE hb_fptReadFlexItem( FPTAREAP pArea, BYTE ** pbMemoBuf, BYTE * bBu
errCode = EDBF_CORRUPT;
}
break;
case FPTIT_FLEXAR_BYTE1:
case FPTIT_FLEXAR_BYTE:
if ( bBufEnd - (*pbMemoBuf) >= 2 )
{
@@ -1058,6 +1072,17 @@ static ERRCODE hb_fptReadFlexItem( FPTAREAP pArea, BYTE ** pbMemoBuf, BYTE * bBu
errCode = EDBF_CORRUPT;
}
break;
case FPTIT_FLEXAR_BYTE2:
if ( bBufEnd - (*pbMemoBuf) >= 3 )
{
hb_itemPutNI( pItem, ( BYTE ) **pbMemoBuf );
*pbMemoBuf += 3;
}
else
{
errCode = EDBF_CORRUPT;
}
break;
case FPTIT_FLEXAR_SHORT:
if ( bBufEnd - (*pbMemoBuf) >= 3 )
{
@@ -1069,6 +1094,17 @@ static ERRCODE hb_fptReadFlexItem( FPTAREAP pArea, BYTE ** pbMemoBuf, BYTE * bBu
errCode = EDBF_CORRUPT;
}
break;
case FPTIT_FLEXAR_SHORT2:
if ( bBufEnd - (*pbMemoBuf) >= 4 )
{
hb_itemPutNI( pItem, (SHORT) HB_GET_LE_USHORT( *pbMemoBuf ) );
*pbMemoBuf += 4;
}
else
{
errCode = EDBF_CORRUPT;
}
break;
case FPTIT_FLEXAR_LONG:
if ( bBufEnd - (*pbMemoBuf) >= 6 )
{
@@ -1092,6 +1128,10 @@ static ERRCODE hb_fptReadFlexItem( FPTAREAP pArea, BYTE ** pbMemoBuf, BYTE * bBu
errCode = EDBF_CORRUPT;
}
break;
case FPTIT_FLEXAR_NUL:
hb_itemPutCL( pItem, NULL, 0);
break;
case FPTIT_FLEXAR_STR:
if ( bBufEnd - (*pbMemoBuf) >= 2 )
{
@@ -1115,7 +1155,7 @@ static ERRCODE hb_fptReadFlexItem( FPTAREAP pArea, BYTE ** pbMemoBuf, BYTE * bBu
errCode = EDBF_CORRUPT;
}
break;
case FPTIT_FLEXAR_ARAY:
if ( bBufEnd - (*pbMemoBuf) >= 2 )
{
@@ -1179,10 +1219,10 @@ static ERRCODE hb_fptGetMemo( FPTAREAP pArea, USHORT uiIndex, PHB_ITEM pItem )
}
else
{
ulSize = HB_GET_BE_ULONG( &fptBlock.size );
ulSize = HB_GET_BE_ULONG( fptBlock.size );
}
ulType = HB_GET_BE_ULONG( &fptBlock.type );
ulType = HB_GET_BE_ULONG( fptBlock.type );
pBuffer = ( BYTE * ) hb_xgrab( HB_MAX( ulSize + 1, 8 ) );
memset( pBuffer, '\0', 8);
if ( hb_fsReadLarge( pArea->hMemoFile, pBuffer, ulSize ) != ulSize )
@@ -1264,7 +1304,7 @@ static ERRCODE hb_fptGetMemo( FPTAREAP pArea, USHORT uiIndex, PHB_ITEM pItem )
*/
static ULONG hb_fptCountSixItemLength( FPTAREAP pArea, PHB_ITEM pItem )
{
ULONG ulLen, i, ulSize = 0;
ULONG ulLen, i, ulSize;
USHORT usType;
usType = hb_itemType( pItem );
@@ -1492,7 +1532,7 @@ static void hb_fptStoreFlexItem( FPTAREAP pArea, PHB_ITEM pItem, BYTE ** bBufPtr
*bBufPtr += 8;
break;
case HB_IT_LOGICAL:
*(*bBufPtr)++ = pItem->item.asLogical.value ?
*(*bBufPtr)++ = pItem->item.asLogical.value ?
FPTIT_FLEXAR_TRUE : FPTIT_FLEXAR_FALSE;
break;
case HB_IT_NIL:
@@ -1550,9 +1590,9 @@ static ERRCODE hb_fptWriteMemo( FPTAREAP pArea, ULONG ulBlock, BYTE *bBufPtr,
hb_fptDestroyGCdata( &fptGCtable );
return errCode;
}
HB_PUT_BE_ULONG( &fptBlock.type, ulType );
HB_PUT_BE_ULONG( &fptBlock.size, ulLen );
HB_PUT_BE_ULONG( fptBlock.type, ulType );
HB_PUT_BE_ULONG( fptBlock.size, ulLen );
hb_fsSeek( pArea->hMemoFile, *ulStoredBlock * pArea->uiMemoBlockSize, FS_SET );
hb_fsWrite( pArea->hMemoFile, ( BYTE * ) &fptBlock, sizeof( FPTBLOCK ) );
@@ -1572,7 +1612,7 @@ static ERRCODE hb_fptWriteMemo( FPTAREAP pArea, ULONG ulBlock, BYTE *bBufPtr,
{
ULONG ulBlocks = ( ulLen + sizeof( FPTBLOCK ) + pArea->uiMemoBlockSize - 1 ) /
pArea->uiMemoBlockSize;
hb_fsSeek( pArea->hMemoFile, ( *ulStoredBlock + ulBlocks ) *
hb_fsSeek( pArea->hMemoFile, ( *ulStoredBlock + ulBlocks ) *
pArea->uiMemoBlockSize - 1, FS_SET );
hb_fsWrite( pArea->hMemoFile, ( BYTE * ) "\xAF", 1 );
}
@@ -1597,7 +1637,8 @@ static ERRCODE hb_fptWriteMemo( FPTAREAP pArea, ULONG ulBlock, BYTE *bBufPtr,
static ERRCODE hb_fptPutMemo( FPTAREAP pArea, USHORT uiIndex, PHB_ITEM pItem )
{
ULONG ulLen, ulBlock, ulType;
BYTE itmBuffer[FLEX_ITEM_BUFSIZE], *bBufPtr = NULL, *bBufAlloc = NULL;
BYTE itmBuffer[FLEX_ITEM_BUFSIZE];
BYTE *bBufPtr = NULL, *bBufAlloc = NULL;
ERRCODE errCode;
HB_TRACE(HB_TR_DEBUG, ("hb_fptPutMemo(%p, %hu, %p)", pArea, uiIndex, pItem));
@@ -1630,7 +1671,7 @@ static ERRCODE hb_fptPutMemo( FPTAREAP pArea, USHORT uiIndex, PHB_ITEM pItem )
bBufPtr = bBufAlloc;
}
}
else if ( pArea->bMemoType == MEMO_FPT_FLEX ||
else if ( pArea->bMemoType == MEMO_FPT_FLEX ||
pArea->bMemoType == MEMO_FPT_HB )
{
ulType = hb_itemType( pItem );
@@ -1814,7 +1855,7 @@ static ERRCODE hb_fptSysName( FPTAREAP pArea, BYTE * pBuffer )
static ERRCODE hb_fptGetValue( FPTAREAP pArea, USHORT uiIndex, PHB_ITEM pItem )
{
BOOL bDeleted;
ERRCODE uiError = SUCCESS;
ERRCODE uiError;
HB_TRACE(HB_TR_DEBUG, ("hb_fptGetValue(%p, %hu, %p)", pArea, uiIndex, pItem));
@@ -1843,7 +1884,7 @@ static ERRCODE hb_fptGetValue( FPTAREAP pArea, USHORT uiIndex, PHB_ITEM pItem )
hb_errPutSubCode( pError, uiError );
hb_errPutFlags( pError, EF_CANDEFAULT );
SELF_ERROR( ( AREAP ) pArea, pError );
hb_errRelease( pError );
hb_itemRelease( pError );
return FAILURE;
}
return SUCCESS;
@@ -1859,7 +1900,7 @@ static ERRCODE hb_fptGetValue( FPTAREAP pArea, USHORT uiIndex, PHB_ITEM pItem )
static ERRCODE hb_fptPutValue( FPTAREAP pArea, USHORT uiIndex, PHB_ITEM pItem )
{
BOOL bDeleted;
ERRCODE uiError = SUCCESS;
ERRCODE uiError;
HB_TRACE(HB_TR_DEBUG, ("hb_fptPutValue(%p, %hu, %p)", pArea, uiIndex, pItem));
@@ -1900,7 +1941,7 @@ static ERRCODE hb_fptPutValue( FPTAREAP pArea, USHORT uiIndex, PHB_ITEM pItem )
hb_errPutSubCode( pError, uiError );
hb_errPutFlags( pError, EF_CANDEFAULT );
SELF_ERROR( ( AREAP ) pArea, pError );
hb_errRelease( pError );
hb_itemRelease( pError );
return FAILURE;
}
return SUCCESS;
@@ -1948,7 +1989,7 @@ static ERRCODE hb_fptCreateMemFile( FPTAREAP pArea, LPDBOPENINFO pCreateInfo )
bRetry = FALSE;
} while( bRetry );
if( pError )
hb_errRelease( pError );
hb_itemRelease( pError );
if( pArea->hMemoFile == FS_ERROR )
return FAILURE;
@@ -1957,16 +1998,16 @@ static ERRCODE hb_fptCreateMemFile( FPTAREAP pArea, LPDBOPENINFO pCreateInfo )
hb_fsSeek( pArea->hMemoFile, 0, FS_SET );
memset( &fptHeader, 0, sizeof( FPTHEADER ) );
pArea->uiMemoBlockSize = ( hb_set.HB_SET_MBLOCKSIZE > 0 &&
hb_set.HB_SET_MBLOCKSIZE < 0xFFFF ) ?
pArea->uiMemoBlockSize = ( hb_set.HB_SET_MBLOCKSIZE > 0 &&
hb_set.HB_SET_MBLOCKSIZE < 0xFFFF ) ?
hb_set.HB_SET_MBLOCKSIZE : FPT_DEFBLOCKSIZE;
pArea->bMemoType = MEMO_FPT_HB;
//pArea->bMemoType = MEMO_FPT_SIX;
ulNextBlock = ( sizeof( FPTHEADER ) + pArea->uiMemoBlockSize - 1 ) / pArea->uiMemoBlockSize;
HB_PUT_BE_ULONG( &fptHeader.nextBlock, ulNextBlock );
HB_PUT_BE_USHORT( &fptHeader.blockSize, pArea->uiMemoBlockSize );
if ( pArea->bMemoType == MEMO_FPT_SIX ||
HB_PUT_BE_ULONG( fptHeader.nextBlock, ulNextBlock );
HB_PUT_BE_USHORT( fptHeader.blockSize, pArea->uiMemoBlockSize );
if ( pArea->bMemoType == MEMO_FPT_SIX ||
pArea->bMemoType == MEMO_FPT_SIXHB )
{
strcpy( ( char *) fptHeader.signature1, "SIxMemo" );
@@ -1978,7 +2019,7 @@ static ERRCODE hb_fptCreateMemFile( FPTAREAP pArea, LPDBOPENINFO pCreateInfo )
strcpy( ( char *) fptHeader.signature2, "FlexFile3\003" );
ulSize = sizeof( FPTHEADER );
}
if( hb_fsWrite( pArea->hMemoFile, ( BYTE * ) &fptHeader, ( USHORT) ulSize ) != ulSize )
if( hb_fsWrite( pArea->hMemoFile, ( BYTE * ) &fptHeader, ( USHORT) ulSize ) != ( USHORT ) ulSize )
return FAILURE;
memset( &fptHeader, 0, sizeof( FPTHEADER ) );
@@ -1986,7 +2027,7 @@ static ERRCODE hb_fptCreateMemFile( FPTAREAP pArea, LPDBOPENINFO pCreateInfo )
while ( ulLen > 0 )
{
ulSize = HB_MIN( ulLen, sizeof( FPTHEADER ) );
if( hb_fsWrite( pArea->hMemoFile, ( BYTE * ) &fptHeader, ( USHORT ) ulSize ) != ulSize )
if( hb_fsWrite( pArea->hMemoFile, ( BYTE * ) &fptHeader, ( USHORT ) ulSize ) != ( USHORT ) ulSize )
return FAILURE;
ulLen -= ulSize;
}
@@ -2037,7 +2078,7 @@ static ERRCODE hb_fptOpenMemFile( FPTAREAP pArea, LPDBOPENINFO pOpenInfo )
} while( bRetry );
if( pError )
hb_errRelease( pError );
hb_itemRelease( pError );
if( pArea->hMemoFile == FS_ERROR )
return FAILURE;
@@ -2047,12 +2088,16 @@ static ERRCODE hb_fptOpenMemFile( FPTAREAP pArea, LPDBOPENINFO pOpenInfo )
hb_fsSeek( pArea->hMemoFile, 0, FS_SET );
if ( hb_fsRead( pArea->hMemoFile, ( BYTE * ) &fptHeader, sizeof( FPTHEADER ) ) >= 512 )
{
pArea->uiMemoBlockSize = HB_GET_BE_USHORT( &fptHeader.blockSize );
pArea->uiMemoBlockSize = HB_GET_BE_USHORT( fptHeader.blockSize );
pArea->bMemoType = 0;
/* Check for compatibility with Harbour memo headers */
if ( memcmp( fptHeader.signature1, "Harbour", 7 ) == 0 )
{
pArea->bMemoType = MEMO_FPT_HB;
/* hack for detecting old harbour FPT files without FLEX support */
if ( HB_GET_BE_ULONG( fptHeader.signature2 ) == FPTIT_TEXT )
pArea->bMemoType = MEMO_FPT_SIXHB;
else
pArea->bMemoType = MEMO_FPT_HB;
}
/* Check for compatibility with SIX memo headers */
else if ( memcmp( fptHeader.signature1, "SIxMemo", 7 ) == 0 )
@@ -2065,12 +2110,12 @@ static ERRCODE hb_fptOpenMemFile( FPTAREAP pArea, LPDBOPENINFO pOpenInfo )
pArea->bMemoType = MEMO_FPT_CLIP;
}
/* Check for compatibility with Clipper 5.3/FlexFile3 malformed memo headers */
if ( pArea->bMemoType != MEMO_FPT_SIX &&
if ( pArea->bMemoType != MEMO_FPT_SIX &&
memcmp( fptHeader.signature2, "FlexFile3\003", 10) == 0 )
{
pArea->bMemoType = MEMO_FPT_FLEX;
if ( pArea->uiMemoBlockSize == 0)
pArea->uiMemoBlockSize = HB_GET_LE_USHORT( &fptHeader.flexSize );
if ( pArea->uiMemoBlockSize == 0 )
pArea->uiMemoBlockSize = HB_GET_LE_USHORT( fptHeader.flexSize );
}
}
@@ -2082,7 +2127,7 @@ static ERRCODE hb_fptOpenMemFile( FPTAREAP pArea, LPDBOPENINFO pOpenInfo )
hb_errPutDescription( pError, hb_langDGetErrorDesc( EG_CORRUPTION ) );
hb_errPutFileName( pError, (char *) pOpenInfo->abName );
SELF_ERROR( ( AREAP ) pArea, pError );
hb_errRelease( pError );
hb_itemRelease( pError );
return FAILURE;
}
@@ -2097,7 +2142,7 @@ static ERRCODE hb_fptOpenMemFile( FPTAREAP pArea, LPDBOPENINFO pOpenInfo )
*/
static ERRCODE hb_fptReadDBHeader( FPTAREAP pArea )
{
HB_TRACE(HB_TR_DEBUG, ("hb_fptReadHeader(%p)", pArea));
HB_TRACE(HB_TR_DEBUG, ("hb_fptReadDBHeader(%p)", pArea));
if( SUPER_READDBHEADER( ( AREAP ) pArea ) == FAILURE )
return FAILURE;

View File

@@ -267,20 +267,20 @@ static void commonError( NTXAREAP pArea, USHORT uiGenCode, USHORT uiSubCode, cha
static void hb_IncString( NTXAREAP pArea, char* s, int slen )
{
char *ptr;
unsigned int nsymb;
UINT nsymb;
for( ptr=s+slen-1;ptr>=s;ptr-- )
{
nsymb = (unsigned int) *ptr;
nsymb = (UINT) *ptr;
if( nsymb < 255 )
{
unsigned int n1, i;
if( pArea->cdPage->lSort && ( n1 = (unsigned int)pArea->cdPage->s_chars[ nsymb ] ) != 0 )
UINT n1, i;
if( pArea->cdPage->lSort && ( n1 = (UINT)pArea->cdPage->s_chars[ nsymb ] ) != 0 )
{
n1 ++;
for( i=0; i<255; i++ )
{
if( n1 == (unsigned int)pArea->cdPage->s_chars[ i ] )
if( n1 == (UINT)pArea->cdPage->s_chars[ i ] )
{
*ptr = (char) i;
break;
@@ -2437,7 +2437,7 @@ static ERRCODE hb_ntxIndexCreate( LPNTXINDEX pIndex )
USHORT uiCurLen;
char szBuffer[ HB_MAX_DOUBLE_LENGTH + 1 ];
char * pszTempName = NULL;
NTXAREAP pArea;
NTXAREAP pArea = pIndex->Owner;
LPTAGINFO pTag;
HB_MACRO_PTR pMacro;
PHB_ITEM pItem;
@@ -2449,8 +2449,7 @@ static ERRCODE hb_ntxIndexCreate( LPNTXINDEX pIndex )
BOOL fValidBuffer;
PHB_CODEPAGE cdpTmp = s_cdpage;
ulRecCount = pIndex->Owner->ulRecCount;
pArea = pIndex->Owner;
ulRecCount = pArea->ulRecCount;
pTag = pIndex->CompoundTag;
pItem = hb_itemNew( NULL );
s_cdpage = pArea->cdPage;

View File

@@ -44,6 +44,7 @@ C_SOURCES=\
gtapiu.c \
gx.c \
hardcr.c \
hbrandom.c \
idle.c \
inkey.c \
is.c \

View File

@@ -2005,3 +2005,48 @@ static HANDLE DostoWinHandle( FHANDLE fHandle)
}
#endif
BYTE HB_EXPORT * hb_fileNameConv(char *str) {
// Convert file and dir case. The allowed SET options are:
// LOWER - Convert all caracters of file to lower
// UPPER - Convert all caracters of file to upper
// MIXED - Leave as is
// The allowed environment options are:
// FILECASE - define the case of file
// DIRCASE - define the case of path
// DIRSEPARATOR - define separator of path (Ex. "/")
size_t a;
char *filename;
char *dirname=str;
size_t dirlen;
char * szFileTrim =str;
ULONG ulPos;
// Look for filename (Last "\" or DIRSEPARATOR)
if( hb_set.HB_SET_DIRSEPARATOR != '\\' ) {
for(a=0;a<strlen(str);a++)
if( str[a] == '\\' )
str[a] = hb_set.HB_SET_DIRSEPARATOR;
}
if(( filename = strrchr( str, hb_set.HB_SET_DIRSEPARATOR )) != NULL)
filename++;
else
filename=str;
dirlen=filename-str;
// FILECASE
if( hb_set.HB_SET_FILECASE == HB_SET_CASE_LOWER )
hb_strLower( filename, strlen(filename) );
else if( hb_set.HB_SET_FILECASE == HB_SET_CASE_UPPER )
hb_strUpper( filename, strlen(filename) );
// DIRCASE
if( hb_set.HB_SET_DIRCASE == HB_SET_CASE_LOWER )
hb_strLower(dirname,dirlen);
else if( hb_set.HB_SET_DIRCASE == HB_SET_CASE_UPPER )
hb_strUpper(dirname,dirlen);
return (( BYTE * ) str);
}

View File

@@ -0,0 +1,141 @@
/*
* $Id$
*/
/*
* xHarbour Project source code:
* Random number generator routine
*
* Copyright 2003 Giancarlo Niccolai <gian@niccolai.ws>
* www - http://www.harbour-project.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this software; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307 USA (or visit the web site http://www.gnu.org/).
*
* As a special exception, the Harbour Project gives permission for
* additional uses of the text contained in its release of Harbour.
*
* The exception is that, if you link the Harbour libraries with other
* files to produce an executable, this does not by itself cause the
* resulting executable to be covered by the GNU General Public License.
* Your use of that executable is in no way restricted on account of
* linking the Harbour library code into it.
*
* This exception does not however invalidate any other reasons why
* the executable file might be covered by the GNU General Public License.
*
* This exception applies only to the code released by the Harbour
* Project under the name Harbour. If you copy code from other
* Harbour Project or Free Software Foundation releases into a copy of
* Harbour, as the General Public License permits, the exception does
* not apply to the code that you add in this way. To avoid misleading
* anyone as to the status of such modified files, you must delete
* this exception notice from them.
*
* If you write modifications of your own for Harbour, it is your choice
* whether to permit this exception to apply to your modifications.
* If you do not wish that, delete this exception notice.
*
*/
#include <hbmath.h>
#include <stdlib.h>
#include <time.h>
#ifndef HB_OS_WIN_32
#include <float.h>
#endif
/* Globally available data, no need to MT it */
volatile static int s_bInit = 0;
/*
* HB_RANDOM
*
* HB_RANDOM() --> returns a real value n so that 0 <= n < 1
* HB_RANDOM( x ) --> returns a real number n so that 0 <= n < x
* HB_RANDOM( x, y) --> Returns a real number n so that x <= n < y
*/
HB_FUNC( HB_RANDOM )
{
double dRnd;
double dX, dY;
dRnd = hb_random_num();
if( ! ISNUM( 1 ) )
{
hb_retnd( dRnd );
}
else if( ! ISNUM(2) )
{
hb_retnd( dRnd * hb_parnd(1) );
}
else
{
dX = hb_parnd( 2 );
dY = hb_parnd( 1 );
if ( dX > dY )
{
double dZ = dY;
dY = dX;
dX = dZ;
}
hb_retnd( dRnd * (dY - dX ) + dX );
}
}
HB_FUNC( HB_RANDOMSEED )
{
if( ! ISNUM( 1 ) )
{
srand( (unsigned)time( NULL ) );
}
else
{
srand( hb_parni(1) );
}
s_bInit = 1;
}
/* Returns a double value between 0 and 1 */
double hb_random_num()
{
double d1, d2;
if( s_bInit == 0 )
{
srand( (unsigned)time( NULL ) );
s_bInit = 1;
}
d1 = (double) rand();
d2 = (double) RAND_MAX;
#ifdef HB_OS_WIN_32
/* It seems that on win32 platform there some weirdness about EPSILON value so
that a float division using an epsilon smaller than 1e-10 may be rounded.
Must dig if it's a borland lib bug or a windows problem.
*/
d2 += 0.001;
#else
d2 += DBL_EPSILON;
#endif
return d1 / d2;
}

View File

@@ -869,6 +869,20 @@ HB_FUNC( SET )
hb_retc( hb_dirsep_string );
if( args > 1 ) hb_set.HB_SET_DIRSEPARATOR = set_char( pArg2, hb_set.HB_SET_DIRSEPARATOR );
break;
case HB_SET_DBFLOCKSCHEME:
hb_retni( hb_set.HB_SET_DBFLOCKSCHEME );
if( args > 1 )
{
if( set_number( pArg2, hb_set.HB_SET_DBFLOCKSCHEME ) < 0 )
{
hb_errRT_BASE( EG_ARG, 2020, NULL, "SET", 2, hb_paramError( 1 ), hb_paramError( 2 ) );
}
else
{
hb_set.HB_SET_DBFLOCKSCHEME = set_number( pArg2, hb_set.HB_SET_DBFLOCKSCHEME );
}
}
break;
default :
/* Return NIL if called with invalid SET specifier */
break;
@@ -959,6 +973,7 @@ void hb_setInitialize( void )
hb_set.HB_SET_DIRSEPARATOR = '\\';
hb_set.HB_SET_VIDEOMODE = 0;
hb_set.HB_SET_WRAP = FALSE;
hb_set.HB_SET_DBFLOCKSCHEME = 0;
sp_sl_first = sp_sl_last = NULL;
s_next_listener = 1;