diff --git a/harbour/ChangeLog b/harbour/ChangeLog index a25fb940ef..779f2444c3 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,18 @@ 2002-12-01 23:12 UTC+0100 Foo Bar */ +2002-10-25 14:30 UTC+0300 Alexander Kresin + * source/rtl/cdpapi.c + * source/codepage/cdpru866.c + * source/codepage/cdprukoi.c + * source/codepage/cdpruwin.c + * source/vm/hvm.c + * Memory for codepage tables is allocated dynamically now - this is needed + to provide a possibility of loading codepages from external file while + run-time. + * Possibility to have the same weight for some characters ( usually accented + and appropriate unaccented ) is implemented. + 2002-10-25 11:38 UTC+0300 Alexander Kresin * source/rdd/dbfntx/dbfntx1.c ! Few fixes, related to codepages support diff --git a/harbour/source/codepage/cdpru866.c b/harbour/source/codepage/cdpru866.c index 6d2b73f7aa..fb939a4559 100644 --- a/harbour/source/codepage/cdpru866.c +++ b/harbour/source/codepage/cdpru866.c @@ -58,13 +58,9 @@ #include "hbapi.h" #include "hbapicdp.h" -static BYTE s_chars[256]; -static BYTE s_upper[256]; -static BYTE s_lower[256]; - static HB_CODEPAGE s_codepage = { "RU866",32, "","", - 0,s_chars,s_upper,s_lower }; + 0,NULL,NULL,NULL }; HB_CODEPAGE_ANNOUNCE( RU866 ); diff --git a/harbour/source/codepage/cdprukoi.c b/harbour/source/codepage/cdprukoi.c index d517d85d91..e0064f3ff1 100644 --- a/harbour/source/codepage/cdprukoi.c +++ b/harbour/source/codepage/cdprukoi.c @@ -58,13 +58,9 @@ #include "hbapi.h" #include "hbapicdp.h" -static BYTE s_chars[256]; -static BYTE s_upper[256]; -static BYTE s_lower[256]; - static HB_CODEPAGE s_codepage = { "RUKOI8",32, "","", - 0,s_chars,s_upper,s_lower }; + 0,NULL,NULL,NULL }; HB_CODEPAGE_ANNOUNCE( RUKOI8 ); diff --git a/harbour/source/codepage/cdpruwin.c b/harbour/source/codepage/cdpruwin.c index 70072b7034..178ff8fcea 100644 --- a/harbour/source/codepage/cdpruwin.c +++ b/harbour/source/codepage/cdpruwin.c @@ -58,13 +58,9 @@ #include "hbapi.h" #include "hbapicdp.h" -static BYTE s_chars[256]; -static BYTE s_upper[256]; -static BYTE s_lower[256]; - static HB_CODEPAGE s_codepage = { "RU1251",32, "","", - 0,s_chars,s_upper,s_lower }; + 0,NULL,NULL,NULL }; HB_CODEPAGE_ANNOUNCE( RU1251 ); diff --git a/harbour/source/rtl/cdpapi.c b/harbour/source/rtl/cdpapi.c index f1457cc187..038cda06a7 100644 --- a/harbour/source/rtl/cdpapi.c +++ b/harbour/source/rtl/cdpapi.c @@ -90,32 +90,51 @@ BOOL hb_cdpRegister( PHB_CODEPAGE cdpage ) if( !s_cdpList[ iPos ] ) { int i, iu, il, iumax = 0, ilmax = 0; + char *ptrUpper = cdpage->CharsUpper; + char *ptrLower = cdpage->CharsLower; + char *ptr; s_cdpList[ iPos ] = cdpage; cdpage->lSort = FALSE; if( cdpage->nChars ) { + cdpage->s_chars = (BYTE*) hb_xgrab(256); + cdpage->s_upper = (BYTE*) hb_xgrab(256); + cdpage->s_lower = (BYTE*) hb_xgrab(256); for( i=0; i<256; i++ ) { cdpage->s_chars[i] = 0; cdpage->s_upper[i] = toupper( (BYTE) i&255 ); cdpage->s_lower[i] = tolower( (BYTE) i&255 ); } - for( i=0; inChars; i++ ) + for( i=1; *ptrUpper; i++,ptrUpper++,ptrLower++ ) { - iu = (((int)cdpage->CharsUpper[i])&255); - cdpage->s_chars[ iu ] = i+1; - il = (((int)cdpage->CharsLower[i])&255); - cdpage->s_chars[ il ] = i+1+cdpage->nChars; + if( *ptrUpper == '=' ) + { + for( ptr=ptrUpper+1; *ptr; ptr++ ) + *(ptr-1) = *ptr; + *(ptr-1) = '\0'; + for( ptr=ptrLower+1; *ptr; ptr++ ) + *(ptr-1) = *ptr; + *(ptr-1) = '\0'; + i--; + } + else if( *ptrUpper == '.' ) + { + } + iu = (((int)*ptrUpper)&255); + cdpage->s_chars[ iu ] = i; + il = (((int)*ptrLower)&255); + cdpage->s_chars[ il ] = i+cdpage->nChars; if( iu < iumax || il < ilmax ) cdpage->lSort = TRUE; iumax = iu; ilmax = il; - iu = ((int)(cdpage->CharsLower[i]))&255; - cdpage->s_upper[iu] = cdpage->CharsUpper[i]; - il = ((int)(cdpage->CharsUpper[i]))&255; - cdpage->s_lower[il] = cdpage->CharsLower[i]; + iu = ((int)(*ptrLower))&255; + cdpage->s_upper[iu] = *ptrUpper; + il = ((int)(*ptrUpper))&255; + cdpage->s_lower[il] = *ptrLower; } } // printf( "\n%s %d",s_cdpage->id,s_cdpage->lSort ); @@ -215,6 +234,22 @@ int hb_cdpcmp( char* szFirst, char* szSecond, int iLen, PHB_CODEPAGE cdpage ) return iRet; } +void hb_cdpReleaseAll( void ) +{ + int iPos = 0; + + while( iPos < HB_CDP_MAX_ && s_cdpList[iPos] ) + { + if( s_cdpList[ iPos ]->s_chars ) + hb_xfree( s_cdpList[ iPos ]->s_chars ); + if( s_cdpList[ iPos ]->s_upper ) + hb_xfree( s_cdpList[ iPos ]->s_upper ); + if( s_cdpList[ iPos ]->s_lower ) + hb_xfree( s_cdpList[ iPos ]->s_lower ); + iPos ++; + } +} + HB_FUNC( HB_SETCODEPAGE ) { hb_retc( s_cdpage->id ); diff --git a/harbour/source/vm/hvm.c b/harbour/source/vm/hvm.c index 8a7591fca2..f3c7bd69c4 100644 --- a/harbour/source/vm/hvm.c +++ b/harbour/source/vm/hvm.c @@ -195,6 +195,7 @@ static void hb_vmReleaseLocalSymbols( void ); /* releases the memory of the extern void * hb_mthRequested( void ); /* profiler from classes.c */ extern void hb_mthAddTime( void *, ULONG ); /* profiler from classes.c */ +extern void hb_cdpReleaseAll( void ); BOOL hb_bProfiler = FALSE; /* profiler status is off */ BOOL hb_bTracePrgCalls = FALSE; /* prg tracing is off */ @@ -391,6 +392,7 @@ void HB_EXPORT hb_vmQuit( void ) hb_dynsymRelease(); /* releases the dynamic symbol table */ hb_conRelease(); /* releases Console */ hb_setRelease(); /* releases Sets */ + hb_cdpReleaseAll(); /* releases codepages */ /* release all remaining items */ hb_stackRemove( 0 );