Ignore:
Timestamp:
Mar 31, 2010, 9:50:47 PM (12 years ago)
Author:
dmik
Message:

branches/kmk: Added a bunch of unicode conversion helpers based on the original propcnv() from lupoppler.cpp.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/kmk/Lucide/plugins/ludoc/cpconv.cpp

    r306 r337  
    3535#include <os2.h>
    3636#include <uconv.h>
     37#include <string.h>
    3738
    3839
     
    141142}
    142143
     144extern "C" char *APIENTRY uniConvertString( const char *s, size_t len, UconvObject from,
     145                                            UconvObject to, size_t *retLen )
     146{
     147    if ( s == NULL )
     148        return NULL;
     149
     150    size_t cSubs = 0;
     151    size_t unilen = len + 1;
     152    UniChar *unibuf = new UniChar[ unilen ];
     153    memset( unibuf, 0, unilen * sizeof( UniChar ) );
     154    UniChar *tmpuni = unibuf;
     155    UniUconvToUcs( from, (void **)&s, &len, &tmpuni, &unilen, &cSubs );
     156    unilen = UniStrlen( unibuf );
     157
     158    int liglen = uniLigaturesLength( unibuf );
     159    if ( liglen > 0 )  // string contain ligature(s)
     160    {
     161        unsigned ulen_tmp = ( unilen + liglen + 1 ) * sizeof( UniChar );
     162        char *uni_tmp = new char[ ulen_tmp ];
     163        uniReplaceLigatures( unibuf, (UniChar *)uni_tmp );
     164        delete unibuf;
     165        unibuf = (UniChar *)uni_tmp;
     166        unilen = UniStrlen( unibuf );
     167    }
     168    uniConvertSpChars( unibuf );
     169
     170    size_t blen = ( unilen + 1 ) * 2;
     171    char *b = new char[ blen ];
     172    memset( b, 0, blen );
     173    char *bsav = b;
     174    tmpuni = unibuf;
     175    cSubs = 0;
     176    UniUconvFromUcs( to, &tmpuni, &unilen, (void **)&b, &blen, &cSubs );
     177    delete unibuf;
     178
     179    if ( retLen != NULL)
     180        *retLen = blen;
     181    return bsav;
     182}
     183
     184static char *utf16_sys( const char *s, size_t len, UconvObject *utf16,
     185                        UconvObject *sys, size_t *retLen, bool from, bool isUtf8 )
     186{
     187    UconvObject utf16Tmp = NULL;
     188    UconvObject sysTmp = NULL;
     189    uconv_attribute_t attr;
     190
     191    if ( utf16 == NULL )
     192        utf16 = &utf16Tmp;
     193    if ( sys == NULL )
     194        sys = &sysTmp;
     195
     196    if ( *utf16 == NULL ) {
     197        UniCreateUconvObject( (UniChar *)L"UCS-2@endian=big", utf16 );
     198        UniQueryUconvObject( *utf16, &attr, sizeof(attr), NULL, NULL, NULL );
     199        attr.converttype &= ~(CVTTYPE_CTRL7F | CVTTYPE_PATH);
     200        attr.options = UCONV_OPTION_SUBSTITUTE_BOTH;
     201        UniSetUconvObject( *utf16, &attr );
     202    }
     203    if ( *sys == NULL ) {
     204        if ( isUtf8 )
     205            UniCreateUconvObject( (UniChar *)L"UTF-8", sys );
     206        else
     207            UniCreateUconvObject( (UniChar *)L"", sys );
     208        UniQueryUconvObject( *sys, &attr, sizeof(attr), NULL, NULL, NULL );
     209        attr.converttype &= ~(CVTTYPE_CTRL7F | CVTTYPE_PATH);
     210        attr.options = UCONV_OPTION_SUBSTITUTE_BOTH;
     211        UniSetUconvObject( *sys, &attr );
     212    }
     213
     214    char *ret;
     215    if ( from )
     216        ret = uniConvertString( s, len, *utf16, *sys, retLen );
     217    else
     218        ret = uniConvertString( s, len, *sys, *utf16, retLen );
     219
     220    if ( sys == &sysTmp )
     221        UniFreeUconvObject( sysTmp );
     222    if ( utf16 == &utf16Tmp )
     223        UniFreeUconvObject( utf16Tmp );
     224
     225    return ret;
     226}
     227
     228extern "C" char *APIENTRY uniUtf16BEToSys( const char *s, size_t len, UconvObject *utf16,
     229                                           UconvObject *sys )
     230{
     231    if ( s == NULL )
     232        return NULL;
     233    if ( len >= 2 && s[0] == (int)(char)0xfe && s[1] == (int)(char)0xff ) {
     234        s += 2;
     235        len -= 2;
     236    }
     237    return utf16_sys( s, len, utf16, sys, NULL, true, false );
     238}
     239
     240extern "C" char *APIENTRY uniSysToUtf16BE( const char *s, UconvObject *sys,
     241                                           UconvObject *utf16, size_t *retLen )
     242{
     243    return utf16_sys( s, strlen( s ), utf16, sys, retLen, false, false );
     244}
     245
     246extern "C" char *APIENTRY uniUtf16BEToUtf8( const char *s, size_t len, UconvObject *utf16,
     247                                            UconvObject *utf8 )
     248{
     249    if ( s == NULL )
     250        return NULL;
     251    if ( len >= 2 && s[0] == (char)0xfe && s[1] == (char)0xff ) {
     252        s += 2;
     253        len -= 2;
     254    }
     255    return utf16_sys( s, len, utf16, utf8, NULL, true, true );
     256}
     257
     258extern "C" char *APIENTRY uniUtf8ToUtf16BE( const char *s, UconvObject *utf8,
     259                                            UconvObject *utf16, size_t *retLen )
     260{
     261    return utf16_sys( s, strlen( s ), utf16, utf8, retLen, false, true );
     262}
     263
     264static char *utf8_sys( const char *s, UconvObject *utf8, UconvObject *sys, bool from )
     265{
     266    UconvObject utf8Tmp = NULL;
     267    UconvObject sysTmp = NULL;
     268    uconv_attribute_t attr;
     269
     270    if ( utf8 == NULL )
     271        utf8 = &utf8Tmp;
     272    if ( sys == NULL )
     273        sys = &sysTmp;
     274
     275    if ( *utf8 == NULL ) {
     276        UniCreateUconvObject( (UniChar *)L"UTF-8", utf8 );
     277        UniQueryUconvObject( *utf8, &attr, sizeof(attr), NULL, NULL, NULL );
     278        attr.converttype &= ~(CVTTYPE_CTRL7F | CVTTYPE_PATH);
     279        attr.options = UCONV_OPTION_SUBSTITUTE_BOTH;
     280        UniSetUconvObject( *utf8, &attr );
     281    }
     282    if ( *sys == NULL ) {
     283        UniCreateUconvObject( (UniChar *)L"", sys );
     284        UniQueryUconvObject( *sys, &attr, sizeof(attr), NULL, NULL, NULL );
     285        attr.converttype &= ~(CVTTYPE_CTRL7F | CVTTYPE_PATH);
     286        attr.options = UCONV_OPTION_SUBSTITUTE_BOTH;
     287        UniSetUconvObject( *sys, &attr );
     288    }
     289
     290    char *ret;
     291    if ( from )
     292        ret = uniConvertString( s, strlen( s ), *utf8, *sys, NULL );
     293    else
     294        ret = uniConvertString( s, strlen( s ), *sys, *utf8, NULL );
     295
     296    if ( sys == &sysTmp )
     297        UniFreeUconvObject( sysTmp );
     298    if ( utf8 == &utf8Tmp )
     299        UniFreeUconvObject( utf8Tmp );
     300
     301    return ret;
     302}
     303
     304extern "C" char *APIENTRY uniUtf8ToSys( const char *s, UconvObject *utf8,
     305                                        UconvObject *sys )
     306{
     307    return utf8_sys( s, utf8, sys, true );
     308}
     309
     310extern "C" char *APIENTRY uniSysToUtf8( const char *s, UconvObject *sys,
     311                                        UconvObject *utf8 )
     312{
     313    return utf8_sys( s, utf8, sys, false );
     314}
     315
Note: See TracChangeset for help on using the changeset viewer.