diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 0f8b364717..1a2fe1b0d2 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,17 @@ 2002-12-01 13:30 UTC+0100 Foo Bar */ + create separate meta class for each class with CLASS members and + () 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 * source/vm/itemapi.c ! Bug fixed, which was introduced while last commit diff --git a/harbour/include/hbapicdp.h b/harbour/include/hbapicdp.h index b8c85711bc..71e480e29f 100644 --- a/harbour/include/hbapicdp.h +++ b/harbour/include/hbapicdp.h @@ -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 ); diff --git a/harbour/source/rdd/dbfntx/dbfntx1.c b/harbour/source/rdd/dbfntx/dbfntx1.c index 904ddad4e9..dc43fd5600 100644 --- a/harbour/source/rdd/dbfntx/dbfntx1.c +++ b/harbour/source/rdd/dbfntx/dbfntx1.c @@ -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 ); diff --git a/harbour/source/rtl/cdpapi.c b/harbour/source/rtl/cdpapi.c index bd93504f5e..054db7eaf5 100644 --- a/harbour/source/rtl/cdpapi.c +++ b/harbour/source/rtl/cdpapi.c @@ -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; imulti; /* printf( "\nhb_cdpcmp-1 %c %c",*szFirst,*szSecond ); */ + ul ++; for( j=0; jnMulti; 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; } diff --git a/harbour/source/vm/itemapi.c b/harbour/source/vm/itemapi.c index 1d6928f705..ed2dfd7308 100644 --- a/harbour/source/vm/itemapi.c +++ b/harbour/source/vm/itemapi.c @@ -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