diff src/highlight.c @ 17401:5462bb963075 v8.1.1699

patch 8.1.1699: highlight_ga can be local instead of global commit https://github.com/vim/vim/commit/2ac6e82a4ee06ab01905ba1f279d529de148a911 Author: Bram Moolenaar <Bram@vim.org> Date: Mon Jul 15 22:40:22 2019 +0200 patch 8.1.1699: highlight_ga can be local instead of global Problem: Highlight_ga can be local instead of global. Solution: Move highlight_ga into highlight.c. (Yegappan Lakshmanan, closes #4675)
author Bram Moolenaar <Bram@vim.org>
date Mon, 15 Jul 2019 22:45:07 +0200
parents 635d7f5010b8
children dfd87ef822aa
line wrap: on
line diff
--- a/src/highlight.c
+++ b/src/highlight.c
@@ -29,6 +29,64 @@ static int hl_attr_table[] =
     {HL_BOLD, HL_STANDOUT, HL_UNDERLINE, HL_UNDERCURL, HL_ITALIC, HL_INVERSE, HL_INVERSE, HL_NOCOMBINE, HL_STRIKETHROUGH, 0};
 #define ATTR_COMBINE(attr_a, attr_b) ((((attr_b) & HL_NOCOMBINE) ? attr_b : (attr_a)) | (attr_b))
 
+/*
+ * Structure that stores information about a highlight group.
+ * The ID of a highlight group is also called group ID.  It is the index in
+ * the highlight_ga array PLUS ONE.
+ */
+typedef struct
+{
+    char_u	*sg_name;	// highlight group name
+    char_u	*sg_name_u;	// uppercase of sg_name
+    int		sg_cleared;	// "hi clear" was used
+// for normal terminals
+    int		sg_term;	// "term=" highlighting attributes
+    char_u	*sg_start;	// terminal string for start highl
+    char_u	*sg_stop;	// terminal string for stop highl
+    int		sg_term_attr;	// Screen attr for term mode
+// for color terminals
+    int		sg_cterm;	// "cterm=" highlighting attr
+    int		sg_cterm_bold;	// bold attr was set for light color
+    int		sg_cterm_fg;	// terminal fg color number + 1
+    int		sg_cterm_bg;	// terminal bg color number + 1
+    int		sg_cterm_attr;	// Screen attr for color term mode
+// for when using the GUI
+#if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS)
+    guicolor_T	sg_gui_fg;	// GUI foreground color handle
+    guicolor_T	sg_gui_bg;	// GUI background color handle
+#endif
+#ifdef FEAT_GUI
+    guicolor_T	sg_gui_sp;	// GUI special color handle
+    GuiFont	sg_font;	// GUI font handle
+#ifdef FEAT_XFONTSET
+    GuiFontset	sg_fontset;	// GUI fontset handle
+#endif
+    char_u	*sg_font_name;  // GUI font or fontset name
+    int		sg_gui_attr;    // Screen attr for GUI mode
+#endif
+#if defined(FEAT_GUI) || defined(FEAT_EVAL)
+// Store the sp color name for the GUI or synIDattr()
+    int		sg_gui;		// "gui=" highlighting attributes
+    char_u	*sg_gui_fg_name;// GUI foreground color name
+    char_u	*sg_gui_bg_name;// GUI background color name
+    char_u	*sg_gui_sp_name;// GUI special color name
+#endif
+    int		sg_link;	// link to this highlight group ID
+    int		sg_set;		// combination of SG_* flags
+#ifdef FEAT_EVAL
+    sctx_T	sg_script_ctx;	// script in which the group was last set
+#endif
+} hl_group_T;
+
+// highlight groups for 'highlight' option
+static garray_T highlight_ga;
+#define HL_TABLE()	((hl_group_T *)((highlight_ga.ga_data)))
+
+/*
+ * An attribute number is the index in attr_table plus ATTR_OFF.
+ */
+#define ATTR_OFF (HL_ALL + 1)
+
 static void syn_unadd_group(void);
 static void set_hl_attr(int idx);
 static void highlight_list_one(int id);
@@ -46,11 +104,6 @@ static void hl_do_font(int idx, char_u *
 #endif
 
 /*
- * An attribute number is the index in attr_table plus ATTR_OFF.
- */
-#define ATTR_OFF (HL_ALL + 1)
-
-/*
  * The default highlight groups.  These are compiled-in for fast startup and
  * they still work when the runtime files can't be found.
  * When making changes here, also change runtime/colors/default.vim!
@@ -289,6 +342,33 @@ static char *(highlight_init_dark[]) = {
     NULL
 };
 
+/*
+ * Returns the number of highlight groups.
+ */
+    int
+highlight_num_groups(void)
+{
+    return highlight_ga.ga_len;
+}
+
+/*
+ * Returns the name of a highlight group.
+ */
+    char_u *
+highlight_group_name(int id)
+{
+    return HL_TABLE()[id].sg_name;
+}
+
+/*
+ * Returns the ID of the link to a highlight group.
+ */
+    int
+highlight_link_id(int id)
+{
+    return HL_TABLE()[id].sg_link;
+}
+
     void
 init_highlight(
     int		both,	    // include groups where 'bg' doesn't matter