# HG changeset patch # User Bram Moolenaar # Date 1563223507 -7200 # Node ID 5462bb963075992a42ffd05b954cdfd281eced65 # Parent 124b8dfb28b892727d81615dab391455cf270e07 patch 8.1.1699: highlight_ga can be local instead of global commit https://github.com/vim/vim/commit/2ac6e82a4ee06ab01905ba1f279d529de148a911 Author: Bram Moolenaar 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) diff --git a/src/globals.h b/src/globals.h --- 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 --- 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 diff --git a/src/proto/highlight.pro b/src/proto/highlight.pro --- 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 at 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 --- 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 --- 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, i 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(®match, HL_TABLE()[i].sg_name, + if (vim_regexec(®match, 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 --- 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,