diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 276e9617a4..fbcb2a482c 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -16,26 +16,42 @@ The license applies to all entries newer than 2009-04-28. */ +2011-04-13 14:12 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/src/rtl/cdpapi.c + ! fixed U+0000 conversion - it should not be converted. + + * harbour/src/rtl/hbjson.c + ! fixed decoding unicode value from strings with \uHHHH + ! fixed to use hb_cdpU16ToStr() instead of hb_cdpGetChar() + which cannot be used with CPs using multibyte encoding. + + * harbour/ChangeLog + ! fixed typos in my previos ChangeLog entry + (I should try to read such things at least once before I'll commit) + + ; TOFIX: contrib/hbexpat/internal.c: uses hb_cdpGetU16() which cannot + be used with CPs using multibyte encoding. + 2011-04-13 11:07 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) * harbour/include/hbapicdp.h * harbour/include/hbcdpreg.h * harbour/src/rtl/cdpapi.c * harbour/src/rtl/cdpapihb.c + added support for user defined character encoding. - Now it's possible to easy create and register in HVM CPs using any - encoding so I expected that users interested in adding support for - some exotic character encoding will create such mapping instead + Now it's possible to easy create and register in HVM CPs any + encoding so I expect that users interested in adding support for + new exotic character encoding will create such mapping instead of asking for it. % moved support for codepages using multibyte characters mapped to - single unicode values to user defined encoding - it nicely simplify - the code and eliminate unnecessary overhead in other CPs. + single unicode values to user defined encoding - it nicely simplified + the code and eliminated unnecessary overhead in other CPs. * allow to chose UTF8 as HVM CP * harbour/src/rtl/idle.c ! fixed idle mode flag resetting * harbour/src/rdd/hbsix/sxutil.c - ! fixed SX_SLIMFAST() results when nested quoting with (") and (') is + ! fixed SX_SLIMFAST() result when nested quoting with (") and (') is used + harbour/tests/big5_gen.prg @@ -43,8 +59,8 @@ BIG5 and UCS16 using data defined by Unicode, Inc. in BIG5.TXT + harbour/src/codepage/cp_utf8.c - + added alternative UTF8 Harbour CP (UTF8ASC) as an example Harbour - user defined codapged using multibyte character encoding + + added alternative UTF8 Harbour CP (UTF8ASC) as an example of Harbour + user defined codapged with multibyte character encoding * harbour/src/codepage/Makefile + harbour/src/codepage/cp_u16le.c @@ -57,12 +73,12 @@ STR API with automatic translations. ; This CP needs really big translation tables. I added code which makes some very simple compression which reduced raw size from - 176100 bytes to 77354 but it's still large 77KB so maybe we should + 176100 bytes to 77354 but it's still large (77KB) so maybe we should think about moving this CP to other Harbour codpage library which is not part of harbour shared library harbour*{.dll|.so|.dyn|...} Alternatively I can try to reduce static size to about 30KB and then build necessary tables dynamically at runtime when they are - used first time though in such case I will need additional 177KB + used first time though in such case I will need additional 176KB of dynamic memory instead of 77KB of static memory used by current code. diff --git a/harbour/src/rtl/cdpapi.c b/harbour/src/rtl/cdpapi.c index 4e7cbcce3a..6bd4736a91 100644 --- a/harbour/src/rtl/cdpapi.c +++ b/harbour/src/rtl/cdpapi.c @@ -162,7 +162,10 @@ void hb_cdpBuildTransTable( PHB_UNITABLE uniTable ) hb_xgrab( ( wcMax + 1 ) * sizeof( HB_UCHAR ) ); memset( uniTrans, '\0', ( wcMax + 1 ) * sizeof( HB_UCHAR ) ); for( i = 0; i < 256; ++i ) - uniTrans[ uniTable->uniCodes[ i ] ] = ( HB_UCHAR ) i; + { + if( uniTable->uniCodes[ i ] ) + uniTrans[ uniTable->uniCodes[ i ] ] = ( HB_UCHAR ) i; + } uniTable->wcMax = wcMax; uniTable->uniTrans = uniTrans; diff --git a/harbour/src/rtl/hbjson.c b/harbour/src/rtl/hbjson.c index cad769fa46..018e218ef7 100644 --- a/harbour/src/rtl/hbjson.c +++ b/harbour/src/rtl/hbjson.c @@ -431,27 +431,28 @@ static const char * _hb_jsonDecode( const char * szSource, PHB_ITEM pValue ) break; case 'u': { - int i, val = 0; + HB_WCHAR wc = 0; + int i; - szSource++; - for( i = 0; i < 4 && ( ( *szSource >= '0' && *szSource <= '9' ) || - ( *szSource >= 'A' && *szSource <= 'F' ) || - ( *szSource >= 'a' && *szSource <= 'f' ) ); i++ ) + for( i = 0; i < 4; i++ ) { - if( szSource[ i ] <= '9' ) - val = ( val << 4 ) + szSource[ i ] - '0'; - else if( *szSource <= 'F' ) - val = ( val << 4 ) + szSource[ i ] - 'A' + 10; - else if( *szSource <= 'f' ) - val = ( val << 4 ) + szSource[ i ] - 'a' + 10; + char c = *++szSource; + wc <<= 4; + if( c >= '0' && c <= '9' ) + wc += c - '0'; + else if( c >= 'A' && c <= 'F' ) + wc += c - 'A' + 10; + else if( c >= 'a' && c <= 'f' ) + wc += c - 'a' + 10; + else + { + hb_xfree( szDest ); + return NULL; + } } - if( i < 4 ) - { - hb_xfree( szDest ); - return NULL; - } - *szHead++ = hb_cdpGetChar( hb_vmCDP(), ( HB_WCHAR ) val ); - szSource += 3; + szHead += hb_cdpU16ToStr( hb_vmCDP(), HB_CDP_ENDIAN_NATIVE, + &wc, 1, + szHead, szDest + nAlloc - szHead ); break; } default: