diff --git a/harbour/ChangeLog b/harbour/ChangeLog index e18fd2a64e..1da807c5bd 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -17,6 +17,18 @@ past entries belonging to author(s): Viktor Szakats. */ +2009-10-11 19:54 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/include/hbapicdp.h + * harbour/src/rtl/cdpapi.c + * harbour/src/rtl/is.c + * moved hb_charIs*() functions to cdpapi.c file for easier updating + in the future + % optimized memory allocation for new codepages + + * harbour/contrib/hbct/pos1.c + * use hb_charIs*() functions instead of accessing HB_CODEPAGE + structure members + 2009-10-11 14:52 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) * harbour/bin/hb-func.sh - removed from hb* scripts old GCC options not longer used to build diff --git a/harbour/contrib/hbct/pos1.c b/harbour/contrib/hbct/pos1.c index 19d9fc287b..7576f843ee 100644 --- a/harbour/contrib/hbct/pos1.c +++ b/harbour/contrib/hbct/pos1.c @@ -57,19 +57,6 @@ #include "ct.h" -#ifndef HB_CDP_SUPPORT_OFF -# include "hbapicdp.h" -# define ISUPPER(c) ( HB_ISUPPER( ( UCHAR ) c ) || ( cdp->nChars && strchr( cdp->CharsUpper, ( UCHAR ) c ) != NULL ) ) -# define ISLOWER(c) ( HB_ISLOWER( ( UCHAR ) c ) || ( cdp->nChars && strchr( cdp->CharsLower, ( UCHAR ) c ) != NULL ) ) -# define ISALPHA(c) ( HB_ISALPHA( ( UCHAR ) c ) || ( cdp->nChars && ( strchr( cdp->CharsUpper, ( UCHAR ) c ) != NULL || strchr( cdp->CharsLower, c ) != NULL ) ) ) -# define HB_CDP_STUB PHB_CODEPAGE cdp = hb_vmCDP(); -#else -# define ISUPPER(c) HB_ISUPPER( ( UCHAR ) c ) -# define ISLOWER(c) HB_ISLOWER( ( UCHAR ) c ) -# define ISALPHA(c) HB_ISALPHA( ( UCHAR ) c ) -# define HB_CDP_STUB -#endif - /* defines */ #define DO_POS1_POSALPHA 0 #define DO_POS1_POSLOWER 1 @@ -85,7 +72,6 @@ static void do_pos1( int iSwitch ) HB_ISCHAR( 2 ) && /* .. string as 2nd .. */ HB_ISCHAR( 3 ) ) ) ) /* .. and 3rd param */ { - HB_CDP_STUB unsigned char *pcString; size_t sStrLen; unsigned char *puc, ucChar1 = ' ', ucChar2 = ' '; @@ -139,11 +125,11 @@ static void do_pos1( int iSwitch ) switch ( iSwitch ) { case DO_POS1_POSALPHA: - iDoRet = ISALPHA( *puc ); + iDoRet = hb_charIsAlpha( ( UCHAR ) *puc ); break; case DO_POS1_POSLOWER: - iDoRet = ISLOWER( *puc ); + iDoRet = hb_charIsLower( ( UCHAR ) *puc ); break; case DO_POS1_POSRANGE: @@ -151,7 +137,7 @@ static void do_pos1( int iSwitch ) break; case DO_POS1_POSUPPER: - iDoRet = ISUPPER( *puc ); + iDoRet = hb_charIsUpper( ( UCHAR ) *puc ); break; } diff --git a/harbour/include/hbapicdp.h b/harbour/include/hbapicdp.h index 1f31ed5cd4..af78e37a16 100644 --- a/harbour/include/hbapicdp.h +++ b/harbour/include/hbapicdp.h @@ -92,23 +92,23 @@ typedef struct _HB_MULTICHAR typedef struct _HB_CODEPAGE { - const char * id; - const char * uniID; - PHB_UNITABLE uniTable; - int nChars; - const char * CharsUpper; - const char * CharsLower; - BOOL lLatin; - BOOL lAccEqual; - BOOL lAccInterleave; - BOOL lSort; - BOOL lChClone; - BYTE * s_chars; - BYTE * s_upper; - BYTE * s_lower; - BYTE * s_accent; - int nMulti; - PHB_MULTICHAR multi; + const char * id; + const char * uniID; + PHB_UNITABLE uniTable; + int nChars; + const char * CharsUpper; + const char * CharsLower; + BOOL lLatin; + BOOL lAccEqual; + BOOL lAccInterleave; + BOOL lSort; + unsigned char * s_chars; + unsigned char * s_upper; + unsigned char * s_lower; + unsigned char * s_accent; + unsigned char * buffer; + int nMulti; + PHB_MULTICHAR multi; } HB_CODEPAGE, * PHB_CODEPAGE; #define HB_CPID_437 "cp437" diff --git a/harbour/src/rtl/cdpapi.c b/harbour/src/rtl/cdpapi.c index eed1e31fc4..e2ff746c31 100644 --- a/harbour/src/rtl/cdpapi.c +++ b/harbour/src/rtl/cdpapi.c @@ -318,34 +318,51 @@ BOOL hb_cdpRegister( PHB_CODEPAGE cdpage ) s_cdpList[iPos] = cdpage; cdpage->lSort = cdpage->lAccInterleave || cdpage->lAccEqual; - cdpage->lChClone = FALSE; if( cdpage->nChars ) { - int nAddLower = cdpage->nChars + ( ( cdpage->lLatin ) ? 6 : 0 ); + int nAddLower = cdpage->nChars + ( ( cdpage->lLatin ) ? 6 : 0 ), + size = 0x300, nUpper = 0, nLower = 0; + unsigned char * pszBuffer; - cdpage->s_chars = ( BYTE * ) hb_xgrab( 256 ); - memset( cdpage->s_chars, '\0', 256 ); - cdpage->s_upper = ( BYTE * ) hb_xgrab( 256 ); - cdpage->s_lower = ( BYTE * ) hb_xgrab( 256 ); + if( cdpage->lAccInterleave ) + size += 0x300; + if( strpbrk( cdpage->CharsUpper, "~." ) != NULL ) + { + nUpper = ( int ) strlen( cdpage->CharsUpper ); + size += nUpper + 1; + } + if( strpbrk( cdpage->CharsLower, "~." ) != NULL ) + { + nLower = ( int ) strlen( cdpage->CharsLower ); + size += nLower + 1; + } + pszBuffer = cdpage->buffer = ( unsigned char * ) hb_xgrab( size ); + memset( pszBuffer, '\0', size ); + cdpage->s_chars = pszBuffer; + cdpage->s_upper = pszBuffer + 0x100; + cdpage->s_lower = pszBuffer + 0x200; + pszBuffer += 0x300; if( cdpage->lAccInterleave ) { - cdpage->s_accent = ( BYTE * ) hb_xgrab( 256 ); - memset( cdpage->s_accent, '\0', 256 ); + cdpage->s_accent = pszBuffer; + pszBuffer += 0x100; + } + if( nUpper ) + { + cdpage->CharsUpper = ptrUpper = ( char * ) + memcpy( pszBuffer, cdpage->CharsUpper, nUpper ); + pszBuffer += nUpper; + } + if( nLower ) + { + cdpage->CharsLower = ptrLower = ( char * ) + memcpy( pszBuffer, cdpage->CharsLower, nLower ); } - else - cdpage->s_accent = NULL; - for( i = 0; i < 256; i++ ) { cdpage->s_upper[ i ] = ( char ) HB_TOUPPER( ( UCHAR ) i ); cdpage->s_lower[ i ] = ( char ) HB_TOLOWER( ( UCHAR ) i ); } - if( strpbrk( cdpage->CharsUpper, "~." ) != NULL ) - { - cdpage->CharsUpper = ptrUpper = hb_strdup( cdpage->CharsUpper ); - cdpage->CharsLower = ptrLower = hb_strdup( cdpage->CharsLower ); - cdpage->lChClone = TRUE; - } for( i = ia = 1; *ptrUpper; i++, ia++, ptrUpper++, ptrLower++ ) { if( ( cdpage->lAccEqual || cdpage->lAccInterleave ) && @@ -446,6 +463,60 @@ BOOL hb_cdpRegister( PHB_CODEPAGE cdpage ) return FALSE; } +BOOL hb_charIsDigit( int iChar ) +{ + return HB_ISDIGIT( ( unsigned char ) iChar ); +} + +BOOL hb_charIsAlpha( int iChar ) +{ + if( HB_ISALPHA( ( unsigned char ) iChar ) ) + return TRUE; + else + { + PHB_CODEPAGE cdp = hb_vmCDP(); + /* ( char * ) casting for MSVC */ + if( cdp && cdp->nChars && iChar && + ( strchr( ( char * ) cdp->CharsUpper, iChar ) || + strchr( ( char * ) cdp->CharsLower, iChar ) ) ) + return TRUE; + } + + return FALSE; +} + +BOOL hb_charIsLower( int iChar ) +{ + if( HB_ISLOWER( ( unsigned char ) iChar ) ) + return TRUE; + else + { + PHB_CODEPAGE cdp = hb_vmCDP(); + /* ( char * ) casting for MSVC */ + if( cdp && cdp->nChars && iChar && + strchr( ( char * ) cdp->CharsLower, iChar ) ) + return TRUE; + } + + return FALSE; +} + +BOOL hb_charIsUpper( int iChar ) +{ + if( HB_ISUPPER( ( unsigned char ) iChar ) ) + return TRUE; + else + { + PHB_CODEPAGE cdp = hb_vmCDP(); + /* ( char * ) casting for MSVC */ + if( cdp && cdp->nChars && iChar && + strchr( ( char * ) cdp->CharsUpper, iChar ) ) + return TRUE; + } + + return FALSE; +} + PHB_CODEPAGE hb_cdpFind( const char *pszID ) { int iPos; @@ -1443,21 +1514,10 @@ void hb_cdpReleaseAll( void ) 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 ); - if( s_cdpList[iPos]->s_accent ) - hb_xfree( s_cdpList[iPos]->s_accent ); + if( s_cdpList[iPos]->buffer ) + hb_xfree( s_cdpList[iPos]->buffer ); if( s_cdpList[iPos]->multi ) hb_xfree( s_cdpList[iPos]->multi ); - if( s_cdpList[iPos]->lChClone ) - { - hb_xfree( ( void * ) s_cdpList[iPos]->CharsUpper ); - hb_xfree( ( void * ) s_cdpList[iPos]->CharsLower ); - } iPos++; } } @@ -1817,4 +1877,26 @@ HB_FUNC( HB_UTF8STRTRAN ) HB_FUNC_EXEC( STRTRAN ) } +#else /* !HB_CDP_SUPPORT_OFF */ + +BOOL hb_charIsDigit( int iChar ) +{ + return HB_ISDIGIT( ( unsigned char ) iChar ); +} + +BOOL hb_charIsAlpha( int iChar ) +{ + return HB_ISALPHA( ( unsigned char ) iChar ); +} + +BOOL hb_charIsLower( int iChar ) +{ + return HB_ISLOWER( ( unsigned char ) iChar ); +} + +BOOL hb_charIsUpper( int iChar ) +{ + return HB_ISUPPER( ( unsigned char ) iChar ); +} + #endif /* HB_CDP_SUPPORT_OFF */ diff --git a/harbour/src/rtl/is.c b/harbour/src/rtl/is.c index 32d87201d7..eda744fe57 100644 --- a/harbour/src/rtl/is.c +++ b/harbour/src/rtl/is.c @@ -51,67 +51,6 @@ */ #include "hbapi.h" -#include "hbapicdp.h" - -BOOL hb_charIsDigit( int iChar ) -{ - return HB_ISDIGIT( ( unsigned char ) iChar ); -} - -BOOL hb_charIsAlpha( int iChar ) -{ - if( HB_ISALPHA( ( unsigned char ) iChar ) ) - hb_retl( TRUE ); -#ifndef HB_CDP_SUPPORT_OFF - else - { - PHB_CODEPAGE cdp = hb_vmCDP(); - /* ( char * ) casting for MSVC */ - if( cdp && cdp->nChars && iChar && - ( strchr( ( char * ) cdp->CharsUpper, iChar ) || - strchr( ( char * ) cdp->CharsLower, iChar ) ) ) - return TRUE; - } -#endif - - return FALSE; -} - -BOOL hb_charIsLower( int iChar ) -{ - if( HB_ISLOWER( ( unsigned char ) iChar ) ) - return TRUE; -#ifndef HB_CDP_SUPPORT_OFF - else - { - PHB_CODEPAGE cdp = hb_vmCDP(); - /* ( char * ) casting for MSVC */ - if( cdp && cdp->nChars && iChar && - strchr( ( char * ) cdp->CharsUpper, iChar ) ) - return TRUE; - } -#endif - - return FALSE; -} - -BOOL hb_charIsUpper( int iChar ) -{ - if( HB_ISUPPER( ( unsigned char ) iChar ) ) - return TRUE; -#ifndef HB_CDP_SUPPORT_OFF - else - { - PHB_CODEPAGE cdp = hb_vmCDP(); - /* ( char * ) casting for MSVC */ - if( cdp && cdp->nChars && iChar && - strchr( ( char * ) cdp->CharsLower, iChar ) ) - return TRUE; - } -#endif - - return FALSE; -} /* determines if first char of string is letter */ @@ -119,26 +58,7 @@ HB_FUNC( ISALPHA ) { const char * szString = hb_parc( 1 ); - if( szString ) - { - if( HB_ISALPHA( ( unsigned char ) *szString ) ) - hb_retl( TRUE ); - else - { -#ifndef HB_CDP_SUPPORT_OFF - PHB_CODEPAGE cdp = hb_vmCDP(); - /* ( char * ) casting for MSVC */ - if( cdp && cdp->nChars && szString[ 0 ] && - ( strchr( ( char * ) cdp->CharsUpper, *szString ) || - strchr( ( char * ) cdp->CharsLower, *szString ) ) ) - hb_retl( TRUE ); - else -#endif - hb_retl( FALSE ); - } - } - else - hb_retl( FALSE ); + hb_retl( szString && hb_charIsAlpha( ( unsigned char ) *szString ) ); } /* determines if first char of string is digit */ @@ -147,7 +67,7 @@ HB_FUNC( ISDIGIT ) { const char * szString = hb_parc( 1 ); - hb_retl( szString && HB_ISDIGIT( ( unsigned char ) *szString ) ); + hb_retl( szString && hb_charIsDigit( ( unsigned char ) *szString ) ); } /* determines if first char of string is upper-case */ @@ -156,25 +76,7 @@ HB_FUNC( ISUPPER ) { const char * szString = hb_parc( 1 ); - if( szString ) - { - if( HB_ISUPPER( ( unsigned char ) *szString ) ) - hb_retl( TRUE ); - else - { -#ifndef HB_CDP_SUPPORT_OFF - PHB_CODEPAGE cdp = hb_vmCDP(); - /* ( char * ) casting for MSVC */ - if( cdp && cdp->nChars && szString[ 0 ] && - strchr( ( char * ) cdp->CharsUpper, *szString ) ) - hb_retl( TRUE ); - else -#endif - hb_retl( FALSE ); - } - } - else - hb_retl( FALSE ); + hb_retl( szString && hb_charIsUpper( ( unsigned char ) *szString ) ); } /* determines if first char of string is lower-case */ @@ -183,23 +85,5 @@ HB_FUNC( ISLOWER ) { const char * szString = hb_parc( 1 ); - if( szString ) - { - if( HB_ISLOWER( ( unsigned char ) *szString ) ) - hb_retl( TRUE ); - else - { -#ifndef HB_CDP_SUPPORT_OFF - PHB_CODEPAGE cdp = hb_vmCDP(); - /* ( char * ) casting for MSVC */ - if( cdp && cdp->nChars && szString[ 0 ] && - strchr( ( char * ) cdp->CharsLower, *szString ) ) - hb_retl( TRUE ); - else -#endif - hb_retl( FALSE ); - } - } - else - hb_retl( FALSE ); + hb_retl( szString && hb_charIsLower( ( unsigned char ) *szString ) ); }