2009-11-09 18:45 UTC+0200 Mindaugas Kavaliauskas (dbtopas/at/dbtopas.lt)

* harbour/contrib/rddads/adsx.c
  * harbour/contrib/rddsql/hbrddsql.h
  * harbour/contrib/rddsql/sqlmix.c
    * updated to use hb_cdpcmp()
This commit is contained in:
Mindaugas Kavaliauskas
2009-11-09 16:48:32 +00:00
parent bf419526fe
commit 2f44c8201e
4 changed files with 30 additions and 166 deletions

View File

@@ -17,6 +17,12 @@
past entries belonging to author(s): Viktor Szakats.
*/
2009-11-09 18:45 UTC+0200 Mindaugas Kavaliauskas (dbtopas/at/dbtopas.lt)
* harbour/contrib/rddads/adsx.c
* harbour/contrib/rddsql/hbrddsql.h
* harbour/contrib/rddsql/sqlmix.c
* updated to use hb_cdpcmp()
2009-11-09 17:33 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/bin/hb-func.sh
! added links with full version number to harbour shared library
@@ -406,7 +412,7 @@
* minor formatting
2009-11-06 16:15 UTC+0200 Mindaugas Kavaliauskas (dbtopas/at/dbtopas.lt)
* harbour/contib/rddads/adsfunc.c
* harbour/contrib/rddads/adsfunc.c
* AdsIsConnectionAlive() guarded using #if ADS_LIB_VERSION >= 800
2009-11-06 00:15 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
@@ -48125,7 +48131,7 @@
* small cleanup in comment
2009-02-03 11:45 UTC+0100 Lorenzo Fiorini (lorenzo.fiorini/at/gmail.com)
* contib/xhb/hblognet.prg
* contrib/xhb/hblognet.prg
* fixed thread function names
2009-02-03 03:02 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl)

View File

@@ -101,7 +101,7 @@ typedef struct _MIXTAG
ULONG ulRecMax;
ULONG ulRecCount;
BYTE* pSortTable; /* National sorttable for character key tags, NULL otherwise */
PHB_CODEPAGE pCodepage; /* National sorttable for character key tags, NULL otherwise */
ULONG ulKeyNo;
} MIXTAG, *LPMIXTAG;
@@ -115,8 +115,6 @@ typedef struct _ADSXAREA_
LPMIXTAG pTagList;
LPMIXTAG pTagCurrent;
BYTE* pSortTable;
} ADSXAREA, *ADSXAREAP;
@@ -274,55 +272,13 @@ static void mixKeyFree( LPMIXKEY pKey )
}
static BYTE * mixBuildSortTable( PHB_CODEPAGE pCodepage )
{
BYTE* pSortTable;
const BYTE* pChars;
int i, j;
BYTE c;
pSortTable = ( BYTE * ) hb_xgrab( 256 );
if( pCodepage && pCodepage->sort )
{
pChars = pCodepage->sort;
c = 0;
for( i = 0; i < 256; i++ )
{
for( j = 0; j < 256; j++ )
{
if( pChars[ j ] == ( BYTE ) i )
{
pSortTable[ j ] = c;
c++;
}
}
}
}
else
{
for( i = 0; i < 256; i++ )
pSortTable[ i ] = ( BYTE ) i;
}
return pSortTable;
}
static int mixQSortCompare( LPMIXKEY p1, LPMIXKEY p2, USHORT uiLen, BYTE* pSortTable )
static int mixQSortCompare( LPMIXKEY p1, LPMIXKEY p2, USHORT uiLen, PHB_CODEPAGE pCodepage )
{
int i;
if( pSortTable )
if( pCodepage )
{
int j = 0;
i = 0;
while( i == 0 && j < (int) uiLen )
{
i = pSortTable[ p1->val[ j ] ] - pSortTable[ p2->val[ j ] ];
j++;
}
i = hb_cdpcmp( ( const char * ) p1->val, ( ULONG ) uiLen, ( const char * ) p2->val, ( ULONG ) uiLen, pCodepage, 0 );
}
else
i = memcmp( p1->val, p2->val, uiLen );
@@ -345,7 +301,7 @@ static int mixQSortCompare( LPMIXKEY p1, LPMIXKEY p2, USHORT uiLen, BYTE* pSortT
}
static void mixQSort( LPMIXKEY* pKeys, ULONG left, ULONG right, USHORT uiLen, BYTE* pSortTable )
static void mixQSort( LPMIXKEY* pKeys, ULONG left, ULONG right, USHORT uiLen, PHB_CODEPAGE pCodepage )
{
ULONG l, r;
LPMIXKEY x, h;
@@ -356,9 +312,9 @@ static void mixQSort( LPMIXKEY* pKeys, ULONG left, ULONG right, USHORT uiLen, BY
x = pKeys[ (l + r) / 2 ];
do {
while( mixQSortCompare( x, pKeys[ l ], uiLen, pSortTable ) > 0 )
while( mixQSortCompare( x, pKeys[ l ], uiLen, pCodepage ) > 0 )
l++;
while( mixQSortCompare( pKeys[ r ], x, uiLen, pSortTable ) > 0 )
while( mixQSortCompare( pKeys[ r ], x, uiLen, pCodepage ) > 0 )
r--;
if( l < r )
@@ -370,10 +326,10 @@ static void mixQSort( LPMIXKEY* pKeys, ULONG left, ULONG right, USHORT uiLen, BY
while( l < r );
if( left < r && ( r != right ) )
mixQSort( pKeys, left, r, uiLen, pSortTable );
mixQSort( pKeys, left, r, uiLen, pCodepage );
if( l < right && ( l != left ) )
mixQSort( pKeys, l, right, uiLen, pSortTable );
mixQSort( pKeys, l, right, uiLen, pCodepage );
}
@@ -394,7 +350,7 @@ static LPMIXKEY mixFindKey( LPMIXTAG pTag, LPMIXKEY pKey, ULONG* ulKeyPos )
while( l < r )
{
i = mixQSortCompare( pTag->pKeys[ (l + r) / 2 ], pKey, pTag->uiLen, pTag->pSortTable );
i = mixQSortCompare( pTag->pKeys[ (l + r) / 2 ], pKey, pTag->uiLen, pTag->pCodepage );
if( i < 0 )
l = (l + r) / 2 + 1;
@@ -406,7 +362,7 @@ static LPMIXKEY mixFindKey( LPMIXTAG pTag, LPMIXKEY pKey, ULONG* ulKeyPos )
if( i )
{
i = mixQSortCompare( pTag->pKeys[ l ], pKey, pTag->uiLen, pTag->pSortTable );
i = mixQSortCompare( pTag->pKeys[ l ], pKey, pTag->uiLen, pTag->pCodepage );
if( i < 0 )
l++;
}
@@ -420,7 +376,7 @@ static LPMIXKEY mixFindKey( LPMIXTAG pTag, LPMIXKEY pKey, ULONG* ulKeyPos )
static int mixCompareKey( LPMIXTAG pTag, ULONG ulKeyPos, LPMIXKEY pKey )
{
return mixQSortCompare( pTag->pKeys[ ulKeyPos ], pKey, pTag->uiLen, pTag->pSortTable );
return mixQSortCompare( pTag->pKeys[ ulKeyPos ], pKey, pTag->uiLen, pTag->pCodepage );
}
@@ -455,8 +411,8 @@ static LPMIXTAG mixTagCreate( const char * szTagName, PHB_ITEM pKeyExpr, PHB_ITE
pTag->uiLen = uiLen;
/* Use national support */
if( bType == 'C' )
pTag->pSortTable = pArea->pSortTable;
if( bType == 'C' && pArea->adsarea.area.cdPage && pArea->adsarea.area.cdPage->sort )
pTag->pCodepage = pArea->adsarea.area.cdPage;
pTag->pKeys = (LPMIXKEY*) hb_xgrab( sizeof( LPMIXKEY ) * MIX_KEYPOOLFIRST );
pTag->ulRecMax = MIX_KEYPOOLFIRST;
@@ -558,7 +514,7 @@ static LPMIXTAG mixTagCreate( const char * szTagName, PHB_ITEM pKeyExpr, PHB_ITE
/* QuickSort */
if( pTag->ulRecCount >= 2 )
mixQSort( pTag->pKeys, 0, pTag->ulRecCount - 1, uiLen, pTag->pSortTable );
mixQSort( pTag->pKeys, 0, pTag->ulRecCount - 1, uiLen, pTag->pCodepage );
return pTag;
}
@@ -831,11 +787,6 @@ static HB_ERRCODE adsxClose( ADSXAREAP pArea )
pArea->pTagList = pArea->pTagList->pNext;
mixTagDestroy( pTag );
}
if( pArea->pSortTable )
{
hb_xfree( pArea->pSortTable );
pArea->pSortTable = NULL;
}
return SUPER_CLOSE( (AREAP) pArea );
}
@@ -852,8 +803,6 @@ static HB_ERRCODE adsxCreate( ADSXAREAP pArea, LPDBOPENINFO pCreateInfo )
}
else
pArea->adsarea.area.cdPage = hb_vmCDP();
pArea->pSortTable = mixBuildSortTable( pArea->adsarea.area.cdPage );
return HB_SUCCESS;
}
return HB_FAILURE;
@@ -872,8 +821,6 @@ static HB_ERRCODE adsxOpen( ADSXAREAP pArea, LPDBOPENINFO pOpenInfo )
}
else
pArea->adsarea.area.cdPage = hb_vmCDP();
pArea->pSortTable = mixBuildSortTable( pArea->adsarea.area.cdPage );
return HB_SUCCESS;
}
return HB_FAILURE;

View File

@@ -206,7 +206,7 @@ typedef struct _MIXTAG
PMIXKEY HotKey;
BOOL HotFor;
BYTE* pSortTable; /* National sorttable for character key tags, NULL otherwise */
PHB_CODEPAGE pCodepage; /* National sorttable for character key tags, NULL otherwise */
} MIXTAG, *PMIXTAG;
@@ -220,8 +220,7 @@ typedef struct _SQLMIXAREA
PMIXTAG pTagList;
PMIXTAG pTag;
BYTE* pSortTable;
PHB_CODEPAGE pCodepage;
} SQLMIXAREA, *SQLMIXAREAP;

View File

@@ -249,55 +249,11 @@ static void hb_mixKeyFree( PMIXKEY pKey )
}
#if 0
/* This function is unused */
static int hb_mixKeyCompareValue( PMIXTAG pTag, PMIXKEY pKey1, PMIXKEY pKey2, unsigned int uiLen )
{
BYTE* pSortTable = pTag->pSortTable;
unsigned int ui, uiSize;
int i;
if ( ! pKey1->notnul || ! pKey2->notnul )
{
return (int) pKey1->notnul - (int) pKey2->notnul;
}
i = 0;
uiSize = pTag->uiKeyLen > uiLen ? uiLen : pTag->uiKeyLen;
if ( pSortTable )
{
ui = 0;
while ( i == 0 && ui < uiSize )
{
i = pSortTable[ pKey1->val[ ui ] ] - pSortTable[ pKey2->val[ ui ] ];
ui++;
}
}
else
{
if ( uiSize > 0 )
i = memcmp( pKey1->val, pKey2->val, uiSize );
}
if ( i == 0 )
{
/* This condition seems inverted, but it's ok for seek last */
if ( pTag->uiKeyLen > uiLen )
i = -1;
}
return i;
}
#endif
static int hb_mixKeyCompare( PMIXTAG pTag, PMIXKEY pKey1, PMIXKEY pKey2, unsigned int uiLen )
{
BYTE* pSortTable = pTag->pSortTable;
unsigned int ui, uiSize;
unsigned int uiSize;
int i;
if ( ! pKey1->notnul || ! pKey2->notnul )
{
return (int) pKey1->notnul - (int) pKey2->notnul;
@@ -306,14 +262,9 @@ static int hb_mixKeyCompare( PMIXTAG pTag, PMIXKEY pKey1, PMIXKEY pKey2, unsigne
i = 0;
uiSize = pTag->uiKeyLen > uiLen ? uiLen : pTag->uiKeyLen;
if ( pSortTable )
if ( pTag->pCodepage )
{
ui = 0;
while ( i == 0 && ui < uiSize )
{
i = pSortTable[ pKey1->val[ ui ] ] - pSortTable[ pKey2->val[ ui ] ];
ui++;
}
i = hb_cdpcmp( ( const char * ) pKey1->val, ( ULONG ) uiSize, ( const char * ) pKey2->val, ( ULONG ) uiSize, pTag->pCodepage, 0 );
}
else
{
@@ -841,41 +792,6 @@ static BOOL hb_mixTagDelKey( PMIXTAG pTag, PMIXKEY pKey )
}
static BYTE* hb_mixBuildSortTable( PHB_CODEPAGE pCodepage )
{
BYTE* pSortTable;
const BYTE* pChars;
int i, j;
BYTE c;
pSortTable = ( BYTE * ) hb_xalloc( 256 );
if ( pCodepage && pCodepage->sort )
{
pChars = pCodepage->sort;
c = 0;
for ( i = 0; i < 256; i++ )
{
for ( j = 0; j < 256; j++ )
{
if ( pChars[ j ] == ( BYTE ) i )
{
pSortTable[ j ] = c;
c++;
}
}
}
}
else
{
for ( i = 0; i < 256; i++ )
pSortTable[ i ] = ( BYTE ) i;
}
return pSortTable;
}
static PMIXTAG hb_mixTagCreate( const char* szTagName, PHB_ITEM pKeyExpr, PHB_ITEM pKeyItem, PHB_ITEM pForItem, PHB_ITEM pWhileItem, BYTE bType, unsigned int uiKeyLen, SQLMIXAREAP pArea )
{
PMIXTAG pTag;
@@ -909,11 +825,10 @@ static PMIXTAG hb_mixTagCreate( const char* szTagName, PHB_ITEM pKeyExpr, PHB_IT
/* Use national support */
if ( bType == 'C' )
{
if( pArea->sqlarea.area.cdPage && pArea->sqlarea.area.cdPage->sort && !pArea->pSortTable )
if( pArea->sqlarea.area.cdPage && pArea->sqlarea.area.cdPage->sort )
{
pArea->pSortTable = hb_mixBuildSortTable( pArea->sqlarea.area.cdPage );
pTag->pCodepage = pArea->sqlarea.area.cdPage;
}
pTag->pSortTable = pArea->pSortTable;
}
pTag->Root = hb_mixTagCreateNode( pTag, TRUE );
@@ -1645,9 +1560,6 @@ static HB_ERRCODE sqlmixClose( SQLMIXAREAP pArea )
if ( SELF_ORDLSTCLEAR( (AREAP) pArea ) == HB_FAILURE )
return HB_FAILURE;
if ( pArea->pSortTable )
hb_xfree( pArea->pSortTable );
return HB_SUCCESS;
}