2006-09-05 16:40 UTC+0300 Alexander Kresin <alex@belacy.belgorod.su>

This commit is contained in:
Alexander S.Kresin
2006-09-11 12:42:06 +00:00
parent 45033c962e
commit eee1c71e5e
5 changed files with 91 additions and 46 deletions

View File

@@ -8,6 +8,17 @@
2002-12-01 13:30 UTC+0100 Foo Bar <foo.bar@foobar.org>
*/
create separate meta class for each class with CLASS members and
<clasName>() function always return such meta class object so for full
Class(y) compatibility we need to generate differ .prg code.
But all such modifications now can be done on preprocessor and
.prg level and they will not need .c code modification.
We should make them to give user interface for our new OOP features.
Now I'm waiting for reports about any problems with current classy
code.
2006-09-11 20:30 UTC+0300 Alexander Kresin <alex@belacy.belgorod.su>
* source/vm/itemapi.c
! Bug fixed, which was introduced while last commit

View File

@@ -172,7 +172,7 @@ extern HB_EXPORT PHB_CODEPAGE hb_cdpSelect( PHB_CODEPAGE );
extern HB_EXPORT PHB_CODEPAGE hb_cdpFind( char * );
extern HB_EXPORT void hb_cdpTranslate( char *, PHB_CODEPAGE, PHB_CODEPAGE );
extern HB_EXPORT void hb_cdpnTranslate( char *, PHB_CODEPAGE, PHB_CODEPAGE, ULONG );
extern HB_EXPORT int hb_cdpcmp( char *, char *, ULONG, PHB_CODEPAGE, ULONG * );
extern HB_EXPORT int hb_cdpcmp( char* szFirst, ULONG ulLenFirst, char* szSecond, ULONG ulLenSecond, PHB_CODEPAGE cdpage, BOOL bExact );
extern HB_EXPORT int hb_cdpchrcmp( char, char, PHB_CODEPAGE );
extern HB_EXPORT void hb_cdpReleaseAll( void );

View File

@@ -651,7 +651,7 @@ static int hb_ntxValCompare( LPTAGINFO pTag, char* val1, int len1,
{
#ifndef HB_CDP_SUPPORT_OFF
if( pTag->Owner->Owner->cdPage->lSort )
iResult = hb_cdpcmp( val1, val2, ( ULONG ) iLimit, pTag->Owner->Owner->cdPage, NULL );
iResult = hb_cdpcmp( val1, ( ULONG ) iLimit, val2, ( ULONG ) iLimit, pTag->Owner->Owner->cdPage, 0 );
else
#endif
iResult = memcmp( val1, val2, iLimit );

View File

@@ -278,7 +278,7 @@ HB_EXPORT BOOL hb_cdpRegister( PHB_CODEPAGE cdpage )
s_cdpList[ iPos ] = cdpage;
cdpage->lSort = FALSE;
cdpage->lSort = cdpage->lAccInterleave || cdpage->lAccEqual;
cdpage->lChClone = FALSE;
if( cdpage->nChars )
{
@@ -337,10 +337,10 @@ HB_EXPORT BOOL hb_cdpRegister( PHB_CODEPAGE cdpage )
}
else if( *ptrUpper == '.' )
{
multi[nMulti].cFirst[0] = *(ptrLower+1);
multi[nMulti].cFirst[1] = *(ptrUpper+1);
multi[nMulti].cLast[0] = *(ptrLower+2);
multi[nMulti].cLast[1] = *(ptrUpper+2);
multi[nMulti].cFirst[0] = *(ptrUpper+1);
multi[nMulti].cFirst[1] = *(ptrLower+1);
multi[nMulti].cLast[0] = *(ptrUpper+2);
multi[nMulti].cLast[1] = *(ptrLower+2);
multi[nMulti].nCode = i;
for( ptr=ptrUpper+4; *ptr; ptr++ )
@@ -352,6 +352,7 @@ HB_EXPORT BOOL hb_cdpRegister( PHB_CODEPAGE cdpage )
nMulti ++;
ptrUpper --; ptrLower --;
cdpage->lSort = TRUE;
continue;
}
iu = (((int)*ptrUpper)&255);
@@ -387,6 +388,13 @@ HB_EXPORT BOOL hb_cdpRegister( PHB_CODEPAGE cdpage )
cdpage->s_chars[i*8+3],cdpage->s_chars[i*8+4],
cdpage->s_chars[i*8+5],cdpage->s_chars[i*8+6],
cdpage->s_chars[i*8+7] );
if( nMulti )
{
printf( "\n" );
for( i=0; i<nMulti; i++ )
printf( "\n %c%c %c%c %d",multi[i].cFirst[0],
multi[i].cFirst[1],multi[i].cLast[0],multi[i].cLast[1],multi[i].nCode );
}
*/
if( nMulti )
{
@@ -694,12 +702,15 @@ HB_EXPORT int hb_cdpchrcmp( char cFirst, char cSecond, PHB_CODEPAGE cdpage )
}
HB_EXPORT int hb_cdpcmp( char* szFirst, char* szSecond, ULONG ulLen, PHB_CODEPAGE cdpage, ULONG* piCounter )
HB_EXPORT int hb_cdpcmp( char* szFirst, ULONG ulLenFirst, char* szSecond, ULONG ulLenSecond, PHB_CODEPAGE cdpage, BOOL bExact )
{
ULONG ul;
ULONG ul, ulLen;
int iRet = 0, n1, n2;
int lAcc1 = 0, lAcc2 = 0;
/* printf( "\nhb_cdpcmp-0 %s %s",szFirst,szSecond ); */
ulLen = ulLenFirst < ulLenSecond ? ulLenFirst : ulLenSecond;
for( ul=0; ul<ulLen; ul++,szFirst++,szSecond++ )
if( *szFirst != *szSecond )
{
@@ -711,7 +722,7 @@ HB_EXPORT int hb_cdpcmp( char* szFirst, char* szSecond, ULONG ulLen, PHB_CODEPAG
/* printf( "\n|%c|%c|%d %d %d",*szFirst,*szSecond,((int)*szFirst)&255,((int)*szSecond)&255,iRet ); */
break;
}
if( n1 == n2 )
if( ( n1 == n2 ) && !bExact )
{
continue;
}
@@ -720,36 +731,49 @@ HB_EXPORT int hb_cdpcmp( char* szFirst, char* szSecond, ULONG ulLen, PHB_CODEPAG
int j, nd1 = 0, nd2 = 0;
PHB_MULTICHAR pmulti = cdpage->multi;
/* printf( "\nhb_cdpcmp-1 %c %c",*szFirst,*szSecond ); */
ul ++;
for( j=0; j<cdpage->nMulti; j++,pmulti++ )
{
if( ( *szFirst == pmulti->cLast[0] ||
*szFirst == pmulti->cLast[1] ) &&
( *(szFirst-1) == pmulti->cFirst[0] ||
*(szFirst-1) == pmulti->cFirst[1] ) )
nd1 = pmulti->nCode;
if( ( *szSecond == pmulti->cLast[0] ||
*szSecond == pmulti->cLast[1] ) &&
( *(szSecond-1) == pmulti->cFirst[0] ||
*(szSecond-1) == pmulti->cFirst[1] ) )
nd2 = pmulti->nCode;
if( ( ul < ulLenFirst ) &&
( *(szFirst+1) == pmulti->cLast[0] ||
*(szFirst+1) == pmulti->cLast[1] ) &&
( *szFirst == pmulti->cFirst[0] ||
*szFirst == pmulti->cFirst[1] ) )
{
nd1 = pmulti->nCode +
( (*szFirst == pmulti->cFirst[0])? 0 :
( cdpage->nChars + ( (cdpage->lLatin)? 6:0 ) ) );
}
if( ( ul < ulLenSecond ) &&
( *(szSecond+1) == pmulti->cLast[0] ||
*(szSecond+1) == pmulti->cLast[1] ) &&
( *szSecond == pmulti->cFirst[0] ||
*szSecond == pmulti->cFirst[1] ) )
{
nd2 = pmulti->nCode +
( (*szSecond == pmulti->cFirst[0])? 0 :
( cdpage->nChars + ( (cdpage->lLatin)? 6:0 ) ) );
}
}
/* printf( "\nhb_cdpcmp-2 %d %d",nd1,nd2 ); */
ul --;
if( nd1 && !nd2 )
{
n2 = (int)cdpage->s_chars[ ((int)*(szSecond-1))&255 ];
n2 = (int)cdpage->s_chars[ ((int)(*szSecond))&255 ];
iRet = ( nd1 < n2 )? -1 : 1;
/* printf( "\nhb_cdpcmp-2 %d %d %d",iRet,nd1,n2 ); */
break;
}
else if( !nd1 && nd2 )
{
n1 = (int)cdpage->s_chars[ ((int)*(szFirst-1))&255 ];
n1 = (int)cdpage->s_chars[ ((int)(*szFirst))&255 ];
iRet = ( n1 < nd2 )? -1 : 1;
/* printf( "\nhb_cdpcmp-3 %d %d %d",iRet,n1,nd2 ); */
break;
}
else if( nd1 && nd2 )
{
iRet = ( nd1 < nd2 )? -1 : 1;
iRet = ( nd1 == nd2 )? ( ( *(szFirst+1) < *(szSecond+1) )? -1 : 1 ) :
( ( nd1 < nd2 )? -1 : 1 );
break;
}
}
@@ -761,24 +785,32 @@ HB_EXPORT int hb_cdpcmp( char* szFirst, char* szSecond, ULONG ulLen, PHB_CODEPAG
lAcc2 = TRUE;
else
{
iRet = ( n1 < n2 )? -1 : 1;
iRet = ( n1 == n2 )? ( ( *szFirst < *szSecond )? -1 : 1 ) :
( ( n1 < n2 )? -1 : 1 );
break;
}
}
else
{
iRet = ( n1 < n2 )? -1 : 1;
iRet = ( n1 == n2 )? ( ( *szFirst < *szSecond )? -1 : 1 ) :
( ( n1 < n2 )? -1 : 1 );
break;
}
}
/* printf( " : %d",iRet ); */
if( piCounter )
*piCounter = ul;
if( !iRet && lAcc1 )
return 1;
else if( !iRet && lAcc2 )
return -1;
if( !iRet )
{
if( lAcc1 )
iRet = 1;
else if( lAcc2 )
iRet = -1;
else if( bExact && ( ulLenFirst != ulLenSecond ) )
{
iRet = ( ulLenFirst < ulLenSecond ) ? -1 : 1;
}
}
return iRet;
}

View File

@@ -1591,7 +1591,6 @@ HB_EXPORT int hb_itemStrCmp( PHB_ITEM pFirst, PHB_ITEM pSecond, BOOL bForceExact
ULONG ulLenFirst;
ULONG ulLenSecond;
ULONG ulMinLen;
ULONG ulCounter;
int iRet = 0; /* Current status */
HB_TRACE(HB_TR_DEBUG, ("hb_itemStrCmp(%p, %p, %d)", pFirst, pSecond, (int) bForceExact));
@@ -1617,26 +1616,29 @@ HB_EXPORT int hb_itemStrCmp( PHB_ITEM pFirst, PHB_ITEM pSecond, BOOL bForceExact
if( ulMinLen )
{
if( hb_cdp_page->lSort )
iRet = hb_cdpcmp( szFirst,szSecond,ulMinLen,hb_cdp_page, &ulCounter );
iRet = hb_cdpcmp( szFirst,ulLenFirst,szSecond,ulLenSecond,hb_cdp_page,hb_set.HB_SET_EXACT || bForceExact );
else
for( ulCounter = 0; ulCounter < ulMinLen && !iRet; ulCounter++ )
{
do
{
/* Difference found */
if( *szFirst != *szSecond )
iRet = ( ( BYTE ) *szFirst < ( BYTE ) *szSecond ) ? -1 : 1;
else /* TODO : #define some constants */
{
szFirst++;
szSecond++;
iRet = ( ( BYTE ) *szFirst < ( BYTE ) *szSecond ) ? -1 : 1;
break;
}
szFirst++;
szSecond++;
}
while( --ulMinLen );
if( !iRet && ulLenSecond != ulLenFirst )
{
if( ulLenSecond > ulLenFirst )
iRet = 1;
else if( hb_set.HB_SET_EXACT || bForceExact )
iRet = -1;
}
if( hb_set.HB_SET_EXACT || bForceExact || ulLenSecond > ulCounter )
{
/* Force an exact comparison */
if( !iRet && ulLenFirst != ulLenSecond )
/* If length is different ! */
iRet = ( ulLenFirst < ulLenSecond ) ? -1 : 1;
}
}
else