Changeset 641 for libcaca/trunk


Ignore:
Timestamp:
Mar 17, 2006, 10:56:28 AM (15 years ago)
Author:
Sam Hocevar
Message:
  • Full Unicode support in the SVG exporter.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcaca/trunk/cucul/export_svg.c

    r637 r641  
    107107            if(c < 0x00000020)
    108108                cur += sprintf(cur, "?");
    109             else if(c < 0x00000080)
    110                 cur += sprintf(cur, "%c", c);
    111             else
    112                 cur += sprintf(cur, "?"); /* FIXME: SVG supports UTF-8 */
     109            else if(c > 0x0000007f)
     110            {
     111                static const uint8_t mark[7] =
     112                {
     113                    0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC
     114                };
     115
     116                char buf[10], *parser;
     117                int bytes = (c < 0x800) ? 2 : (c < 0x10000) ? 3 : 4;
     118
     119                buf[bytes] = '\0';
     120                parser = buf + bytes;
     121
     122                switch(bytes)
     123                {
     124                    case 4: *--parser = (c | 0x80) & 0xbf; c >>= 6;
     125                    case 3: *--parser = (c | 0x80) & 0xbf; c >>= 6;
     126                    case 2: *--parser = (c | 0x80) & 0xbf; c >>= 6;
     127                }
     128                *--parser = c | mark[bytes];
     129
     130                cur += sprintf(cur, "%s", buf);
     131            }
     132            else switch((uint8_t)c)
     133            {
     134                case '>': cur += sprintf(cur, "&gt;"); break;
     135                case '<': cur += sprintf(cur, "&lt;"); break;
     136                case '&': cur += sprintf(cur, "&amp;"); break;
     137                default: cur += sprintf(cur, "%c", c); break;
     138            }
    113139            cur += sprintf(cur, "</text>\n");
    114140        }
Note: See TracChangeset for help on using the changeset viewer.