2010-12-05 01:04 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl)

* harbour/include/hbapicdp.h
  * harbour/include/hbcdpreg.h
  * harbour/src/rtl/cdpapi.c
  * harbour/tests/cpinfo.prg
    + added support to define CPs using different letter case sorting
      in human readable form. Now it's possible to use:
         // uppers before lowers: ABCDE...abcde...
         #define HB_CP_CSSORT    HB_CDP_CSSORT_UPLO
         // uppers and lowers are mixed: AaBbCcDdEe....
         #define HB_CP_CSSORT    HB_CDP_CSSORT_MIXED
         // ignore case
         #define HB_CP_CSSORT    HB_CDP_CSSORT_IGNORE
This commit is contained in:
Przemyslaw Czerpak
2010-12-05 00:04:47 +00:00
parent 9519421231
commit 3a71036691
5 changed files with 103 additions and 28 deletions

View File

@@ -16,6 +16,20 @@
The license applies to all entries newer than 2009-04-28.
*/
2010-12-05 01:04 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/include/hbapicdp.h
* harbour/include/hbcdpreg.h
* harbour/src/rtl/cdpapi.c
* harbour/tests/cpinfo.prg
+ added support to define CPs using different letter case sorting
in human readable form. Now it's possible to use:
// uppers before lowers: ABCDE...abcde...
#define HB_CP_CSSORT HB_CDP_CSSORT_UPLO
// uppers and lowers are mixed: AaBbCcDdEe....
#define HB_CP_CSSORT HB_CDP_CSSORT_MIXED
// ignore case
#define HB_CP_CSSORT HB_CDP_CSSORT_IGNORE
2010-12-04 19:32 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/include/dbinfo.ch
* harbour/src/rdd/dbfntx/dbfntx1.c

View File

@@ -324,6 +324,13 @@ extern HB_EXPORT void hb_vmSetCDP( PHB_CODEPAGE pCDP );
characters being compared are the
same ( interleaving ) */
/* letter case sensitive sorting */
#define HB_CDP_CSSORT_UPLO 0 /* upper letters first then lower
ones */
#define HB_CDP_CSSORT_MIXED 1 /* upper and lower letters are
mixed */
#define HB_CDP_CSSORT_IGNORE 2 /* ignore case */
/* byte order */
#define HB_CDP_ENDIAN_NATIVE 0
#define HB_CDP_ENDIAN_LITTLE 1
@@ -335,7 +342,8 @@ extern HB_EXPORT HB_BOOL hb_cdpRegisterNew( const char * id,
PHB_UNITABLE uniTable,
const char * pszUpper,
const char * pszLower,
unsigned int nACSort );
unsigned int nACSort,
unsigned int nCaseSort );
extern HB_EXPORT void hb_cdpReleaseAll( void );
extern HB_EXPORT const char * hb_cdpID( void );
extern HB_EXPORT PHB_CODEPAGE hb_cdpSelect( PHB_CODEPAGE cdp );

View File

@@ -80,8 +80,11 @@ HB_CALL_ON_STARTUP_BEGIN( HB_MACRONAME_JOIN( _hb_codepage_Init_, HB_CP_ID ) )
};
hb_cdpRegisterRaw( &s_codePage );
#else
#ifndef HB_CP_CSSORT
#define HB_CP_CSSORT HB_CDP_CSSORT_UPLO
#endif
hb_cdpRegisterNew( HB_MACRO2STRING( HB_CP_ID ), HB_CP_INFO, HB_CP_UNITB,
HB_CP_UPPER, HB_CP_LOWER, HB_CP_ACSORT );
HB_CP_UPPER, HB_CP_LOWER, HB_CP_ACSORT, HB_CP_CSSORT );
#endif /* HB_CP_RAW */
#if defined( HB_PRAGMA_STARTUP )

View File

@@ -1783,7 +1783,8 @@ static PHB_CODEPAGE hb_buildCodePage( const char * id, const char * info,
PHB_UNITABLE uniTable,
const char * pszUpper,
const char * pszLower,
unsigned int nACSort )
unsigned int nACSort,
unsigned int nCaseSort )
{
HB_BOOL lSort, fError;
int iMulti, iAcc, iAccUp, iAccLo, iSortUp, iSortLo, i;
@@ -1880,10 +1881,10 @@ static PHB_CODEPAGE hb_buildCodePage( const char * id, const char * info,
if( ucUp != ' ' )
{
used[ ucUp ] = 1;
++iSortLo;
if( ucUp < ucUp2 )
lSort = HB_TRUE;
ucUp2 = ucUp;
++iSortLo;
}
if( ucLo != ' ' )
{
@@ -1897,7 +1898,8 @@ static PHB_CODEPAGE hb_buildCodePage( const char * id, const char * info,
if( iMulti > 64 )
fError = HB_TRUE;
if( fError || nACSort > HB_CDP_ACSORT_INTERLEAVED )
if( fError || nACSort > HB_CDP_ACSORT_INTERLEAVED ||
nCaseSort > HB_CDP_CSSORT_IGNORE )
{
#ifdef __HB_IGNORE_CP_ERRORS
return NULL;
@@ -1911,6 +1913,9 @@ static PHB_CODEPAGE hb_buildCodePage( const char * id, const char * info,
else if( nACSort != HB_CDP_ACSORT_NONE )
lSort = HB_TRUE;
if( nCaseSort != HB_CDP_CSSORT_UPLO )
lSort = HB_TRUE;
nSize = 0x300;
if( lSort )
{
@@ -1993,7 +1998,14 @@ static PHB_CODEPAGE hb_buildCodePage( const char * id, const char * info,
{
flags[ ( HB_UCHAR ) multi->cFirst[ 1 ] ] |= HB_CDP_MULTI1;
flags[ ( HB_UCHAR ) multi->cLast [ 1 ] ] |= HB_CDP_MULTI2;
multi->sortLo = ++iSortLo - iAccLo;
if( nCaseSort == HB_CDP_CSSORT_UPLO )
++iSortLo;
else if( nCaseSort == HB_CDP_CSSORT_MIXED )
iSortLo = ++iSortUp;
else
iSortLo = iSortUp;
multi->sortLo = iSortLo - iAccLo;
}
if( *pup == '=' )
{
@@ -2070,9 +2082,24 @@ static PHB_CODEPAGE hb_buildCodePage( const char * id, const char * info,
{
if( sort[ ucLo ] == 0 )
{
if( iAcc && nACSort != HB_CDP_ACSORT_NONE )
++iAccLo;
sort[ ucLo ] = ( HB_UCHAR ) ( ++iSortLo - iAccLo );
if( nCaseSort == HB_CDP_CSSORT_UPLO )
{
if( iAcc && nACSort != HB_CDP_ACSORT_NONE )
++iAccLo;
++iSortLo;
}
else
{
if( nCaseSort == HB_CDP_CSSORT_MIXED )
{
if( iAcc && nACSort != HB_CDP_ACSORT_NONE )
++iAccUp;
iSortLo = ++iSortUp;
}
iAccLo = iAccUp;
iSortLo = iSortUp;
}
sort[ ucLo ] = ( HB_UCHAR ) ( iSortLo - iAccLo );
if( acc )
acc[ ucLo ] = ( HB_UCHAR ) iSortLo;
if( ucLo2 > ucLo )
@@ -2107,6 +2134,9 @@ static PHB_CODEPAGE hb_buildCodePage( const char * id, const char * info,
else
iMulti = 1;
if( nCaseSort != HB_CDP_CSSORT_UPLO )
ucLo2 = 0;
for( iUp = iLo = 0, i = iMulti; i < 256; ++i )
{
if( sort[ i ] == 0 )
@@ -2210,16 +2240,18 @@ HB_BOOL hb_cdpRegisterRaw( PHB_CODEPAGE cdp )
HB_BOOL hb_cdpRegisterNew( const char * id, const char * info,
PHB_UNITABLE uniTable,
const char * pszUpper, const char * pszLower,
unsigned int nACSort )
unsigned int nACSort,
unsigned int nCaseSort )
{
PHB_CODEPAGE * cdp_ptr;
HB_TRACE( HB_TR_DEBUG, ( "hb_cdpRegisterNew(%s,%s,%s,%s,%d)", id, info, pszUpper, pszLower, nACSort ) );
HB_TRACE( HB_TR_DEBUG, ( "hb_cdpRegisterNew(%s,%s,%s,%s,%u,%u)", id, info, pszUpper, pszLower, nACSort, nCaseSort ) );
cdp_ptr = hb_cdpFindPos( id );
if( *cdp_ptr == NULL )
{
*cdp_ptr = hb_buildCodePage( id, info, uniTable, pszUpper, pszLower, nACSort );
*cdp_ptr = hb_buildCodePage( id, info, uniTable, pszUpper, pszLower,
nACSort, nCaseSort );
return *cdp_ptr != NULL;
}
return HB_FALSE;

View File

@@ -18,8 +18,8 @@
#include "fileio.ch"
proc main( cdp, info, unicode )
local cUp, cLo, cUp2, cLo2, cOrd, cOrd2, c, i, a
local lWarn, lBin, lSort, lEqual
local cUp, cLo, cUp2, cLo2, cOrd, cOrd2, cOrdMix, cMix, c, i, a
local lWarn, lBin, lSort, lEqual, lMixed
set alternate to cpinfo.txt additive
set alternate on
@@ -29,7 +29,7 @@ proc main( cdp, info, unicode )
/* for test */
set( _SET_CODEPAGE, iif( empty( cdp ), "PLMAZ", upper( cdp ) ) )
hb_setTermCP( set( _SET_CODEPAGE ), set( _SET_CODEPAGE ) )
lEqual := .t.
lEqual := .f.
#else
lEqual := .f.
#endif
@@ -57,7 +57,7 @@ proc main( cdp, info, unicode )
if !lSort
? "simple byte sorting !!!"
endif
lBin := lWarn := .f.
lBin := lWarn := lMixed := .f.
cUp := cLo := cOrd := ""
for i := 1 to len( a )
if i < len(a) .and. a[i] > a[ i + 1 ] .and. !isalpha( chr( a[ i ] ) )
@@ -155,20 +155,31 @@ proc main( cdp, info, unicode )
lBin := lWarn := .t.
endif
next
cMix := ""
if ! len( cUp ) == len( cLo )
? "number of upper and lower characters is different"
lWarn := .t.
else
for i := 1 to len( cUp )
cMix += substr( cUp, i, 1 )
cMix += substr( cLo, i, 1 )
next
endif
cOrd2 := ""
cOrd2 := cOrdMix := ""
for i := 0 to 255
if i == asc( cUp )
cOrd2 += cUp
elseif i == asc( cLo )
cOrd2 += cLo
if i == asc( cUp ) .or. i == asc( cLo )
if i == asc( cUp )
cOrd2 += cUp
else
cOrd2 += cLo
endif
cOrdMix += cMix
cMix := ""
endif
c := chr( i )
if ! c $ cUp .and. ! c $ cLo
cOrd2 += chr( i )
cOrd2 += c
cOrdMix += c
endif
next
if ! cOrd == cOrd2
@@ -220,8 +231,11 @@ proc main( cdp, info, unicode )
cLo := cLo2
endif
endif
elseif cOrd == cOrdMix
? "letters case are mixed"
lMixed := .t.
endif
if ! cOrd == cOrd2 .and. lSort
if ! cOrd == cOrd2 .and. lSort .and. !lMixed
? "letters are not sorted continuously"
lBin := lWarn := .t.
endif
@@ -246,7 +260,7 @@ proc main( cdp, info, unicode )
if !empty( cdp )
write_file( "cp" + lower( cdp ) + ".c", ;
genCP( cdp, info, unicode, lBin, lWarn, cUp, cLo ) )
genCP( cdp, info, unicode, lBin, lWarn, lMixed, cUp, cLo ) )
endif
return
@@ -334,7 +348,7 @@ static function write_file( cName, cBody )
return lRet
static function genCP( id, info, unicode, lBin, lWarn, cUp, cLo )
static function genCP( id, info, unicode, lBin, lWarn, lMixed, cUp, cLo )
local flags[ 256 ], upper[ 256 ], lower[ 256 ], sort[ 256 ], tmp[ 256 ]
local i, c
@@ -386,10 +400,10 @@ static function genCP( id, info, unicode, lBin, lWarn, cUp, cLo )
next
return genCPfile( id, info, unicode, flags, upper, lower, sort, ;
lBin, lWarn, cUp, cLo )
lBin, lWarn, lMixed, cUp, cLo )
static function genCPfile( id, info, unicode, flags, upper, lower, sort, ;
lBin, lWarn, cUp, cLo )
lBin, lWarn, lMixed, cUp, cLo )
local cDef
cDef := ;
@@ -408,7 +422,11 @@ static function genCPfile( id, info, unicode, flags, upper, lower, sort, ;
'#define HB_CP_UNITB HB_UNITB_$3' + EOL
if !lBin
cDef += ;
'#define HB_CP_ACSORT HB_CDP_ACSORT_NONE' + EOL + ;
'#define HB_CP_ACSORT HB_CDP_ACSORT_NONE' + EOL
if lMixed
cDef += '#define HB_CP_CSSORT HB_CDP_CSSORT_MIXED' + EOL
endif
cDef += ;
'#define HB_CP_UPPER "' + cUp + '"' + EOL + ;
'#define HB_CP_LOWER "' + cLo + '"' + EOL + ;
EOL