mirror of
https://github.com/neovim/neovim.git
synced 2025-10-04 00:46:30 +00:00

The "length-of-one" trick, where the last element of a struct is an array of size 1, but extra size is allocated when calling malloc where it uses more than 1 element in the array, cause problems with some compilers. Some compilers set _FORTIFY_SOURCE=2 by default which incorrectly considers it as an overflow. More information: https://github.com/neovim/neovim/issues/223#issuecomment-1413828554 Using flexible array members allows us to to properly convey to the compiler that its size may be larger than 1. This also enables us to remove lengthy workarounds that are unreliable, as they depend on CMAKE_BUILD_TYPE which isn't defined for multi-config generators. Closes: https://github.com/neovim/neovim/issues/223
64 lines
2.4 KiB
C
64 lines
2.4 KiB
C
#ifndef NVIM_SYNTAX_DEFS_H
|
|
#define NVIM_SYNTAX_DEFS_H
|
|
|
|
#include "nvim/highlight_defs.h"
|
|
|
|
#define SST_MIN_ENTRIES 150 // minimal size for state stack array
|
|
#define SST_MAX_ENTRIES 1000 // maximal size for state stack array
|
|
#define SST_FIX_STATES 7 // size of sst_stack[].
|
|
#define SST_DIST 16 // normal distance between entries
|
|
#define SST_INVALID ((synstate_T *)-1) // invalid syn_state pointer
|
|
|
|
typedef struct syn_state synstate_T;
|
|
|
|
#include "nvim/buffer_defs.h"
|
|
#include "nvim/regexp_defs.h"
|
|
|
|
// struct passed to in_id_list()
|
|
struct sp_syn {
|
|
int inc_tag; // ":syn include" unique tag
|
|
int16_t id; // highlight group ID of item
|
|
int16_t *cont_in_list; // cont.in group IDs, if non-zero
|
|
};
|
|
|
|
// Each keyword has one keyentry, which is linked in a hash list.
|
|
typedef struct keyentry keyentry_T;
|
|
|
|
struct keyentry {
|
|
keyentry_T *ke_next; // next entry with identical "keyword[]"
|
|
struct sp_syn k_syn; // struct passed to in_id_list()
|
|
int16_t *next_list; // ID list for next match (if non-zero)
|
|
int flags;
|
|
int k_char; // conceal substitute character
|
|
char keyword[];
|
|
};
|
|
|
|
// Struct used to store one state of the state stack.
|
|
typedef struct buf_state {
|
|
int bs_idx; // index of pattern
|
|
int bs_flags; // flags for pattern
|
|
int bs_seqnr; // stores si_seqnr
|
|
int bs_cchar; // stores si_cchar
|
|
reg_extmatch_T *bs_extmatch; // external matches from start pattern
|
|
} bufstate_T;
|
|
|
|
// syn_state contains the syntax state stack for the start of one line.
|
|
// Used by b_sst_array[].
|
|
struct syn_state {
|
|
synstate_T *sst_next; // next entry in used or free list
|
|
linenr_T sst_lnum; // line number for this state
|
|
union {
|
|
bufstate_T sst_stack[SST_FIX_STATES]; // short state stack
|
|
garray_T sst_ga; // growarray for long state stack
|
|
} sst_union;
|
|
int sst_next_flags; // flags for sst_next_list
|
|
int sst_stacksize; // number of states on the stack
|
|
int16_t *sst_next_list; // "nextgroup" list in this state
|
|
// (this is a copy, don't free it!
|
|
disptick_T sst_tick; // tick when last displayed
|
|
linenr_T sst_change_lnum; // when non-zero, change in this line
|
|
// may have made the state invalid
|
|
};
|
|
|
|
#endif // NVIM_SYNTAX_DEFS_H
|