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
This commit is contained in:
Przemyslaw Czerpak
2009-10-11 17:55:14 +00:00
parent 7c1258d228
commit a33106ec02
5 changed files with 148 additions and 184 deletions

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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"

View File

@@ -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 */

View File

@@ -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 ) );
}