Files
harbour-core/harbour/src/rtl/hbdyn.c
Viktor Szakats f1fdb9b02c 2010-07-16 00:25 UTC+0200 Viktor Szakats (harbour.01 syenar.hu)
* config/vxworks/diab.mk
    + Implemented support for Wind River Compiler.
      Incomplete yet, as I couldn't test each build
      feature due to errors in earlier build stages.

  * src/common/hbver.c
    + Added fourth version number level.
    + Added version detection for Wind River Compiler (diag).
    * Formatting.

  * src/common/hbprintf.c
  * external/minizip/ioapi.h
    + Fixes for Wind River Compiler (diag)

  * src/rtl/hbdyn.c
    ! Dirty fix to compile in HB_LONG_LONG_OFF mode.
      Przemek if you see this, can you take a look at it if 
      it's right or at least not terribly off?

  * include/hbsetup.h
    ! Temporary hack for Wind River Compiler to use
      HB_LONG_LONG_OFF, otherwise the compiler crashes with
      internal error in hvm.c (without hvmall and optimizations
      also). Now, this flag caused another slew of problems,
      so as it looks now support for this compiler cannot
      be added:
         "../../../hvm.c", line 9827: internal compiler error (etoa:1000): - Failed allocating register pair
         please contact support@windriver.com */

  * include/hbinit.h
    + Enabled Wind River compiler to use the GCC init mode.
      (didn't actually test it, but it compiles)

  * utils/hbmk2/hbmk2.prg
    + Added new debug switch -debugpars to get a list of
      input parameters processed by hbmk2.
    + Synced automatic HB_CCPOSTFIX configuration based on cpu
      setting with GNU Make logic.

  * config/vxworks/gcc.mk
    * Cleanups.
    + Added more CPU postfixes.

  * INSTALL
    * Minor convenience added to prev.
2010-07-15 22:32:24 +00:00

1165 lines
50 KiB
C

/*
* $Id$
*/
/*
* Harbour Project source code:
* Dynamic call support
*
* Copyright 2009-2010 Viktor Szakats (harbour.01 syenar.hu)
* www - http://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 "hbapi.h"
#include "hbapierr.h"
#include "hbapiitm.h"
#include "hbapistr.h"
#include "hbset.h"
#include "hbstack.h"
#include "hbdyn.ch"
#define _MASK_CTYPE 0x000FFFF
#define _MASK_ENCODING 0x00F0000
#define _MASK_CALLCONV 0x0F00000
#define _MASK_OPTIONS 0xF000000
/* C raw return types */
#define _RETTYPERAW_INT32 1
#define _RETTYPERAW_INT64 2
#define _RETTYPERAW_DOUBLE 3
#define _RETTYPERAW_FLOAT 4
#define _DYNEXEC_MAXPARAM 15
typedef void ( * PHB_DYNADDR )();
static int hb_hbtoctype( int iHarbourType )
{
switch( iHarbourType )
{
case HB_IT_NIL:
return HB_DYN_CTYPE_VOID;
case HB_IT_LOGICAL:
return HB_DYN_CTYPE_BOOL;
case HB_IT_INTEGER:
case HB_IT_LONG:
case HB_IT_DATE:
return HB_DYN_CTYPE_LONG;
case HB_IT_DOUBLE:
return HB_DYN_CTYPE_DOUBLE;
case HB_IT_STRING:
case HB_IT_MEMO:
return HB_DYN_CTYPE_CHAR_PTR;
case HB_IT_POINTER:
return HB_DYN_CTYPE_VOID_PTR;
}
return HB_DYN_CTYPE_DEFAULT;
}
#if defined( HB_ARCH_64BIT )
typedef struct
{
union
{
HB_U32 n32;
HB_U64 n64;
double nDB;
float nFL;
} t;
} HB_DYNVAL;
typedef struct
{
void * hString;
int iType;
int iEncoding;
int iOptions;
HB_BOOL bRawBuffer;
HB_BOOL bByRef;
HB_DYNVAL value;
} HB_DYNARG, * PHB_DYNARG;
static HB_U64 hb_u64par( PHB_ITEM pParam, PHB_DYNARG pArg )
{
HB_U64 r;
switch( pArg->iType )
{
case HB_DYN_CTYPE_BOOL:
pArg->value.t.n64 = hb_itemGetL( pParam );
r = pArg->bByRef ? ( HB_PTRUINT ) &pArg->value.t.n64 : pArg->value.t.n64;
break;
case HB_DYN_CTYPE_CHAR:
pArg->value.t.n64 = ( char ) hb_itemGetNI( pParam );
r = pArg->bByRef ? ( HB_PTRUINT ) &pArg->value.t.n64 : pArg->value.t.n64;
break;
case HB_DYN_CTYPE_CHAR_UNSIGNED:
pArg->value.t.n64 = ( unsigned char ) hb_itemGetNI( pParam );
r = pArg->bByRef ? ( HB_PTRUINT ) &pArg->value.t.n64 : pArg->value.t.n64;
break;
case HB_DYN_CTYPE_SHORT:
pArg->value.t.n64 = ( short ) hb_itemGetNI( pParam );
r = pArg->bByRef ? ( HB_PTRUINT ) &pArg->value.t.n64 : pArg->value.t.n64;
break;
case HB_DYN_CTYPE_SHORT_UNSIGNED:
pArg->value.t.n64 = ( unsigned short ) hb_itemGetNI( pParam );
r = pArg->bByRef ? ( HB_PTRUINT ) &pArg->value.t.n64 : pArg->value.t.n64;
break;
case HB_DYN_CTYPE_INT:
pArg->value.t.n64 = hb_itemGetNI( pParam );
r = pArg->bByRef ? ( HB_PTRUINT ) &pArg->value.t.n64 : pArg->value.t.n64;
break;
case HB_DYN_CTYPE_INT_UNSIGNED:
pArg->value.t.n64 = ( unsigned int ) hb_itemGetNInt( pParam );
r = pArg->bByRef ? ( HB_PTRUINT ) &pArg->value.t.n64 : pArg->value.t.n64;
break;
case HB_DYN_CTYPE_LONG:
pArg->value.t.n64 = hb_itemGetNL( pParam );
r = pArg->bByRef ? ( HB_PTRUINT ) &pArg->value.t.n64 : pArg->value.t.n64;
break;
case HB_DYN_CTYPE_LONG_UNSIGNED:
pArg->value.t.n64 = ( unsigned long ) hb_itemGetNInt( pParam );
r = pArg->bByRef ? ( HB_PTRUINT ) &pArg->value.t.n64 : pArg->value.t.n64;
break;
case HB_DYN_CTYPE_LLONG:
pArg->value.t.n64 = hb_itemGetNInt( pParam );
r = pArg->bByRef ? ( HB_PTRUINT ) &pArg->value.t.n64 : pArg->value.t.n64;
break;
case HB_DYN_CTYPE_LLONG_UNSIGNED:
/* TOFIX: Digits are lost. */
#if HB_VMLONG_MAX == INT32_MAX || defined( HB_LONG_LONG_OFF )
pArg->value.t.n64 = ( HB_MAXUINT ) hb_itemGetNInt( pParam );
#else
pArg->value.t.n64 = ( HB_ULONGLONG ) hb_itemGetNInt( pParam );
#endif
r = pArg->bByRef ? ( HB_PTRUINT ) &pArg->value.t.n64 : pArg->value.t.n64;
break;
case HB_DYN_CTYPE_FLOAT:
/* TOFIX */
case HB_DYN_CTYPE_DOUBLE:
HB_PUT_LE_DOUBLE( ( HB_BYTE * ) &pArg->value.t.n64, hb_itemGetND( pParam ) );
r = pArg->bByRef ? ( HB_PTRUINT ) &pArg->value.t.n64 : pArg->value.t.n64;
break;
case HB_DYN_CTYPE_CHAR_UNSIGNED_PTR:
case HB_DYN_CTYPE_STRUCTURE:
{
HB_SIZE nLen = hb_itemGetCLen( pParam );
pArg->hString = hb_xgrab( nLen + sizeof( char ) );
pArg->bRawBuffer = HB_TRUE;
memcpy( ( char * ) pArg->hString, hb_itemGetCPtr( pParam ), nLen );
( ( char * ) pArg->hString )[ nLen ] = '\0';
r = ( HB_PTRUINT ) pArg->hString;
pArg->value.t.n64 = r;
break;
}
case HB_DYN_CTYPE_CHAR_PTR:
switch( pArg->iEncoding )
{
case HB_DYN_ENC_ASCII:
{
HB_SIZE nLen;
const char * s = hb_itemGetStr( pParam, hb_setGetOSCP(), &pArg->hString, &nLen );
r = ( HB_PTRUINT ) hb_strunshare( &pArg->hString, s, nLen );
break;
}
case HB_DYN_ENC_UTF8:
{
HB_SIZE nLen;
const char * s = hb_itemGetStrUTF8( pParam, &pArg->hString, &nLen );
r = ( HB_PTRUINT ) hb_strunshare( &pArg->hString, s, nLen );
break;
}
case HB_DYN_ENC_UTF16:
{
HB_SIZE nLen;
const HB_WCHAR * s = hb_itemGetStrU16( pParam, HB_CDP_ENDIAN_NATIVE, &pArg->hString, &nLen );
r = ( HB_PTRUINT ) hb_wstrunshare( &pArg->hString, s, nLen );
break;
}
default:
{
HB_SIZE nLen = hb_itemGetCLen( pParam );
pArg->hString = hb_xgrab( nLen + sizeof( char ) );
pArg->bRawBuffer = HB_TRUE;
memcpy( ( char * ) pArg->hString, hb_itemGetCPtr( pParam ), nLen );
( ( char * ) pArg->hString )[ nLen ] = '\0';
r = ( HB_PTRUINT ) pArg->hString;
break;
}
}
pArg->value.t.n64 = r;
break;
case HB_DYN_CTYPE_VOID_PTR:
case HB_DYN_CTYPE_BOOL_PTR:
case HB_DYN_CTYPE_SHORT_PTR:
case HB_DYN_CTYPE_SHORT_UNSIGNED_PTR:
case HB_DYN_CTYPE_INT_PTR:
case HB_DYN_CTYPE_INT_UNSIGNED_PTR:
case HB_DYN_CTYPE_LONG_PTR:
case HB_DYN_CTYPE_LONG_UNSIGNED_PTR:
case HB_DYN_CTYPE_LLONG_PTR:
case HB_DYN_CTYPE_LLONG_UNSIGNED_PTR:
case HB_DYN_CTYPE_FLOAT_PTR:
case HB_DYN_CTYPE_DOUBLE_PTR:
case HB_DYN_CTYPE_STRUCTURE_PTR:
pArg->value.t.n64 = ( HB_PTRUINT ) hb_itemGetPtr( pParam );
r = pArg->bByRef ? ( HB_PTRUINT ) &pArg->value.t.n64 : pArg->value.t.n64;
break;
case HB_DYN_CTYPE_VOID:
default:
r = pArg->value.t.n64 = 0;
}
return r;
}
static PHB_ITEM hb_u64ret( PHB_ITEM pItem, int iRetType, int iEncoding, HB_DYNVAL value, HB_ISIZ nLen )
{
switch( iRetType )
{
case HB_DYN_CTYPE_VOID:
hb_itemClear( pItem );
break;
case HB_DYN_CTYPE_BOOL:
hb_itemPutL( pItem, value.t.n64 != 0 );
break;
case HB_DYN_CTYPE_CHAR:
hb_itemPutNI( pItem, ( char ) value.t.n64 );
break;
case HB_DYN_CTYPE_CHAR_UNSIGNED:
hb_itemPutNI( pItem, ( unsigned char ) value.t.n64 );
break;
case HB_DYN_CTYPE_SHORT:
hb_itemPutNI( pItem, ( short ) value.t.n64 );
break;
case HB_DYN_CTYPE_SHORT_UNSIGNED:
hb_itemPutNI( pItem, ( unsigned short ) value.t.n64 );
break;
case HB_DYN_CTYPE_INT:
hb_itemPutNI( pItem, ( int ) value.t.n64 );
break;
case HB_DYN_CTYPE_INT_UNSIGNED:
hb_itemPutNInt( pItem, ( unsigned int ) value.t.n64 );
break;
case HB_DYN_CTYPE_LONG:
hb_itemPutNL( pItem, ( long ) value.t.n64 );
break;
case HB_DYN_CTYPE_LONG_UNSIGNED:
hb_itemPutNInt( pItem, ( unsigned long ) value.t.n64 );
break;
case HB_DYN_CTYPE_LLONG:
#if HB_VMLONG_MAX == INT32_MAX || defined( HB_LONG_LONG_OFF )
hb_itemPutNInt( pItem, ( HB_MAXINT ) value.t.n64 );
#else
hb_itemPutNInt( pItem, ( HB_LONGLONG ) value.t.n64 );
#endif
break;
case HB_DYN_CTYPE_LLONG_UNSIGNED:
#if HB_VMLONG_MAX == INT32_MAX || defined( HB_LONG_LONG_OFF )
hb_itemPutNInt( pItem, ( HB_MAXUINT ) value.t.n64 );
#else
hb_itemPutNInt( pItem, ( HB_ULONGLONG ) value.t.n64 );
#endif
break;
case HB_DYN_CTYPE_CHAR_UNSIGNED_PTR:
if( nLen == -1 )
hb_itemPutC( pItem, ( const char * ) value.t.n64 );
else
hb_itemPutCL( pItem, ( const char * ) value.t.n64, nLen );
break;
case HB_DYN_CTYPE_CHAR_PTR:
switch( iEncoding )
{
case HB_DYN_ENC_ASCII:
if( nLen == -1 )
hb_itemPutStr( pItem, hb_setGetOSCP(), ( const char * ) value.t.n64 );
else
hb_itemPutStrLen( pItem, hb_setGetOSCP(), ( const char * ) value.t.n64, nLen );
break;
case HB_DYN_ENC_UTF8:
if( nLen == -1 )
hb_itemPutStrUTF8( pItem, ( const char * ) value.t.n64 );
else
hb_itemPutStrLenUTF8( pItem, ( const char * ) value.t.n64, nLen );
break;
case HB_DYN_ENC_UTF16:
if( nLen == -1 )
hb_itemPutStrU16( pItem, HB_CDP_ENDIAN_NATIVE, ( const HB_WCHAR * ) value.t.n64 );
else
hb_itemPutStrLenU16( pItem, HB_CDP_ENDIAN_NATIVE, ( const HB_WCHAR * ) value.t.n64, nLen );
break;
default:
if( nLen == -1 )
hb_itemPutC( pItem, ( const char * ) value.t.n64 );
else
hb_itemPutCL( pItem, ( const char * ) value.t.n64, nLen );
}
break;
case HB_DYN_CTYPE_VOID_PTR:
case HB_DYN_CTYPE_BOOL_PTR:
case HB_DYN_CTYPE_SHORT_PTR:
case HB_DYN_CTYPE_SHORT_UNSIGNED_PTR:
case HB_DYN_CTYPE_INT_PTR:
case HB_DYN_CTYPE_INT_UNSIGNED_PTR:
case HB_DYN_CTYPE_LONG_PTR:
case HB_DYN_CTYPE_LONG_UNSIGNED_PTR:
case HB_DYN_CTYPE_LLONG_PTR:
case HB_DYN_CTYPE_LLONG_UNSIGNED_PTR:
case HB_DYN_CTYPE_FLOAT_PTR:
case HB_DYN_CTYPE_DOUBLE_PTR:
case HB_DYN_CTYPE_STRUCTURE_PTR:
hb_itemPutPtr( pItem, ( void * ) value.t.n64 );
break;
case HB_DYN_CTYPE_FLOAT:
hb_itemPutND( pItem, value.t.nFL );
break;
case HB_DYN_CTYPE_DOUBLE:
hb_itemPutND( pItem, value.t.nDB );
break;
default:
hb_itemPutNInt( pItem, value.t.n64 );
}
return pItem;
}
#define HB_DYN_CTYPE_DECL( _ret_, _type_ ) \
typedef _ret_ ( * _type_##P00 ) ( void ); \
typedef _ret_ ( * _type_##P01 ) ( HB_U64 ); \
typedef _ret_ ( * _type_##P02 ) ( HB_U64, HB_U64 ); \
typedef _ret_ ( * _type_##P03 ) ( HB_U64, HB_U64, HB_U64 ); \
typedef _ret_ ( * _type_##P04 ) ( HB_U64, HB_U64, HB_U64, HB_U64 ); \
typedef _ret_ ( * _type_##P05 ) ( HB_U64, HB_U64, HB_U64, HB_U64, HB_U64 ); \
typedef _ret_ ( * _type_##P06 ) ( HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64 ); \
typedef _ret_ ( * _type_##P07 ) ( HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64 ); \
typedef _ret_ ( * _type_##P08 ) ( HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64 ); \
typedef _ret_ ( * _type_##P09 ) ( HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64 ); \
typedef _ret_ ( * _type_##P10 ) ( HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64 ); \
typedef _ret_ ( * _type_##P11 ) ( HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64 ); \
typedef _ret_ ( * _type_##P12 ) ( HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64 ); \
typedef _ret_ ( * _type_##P13 ) ( HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64 ); \
typedef _ret_ ( * _type_##P14 ) ( HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64 ); \
typedef _ret_ ( * _type_##P15 ) ( HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64, HB_U64 )
#define HB_DYN_FUN_CALL( pcount, _ret_, _type_ ) \
do switch( pcount ) \
{ \
case 0: ret.t._ret_ = ( ( _type_##P00 ) *pFunction )(); break; \
case 1: ret.t._ret_ = ( ( _type_##P01 ) *pFunction )( rawpar[ 0 ] ); break; \
case 2: ret.t._ret_ = ( ( _type_##P02 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ] ); break; \
case 3: ret.t._ret_ = ( ( _type_##P03 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ], rawpar[ 2 ] ); break; \
case 4: ret.t._ret_ = ( ( _type_##P04 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ], rawpar[ 2 ], rawpar[ 3 ] ); break; \
case 5: ret.t._ret_ = ( ( _type_##P05 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ], rawpar[ 2 ], rawpar[ 3 ], rawpar[ 4 ] ); break; \
case 6: ret.t._ret_ = ( ( _type_##P06 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ], rawpar[ 2 ], rawpar[ 3 ], rawpar[ 4 ], rawpar[ 5 ] ); break; \
case 7: ret.t._ret_ = ( ( _type_##P07 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ], rawpar[ 2 ], rawpar[ 3 ], rawpar[ 4 ], rawpar[ 5 ], rawpar[ 6 ] ); break; \
case 8: ret.t._ret_ = ( ( _type_##P08 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ], rawpar[ 2 ], rawpar[ 3 ], rawpar[ 4 ], rawpar[ 5 ], rawpar[ 6 ], rawpar[ 7 ] ); break; \
case 9: ret.t._ret_ = ( ( _type_##P09 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ], rawpar[ 2 ], rawpar[ 3 ], rawpar[ 4 ], rawpar[ 5 ], rawpar[ 6 ], rawpar[ 7 ], rawpar[ 8 ] ); break; \
case 10: ret.t._ret_ = ( ( _type_##P10 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ], rawpar[ 2 ], rawpar[ 3 ], rawpar[ 4 ], rawpar[ 5 ], rawpar[ 6 ], rawpar[ 7 ], rawpar[ 8 ], rawpar[ 9 ] ); break; \
case 11: ret.t._ret_ = ( ( _type_##P11 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ], rawpar[ 2 ], rawpar[ 3 ], rawpar[ 4 ], rawpar[ 5 ], rawpar[ 6 ], rawpar[ 7 ], rawpar[ 8 ], rawpar[ 9 ], rawpar[ 10 ] ); break; \
case 12: ret.t._ret_ = ( ( _type_##P12 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ], rawpar[ 2 ], rawpar[ 3 ], rawpar[ 4 ], rawpar[ 5 ], rawpar[ 6 ], rawpar[ 7 ], rawpar[ 8 ], rawpar[ 9 ], rawpar[ 10 ], rawpar[ 11 ] ); break; \
case 13: ret.t._ret_ = ( ( _type_##P13 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ], rawpar[ 2 ], rawpar[ 3 ], rawpar[ 4 ], rawpar[ 5 ], rawpar[ 6 ], rawpar[ 7 ], rawpar[ 8 ], rawpar[ 9 ], rawpar[ 10 ], rawpar[ 11 ], rawpar[ 12 ] ); break; \
case 14: ret.t._ret_ = ( ( _type_##P14 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ], rawpar[ 2 ], rawpar[ 3 ], rawpar[ 4 ], rawpar[ 5 ], rawpar[ 6 ], rawpar[ 7 ], rawpar[ 8 ], rawpar[ 9 ], rawpar[ 10 ], rawpar[ 11 ], rawpar[ 12 ], rawpar[ 13 ] ); break; \
case 15: ret.t._ret_ = ( ( _type_##P15 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ], rawpar[ 2 ], rawpar[ 3 ], rawpar[ 4 ], rawpar[ 5 ], rawpar[ 6 ], rawpar[ 7 ], rawpar[ 8 ], rawpar[ 9 ], rawpar[ 10 ], rawpar[ 11 ], rawpar[ 12 ], rawpar[ 13 ], rawpar[ 14 ] ); break; \
} while( 0 )
HB_DYN_CTYPE_DECL( HB_U64, FX64_64 );
HB_DYN_CTYPE_DECL( double, FX64_DB );
HB_DYN_CTYPE_DECL( float, FX64_FL );
#elif defined( HB_ARCH_32BIT )
typedef struct
{
union
{
HB_U32 n32;
#if !defined( HB_LONG_LONG_OFF )
HB_U64 n64;
#endif
double nDB;
float nFL;
} t;
} HB_DYNVAL;
typedef struct
{
void * hString;
int iType;
int iEncoding;
int iOptions;
HB_BOOL bRawBuffer;
HB_BOOL bByRef;
HB_DYNVAL value;
} HB_DYNARG, * PHB_DYNARG;
static void hb_u32par( PHB_ITEM pParam, PHB_DYNARG pArg, HB_U32 * r1, HB_U32 * r2, HB_BOOL * b64 )
{
*b64 = HB_FALSE;
switch( pArg->iType )
{
case HB_DYN_CTYPE_BOOL:
pArg->value.t.n32 = hb_itemGetL( pParam );
*r1 = pArg->bByRef ? ( HB_U32 ) &pArg->value.t.n32 : pArg->value.t.n32;
break;
case HB_DYN_CTYPE_CHAR:
pArg->value.t.n32 = ( char ) hb_itemGetNI( pParam );
*r1 = pArg->bByRef ? ( HB_U32 ) &pArg->value.t.n32 : pArg->value.t.n32;
break;
case HB_DYN_CTYPE_CHAR_UNSIGNED:
pArg->value.t.n32 = ( unsigned char ) hb_itemGetNI( pParam );
*r1 = pArg->bByRef ? ( HB_U32 ) &pArg->value.t.n32 : pArg->value.t.n32;
break;
case HB_DYN_CTYPE_SHORT:
pArg->value.t.n32 = ( short ) hb_itemGetNI( pParam );
*r1 = pArg->bByRef ? ( HB_U32 ) &pArg->value.t.n32 : pArg->value.t.n32;
break;
case HB_DYN_CTYPE_SHORT_UNSIGNED:
pArg->value.t.n32 = ( unsigned short ) hb_itemGetNI( pParam );
*r1 = pArg->bByRef ? ( HB_U32 ) &pArg->value.t.n32 : pArg->value.t.n32;
break;
case HB_DYN_CTYPE_INT:
pArg->value.t.n32 = hb_itemGetNI( pParam );
*r1 = pArg->bByRef ? ( HB_U32 ) &pArg->value.t.n32 : pArg->value.t.n32;
break;
case HB_DYN_CTYPE_INT_UNSIGNED:
pArg->value.t.n32 = ( unsigned int ) hb_itemGetNInt( pParam );
*r1 = pArg->bByRef ? ( HB_U32 ) &pArg->value.t.n32 : pArg->value.t.n32;
break;
case HB_DYN_CTYPE_LONG:
pArg->value.t.n32 = hb_itemGetNL( pParam );
*r1 = pArg->bByRef ? ( HB_U32 ) &pArg->value.t.n32 : pArg->value.t.n32;
break;
case HB_DYN_CTYPE_LONG_UNSIGNED:
pArg->value.t.n32 = ( unsigned long ) hb_itemGetNInt( pParam );
*r1 = pArg->bByRef ? ( HB_U32 ) &pArg->value.t.n32 : pArg->value.t.n32;
break;
case HB_DYN_CTYPE_LLONG:
#if !defined( HB_LONG_LONG_OFF )
pArg->value.t.n64 = hb_itemGetNInt( pParam );
if( pArg->bByRef )
*r1 = ( HB_U32 ) &pArg->value.t.n64;
else
{
*r1 = pArg->value.t.n64 & 0xFFFFFFFF;
*r2 = ( pArg->value.t.n64 >> 32 );
*b64 = HB_TRUE;
}
#endif
break;
case HB_DYN_CTYPE_LLONG_UNSIGNED:
#if !defined( HB_LONG_LONG_OFF )
/* TOFIX: Digits are lost. */
#if HB_VMLONG_MAX == INT32_MAX || defined( HB_LONG_LONG_OFF )
pArg->value.t.n64 = ( HB_MAXUINT ) hb_itemGetNInt( pParam );
#else
pArg->value.t.n64 = ( HB_ULONGLONG ) hb_itemGetNInt( pParam );
#endif
if( pArg->bByRef )
*r1 = ( HB_U32 ) &pArg->value.t.n64;
else
{
*r1 = pArg->value.t.n64 & 0xFFFFFFFF;
*r2 = ( pArg->value.t.n64 >> 32 );
*b64 = HB_TRUE;
}
#endif
break;
case HB_DYN_CTYPE_FLOAT:
pArg->value.t.nFL = ( float ) hb_itemGetND( pParam );
*r1 = pArg->bByRef ? ( HB_U32 ) &pArg->value.t.nFL : pArg->value.t.n32;
break;
case HB_DYN_CTYPE_DOUBLE:
pArg->value.t.nDB = hb_itemGetND( pParam );
if( pArg->bByRef )
*r1 = ( HB_U32 ) &pArg->value.t.nDB;
else
{
#if !defined( HB_LONG_LONG_OFF )
*r1 = pArg->value.t.n64 & 0xFFFFFFFF;
*r2 = ( pArg->value.t.n64 >> 32 );
*b64 = HB_TRUE;
#endif
}
break;
case HB_DYN_CTYPE_CHAR_UNSIGNED_PTR:
case HB_DYN_CTYPE_STRUCTURE:
{
HB_SIZE nLen = hb_itemGetCLen( pParam );
pArg->hString = hb_xgrab( nLen + sizeof( char ) );
pArg->bRawBuffer = HB_TRUE;
memcpy( ( char * ) pArg->hString, hb_itemGetCPtr( pParam ), nLen );
( ( char * ) pArg->hString )[ nLen ] = '\0';
*r1 = ( HB_PTRUINT ) pArg->hString;
pArg->value.t.n32 = *r1;
break;
}
case HB_DYN_CTYPE_CHAR_PTR:
switch( pArg->iEncoding )
{
case HB_DYN_ENC_ASCII:
{
HB_SIZE nLen;
const char * s = hb_itemGetStr( pParam, hb_setGetOSCP(), &pArg->hString, &nLen );
*r1 = ( HB_U32 ) hb_strunshare( &pArg->hString, s, nLen );
break;
}
case HB_DYN_ENC_UTF8:
{
HB_SIZE nLen;
const char * s = hb_itemGetStrUTF8( pParam, &pArg->hString, &nLen );
*r1 = ( HB_U32 ) hb_strunshare( &pArg->hString, s, nLen );
break;
}
case HB_DYN_ENC_UTF16:
{
HB_SIZE nLen;
const HB_WCHAR * s = hb_itemGetStrU16( pParam, HB_CDP_ENDIAN_NATIVE, &pArg->hString, &nLen );
*r1 = ( HB_U32 ) hb_wstrunshare( &pArg->hString, s, nLen );
break;
}
default:
{
HB_SIZE nLen = hb_itemGetCLen( pParam );
pArg->hString = hb_xgrab( nLen + sizeof( char ) );
pArg->bRawBuffer = HB_TRUE;
memcpy( ( char * ) pArg->hString, hb_itemGetCPtr( pParam ), nLen );
( ( char * ) pArg->hString )[ nLen ] = '\0';
*r1 = ( HB_PTRUINT ) pArg->hString;
break;
}
}
pArg->value.t.n32 = *r1;
break;
case HB_DYN_CTYPE_VOID_PTR:
case HB_DYN_CTYPE_BOOL_PTR:
case HB_DYN_CTYPE_SHORT_PTR:
case HB_DYN_CTYPE_SHORT_UNSIGNED_PTR:
case HB_DYN_CTYPE_INT_PTR:
case HB_DYN_CTYPE_INT_UNSIGNED_PTR:
case HB_DYN_CTYPE_LONG_PTR:
case HB_DYN_CTYPE_LONG_UNSIGNED_PTR:
case HB_DYN_CTYPE_LLONG_PTR:
case HB_DYN_CTYPE_LLONG_UNSIGNED_PTR:
case HB_DYN_CTYPE_FLOAT_PTR:
case HB_DYN_CTYPE_DOUBLE_PTR:
case HB_DYN_CTYPE_STRUCTURE_PTR:
pArg->value.t.n32 = ( HB_U32 ) hb_itemGetPtr( pParam );
*r1 = pArg->bByRef ? ( HB_U32 ) &pArg->value.t.n32 : pArg->value.t.n32;
break;
case HB_DYN_CTYPE_VOID:
default:
*r1 = pArg->value.t.n32 = 0;
}
}
static PHB_ITEM hb_u32ret( PHB_ITEM pItem, int iRetType, int iEncoding, HB_DYNVAL value, HB_ISIZ nLen )
{
switch( iRetType )
{
case HB_DYN_CTYPE_VOID:
hb_itemClear( pItem );
break;
case HB_DYN_CTYPE_BOOL:
hb_itemPutL( pItem, value.t.n32 != 0 );
break;
case HB_DYN_CTYPE_CHAR:
hb_itemPutNI( pItem, ( char ) value.t.n32 );
break;
case HB_DYN_CTYPE_CHAR_UNSIGNED:
hb_itemPutNI( pItem, ( unsigned char ) value.t.n32 );
break;
case HB_DYN_CTYPE_SHORT:
hb_itemPutNI( pItem, ( short ) value.t.n32 );
break;
case HB_DYN_CTYPE_SHORT_UNSIGNED:
hb_itemPutNI( pItem, ( unsigned short ) value.t.n32 );
break;
case HB_DYN_CTYPE_INT:
hb_itemPutNI( pItem, ( int ) value.t.n32 );
break;
case HB_DYN_CTYPE_INT_UNSIGNED:
hb_itemPutNInt( pItem, ( unsigned int ) value.t.n32 );
break;
case HB_DYN_CTYPE_LONG:
hb_itemPutNL( pItem, ( long ) value.t.n32 );
break;
case HB_DYN_CTYPE_LONG_UNSIGNED:
hb_itemPutNInt( pItem, value.t.n32 );
break;
case HB_DYN_CTYPE_LLONG:
#if !defined( HB_LONG_LONG_OFF )
#if HB_VMLONG_MAX == INT32_MAX || defined( HB_LONG_LONG_OFF )
hb_itemPutNInt( pItem, ( HB_MAXINT ) value.t.n64 );
#else
hb_itemPutNInt( pItem, ( HB_LONGLONG ) value.t.n64 );
#endif
#endif
break;
case HB_DYN_CTYPE_LLONG_UNSIGNED:
#if !defined( HB_LONG_LONG_OFF )
#if HB_VMLONG_MAX == INT32_MAX || defined( HB_LONG_LONG_OFF )
hb_itemPutNInt( pItem, ( HB_MAXUINT ) value.t.n64 );
#else
hb_itemPutNInt( pItem, ( HB_ULONGLONG ) value.t.n64 );
#endif
#endif
break;
case HB_DYN_CTYPE_CHAR_UNSIGNED_PTR:
if( nLen == -1 )
hb_itemPutC( pItem, ( const char * ) value.t.n32 );
else
hb_itemPutCL( pItem, ( const char * ) value.t.n32, nLen );
break;
case HB_DYN_CTYPE_CHAR_PTR:
switch( iEncoding )
{
case HB_DYN_ENC_ASCII:
if( nLen == -1 )
hb_itemPutStr( pItem, hb_setGetOSCP(), ( const char * ) value.t.n32 );
else
hb_itemPutStrLen( pItem, hb_setGetOSCP(), ( const char * ) value.t.n32, nLen );
break;
case HB_DYN_ENC_UTF8:
if( nLen == -1 )
hb_itemPutStrUTF8( pItem, ( const char * ) value.t.n32 );
else
hb_itemPutStrLenUTF8( pItem, ( const char * ) value.t.n32, nLen );
break;
case HB_DYN_ENC_UTF16:
if( nLen == -1 )
hb_itemPutStrU16( pItem, HB_CDP_ENDIAN_NATIVE, ( const HB_WCHAR * ) value.t.n32 );
else
hb_itemPutStrLenU16( pItem, HB_CDP_ENDIAN_NATIVE, ( const HB_WCHAR * ) value.t.n32, nLen );
break;
default:
if( nLen == -1 )
hb_itemPutC( pItem, ( const char * ) value.t.n32 );
else
hb_itemPutCL( pItem, ( const char * ) value.t.n32, nLen );
}
break;
case HB_DYN_CTYPE_VOID_PTR:
case HB_DYN_CTYPE_BOOL_PTR:
case HB_DYN_CTYPE_SHORT_PTR:
case HB_DYN_CTYPE_SHORT_UNSIGNED_PTR:
case HB_DYN_CTYPE_INT_PTR:
case HB_DYN_CTYPE_INT_UNSIGNED_PTR:
case HB_DYN_CTYPE_LONG_PTR:
case HB_DYN_CTYPE_LONG_UNSIGNED_PTR:
case HB_DYN_CTYPE_LLONG_PTR:
case HB_DYN_CTYPE_LLONG_UNSIGNED_PTR:
case HB_DYN_CTYPE_FLOAT_PTR:
case HB_DYN_CTYPE_DOUBLE_PTR:
case HB_DYN_CTYPE_STRUCTURE_PTR:
hb_itemPutPtr( pItem, ( void * ) value.t.n32 );
break;
case HB_DYN_CTYPE_FLOAT:
hb_itemPutND( pItem, value.t.nFL );
break;
case HB_DYN_CTYPE_DOUBLE:
hb_itemPutND( pItem, value.t.nDB );
break;
default:
hb_itemPutNL( pItem, ( long ) value.t.n32 );
}
return pItem;
}
#define HB_DYN_CTYPE_DECL( ret, abi, _type_ ) \
typedef ret ( abi * _type_##P00 )( void ); \
typedef ret ( abi * _type_##P01 )( HB_U32 ); \
typedef ret ( abi * _type_##P02 )( HB_U32, HB_U32 ); \
typedef ret ( abi * _type_##P03 )( HB_U32, HB_U32, HB_U32 ); \
typedef ret ( abi * _type_##P04 )( HB_U32, HB_U32, HB_U32, HB_U32 ); \
typedef ret ( abi * _type_##P05 )( HB_U32, HB_U32, HB_U32, HB_U32, HB_U32 ); \
typedef ret ( abi * _type_##P06 )( HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32 ); \
typedef ret ( abi * _type_##P07 )( HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32 ); \
typedef ret ( abi * _type_##P08 )( HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32 ); \
typedef ret ( abi * _type_##P09 )( HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32 ); \
typedef ret ( abi * _type_##P10 )( HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32 ); \
typedef ret ( abi * _type_##P11 )( HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32 ); \
typedef ret ( abi * _type_##P12 )( HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32 ); \
typedef ret ( abi * _type_##P13 )( HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32 ); \
typedef ret ( abi * _type_##P14 )( HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32 ); \
typedef ret ( abi * _type_##P15 )( HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32 ); \
typedef ret ( abi * _type_##P16 )( HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32 ); \
typedef ret ( abi * _type_##P17 )( HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32 ); \
typedef ret ( abi * _type_##P18 )( HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32 ); \
typedef ret ( abi * _type_##P19 )( HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32 ); \
typedef ret ( abi * _type_##P20 )( HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32 ); \
typedef ret ( abi * _type_##P21 )( HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32 ); \
typedef ret ( abi * _type_##P22 )( HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32 ); \
typedef ret ( abi * _type_##P23 )( HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32 ); \
typedef ret ( abi * _type_##P24 )( HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32 ); \
typedef ret ( abi * _type_##P25 )( HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32 ); \
typedef ret ( abi * _type_##P26 )( HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32 ); \
typedef ret ( abi * _type_##P27 )( HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32 ); \
typedef ret ( abi * _type_##P28 )( HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32 ); \
typedef ret ( abi * _type_##P29 )( HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32 ); \
typedef ret ( abi * _type_##P30 )( HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32, HB_U32 )
#define HB_DYN_FUN_CALL( pcount, _ret_, _type_ ) \
do switch( pcount ) \
{ \
case 0: ret.t._ret_ = ( ( _type_##P00 ) *pFunction )(); break; \
case 1: ret.t._ret_ = ( ( _type_##P01 ) *pFunction )( rawpar[ 0 ] ); break; \
case 2: ret.t._ret_ = ( ( _type_##P02 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ] ); break; \
case 3: ret.t._ret_ = ( ( _type_##P03 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ], rawpar[ 2 ] ); break; \
case 4: ret.t._ret_ = ( ( _type_##P04 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ], rawpar[ 2 ], rawpar[ 3 ] ); break; \
case 5: ret.t._ret_ = ( ( _type_##P05 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ], rawpar[ 2 ], rawpar[ 3 ], rawpar[ 4 ] ); break; \
case 6: ret.t._ret_ = ( ( _type_##P06 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ], rawpar[ 2 ], rawpar[ 3 ], rawpar[ 4 ], rawpar[ 5 ] ); break; \
case 7: ret.t._ret_ = ( ( _type_##P07 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ], rawpar[ 2 ], rawpar[ 3 ], rawpar[ 4 ], rawpar[ 5 ], rawpar[ 6 ] ); break; \
case 8: ret.t._ret_ = ( ( _type_##P08 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ], rawpar[ 2 ], rawpar[ 3 ], rawpar[ 4 ], rawpar[ 5 ], rawpar[ 6 ], rawpar[ 7 ] ); break; \
case 9: ret.t._ret_ = ( ( _type_##P09 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ], rawpar[ 2 ], rawpar[ 3 ], rawpar[ 4 ], rawpar[ 5 ], rawpar[ 6 ], rawpar[ 7 ], rawpar[ 8 ] ); break; \
case 10: ret.t._ret_ = ( ( _type_##P10 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ], rawpar[ 2 ], rawpar[ 3 ], rawpar[ 4 ], rawpar[ 5 ], rawpar[ 6 ], rawpar[ 7 ], rawpar[ 8 ], rawpar[ 9 ] ); break; \
case 11: ret.t._ret_ = ( ( _type_##P11 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ], rawpar[ 2 ], rawpar[ 3 ], rawpar[ 4 ], rawpar[ 5 ], rawpar[ 6 ], rawpar[ 7 ], rawpar[ 8 ], rawpar[ 9 ], rawpar[ 10 ] ); break; \
case 12: ret.t._ret_ = ( ( _type_##P12 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ], rawpar[ 2 ], rawpar[ 3 ], rawpar[ 4 ], rawpar[ 5 ], rawpar[ 6 ], rawpar[ 7 ], rawpar[ 8 ], rawpar[ 9 ], rawpar[ 10 ], rawpar[ 11 ] ); break; \
case 13: ret.t._ret_ = ( ( _type_##P13 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ], rawpar[ 2 ], rawpar[ 3 ], rawpar[ 4 ], rawpar[ 5 ], rawpar[ 6 ], rawpar[ 7 ], rawpar[ 8 ], rawpar[ 9 ], rawpar[ 10 ], rawpar[ 11 ], rawpar[ 12 ] ); break; \
case 14: ret.t._ret_ = ( ( _type_##P14 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ], rawpar[ 2 ], rawpar[ 3 ], rawpar[ 4 ], rawpar[ 5 ], rawpar[ 6 ], rawpar[ 7 ], rawpar[ 8 ], rawpar[ 9 ], rawpar[ 10 ], rawpar[ 11 ], rawpar[ 12 ], rawpar[ 13 ] ); break; \
case 15: ret.t._ret_ = ( ( _type_##P15 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ], rawpar[ 2 ], rawpar[ 3 ], rawpar[ 4 ], rawpar[ 5 ], rawpar[ 6 ], rawpar[ 7 ], rawpar[ 8 ], rawpar[ 9 ], rawpar[ 10 ], rawpar[ 11 ], rawpar[ 12 ], rawpar[ 13 ], rawpar[ 14 ] ); break; \
case 16: ret.t._ret_ = ( ( _type_##P16 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ], rawpar[ 2 ], rawpar[ 3 ], rawpar[ 4 ], rawpar[ 5 ], rawpar[ 6 ], rawpar[ 7 ], rawpar[ 8 ], rawpar[ 9 ], rawpar[ 10 ], rawpar[ 11 ], rawpar[ 12 ], rawpar[ 13 ], rawpar[ 14 ], rawpar[ 15 ] ); break; \
case 17: ret.t._ret_ = ( ( _type_##P17 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ], rawpar[ 2 ], rawpar[ 3 ], rawpar[ 4 ], rawpar[ 5 ], rawpar[ 6 ], rawpar[ 7 ], rawpar[ 8 ], rawpar[ 9 ], rawpar[ 10 ], rawpar[ 11 ], rawpar[ 12 ], rawpar[ 13 ], rawpar[ 14 ], rawpar[ 15 ], rawpar[ 16 ] ); break; \
case 18: ret.t._ret_ = ( ( _type_##P18 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ], rawpar[ 2 ], rawpar[ 3 ], rawpar[ 4 ], rawpar[ 5 ], rawpar[ 6 ], rawpar[ 7 ], rawpar[ 8 ], rawpar[ 9 ], rawpar[ 10 ], rawpar[ 11 ], rawpar[ 12 ], rawpar[ 13 ], rawpar[ 14 ], rawpar[ 15 ], rawpar[ 16 ], rawpar[ 17 ] ); break; \
case 19: ret.t._ret_ = ( ( _type_##P19 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ], rawpar[ 2 ], rawpar[ 3 ], rawpar[ 4 ], rawpar[ 5 ], rawpar[ 6 ], rawpar[ 7 ], rawpar[ 8 ], rawpar[ 9 ], rawpar[ 10 ], rawpar[ 11 ], rawpar[ 12 ], rawpar[ 13 ], rawpar[ 14 ], rawpar[ 15 ], rawpar[ 16 ], rawpar[ 17 ], rawpar[ 18 ] ); break; \
case 20: ret.t._ret_ = ( ( _type_##P20 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ], rawpar[ 2 ], rawpar[ 3 ], rawpar[ 4 ], rawpar[ 5 ], rawpar[ 6 ], rawpar[ 7 ], rawpar[ 8 ], rawpar[ 9 ], rawpar[ 10 ], rawpar[ 11 ], rawpar[ 12 ], rawpar[ 13 ], rawpar[ 14 ], rawpar[ 15 ], rawpar[ 16 ], rawpar[ 17 ], rawpar[ 18 ], rawpar[ 19 ] ); break; \
case 21: ret.t._ret_ = ( ( _type_##P21 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ], rawpar[ 2 ], rawpar[ 3 ], rawpar[ 4 ], rawpar[ 5 ], rawpar[ 6 ], rawpar[ 7 ], rawpar[ 8 ], rawpar[ 9 ], rawpar[ 10 ], rawpar[ 11 ], rawpar[ 12 ], rawpar[ 13 ], rawpar[ 14 ], rawpar[ 15 ], rawpar[ 16 ], rawpar[ 17 ], rawpar[ 18 ], rawpar[ 19 ], rawpar[ 20 ] ); break; \
case 22: ret.t._ret_ = ( ( _type_##P22 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ], rawpar[ 2 ], rawpar[ 3 ], rawpar[ 4 ], rawpar[ 5 ], rawpar[ 6 ], rawpar[ 7 ], rawpar[ 8 ], rawpar[ 9 ], rawpar[ 10 ], rawpar[ 11 ], rawpar[ 12 ], rawpar[ 13 ], rawpar[ 14 ], rawpar[ 15 ], rawpar[ 16 ], rawpar[ 17 ], rawpar[ 18 ], rawpar[ 19 ], rawpar[ 20 ], rawpar[ 21 ] ); break; \
case 23: ret.t._ret_ = ( ( _type_##P23 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ], rawpar[ 2 ], rawpar[ 3 ], rawpar[ 4 ], rawpar[ 5 ], rawpar[ 6 ], rawpar[ 7 ], rawpar[ 8 ], rawpar[ 9 ], rawpar[ 10 ], rawpar[ 11 ], rawpar[ 12 ], rawpar[ 13 ], rawpar[ 14 ], rawpar[ 15 ], rawpar[ 16 ], rawpar[ 17 ], rawpar[ 18 ], rawpar[ 19 ], rawpar[ 20 ], rawpar[ 21 ], rawpar[ 22 ] ); break; \
case 24: ret.t._ret_ = ( ( _type_##P24 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ], rawpar[ 2 ], rawpar[ 3 ], rawpar[ 4 ], rawpar[ 5 ], rawpar[ 6 ], rawpar[ 7 ], rawpar[ 8 ], rawpar[ 9 ], rawpar[ 10 ], rawpar[ 11 ], rawpar[ 12 ], rawpar[ 13 ], rawpar[ 14 ], rawpar[ 15 ], rawpar[ 16 ], rawpar[ 17 ], rawpar[ 18 ], rawpar[ 19 ], rawpar[ 20 ], rawpar[ 21 ], rawpar[ 22 ], rawpar[ 23 ] ); break; \
case 25: ret.t._ret_ = ( ( _type_##P25 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ], rawpar[ 2 ], rawpar[ 3 ], rawpar[ 4 ], rawpar[ 5 ], rawpar[ 6 ], rawpar[ 7 ], rawpar[ 8 ], rawpar[ 9 ], rawpar[ 10 ], rawpar[ 11 ], rawpar[ 12 ], rawpar[ 13 ], rawpar[ 14 ], rawpar[ 15 ], rawpar[ 16 ], rawpar[ 17 ], rawpar[ 18 ], rawpar[ 19 ], rawpar[ 20 ], rawpar[ 21 ], rawpar[ 22 ], rawpar[ 23 ], rawpar[ 24 ] ); break; \
case 26: ret.t._ret_ = ( ( _type_##P26 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ], rawpar[ 2 ], rawpar[ 3 ], rawpar[ 4 ], rawpar[ 5 ], rawpar[ 6 ], rawpar[ 7 ], rawpar[ 8 ], rawpar[ 9 ], rawpar[ 10 ], rawpar[ 11 ], rawpar[ 12 ], rawpar[ 13 ], rawpar[ 14 ], rawpar[ 15 ], rawpar[ 16 ], rawpar[ 17 ], rawpar[ 18 ], rawpar[ 19 ], rawpar[ 20 ], rawpar[ 21 ], rawpar[ 22 ], rawpar[ 23 ], rawpar[ 24 ], rawpar[ 25 ] ); break; \
case 27: ret.t._ret_ = ( ( _type_##P27 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ], rawpar[ 2 ], rawpar[ 3 ], rawpar[ 4 ], rawpar[ 5 ], rawpar[ 6 ], rawpar[ 7 ], rawpar[ 8 ], rawpar[ 9 ], rawpar[ 10 ], rawpar[ 11 ], rawpar[ 12 ], rawpar[ 13 ], rawpar[ 14 ], rawpar[ 15 ], rawpar[ 16 ], rawpar[ 17 ], rawpar[ 18 ], rawpar[ 19 ], rawpar[ 20 ], rawpar[ 21 ], rawpar[ 22 ], rawpar[ 23 ], rawpar[ 24 ], rawpar[ 25 ], rawpar[ 26 ] ); break; \
case 28: ret.t._ret_ = ( ( _type_##P28 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ], rawpar[ 2 ], rawpar[ 3 ], rawpar[ 4 ], rawpar[ 5 ], rawpar[ 6 ], rawpar[ 7 ], rawpar[ 8 ], rawpar[ 9 ], rawpar[ 10 ], rawpar[ 11 ], rawpar[ 12 ], rawpar[ 13 ], rawpar[ 14 ], rawpar[ 15 ], rawpar[ 16 ], rawpar[ 17 ], rawpar[ 18 ], rawpar[ 19 ], rawpar[ 20 ], rawpar[ 21 ], rawpar[ 22 ], rawpar[ 23 ], rawpar[ 24 ], rawpar[ 25 ], rawpar[ 26 ], rawpar[ 27 ] ); break; \
case 29: ret.t._ret_ = ( ( _type_##P29 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ], rawpar[ 2 ], rawpar[ 3 ], rawpar[ 4 ], rawpar[ 5 ], rawpar[ 6 ], rawpar[ 7 ], rawpar[ 8 ], rawpar[ 9 ], rawpar[ 10 ], rawpar[ 11 ], rawpar[ 12 ], rawpar[ 13 ], rawpar[ 14 ], rawpar[ 15 ], rawpar[ 16 ], rawpar[ 17 ], rawpar[ 18 ], rawpar[ 19 ], rawpar[ 20 ], rawpar[ 21 ], rawpar[ 22 ], rawpar[ 23 ], rawpar[ 24 ], rawpar[ 25 ], rawpar[ 26 ], rawpar[ 27 ], rawpar[ 28 ] ); break; \
case 30: ret.t._ret_ = ( ( _type_##P30 ) *pFunction )( rawpar[ 0 ], rawpar[ 1 ], rawpar[ 2 ], rawpar[ 3 ], rawpar[ 4 ], rawpar[ 5 ], rawpar[ 6 ], rawpar[ 7 ], rawpar[ 8 ], rawpar[ 9 ], rawpar[ 10 ], rawpar[ 11 ], rawpar[ 12 ], rawpar[ 13 ], rawpar[ 14 ], rawpar[ 15 ], rawpar[ 16 ], rawpar[ 17 ], rawpar[ 18 ], rawpar[ 19 ], rawpar[ 20 ], rawpar[ 21 ], rawpar[ 22 ], rawpar[ 23 ], rawpar[ 24 ], rawpar[ 25 ], rawpar[ 26 ], rawpar[ 27 ], rawpar[ 28 ], rawpar[ 29 ] ); break; \
} while( 0 )
#if defined( HB_OS_WIN ) || defined( HB_OS_OS2 )
#define HB_CDECL _cdecl
#else
#define HB_CDECL
#endif
HB_DYN_CTYPE_DECL( HB_U32, HB_CDECL, FX86_C32 );
#if !defined( HB_LONG_LONG_OFF )
HB_DYN_CTYPE_DECL( HB_U64, HB_CDECL, FX86_C64 );
#endif
HB_DYN_CTYPE_DECL( double, HB_CDECL, FX86_CDB );
HB_DYN_CTYPE_DECL( float, HB_CDECL, FX86_CFL );
#if defined( HB_OS_WIN )
HB_DYN_CTYPE_DECL( HB_U32, _stdcall, FX86_S32 );
HB_DYN_CTYPE_DECL( HB_U64, _stdcall, FX86_S64 );
HB_DYN_CTYPE_DECL( double, _stdcall, FX86_SDB );
HB_DYN_CTYPE_DECL( float, _stdcall, FX86_SFL );
#endif
#if defined( HB_OS_OS2 )
HB_DYN_CTYPE_DECL( HB_U32, _System, FX86_O32 );
HB_DYN_CTYPE_DECL( HB_U64, _System, FX86_O64 );
HB_DYN_CTYPE_DECL( double, _System, FX86_ODB );
HB_DYN_CTYPE_DECL( float, _System, FX86_OFL );
#endif
#endif
void hb_dynCall( int iFuncFlags, void * pFunctionRaw, int iParams, int iFirst, int * piArgFlags )
{
PHB_DYNADDR pFunction = ( PHB_DYNADDR ) pFunctionRaw;
if( ! pFunction )
return;
#if defined( HB_ARCH_64BIT )
{
int iRetType = iFuncFlags & _MASK_CTYPE;
int iEncoding = iFuncFlags & _MASK_ENCODING;
int iOptions = iFuncFlags & _MASK_OPTIONS;
iParams -= iFirst - 1;
if( iParams <= _DYNEXEC_MAXPARAM )
{
int iRetTypeRaw;
HB_DYNVAL ret;
HB_DYNARG * pArg;
int tmp;
HB_U64 rawpar[ _DYNEXEC_MAXPARAM ];
ret.t.n64 = 0;
if( iRetType == HB_DYN_CTYPE_DOUBLE )
iRetTypeRaw = _RETTYPERAW_DOUBLE;
else if( iRetType == HB_DYN_CTYPE_FLOAT )
iRetTypeRaw = _RETTYPERAW_FLOAT;
else
iRetTypeRaw = _RETTYPERAW_INT64;
if( iParams )
{
pArg = ( HB_DYNARG * ) hb_xgrab( iParams * sizeof( HB_DYNARG ) );
memset( pArg, 0, iParams * sizeof( HB_DYNARG ) );
}
else
pArg = NULL;
for( tmp = 0; tmp < iParams; ++tmp )
{
PHB_ITEM pParam = hb_param( iFirst + tmp, HB_IT_ANY );
if( piArgFlags )
{
pArg[ tmp ].iType = piArgFlags[ tmp ] & _MASK_CTYPE;
pArg[ tmp ].iEncoding = piArgFlags[ tmp ] & _MASK_ENCODING;
pArg[ tmp ].iOptions = piArgFlags[ tmp ] & _MASK_OPTIONS;
}
else
{
pArg[ tmp ].iType = HB_DYN_CTYPE_DEFAULT;
pArg[ tmp ].iEncoding = iEncoding;
pArg[ tmp ].iOptions = iOptions;
}
if( pArg[ tmp ].iType == HB_DYN_CTYPE_DEFAULT )
pArg[ tmp ].iType = hb_hbtoctype( HB_ITEM_TYPE( pParam ) );
pArg[ tmp ].bByRef = HB_ISBYREF( iFirst + tmp );
rawpar[ tmp ] = hb_u64par( pParam, &pArg[ tmp ] );
}
switch( iRetTypeRaw )
{
case _RETTYPERAW_INT64:
HB_DYN_FUN_CALL( iParams, n64, FX64_64 );
break;
case _RETTYPERAW_DOUBLE:
HB_DYN_FUN_CALL( iParams, nDB, FX64_DB );
break;
case _RETTYPERAW_FLOAT:
HB_DYN_FUN_CALL( iParams, nFL, FX64_FL );
break;
}
hb_u64ret( hb_stackReturnItem(), iRetType, iEncoding, ret, -1 );
for( tmp = 0; tmp < iParams; ++tmp )
{
if( pArg[ tmp ].bByRef )
{
PHB_ITEM pItem = hb_itemNew( NULL );
hb_itemParamStoreForward( ( HB_USHORT ) ( iFirst + tmp ),
hb_u64ret( pItem, pArg[ tmp ].iType, pArg[ tmp ].iEncoding, pArg[ tmp ].value,
( pArg[ tmp ].iOptions & HB_DYC_OPT_NULLTERM ) != 0 ? -1 : ( HB_ISIZ ) hb_parclen( iFirst + tmp ) ) );
hb_itemRelease( pItem );
}
if( pArg[ tmp ].bRawBuffer )
hb_xfree( pArg[ tmp ].hString );
else
hb_strfree( pArg[ tmp ].hString );
}
if( pArg )
hb_xfree( pArg );
}
else
hb_errRT_BASE( EG_LIMIT, 2010, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS );
}
#elif defined( HB_ARCH_32BIT )
{
int iCallConv = iFuncFlags & _MASK_CALLCONV;
int iRetType = iFuncFlags & _MASK_CTYPE;
int iEncoding = iFuncFlags & _MASK_ENCODING;
int iOptions = iFuncFlags & _MASK_OPTIONS;
iParams -= iFirst - 1;
if( iParams <= _DYNEXEC_MAXPARAM )
{
int iRetTypeRaw;
HB_DYNVAL ret;
HB_DYNARG * pArg;
int tmp;
int iParamsRaw = 0;
HB_U32 rawpar[ _DYNEXEC_MAXPARAM * 2 ];
#if !defined( HB_LONG_LONG_OFF )
ret.t.n64 = 0;
#else
memset( &ret, 0, sizeof( ret ) );
#endif
if( iRetType == HB_DYN_CTYPE_DOUBLE )
iRetTypeRaw = _RETTYPERAW_DOUBLE;
else if( iRetType == HB_DYN_CTYPE_FLOAT )
iRetTypeRaw = _RETTYPERAW_FLOAT;
else if( iRetType == HB_DYN_CTYPE_LLONG ||
iRetType == HB_DYN_CTYPE_LLONG_UNSIGNED )
iRetTypeRaw = _RETTYPERAW_INT64;
else
iRetTypeRaw = _RETTYPERAW_INT32;
if( iParams )
{
pArg = ( HB_DYNARG * ) hb_xgrab( iParams * sizeof( HB_DYNARG ) );
memset( pArg, 0, iParams * sizeof( HB_DYNARG ) );
}
else
pArg = NULL;
for( tmp = 0; tmp < iParams; ++tmp )
{
PHB_ITEM pParam = hb_param( iFirst + tmp, HB_IT_ANY );
HB_U32 r1;
HB_U32 r2;
HB_BOOL b64;
if( piArgFlags )
{
pArg[ tmp ].iType = piArgFlags[ tmp ] & _MASK_CTYPE;
pArg[ tmp ].iEncoding = piArgFlags[ tmp ] & _MASK_ENCODING;
pArg[ tmp ].iOptions = piArgFlags[ tmp ] & _MASK_OPTIONS;
}
else
{
pArg[ tmp ].iType = HB_DYN_CTYPE_DEFAULT;
pArg[ tmp ].iEncoding = iEncoding;
pArg[ tmp ].iOptions = iOptions;
}
if( pArg[ tmp ].iType == HB_DYN_CTYPE_DEFAULT )
pArg[ tmp ].iType = hb_hbtoctype( HB_ITEM_TYPE( pParam ) );
pArg[ tmp ].bByRef = HB_ISBYREF( iFirst + tmp );
hb_u32par( pParam, &pArg[ tmp ], &r1, &r2, &b64 );
rawpar[ iParamsRaw++ ] = r1;
if( b64 )
rawpar[ iParamsRaw++ ] = r2;
}
switch( iCallConv )
{
#if defined( HB_OS_WIN )
case HB_DYN_CALLCONV_STDCALL:
switch( iRetTypeRaw )
{
case _RETTYPERAW_INT32:
HB_DYN_FUN_CALL( iParamsRaw, n32, FX86_S32 );
break;
case _RETTYPERAW_INT64:
HB_DYN_FUN_CALL( iParamsRaw, n64, FX86_S64 );
break;
case _RETTYPERAW_DOUBLE:
HB_DYN_FUN_CALL( iParamsRaw, nDB, FX86_SDB );
break;
case _RETTYPERAW_FLOAT:
HB_DYN_FUN_CALL( iParamsRaw, nFL, FX86_SFL );
break;
}
break;
#endif
#if defined( HB_OS_OS2 )
case HB_DYN_CALLCONV_SYSCALL:
switch( iRetTypeRaw )
{
case _RETTYPERAW_INT32:
HB_DYN_FUN_CALL( iParamsRaw, n32, FX86_O32 );
break;
case _RETTYPERAW_INT64:
HB_DYN_FUN_CALL( iParamsRaw, n64, FX86_O64 );
break;
case _RETTYPERAW_DOUBLE:
HB_DYN_FUN_CALL( iParamsRaw, nDB, FX86_ODB );
break;
case _RETTYPERAW_FLOAT:
HB_DYN_FUN_CALL( iParamsRaw, nFL, FX86_OFL );
break;
}
break;
#endif
default: /* HB_DYN_CALLCONV_CDECL */
switch( iRetTypeRaw )
{
case _RETTYPERAW_INT32:
HB_DYN_FUN_CALL( iParamsRaw, n32, FX86_C32 );
break;
case _RETTYPERAW_INT64:
#if !defined( HB_LONG_LONG_OFF )
HB_DYN_FUN_CALL( iParamsRaw, n64, FX86_C64 );
#endif
break;
case _RETTYPERAW_DOUBLE:
HB_DYN_FUN_CALL( iParamsRaw, nDB, FX86_CDB );
break;
case _RETTYPERAW_FLOAT:
HB_DYN_FUN_CALL( iParamsRaw, nFL, FX86_CFL );
break;
}
break;
}
hb_u32ret( hb_stackReturnItem(), iRetType, iEncoding, ret, -1 );
for( tmp = 0; tmp < iParams; ++tmp )
{
if( pArg[ tmp ].bByRef )
{
PHB_ITEM pItem = hb_itemNew( NULL );
hb_itemParamStoreForward( ( HB_USHORT ) ( iFirst + tmp ),
hb_u32ret( pItem, pArg[ tmp ].iType, pArg[ tmp ].iEncoding, pArg[ tmp ].value,
( pArg[ tmp ].iOptions & HB_DYC_OPT_NULLTERM ) != 0 ? -1 : ( HB_ISIZ ) hb_parclen( iFirst + tmp ) ) );
hb_itemRelease( pItem );
}
if( pArg[ tmp ].bRawBuffer )
hb_xfree( pArg[ tmp ].hString );
else
hb_strfree( pArg[ tmp ].hString );
}
if( pArg )
hb_xfree( pArg );
}
else
hb_errRT_BASE( EG_LIMIT, 2010, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS );
}
#else
HB_SYMBOL_UNUSED( iFuncFlags );
HB_SYMBOL_UNUSED( iParams );
HB_SYMBOL_UNUSED( iFirst );
HB_SYMBOL_UNUSED( piArgFlags );
#endif
}