💾 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
-=-=-=-=-=-=-
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 }