diff options
Diffstat (limited to 'src/nvim/viml/parser/parser.h')
-rw-r--r-- | src/nvim/viml/parser/parser.h | 141 |
1 files changed, 1 insertions, 140 deletions
diff --git a/src/nvim/viml/parser/parser.h b/src/nvim/viml/parser/parser.h index cd5a493643..31decdc798 100644 --- a/src/nvim/viml/parser/parser.h +++ b/src/nvim/viml/parser/parser.h @@ -6,80 +6,8 @@ #include "klib/kvec.h" #include "nvim/func_attr.h" -#include "nvim/mbyte.h" #include "nvim/mbyte_defs.h" -#include "nvim/memory.h" - -/// One parsed line -typedef struct { - const char *data; ///< Parsed line pointer - size_t size; ///< Parsed line size - bool allocated; ///< True if line may be freed. -} ParserLine; - -/// Line getter type for parser -/// -/// Line getter must return {NULL, 0} for EOF. -typedef void (*ParserLineGetter)(void *cookie, ParserLine *ret_pline); - -/// Parser position in the input -typedef struct { - size_t line; ///< Line index in ParserInputReader.lines. - size_t col; ///< Byte index in the line. -} ParserPosition; - -/// Parser state item. -typedef struct { - enum { - kPTopStateParsingCommand = 0, - kPTopStateParsingExpression, - } type; - union { - struct { - enum { - kExprUnknown = 0, - } type; - } expr; - } data; -} ParserStateItem; - -/// Structure defining input reader -typedef struct { - /// Function used to get next line. - ParserLineGetter get_line; - /// Data for get_line function. - void *cookie; - /// All lines obtained by get_line. - kvec_withinit_t(ParserLine, 4) lines; - /// Conversion, for :scriptencoding. - vimconv_T conv; -} ParserInputReader; - -/// Highlighted region definition -/// -/// Note: one chunk may highlight only one line. -typedef struct { - ParserPosition start; ///< Start of the highlight: line and column. - size_t end_col; ///< End column, points to the start of the next character. - const char *group; ///< Highlight group. -} ParserHighlightChunk; - -/// Highlighting defined by a parser -typedef kvec_withinit_t(ParserHighlightChunk, 16) ParserHighlight; - -/// Structure defining parser state -typedef struct { - /// Line reader. - ParserInputReader reader; - /// Position up to which input was parsed. - ParserPosition pos; - /// Parser state stack. - kvec_withinit_t(ParserStateItem, 16) stack; - /// Highlighting support. - ParserHighlight *colors; - /// True if line continuation can be used. - bool can_continuate; -} ParserState; +#include "nvim/viml/parser/parser_defs.h" // IWYU pragma: keep static inline void viml_parser_init(ParserState *ret_pstate, ParserLineGetter get_line, void *cookie, ParserHighlight *colors) @@ -109,73 +37,6 @@ static inline void viml_parser_init(ParserState *const ret_pstate, const ParserL kvi_init(ret_pstate->stack); } -static inline void viml_parser_destroy(ParserState *pstate) - REAL_FATTR_NONNULL_ALL REAL_FATTR_ALWAYS_INLINE; - -/// Free all memory allocated by the parser on heap -/// -/// @param pstate Parser state to free. -static inline void viml_parser_destroy(ParserState *const pstate) -{ - for (size_t i = 0; i < kv_size(pstate->reader.lines); i++) { - ParserLine pline = kv_A(pstate->reader.lines, i); - if (pline.allocated) { - xfree((void *)pline.data); - } - } - kvi_destroy(pstate->reader.lines); - kvi_destroy(pstate->stack); -} - -static inline void viml_preader_get_line(ParserInputReader *preader, ParserLine *ret_pline) - REAL_FATTR_NONNULL_ALL; - -/// Get one line from ParserInputReader -static inline void viml_preader_get_line(ParserInputReader *const preader, - ParserLine *const ret_pline) -{ - ParserLine pline; - preader->get_line(preader->cookie, &pline); - if (preader->conv.vc_type != CONV_NONE && pline.size) { - ParserLine cpline = { - .allocated = true, - .size = pline.size, - }; - cpline.data = string_convert(&preader->conv, (char *)pline.data, &cpline.size); - if (pline.allocated) { - xfree((void *)pline.data); - } - pline = cpline; - } - kvi_push(preader->lines, pline); - *ret_pline = pline; -} - -static inline bool viml_parser_get_remaining_line(ParserState *pstate, ParserLine *ret_pline) - REAL_FATTR_ALWAYS_INLINE REAL_FATTR_WARN_UNUSED_RESULT REAL_FATTR_NONNULL_ALL; - -/// Get currently parsed line, shifted to pstate->pos.col -/// -/// @param pstate Parser state to operate on. -/// -/// @return True if there is a line, false in case of EOF. -static inline bool viml_parser_get_remaining_line(ParserState *const pstate, - ParserLine *const ret_pline) -{ - const size_t num_lines = kv_size(pstate->reader.lines); - if (pstate->pos.line == num_lines) { - viml_preader_get_line(&pstate->reader, ret_pline); - } else { - *ret_pline = kv_last(pstate->reader.lines); - } - assert(pstate->pos.line == kv_size(pstate->reader.lines) - 1); - if (ret_pline->data != NULL) { - ret_pline->data += pstate->pos.col; - ret_pline->size -= pstate->pos.col; - } - return ret_pline->data != NULL; -} - static inline void viml_parser_advance(ParserState *pstate, size_t len) REAL_FATTR_ALWAYS_INLINE REAL_FATTR_NONNULL_ALL; |