diff src/term.c @ 9013:22c29a515b53 v7.4.1792

commit https://github.com/vim/vim/commit/ab3022196ea4f1496e79b8ee85996e31c45d02f1 Author: Bram Moolenaar <Bram@vim.org> Date: Tue Apr 26 20:59:29 2016 +0200 patch 7.4.1792 Problem: Color name decoding is implemented several times. Solution: Move it to term.c. (Christian Brabandt)
author Christian Brabandt <cb@256bit.org>
date Tue, 26 Apr 2016 21:00:07 +0200
parents 57b791947796
children 2e3c6071db97
line wrap: on
line diff
--- a/src/term.c
+++ b/src/term.c
@@ -1266,145 +1266,10 @@ static struct builtin_term builtin_termc
 };	/* end of builtin_termcaps */
 
 #if defined(FEAT_TERMTRUECOLOR) || defined(PROTO)
-# define RGB(r, g, b) ((r<<16) | (g<<8) | (b))
-struct rgbcolor_table_S {
-    char_u	*color_name;
-    guicolor_T	 color;
-};
-
-static struct rgbcolor_table_S rgb_table[] = {
-	{(char_u *)"black",	RGB(0x00, 0x00, 0x00)},
-	{(char_u *)"blue",	RGB(0x00, 0x00, 0xFF)},
-	{(char_u *)"brown",	RGB(0xA5, 0x2A, 0x2A)},
-	{(char_u *)"cyan",	RGB(0x00, 0xFF, 0xFF)},
-	{(char_u *)"darkblue",	RGB(0x00, 0x00, 0x8B)},
-	{(char_u *)"darkcyan",	RGB(0x00, 0x8B, 0x8B)},
-	{(char_u *)"darkgray",	RGB(0xA9, 0xA9, 0xA9)},
-	{(char_u *)"darkgreen",	RGB(0x00, 0x64, 0x00)},
-	{(char_u *)"darkgrey",	RGB(0xA9, 0xA9, 0xA9)},
-	{(char_u *)"darkmagenta",	RGB(0x8B, 0x00, 0x8B)},
-	{(char_u *)"darkred",	RGB(0x8B, 0x00, 0x00)},
-	{(char_u *)"darkyellow",	RGB(0x8B, 0x8B, 0x00)},	/* No X11 */
-	{(char_u *)"gray",	RGB(0xBE, 0xBE, 0xBE)},
-	{(char_u *)"gray10",	RGB(0x1A, 0x1A, 0x1A)},
-	{(char_u *)"gray20",	RGB(0x33, 0x33, 0x33)},
-	{(char_u *)"gray30",	RGB(0x4D, 0x4D, 0x4D)},
-	{(char_u *)"gray40",	RGB(0x66, 0x66, 0x66)},
-	{(char_u *)"gray50",	RGB(0x7F, 0x7F, 0x7F)},
-	{(char_u *)"gray60",	RGB(0x99, 0x99, 0x99)},
-	{(char_u *)"gray70",	RGB(0xB3, 0xB3, 0xB3)},
-	{(char_u *)"gray80",	RGB(0xCC, 0xCC, 0xCC)},
-	{(char_u *)"gray90",	RGB(0xE5, 0xE5, 0xE5)},
-	{(char_u *)"green",	RGB(0x00, 0xFF, 0x00)},
-	{(char_u *)"grey",	RGB(0xBE, 0xBE, 0xBE)},
-	{(char_u *)"grey10",	RGB(0x1A, 0x1A, 0x1A)},
-	{(char_u *)"grey20",	RGB(0x33, 0x33, 0x33)},
-	{(char_u *)"grey30",	RGB(0x4D, 0x4D, 0x4D)},
-	{(char_u *)"grey40",	RGB(0x66, 0x66, 0x66)},
-	{(char_u *)"grey50",	RGB(0x7F, 0x7F, 0x7F)},
-	{(char_u *)"grey60",	RGB(0x99, 0x99, 0x99)},
-	{(char_u *)"grey70",	RGB(0xB3, 0xB3, 0xB3)},
-	{(char_u *)"grey80",	RGB(0xCC, 0xCC, 0xCC)},
-	{(char_u *)"grey90",	RGB(0xE5, 0xE5, 0xE5)},
-	{(char_u *)"lightblue",	RGB(0xAD, 0xD8, 0xE6)},
-	{(char_u *)"lightcyan",	RGB(0xE0, 0xFF, 0xFF)},
-	{(char_u *)"lightgray",	RGB(0xD3, 0xD3, 0xD3)},
-	{(char_u *)"lightgreen",	RGB(0x90, 0xEE, 0x90)},
-	{(char_u *)"lightgrey",	RGB(0xD3, 0xD3, 0xD3)},
-	{(char_u *)"lightmagenta",	RGB(0xFF, 0x8B, 0xFF)},	/* No X11 */
-	{(char_u *)"lightred",	RGB(0xFF, 0x8B, 0x8B)},		/* No X11 */
-	{(char_u *)"lightyellow",	RGB(0xFF, 0xFF, 0xE0)},
-	{(char_u *)"magenta",	RGB(0xFF, 0x00, 0xFF)},
-	{(char_u *)"orange",	RGB(0xFF, 0xA5, 0x00)},
-	{(char_u *)"purple",	RGB(0xA0, 0x20, 0xF0)},
-	{(char_u *)"red",	RGB(0xFF, 0x00, 0x00)},
-	{(char_u *)"seagreen",	RGB(0x2E, 0x8B, 0x57)},
-	{(char_u *)"slateblue",	RGB(0x6A, 0x5A, 0xCD)},
-	{(char_u *)"violet",	RGB(0xEE, 0x82, 0xEE)},
-	{(char_u *)"white",	RGB(0xFF, 0xFF, 0xFF)},
-	{(char_u *)"yellow",	RGB(0xFF, 0xFF, 0x00)},
-};
-
-    static int
-hex_digit(int c)
-{
-    if (isdigit(c))
-	return c - '0';
-    c = TOLOWER_ASC(c);
-    if (c >= 'a' && c <= 'f')
-	return c - 'a' + 10;
-    return 0x1ffffff;
-}
-
     guicolor_T
 termtrue_mch_get_color(char_u *name)
 {
-    guicolor_T	color;
-    int		i;
-
-    if (*name == '#' && strlen((char *) name) == 7)
-    {
-	color = RGB(((hex_digit(name[1])<<4) + hex_digit(name[2])),
-	            ((hex_digit(name[3])<<4) + hex_digit(name[4])),
-	            ((hex_digit(name[5])<<4) + hex_digit(name[6])));
-	if (color > 0xffffff)
-	    return INVALCOLOR;
-	return color;
-    }
-    else
-    {
-	/* Check if the name is one of the colors we know */
-	for (i = 0; i < (int)(sizeof(rgb_table) / sizeof(rgb_table[0])); i++)
-	    if (STRICMP(name, rgb_table[i].color_name) == 0)
-		return rgb_table[i].color;
-    }
-
-    /*
-     * Last attempt. Look in the file "$VIM/rgb.txt".
-     */
-    {
-#define LINE_LEN 100
-	FILE	*fd;
-	char	line[LINE_LEN];
-	char_u	*fname;
-	int	r, g, b;
-
-	fname = expand_env_save((char_u *)"$VIMRUNTIME/rgb.txt");
-	if (fname == NULL)
-	    return INVALCOLOR;
-
-	fd = fopen((char *)fname, "rt");
-	vim_free(fname);
-	if (fd == NULL)
-	    return INVALCOLOR;
-
-	while (!feof(fd))
-	{
-	    int		len;
-	    int		pos;
-
-	    (void)fgets(line, LINE_LEN, fd);
-	    len = strlen(line);
-
-	    if (len <= 1 || line[len-1] != '\n')
-		continue;
-
-	    line[len-1] = '\0';
-
-	    i = sscanf(line, "%d %d %d %n", &r, &g, &b, &pos);
-	    if (i != 3)
-		continue;
-
-	    if (STRICMP(line + pos, name) == 0)
-	    {
-		fclose(fd);
-		return (guicolor_T) RGB(r, g, b);
-	    }
-	}
-	fclose(fd);
-    }
-
-    return INVALCOLOR;
+    return gui_get_color_cmn(name);
 }
 
     guicolor_T
@@ -6187,3 +6052,146 @@ update_tcap(int attr)
     }
 }
 #endif
+
+#if defined(FEAT_GUI) || defined(FEAT_TERMTRUECOLOR) || defined(PROTO)
+    static int
+hex_digit(int c)
+{
+    if (isdigit(c))
+	return c - '0';
+    c = TOLOWER_ASC(c);
+    if (c >= 'a' && c <= 'f')
+	return c - 'a' + 10;
+    return 0x1ffffff;
+}
+
+    guicolor_T
+gui_get_color_cmn(char_u *name)
+{
+#define RGB(r, g, b) ((r<<16) | (g<<8) | (b))
+#define LINE_LEN 100
+    FILE	*fd;
+    char	line[LINE_LEN];
+    char_u	*fname;
+    int		r, g, b, i;
+    guicolor_T  color;
+
+    struct rgbcolor_table_S {
+	char_u	    *color_name;
+	guicolor_T  color;
+    };
+
+    static struct rgbcolor_table_S rgb_table[] = {
+	    {(char_u *)"black",		RGB(0x00, 0x00, 0x00)},
+	    {(char_u *)"blue",		RGB(0x00, 0x00, 0xFF)},
+	    {(char_u *)"brown",		RGB(0xA5, 0x2A, 0x2A)},
+	    {(char_u *)"cyan",		RGB(0x00, 0xFF, 0xFF)},
+	    {(char_u *)"darkblue",	RGB(0x00, 0x00, 0x8B)},
+	    {(char_u *)"darkcyan",	RGB(0x00, 0x8B, 0x8B)},
+	    {(char_u *)"darkgray",	RGB(0xA9, 0xA9, 0xA9)},
+	    {(char_u *)"darkgreen",	RGB(0x00, 0x64, 0x00)},
+	    {(char_u *)"darkgrey",	RGB(0xA9, 0xA9, 0xA9)},
+	    {(char_u *)"darkmagenta",	RGB(0x8B, 0x00, 0x8B)},
+	    {(char_u *)"darkred",	RGB(0x8B, 0x00, 0x00)},
+	    {(char_u *)"darkyellow",	RGB(0x8B, 0x8B, 0x00)},	/* No X11 */
+	    {(char_u *)"gray",		RGB(0xBE, 0xBE, 0xBE)},
+	    {(char_u *)"gray10",	RGB(0x1A, 0x1A, 0x1A)},
+	    {(char_u *)"gray20",	RGB(0x33, 0x33, 0x33)},
+	    {(char_u *)"gray30",	RGB(0x4D, 0x4D, 0x4D)},
+	    {(char_u *)"gray40",	RGB(0x66, 0x66, 0x66)},
+	    {(char_u *)"gray50",	RGB(0x7F, 0x7F, 0x7F)},
+	    {(char_u *)"gray60",	RGB(0x99, 0x99, 0x99)},
+	    {(char_u *)"gray70",	RGB(0xB3, 0xB3, 0xB3)},
+	    {(char_u *)"gray80",	RGB(0xCC, 0xCC, 0xCC)},
+	    {(char_u *)"gray90",	RGB(0xE5, 0xE5, 0xE5)},
+	    {(char_u *)"green",		RGB(0x00, 0xFF, 0x00)},
+	    {(char_u *)"grey",		RGB(0xBE, 0xBE, 0xBE)},
+	    {(char_u *)"grey10",	RGB(0x1A, 0x1A, 0x1A)},
+	    {(char_u *)"grey20",	RGB(0x33, 0x33, 0x33)},
+	    {(char_u *)"grey30",	RGB(0x4D, 0x4D, 0x4D)},
+	    {(char_u *)"grey40",	RGB(0x66, 0x66, 0x66)},
+	    {(char_u *)"grey50",	RGB(0x7F, 0x7F, 0x7F)},
+	    {(char_u *)"grey60",	RGB(0x99, 0x99, 0x99)},
+	    {(char_u *)"grey70",	RGB(0xB3, 0xB3, 0xB3)},
+	    {(char_u *)"grey80",	RGB(0xCC, 0xCC, 0xCC)},
+	    {(char_u *)"grey90",	RGB(0xE5, 0xE5, 0xE5)},
+	    {(char_u *)"lightblue",	RGB(0xAD, 0xD8, 0xE6)},
+	    {(char_u *)"lightcyan",	RGB(0xE0, 0xFF, 0xFF)},
+	    {(char_u *)"lightgray",	RGB(0xD3, 0xD3, 0xD3)},
+	    {(char_u *)"lightgreen",	RGB(0x90, 0xEE, 0x90)},
+	    {(char_u *)"lightgrey",	RGB(0xD3, 0xD3, 0xD3)},
+	    {(char_u *)"lightmagenta",	RGB(0xFF, 0x8B, 0xFF)},	/* No X11 */
+	    {(char_u *)"lightred",	RGB(0xFF, 0x8B, 0x8B)},	/* No X11 */
+	    {(char_u *)"lightyellow",	RGB(0xFF, 0xFF, 0xE0)},
+	    {(char_u *)"magenta",	RGB(0xFF, 0x00, 0xFF)},
+	    {(char_u *)"orange",	RGB(0xFF, 0xA5, 0x00)},
+	    {(char_u *)"purple",	RGB(0xA0, 0x20, 0xF0)},
+	    {(char_u *)"red",		RGB(0xFF, 0x00, 0x00)},
+	    {(char_u *)"seagreen",	RGB(0x2E, 0x8B, 0x57)},
+	    {(char_u *)"slateblue",	RGB(0x6A, 0x5A, 0xCD)},
+	    {(char_u *)"violet",	RGB(0xEE, 0x82, 0xEE)},
+	    {(char_u *)"white",		RGB(0xFF, 0xFF, 0xFF)},
+	    {(char_u *)"yellow",	RGB(0xFF, 0xFF, 0x00)},
+    };
+
+
+    if (name[0] == '#' && STRLEN(name) == 7)
+    {
+	/* Name is in "#rrggbb" format */
+	color = RGB(((hex_digit(name[1]) << 4) + hex_digit(name[2])),
+		    ((hex_digit(name[3]) << 4) + hex_digit(name[4])),
+		    ((hex_digit(name[5]) << 4) + hex_digit(name[6])));
+	if (color > 0xffffff)
+	    return INVALCOLOR;
+	return color;
+    }
+
+    /* Check if the name is one of the colors we know */
+    for (i = 0; i < (int)(sizeof(rgb_table) / sizeof(rgb_table[0])); i++)
+	if (STRICMP(name, rgb_table[i].color_name) == 0)
+	    return rgb_table[i].color;
+
+    /*
+     * Last attempt. Look in the file "$VIM/rgb.txt".
+     */
+
+    fname = expand_env_save((char_u *)"$VIMRUNTIME/rgb.txt");
+    if (fname == NULL)
+	return INVALCOLOR;
+
+    fd = fopen((char *)fname, "rt");
+    vim_free(fname);
+    if (fd == NULL)
+    {
+	if (p_verbose > 1)
+	    verb_msg((char_u *)_("Cannot open $VIMRUNTIME/rgb.txt"));
+	return INVALCOLOR;
+    }
+
+    while (!feof(fd))
+    {
+	int		len;
+	int		pos;
+
+	(void)fgets(line, LINE_LEN, fd);
+	len = strlen(line);
+
+	if (len <= 1 || line[len - 1] != '\n')
+	    continue;
+
+	line[len - 1] = '\0';
+
+	i = sscanf(line, "%d %d %d %n", &r, &g, &b, &pos);
+	if (i != 3)
+	    continue;
+
+	if (STRICMP(line + pos, name) == 0)
+	{
+	    fclose(fd);
+	    return (guicolor_T) RGB(r, g, b);
+	}
+    }
+    fclose(fd);
+    return INVALCOLOR;
+}
+#endif