tsyn: handle non-black terminal forground colour - neatvi - [fork] simple vi-type editor with UTF-8 support
git clone git://src.adamsgaard.dk/neatvi
Log
Files
Refs
README
---
commit e14f2566479bd4cb53821e13d0518b11e4b89b94
parent c56b1c07c8afc6c7e7455f32c82c9b1f52ace59e
Author: Ali Gholami Rudi 
Date:   Mon, 22 Jun 2015 18:23:24 +0430

syn: handle non-black terminal forground colour

Reported by Dirk-Wilhelm Peters .

Diffstat:
  M syn.c                               |       7 +++----
  M term.c                              |      18 ++++++++++--------
  M vi.h                                |      17 +++++++++++------

3 files changed, 24 insertions(+), 18 deletions(-)
---
diff --git a/syn.c b/syn.c
t@@ -24,10 +24,9 @@ static struct rset *syn_find(char *ft)
 
 int syn_merge(int old, int new)
 {
-        int fg = SYN_FG(new) ? SYN_FG(new) : SYN_FG(old);
-        int bg = SYN_BG(new) ? SYN_BG(new) : SYN_BG(old);
-        int flg = (old | new) & (SYN_IT | SYN_BD | SYN_RV);
-        return flg | fg | SYN_BGMK(bg);
+        int fg = SYN_FGSET(new) ? SYN_FG(new) : SYN_FG(old);
+        int bg = SYN_BGSET(new) ? SYN_BG(new) : SYN_BG(old);
+        return ((old | new) & SYN_FLG) | (bg << 8) | fg;
 }
 
 int *syn_highlight(char *ft, char *s)
diff --git a/term.c b/term.c
t@@ -173,17 +173,19 @@ char *term_att(int att, int old)
         if (att == old)
                 return "";
         s += sprintf(s, "\33[");
-        if (fg & SYN_BD)
+        if (att & SYN_BD)
                 s += sprintf(s, ";1");
-        if (fg & SYN_IT)
+        if (att & SYN_IT)
                 s += sprintf(s, ";3");
-        else if (fg & SYN_RV)
+        else if (att & SYN_RV)
                 s += sprintf(s, ";7");
-        if ((fg & 0xff) < 8)
-                s += sprintf(s, ";%d", 30 + (fg & 0xff));
-        else
-                s += sprintf(s, ";38;5;%d", (fg & 0xff));
-        if (bg) {
+        if (SYN_FGSET(att)) {
+                if ((fg & 0xff) < 8)
+                        s += sprintf(s, ";%d", 30 + (fg & 0xff));
+                else
+                        s += sprintf(s, ";38;5;%d", (fg & 0xff));
+        }
+        if (SYN_BGSET(att)) {
                 if ((bg & 0xff) < 8)
                         s += sprintf(s, ";%d", 40 + (bg & 0xff));
                 else
diff --git a/vi.h b/vi.h
t@@ -151,12 +151,17 @@ char *cmd_pipe(char *cmd, char *s, int iproc, int oproc);
 int cmd_exec(char *cmd);
 
 /* syntax highlighting */
-#define SYN_BD                0x100
-#define SYN_IT                0x200
-#define SYN_RV                0x400
-#define SYN_BGMK(b)        ((b) << 16)
-#define SYN_FG(a)        ((a) & 0xffff)
-#define SYN_BG(a)        ((a) >> 16)
+#define SYN_BD                0x010000
+#define SYN_IT                0x020000
+#define SYN_RV                0x040000
+#define SYN_FGMK(f)        (0x100000 | (f))
+#define SYN_BGMK(b)        (0x200000 | ((b) << 8))
+
+#define SYN_FLG                0xff0000
+#define SYN_FGSET(a)        ((a) & 0x1000ff)
+#define SYN_BGSET(a)        ((a) & 0x20ff00)
+#define SYN_FG(a)        ((a) & 0xff)
+#define SYN_BG(a)        (((a) >> 8) & 0xff)
 
 int *syn_highlight(char *ft, char *s);
 char *syn_filetype(char *path);