15b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey#include "vterm_internal.h" 25b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 35b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey#define UNICODE_INVALID 0xFFFD 45b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 55b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey#ifdef DEBUG 65b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey# define DEBUG_PRINT_UTF8 75b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey#endif 85b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 95b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeystruct UTF8DecoderData { 105b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey // number of bytes remaining in this codepoint 115b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int bytes_remaining; 125b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 135b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey // number of bytes total in this codepoint once it's finished 145b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey // (for detecting overlongs) 155b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int bytes_total; 165b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 175b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int this_cp; 185b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey}; 195b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 205b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeystatic void init_utf8(VTermEncoding *enc, void *data_) 215b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey{ 225b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey struct UTF8DecoderData *data = data_; 235b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 245b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey data->bytes_remaining = 0; 255b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey data->bytes_total = 0; 265b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey} 275b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 285b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeystatic void decode_utf8(VTermEncoding *enc, void *data_, 295b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey uint32_t cp[], int *cpi, int cplen, 305b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey const char bytes[], size_t *pos, size_t bytelen) 315b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey{ 325b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey struct UTF8DecoderData *data = data_; 335b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 345b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey#ifdef DEBUG_PRINT_UTF8 355b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey printf("BEGIN UTF-8\n"); 365b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey#endif 375b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 385b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey for(; *pos < bytelen && *cpi < cplen; (*pos)++) { 395b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey unsigned char c = bytes[*pos]; 405b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 415b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey#ifdef DEBUG_PRINT_UTF8 425b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey printf(" pos=%zd c=%02x rem=%d\n", *pos, c, data->bytes_remaining); 435b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey#endif 445b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 455b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey if(c < 0x20) 465b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey return; 475b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 485b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey else if(c >= 0x20 && c < 0x80) { 495b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey if(data->bytes_remaining) 505b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey cp[(*cpi)++] = UNICODE_INVALID; 515b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 525b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey cp[(*cpi)++] = c; 535b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey#ifdef DEBUG_PRINT_UTF8 545b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey printf(" UTF-8 char: U+%04x\n", c); 555b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey#endif 565b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey data->bytes_remaining = 0; 575b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey } 585b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 595b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey else if(c >= 0x80 && c < 0xc0) { 605b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey if(!data->bytes_remaining) { 615b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey cp[(*cpi)++] = UNICODE_INVALID; 625b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey continue; 635b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey } 645b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 655b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey data->this_cp <<= 6; 665b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey data->this_cp |= c & 0x3f; 675b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey data->bytes_remaining--; 685b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 695b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey if(!data->bytes_remaining) { 705b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey#ifdef DEBUG_PRINT_UTF8 715b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey printf(" UTF-8 raw char U+%04x bytelen=%d ", data->this_cp, data->bytes_total); 725b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey#endif 735b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey // Check for overlong sequences 745b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey switch(data->bytes_total) { 755b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey case 2: 765b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey if(data->this_cp < 0x0080) data->this_cp = UNICODE_INVALID; break; 775b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey case 3: 785b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey if(data->this_cp < 0x0800) data->this_cp = UNICODE_INVALID; break; 795b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey case 4: 805b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey if(data->this_cp < 0x10000) data->this_cp = UNICODE_INVALID; break; 815b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey case 5: 825b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey if(data->this_cp < 0x200000) data->this_cp = UNICODE_INVALID; break; 835b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey case 6: 845b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey if(data->this_cp < 0x4000000) data->this_cp = UNICODE_INVALID; break; 855b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey } 865b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey // Now look for plain invalid ones 875b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey if((data->this_cp >= 0xD800 && data->this_cp <= 0xDFFF) || 885b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey data->this_cp == 0xFFFE || 895b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey data->this_cp == 0xFFFF) 905b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey data->this_cp = UNICODE_INVALID; 915b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey#ifdef DEBUG_PRINT_UTF8 925b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey printf(" char: U+%04x\n", data->this_cp); 935b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey#endif 945b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey cp[(*cpi)++] = data->this_cp; 955b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey } 965b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey } 975b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 985b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey else if(c >= 0xc0 && c < 0xe0) { 995b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey if(data->bytes_remaining) 1005b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey cp[(*cpi)++] = UNICODE_INVALID; 1015b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1025b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey data->this_cp = c & 0x1f; 1035b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey data->bytes_total = 2; 1045b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey data->bytes_remaining = 1; 1055b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey } 1065b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1075b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey else if(c >= 0xe0 && c < 0xf0) { 1085b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey if(data->bytes_remaining) 1095b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey cp[(*cpi)++] = UNICODE_INVALID; 1105b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1115b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey data->this_cp = c & 0x0f; 1125b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey data->bytes_total = 3; 1135b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey data->bytes_remaining = 2; 1145b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey } 1155b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1165b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey else if(c >= 0xf0 && c < 0xf8) { 1175b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey if(data->bytes_remaining) 1185b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey cp[(*cpi)++] = UNICODE_INVALID; 1195b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1205b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey data->this_cp = c & 0x07; 1215b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey data->bytes_total = 4; 1225b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey data->bytes_remaining = 3; 1235b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey } 1245b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1255b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey else if(c >= 0xf8 && c < 0xfc) { 1265b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey if(data->bytes_remaining) 1275b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey cp[(*cpi)++] = UNICODE_INVALID; 1285b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1295b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey data->this_cp = c & 0x03; 1305b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey data->bytes_total = 5; 1315b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey data->bytes_remaining = 4; 1325b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey } 1335b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1345b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey else if(c >= 0xfc && c < 0xfe) { 1355b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey if(data->bytes_remaining) 1365b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey cp[(*cpi)++] = UNICODE_INVALID; 1375b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1385b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey data->this_cp = c & 0x01; 1395b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey data->bytes_total = 6; 1405b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey data->bytes_remaining = 5; 1415b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey } 1425b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1435b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey else { 1445b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey cp[(*cpi)++] = UNICODE_INVALID; 1455b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey } 1465b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey } 1475b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey} 1485b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1495b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeystatic VTermEncoding encoding_utf8 = { 1505b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey .init = &init_utf8, 1515b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey .decode = &decode_utf8, 1525b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey}; 1535b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1545b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeystatic void decode_usascii(VTermEncoding *enc, void *data, 1555b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey uint32_t cp[], int *cpi, int cplen, 1565b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey const char bytes[], size_t *pos, size_t bytelen) 1575b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey{ 1585b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int is_gr = bytes[*pos] & 0x80; 1595b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1605b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey for(; *pos < bytelen && *cpi < cplen; (*pos)++) { 1615b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey unsigned char c = bytes[*pos] ^ is_gr; 1625b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1635b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey if(c < 0x20 || c >= 0x80) 1645b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey return; 1655b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1665b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey cp[(*cpi)++] = c; 1675b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey } 1685b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey} 1695b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1705b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeystatic VTermEncoding encoding_usascii = { 1715b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey .decode = &decode_usascii, 1725b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey}; 1735b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1745b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeystruct StaticTableEncoding { 1755b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey const VTermEncoding enc; 1765b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey const uint32_t chars[128]; 1775b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey}; 1785b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1795b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeystatic void decode_table(VTermEncoding *enc, void *data, 1805b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey uint32_t cp[], int *cpi, int cplen, 1815b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey const char bytes[], size_t *pos, size_t bytelen) 1825b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey{ 1835b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey struct StaticTableEncoding *table = (struct StaticTableEncoding *)enc; 1845b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey int is_gr = bytes[*pos] & 0x80; 1855b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1865b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey for(; *pos < bytelen && *cpi < cplen; (*pos)++) { 1875b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey unsigned char c = bytes[*pos] ^ is_gr; 1885b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1895b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey if(c < 0x20 || c >= 0x80) 1905b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey return; 1915b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1925b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey if(table->chars[c]) 1935b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey cp[(*cpi)++] = table->chars[c]; 1945b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey else 1955b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey cp[(*cpi)++] = c; 1965b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey } 1975b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey} 1985b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 1995b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey#include "encoding/DECdrawing.inc" 2005b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey#include "encoding/uk.inc" 2015b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 2025b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeystatic struct { 2035b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey VTermEncodingType type; 2045b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey char designation; 2055b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey VTermEncoding *enc; 2065b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey} 2075b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkeyencodings[] = { 2085b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey { ENC_UTF8, 'u', &encoding_utf8 }, 2095b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey { ENC_SINGLE_94, '0', (VTermEncoding*)&encoding_DECdrawing }, 2105b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey { ENC_SINGLE_94, 'A', (VTermEncoding*)&encoding_uk }, 2115b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey { ENC_SINGLE_94, 'B', &encoding_usascii }, 21273fbfc38792bd96137d5b6ae3016dfc4d9805d46Jeff Sharkey { 0 }, 2135b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey}; 2145b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey 2155b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff SharkeyVTermEncoding *vterm_lookup_encoding(VTermEncodingType type, char designation) 2165b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey{ 2175b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey for(int i = 0; encodings[i].designation; i++) 2185b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey if(encodings[i].type == type && encodings[i].designation == designation) 2195b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey return encodings[i].enc; 2205b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey return NULL; 2215b78a3aa7741c3f44b676ccffa765cecee1cbd4cJeff Sharkey} 222