💾 Archived View for gmi.noulin.net › gitRepositories › heartbeat › file › shpPackages › termbox › ut… captured on 2024-06-20 at 11:55:51. Gemini links have been rewritten to link to archived content

View Raw

More Information

-=-=-=-=-=-=-

heartbeat

Log

Files

Refs

README

utf8.c (2007B)

     1 #include "termbox.h"
     2 
     3 static const unsigned char utf8_length[256] = {
     4   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
     5   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
     6   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
     7   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
     8   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
     9   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
    10   2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
    11   3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,1,1
    12 };
    13 
    14 static const unsigned char utf8_mask[6] = {
    15         0x7F,
    16         0x1F,
    17         0x0F,
    18         0x07,
    19         0x03,
    20         0x01
    21 };
    22 
    23 int tb_utf8_char_length(char c)
    24 {
    25         return utf8_length[(unsigned char)c];
    26 }
    27 
    28 int tb_utf8_char_to_unicode(uint32_t *out, const char *c)
    29 {
    30         if (*c == 0)
    31                 return TB_EOF;
    32 
    33         int i;
    34         unsigned char len = tb_utf8_char_length(*c);
    35         unsigned char mask = utf8_mask[len-1];
    36         uint32_t result = c[0] & mask;
    37         for (i = 1; i < len; ++i) {
    38                 result <<= 6;
    39                 result |= c[i] & 0x3f;
    40         }
    41 
    42         *out = result;
    43         return (int)len;
    44 }
    45 
    46 int tb_utf8_unicode_to_char(char *out, uint32_t c)
    47 {
    48         int len = 0;
    49         int first;
    50         int i;
    51 
    52         if (c < 0x80) {
    53                 first = 0;
    54                 len = 1;
    55         } else if (c < 0x800) {
    56                 first = 0xc0;
    57                 len = 2;
    58         } else if (c < 0x10000) {
    59                 first = 0xe0;
    60                 len = 3;
    61         } else if (c < 0x200000) {
    62                 first = 0xf0;
    63                 len = 4;
    64         } else if (c < 0x4000000) {
    65                 first = 0xf8;
    66                 len = 5;
    67         } else {
    68                 first = 0xfc;
    69                 len = 6;
    70         }
    71 
    72         for (i = len - 1; i > 0; --i) {
    73                 out[i] = (c & 0x3f) | 0x80;
    74                 c >>= 6;
    75         }
    76         out[0] = c | first;
    77 
    78         return len;
    79 }
    80 
    81 int tb_unicode_is_char_wide(uint32_t cp) {
    82   int res = 0;
    83 
    84   if (0x1D000 <= cp && cp <= 0x1F77F) // emoticons
    85     res = 1;
    86   else if (0x2100 <= cp && cp <= 0x27BF) // misc symbols and dingbats
    87     res = 1;
    88   // else if (0xFE00 <= cp && cp <= 0xFE0F) // Variation Selectors
    89   //   res = 1;
    90   else if (0x1F900 <= cp && cp <= 0x1F9FF) // Supplemental Symbols and Pictographs
    91     res = 1;
    92 
    93   return res;
    94 }