Changeset 579


Ignore:
Timestamp:
Mar 10, 2006, 10:34:16 AM (15 years ago)
Author:
Sam Hocevar
Message:
  • Added Unicode support to the SLang driver.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcaca/trunk/caca/driver_slang.c

    r557 r579  
    105105 */
    106106static void slang_init_palette(void);
     107static void slang_write_utf32(uint32_t);
    107108
    108109#if defined(HAVE_SIGNAL)
     
    161162    SLtt_Has_Alt_Charset = 0;
    162163
    163     cucul_set_size(kk->qq, SLtt_Screen_Cols, SLtt_Screen_Rows);
     164    SLsmg_utf8_enable(1); /* 1 == force, 0 == disable, -1 == autodetect */
     165    SLtt_utf8_enable(1);
     166
     167    _cucul_set_size(kk->qq, SLtt_Screen_Cols, SLtt_Screen_Rows);
    164168
    165169    return 0;
     
    215219            {
    216220                SLsmg_set_color(slang_assoc[*attr++]);
    217                 if(c > 0x00000020 && 0x00000080)
    218                     SLsmg_write_char((char)c);
    219                 else
    220                     SLsmg_write_char(' ');
     221                slang_write_utf32(c);
    221222            }
    222223            else
     
    235236#else
    236237            SLsmg_set_color(*attr++);
    237             if(c > 0x00000020 && 0x00000080)
    238                 SLsmg_write_char((char)c);
    239             else
    240                 SLsmg_write_char(' ');
     238            slang_write_utf32(c);
    241239#endif
    242240        }
     
    377375}
    378376
     377static void slang_write_utf32(uint32_t c)
     378{
     379    static const uint8_t mark[7] =
     380    {
     381        0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC
     382    };
     383
     384    char buf[10], *parser;
     385    int bytes;
     386
     387    if(c < 0x80)
     388    {
     389        SLsmg_write_char(c);
     390        return;
     391    }
     392
     393    bytes = (c < 0x800) ? 2 : (c < 0x10000) ? 3 : 4;
     394    buf[bytes] = '\0';
     395    parser = buf + bytes;
     396
     397    switch(bytes)
     398    {
     399        case 4: *--parser = (c | 0x80) & 0xbf; c >>= 6;
     400        case 3: *--parser = (c | 0x80) & 0xbf; c >>= 6;
     401        case 2: *--parser = (c | 0x80) & 0xbf; c >>= 6;
     402    }
     403    *--parser = c | mark[bytes];
     404
     405    SLsmg_write_string(buf);
     406}
     407
    379408#if defined(HAVE_SIGNAL)
    380409static RETSIGTYPE sigwinch_handler(int sig)
Note: See TracChangeset for help on using the changeset viewer.