diff options
Diffstat (limited to 'src/nvim/viml')
-rw-r--r-- | src/nvim/viml/parser/expressions.c | 3 | ||||
-rw-r--r-- | src/nvim/viml/parser/expressions.h | 4 | ||||
-rw-r--r-- | src/nvim/viml/parser/parser.c | 63 | ||||
-rw-r--r-- | src/nvim/viml/parser/parser.h | 141 | ||||
-rw-r--r-- | src/nvim/viml/parser/parser_defs.h | 79 |
5 files changed, 145 insertions, 145 deletions
diff --git a/src/nvim/viml/parser/expressions.c b/src/nvim/viml/parser/expressions.c index 8b637fbb9b..3403fb7926 100644 --- a/src/nvim/viml/parser/expressions.c +++ b/src/nvim/viml/parser/expressions.c @@ -59,8 +59,7 @@ #include "nvim/assert_defs.h" #include "nvim/charset.h" #include "nvim/eval.h" -#include "nvim/func_attr.h" -#include "nvim/gettext.h" +#include "nvim/gettext_defs.h" #include "nvim/keycodes.h" #include "nvim/macros_defs.h" #include "nvim/mbyte.h" diff --git a/src/nvim/viml/parser/expressions.h b/src/nvim/viml/parser/expressions.h index 94287ea4e1..ba54c4de07 100644 --- a/src/nvim/viml/parser/expressions.h +++ b/src/nvim/viml/parser/expressions.h @@ -6,9 +6,7 @@ #include "nvim/eval/typval_defs.h" #include "nvim/types_defs.h" -#include "nvim/viml/parser/parser.h" - -struct expr_ast_node; +#include "nvim/viml/parser/parser_defs.h" // Defines whether to ignore case: // == kCCStrategyUseOption diff --git a/src/nvim/viml/parser/parser.c b/src/nvim/viml/parser/parser.c index b854aedca6..bdade3fae2 100644 --- a/src/nvim/viml/parser/parser.c +++ b/src/nvim/viml/parser/parser.c @@ -1,3 +1,6 @@ +#include "nvim/func_attr.h" +#include "nvim/mbyte.h" +#include "nvim/memory.h" #include "nvim/viml/parser/parser.h" #ifdef INCLUDE_GENERATED_DECLARATIONS @@ -5,8 +8,68 @@ #endif void parser_simple_get_line(void *cookie, ParserLine *ret_pline) + FUNC_ATTR_NONNULL_ALL { ParserLine **plines_p = (ParserLine **)cookie; *ret_pline = **plines_p; (*plines_p)++; } + +/// 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. +bool viml_parser_get_remaining_line(ParserState *const pstate, ParserLine *const ret_pline) + FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL +{ + 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; +} + +/// Get one line from ParserInputReader +static void viml_preader_get_line(ParserInputReader *const preader, ParserLine *const ret_pline) + FUNC_ATTR_NONNULL_ALL +{ + 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; +} + +/// Free all memory allocated by the parser on heap +/// +/// @param pstate Parser state to free. +void viml_parser_destroy(ParserState *const pstate) + FUNC_ATTR_NONNULL_ALL +{ + 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); +} 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; diff --git a/src/nvim/viml/parser/parser_defs.h b/src/nvim/viml/parser/parser_defs.h new file mode 100644 index 0000000000..59fab23054 --- /dev/null +++ b/src/nvim/viml/parser/parser_defs.h @@ -0,0 +1,79 @@ +#pragma once + +#include <assert.h> +#include <stdbool.h> +#include <stddef.h> + +#include "klib/kvec.h" +#include "nvim/mbyte_defs.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; |