2006-09-05 16:40 UTC+0300 Alexander Kresin <alex@belacy.belgorod.su>
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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 );
|
||||
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user