diff --git a/harbour/ChangeLog b/harbour/ChangeLog index da2d428521..555755a78b 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,24 @@ 2002-12-01 23:12 UTC+0100 Foo Bar */ +2003-11-09 00:50 UTC+0300 Alexander Kresin + * source/pp/pptable.c + + SET MBLOCKSIZE TO + SET MEMOBLOCK TO + SET MFILEEXT TO + SET AUTOSHARE TO [] + SET AUTORDER TO [] + SET STRICTREAD + New DBFFPT related commands, added by Przemyslaw Czerpak - synced with xHarbour. + + * include/hbdefs.h + * source/rdd/dbcmd.c + * source/rdd/dbfcdx/dbfcdx1.c + ! Some DBFCDX fixes by Przemyslaw Czerpak - synced with xHarbour. + + * source/rdd/dbfntx/dbfntx1.c + ! Bug fixed, which appeared while conditional indexing of a parent file in relation. + 2003-10-22 13:26 UTC-0800 Luis Krause Mantilla * xharbour/source/rdd/rddord.prg + ORDSETRELATION() diff --git a/harbour/include/hbdefs.h b/harbour/include/hbdefs.h index b38bf4ca91..1a1cc013f9 100644 --- a/harbour/include/hbdefs.h +++ b/harbour/include/hbdefs.h @@ -163,35 +163,13 @@ ( ( ( ULONG ) ( b3 ) ) << 16 ) | \ ( ( ( ULONG ) ( b2 ) ) << 8 ) | \ ( ( ( ULONG ) ( b1 ) ) ) ) + #define HB_SWAP_USHORT( w ) ( ( USHORT ) ( ( ( ( USHORT ) ( w ) & 0xFF00 ) >> 8 ) | \ ( ( ( USHORT ) ( w ) & 0x00FF ) << 8 ) ) ) #define HB_SWAP_ULONG( w ) ( ( ULONG ) ( ( ( ( ULONG ) ( w ) & 0x000000FFL ) << 24 ) | \ ( ( ( ULONG ) ( w ) & 0x0000FF00L ) << 8 ) | \ ( ( ( ULONG ) ( w ) & 0x00FF0000L ) >> 8 ) | \ ( ( ( ULONG ) ( w ) & 0xFF000000L ) >> 24 ) ) ) -/* Be careful with double conversion. Some machines can use mixed form - (Little/Big) for BYTE ORDER and WORD ORDER or even completely differ - internal representation */ -#define HB_SWAP_PDOUBLE( p ) ( { \ - union { \ - double d; \ - BYTE buffer[ 8 ]; \ - } u; \ - u.buffer[ 0 ] = ( ( BYTE * ) ( p ) )[ 7 ]; \ - u.buffer[ 1 ] = ( ( BYTE * ) ( p ) )[ 6 ]; \ - u.buffer[ 2 ] = ( ( BYTE * ) ( p ) )[ 5 ]; \ - u.buffer[ 3 ] = ( ( BYTE * ) ( p ) )[ 4 ]; \ - u.buffer[ 4 ] = ( ( BYTE * ) ( p ) )[ 3 ]; \ - u.buffer[ 5 ] = ( ( BYTE * ) ( p ) )[ 2 ]; \ - u.buffer[ 6 ] = ( ( BYTE * ) ( p ) )[ 1 ]; \ - u.buffer[ 7 ] = ( ( BYTE * ) ( p ) )[ 0 ]; \ - u.d; \ - } ) -#define HB_SWAP_DOUBLE( d ) ( { \ - BYTE double_var[ 8 ]; \ - *( double * )double_var = ( double ) ( d ); \ - HB_SWAP_PDOUBLE( double_var ); \ - } ) #if defined(HB_PDP_ENDIAN) #error PDP-Endian support unimplemented. If you have such machine do it yourself. @@ -202,15 +180,14 @@ #define HB_PUT_LE_USHORT( p, w ) ( *( USHORT * )( p ) = ( USHORT ) ( w ) ) #define HB_GET_LE_ULONG( p ) ( *( ULONG * )( p ) ) #define HB_PUT_LE_ULONG( p, l ) ( *( ULONG * )( p ) = ( ULONG ) ( l ) ) - #define HB_GET_LE_DOUBLE( p ) ( *( double * )( p ) ) - #define HB_PUT_LE_DOUBLE( p, d ) ( *( double * )( p ) = ( double ) ( d ) ) #define HB_GET_BE_USHORT( p ) HB_SWAP_USHORT( *( USHORT * )( p ) ) #define HB_PUT_BE_USHORT( p, w ) ( *( USHORT * )( p ) = HB_SWAP_USHORT( w ) ) #define HB_GET_BE_ULONG( p ) HB_SWAP_ULONG( *( ULONG * )( p ) ) #define HB_PUT_BE_ULONG( p, l ) ( *( ULONG * )( p ) = HB_SWAP_ULONG( l ) ) - #define HB_GET_BE_DOUBLE( p ) HB_SWAP_PDOUBLE( p ) - #define HB_PUT_BE_DOUBLE( p, d ) ( *( double * )( p ) = HB_SWAP_DOUBLE( d ) ) + + #define HB_GET_LE_DOUBLE( p ) ( *( double * )( p ) ) + #define HB_PUT_LE_DOUBLE( p, d ) ( *( double * )( p ) = ( double ) ( d ) ) #define HB_USHORT_FROM_LE( w ) ( ( USHORT )( w ) ) #define HB_ULONG_FROM_LE( l ) ( ( ULONG )( l ) ) @@ -224,61 +201,48 @@ #define HB_PCODE_MKULONG( p ) ( *( ULONG * )( p ) ) #define HB_PCODE_MKDOUBLE( p ) ( *( double * )( p ) ) - /* the conversion for BIG endian can be used here but for speed reasons - * I decided to write full version to avoid one bytes conversion */ - #define HB_GET_SORTDBL( v, p ) { \ - union { \ - double d; \ - BYTE buffer[ 8 ]; \ - } u; \ - if ( ( ( BYTE * ) ( p ) )[ 0 ] & 0x80 ) { \ - u.buffer[ 0 ] = ( ( BYTE * ) ( p ) )[ 7 ]; \ - u.buffer[ 1 ] = ( ( BYTE * ) ( p ) )[ 6 ]; \ - u.buffer[ 2 ] = ( ( BYTE * ) ( p ) )[ 5 ]; \ - u.buffer[ 3 ] = ( ( BYTE * ) ( p ) )[ 4 ]; \ - u.buffer[ 4 ] = ( ( BYTE * ) ( p ) )[ 3 ]; \ - u.buffer[ 5 ] = ( ( BYTE * ) ( p ) )[ 2 ]; \ - u.buffer[ 6 ] = ( ( BYTE * ) ( p ) )[ 1 ]; \ - u.buffer[ 7 ] = ( ( BYTE * ) ( p ) )[ 0 ] ^ 0x80; \ - } else { \ - u.buffer[ 0 ] = ( ( BYTE * ) ( p ) )[ 7 ] ^ 0xFF; \ - u.buffer[ 1 ] = ( ( BYTE * ) ( p ) )[ 6 ] ^ 0xFF; \ - u.buffer[ 2 ] = ( ( BYTE * ) ( p ) )[ 5 ] ^ 0xFF; \ - u.buffer[ 3 ] = ( ( BYTE * ) ( p ) )[ 4 ] ^ 0xFF; \ - u.buffer[ 4 ] = ( ( BYTE * ) ( p ) )[ 3 ] ^ 0xFF; \ - u.buffer[ 5 ] = ( ( BYTE * ) ( p ) )[ 2 ] ^ 0xFF; \ - u.buffer[ 6 ] = ( ( BYTE * ) ( p ) )[ 1 ] ^ 0xFF; \ - u.buffer[ 7 ] = ( ( BYTE * ) ( p ) )[ 0 ] ^ 0xFF; \ - } \ - v = u.d; \ - } + #define HB_ORD2DBL( o, d ) { \ + if ( ( ( BYTE * ) ( o ) )[ 0 ] & 0x80 ) { \ + ( ( BYTE * ) ( d ) )[ 0 ] = ( ( BYTE * ) ( o ) )[ 7 ]; \ + ( ( BYTE * ) ( d ) )[ 1 ] = ( ( BYTE * ) ( o ) )[ 6 ]; \ + ( ( BYTE * ) ( d ) )[ 2 ] = ( ( BYTE * ) ( o ) )[ 5 ]; \ + ( ( BYTE * ) ( d ) )[ 3 ] = ( ( BYTE * ) ( o ) )[ 4 ]; \ + ( ( BYTE * ) ( d ) )[ 4 ] = ( ( BYTE * ) ( o ) )[ 3 ]; \ + ( ( BYTE * ) ( d ) )[ 5 ] = ( ( BYTE * ) ( o ) )[ 2 ]; \ + ( ( BYTE * ) ( d ) )[ 6 ] = ( ( BYTE * ) ( o ) )[ 1 ]; \ + ( ( BYTE * ) ( d ) )[ 7 ] = ( ( BYTE * ) ( o ) )[ 0 ] ^ ( BYTE ) 0x80; \ + } else { \ + ( ( BYTE * ) ( d ) )[ 0 ] = ( ( BYTE * ) ( o ) )[ 7 ] ^ ( BYTE ) 0xFF; \ + ( ( BYTE * ) ( d ) )[ 1 ] = ( ( BYTE * ) ( o ) )[ 6 ] ^ ( BYTE ) 0xFF; \ + ( ( BYTE * ) ( d ) )[ 2 ] = ( ( BYTE * ) ( o ) )[ 5 ] ^ ( BYTE ) 0xFF; \ + ( ( BYTE * ) ( d ) )[ 3 ] = ( ( BYTE * ) ( o ) )[ 4 ] ^ ( BYTE ) 0xFF; \ + ( ( BYTE * ) ( d ) )[ 4 ] = ( ( BYTE * ) ( o ) )[ 3 ] ^ ( BYTE ) 0xFF; \ + ( ( BYTE * ) ( d ) )[ 5 ] = ( ( BYTE * ) ( o ) )[ 2 ] ^ ( BYTE ) 0xFF; \ + ( ( BYTE * ) ( d ) )[ 6 ] = ( ( BYTE * ) ( o ) )[ 1 ] ^ ( BYTE ) 0xFF; \ + ( ( BYTE * ) ( d ) )[ 7 ] = ( ( BYTE * ) ( o ) )[ 0 ] ^ ( BYTE ) 0xFF; \ + } } + + #define HB_DBL2ORD( d, o ) { \ + if ( *( double * )( d ) >= 0.0 ) { \ + ( ( BYTE * ) ( o ) )[ 0 ] = ( ( BYTE * ) ( d ) )[ 7 ] ^ ( BYTE ) 0x80; \ + ( ( BYTE * ) ( o ) )[ 1 ] = ( ( BYTE * ) ( d ) )[ 6 ]; \ + ( ( BYTE * ) ( o ) )[ 2 ] = ( ( BYTE * ) ( d ) )[ 5 ]; \ + ( ( BYTE * ) ( o ) )[ 3 ] = ( ( BYTE * ) ( d ) )[ 4 ]; \ + ( ( BYTE * ) ( o ) )[ 4 ] = ( ( BYTE * ) ( d ) )[ 3 ]; \ + ( ( BYTE * ) ( o ) )[ 5 ] = ( ( BYTE * ) ( d ) )[ 2 ]; \ + ( ( BYTE * ) ( o ) )[ 6 ] = ( ( BYTE * ) ( d ) )[ 1 ]; \ + ( ( BYTE * ) ( o ) )[ 7 ] = ( ( BYTE * ) ( d ) )[ 0 ]; \ + } else { \ + ( ( BYTE * ) ( o ) )[ 0 ] = ( ( BYTE * ) ( d ) )[ 7 ] ^ ( BYTE ) 0xFF; \ + ( ( BYTE * ) ( o ) )[ 1 ] = ( ( BYTE * ) ( d ) )[ 6 ] ^ ( BYTE ) 0xFF; \ + ( ( BYTE * ) ( o ) )[ 2 ] = ( ( BYTE * ) ( d ) )[ 5 ] ^ ( BYTE ) 0xFF; \ + ( ( BYTE * ) ( o ) )[ 3 ] = ( ( BYTE * ) ( d ) )[ 4 ] ^ ( BYTE ) 0xFF; \ + ( ( BYTE * ) ( o ) )[ 4 ] = ( ( BYTE * ) ( d ) )[ 3 ] ^ ( BYTE ) 0xFF; \ + ( ( BYTE * ) ( o ) )[ 5 ] = ( ( BYTE * ) ( d ) )[ 2 ] ^ ( BYTE ) 0xFF; \ + ( ( BYTE * ) ( o ) )[ 6 ] = ( ( BYTE * ) ( d ) )[ 1 ] ^ ( BYTE ) 0xFF; \ + ( ( BYTE * ) ( o ) )[ 7 ] = ( ( BYTE * ) ( d ) )[ 0 ] ^ ( BYTE ) 0xFF; \ + } } - #define HB_PUT_SORTDBL( p, v ) { \ - union { \ - double d; \ - BYTE buffer[ 8 ]; \ - } u; \ - u.d = ( double ) ( v ); \ - if ( u.d >= 0.0 ) { \ - ( ( BYTE * ) ( p ) )[ 0 ] = u.buffer[ 7 ] ^ 0x80; \ - ( ( BYTE * ) ( p ) )[ 1 ] = u.buffer[ 6 ]; \ - ( ( BYTE * ) ( p ) )[ 2 ] = u.buffer[ 5 ]; \ - ( ( BYTE * ) ( p ) )[ 3 ] = u.buffer[ 4 ]; \ - ( ( BYTE * ) ( p ) )[ 4 ] = u.buffer[ 3 ]; \ - ( ( BYTE * ) ( p ) )[ 5 ] = u.buffer[ 2 ]; \ - ( ( BYTE * ) ( p ) )[ 6 ] = u.buffer[ 1 ]; \ - ( ( BYTE * ) ( p ) )[ 7 ] = u.buffer[ 0 ]; \ - } else { \ - ( ( BYTE * ) ( p ) )[ 7 ] = u.buffer[ 0 ] ^ 0xFF; \ - ( ( BYTE * ) ( p ) )[ 6 ] = u.buffer[ 1 ] ^ 0xFF; \ - ( ( BYTE * ) ( p ) )[ 5 ] = u.buffer[ 2 ] ^ 0xFF; \ - ( ( BYTE * ) ( p ) )[ 4 ] = u.buffer[ 3 ] ^ 0xFF; \ - ( ( BYTE * ) ( p ) )[ 3 ] = u.buffer[ 4 ] ^ 0xFF; \ - ( ( BYTE * ) ( p ) )[ 2 ] = u.buffer[ 5 ] ^ 0xFF; \ - ( ( BYTE * ) ( p ) )[ 1 ] = u.buffer[ 6 ] ^ 0xFF; \ - ( ( BYTE * ) ( p ) )[ 0 ] = u.buffer[ 7 ] ^ 0xFF; \ - } \ - } #else /* We use Big-Endian here */ @@ -290,8 +254,6 @@ #define HB_PUT_BE_USHORT( p, w ) ( *( USHORT * )( p ) = ( USHORT ) ( w ) ) #define HB_GET_BE_ULONG( p ) ( *( ULONG * )( p ) ) #define HB_PUT_BE_ULONG( p, l ) ( *( ULONG * )( p ) = ( ULONG ) ( l ) ) - #define HB_GET_BE_DOUBLE( p ) ( *( double * )( p ) ) - #define HB_PUT_BE_DOUBLE( p, d ) ( *( double * )( p ) = ( double ) ( d ) ) #define HB_USHORT_FROM_LE( w ) HB_MKUSHORT( HB_HIBYTE( w ), HB_LOBYTE( w ) ) #define HB_ULONG_FROM_LE( l ) HB_MKULONG( HB_HIBYTE( HB_HIWORD( l ) ), HB_LOBYTE( HB_HIWORD( l ) ), HB_HIBYTE( l ), HB_LOBYTE( l ) ) @@ -303,40 +265,32 @@ #define HB_PCODE_MKLONG( p ) HB_MKLONG( *( BYTE * )( p ), ( ( BYTE * )( p ) )[ 1 ], ( ( BYTE * )( p ) )[ 2 ], ( ( BYTE * )( p ) )[ 3 ] ) #define HB_PCODE_MKULONG( p ) HB_MKULONG( *( BYTE * )( p ), ( ( BYTE * )( p ) )[ 1 ], ( ( BYTE * )( p ) )[ 2 ], ( ( BYTE * )( p ) )[ 3 ] ) + #define HB_ORD2DBL( o, d ) { \ + *( double * )( d ) = *( double * )( o ); \ + if ( ( ( BYTE * ) ( d ) )[ 0 ] & 0x80 ) { \ + ( ( BYTE * ) ( d ) )[ 0 ] ^= 0x80; \ + } else { \ + ( ( LONG * ) ( d ) )[ 0 ] ^= 0xFFFFFFFFL; \ + ( ( LONG * ) ( d ) )[ 1 ] ^= 0xFFFFFFFFL; \ + } } + #define HB_DBL2ORD( d, o ) { \ + *( double * )( o ) = *( double * )( d ); \ + if ( *( double * )( o ) >= 0.0 ) { \ + ( ( BYTE * ) ( o ) )[ 0 ] ^= 0x80; \ + } else { \ + ( ( LONG * ) ( o ) )[ 0 ] ^= 0xFFFFFFFFL; \ + ( ( LONG * ) ( o ) )[ 1 ] ^= 0xFFFFFFFFL; \ + } } + #if defined( __GNUC__ ) - #define HB_GET_LE_DOUBLE( p ) HB_SWAP_PDOUBLE( p ) - #define HB_PUT_LE_DOUBLE( p, d ) ( *( double * )( p ) = HB_SWAP_DOUBLE( d ) ) +/* Be careful with double conversion. Some machines can use mixed form + (Little/Big) for BYTE ORDER and WORD ORDER or even completely differ + internal representation */ + + #define HB_GET_LE_DOUBLE( p ) HB_PCODE_MKDOUBLE( p ) + #define HB_PUT_LE_DOUBLE( p, d ) ( *( double * )( p ) = HB_DOUBLE_TO_LE( d ) ) - #define HB_DOUBLE_FROM_LE( d ) HB_SWAP_DOUBLE( d ); #define HB_DOUBLE_TO_LE( d ) HB_DOUBLE_FROM_LE( d ) - #define HB_PCODE_MKDOUBLE( p ) HB_SWAP_PDOUBLE( p ) - - #define HB_GET_SORTDBL( v, p ) ( { \ - union { \ - double d; \ - BYTE buffer[ 8 ]; \ - } u; \ - u.d = HB_GET_BE_DOUBLE( p ); \ - if ( u.buffer[ 0 ] & 0x80 ) { \ - u.buffer[ 0 ] ^= 0x80; \ - } else { \ - ( ( LONG * ) ( u.buffer ) )[ 0 ] ^= 0xFFFFFFFFL; \ - ( ( LONG * ) ( u.buffer ) )[ 1 ] ^= 0xFFFFFFFFL; \ - } \ - v = u.d; \ - } ) - - #define HB_PUT_SORTDBL( p, v ) ( { \ - HB_PUT_BE_DOUBLE( p, v ); \ - if ( ( double ) ( v ) >= 0.0 ) { \ - ( ( BYTE * ) ( p ) )[ 0 ] ^= 0x80; \ - } else { \ - ( ( LONG * ) ( p ) )[ 0 ] ^= 0xFFFFFFFFL; \ - ( ( LONG * ) ( p ) )[ 1 ] ^= 0xFFFFFFFFL; \ - } \ - } ) - -/* #define HB_DOUBLE_FROM_LE( d ) \ ( { \ BYTE double_var[ 8 ]; \ @@ -359,7 +313,6 @@ u.buffer[ 7 ] = ( p )[ 0 ]; \ u.d; \ } ) -*/ #else #error Little-Endian IEEE 754 double type conversion unimplemented with a non-GCC compiler #endif diff --git a/harbour/source/pp/pptable.c b/harbour/source/pp/pptable.c index a566d1a415..4cc169c73e 100644 --- a/harbour/source/pp/pptable.c +++ b/harbour/source/pp/pptable.c @@ -433,8 +433,17 @@ void hb_pp_Table( void ) static COMMANDS sC___248 = {0,"SET","DIRCASE ( \1A00 )","Set(_SET_DIRCASE, \1A00 )",&sC___247 }; static COMMANDS sC___249 = {0,"SET","DIRSEPARATOR \1A30","Set(_SET_DIRSEPARATOR, \1A10 )",&sC___248 }; static COMMANDS sC___250 = {0,"SET","DIRSEPARATOR ( \1A00 )","Set(_SET_DIRSEPARATOR, \1A00 )",&sC___249 }; + static COMMANDS sC___251 = {0,"SET","MBLOCKSIZE TO \1A00","Set( _SET_MBLOCKSIZE, \1A00 )",&sC___250 }; + static COMMANDS sC___252 = {0,"SET","MEMOBLOCK TO \1A00","Set( _SET_MBLOCKSIZE, \1A00 )",&sC___251 }; + static COMMANDS sC___253 = {0,"SET","MFILEEXT TO \1A00","Set( _SET_MFILEEXT, \1A00 )",&sC___252 }; + static COMMANDS sC___254 = {0,"SET","AUTOSHARE TO \1A00","Set( _SET_AUTOSHARE, \1A00 )",&sC___253 }; + static COMMANDS sC___255 = {0,"SET","AUTOSHARE TO","Set( _SET_AUTOSHARE, 0 )",&sC___254 }; + static COMMANDS sC___256 = {0,"SET","AUTORDER TO \1A00","Set( _SET_AUTORDER, \1A00 )",&sC___255 }; + static COMMANDS sC___257 = {0,"SET","AUTORDER TO","Set( _SET_AUTORDER, 0 )",&sC___256 }; + static COMMANDS sC___258 = {0,"SET","STRICTREAD \1A20 ON,OFF,&>","Set(_SET_STRICTREAD,\1A30 )",&sC___257 }; + static COMMANDS sC___259 = {0,"SET","STRICTREAD (\1A00)","Set(_SET_STRICTREAD,\1A00 )",&sC___258 }; hb_pp_topDefine = &sD___56; - hb_pp_topCommand = &sC___250; + hb_pp_topCommand = &sC___259; hb_pp_topTranslate = NULL; } diff --git a/harbour/source/rdd/dbcmd.c b/harbour/source/rdd/dbcmd.c index f71ebe040e..72d12e4f9c 100644 --- a/harbour/source/rdd/dbcmd.c +++ b/harbour/source/rdd/dbcmd.c @@ -2645,13 +2645,9 @@ HB_FUNC( ORDKEYGOTO ) if( s_pCurrArea ) { - pOrderInfo.itmOrder = hb_param( 1, HB_IT_STRING ); - if( !pOrderInfo.itmOrder ) - pOrderInfo.itmOrder = hb_param( 1, HB_IT_NUMERIC ); - pOrderInfo.atomBagName = hb_param( 2, HB_IT_STRING ); - /* Either or both may be NIL */ - - pOrderInfo.itmNewVal = hb_param( 3 , HB_IT_NUMERIC ); + pOrderInfo.itmOrder = NULL; + pOrderInfo.atomBagName = NULL; + pOrderInfo.itmNewVal = hb_param( 1 , HB_IT_NUMERIC ); pOrderInfo.itmResult = hb_itemPutL( NULL, FALSE ); SELF_ORDINFO( ( AREAP ) s_pCurrArea->pArea, DBOI_POSITION, &pOrderInfo ); hb_retl( hb_itemGetL( pOrderInfo.itmResult ) ); diff --git a/harbour/source/rdd/dbfcdx/dbfcdx1.c b/harbour/source/rdd/dbfcdx/dbfcdx1.c index 8c2480dba0..a5881425e8 100644 --- a/harbour/source/rdd/dbfcdx/dbfcdx1.c +++ b/harbour/source/rdd/dbfcdx/dbfcdx1.c @@ -123,7 +123,7 @@ static void hb_cdxIndexPoolFree( LPCDXINDEX pIndex, int nPagesLeft ); /* split Root Page */ static int hb_cdxPageRootSplit( LPCDXPAGE pPage ); -static LPCDXKEY hb_cdxKeyNew( void ); + static RDDFUNCS cdxSuper; static RDDFUNCS cdxTable = @@ -489,7 +489,7 @@ static LPCDXKEY hb_cdxKeyPutC( LPCDXKEY pKey, char * szText, USHORT uiRealLen, U pKey->len = 0; } } - uiLen = szText ? strlen( szText ) : 0; + uiLen = (USHORT) ( szText ? strlen( szText ) : 0 ); if ( uiLen > uiRealLen ) uiLen = uiRealLen; pKey->len = uiRealLen; @@ -558,13 +558,15 @@ static LPCDXKEY hb_cdxKeyPutItem( LPCDXKEY pKey, PHB_ITEM pItem, ULONG ulRec, LP { BYTE buf[8], *ptr; BYTE len = 0; + double d; + ptr = &buf[0]; switch ( hb_itemType( pItem ) ) { case HB_IT_STRING: case HB_IT_STRING | HB_IT_MEMO: - ptr = pItem->item.asString.value; + ptr = ( BYTE * ) pItem->item.asString.value; len = ( BYTE ) HB_CDXMAXKEY( pItem->item.asString.length ); break; case HB_IT_INTEGER: @@ -573,15 +575,17 @@ static LPCDXKEY hb_cdxKeyPutItem( LPCDXKEY pKey, PHB_ITEM pItem, ULONG ulRec, LP #ifndef HB_LONG_LONG_OFF case HB_IT_LONGLONG: #endif - HB_PUT_SORTDBL( ptr, hb_itemGetND( pItem ) ); + d = hb_itemGetND( pItem ); + HB_DBL2ORD( &d, ptr ); len = 8; break; case HB_IT_DATE: - HB_PUT_SORTDBL( ptr, (double) hb_itemGetDL( pItem ) ); + d = (double) hb_itemGetDL( pItem ); + HB_DBL2ORD( &d, ptr ); len = 8; break; case HB_IT_LOGICAL: - *ptr = ( hb_itemGetL( pItem ) ? 'T' : 'F' ); + *ptr = (BYTE) ( hb_itemGetL( pItem ) ? 'T' : 'F' ); len = 1; break; default: @@ -595,7 +599,7 @@ static LPCDXKEY hb_cdxKeyPutItem( LPCDXKEY pKey, PHB_ITEM pItem, ULONG ulRec, LP pKey = hb_cdxKeyPut( pKey, ptr, len, ulRec ); #ifndef HB_CDP_SUPPORT_OFF if ( fTrans && pTag->uiType == 'C' ) - hb_cdpnTranslate( pKey->val, s_cdpage, pTag->pIndex->pArea->cdPage, pKey->len ); + hb_cdpnTranslate( ( char * ) pKey->val, s_cdpage, pTag->pIndex->pArea->cdPage, pKey->len ); #endif return pKey; } @@ -605,22 +609,22 @@ static LPCDXKEY hb_cdxKeyPutItem( LPCDXKEY pKey, PHB_ITEM pItem, ULONG ulRec, LP */ static PHB_ITEM hb_cdxKeyGetItem( LPCDXKEY pKey, PHB_ITEM pItem, USHORT uiType ) { + double d; + if ( pKey ) { - double d; - switch( uiType ) { case 'C': - pItem = hb_itemPutCL( pItem, pKey->val, pKey->len ); + pItem = hb_itemPutCL( pItem, ( char * ) pKey->val, pKey->len ); break; case 'N': - HB_GET_SORTDBL( d, pKey->val ) + HB_ORD2DBL( pKey->val, &d ); pItem = hb_itemPutND( pItem, d ); break; case 'D': - HB_GET_SORTDBL( d, pKey->val ) - pItem = hb_itemPutDL( pItem, (LONG) d ); + HB_ORD2DBL( pKey->val, &d ); + pItem = hb_itemPutDL( pItem, ( LONG ) d ); break; case 'L': pItem = hb_itemPutL( pItem, pKey->val[0] == 'T' ); @@ -876,7 +880,7 @@ static ULONG hb_cdxIndexGetAvailPage( LPCDXINDEX pIndex, BOOL bHeader ) { FHANDLE hFile = pIndex->hFile; BYTE byBuf[4]; - ULONG ulPos = 0; + ULONG ulPos; if ( pIndex->fReadonly ) { @@ -1297,7 +1301,7 @@ static BYTE * hb_cdxPageGetKeyVal( LPCDXPAGE pPage, SHORT iKey ) BYTE bTrail; iLen = pPage->TagParent->uiLen; - bTrail = ( pPage->TagParent->uiType == 'C' ) ? ' ' : '\0'; + bTrail = ( BYTE ) ( pPage->TagParent->uiType == 'C' ? ' ' : '\0' ); if ( iKey < pPage->bufKeyNum - 1 ) pPage->bufKeyNum = 0; if ( pPage->bufKeyNum == 0 ) @@ -1765,7 +1769,7 @@ static int hb_cdxPageLeafAddKey( LPCDXPAGE pPage, LPCDXKEY pKey ) } else { - pPage->pKeyBuf = hb_xrealloc( pPage->pKeyBuf, ( pPage->iKeys + 1 ) * iLen ); + pPage->pKeyBuf = (BYTE*) hb_xrealloc( pPage->pKeyBuf, ( pPage->iKeys + 1 ) * iLen ); } #ifndef HB_CDX_DBGCODE_OFF @@ -2578,7 +2582,7 @@ static int hb_cdxPageKeyIntBalance( LPCDXPAGE pPage, SHORT iChildRet ) if ( iKeys > 0 ) { - pPtr = pKeyPool = hb_xgrab( iKeys * iLen ); + pPtr = pKeyPool = (BYTE*) hb_xgrab( iKeys * iLen ); for ( i = 0; i < iBlncKeys; i++ ) { if ( childs[i]->iKeys > 0 ) @@ -3828,7 +3832,7 @@ static void hb_cdxIndexLoad( LPCDXINDEX pIndex, char * szBaseName ) hb_cdxTagKeyRead( pIndex->pCompound, TOP_RECORD ); while ( !pIndex->pCompound->TagEOF ) { - (*pTagPtr) = hb_cdxTagNew( pIndex, pIndex->pCompound->CurKey->val, + (*pTagPtr) = hb_cdxTagNew( pIndex, (char *) pIndex->pCompound->CurKey->val, pIndex->pCompound->CurKey->rec ); pTagPtr = &(*pTagPtr)->pNext; hb_cdxTagKeyRead( pIndex->pCompound, NEXT_RECORD ); @@ -4075,13 +4079,13 @@ static BOOL hb_cdxCurKeyRefresh( CDXAREAP pArea, LPCDXTAG pTag, BOOL fUniq ) hb_cdxKeyFree( pKey ); } } - return ( pTag->CurKey->rec == pArea->ulRecNo ); + return ( pTag->CurKey->rec != 0 && pTag->CurKey->rec == pArea->ulRecNo ); } /* * return number of keys in order */ -ERRCODE hb_cdxSkipUnique( CDXAREAP pArea, LPCDXTAG pTag, BOOL fForward ) +static ERRCODE hb_cdxSkipUnique( CDXAREAP pArea, LPCDXTAG pTag, BOOL fForward ) { ERRCODE retval; @@ -4156,7 +4160,7 @@ ERRCODE hb_cdxSkipUnique( CDXAREAP pArea, LPCDXTAG pTag, BOOL fForward ) } } hb_cdxIndexUnLockRead( pTag->pIndex ); - return SUCCESS; + return retval; } @@ -4165,12 +4169,9 @@ ERRCODE hb_cdxSkipUnique( CDXAREAP pArea, LPCDXTAG pTag, BOOL fForward ) */ static long hb_cdxDBOIKeyCount( CDXAREAP pArea, LPCDXTAG pTag, BOOL fFilters ) { - LPCDXKEY pCurKey; - LPCDXPAGE pPage; ULONG lKeyCount = 0; - pTag = hb_cdxGetActiveTag( pArea ); - + /* TODO: what with deleted flag? */ if ( fFilters && ! pArea->dbfi.itmCobExpr ) fFilters = FALSE; @@ -4206,6 +4207,7 @@ static long hb_cdxDBOIKeyCount( CDXAREAP pArea, LPCDXTAG pTag, BOOL fFilters ) } else if ( pTag ) { + LPCDXKEY pCurKey; hb_cdxIndexLockRead( pTag->pIndex ); pCurKey = hb_cdxKeyCopy( NULL, pTag->CurKey ); @@ -4223,6 +4225,7 @@ static long hb_cdxDBOIKeyCount( CDXAREAP pArea, LPCDXTAG pTag, BOOL fFilters ) } else { + LPCDXPAGE pPage; hb_cdxTagKeyRead( pTag, TOP_RECORD ); pPage = pTag->RootPage; while ( pPage->Child ) @@ -4259,20 +4262,14 @@ static long hb_cdxDBOIKeyCount( CDXAREAP pArea, LPCDXTAG pTag, BOOL fFilters ) */ static long hb_cdxDBOIKeyNo( CDXAREAP pArea, LPCDXTAG pTag, BOOL fFilters ) { - LPCDXKEY pCurKey; - LPCDXPAGE pPage; ULONG lKeyNo = 0; - pTag = hb_cdxGetActiveTag( pArea ); - + /* TODO: what with deleted flag? */ if ( fFilters && ! pArea->dbfi.itmCobExpr ) fFilters = 0; if ( pArea->fEof ) lKeyNo = 0; - else if ( pTag && ( pTag->CurKey->rec != pArea->ulRecNo ) ) - /* TODO: fix it */ - lKeyNo = 0; else if ( fFilters ) { PHB_ITEM pRecNo; @@ -4306,64 +4303,61 @@ static long hb_cdxDBOIKeyNo( CDXAREAP pArea, LPCDXTAG pTag, BOOL fFilters ) hb_cdxIndexLockRead( pTag->pIndex ); if ( hb_cdxCurKeyRefresh( pArea, pTag, FALSE ) ) { - pCurKey = hb_cdxKeyCopy( NULL, pTag->CurKey ); if ( pTag->topScope || pTag->bottomScope || pTag->UsrUnique ) { if ( hb_cdxBottomScope( pTag ) ) { + LPCDXKEY pCurKey = hb_cdxKeyCopy( NULL, pTag->CurKey ); while ( !pTag->TagBOF && !pTag->TagEOF && hb_cdxTopScope( pTag ) ) { lKeyNo++; hb_cdxTagKeyRead( pTag, PREV_RECORD ); } + pTag->fRePos = TRUE; + hb_cdxKeyCopy( pTag->CurKey, pCurKey ); + hb_cdxKeyFree( pCurKey ); } } else { - if ( !pTag->TagBOF && !pTag->TagEOF ) + LPCDXPAGE pPage = pTag->RootPage; + while ( pPage->Child ) + pPage = pPage->Child; + if ( pTag->UsrAscend ) { - pPage = pTag->RootPage; - while ( pPage->Child ) - pPage = pPage->Child; - if ( pTag->UsrAscend ) + lKeyNo = pPage->iCurKey + 1; + if ( pPage->Left != CDX_DUMMYNODE ) { - lKeyNo = pPage->iCurKey + 1; - if ( pPage->Left != CDX_DUMMYNODE ) + ULONG ulPage = pPage->Left; + pPage = hb_cdxPageNew( pTag, NULL, CDX_DUMMYNODE ); + pPage->Page = ulPage; + while ( pPage->Page != CDX_DUMMYNODE ) { - ULONG ulPage = pPage->Right; - pPage = hb_cdxPageNew( pTag, NULL, CDX_DUMMYNODE ); - pPage->Page = ulPage; - while ( pPage->Page != CDX_DUMMYNODE ) - { - hb_cdxPageLoad( pPage ); - lKeyNo += pPage->iKeys; - pPage->Page = pPage->Left; - } - hb_cdxPageFree( pPage, TRUE ); + hb_cdxPageLoad( pPage ); + lKeyNo += pPage->iKeys; + pPage->Page = pPage->Left; } + hb_cdxPageFree( pPage, TRUE ); } - else - { + } + else + { lKeyNo = pPage->iKeys - pPage->iCurKey; if ( pPage->Right != CDX_DUMMYNODE ) { ULONG ulPage = pPage->Right; pPage = hb_cdxPageNew( pTag, NULL, CDX_DUMMYNODE ); pPage->Page = ulPage; - while ( pPage->Page != CDX_DUMMYNODE ) - { - hb_cdxPageLoad( pPage ); - lKeyNo += pPage->iKeys; - pPage->Page = pPage->Right; - } - hb_cdxPageFree( pPage, TRUE ); + while ( pPage->Page != CDX_DUMMYNODE ) + { + hb_cdxPageLoad( pPage ); + lKeyNo += pPage->iKeys; + pPage->Page = pPage->Right; } + hb_cdxPageFree( pPage, TRUE ); } } } - pTag->fRePos = TRUE; - hb_cdxKeyCopy( pTag->CurKey, pCurKey ); - hb_cdxKeyFree( pCurKey ); } hb_cdxIndexUnLockRead( pTag->pIndex ); } @@ -4381,14 +4375,78 @@ static long hb_cdxDBOIKeyNo( CDXAREAP pArea, LPCDXTAG pTag, BOOL fFilters ) /* * DBOI_KEYGOTO goto specific logical record in the index file */ -static long hb_cdxDBOIKeyGoto( CDXAREAP pArea, LPCDXTAG pTag, BOOL fFilters ) +static ERRCODE hb_cdxDBOIKeyGoto( CDXAREAP pArea, LPCDXTAG pTag, ULONG ulKeyNo, BOOL fFilters ) { - /* TODO: DBOI_KEYGOTO goto specific logical record in the index file */ - HB_SYMBOL_UNUSED( pArea ); - HB_SYMBOL_UNUSED( pTag ); - HB_SYMBOL_UNUSED( fFilters ); + ERRCODE retval; - return 0; + /* TODO: what with deleted flag? */ + if ( fFilters && ! pArea->dbfi.itmCobExpr ) + fFilters = 0; + + if ( ulKeyNo == 0 ) + retval = hb_cdxGoEof( pArea ); + else if ( fFilters ) + { + USHORT uiTag = pArea->uiTag; + pArea->uiTag = hb_cdxGetTagNumber( pArea, pTag ); + retval = SELF_GOTOP( ( AREAP ) pArea ); + while ( !pArea->fEof && ulKeyNo-- ) + retval = SELF_SKIP( ( AREAP ) pArea, 1 ); + pArea->uiTag = uiTag; + } + else if ( pTag ) + { + hb_cdxIndexLockRead( pTag->pIndex ); + if ( pTag->topScope || pTag->bottomScope || pTag->UsrUnique ) + { + if ( pTag->topScope ) + hb_cdxTagKeyFind( pTag, pTag->topScopeKey ); + else + hb_cdxTagKeyRead( pTag, TOP_RECORD ); + while ( !pTag->TagBOF && !pTag->TagEOF && hb_cdxBottomScope( pTag ) && + --ulKeyNo ) + hb_cdxTagKeyRead( pTag, NEXT_RECORD ); + } + else + { + LPCDXPAGE pPage, pOwnerPage = NULL; + ULONG ulNextPg; + hb_cdxTagKeyRead( pTag, TOP_RECORD ); + pPage = pTag->RootPage; + while ( pPage->Child ) + { + pOwnerPage = pPage; + pPage = pPage->Child; + } + while ( (USHORT) pPage->iKeys < ulKeyNo && pOwnerPage && + ( ulNextPg = pTag->UsrAscend ? + pPage->Right : pPage->Left ) != CDX_DUMMYNODE ) + { + ulKeyNo -= pPage->iKeys; + pOwnerPage->Child = hb_cdxPageNew( pPage->TagParent, pPage->Owner, ulNextPg ); + hb_cdxPageFree( pPage, FALSE ); + pPage = pOwnerPage->Child; + } + if ( (USHORT) pPage->iKeys >= ulKeyNo ) + { + pPage->iCurKey = pTag->UsrAscend ? ulKeyNo - 1 : pPage->iKeys - ulKeyNo; + hb_cdxSetCurKey( pPage ); + } + else + pTag->CurKey->rec = 0; + } + hb_cdxIndexUnLockRead( pTag->pIndex ); + if ( pTag->CurKey->rec == 0 ) + retval = hb_cdxGoEof( pArea ); + else + retval = SELF_GOTO( ( AREAP ) pArea, pTag->CurKey->rec ); + } + else + { + retval = SELF_GOTO( ( AREAP ) pArea, ulKeyNo ); + } + + return retval; } @@ -4401,7 +4459,7 @@ static long hb_cdxDBOIKeyGoto( CDXAREAP pArea, LPCDXTAG pTag, BOOL fFilters ) /* ( DBENTRYP_BP ) hb_cdxFound : NULL */ /* ( DBENTRYP_V ) hb_cdxGoBottom */ -ERRCODE hb_cdxGoBottom( CDXAREAP pArea ) +static ERRCODE hb_cdxGoBottom( CDXAREAP pArea ) { LPCDXTAG pTag; ERRCODE retval; @@ -4433,7 +4491,7 @@ ERRCODE hb_cdxGoBottom( CDXAREAP pArea ) /* ( DBENTRYP_I ) hb_cdxGoToId : NULL */ /* ( DBENTRYP_V ) hb_cdxGoTop */ -ERRCODE hb_cdxGoTop( CDXAREAP pArea ) +static ERRCODE hb_cdxGoTop( CDXAREAP pArea ) { LPCDXTAG pTag; ERRCODE retval; @@ -4462,7 +4520,7 @@ ERRCODE hb_cdxGoTop( CDXAREAP pArea ) } /* ( DBENTRYP_BIB ) hb_cdxSeek */ -ERRCODE hb_cdxSeek( CDXAREAP pArea, BOOL fSoftSeek, PHB_ITEM pKeyItm, BOOL fFindLast ) +static ERRCODE hb_cdxSeek( CDXAREAP pArea, BOOL fSoftSeek, PHB_ITEM pKeyItm, BOOL fFindLast ) { LPCDXTAG pTag @@ -4546,7 +4604,7 @@ ERRCODE hb_cdxSeek( CDXAREAP pArea, BOOL fSoftSeek, PHB_ITEM pKeyItm, BOOL fFind /* ( DBENTRYP_L ) hb_cdxSkipFilter : NULL */ /* ( DBENTRYP_L ) hb_cdxSkipRaw */ -ERRCODE hb_cdxSkipRaw( CDXAREAP pArea, LONG lToSkip ) +static ERRCODE hb_cdxSkipRaw( CDXAREAP pArea, LONG lToSkip ) { LPCDXTAG pTag; ERRCODE retval; @@ -4630,7 +4688,7 @@ ERRCODE hb_cdxSkipRaw( CDXAREAP pArea, LONG lToSkip ) } } hb_cdxIndexUnLockRead( pTag->pIndex ); - return SUCCESS; + return retval; } /* ( DBENTRYP_VF ) hb_cdxAddField : NULL */ @@ -4651,7 +4709,7 @@ ERRCODE hb_cdxSkipRaw( CDXAREAP pArea, LONG lToSkip ) /* * Perform a write of WorkArea memory to the data store. */ -ERRCODE hb_cdxGoCold( CDXAREAP pArea ) +static ERRCODE hb_cdxGoCold( CDXAREAP pArea ) { BOOL fRecordChanged = pArea->fRecordChanged; BOOL fAppend = pArea->fAppend; @@ -4664,10 +4722,11 @@ ERRCODE hb_cdxGoCold( CDXAREAP pArea ) if ( ( fRecordChanged || pArea->fCdxAppend ) && pArea->lpIndexes ) { LPCDXTAG pTag = pArea->lpIndexes->TagList; - USHORT uiTag = 1; LPCDXKEY pKey = NULL; BOOL fAdd, fDel, fLck = FALSE; - +#if 0 + USHORT uiTag = 1; +#endif if ( pArea->fShared ) { if ( fAppend ) @@ -4768,7 +4827,9 @@ ERRCODE hb_cdxGoCold( CDXAREAP pArea ) else pTag = NULL; } +#if 0 ++uiTag; +#endif } if ( pKey ) hb_cdxKeyFree( pKey ); @@ -4781,7 +4842,7 @@ ERRCODE hb_cdxGoCold( CDXAREAP pArea ) /* * Mark the WorkArea data buffer as hot. */ -ERRCODE hb_cdxGoHot( CDXAREAP pArea ) +static ERRCODE hb_cdxGoHot( CDXAREAP pArea ) { HB_TRACE(HB_TR_DEBUG, ("hb_cdxGoHot(%p)", pArea)); @@ -4830,7 +4891,7 @@ ERRCODE hb_cdxGoHot( CDXAREAP pArea ) /* * Close the table in the WorkArea. */ -ERRCODE hb_cdxClose( CDXAREAP pArea ) +static ERRCODE hb_cdxClose( CDXAREAP pArea ) { HB_TRACE(HB_TR_DEBUG, ("hb_cdxClose(%p)", pArea)); @@ -4866,7 +4927,7 @@ ERRCODE hb_cdxClose( CDXAREAP pArea ) /* * Open a data store in the WorkArea. */ -ERRCODE hb_cdxOpen( CDXAREAP pArea, LPDBOPENINFO pOpenInfo ) +static ERRCODE hb_cdxOpen( CDXAREAP pArea, LPDBOPENINFO pOpenInfo ) { HB_TRACE(HB_TR_DEBUG, ("hb_cdxOpen(%p, %p)", pArea, pOpenInfo)); @@ -4898,7 +4959,7 @@ ERRCODE hb_cdxOpen( CDXAREAP pArea, LPDBOPENINFO pOpenInfo ) if ( hb_spFile( ( BYTE * ) szFileName, szSpFile ) ) { pOrderInfo.itmResult = hb_itemPutNI( NULL, 0 ); - pOrderInfo.atomBagName = hb_itemPutC( NULL, szSpFile ); + pOrderInfo.atomBagName = hb_itemPutC( NULL, (char *) szSpFile ); pOrderInfo.itmOrder = NULL; SELF_ORDLSTADD( ( AREAP ) pArea, &pOrderInfo ); pOrderInfo.itmOrder = hb_itemPutNI( NULL, hb_set.HB_SET_AUTORDER ); @@ -4921,7 +4982,7 @@ ERRCODE hb_cdxOpen( CDXAREAP pArea, LPDBOPENINFO pOpenInfo ) /* * Retrieve the size of the WorkArea structure. */ -ERRCODE hb_cdxStructSize( CDXAREAP pArea, USHORT * uiSize ) +static ERRCODE hb_cdxStructSize( CDXAREAP pArea, USHORT * uiSize ) { HB_TRACE(HB_TR_DEBUG, ("hb_cdxStrucSize(%p, %p)", pArea, uiSize)); HB_SYMBOL_UNUSED( pArea ); @@ -4934,7 +4995,7 @@ ERRCODE hb_cdxStructSize( CDXAREAP pArea, USHORT * uiSize ) /* * Obtain the name of replaceable database driver (RDD) subsystem. */ -ERRCODE hb_cdxSysName( CDXAREAP pArea, BYTE * pBuffer ) +static ERRCODE hb_cdxSysName( CDXAREAP pArea, BYTE * pBuffer ) { HB_TRACE(HB_TR_DEBUG, ("hb_cdxSysName(%p, %p)", pArea, pBuffer)); HB_SYMBOL_UNUSED( pArea ); @@ -4946,7 +5007,7 @@ ERRCODE hb_cdxSysName( CDXAREAP pArea, BYTE * pBuffer ) /* ( DBENTRYP_VEI ) hb_cdxEval : NULL */ /* ( DBENTRYP_V ) hb_cdxPack */ -extern ERRCODE hb_cdxPack( CDXAREAP pArea ) +static ERRCODE hb_cdxPack( CDXAREAP pArea ) { HB_TRACE(HB_TR_DEBUG, ("nb_cdxPack(%p)", pArea )); @@ -4967,7 +5028,7 @@ extern ERRCODE hb_cdxPack( CDXAREAP pArea ) /* ( DBENTRYP_VT ) hb_cdxTransRec : NULL */ /* ( DBENTRYP_V ) hb_cdxZap */ -extern ERRCODE hb_cdxZap ( CDXAREAP pArea ) +static ERRCODE hb_cdxZap ( CDXAREAP pArea ) { HB_TRACE(HB_TR_DEBUG, ("nb_cdxZap(%p)", pArea )); @@ -4995,7 +5056,7 @@ extern ERRCODE hb_cdxZap ( CDXAREAP pArea ) /* ( DBENTRYP_VR ) hb_cdxSetRel : NULL */ /* ( DBENTRYP_OI ) hb_cdxOrderListAdd */ -ERRCODE hb_cdxOrderListAdd( CDXAREAP pArea, LPDBORDERINFO pOrderInfo ) +static ERRCODE hb_cdxOrderListAdd( CDXAREAP pArea, LPDBORDERINFO pOrderInfo ) { USHORT uiFlags; FHANDLE hFile; @@ -5106,7 +5167,7 @@ ERRCODE hb_cdxOrderListAdd( CDXAREAP pArea, LPDBORDERINFO pOrderInfo ) pIndex = hb_cdxIndexNew( pArea ); pIndex->hFile = hFile; - pIndex->szFileName = hb_strdup( szSpFile ); + pIndex->szFileName = hb_strdup( (char *) szSpFile ); if ( pArea->lpIndexes == NULL ) { pArea->lpIndexes = pIndex; @@ -5139,7 +5200,7 @@ ERRCODE hb_cdxOrderListAdd( CDXAREAP pArea, LPDBORDERINFO pOrderInfo ) /* * Clear the current order list. */ -extern ERRCODE hb_cdxOrderListClear( CDXAREAP pArea ) +static ERRCODE hb_cdxOrderListClear( CDXAREAP pArea ) { HB_TRACE(HB_TR_DEBUG, ("cdxOrderListClear(%p)", pArea)); @@ -5156,7 +5217,7 @@ extern ERRCODE hb_cdxOrderListClear( CDXAREAP pArea ) /* ( DBENTRYP_VP ) hb_cdxOrderListDelete : NULL */ /* ( DBENTRYP_OI ) hb_cdxOrderListFocus */ -ERRCODE hb_cdxOrderListFocus( CDXAREAP pArea, LPDBORDERINFO pOrderInfo ) +static ERRCODE hb_cdxOrderListFocus( CDXAREAP pArea, LPDBORDERINFO pOrderInfo ) { LPCDXTAG pTag; @@ -5232,7 +5293,7 @@ static ERRCODE hb_cdxOrderListRebuild( CDXAREAP pArea ) /* * create new order */ -ERRCODE hb_cdxOrderCreate( CDXAREAP pArea, LPDBORDERCREATEINFO pOrderInfo ) +static ERRCODE hb_cdxOrderCreate( CDXAREAP pArea, LPDBORDERCREATEINFO pOrderInfo ) { ULONG ulRecNo; BOOL fNewFile, fOpenedIndex; @@ -5248,7 +5309,7 @@ ERRCODE hb_cdxOrderCreate( CDXAREAP pArea, LPDBORDERCREATEINFO pOrderInfo ) USHORT uiType, uiLen; BYTE bType; - pKeyExp = pForExp = NULL; + pForExp = NULL; pExpMacro = pForMacro = NULL; HB_TRACE(HB_TR_DEBUG, ("cdxOrderCreate(%p, %p)", pArea, pOrderInfo)); @@ -5441,7 +5502,7 @@ ERRCODE hb_cdxOrderCreate( CDXAREAP pArea, LPDBORDERCREATEINFO pOrderInfo ) } else { - strcpy( szFileName, szSpFile ); + strcpy( szFileName, ( char * ) szSpFile ); hFile = hb_spOpen( ( BYTE * ) szFileName, FO_READWRITE | ( pArea->fShared ? FO_DENYNONE : FO_EXCLUSIVE ) ); } @@ -5554,7 +5615,7 @@ ERRCODE hb_cdxOrderCreate( CDXAREAP pArea, LPDBORDERCREATEINFO pOrderInfo ) } /* ( DBENTRYP_OI ) hb_cdxOrderDestroy */ -ERRCODE hb_cdxOrderDestroy( CDXAREAP pArea, LPDBORDERINFO pOrderInfo ) +static ERRCODE hb_cdxOrderDestroy( CDXAREAP pArea, LPDBORDERINFO pOrderInfo ) { LPCDXINDEX pIndex, pIndexTmp; LPCDXTAG pTag; @@ -5624,7 +5685,7 @@ ERRCODE hb_cdxOrderDestroy( CDXAREAP pArea, LPDBORDERINFO pOrderInfo ) /* * Provides information about order management. */ -ERRCODE hb_cdxOrderInfo( CDXAREAP pArea, USHORT uiIndex, LPDBORDERINFO pOrderInfo ) +static ERRCODE hb_cdxOrderInfo( CDXAREAP pArea, USHORT uiIndex, LPDBORDERINFO pOrderInfo ) { LPCDXTAG pTag = NULL; USHORT uiTag = 0; @@ -5664,8 +5725,9 @@ ERRCODE hb_cdxOrderInfo( CDXAREAP pArea, USHORT uiIndex, LPDBORDERINFO pOrderInf if ( pOrderInfo->itmNewVal && HB_IS_NUMERIC( pOrderInfo->itmNewVal ) ) { /* TODO: DBOI_KEYGOTO goto specific logical record in the index file */ - pOrderInfo->itmResult = hb_itemPutNL( pOrderInfo->itmResult, - hb_cdxDBOIKeyGoto( pArea, pTag, TRUE ) ); + pOrderInfo->itmResult = hb_itemPutL( pOrderInfo->itmResult, + hb_cdxDBOIKeyGoto( pArea, pTag, + hb_itemGetNL( pOrderInfo->itmNewVal ), TRUE ) == SUCCESS ); } else pOrderInfo->itmResult = hb_itemPutNL( pOrderInfo->itmResult, @@ -6348,7 +6410,6 @@ static void hb_cdxSortLinkNew( LPSORTINFO pSort, LONG * NewLink ) static void hb_cdxSortSwapSendWord( LPSORTINFO pSort, BYTE * Value ) { LONG Tag; - BYTE * pce; BYTE bLen; double d; @@ -6357,10 +6418,8 @@ static void hb_cdxSortSwapSendWord( LPSORTINFO pSort, BYTE * Value ) bLen = Value[0]; bLen -= 8; Value++; - pce = Value + bLen; - HB_GET_SORTDBL( d, pce ); + HB_ORD2DBL( &Value[bLen], &d ); Tag = ( LONG ) d; - // hb_cdxSortOutputWord( pSort, Tag, Value, uiLen ); if ( pSort->pSwapPage->nCurPos + sizeof(SORTSWAPITEM) + bLen - 1 >= sizeof(pSort->pSwapPage->page) ) { if ( hb_fsWrite( pSort->hTempFile, (BYTE *) pSort->pSwapPage->page, pSort->pSwapPage->nCurPos ) != pSort->pSwapPage->nCurPos ) @@ -6426,7 +6485,7 @@ static void hb_cdxSortSwapFillPage( LPSORTINFO pSort ) static int hb_cdxSortSwapSavePage( LPSORTINFO pSort ) { SORTSWAPPAGE swap; - char *ptr; + BYTE *ptr; pSort->nSwapPages++; if ( ! pSort->hTempFile ) { @@ -6512,7 +6571,7 @@ static BOOL hb_cdxSortSwapGetNextKey( LPSORTINFO pSort, LONG * pKeyRec, BYTE * p USHORT winPage, nPage; ULONG winKeyRec; BYTE winKeyLen; - char * winKeyVal; + BYTE * winKeyVal; int iResult = 1; /* this way some compilers don't emit warnings */ @@ -6576,7 +6635,7 @@ static BOOL hb_cdxSortSwapGetNextKey( LPSORTINFO pSort, LONG * pKeyRec, BYTE * p } pPage->tmpRecNo = pItem->recno; pPage->tmpKeyLen = pItem->keyLen; - pPage->tmpKeyVal = pItem->key; + pPage->tmpKeyVal = ( BYTE * ) pItem->key; } return TRUE; } @@ -6590,7 +6649,7 @@ static int hb_cdxSortSwapBuildIndex( LPSORTINFO pSort ) { LPSORTSWAPPAGE pPage; LPSORTSWAPITEM pItem; - char *ptr; + BYTE *ptr; USHORT nPage; LONG nKeyRec; BYTE KeyVal[2][CDX_MAXKEY + 1], *pKeyVal, *pKeyPrevVal; @@ -6633,7 +6692,7 @@ static int hb_cdxSortSwapBuildIndex( LPSORTINFO pSort ) pItem = (LPSORTSWAPITEM) (pPage->page); pPage->tmpRecNo = pItem->recno; pPage->tmpKeyLen = pItem->keyLen; - pPage->tmpKeyVal = pItem->key; + pPage->tmpKeyVal = ( BYTE * ) pItem->key; hb_fsSeek( pSort->hTempFile, pPage->nFileOffset + pPage->pageLen, SEEK_SET ); #ifdef CDXDEBUG @@ -6651,8 +6710,8 @@ static int hb_cdxSortSwapBuildIndex( LPSORTINFO pSort ) { if ( pKeyPrevVal ) { if ( nKeyPrevLen == nKeyLen ) { - if (! hb_cdxSortKeyValCompare( pSort->CurTag, (char *) pKeyPrevVal, (BYTE) nKeyPrevLen, - (char *) pKeyVal, (BYTE) nKeyLen ) ) + if (! hb_cdxSortKeyValCompare( pSort->CurTag, pKeyPrevVal, (BYTE) nKeyPrevLen, + pKeyVal, (BYTE) nKeyLen ) ) { continue; } @@ -6714,10 +6773,12 @@ static void hb_cdxSortInsertWord( LPSORTINFO pSort, LONG Tag, char * Value, USHORT uiLen ) { char s[ 8 ]; + double d; USHORT cc, nc; LPSORTDATA wx; - HB_PUT_SORTDBL( s, ( double ) Tag ); + d = ( double ) Tag; + HB_DBL2ORD( &d, s ); if( pSort->NodeLimit - pSort->NodeCur < uiLen + 8 ) { @@ -7025,16 +7086,14 @@ static void hb_cdxSortRecurseDict( LPSORTINFO pSort, LONG WPtr, LONG WBgn ) static void hb_cdxSortSendWord( LPSORTINFO pSort, BYTE * Value ) { LONG Tag; - char * pce; USHORT uiLen; double d; uiLen = ( USHORT ) Value[0]; Value++; - pce = (char *) (Value + uiLen - 8) ; - HB_GET_SORTDBL( d, pce ); + HB_ORD2DBL( &Value[uiLen - 8], &d ); Tag = ( LONG ) d; - hb_cdxSortOutputWord( pSort, Tag, Value, uiLen-8 ); + hb_cdxSortOutputWord( pSort, Tag, Value, uiLen - 8 ); } static void hb_cdxSortOutputWord( LPSORTINFO pSort, LONG Tag, BYTE * Value, @@ -7117,7 +7176,7 @@ static void hb_cdxSortAddExternal( LPSORTINFO pSort, USHORT Lvl, LONG Tag, LONG memset( pSort->NodeList[ Lvl ]->cdxu.External.ExtData, 0, sizeof( pSort->NodeList[ Lvl ]->cdxu.External.ExtData ) ); pSort->NodeList[ Lvl ]->cdxu.External.FreeSpace = CDX_EXTERNAL_SPACE; - hb_cdxSortKeyPut( pSort->LastKey, "", 0, 0, ( pSort->CurTag->uiType == 'C' ) ); + hb_cdxSortKeyPut( pSort->LastKey, (BYTE*) "", 0, 0, ( pSort->CurTag->uiType == 'C' ) ); } ct = ( USHORT ) ( pSort->CurTag->uiLen - Value->length ); cd = hb_cdxSortKeyFindDup( Value, pSort->LastKey ); @@ -7316,6 +7375,8 @@ static void hb_cdxTagDoIndex( LPCDXTAG pTag ) if ( bForOk ) { + double d; + if ( pTag->nField ) { SELF_GETVALUE( ( AREAP ) pArea, pTag->nField, pItem ); @@ -7349,12 +7410,14 @@ static void hb_cdxTagDoIndex( LPCDXTAG pTag ) case HB_IT_LONGLONG: #endif case HB_IT_DOUBLE: - HB_PUT_SORTDBL( &cTemp[0], hb_itemGetND( pItem ) ); + d = hb_itemGetND( pItem ); + HB_DBL2ORD( &d, &cTemp[0] ); hb_cdxSortInsertWord( pSort, pArea->ulRecNo, (char *) cTemp, 8 ); break; case HB_IT_DATE: - HB_PUT_SORTDBL( &cTemp[0], (double) hb_itemGetDL( pItem ) ); + d = (double) hb_itemGetDL( pItem ); + HB_DBL2ORD( &d, &cTemp[0] ); hb_cdxSortInsertWord( pSort, pArea->ulRecNo, (char *) cTemp, 8 ); break; diff --git a/harbour/source/rdd/dbfntx/dbfntx1.c b/harbour/source/rdd/dbfntx/dbfntx1.c index 20e3f93f80..44b59c22cc 100644 --- a/harbour/source/rdd/dbfntx/dbfntx1.c +++ b/harbour/source/rdd/dbfntx/dbfntx1.c @@ -2606,9 +2606,9 @@ static ERRCODE hb_ntxIndexCreate( LPNTXINDEX pIndex ) printf( "ntxCreateOrder" ); } } - if( pArea->lpdbOrdCondInfo ) + if( pArea->lpdbOrdCondInfo || pArea->lpdbRelations ) { - if( !pArea->lpdbOrdCondInfo->fAll ) + if( !pArea->lpdbOrdCondInfo->fAll || pArea->lpdbRelations ) SELF_SKIP( ( AREAP ) pArea, 1 ); if( pArea->lpdbOrdCondInfo->lStep ) { @@ -2623,8 +2623,8 @@ static ERRCODE hb_ntxIndexCreate( LPNTXINDEX pIndex ) hb_vmSend( 0 ); } } - else if( pArea->lpdbRelations ) - SELF_SKIP( ( AREAP ) pArea, 1 ); + // else if( pArea->lpdbRelations ) + // SELF_SKIP( ( AREAP ) pArea, 1 ); } hb_ntxSortKeyEnd( pTag, &sortInfo ); if( ( !pArea->lpdbOrdCondInfo || pArea->lpdbOrdCondInfo->fAll ) && !pArea->lpdbRelations )