Files
neovim/src/nvim/syntax_defs.h
dundargoc ebd2372f92 refactor: use flexible arrays instead of the length-of-one trick (#22072)
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
2023-02-02 23:56:25 +01:00

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