2004-03-08 19:50 UTC+0300 Alexander Kresin <alex@belacy.belgorod.su>
This commit is contained in:
3952
harbour/ChangeLog
3952
harbour/ChangeLog
File diff suppressed because it is too large
Load Diff
3935
harbour/ChangeLog.014
Normal file
3935
harbour/ChangeLog.014
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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) -+$@,,
|
||||
|
||||
@@ -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 \
|
||||
|
||||
@@ -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 \
|
||||
|
||||
@@ -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
@@ -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__)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -44,6 +44,7 @@ C_SOURCES=\
|
||||
gtapiu.c \
|
||||
gx.c \
|
||||
hardcr.c \
|
||||
hbrandom.c \
|
||||
idle.c \
|
||||
inkey.c \
|
||||
is.c \
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
141
harbour/source/rtl/hbrandom.c
Normal file
141
harbour/source/rtl/hbrandom.c
Normal 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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user