2020-12-27 11:59:47 (UTC-03:00)
Marcel Rodrigues <marcelgmr@gmail.com>
Merge pull request #9 from rdebath/patch-iso8859-1 Add ESC%G and ESC%@ to switch between UTF8 and ISO8859-1
diff --git a/term.c b/term.c index a42dcca..b98a1bc 100644 --- a/term.c +++ b/term.c @@ -305,6 +305,24 @@ escseq(Term *term, uint8_t byte) case '%': /* TODO: select charset */ logfmt("NYI: ESC Sequence %% (character set selection)\n"); + switch(second) + { + case '8': /* Linux switch to UTF8 */ + case 'G': /* DOCS: Designate other coding system */ + term->mode &= ~M_ISOLAT1; + if (term->cs_array[0] == CS_ISO) + term->cs_array[0] = CS_BMP; + if (term->cs_array[1] == CS_ISO) + term->cs_array[1] = CS_BMP; + break; + case '@': /* DOCS, Standard return */ + term->mode |= M_ISOLAT1; + if (term->cs_array[0] == CS_BMP) + term->cs_array[0] = CS_ISO; + if (term->cs_array[1] == CS_BMP) + term->cs_array[1] = CS_ISO; + break; + } break; case '#': switch(second) @@ -328,7 +346,7 @@ escseq(Term *term, uint8_t byte) case '(': switch (second) { case 'B': - term->cs_array[0] = CS_BMP; + term->cs_array[0] = (term->mode&M_ISOLAT1)?CS_ISO:CS_BMP; break; case '0': term->cs_array[0] = CS_VTG; @@ -338,14 +356,14 @@ escseq(Term *term, uint8_t byte) break; case 'K': logfmt("UNS: user-defined mapping\n"); - term->cs_array[0] = CS_BMP; + term->cs_array[0] = (term->mode&M_ISOLAT1)?CS_ISO:CS_BMP; break; } break; case ')': switch (second) { case 'B': - term->cs_array[1] = CS_BMP; + term->cs_array[1] = (term->mode&M_ISOLAT1)?CS_ISO:CS_BMP; break; case '0': term->cs_array[1] = CS_VTG; @@ -355,7 +373,7 @@ escseq(Term *term, uint8_t byte) break; case 'K': logfmt("UNS: user-defined mapping\n"); - term->cs_array[1] = CS_BMP; + term->cs_array[1] = (term->mode&M_ISOLAT1)?CS_ISO:CS_BMP; break; } break; @@ -483,7 +501,7 @@ sgr(Term *term, int n, int *params) break; case 10: /* TODO: reset toggle meta flag */ - term->cs_array[term->cs_index = 0] = CS_BMP; + term->cs_array[term->cs_index = 0] = (term->mode&M_ISOLAT1)?CS_ISO:CS_BMP; term->mode &= ~M_DISPCTRL; break; case 11: @@ -835,6 +853,9 @@ parse(Term *term, uint8_t byte) } else addchar(term, 0xFFFD); break; + case CS_ISO: + addchar(term, byte); + break; case CS_VTG: addchar(term, cs_vtg[byte]); break; diff --git a/term.h b/term.h index 35ba164..58fd8a6 100644 --- a/term.h +++ b/term.h @@ -21,6 +21,7 @@ #define M_MOUSEX10 0x0200 #define M_CURSORVIS 0x0400 #define M_MOUSEX11 0x0800 +#define M_ISOLAT1 0x1000 #define EMPTY 0x0020 #define BCE 1 @@ -39,7 +40,7 @@ typedef struct Cell { uint8_t pair; } Cell; -typedef enum CharSet {CS_BMP, CS_VTG, CS_437} CharSet; +typedef enum CharSet {CS_BMP, CS_ISO, CS_VTG, CS_437} CharSet; typedef enum State {S_ANY, S_ESC, S_CSI, S_OSC, S_OSCESC, S_STR, S_STRESC, S_UNI} State; typedef struct SaveCursor {