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:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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 ) );
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user