aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/regexp_defs.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/nvim/regexp_defs.h')
-rw-r--r--src/nvim/regexp_defs.h144
1 files changed, 23 insertions, 121 deletions
diff --git a/src/nvim/regexp_defs.h b/src/nvim/regexp_defs.h
index 079f3b6929..b8e87d069d 100644
--- a/src/nvim/regexp_defs.h
+++ b/src/nvim/regexp_defs.h
@@ -15,51 +15,15 @@
#include "nvim/pos_defs.h"
#include "nvim/types_defs.h"
-/// Used for "magic_overruled".
-typedef enum {
- OPTION_MAGIC_NOT_SET, ///< p_magic not overruled
- OPTION_MAGIC_ON, ///< magic on inside regexp
- OPTION_MAGIC_OFF, ///< magic off inside regexp
-} optmagic_T;
-
-/// Magicness of a pattern, used by regexp code.
-/// The order and values matter:
-/// magic <= MAGIC_OFF includes MAGIC_NONE
-/// magic >= MAGIC_ON includes MAGIC_ALL
-typedef enum {
- MAGIC_NONE = 1, ///< "\V" very unmagic
- MAGIC_OFF = 2, ///< "\M" or 'magic' off
- MAGIC_ON = 3, ///< "\m" or 'magic'
- MAGIC_ALL = 4, ///< "\v" very magic
-} magic_T;
-
-/// The number of sub-matches is limited to 10.
-/// The first one (index 0) is the whole match, referenced with "\0".
-/// The second one (index 1) is the first sub-match, referenced with "\1".
-/// This goes up to the tenth (index 9), referenced with "\9".
-enum { NSUBEXP = 10, };
-
-/// In the NFA engine: how many braces are allowed.
-/// TODO(RE): Use dynamic memory allocation instead of static, like here
-enum { NFA_MAX_BRACES = 20, };
-
-/// In the NFA engine: how many states are allowed.
enum {
- NFA_MAX_STATES = 100000,
- NFA_TOO_EXPENSIVE = -1,
-};
-
-/// Which regexp engine to use? Needed for vim_regcomp().
-/// Must match with 'regexpengine'.
-enum {
- AUTOMATIC_ENGINE = 0,
- BACKTRACKING_ENGINE = 1,
- NFA_ENGINE = 2,
+ /// The number of sub-matches is limited to 10.
+ /// The first one (index 0) is the whole match, referenced with "\0".
+ /// The second one (index 1) is the first sub-match, referenced with "\1".
+ /// This goes up to the tenth (index 9), referenced with "\9".
+ NSUBEXP = 10,
};
typedef struct regengine regengine_T;
-typedef struct regprog regprog_T;
-typedef struct reg_extmatch reg_extmatch_T;
/// Structure to be used for multi-line matching.
/// Sub-match "no" starts in line "startpos[no].lnum" column "startpos[no].col"
@@ -77,73 +41,23 @@ typedef struct {
colnr_T rmm_maxcol; ///< when not zero: maximum column
} regmmatch_T;
-#include "nvim/buffer_defs.h"
-
-/// Structure returned by vim_regcomp() to pass on to vim_regexec().
-/// This is the general structure. For the actual matcher, two specific
-/// structures are used. See code below.
-struct regprog {
- regengine_T *engine;
- unsigned regflags;
- unsigned re_engine; ///< Automatic, backtracking or NFA engine.
- unsigned re_flags; ///< Second argument for vim_regcomp().
- bool re_in_use; ///< prog is being executed
-};
-
-/// Structure used by the back track matcher.
-/// These fields are only to be used in regexp.c!
-/// See regexp.c for an explanation.
-typedef struct {
- // These four members implement regprog_T.
- regengine_T *engine;
- unsigned regflags;
- unsigned re_engine;
- unsigned re_flags;
- bool re_in_use;
-
- int regstart;
- uint8_t reganch;
- uint8_t *regmust;
- int regmlen;
- uint8_t reghasz;
- uint8_t program[];
-} bt_regprog_T;
-
-/// Structure representing a NFA state.
-/// An NFA state may have no outgoing edge, when it is a NFA_MATCH state.
-typedef struct nfa_state nfa_state_T;
-struct nfa_state {
- int c;
- nfa_state_T *out;
- nfa_state_T *out1;
- int id;
- int lastlist[2]; ///< 0: normal, 1: recursive
- int val;
-};
-
-/// Structure used by the NFA matcher.
-typedef struct {
- // These four members implement regprog_T.
- regengine_T *engine;
- unsigned regflags;
- unsigned re_engine;
- unsigned re_flags;
- bool re_in_use;
-
- nfa_state_T *start; ///< points into state[]
-
- int reganch; ///< pattern starts with ^
- int regstart; ///< char at start of pattern
- uint8_t *match_text; ///< plain text to match with
+/// Used for "magic_overruled".
+typedef enum {
+ OPTION_MAGIC_NOT_SET, ///< p_magic not overruled
+ OPTION_MAGIC_ON, ///< magic on inside regexp
+ OPTION_MAGIC_OFF, ///< magic off inside regexp
+} optmagic_T;
- int has_zend; ///< pattern contains \ze
- int has_backref; ///< pattern contains \1 .. \9
- int reghasz;
- char *pattern;
- int nsubexp; ///< number of ()
- int nstate;
- nfa_state_T state[];
-} nfa_regprog_T;
+/// Magicness of a pattern, used by regexp code.
+/// The order and values matter:
+/// magic <= MAGIC_OFF includes MAGIC_NONE
+/// magic >= MAGIC_ON includes MAGIC_ALL
+typedef enum {
+ MAGIC_NONE = 1, ///< "\V" very unmagic
+ MAGIC_OFF = 2, ///< "\M" or 'magic' off
+ MAGIC_ON = 3, ///< "\m" or 'magic'
+ MAGIC_ALL = 4, ///< "\v" very magic
+} magic_T;
/// Structure to be used for single-line matching.
/// Sub-match "no" starts at "startp[no]" and ends just before "endp[no]".
@@ -160,22 +74,10 @@ typedef struct {
/// Structure used to store external references: "\z\(\)" to "\z\1".
/// Use a reference count to avoid the need to copy this around. When it goes
/// from 1 to zero the matches need to be freed.
-struct reg_extmatch {
+typedef struct {
int16_t refcnt;
uint8_t *matches[NSUBEXP];
-};
-
-struct regengine {
- /// bt_regcomp or nfa_regcomp
- regprog_T *(*regcomp)(uint8_t *, int);
- /// bt_regfree or nfa_regfree
- void (*regfree)(regprog_T *);
- /// bt_regexec_nl or nfa_regexec_nl
- int (*regexec_nl)(regmatch_T *, uint8_t *, colnr_T, bool);
- /// bt_regexec_mult or nfa_regexec_mult
- int (*regexec_multi)(regmmatch_T *, win_T *, buf_T *, linenr_T, colnr_T, proftime_T *, int *);
- // uint8_t *expr;
-};
+} reg_extmatch_T;
/// Flags used by vim_regsub() and vim_regsub_both()
enum {