summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-07-15 22:40:22 +0200
committerBram Moolenaar <Bram@vim.org>2019-07-15 22:40:22 +0200
commit2ac6e82a4ee06ab01905ba1f279d529de148a911 (patch)
treeedceffca855772b86e4492ef893754d518add85d
parent5d6844566a5dcb506c6d146f7e46f7e7d09220ae (diff)
downloadvim-git-2ac6e82a4ee06ab01905ba1f279d529de148a911.tar.gz
patch 8.1.1699: highlight_ga can be local instead of globalv8.1.1699
Problem: Highlight_ga can be local instead of global. Solution: Move highlight_ga into highlight.c. (Yegappan Lakshmanan, closes #4675)
-rw-r--r--src/globals.h3
-rw-r--r--src/highlight.c90
-rw-r--r--src/proto/highlight.pro5
-rw-r--r--src/structs.h50
-rw-r--r--src/syntax.c22
-rw-r--r--src/version.c2
6 files changed, 102 insertions, 70 deletions
diff --git a/src/globals.h b/src/globals.h
index bef5c30bf..b7a2ec1f3 100644
--- a/src/globals.h
+++ b/src/globals.h
@@ -355,9 +355,6 @@ EXTERN char_u hash_removed;
EXTERN int scroll_region INIT(= FALSE); /* term supports scroll region */
EXTERN int t_colors INIT(= 0); /* int value of T_CCO */
-// highlight groups for 'highlight' option
-EXTERN garray_T highlight_ga INIT(= {0 COMMA 0 COMMA sizeof(hl_group_T) COMMA 10 COMMA NULL});
-
#ifdef FEAT_CMDL_COMPL
// Flags to indicate an additional string for highlight name completion.
EXTERN int include_none INIT(= 0); // when 1 include "None"
diff --git a/src/highlight.c b/src/highlight.c
index 2ae265ce7..9322f962f 100644
--- 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 *arg, int do_normal, int do_menu, int do_
#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
diff --git a/src/proto/highlight.pro b/src/proto/highlight.pro
index 958b8b1f6..ca4498140 100644
--- a/src/proto/highlight.pro
+++ b/src/proto/highlight.pro
@@ -1,4 +1,7 @@
/* highlight.c */
+int highlight_num_groups(void);
+char_u *highlight_group_name(int id);
+int highlight_link_id(int id);
void init_highlight(int both, int reset);
int load_colors(char_u *name);
int lookup_color(int idx, int foreground, int *boldp);
@@ -23,7 +26,7 @@ attrentry_T *syn_cterm_attr2entry(int attr);
char_u *highlight_has_attr(int id, int flag, int modec);
char_u *highlight_color(int id, char_u *what, int modec);
long_u highlight_gui_color_rgb(int id, int fg);
-int syn_list_header(int did_header, int outlen, int id);
+int syn_list_header(int did_header, int outlen, int id);
int syn_name2id(char_u *name);
int syn_name2attr(char_u *name);
int highlight_exists(char_u *name);
diff --git a/src/structs.h b/src/structs.h
index fb76df9ae..25a438f72 100644
--- a/src/structs.h
+++ b/src/structs.h
@@ -999,56 +999,6 @@ struct syn_state
};
#endif // FEAT_SYN_HL
-/*
- * 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;
-
-#define HL_TABLE() ((hl_group_T *)((highlight_ga.ga_data)))
#define MAX_HL_ID 20000 // maximum value for a highlight ID.
/*
diff --git a/src/syntax.c b/src/syntax.c
index 4476ad148..ad2e1a0cc 100644
--- a/src/syntax.c
+++ b/src/syntax.c
@@ -3847,7 +3847,7 @@ syn_cmd_list(
/*
* No argument: List all group IDs and all syntax clusters.
*/
- for (id = 1; id <= highlight_ga.ga_len && !got_int; ++id)
+ for (id = 1; id <= highlight_num_groups() && !got_int; ++id)
syn_list_one(id, syncing, FALSE);
for (id = 0; id < curwin->w_s->b_syn_clusters.ga_len && !got_int; ++id)
syn_list_cluster(id);
@@ -3995,7 +3995,7 @@ syn_list_one(
if (SYN_ITEMS(curwin->w_s)[idx].sp_type == SPTYPE_SKIP)
put_pattern("skip", '=', &SYN_ITEMS(curwin->w_s)[idx++], attr);
while (idx < curwin->w_s->b_syn_patterns.ga_len
- && SYN_ITEMS(curwin->w_s)[idx].sp_type == SPTYPE_END)
+ && SYN_ITEMS(curwin->w_s)[idx].sp_type == SPTYPE_END)
put_pattern("end", '=', &SYN_ITEMS(curwin->w_s)[idx++], attr);
--idx;
msg_putchar(' ');
@@ -4022,8 +4022,8 @@ syn_list_one(
msg_puts_attr("groupthere", attr);
msg_putchar(' ');
if (spp->sp_sync_idx >= 0)
- msg_outtrans(HL_TABLE()[SYN_ITEMS(curwin->w_s)
- [spp->sp_sync_idx].sp_syn.id - 1].sg_name);
+ msg_outtrans(highlight_group_name(SYN_ITEMS(curwin->w_s)
+ [spp->sp_sync_idx].sp_syn.id - 1));
else
msg_puts("NONE");
msg_putchar(' ');
@@ -4031,12 +4031,12 @@ syn_list_one(
}
/* list the link, if there is one */
- if (HL_TABLE()[id - 1].sg_link && (did_header || link_only) && !got_int)
+ if (highlight_link_id(id - 1) && (did_header || link_only) && !got_int)
{
(void)syn_list_header(did_header, 999, id);
msg_puts_attr("links to", attr);
msg_putchar(' ');
- msg_outtrans(HL_TABLE()[HL_TABLE()[id - 1].sg_link - 1].sg_name);
+ msg_outtrans(highlight_group_name(highlight_link_id(id - 1) - 1));
}
}
@@ -4115,7 +4115,7 @@ put_id_list(char_u *name, short *list, int attr)
msg_outtrans(SYN_CLSTR(curwin->w_s)[scl_id].scl_name);
}
else
- msg_outtrans(HL_TABLE()[*p - 1].sg_name);
+ msg_outtrans(highlight_group_name(*p - 1));
if (p[1])
msg_putchar(',');
}
@@ -4144,7 +4144,7 @@ put_pattern(
if (last_matchgroup == 0)
msg_outtrans((char_u *)"NONE");
else
- msg_outtrans(HL_TABLE()[last_matchgroup - 1].sg_name);
+ msg_outtrans(highlight_group_name(last_matchgroup - 1));
msg_putchar(' ');
}
@@ -5967,9 +5967,9 @@ get_id_list(
regmatch.rm_ic = TRUE;
id = 0;
- for (i = highlight_ga.ga_len; --i >= 0; )
+ for (i = highlight_num_groups(); --i >= 0; )
{
- if (vim_regexec(&regmatch, HL_TABLE()[i].sg_name,
+ if (vim_regexec(&regmatch, highlight_group_name(i),
(colnr_T)0))
{
if (round == 2)
@@ -6685,7 +6685,7 @@ syntime_report(void)
msg_puts(" ");
# endif
msg_advance(50);
- msg_outtrans(HL_TABLE()[p->id - 1].sg_name);
+ msg_outtrans(highlight_group_name(p->id - 1));
msg_puts(" ");
msg_advance(69);
diff --git a/src/version.c b/src/version.c
index f6fed499b..85480050b 100644
--- a/src/version.c
+++ b/src/version.c
@@ -778,6 +778,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1699,
+/**/
1698,
/**/
1697,