2010-02-12 21:01 UTC+0100 Viktor Szakats (harbour.01 syenar.hu)

* include/hbdefs.h
    * HB_BYTE made a synonym for HB_UCHAR.
      HB_BYTE is only there for convenience, HB_UCHAR is recommended
      for unsigned byte streams.
    * HB_U8 now based on HB_UCHAR.
    ! Fixed UINT64/INT64 left defined in some cases.

  * contrib/hbwin/hbwin.h
  * contrib/hbwin/hbwin.ch
  * contrib/hbwin/tests/testdll.prg
  * contrib/hbwin/win_dll.c
  * contrib/hbwin/legacycd.c
    + Added LONGLONG C types.
    + Added support for user-specifiable parameter types.
      This works now in low-level C dll call function and also
      on high level in HB_DLLCALL().
    + Added support for LONGLONG/int64 integers.
    + Added support for raw strings. (no UNICODE or codepage
      conversion).
    ! Fixed typo in iRetTypeRaw assigment.
    + Added one new test for param type spec test. (pretty bare)
    ! Fixed WAPI_GETPROCADDRESS() to GETPROCADDRESS(). Latter
      has some extra features so we still need it.
    * GETPROCADDRESS() moved back to non-compatibility.
    ; Please review the code. There are some integer conversion
      which might not be proper (& 0xFFFF).

  * utils/hbmk2/hbmk2.prg
    ! Typo in recently added help text.

  * contrib/Makefile
  - contrib/hbbmcdx
  + contrib/rddbmcdx
  * contrib/rddbmcdx/bmdbfcdx.c
  * contrib/rddbmcdx/Makefile
    * Renamed hbbmcdx to rddbmcdx.
    * More cleanup to RDD code. (sync with rddcdx, deleted
      unnecessary lines)
    - Deleted "turbo" functionality. BM_TURBO() is now a dummy.
      AFAIR this isn't safe, and even if it is it should be
      implemented differently, not as a static variable.
This commit is contained in:
Viktor Szakats
2010-02-12 20:02:34 +00:00
parent dd737b5c65
commit b41aa9e908
15 changed files with 561 additions and 285 deletions

View File

@@ -17,6 +17,49 @@
past entries belonging to author(s): Viktor Szakats.
*/
2010-02-12 21:01 UTC+0100 Viktor Szakats (harbour.01 syenar.hu)
* include/hbdefs.h
* HB_BYTE made a synonym for HB_UCHAR.
HB_BYTE is only there for convenience, HB_UCHAR is recommended
for unsigned byte streams.
* HB_U8 now based on HB_UCHAR.
! Fixed UINT64/INT64 left defined in some cases.
* contrib/hbwin/hbwin.h
* contrib/hbwin/hbwin.ch
* contrib/hbwin/tests/testdll.prg
* contrib/hbwin/win_dll.c
* contrib/hbwin/legacycd.c
+ Added LONGLONG C types.
+ Added support for user-specifiable parameter types.
This works now in low-level C dll call function and also
on high level in HB_DLLCALL().
+ Added support for LONGLONG/int64 integers.
+ Added support for raw strings. (no UNICODE or codepage
conversion).
! Fixed typo in iRetTypeRaw assigment.
+ Added one new test for param type spec test. (pretty bare)
! Fixed WAPI_GETPROCADDRESS() to GETPROCADDRESS(). Latter
has some extra features so we still need it.
* GETPROCADDRESS() moved back to non-compatibility.
; Please review the code. There are some integer conversion
which might not be proper (& 0xFFFF).
* utils/hbmk2/hbmk2.prg
! Typo in recently added help text.
* contrib/Makefile
- contrib/hbbmcdx
+ contrib/rddbmcdx
* contrib/rddbmcdx/bmdbfcdx.c
* contrib/rddbmcdx/Makefile
* Renamed hbbmcdx to rddbmcdx.
* More cleanup to RDD code. (sync with rddcdx, deleted
unnecessary lines)
- Deleted "turbo" functionality. BM_TURBO() is now a dummy.
AFAIR this isn't safe, and even if it is it should be
implemented differently, not as a static variable.
2010-02-12 12:49 UTC+0100 Viktor Szakats (harbour.01 syenar.hu)
* contrib/hbwin/Makefile
* contrib/hbwin/win_dll.c

View File

@@ -7,7 +7,6 @@ ROOT := ../
# contribs _without_ external dependencies
DIRS := \
gtwvg \
hbbmcdx \
hbbtree \
hbclipsm \
hbct \
@@ -24,6 +23,7 @@ DIRS := \
hbtpathy \
hbwin \
hbziparc \
rddbmcdx \
xhb \
xpp \

View File

@@ -78,10 +78,14 @@
#define HB_WIN_DLL_CTYPE_LONG_UNSIGNED 0x0014
#define HB_WIN_DLL_CTYPE_LONG_PTR 0x0104
#define HB_WIN_DLL_CTYPE_LONG_UNSIGNED_PTR 0x0114
#define HB_WIN_DLL_CTYPE_FLOAT 0x0005
#define HB_WIN_DLL_CTYPE_FLOAT_PTR 0x0105
#define HB_WIN_DLL_CTYPE_DOUBLE 0x0006
#define HB_WIN_DLL_CTYPE_DOUBLE_PTR 0x0106
#define HB_WIN_DLL_CTYPE_LLONG 0x0005
#define HB_WIN_DLL_CTYPE_LLONG_UNSIGNED 0x0015
#define HB_WIN_DLL_CTYPE_LLONG_PTR 0x0105
#define HB_WIN_DLL_CTYPE_LLONG_UNSIGNED_PTR 0x0115
#define HB_WIN_DLL_CTYPE_FLOAT 0x0006
#define HB_WIN_DLL_CTYPE_FLOAT_PTR 0x0106
#define HB_WIN_DLL_CTYPE_DOUBLE 0x0007
#define HB_WIN_DLL_CTYPE_DOUBLE_PTR 0x0107
#define HB_WIN_DLL_CTYPE_BOOL 0x0008
#define HB_WIN_DLL_CTYPE_BOOL_PTR 0x0108
#define HB_WIN_DLL_CTYPE_VOID 0x0009

View File

@@ -93,7 +93,7 @@
HB_EXTERN_BEGIN
extern HB_EXPORT int hbwin_bitmapType( const void * pImgBuf, HB_SIZE size );
extern HB_EXPORT void hbwin_dllCall( int iCallConv, int iRetType, HB_BOOL bUNICODE, FARPROC lpFunction, int iParams, int iFirst, int * iParTypes );
extern HB_EXPORT void hbwin_dllCall( int iCallConv, int iRetType, HB_BOOL bUNICODE, FARPROC lpFunction, int iParams, int iFirst, int * piArgType );
extern FARPROC hbwin_getprocaddress( HMODULE hDLL, int iParam, HB_BOOL * pbUNICODE );

View File

@@ -97,18 +97,6 @@ HB_FUNC( FREELIBRARY )
hb_retl( HB_FALSE );
}
HB_FUNC( GETPROCADDRESS )
{
HMODULE hDLL;
if( HB_ISNUM( 1 ) )
hDLL = ( HMODULE ) ( HB_PTRDIFF ) hb_parnint( 1 );
else
hDLL = ( HMODULE ) hb_parptr( 1 );
hb_retptr( hDLL ? ( void * ) hbwin_getprocaddress( hDLL, 2, NULL ) : NULL );
}
#ifndef HB_WIN_NO_LEGACY
#define HB_WIN_NO_LEGACY
#endif

View File

@@ -75,8 +75,8 @@ PROCEDURE Main()
IF hb_FileExists( "libcurl.dll" )
hDLL := wapi_LoadLibrary( "libcurl.dll" )
? wapi_GetProcAddress( hDLL, "curl_version" )
? win_dllCall( { NIL, HB_WIN_DLL_CTYPE_CHAR_PTR }, wapi_GetProcAddress( hDLL, "curl_version" ) )
? GetProcAddress( hDLL, "curl_version" )
? win_dllCall( { NIL, HB_WIN_DLL_CTYPE_CHAR_PTR }, GetProcAddress( hDLL, "curl_version" ) )
wapi_FreeLibrary( hDLL )
ENDIF
@@ -97,12 +97,15 @@ PROCEDURE Main()
hDLL := wapi_LoadLibrary( "shell32.dll" )
? "ValType( hDLL ): ", ValType( hDLL )
cData := Space( MAX_PATH )
? "WIN_DLLCALL (BOOL retval): ", win_dllCall( { NIL, HB_WIN_DLL_CTYPE_BOOL }, wapi_GetProcAddress( hDLL, "SHGetSpecialFolderPath" ), 0, @cData, CSIDL_APPDATA, 0 )
? "WIN_DLLCALL (BOOL retval): ", win_dllCall( { NIL, HB_WIN_DLL_CTYPE_BOOL }, GetProcAddress( hDLL, "SHGetSpecialFolderPath" ), 0, @cData, CSIDL_APPDATA, 0 )
? "@cData: ", cData
? "WIN_DLLCALL: ", win_dllCall( wapi_GetProcAddress( hDLL, "SHGetFolderPath" ), 0, CSIDL_ADMINTOOLS, 0, 0, cData ) // WRONG
? "WIN_DLLCALL: ", win_dllCall( GetProcAddress( hDLL, "SHGetFolderPath" ), 0, CSIDL_ADMINTOOLS, 0, 0, cData ) // WRONG
? "cData:", cData
cData := Space( MAX_PATH )
? "WIN_DLLCALL: ", win_dllCall( wapi_GetProcAddress( hDLL, "SHGetFolderPath" ), 0, CSIDL_ADMINTOOLS, 0, 0, @cData )
? "WIN_DLLCALL (PARAMS): ", win_dllCall( { NIL, NIL, NIL, HB_WIN_DLL_CTYPE_BOOL }, GetProcAddress( hDLL, "SHGetSpecialFolderPath" ), 0, @cData, CSIDL_APPDATA, 0 )
? "@cData: ", cData
cData := Space( MAX_PATH )
? "WIN_DLLCALL: ", win_dllCall( GetProcAddress( hDLL, "SHGetFolderPath" ), 0, CSIDL_ADMINTOOLS, 0, 0, @cData )
? "@cData: ", cData
wapi_FreeLibrary( hDLL )

View File

@@ -7,8 +7,6 @@
* Windows DLL handling function
*
* Copyright 2009-2010 Viktor Szakats (harbour.01 syenar.hu)
* Based on some original code by:
* Copyright 2002 Vic McClung <vicmcclung@vicmcclung.com>
* www - http://www.harbour-project.org
*
* This program is free software; you can redistribute it and/or modify
@@ -71,6 +69,35 @@
#define _DLLEXEC_MAXPARAM 15
static int hb_hbtoctype( int iHarbourType )
{
switch( iHarbourType )
{
case HB_IT_NIL:
return HB_WIN_DLL_CTYPE_VOID;
case HB_IT_LOGICAL:
return HB_WIN_DLL_CTYPE_BOOL;
case HB_IT_INTEGER:
case HB_IT_LONG:
case HB_IT_DATE:
return HB_WIN_DLL_CTYPE_LONG;
case HB_IT_DOUBLE:
return HB_WIN_DLL_CTYPE_DOUBLE;
case HB_IT_STRING:
case HB_IT_MEMO:
return HB_WIN_DLL_CTYPE_CHAR_PTR;
case HB_IT_POINTER:
return HB_WIN_DLL_CTYPE_VOID_PTR;
}
return HB_WIN_DLL_CTYPE_DEFAULT;
}
#if defined( HB_ARCH_64BIT )
typedef struct
@@ -84,6 +111,8 @@ typedef struct
{
HB_BOOL bUNICODE;
int iFirst;
int * piArgTypeReq;
int * piArgType;
HB_WINARG * pArg;
} HB_WINCALL, * PHB_WINCALL;
@@ -94,27 +123,51 @@ static HB_U64 hb_u64par( PHB_WINCALL wcall, int iParam )
if( pParam )
{
switch( HB_ITEM_TYPE( pParam ) )
switch( wcall->piArgType[ iParam - 1 ] )
{
case HB_IT_LOGICAL:
case HB_WIN_DLL_CTYPE_BOOL:
wcall->pArg[ iParam - 1 ].nValue = hb_itemGetL( pParam );
r = wcall->pArg[ iParam - 1 ].bByRef ? ( HB_PTRUINT ) &wcall->pArg[ iParam - 1 ].nValue : wcall->pArg[ iParam - 1 ].nValue;
break;
case HB_IT_INTEGER:
case HB_IT_LONG:
case HB_IT_DATE:
case HB_WIN_DLL_CTYPE_CHAR:
case HB_WIN_DLL_CTYPE_CHAR_UNSIGNED:
wcall->pArg[ iParam - 1 ].nValue = hb_itemGetNI( pParam ) & 0xFF;
r = wcall->pArg[ iParam - 1 ].bByRef ? ( HB_PTRUINT ) &wcall->pArg[ iParam - 1 ].nValue : wcall->pArg[ iParam - 1 ].nValue;
break;
case HB_WIN_DLL_CTYPE_SHORT:
case HB_WIN_DLL_CTYPE_SHORT_UNSIGNED:
wcall->pArg[ iParam - 1 ].nValue = hb_itemGetNI( pParam ) & 0xFFFF;
r = wcall->pArg[ iParam - 1 ].bByRef ? ( HB_PTRUINT ) &wcall->pArg[ iParam - 1 ].nValue : wcall->pArg[ iParam - 1 ].nValue;
break;
case HB_WIN_DLL_CTYPE_INT:
case HB_WIN_DLL_CTYPE_INT_UNSIGNED:
case HB_WIN_DLL_CTYPE_LONG:
case HB_WIN_DLL_CTYPE_LONG_UNSIGNED:
wcall->pArg[ iParam - 1 ].nValue = hb_itemGetNL( pParam );
r = wcall->pArg[ iParam - 1 ].bByRef ? ( HB_PTRUINT ) &wcall->pArg[ iParam - 1 ].nValue : wcall->pArg[ iParam - 1 ].nValue;
break;
case HB_WIN_DLL_CTYPE_LLONG:
case HB_WIN_DLL_CTYPE_LLONG_UNSIGNED:
wcall->pArg[ iParam - 1 ].nValue = hb_itemGetNInt( pParam );
r = wcall->pArg[ iParam - 1 ].bByRef ? ( HB_PTRUINT ) &wcall->pArg[ iParam - 1 ].nValue : wcall->pArg[ iParam - 1 ].nValue;
break;
case HB_IT_DOUBLE:
case HB_WIN_DLL_CTYPE_FLOAT:
case HB_WIN_DLL_CTYPE_DOUBLE:
HB_PUT_LE_DOUBLE( ( BYTE * ) &wcall->pArg[ iParam - 1 ].nValue, hb_itemGetND( pParam ) );
r = wcall->pArg[ iParam - 1 ].bByRef ? ( HB_PTRUINT ) &wcall->pArg[ iParam - 1 ].nValue : wcall->pArg[ iParam - 1 ].nValue;
break;
case HB_IT_STRING:
case HB_IT_MEMO:
case HB_WIN_DLL_CTYPE_CHAR_UNSIGNED_PTR:
r = ( HB_PTRUINT ) hb_strunshare( &wcall->pArg[ iParam - 1 ].hString, hb_itemGetCPtr( pParam ), hb_itemGetCLen( pParam ) );
wcall->pArg[ iParam - 1 ].nValue = r;
break;
case HB_WIN_DLL_CTYPE_CHAR_PTR:
if( wcall->bUNICODE )
r = ( HB_PTRUINT ) hb_itemGetStrU16( pParam, HB_CDP_ENDIAN_NATIVE, &wcall->pArg[ iParam - 1 ].hString, NULL );
else
@@ -122,10 +175,31 @@ static HB_U64 hb_u64par( PHB_WINCALL wcall, int iParam )
wcall->pArg[ iParam - 1 ].nValue = r;
break;
case HB_IT_POINTER:
case HB_WIN_DLL_CTYPE_SHORT_PTR:
case HB_WIN_DLL_CTYPE_SHORT_UNSIGNED_PTR:
case HB_WIN_DLL_CTYPE_INT_PTR:
case HB_WIN_DLL_CTYPE_INT_UNSIGNED_PTR:
case HB_WIN_DLL_CTYPE_LONG_PTR:
case HB_WIN_DLL_CTYPE_LONG_UNSIGNED_PTR:
case HB_WIN_DLL_CTYPE_LLONG_PTR:
case HB_WIN_DLL_CTYPE_LLONG_UNSIGNED_PTR:
case HB_WIN_DLL_CTYPE_FLOAT_PTR:
case HB_WIN_DLL_CTYPE_DOUBLE_PTR:
case HB_WIN_DLL_CTYPE_BOOL_PTR:
case HB_WIN_DLL_CTYPE_VOID_PTR:
case HB_WIN_DLL_CTYPE_STRUCTURE_PTR:
wcall->pArg[ iParam - 1 ].nValue = ( HB_PTRUINT ) hb_itemGetPtr( pParam );
r = wcall->pArg[ iParam - 1 ].bByRef ? ( HB_PTRUINT ) &wcall->pArg[ iParam - 1 ].nValue : wcall->pArg[ iParam - 1 ].nValue;
break;
case HB_WIN_DLL_CTYPE_STRUCTURE:
/* TODO */
r = wcall->pArg[ iParam - 1 ].nValue = 0;
break;
case HB_WIN_DLL_CTYPE_VOID:
default:
r = wcall->pArg[ iParam - 1 ].nValue = 0;
}
}
@@ -173,34 +247,63 @@ typedef struct
{
HB_BOOL bUNICODE;
int iFirst;
int * piArgTypeReq;
int * piArgType;
HB_WINARG * pArg;
} HB_WINCALL, * PHB_WINCALL;
static void hb_u32par( PHB_WINCALL wcall, int iParam, HB_U32 * r1, HB_U32 * r2, HB_BOOL * b64 )
static void hb_u32par( PHB_ITEM pParam, PHB_WINCALL wcall, int iParam, HB_U32 * r1, HB_U32 * r2, HB_BOOL * b64 )
{
PHB_ITEM pParam = hb_param( wcall->iFirst + iParam, HB_IT_ANY );
*b64 = HB_FALSE;
if( pParam )
{
switch( HB_ITEM_TYPE( pParam ) )
switch( wcall->piArgType[ iParam - 1 ] )
{
/* TODO: Add 64-bit integer support */
case HB_IT_LOGICAL:
case HB_WIN_DLL_CTYPE_BOOL:
wcall->pArg[ iParam - 1 ].value.t.n32 = hb_itemGetL( pParam );
*r1 = wcall->pArg[ iParam - 1 ].bByRef ? ( HB_U32 ) &wcall->pArg[ iParam - 1 ].value.t.n32 : wcall->pArg[ iParam - 1 ].value.t.n32;
break;
case HB_IT_INTEGER:
case HB_IT_LONG:
case HB_IT_DATE:
case HB_WIN_DLL_CTYPE_CHAR:
case HB_WIN_DLL_CTYPE_CHAR_UNSIGNED:
wcall->pArg[ iParam - 1 ].value.t.n32 = hb_itemGetNI( pParam ) & 0xFF;
*r1 = wcall->pArg[ iParam - 1 ].bByRef ? ( HB_U32 ) &wcall->pArg[ iParam - 1 ].value.t.n32 : wcall->pArg[ iParam - 1 ].value.t.n32;
break;
case HB_WIN_DLL_CTYPE_SHORT:
case HB_WIN_DLL_CTYPE_SHORT_UNSIGNED:
wcall->pArg[ iParam - 1 ].value.t.n32 = hb_itemGetNI( pParam ) & 0xFFFF;
*r1 = wcall->pArg[ iParam - 1 ].bByRef ? ( HB_U32 ) &wcall->pArg[ iParam - 1 ].value.t.n32 : wcall->pArg[ iParam - 1 ].value.t.n32;
break;
case HB_WIN_DLL_CTYPE_INT:
case HB_WIN_DLL_CTYPE_INT_UNSIGNED:
case HB_WIN_DLL_CTYPE_LONG:
case HB_WIN_DLL_CTYPE_LONG_UNSIGNED:
wcall->pArg[ iParam - 1 ].value.t.n32 = hb_itemGetNL( pParam );
*r1 = wcall->pArg[ iParam - 1 ].bByRef ? ( HB_U32 ) &wcall->pArg[ iParam - 1 ].value.t.n32 : wcall->pArg[ iParam - 1 ].value.t.n32;
break;
case HB_IT_DOUBLE:
case HB_WIN_DLL_CTYPE_LLONG:
case HB_WIN_DLL_CTYPE_LLONG_UNSIGNED:
wcall->pArg[ iParam - 1 ].value.t.n32 = hb_itemGetNL( pParam );
if( wcall->pArg[ iParam - 1 ].bByRef )
*r1 = ( HB_U32 ) &wcall->pArg[ iParam - 1 ].value.t.n64;
else
{
*r1 = wcall->pArg[ iParam - 1 ].value.t.n64 & 0xFFFFFFFF;
*r2 = ( wcall->pArg[ iParam - 1 ].value.t.n64 >> 32 );
*b64 = HB_TRUE;
}
break;
case HB_WIN_DLL_CTYPE_FLOAT:
wcall->pArg[ iParam - 1 ].value.t.nFL = ( float ) hb_itemGetND( pParam );
*r1 = wcall->pArg[ iParam - 1 ].bByRef ? ( HB_U32 ) &wcall->pArg[ iParam - 1 ].value.t.nFL : wcall->pArg[ iParam - 1 ].value.t.n32;
break;
case HB_WIN_DLL_CTYPE_DOUBLE:
wcall->pArg[ iParam - 1 ].value.t.nDB = hb_itemGetND( pParam );
if( wcall->pArg[ iParam - 1 ].bByRef )
*r1 = ( HB_U32 ) &wcall->pArg[ iParam - 1 ].value.t.nDB;
@@ -212,8 +315,12 @@ static void hb_u32par( PHB_WINCALL wcall, int iParam, HB_U32 * r1, HB_U32 * r2,
}
break;
case HB_IT_STRING:
case HB_IT_MEMO:
case HB_WIN_DLL_CTYPE_CHAR_UNSIGNED_PTR:
*r1 = ( HB_U32 ) hb_strunshare( &wcall->pArg[ iParam - 1 ].hString, hb_itemGetCPtr( pParam ), hb_itemGetCLen( pParam ) );
wcall->pArg[ iParam - 1 ].value.t.n32 = *r1;
break;
case HB_WIN_DLL_CTYPE_CHAR_PTR:
if( wcall->bUNICODE )
*r1 = ( HB_U32 ) hb_itemGetStrU16( pParam, HB_CDP_ENDIAN_NATIVE, &wcall->pArg[ iParam - 1 ].hString, NULL );
else
@@ -221,10 +328,31 @@ static void hb_u32par( PHB_WINCALL wcall, int iParam, HB_U32 * r1, HB_U32 * r2,
wcall->pArg[ iParam - 1 ].value.t.n32 = *r1;
break;
case HB_IT_POINTER:
case HB_WIN_DLL_CTYPE_SHORT_PTR:
case HB_WIN_DLL_CTYPE_SHORT_UNSIGNED_PTR:
case HB_WIN_DLL_CTYPE_INT_PTR:
case HB_WIN_DLL_CTYPE_INT_UNSIGNED_PTR:
case HB_WIN_DLL_CTYPE_LONG_PTR:
case HB_WIN_DLL_CTYPE_LONG_UNSIGNED_PTR:
case HB_WIN_DLL_CTYPE_LLONG_PTR:
case HB_WIN_DLL_CTYPE_LLONG_UNSIGNED_PTR:
case HB_WIN_DLL_CTYPE_FLOAT_PTR:
case HB_WIN_DLL_CTYPE_DOUBLE_PTR:
case HB_WIN_DLL_CTYPE_BOOL_PTR:
case HB_WIN_DLL_CTYPE_VOID_PTR:
case HB_WIN_DLL_CTYPE_STRUCTURE_PTR:
wcall->pArg[ iParam - 1 ].value.t.n32 = ( HB_U32 ) hb_itemGetPtr( pParam );
*r1 = wcall->pArg[ iParam - 1 ].bByRef ? ( HB_U32 ) &wcall->pArg[ iParam - 1 ].value.t.n32 : wcall->pArg[ iParam - 1 ].value.t.n32;
break;
case HB_WIN_DLL_CTYPE_STRUCTURE:
/* TODO */
*r1 = wcall->pArg[ iParam - 1 ].value.t.n32 = 0;
break;
case HB_WIN_DLL_CTYPE_VOID:
default:
*r1 = wcall->pArg[ iParam - 1 ].value.t.n32 = 0;
}
}
}
@@ -480,12 +608,10 @@ typedef float ( _cdecl * WIN32_CFLP30 )( HB_U32, HB_U32, HB_U32, HB_U32, HB_U
#endif
void hbwin_dllCall( int iCallConv, int iRetType, HB_BOOL bUNICODE, FARPROC lpFunction, int iParams, int iFirst, int * iParTypes )
void hbwin_dllCall( int iCallConv, int iRetType, HB_BOOL bUNICODE, FARPROC lpFunction, int iParams, int iFirst, int * piArgTypeReq )
{
int tmp;
HB_SYMBOL_UNUSED( iParTypes );
if( ! lpFunction )
return;
@@ -496,7 +622,8 @@ void hbwin_dllCall( int iCallConv, int iRetType, HB_BOOL bUNICODE, FARPROC lpFun
HB_SYMBOL_UNUSED( iCallConv );
wcall.bUNICODE = bUNICODE;
wcall.iFirst = iFirst - 1;
wcall.iFirst = iFirst - 1;
wcall.piArgTypeReq = piArgTypeReq;
iParams -= wcall.iFirst;
@@ -507,13 +634,26 @@ void hbwin_dllCall( int iCallConv, int iRetType, HB_BOOL bUNICODE, FARPROC lpFun
if( iParams )
{
wcall.pArg = ( HB_WINARG * ) hb_xgrab( iParams * sizeof( HB_WINARG ) );
wcall.piArgType = ( int * ) hb_xgrab( iParams * sizeof( int ) );
memset( wcall.pArg, 0, iParams * sizeof( HB_WINARG ) );
}
else
{
wcall.pArg = NULL;
wcall.piArgType = NULL;
}
for( tmp = 0; tmp < iParams; ++tmp )
{
PHB_ITEM pParam = hb_param( iFirst + tmp, HB_IT_ANY );
wcall.piArgType[ tmp ] = wcall.piArgTypeReq ? wcall.piArgTypeReq[ tmp ] : HB_WIN_DLL_CTYPE_DEFAULT;
if( wcall.piArgType[ tmp ] == HB_WIN_DLL_CTYPE_DEFAULT )
wcall.piArgType[ tmp ] = hb_hbtoctype( HB_ITEM_TYPE( pParam ) );
wcall.pArg[ tmp ].bByRef = HB_ISBYREF( iFirst + tmp );
}
switch( iParams )
{
@@ -559,11 +699,16 @@ void hbwin_dllCall( int iCallConv, int iRetType, HB_BOOL bUNICODE, FARPROC lpFun
case HB_WIN_DLL_CTYPE_INT_UNSIGNED:
case HB_WIN_DLL_CTYPE_LONG_UNSIGNED:
case HB_WIN_DLL_CTYPE_LLONG:
case HB_WIN_DLL_CTYPE_LLONG_UNSIGNED:
hb_retnint( nRetVal );
break;
case HB_WIN_DLL_CTYPE_CHAR_PTR:
case HB_WIN_DLL_CTYPE_CHAR_UNSIGNED_PTR:
hb_retc( ( const char * ) nRetVal );
break;
case HB_WIN_DLL_CTYPE_CHAR_PTR:
if( bUNICODE )
hb_retstr_u16( HB_CDP_ENDIAN_NATIVE, ( const HB_WCHAR * ) nRetVal );
else
@@ -577,6 +722,7 @@ void hbwin_dllCall( int iCallConv, int iRetType, HB_BOOL bUNICODE, FARPROC lpFun
case HB_WIN_DLL_CTYPE_LONG_PTR:
case HB_WIN_DLL_CTYPE_LONG_UNSIGNED_PTR:
case HB_WIN_DLL_CTYPE_VOID_PTR:
case HB_WIN_DLL_CTYPE_BOOL_PTR:
case HB_WIN_DLL_CTYPE_FLOAT_PTR:
case HB_WIN_DLL_CTYPE_DOUBLE_PTR:
hb_retptr( ( void * ) nRetVal );
@@ -588,41 +734,73 @@ void hbwin_dllCall( int iCallConv, int iRetType, HB_BOOL bUNICODE, FARPROC lpFun
break;
default:
hb_retnl( ( long ) nRetVal );
hb_retnint( nRetVal );
}
for( tmp = 0; tmp < iParams; ++tmp )
{
if( wcall.pArg[ tmp ].bByRef )
{
switch( HB_ITEM_TYPE( hb_param( iFirst + tmp, HB_IT_ANY ) ) )
switch( wcall.piArgType[ tmp ] )
{
case HB_IT_LOGICAL:
case HB_WIN_DLL_CTYPE_VOID:
hb_stor( iFirst + tmp );
break;
case HB_WIN_DLL_CTYPE_BOOL:
hb_storl( wcall.pArg[ tmp ].nValue != 0, iFirst + tmp );
break;
case HB_IT_NIL:
case HB_IT_INTEGER:
case HB_IT_LONG:
case HB_IT_DATE:
case HB_WIN_DLL_CTYPE_CHAR:
case HB_WIN_DLL_CTYPE_CHAR_UNSIGNED:
case HB_WIN_DLL_CTYPE_SHORT:
case HB_WIN_DLL_CTYPE_SHORT_UNSIGNED:
case HB_WIN_DLL_CTYPE_INT:
hb_storni( ( int ) wcall.pArg[ tmp ].nValue, iFirst + tmp );
break;
case HB_WIN_DLL_CTYPE_LONG:
hb_stornl( ( long ) wcall.pArg[ tmp ].nValue, iFirst + tmp );
break;
case HB_WIN_DLL_CTYPE_INT_UNSIGNED:
case HB_WIN_DLL_CTYPE_LONG_UNSIGNED:
case HB_WIN_DLL_CTYPE_LLONG:
case HB_WIN_DLL_CTYPE_LLONG_UNSIGNED:
hb_stornint( wcall.pArg[ tmp ].nValue, iFirst + tmp );
break;
case HB_IT_DOUBLE:
hb_stornd( HB_GET_LE_DOUBLE( ( HB_BYTE * ) &wcall.pArg[ tmp ].nValue ), iFirst + tmp );
case HB_WIN_DLL_CTYPE_CHAR_UNSIGNED_PTR:
hb_storclen( ( const char * ) wcall.pArg[ tmp ].nValue, hb_parclen( iFirst + tmp ), iFirst + tmp );
break;
case HB_IT_STRING:
case HB_IT_MEMO:
case HB_WIN_DLL_CTYPE_CHAR_PTR:
if( bUNICODE )
hb_storstrlen_u16( HB_CDP_ENDIAN_NATIVE, ( const HB_WCHAR * ) wcall.pArg[ tmp ].nValue, hb_parclen( iFirst + tmp ), iFirst + tmp );
else
hb_storstrlen( hb_setGetOSCP(), ( const char * ) wcall.pArg[ tmp ].nValue, hb_parclen( iFirst + tmp ), iFirst + tmp );
break;
case HB_IT_POINTER:
case HB_WIN_DLL_CTYPE_INT_PTR:
case HB_WIN_DLL_CTYPE_SHORT_UNSIGNED_PTR:
case HB_WIN_DLL_CTYPE_INT_UNSIGNED_PTR:
case HB_WIN_DLL_CTYPE_STRUCTURE_PTR:
case HB_WIN_DLL_CTYPE_LONG_PTR:
case HB_WIN_DLL_CTYPE_LONG_UNSIGNED_PTR:
case HB_WIN_DLL_CTYPE_VOID_PTR:
case HB_WIN_DLL_CTYPE_BOOL_PTR:
case HB_WIN_DLL_CTYPE_FLOAT_PTR:
case HB_WIN_DLL_CTYPE_DOUBLE_PTR:
hb_storptr( ( void * ) wcall.pArg[ tmp ].nValue, iFirst + tmp );
break;
case HB_WIN_DLL_CTYPE_FLOAT:
case HB_WIN_DLL_CTYPE_DOUBLE:
hb_stornd( HB_GET_LE_DOUBLE( ( HB_BYTE * ) &wcall.pArg[ tmp ].nValue ), iFirst + tmp );
break;
default:
hb_stornint( wcall.pArg[ tmp ].nValue, iFirst + tmp );
}
}
}
@@ -632,6 +810,9 @@ void hbwin_dllCall( int iCallConv, int iRetType, HB_BOOL bUNICODE, FARPROC lpFun
if( wcall.pArg )
hb_xfree( wcall.pArg );
if( wcall.piArgType )
hb_xfree( wcall.piArgType );
}
else
hb_errRT_BASE( EG_ARG, 2010, "A maximum of 15 parameters is supported", HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS );
@@ -641,7 +822,8 @@ void hbwin_dllCall( int iCallConv, int iRetType, HB_BOOL bUNICODE, FARPROC lpFun
HB_WINCALL wcall;
wcall.bUNICODE = bUNICODE;
wcall.iFirst = iFirst - 1;
wcall.iFirst = iFirst - 1;
wcall.piArgTypeReq = piArgTypeReq;
iParams -= wcall.iFirst;
@@ -657,7 +839,7 @@ void hbwin_dllCall( int iCallConv, int iRetType, HB_BOOL bUNICODE, FARPROC lpFun
if( iRetType == HB_WIN_DLL_CTYPE_DOUBLE )
iRetTypeRaw = _RETTYPERAW_DOUBLE;
if( iRetType == HB_WIN_DLL_CTYPE_FLOAT )
else if( iRetType == HB_WIN_DLL_CTYPE_FLOAT )
iRetTypeRaw = _RETTYPERAW_FLOAT;
else
iRetTypeRaw = _RETTYPERAW_INT32;
@@ -665,22 +847,33 @@ void hbwin_dllCall( int iCallConv, int iRetType, HB_BOOL bUNICODE, FARPROC lpFun
if( iParams )
{
wcall.pArg = ( HB_WINARG * ) hb_xgrab( iParams * sizeof( HB_WINARG ) );
wcall.piArgType = ( int * ) hb_xgrab( iParams * sizeof( int ) );
memset( wcall.pArg, 0, iParams * sizeof( HB_WINARG ) );
}
else
{
wcall.pArg = NULL;
wcall.piArgType = NULL;
}
for( tmp = 0; tmp < iParams; ++tmp )
{
HB_U32 r1;
PHB_ITEM pParam = hb_param( iFirst + tmp, HB_IT_ANY );
HB_U32 r1 = 0;
HB_U32 r2;
HB_BOOL b64;
wcall.piArgType[ tmp ] = wcall.piArgTypeReq ? wcall.piArgTypeReq[ tmp ] : HB_WIN_DLL_CTYPE_DEFAULT;
if( wcall.piArgType[ tmp ] == HB_WIN_DLL_CTYPE_DEFAULT )
wcall.piArgType[ tmp ] = hb_hbtoctype( HB_ITEM_TYPE( pParam ) );
wcall.pArg[ tmp ].bByRef = HB_ISBYREF( iFirst + tmp );
hb_u32par( &wcall, tmp + 1, &r1, &r2, &b64 );
hb_u32par( pParam, &wcall, tmp + 1, &r1, &r2, &b64 );
/* TOFIX: Check proper order. */
/* TOFIX: Verify proper order. */
rawpar[ iParamsRaw++ ] = r1;
if( b64 )
rawpar[ iParamsRaw++ ] = r2;
@@ -989,8 +1182,6 @@ void hbwin_dllCall( int iCallConv, int iRetType, HB_BOOL bUNICODE, FARPROC lpFun
switch( iRetType )
{
/* TODO: Add 64-bit integer support */
case HB_WIN_DLL_CTYPE_VOID:
hb_ret();
break;
@@ -1019,9 +1210,17 @@ void hbwin_dllCall( int iCallConv, int iRetType, HB_BOOL bUNICODE, FARPROC lpFun
hb_retnint( ret.t.n32 );
break;
case HB_WIN_DLL_CTYPE_CHAR_PTR:
case HB_WIN_DLL_CTYPE_LLONG:
case HB_WIN_DLL_CTYPE_LLONG_UNSIGNED:
hb_retnint( ret.t.n64 );
break;
case HB_WIN_DLL_CTYPE_CHAR_UNSIGNED_PTR:
if( wcall.bUNICODE )
hb_retc( ( const char * ) ret.t.n32 );
break;
case HB_WIN_DLL_CTYPE_CHAR_PTR:
if( bUNICODE )
hb_retstr_u16( HB_CDP_ENDIAN_NATIVE, ( const HB_WCHAR * ) ret.t.n32 );
else
hb_retstr( hb_setGetOSCP(), ( const char * ) ret.t.n32 );
@@ -1034,6 +1233,7 @@ void hbwin_dllCall( int iCallConv, int iRetType, HB_BOOL bUNICODE, FARPROC lpFun
case HB_WIN_DLL_CTYPE_LONG_PTR:
case HB_WIN_DLL_CTYPE_LONG_UNSIGNED_PTR:
case HB_WIN_DLL_CTYPE_VOID_PTR:
case HB_WIN_DLL_CTYPE_BOOL_PTR:
case HB_WIN_DLL_CTYPE_FLOAT_PTR:
case HB_WIN_DLL_CTYPE_DOUBLE_PTR:
hb_retptr( ( void * ) ret.t.n32 );
@@ -1055,36 +1255,75 @@ void hbwin_dllCall( int iCallConv, int iRetType, HB_BOOL bUNICODE, FARPROC lpFun
{
if( wcall.pArg[ tmp ].bByRef )
{
switch( HB_ITEM_TYPE( hb_param( iFirst + tmp, HB_IT_ANY ) ) )
switch( wcall.piArgType[ tmp ] )
{
/* TODO: Add 64-bit integer support */
case HB_WIN_DLL_CTYPE_VOID:
hb_stor( iFirst + tmp );
break;
case HB_IT_LOGICAL:
case HB_WIN_DLL_CTYPE_BOOL:
hb_storl( wcall.pArg[ tmp ].value.t.n32 != 0, iFirst + tmp );
break;
case HB_IT_NIL:
case HB_IT_INTEGER:
case HB_IT_LONG:
case HB_IT_DATE:
hb_stornint( wcall.pArg[ tmp ].value.t.n32, iFirst + tmp );
case HB_WIN_DLL_CTYPE_CHAR:
case HB_WIN_DLL_CTYPE_CHAR_UNSIGNED:
hb_storni( wcall.pArg[ tmp ].value.t.n32 & 0xFF, iFirst + tmp );
break;
case HB_IT_DOUBLE:
hb_stornd( wcall.pArg[ tmp ].value.t.nDB, iFirst + tmp );
case HB_WIN_DLL_CTYPE_SHORT:
case HB_WIN_DLL_CTYPE_SHORT_UNSIGNED:
case HB_WIN_DLL_CTYPE_INT:
hb_storni( wcall.pArg[ tmp ].value.t.n32 & 0xFFFF, iFirst + tmp );
break;
case HB_IT_STRING:
case HB_IT_MEMO:
if( wcall.bUNICODE )
case HB_WIN_DLL_CTYPE_LONG:
hb_stornl( wcall.pArg[ tmp ].value.t.n32, iFirst + tmp );
break;
case HB_WIN_DLL_CTYPE_INT_UNSIGNED:
case HB_WIN_DLL_CTYPE_LONG_UNSIGNED:
hb_stornint( wcall.pArg[ tmp ].value.t.n32 & 0xFFFF, iFirst + tmp );
break;
case HB_WIN_DLL_CTYPE_LLONG:
case HB_WIN_DLL_CTYPE_LLONG_UNSIGNED:
hb_stornint( wcall.pArg[ tmp ].value.t.n64, iFirst + tmp );
break;
case HB_WIN_DLL_CTYPE_CHAR_UNSIGNED_PTR:
hb_storclen( ( const char * ) wcall.pArg[ tmp ].value.t.n32, hb_parclen( iFirst + tmp ), iFirst + tmp );
break;
case HB_WIN_DLL_CTYPE_CHAR_PTR:
if( bUNICODE )
hb_storstrlen_u16( HB_CDP_ENDIAN_NATIVE, ( const HB_WCHAR * ) wcall.pArg[ tmp ].value.t.n32, hb_parclen( iFirst + tmp ), iFirst + tmp );
else
hb_storstrlen( hb_setGetOSCP(), ( const char * ) wcall.pArg[ tmp ].value.t.n32, hb_parclen( iFirst + tmp ), iFirst + tmp );
break;
case HB_IT_POINTER:
case HB_WIN_DLL_CTYPE_INT_PTR:
case HB_WIN_DLL_CTYPE_SHORT_UNSIGNED_PTR:
case HB_WIN_DLL_CTYPE_INT_UNSIGNED_PTR:
case HB_WIN_DLL_CTYPE_STRUCTURE_PTR:
case HB_WIN_DLL_CTYPE_LONG_PTR:
case HB_WIN_DLL_CTYPE_LONG_UNSIGNED_PTR:
case HB_WIN_DLL_CTYPE_VOID_PTR:
case HB_WIN_DLL_CTYPE_BOOL_PTR:
case HB_WIN_DLL_CTYPE_FLOAT_PTR:
case HB_WIN_DLL_CTYPE_DOUBLE_PTR:
hb_storptr( ( void * ) wcall.pArg[ tmp ].value.t.n32, iFirst + tmp );
break;
case HB_WIN_DLL_CTYPE_FLOAT:
hb_stornd( wcall.pArg[ tmp ].value.t.nFL, iFirst + tmp );
break;
case HB_WIN_DLL_CTYPE_DOUBLE:
hb_stornd( wcall.pArg[ tmp ].value.t.nDB, iFirst + tmp );
break;
default:
hb_stornl( wcall.pArg[ tmp ].value.t.n32, iFirst + tmp );
}
}
}
@@ -1094,6 +1333,9 @@ void hbwin_dllCall( int iCallConv, int iRetType, HB_BOOL bUNICODE, FARPROC lpFun
if( wcall.pArg )
hb_xfree( wcall.pArg );
if( wcall.piArgType )
hb_xfree( wcall.piArgType );
}
else
hb_errRT_BASE( EG_ARG, 2010, "A maximum of 15 parameters is supported", HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS );
@@ -1157,10 +1399,23 @@ FARPROC hbwin_getprocaddress( HMODULE hDLL, int iParam, HB_BOOL * pbUNICODE )
return lpFunction;
}
HB_FUNC( GETPROCADDRESS )
{
HMODULE hDLL;
if( HB_ISNUM( 1 ) )
hDLL = ( HMODULE ) ( HB_PTRDIFF ) hb_parnint( 1 );
else
hDLL = ( HMODULE ) hb_parptr( 1 );
hb_retptr( hDLL ? ( void * ) hbwin_getprocaddress( hDLL, 2, NULL ) : NULL );
}
HB_FUNC( WIN_DLLCALL )
{
PHB_ITEM pParam = hb_param( 1, HB_IT_ARRAY );
int iFirst = 1;
int * piArgTypeReq = NULL;
int iCallConv = HB_WIN_DLL_CALLCONV_STDCALL;
int iRetType = HB_WIN_DLL_CTYPE_DEFAULT;
@@ -1178,9 +1433,20 @@ HB_FUNC( WIN_DLLCALL )
iRetType = hb_arrayGetNI( pParam, 2 );
if( nLen >= 3 && HB_IS_LOGICAL( hb_arrayGetItemPtr( pParam, 3 ) ) )
bUNICODE = hb_arrayGetL( pParam, 3 );
if( nLen >= 4 )
{
HB_SIZE nPos;
HB_SIZE nArgCount = hb_pcount() - iFirst;
/* TODO: Allow to specify parameter types, too */
piArgTypeReq = ( int * ) hb_xgrab( sizeof( int ) * nArgCount );
for( nPos = 0; nPos < nArgCount; ++nPos )
piArgTypeReq[ nPos ] = ( ( nPos + 4 ) <= nLen && HB_IS_NUMERIC( hb_arrayGetItemPtr( pParam, nPos + 4 ) ) ) ? hb_arrayGetNI( pParam, nPos + 4 ) : HB_WIN_DLL_CTYPE_DEFAULT;
}
}
hbwin_dllCall( iCallConv, iRetType, bUNICODE, ( FARPROC ) hb_parptr( iFirst ), hb_pcount(), iFirst + 1, NULL );
hbwin_dllCall( iCallConv, iRetType, bUNICODE, ( FARPROC ) hb_parptr( iFirst ), hb_pcount(), iFirst + 1, piArgTypeReq );
if( piArgTypeReq )
hb_xfree( piArgTypeReq );
}

View File

@@ -8,6 +8,6 @@ C_SOURCES := \
bmdbfcdx.c \
bmsixcdx.c
LIBNAME := hbbmcdx
LIBNAME := rddbmcdx
include $(TOP)$(ROOT)config/lib.mk

View File

@@ -134,166 +134,9 @@ static int hb_cdxPageRootSplit( LPCDXPAGE pPage );
/* free create index structur */
static void hb_cdxSortFree( LPCDXSORTINFO pSort );
static HB_BOOL hb_cdxPageReadTopKey( LPCDXPAGE pPage );
static HB_BOOL hb_cdxPageReadNextKey( LPCDXPAGE pPage );
static LPCDXTAG hb_cdxGetActiveTag( CDXAREAP pArea );
static void hb_cdxClearLogPosInfo( CDXAREAP pArea );
static HB_BOOL s_bTurbo = HB_FALSE;
static RDDFUNCS cdxSuper;
static const RDDFUNCS cdxTable =
{
/* Movement and positioning methods */
( DBENTRYP_BP ) hb_cdxBof,
( DBENTRYP_BP ) hb_cdxEof,
( DBENTRYP_BP ) hb_cdxFound,
( DBENTRYP_V ) hb_cdxGoBottom,
( DBENTRYP_UL ) hb_cdxGoTo,
( DBENTRYP_I ) hb_cdxGoToId,
( DBENTRYP_V ) hb_cdxGoTop,
( DBENTRYP_BIB ) hb_cdxSeek,
( DBENTRYP_L ) hb_cdxSkip,
( DBENTRYP_L ) hb_cdxSkipFilter,
( DBENTRYP_L ) hb_cdxSkipRaw,
/* Data management */
( DBENTRYP_VF ) hb_cdxAddField,
( DBENTRYP_B ) hb_cdxAppend,
( DBENTRYP_I ) hb_cdxCreateFields,
( DBENTRYP_V ) hb_cdxDeleteRec,
( DBENTRYP_BP ) hb_cdxDeleted,
( DBENTRYP_SP ) hb_cdxFieldCount,
( DBENTRYP_VF ) hb_cdxFieldDisplay,
( DBENTRYP_SSI ) hb_cdxFieldInfo,
( DBENTRYP_SCP ) hb_cdxFieldName,
( DBENTRYP_V ) hb_cdxFlush,
( DBENTRYP_PP ) hb_cdxGetRec,
( DBENTRYP_SI ) hb_cdxGetValue,
( DBENTRYP_SVL ) hb_cdxGetVarLen,
( DBENTRYP_V ) hb_cdxGoCold,
( DBENTRYP_V ) hb_cdxGoHot,
( DBENTRYP_P ) hb_cdxPutRec,
( DBENTRYP_SI ) hb_cdxPutValue,
( DBENTRYP_V ) hb_cdxRecall,
( DBENTRYP_ULP ) hb_cdxRecCount,
( DBENTRYP_ISI ) hb_cdxRecInfo,
( DBENTRYP_ULP ) hb_cdxRecNo,
( DBENTRYP_I ) hb_cdxRecId,
( DBENTRYP_S ) hb_cdxSetFieldExtent,
/* WorkArea/Database management */
( DBENTRYP_CP ) hb_cdxAlias,
( DBENTRYP_V ) hb_cdxClose,
( DBENTRYP_VO ) hb_cdxCreate,
( DBENTRYP_SI ) hb_cdxInfo,
( DBENTRYP_V ) hb_cdxNewArea,
( DBENTRYP_VO ) hb_cdxOpen,
( DBENTRYP_V ) hb_cdxRelease,
( DBENTRYP_SP ) hb_cdxStructSize,
( DBENTRYP_CP ) hb_cdxSysName,
( DBENTRYP_VEI ) hb_cdxEval,
( DBENTRYP_V ) hb_cdxPack,
( DBENTRYP_LSP ) hb_cdxPackRec,
( DBENTRYP_VS ) hb_cdxSort,
( DBENTRYP_VT ) hb_cdxTrans,
( DBENTRYP_VT ) hb_cdxTransRec,
( DBENTRYP_V ) hb_cdxZap,
/* Relational Methods */
( DBENTRYP_VR ) hb_cdxChildEnd,
( DBENTRYP_VR ) hb_cdxChildStart,
( DBENTRYP_VR ) hb_cdxChildSync,
( DBENTRYP_V ) hb_cdxSyncChildren,
( DBENTRYP_V ) hb_cdxClearRel,
( DBENTRYP_V ) hb_cdxForceRel,
( DBENTRYP_SSP ) hb_cdxRelArea,
( DBENTRYP_VR ) hb_cdxRelEval,
( DBENTRYP_SI ) hb_cdxRelText,
( DBENTRYP_VR ) hb_cdxSetRel,
/* Order Management */
( DBENTRYP_VOI ) hb_cdxOrderListAdd,
( DBENTRYP_V ) hb_cdxOrderListClear,
( DBENTRYP_VOI ) hb_cdxOrderListDelete,
( DBENTRYP_VOI ) hb_cdxOrderListFocus,
( DBENTRYP_V ) hb_cdxOrderListRebuild,
( DBENTRYP_VOO ) hb_cdxOrderCondition,
( DBENTRYP_VOC ) hb_cdxOrderCreate,
( DBENTRYP_VOI ) hb_cdxOrderDestroy,
( DBENTRYP_SVOI ) hb_cdxOrderInfo,
/* Filters and Scope Settings */
( DBENTRYP_V ) hb_cdxClearFilter,
( DBENTRYP_V ) hb_cdxClearLocate,
( DBENTRYP_V ) hb_cdxClearScope,
( DBENTRYP_VPLP ) hb_cdxCountScope,
( DBENTRYP_I ) hb_cdxFilterText,
( DBENTRYP_SI ) hb_cdxScopeInfo,
( DBENTRYP_VFI ) hb_cdxSetFilter,
( DBENTRYP_VLO ) hb_cdxSetLocate,
( DBENTRYP_VOS ) hb_cdxSetScope,
( DBENTRYP_VPL ) hb_cdxSkipScope,
( DBENTRYP_B ) hb_cdxLocate,
/* Miscellaneous */
( DBENTRYP_CC ) hb_cdxCompile,
( DBENTRYP_I ) hb_cdxError,
( DBENTRYP_I ) hb_cdxEvalBlock,
/* Network operations */
( DBENTRYP_VSP ) hb_cdxRawLock,
( DBENTRYP_VL ) hb_cdxLock,
( DBENTRYP_I ) hb_cdxUnLock,
/* Memofile functions */
( DBENTRYP_V ) hb_cdxCloseMemFile,
( DBENTRYP_VO ) hb_cdxCreateMemFile,
( DBENTRYP_SCCS ) hb_cdxGetValueFile,
( DBENTRYP_VO ) hb_cdxOpenMemFile,
( DBENTRYP_SCCS ) hb_cdxPutValueFile,
/* Database file header handling */
( DBENTRYP_V ) hb_cdxReadDBHeader,
( DBENTRYP_V ) hb_cdxWriteDBHeader,
/* non WorkArea functions */
( DBENTRYP_R ) hb_cdxInit,
( DBENTRYP_R ) hb_cdxExit,
( DBENTRYP_RVVL ) hb_cdxDrop,
( DBENTRYP_RVVL ) hb_cdxExists,
( DBENTRYP_RVVVL ) hb_cdxRename,
( DBENTRYP_RSLV ) hb_cdxRddInfo,
/* Special and reserved methods */
( DBENTRYP_SVP ) hb_cdxWhoCares
};
#ifdef HB_CDX_DSPDBG_INFO
static void hb_cdxDspTags( LPCDXINDEX pIndex )
@@ -1364,14 +1207,6 @@ static HB_BOOL hb_cdxIndexLockRead( LPCDXINDEX pIndex )
pIndex->RdLck = HB_TRUE;
#endif
if( s_bTurbo )
{
pIndex->lockRead++;
hb_cdxIndexCheckVersion( pIndex );
return HB_TRUE;
}
else
{
ret = hb_dbfLockIdxFile( pIndex->pFile, pIndex->pArea->dbfarea.bLockType,
FL_LOCK | FLX_SHARED | FLX_WAIT, &pIndex->ulLockPos );
if( !ret )
@@ -1383,8 +1218,6 @@ static HB_BOOL hb_cdxIndexLockRead( LPCDXINDEX pIndex )
hb_cdxIndexCheckVersion( pIndex );
}
return ret;
}
}
/*
@@ -1450,16 +1283,6 @@ static HB_BOOL hb_cdxIndexUnLockRead( LPCDXINDEX pIndex )
hb_cdxIndexPoolFree( pIndex, CDX_PAGECACHESIZE );
if( s_bTurbo )
{
#ifdef HB_CDX_DBGCODE
if( pIndex->pArea->dbfarea.fShared && pIndex->fShared &&
! HB_DIRTYREAD( &pIndex->pArea->dbfarea ) )
pIndex->RdLck = HB_FALSE;
#endif
}
else
{
if( pIndex->pArea->dbfarea.fShared && pIndex->fShared &&
!HB_DIRTYREAD( &pIndex->pArea->dbfarea ) )
{
@@ -1473,7 +1296,7 @@ static HB_BOOL hb_cdxIndexUnLockRead( LPCDXINDEX pIndex )
hb_errInternal( 9108, "hb_cdxIndexUnLockRead: unlock error.", NULL, NULL );
}
}
}
return HB_TRUE;
}
@@ -6947,8 +6770,7 @@ static HB_ERRCODE hb_cdxSeekWild( CDXAREAP pArea, HB_BOOL fSoftSeek, PHB_ITEM pK
HB_FUNC( BM_TURBO )
{
s_bTurbo = HB_ISLOG( 1 ) ? hb_parl( 1 ) : HB_FALSE;
hb_retl( s_bTurbo );
hb_retl( HB_FALSE );
}
HB_FUNC( BM_DBGETFILTERARRAY )
@@ -10481,11 +10303,157 @@ static void hb_cdxTagDoIndex( LPCDXTAG pTag, HB_BOOL fReindex )
hb_cdpSelect( cdpTmp );
}
#define __PRG_SOURCE__ __FILE__
#ifdef HB_PCODE_VER
#undef HB_PRG_PCODE_VER
#define HB_PRG_PCODE_VER HB_PCODE_VER
#endif
static const RDDFUNCS cdxTable =
{
/* Movement and positioning methods */
( DBENTRYP_BP ) hb_cdxBof,
( DBENTRYP_BP ) hb_cdxEof,
( DBENTRYP_BP ) hb_cdxFound,
( DBENTRYP_V ) hb_cdxGoBottom,
( DBENTRYP_UL ) hb_cdxGoTo,
( DBENTRYP_I ) hb_cdxGoToId,
( DBENTRYP_V ) hb_cdxGoTop,
( DBENTRYP_BIB ) hb_cdxSeek,
( DBENTRYP_L ) hb_cdxSkip,
( DBENTRYP_L ) hb_cdxSkipFilter,
( DBENTRYP_L ) hb_cdxSkipRaw,
/* Data management */
( DBENTRYP_VF ) hb_cdxAddField,
( DBENTRYP_B ) hb_cdxAppend,
( DBENTRYP_I ) hb_cdxCreateFields,
( DBENTRYP_V ) hb_cdxDeleteRec,
( DBENTRYP_BP ) hb_cdxDeleted,
( DBENTRYP_SP ) hb_cdxFieldCount,
( DBENTRYP_VF ) hb_cdxFieldDisplay,
( DBENTRYP_SSI ) hb_cdxFieldInfo,
( DBENTRYP_SCP ) hb_cdxFieldName,
( DBENTRYP_V ) hb_cdxFlush,
( DBENTRYP_PP ) hb_cdxGetRec,
( DBENTRYP_SI ) hb_cdxGetValue,
( DBENTRYP_SVL ) hb_cdxGetVarLen,
( DBENTRYP_V ) hb_cdxGoCold,
( DBENTRYP_V ) hb_cdxGoHot,
( DBENTRYP_P ) hb_cdxPutRec,
( DBENTRYP_SI ) hb_cdxPutValue,
( DBENTRYP_V ) hb_cdxRecall,
( DBENTRYP_ULP ) hb_cdxRecCount,
( DBENTRYP_ISI ) hb_cdxRecInfo,
( DBENTRYP_ULP ) hb_cdxRecNo,
( DBENTRYP_I ) hb_cdxRecId,
( DBENTRYP_S ) hb_cdxSetFieldExtent,
/* WorkArea/Database management */
( DBENTRYP_CP ) hb_cdxAlias,
( DBENTRYP_V ) hb_cdxClose,
( DBENTRYP_VO ) hb_cdxCreate,
( DBENTRYP_SI ) hb_cdxInfo,
( DBENTRYP_V ) hb_cdxNewArea,
( DBENTRYP_VO ) hb_cdxOpen,
( DBENTRYP_V ) hb_cdxRelease,
( DBENTRYP_SP ) hb_cdxStructSize,
( DBENTRYP_CP ) hb_cdxSysName,
( DBENTRYP_VEI ) hb_cdxEval,
( DBENTRYP_V ) hb_cdxPack,
( DBENTRYP_LSP ) hb_cdxPackRec,
( DBENTRYP_VS ) hb_cdxSort,
( DBENTRYP_VT ) hb_cdxTrans,
( DBENTRYP_VT ) hb_cdxTransRec,
( DBENTRYP_V ) hb_cdxZap,
/* Relational Methods */
( DBENTRYP_VR ) hb_cdxChildEnd,
( DBENTRYP_VR ) hb_cdxChildStart,
( DBENTRYP_VR ) hb_cdxChildSync,
( DBENTRYP_V ) hb_cdxSyncChildren,
( DBENTRYP_V ) hb_cdxClearRel,
( DBENTRYP_V ) hb_cdxForceRel,
( DBENTRYP_SSP ) hb_cdxRelArea,
( DBENTRYP_VR ) hb_cdxRelEval,
( DBENTRYP_SI ) hb_cdxRelText,
( DBENTRYP_VR ) hb_cdxSetRel,
/* Order Management */
( DBENTRYP_VOI ) hb_cdxOrderListAdd,
( DBENTRYP_V ) hb_cdxOrderListClear,
( DBENTRYP_VOI ) hb_cdxOrderListDelete,
( DBENTRYP_VOI ) hb_cdxOrderListFocus,
( DBENTRYP_V ) hb_cdxOrderListRebuild,
( DBENTRYP_VOO ) hb_cdxOrderCondition,
( DBENTRYP_VOC ) hb_cdxOrderCreate,
( DBENTRYP_VOI ) hb_cdxOrderDestroy,
( DBENTRYP_SVOI ) hb_cdxOrderInfo,
/* Filters and Scope Settings */
( DBENTRYP_V ) hb_cdxClearFilter,
( DBENTRYP_V ) hb_cdxClearLocate,
( DBENTRYP_V ) hb_cdxClearScope,
( DBENTRYP_VPLP ) hb_cdxCountScope,
( DBENTRYP_I ) hb_cdxFilterText,
( DBENTRYP_SI ) hb_cdxScopeInfo,
( DBENTRYP_VFI ) hb_cdxSetFilter,
( DBENTRYP_VLO ) hb_cdxSetLocate,
( DBENTRYP_VOS ) hb_cdxSetScope,
( DBENTRYP_VPL ) hb_cdxSkipScope,
( DBENTRYP_B ) hb_cdxLocate,
/* Miscellaneous */
( DBENTRYP_CC ) hb_cdxCompile,
( DBENTRYP_I ) hb_cdxError,
( DBENTRYP_I ) hb_cdxEvalBlock,
/* Network operations */
( DBENTRYP_VSP ) hb_cdxRawLock,
( DBENTRYP_VL ) hb_cdxLock,
( DBENTRYP_I ) hb_cdxUnLock,
/* Memofile functions */
( DBENTRYP_V ) hb_cdxCloseMemFile,
( DBENTRYP_VO ) hb_cdxCreateMemFile,
( DBENTRYP_SCCS ) hb_cdxGetValueFile,
( DBENTRYP_VO ) hb_cdxOpenMemFile,
( DBENTRYP_SCCS ) hb_cdxPutValueFile,
/* Database file header handling */
( DBENTRYP_V ) hb_cdxReadDBHeader,
( DBENTRYP_V ) hb_cdxWriteDBHeader,
/* non WorkArea functions */
( DBENTRYP_R ) hb_cdxInit,
( DBENTRYP_R ) hb_cdxExit,
( DBENTRYP_RVVL ) hb_cdxDrop,
( DBENTRYP_RVVL ) hb_cdxExists,
( DBENTRYP_RVVVL ) hb_cdxRename,
( DBENTRYP_RSLV ) hb_cdxRddInfo,
/* Special and reserved methods */
( DBENTRYP_SVP ) hb_cdxWhoCares
};
HB_FUNC_EXTERN( _DBF );

View File

@@ -183,8 +183,7 @@
typedef int HB_BOOL;
typedef signed char HB_SCHAR;
typedef unsigned char HB_UCHAR; /* QUESTION: HB_BYTE or HB_UCHAR? */
typedef unsigned char HB_BYTE; /* QUESTION: HB_BYTE or HB_UCHAR? */
typedef unsigned char HB_UCHAR;
typedef short HB_SHORT;
typedef unsigned short HB_USHORT;
typedef long HB_LONG; /* WARNING: These types have a new size in Harbour 2.1.x and upper. */
@@ -196,7 +195,10 @@ typedef long HB_ISIZ; /* TODO: Change to HB_SIZE, after
/* Guaranteed 8-bit types */
typedef HB_SCHAR HB_I8;
typedef HB_BYTE HB_U8;
typedef HB_UCHAR HB_U8;
/* Convenience */
typedef HB_UCHAR HB_BYTE;
#if ! defined( HB_LEGACY_TYPES_OFF )
#if ! defined( HB_DONT_DEFINE_BASIC_TYPES )
@@ -455,11 +457,13 @@ typedef HB_BYTE HB_U8;
#define HB_I64_MIN LONGLONG_MIN
#define HB_I64_MAX LONGLONG_MAX
#define HB_U64_MAX ULONGLONG_MAX
# if !defined( UINT64 )
typedef HB_U64 UINT64;
# endif
# if !defined( INT64 )
typedef HB_I64 INT64;
# if ! defined( HB_LEGACY_TYPES_OFF )
# if !defined( UINT64 )
typedef HB_U64 UINT64;
# endif
# if !defined( INT64 )
typedef HB_I64 INT64;
# endif
# endif
# if !defined( UINT64_MAX )
# define UINT64_MAX ULONGLONG_MAX

View File

@@ -8339,7 +8339,7 @@ STATIC PROCEDURE ShowHelp( lLong )
{ "-aflag=<f>" , I_( "pass flag to linker (static library)" ) },;
{ "-dflag=<f>" , I_( "pass flag to linker (dynamic library)" ) },;
{ "-runflag=<f>" , I_( "pass flag to output executable when -run option is used" ) },;
{ "-3rd=<f>" , I_( "options/flags reserved for 3rd party tools, always ignore by hbmk2 itself" ) },;
{ "-3rd=<f>" , I_( "options/flags reserved for 3rd party tools, always ignored by hbmk2 itself" ) },;
{ "-jobs=<n>" , I_( "start n compilation threads (multiprocess platforms only)" ) },;
{ "-inc" , I_( "enable incremental build mode" ) },;
{ "-[no]head[=<m>]" , I_( "control source header parsing (in incremental build mode)\n<m> can be: native (uses compiler to extract dependencies), full (uses simple text parser on the whole file), partial (default, uses simple text parser on 1st 16KB chunk of the file), off" ) },;