mirror of
https://github.com/neovim/neovim.git
synced 2025-09-10 13:28:19 +00:00
Add automatic generation of headers
- The 'stripdecls.py' script replaces declarations in all headers by includes to generated headers. `ag '#\s*if(?!ndef NEOVIM_).*((?!#\s*endif).*\n)*#ifdef INCLUDE_GENERATED'` was used for this. - Add and integrate gendeclarations.lua into the build system to generate the required includes. - Add -Wno-unused-function - Made a bunch of old-style definitions ANSI This adds a requirement: all type and structure definitions must be present before INCLUDE_GENERATED_DECLARATIONS-protected include. Warning: mch_expandpath (path.h.generated.h) was moved manually. So far it is the only exception.
This commit is contained in:
@@ -81,6 +81,16 @@ static garray_T highlight_ga; /* highlight groups for 'highlight' option */
|
||||
|
||||
#define MAX_HL_ID 20000 /* maximum value for a highlight ID. */
|
||||
|
||||
/* different types of offsets that are possible */
|
||||
#define SPO_MS_OFF 0 /* match start offset */
|
||||
#define SPO_ME_OFF 1 /* match end offset */
|
||||
#define SPO_HS_OFF 2 /* highl. start offset */
|
||||
#define SPO_HE_OFF 3 /* highl. end offset */
|
||||
#define SPO_RS_OFF 4 /* region start offset */
|
||||
#define SPO_RE_OFF 5 /* region end offset */
|
||||
#define SPO_LC_OFF 6 /* leading context offset */
|
||||
#define SPO_COUNT 7
|
||||
|
||||
/* Flags to indicate an additional string for highlight name completion. */
|
||||
static int include_none = 0; /* when 1 include "nvim/None" */
|
||||
static int include_default = 0; /* when 1 include "nvim/default" */
|
||||
@@ -97,40 +107,6 @@ static int hl_attr_table[] =
|
||||
{HL_BOLD, HL_STANDOUT, HL_UNDERLINE, HL_UNDERCURL, HL_ITALIC, HL_INVERSE,
|
||||
HL_INVERSE, 0};
|
||||
|
||||
static int get_attr_entry(garray_T *table, attrentry_T *aep);
|
||||
static void syn_unadd_group(void);
|
||||
static void set_hl_attr(int idx);
|
||||
static void highlight_list_one(int id);
|
||||
static int highlight_list_arg(int id, int didh, int type, int iarg,
|
||||
char_u *sarg,
|
||||
char *name);
|
||||
static int syn_add_group(char_u *name);
|
||||
static int syn_list_header(int did_header, int outlen, int id);
|
||||
static int hl_has_settings(int idx, int check_link);
|
||||
static void highlight_clear(int idx);
|
||||
|
||||
|
||||
/*
|
||||
* An attribute number is the index in attr_table plus ATTR_OFF.
|
||||
*/
|
||||
#define ATTR_OFF (HL_ALL + 1)
|
||||
|
||||
|
||||
#define SYN_NAMELEN 50 /* maximum length of a syntax name */
|
||||
|
||||
/* different types of offsets that are possible */
|
||||
#define SPO_MS_OFF 0 /* match start offset */
|
||||
#define SPO_ME_OFF 1 /* match end offset */
|
||||
#define SPO_HS_OFF 2 /* highl. start offset */
|
||||
#define SPO_HE_OFF 3 /* highl. end offset */
|
||||
#define SPO_RS_OFF 4 /* region start offset */
|
||||
#define SPO_RE_OFF 5 /* region end offset */
|
||||
#define SPO_LC_OFF 6 /* leading context offset */
|
||||
#define SPO_COUNT 7
|
||||
|
||||
static char *(spo_name_tab[SPO_COUNT]) =
|
||||
{"ms=", "me=", "hs=", "he=", "rs=", "re=", "lc="};
|
||||
|
||||
/*
|
||||
* The patterns that are being searched for are stored in a syn_pattern.
|
||||
* A match item consists of one pattern.
|
||||
@@ -162,6 +138,87 @@ typedef struct syn_pattern {
|
||||
int sp_startcol; /* next match in sp_line_id line */
|
||||
} synpat_T;
|
||||
|
||||
|
||||
typedef struct syn_cluster_S {
|
||||
char_u *scl_name; /* syntax cluster name */
|
||||
char_u *scl_name_u; /* uppercase of scl_name */
|
||||
short *scl_list; /* IDs in this syntax cluster */
|
||||
} syn_cluster_T;
|
||||
|
||||
/*
|
||||
* For the current state we need to remember more than just the idx.
|
||||
* When si_m_endpos.lnum is 0, the items other than si_idx are unknown.
|
||||
* (The end positions have the column number of the next char)
|
||||
*/
|
||||
typedef struct state_item {
|
||||
int si_idx; /* index of syntax pattern or
|
||||
KEYWORD_IDX */
|
||||
int si_id; /* highlight group ID for keywords */
|
||||
int si_trans_id; /* idem, transparency removed */
|
||||
int si_m_lnum; /* lnum of the match */
|
||||
int si_m_startcol; /* starting column of the match */
|
||||
lpos_T si_m_endpos; /* just after end posn of the match */
|
||||
lpos_T si_h_startpos; /* start position of the highlighting */
|
||||
lpos_T si_h_endpos; /* end position of the highlighting */
|
||||
lpos_T si_eoe_pos; /* end position of end pattern */
|
||||
int si_end_idx; /* group ID for end pattern or zero */
|
||||
int si_ends; /* if match ends before si_m_endpos */
|
||||
int si_attr; /* attributes in this state */
|
||||
long si_flags; /* HL_HAS_EOL flag in this state, and
|
||||
* HL_SKIP* for si_next_list */
|
||||
int si_seqnr; /* sequence number */
|
||||
int si_cchar; /* substitution character for conceal */
|
||||
short *si_cont_list; /* list of contained groups */
|
||||
short *si_next_list; /* nextgroup IDs after this item ends */
|
||||
reg_extmatch_T *si_extmatch; /* \z(...\) matches from start
|
||||
* pattern */
|
||||
} stateitem_T;
|
||||
|
||||
/*
|
||||
* Struct to reduce the number of arguments to get_syn_options(), it's used
|
||||
* very often.
|
||||
*/
|
||||
typedef struct {
|
||||
int flags; /* flags for contained and transparent */
|
||||
int keyword; /* TRUE for ":syn keyword" */
|
||||
int *sync_idx; /* syntax item for "grouphere" argument, NULL
|
||||
if not allowed */
|
||||
char has_cont_list; /* TRUE if "cont_list" can be used */
|
||||
short *cont_list; /* group IDs for "contains" argument */
|
||||
short *cont_in_list; /* group IDs for "containedin" argument */
|
||||
short *next_list; /* group IDs for "nextgroup" argument */
|
||||
} syn_opt_arg_T;
|
||||
|
||||
typedef struct {
|
||||
proftime_T total;
|
||||
int count;
|
||||
int match;
|
||||
proftime_T slowest;
|
||||
proftime_T average;
|
||||
int id;
|
||||
char_u *pattern;
|
||||
} time_entry_T;
|
||||
|
||||
struct name_list {
|
||||
int flag;
|
||||
char *name;
|
||||
};
|
||||
|
||||
#ifdef INCLUDE_GENERATED_DECLARATIONS
|
||||
# include "syntax.c.generated.h"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* An attribute number is the index in attr_table plus ATTR_OFF.
|
||||
*/
|
||||
#define ATTR_OFF (HL_ALL + 1)
|
||||
|
||||
|
||||
#define SYN_NAMELEN 50 /* maximum length of a syntax name */
|
||||
|
||||
static char *(spo_name_tab[SPO_COUNT]) =
|
||||
{"ms=", "me=", "hs=", "he=", "rs=", "re=", "lc="};
|
||||
|
||||
/* The sp_off_flags are computed like this:
|
||||
* offset from the start of the matched text: (1 << SPO_XX_OFF)
|
||||
* offset from the end of the matched text: (1 << (SPO_XX_OFF + SPO_COUNT))
|
||||
@@ -198,12 +255,6 @@ static int current_flags = 0;
|
||||
static int current_seqnr = 0;
|
||||
static int current_sub_char = 0;
|
||||
|
||||
typedef struct syn_cluster_S {
|
||||
char_u *scl_name; /* syntax cluster name */
|
||||
char_u *scl_name_u; /* uppercase of scl_name */
|
||||
short *scl_list; /* IDs in this syntax cluster */
|
||||
} syn_cluster_T;
|
||||
|
||||
/*
|
||||
* Methods of combining two clusters
|
||||
*/
|
||||
@@ -265,56 +316,12 @@ static int keepend_level = -1;
|
||||
|
||||
static char msg_no_items[] = N_("No Syntax items defined for this buffer");
|
||||
|
||||
/*
|
||||
* For the current state we need to remember more than just the idx.
|
||||
* When si_m_endpos.lnum is 0, the items other than si_idx are unknown.
|
||||
* (The end positions have the column number of the next char)
|
||||
*/
|
||||
typedef struct state_item {
|
||||
int si_idx; /* index of syntax pattern or
|
||||
KEYWORD_IDX */
|
||||
int si_id; /* highlight group ID for keywords */
|
||||
int si_trans_id; /* idem, transparency removed */
|
||||
int si_m_lnum; /* lnum of the match */
|
||||
int si_m_startcol; /* starting column of the match */
|
||||
lpos_T si_m_endpos; /* just after end posn of the match */
|
||||
lpos_T si_h_startpos; /* start position of the highlighting */
|
||||
lpos_T si_h_endpos; /* end position of the highlighting */
|
||||
lpos_T si_eoe_pos; /* end position of end pattern */
|
||||
int si_end_idx; /* group ID for end pattern or zero */
|
||||
int si_ends; /* if match ends before si_m_endpos */
|
||||
int si_attr; /* attributes in this state */
|
||||
long si_flags; /* HL_HAS_EOL flag in this state, and
|
||||
* HL_SKIP* for si_next_list */
|
||||
int si_seqnr; /* sequence number */
|
||||
int si_cchar; /* substitution character for conceal */
|
||||
short *si_cont_list; /* list of contained groups */
|
||||
short *si_next_list; /* nextgroup IDs after this item ends */
|
||||
reg_extmatch_T *si_extmatch; /* \z(...\) matches from start
|
||||
* pattern */
|
||||
} stateitem_T;
|
||||
|
||||
#define KEYWORD_IDX -1 /* value of si_idx for keywords */
|
||||
#define ID_LIST_ALL (short *)-1 /* valid of si_cont_list for containing all
|
||||
but contained groups */
|
||||
|
||||
static int next_seqnr = 0; /* value to use for si_seqnr */
|
||||
|
||||
/*
|
||||
* Struct to reduce the number of arguments to get_syn_options(), it's used
|
||||
* very often.
|
||||
*/
|
||||
typedef struct {
|
||||
int flags; /* flags for contained and transparent */
|
||||
int keyword; /* TRUE for ":syn keyword" */
|
||||
int *sync_idx; /* syntax item for "grouphere" argument, NULL
|
||||
if not allowed */
|
||||
char has_cont_list; /* TRUE if "cont_list" can be used */
|
||||
short *cont_list; /* group IDs for "contains" argument */
|
||||
short *cont_in_list; /* group IDs for "containedin" argument */
|
||||
short *next_list; /* group IDs for "nextgroup" argument */
|
||||
} syn_opt_arg_T;
|
||||
|
||||
/*
|
||||
* The next possible match in the current line for any pattern is remembered,
|
||||
* to avoid having to try for a match in each column.
|
||||
@@ -360,115 +367,10 @@ static int current_line_id = 0; /* unique number for current line */
|
||||
|
||||
#define CUR_STATE(idx) ((stateitem_T *)(current_state.ga_data))[idx]
|
||||
|
||||
static void syn_sync(win_T *wp, linenr_T lnum, synstate_T *last_valid);
|
||||
static int syn_match_linecont(linenr_T lnum);
|
||||
static void syn_start_line(void);
|
||||
static void syn_update_ends(int startofline);
|
||||
static void syn_stack_alloc(void);
|
||||
static int syn_stack_cleanup(void);
|
||||
static void syn_stack_free_entry(synblock_T *block, synstate_T *p);
|
||||
static synstate_T *syn_stack_find_entry(linenr_T lnum);
|
||||
static synstate_T *store_current_state(void);
|
||||
static void load_current_state(synstate_T *from);
|
||||
static void invalidate_current_state(void);
|
||||
static int syn_stack_equal(synstate_T *sp);
|
||||
static void validate_current_state(void);
|
||||
static int syn_finish_line(int syncing);
|
||||
static int syn_current_attr(int syncing, int displaying, int *can_spell,
|
||||
int keep_state);
|
||||
static int did_match_already(int idx, garray_T *gap);
|
||||
static stateitem_T *push_next_match(stateitem_T *cur_si);
|
||||
static void check_state_ends(void);
|
||||
static void update_si_attr(int idx);
|
||||
static void check_keepend(void);
|
||||
static void update_si_end(stateitem_T *sip, int startcol, int force);
|
||||
static short *copy_id_list(short *list);
|
||||
static int in_id_list(stateitem_T *item, short *cont_list,
|
||||
struct sp_syn *ssp,
|
||||
int contained);
|
||||
static void push_current_state(int idx);
|
||||
static void pop_current_state(void);
|
||||
static void syn_clear_time(syn_time_T *tt);
|
||||
static void syntime_clear(void);
|
||||
static int syn_compare_syntime(const void *v1, const void *v2);
|
||||
static void syntime_report(void);
|
||||
static int syn_time_on = FALSE;
|
||||
# define IF_SYN_TIME(p) (p)
|
||||
|
||||
static void syn_stack_apply_changes_block(synblock_T *block, buf_T *buf);
|
||||
static void find_endpos(int idx, lpos_T *startpos, lpos_T *m_endpos,
|
||||
lpos_T *hl_endpos, long *flagsp, lpos_T *end_endpos,
|
||||
int *end_idx, reg_extmatch_T *start_ext);
|
||||
static void clear_syn_state(synstate_T *p);
|
||||
static void clear_current_state(void);
|
||||
|
||||
static void limit_pos(lpos_T *pos, lpos_T *limit);
|
||||
static void limit_pos_zero(lpos_T *pos, lpos_T *limit);
|
||||
static void syn_add_end_off(lpos_T *result, regmmatch_T *regmatch,
|
||||
synpat_T *spp, int idx,
|
||||
int extra);
|
||||
static void syn_add_start_off(lpos_T *result, regmmatch_T *regmatch,
|
||||
synpat_T *spp, int idx,
|
||||
int extra);
|
||||
static char_u *syn_getcurline(void);
|
||||
static int syn_regexec(regmmatch_T *rmp, linenr_T lnum, colnr_T col,
|
||||
syn_time_T *st);
|
||||
static int check_keyword_id(char_u *line, int startcol, int *endcol,
|
||||
long *flags, short **next_list,
|
||||
stateitem_T *cur_si,
|
||||
int *ccharp);
|
||||
static keyentry_T *match_keyword(char_u *keyword, hashtab_T *ht,
|
||||
stateitem_T *cur_si);
|
||||
static void syn_cmd_case(exarg_T *eap, int syncing);
|
||||
static void syn_cmd_spell(exarg_T *eap, int syncing);
|
||||
static void syntax_sync_clear(void);
|
||||
static void syn_remove_pattern(synblock_T *block, int idx);
|
||||
static void syn_clear_pattern(synblock_T *block, int i);
|
||||
static void syn_clear_cluster(synblock_T *block, int i);
|
||||
static void syn_cmd_clear(exarg_T *eap, int syncing);
|
||||
static void syn_cmd_conceal(exarg_T *eap, int syncing);
|
||||
static void syn_clear_one(int id, int syncing);
|
||||
static void syn_cmd_on(exarg_T *eap, int syncing);
|
||||
static void syn_cmd_enable(exarg_T *eap, int syncing);
|
||||
static void syn_cmd_reset(exarg_T *eap, int syncing);
|
||||
static void syn_cmd_manual(exarg_T *eap, int syncing);
|
||||
static void syn_cmd_off(exarg_T *eap, int syncing);
|
||||
static void syn_cmd_onoff(exarg_T *eap, char *name);
|
||||
static void syn_cmd_list(exarg_T *eap, int syncing);
|
||||
static void syn_lines_msg(void);
|
||||
static void syn_match_msg(void);
|
||||
static void syn_stack_free_block(synblock_T *block);
|
||||
static void syn_list_one(int id, int syncing, int link_only);
|
||||
static void syn_list_cluster(int id);
|
||||
static void put_id_list(char_u *name, short *list, int attr);
|
||||
static void put_pattern(char *s, int c, synpat_T *spp, int attr);
|
||||
static int syn_list_keywords(int id, hashtab_T *ht, int did_header,
|
||||
int attr);
|
||||
static void syn_clear_keyword(int id, hashtab_T *ht);
|
||||
static void clear_keywtab(hashtab_T *ht);
|
||||
static void add_keyword(char_u *name, int id, int flags,
|
||||
short *cont_in_list, short *next_list,
|
||||
int conceal_char);
|
||||
static char_u *get_group_name(char_u *arg, char_u **name_end);
|
||||
static char_u *get_syn_options(char_u *arg, syn_opt_arg_T *opt,
|
||||
int *conceal_char);
|
||||
static void syn_cmd_include(exarg_T *eap, int syncing);
|
||||
static void syn_cmd_keyword(exarg_T *eap, int syncing);
|
||||
static void syn_cmd_match(exarg_T *eap, int syncing);
|
||||
static void syn_cmd_region(exarg_T *eap, int syncing);
|
||||
static int syn_compare_stub(const void *v1, const void *v2);
|
||||
static void syn_cmd_cluster(exarg_T *eap, int syncing);
|
||||
static int syn_scl_name2id(char_u *name);
|
||||
static int syn_scl_namen2id(char_u *linep, int len);
|
||||
static int syn_check_cluster(char_u *pp, int len);
|
||||
static int syn_add_cluster(char_u *name);
|
||||
static void init_syn_patterns(void);
|
||||
static char_u *get_syn_pattern(char_u *arg, synpat_T *ci);
|
||||
static void syn_cmd_sync(exarg_T *eap, int syncing);
|
||||
static int get_id_list(char_u **arg, int keylen, short **list);
|
||||
static void syn_combine_list(short **clstr1, short **clstr2,
|
||||
int list_op);
|
||||
static void syn_incl_toplevel(int id, int *flagsp);
|
||||
|
||||
/*
|
||||
* Start the syntax recognition for a line. This function is normally called
|
||||
@@ -3518,12 +3420,6 @@ static void syn_match_msg(void)
|
||||
|
||||
static int last_matchgroup;
|
||||
|
||||
struct name_list {
|
||||
int flag;
|
||||
char *name;
|
||||
};
|
||||
|
||||
static void syn_list_flags(struct name_list *nl, int flags, int attr);
|
||||
|
||||
/*
|
||||
* List one syntax item, for ":syntax" or "syntax list syntax_name".
|
||||
@@ -5788,16 +5684,6 @@ char_u *get_syntime_arg(expand_T *xp, int idx)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
proftime_T total;
|
||||
int count;
|
||||
int match;
|
||||
proftime_T slowest;
|
||||
proftime_T average;
|
||||
int id;
|
||||
char_u *pattern;
|
||||
} time_entry_T;
|
||||
|
||||
static int syn_compare_syntime(const void *v1, const void *v2)
|
||||
{
|
||||
const time_entry_T *s1 = v1;
|
||||
@@ -7688,8 +7574,6 @@ int highlight_changed(void)
|
||||
return OK;
|
||||
}
|
||||
|
||||
static void highlight_list(void);
|
||||
static void highlight_list_two(int cnt, int attr);
|
||||
|
||||
/*
|
||||
* Handle command line completion for :highlight command.
|
||||
|
Reference in New Issue
Block a user