login

<     >

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 {