From b41aa9e90818e5c2ae0b496f014a19c4d2d7c43f Mon Sep 17 00:00:00 2001 From: Viktor Szakats Date: Fri, 12 Feb 2010 20:02:34 +0000 Subject: [PATCH] 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. --- harbour/ChangeLog | 43 ++ harbour/contrib/Makefile | 2 +- harbour/contrib/hbwin/hbwin.ch | 12 +- harbour/contrib/hbwin/hbwin.h | 2 +- harbour/contrib/hbwin/legacycd.c | 12 - harbour/contrib/hbwin/tests/testdll.prg | 13 +- harbour/contrib/hbwin/win_dll.c | 400 +++++++++++++++--- .../contrib/{hbbmcdx => rddbmcdx}/Makefile | 2 +- .../contrib/{hbbmcdx => rddbmcdx}/bmdbfcdx.c | 338 +++++++-------- .../contrib/{hbbmcdx => rddbmcdx}/bmsixcdx.c | 0 .../contrib/{hbbmcdx => rddbmcdx}/hbbmcdx.h | 0 .../contrib/{hbbmcdx => rddbmcdx}/hbbmcdx.hbc | 0 .../contrib/{hbbmcdx => rddbmcdx}/readme.txt | 0 harbour/include/hbdefs.h | 20 +- harbour/utils/hbmk2/hbmk2.prg | 2 +- 15 files changed, 561 insertions(+), 285 deletions(-) rename harbour/contrib/{hbbmcdx => rddbmcdx}/Makefile (84%) rename harbour/contrib/{hbbmcdx => rddbmcdx}/bmdbfcdx.c (99%) rename harbour/contrib/{hbbmcdx => rddbmcdx}/bmsixcdx.c (100%) rename harbour/contrib/{hbbmcdx => rddbmcdx}/hbbmcdx.h (100%) rename harbour/contrib/{hbbmcdx => rddbmcdx}/hbbmcdx.hbc (100%) rename harbour/contrib/{hbbmcdx => rddbmcdx}/readme.txt (100%) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 47c09b31d6..6dbdf12617 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -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 diff --git a/harbour/contrib/Makefile b/harbour/contrib/Makefile index 28981da562..00d5be88d0 100644 --- a/harbour/contrib/Makefile +++ b/harbour/contrib/Makefile @@ -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 \ diff --git a/harbour/contrib/hbwin/hbwin.ch b/harbour/contrib/hbwin/hbwin.ch index 7dafc3be7d..9d8a6f0eb6 100644 --- a/harbour/contrib/hbwin/hbwin.ch +++ b/harbour/contrib/hbwin/hbwin.ch @@ -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 diff --git a/harbour/contrib/hbwin/hbwin.h b/harbour/contrib/hbwin/hbwin.h index 373d4801b4..3b655099fd 100644 --- a/harbour/contrib/hbwin/hbwin.h +++ b/harbour/contrib/hbwin/hbwin.h @@ -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 ); diff --git a/harbour/contrib/hbwin/legacycd.c b/harbour/contrib/hbwin/legacycd.c index dc88cef5b5..a3f15888a5 100644 --- a/harbour/contrib/hbwin/legacycd.c +++ b/harbour/contrib/hbwin/legacycd.c @@ -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 diff --git a/harbour/contrib/hbwin/tests/testdll.prg b/harbour/contrib/hbwin/tests/testdll.prg index fbc7ead55c..fbe395ed78 100644 --- a/harbour/contrib/hbwin/tests/testdll.prg +++ b/harbour/contrib/hbwin/tests/testdll.prg @@ -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 ) diff --git a/harbour/contrib/hbwin/win_dll.c b/harbour/contrib/hbwin/win_dll.c index 7bf84890d7..40e6544bc0 100644 --- a/harbour/contrib/hbwin/win_dll.c +++ b/harbour/contrib/hbwin/win_dll.c @@ -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 * 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 ); } diff --git a/harbour/contrib/hbbmcdx/Makefile b/harbour/contrib/rddbmcdx/Makefile similarity index 84% rename from harbour/contrib/hbbmcdx/Makefile rename to harbour/contrib/rddbmcdx/Makefile index a9c711a0a5..c3d653fa0f 100644 --- a/harbour/contrib/hbbmcdx/Makefile +++ b/harbour/contrib/rddbmcdx/Makefile @@ -8,6 +8,6 @@ C_SOURCES := \ bmdbfcdx.c \ bmsixcdx.c -LIBNAME := hbbmcdx +LIBNAME := rddbmcdx include $(TOP)$(ROOT)config/lib.mk diff --git a/harbour/contrib/hbbmcdx/bmdbfcdx.c b/harbour/contrib/rddbmcdx/bmdbfcdx.c similarity index 99% rename from harbour/contrib/hbbmcdx/bmdbfcdx.c rename to harbour/contrib/rddbmcdx/bmdbfcdx.c index 5dbbf674b7..c24b44a6b5 100644 --- a/harbour/contrib/hbbmcdx/bmdbfcdx.c +++ b/harbour/contrib/rddbmcdx/bmdbfcdx.c @@ -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 ); diff --git a/harbour/contrib/hbbmcdx/bmsixcdx.c b/harbour/contrib/rddbmcdx/bmsixcdx.c similarity index 100% rename from harbour/contrib/hbbmcdx/bmsixcdx.c rename to harbour/contrib/rddbmcdx/bmsixcdx.c diff --git a/harbour/contrib/hbbmcdx/hbbmcdx.h b/harbour/contrib/rddbmcdx/hbbmcdx.h similarity index 100% rename from harbour/contrib/hbbmcdx/hbbmcdx.h rename to harbour/contrib/rddbmcdx/hbbmcdx.h diff --git a/harbour/contrib/hbbmcdx/hbbmcdx.hbc b/harbour/contrib/rddbmcdx/hbbmcdx.hbc similarity index 100% rename from harbour/contrib/hbbmcdx/hbbmcdx.hbc rename to harbour/contrib/rddbmcdx/hbbmcdx.hbc diff --git a/harbour/contrib/hbbmcdx/readme.txt b/harbour/contrib/rddbmcdx/readme.txt similarity index 100% rename from harbour/contrib/hbbmcdx/readme.txt rename to harbour/contrib/rddbmcdx/readme.txt diff --git a/harbour/include/hbdefs.h b/harbour/include/hbdefs.h index 4d170935dd..0b9871acf6 100644 --- a/harbour/include/hbdefs.h +++ b/harbour/include/hbdefs.h @@ -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 diff --git a/harbour/utils/hbmk2/hbmk2.prg b/harbour/utils/hbmk2/hbmk2.prg index 3c525cc74f..8edab6a20e 100644 --- a/harbour/utils/hbmk2/hbmk2.prg +++ b/harbour/utils/hbmk2/hbmk2.prg @@ -8339,7 +8339,7 @@ STATIC PROCEDURE ShowHelp( lLong ) { "-aflag=" , I_( "pass flag to linker (static library)" ) },; { "-dflag=" , I_( "pass flag to linker (dynamic library)" ) },; { "-runflag=" , I_( "pass flag to output executable when -run option is used" ) },; - { "-3rd=" , I_( "options/flags reserved for 3rd party tools, always ignore by hbmk2 itself" ) },; + { "-3rd=" , I_( "options/flags reserved for 3rd party tools, always ignored by hbmk2 itself" ) },; { "-jobs=" , I_( "start n compilation threads (multiprocess platforms only)" ) },; { "-inc" , I_( "enable incremental build mode" ) },; { "-[no]head[=]" , I_( "control source header parsing (in incremental build mode)\n 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" ) },;