| 
									
										
										
										
											2016-08-29 22:49:24 +02:00
										 |  |  | /* vi:set ts=8 sts=4 sw=4 noet:
 | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This is NOT the original regular expression code as written by Henry | 
					
						
							|  |  |  |  * Spencer.  This code has been modified specifically for use with Vim, and | 
					
						
							|  |  |  |  * should not be used apart from compiling Vim.  If you want a good regular | 
					
						
							|  |  |  |  * expression library, get the original code. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef _REGEXP_H
 | 
					
						
							|  |  |  | #define _REGEXP_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * 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". | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #define NSUBEXP  10
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-19 19:40:29 +02:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * In the NFA engine: how many braces are allowed. | 
					
						
							|  |  |  |  * TODO(RE): Use dynamic memory allocation instead of static, like here | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #define NFA_MAX_BRACES 20
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-05 14:27:36 +01:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * In the NFA engine: how many states are allowed | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #define NFA_MAX_STATES 100000
 | 
					
						
							| 
									
										
										
										
											2022-03-27 20:05:17 +01:00
										 |  |  | #define NFA_TOO_EXPENSIVE (-1)
 | 
					
						
							| 
									
										
										
										
											2014-11-05 14:27:36 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-30 19:44:38 +01:00
										 |  |  | // Which regexp engine to use? Needed for vim_regcomp().
 | 
					
						
							|  |  |  | // Must match with 'regexpengine'.
 | 
					
						
							| 
									
										
										
										
											2014-11-05 14:27:36 +01:00
										 |  |  | #define	    AUTOMATIC_ENGINE	0
 | 
					
						
							|  |  |  | #define	    BACKTRACKING_ENGINE	1
 | 
					
						
							|  |  |  | #define	    NFA_ENGINE		2
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-19 19:40:29 +02:00
										 |  |  | typedef struct regengine regengine_T; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Structure returned by vim_regcomp() to pass on to vim_regexec(). | 
					
						
							| 
									
										
										
										
											2013-05-19 19:40:29 +02:00
										 |  |  |  * This is the general structure. For the actual matcher, two specific | 
					
						
							|  |  |  |  * structures are used. See code below. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | typedef struct regprog | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     regengine_T		*engine; | 
					
						
							|  |  |  |     unsigned		regflags; | 
					
						
							| 
									
										
										
										
											2018-07-17 05:43:58 +02:00
										 |  |  |     unsigned		re_engine;   // automatic, backtracking or nfa engine
 | 
					
						
							|  |  |  |     unsigned		re_flags;    // second argument for vim_regcomp()
 | 
					
						
							|  |  |  |     int			re_in_use;   // prog is being executed
 | 
					
						
							| 
									
										
										
										
											2013-05-19 19:40:29 +02:00
										 |  |  | } regprog_T; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Structure used by the back track matcher. | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  |  * These fields are only to be used in regexp.c! | 
					
						
							| 
									
										
										
										
											2013-05-19 19:40:29 +02:00
										 |  |  |  * See regexp.c for an explanation. | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  |  */ | 
					
						
							|  |  |  | typedef struct | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-11-30 19:44:38 +01:00
										 |  |  |     // These four members implement regprog_T
 | 
					
						
							| 
									
										
										
										
											2013-05-19 19:40:29 +02:00
										 |  |  |     regengine_T		*engine; | 
					
						
							|  |  |  |     unsigned		regflags; | 
					
						
							| 
									
										
										
										
											2014-11-05 14:27:36 +01:00
										 |  |  |     unsigned		re_engine; | 
					
						
							| 
									
										
										
										
											2018-07-17 05:43:58 +02:00
										 |  |  |     unsigned		re_flags; | 
					
						
							|  |  |  |     int			re_in_use; | 
					
						
							| 
									
										
										
										
											2013-05-19 19:40:29 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  |     int			regstart; | 
					
						
							|  |  |  |     char_u		reganch; | 
					
						
							|  |  |  |     char_u		*regmust; | 
					
						
							|  |  |  |     int			regmlen; | 
					
						
							| 
									
										
										
										
											2013-06-01 23:02:54 +02:00
										 |  |  | #ifdef FEAT_SYN_HL
 | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  |     char_u		reghasz; | 
					
						
							| 
									
										
										
										
											2013-06-01 23:02:54 +02:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2019-11-30 19:44:38 +01:00
										 |  |  |     char_u		program[1];	// actually longer..
 | 
					
						
							| 
									
										
										
										
											2013-05-19 19:40:29 +02:00
										 |  |  | } bt_regprog_T; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Structure representing a NFA state. | 
					
						
							| 
									
										
										
										
											2019-04-21 00:00:13 +02:00
										 |  |  |  * An NFA state may have no outgoing edge, when it is a NFA_MATCH state. | 
					
						
							| 
									
										
										
										
											2013-05-19 19:40:29 +02:00
										 |  |  |  */ | 
					
						
							|  |  |  | typedef struct nfa_state nfa_state_T; | 
					
						
							|  |  |  | struct nfa_state | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int			c; | 
					
						
							|  |  |  |     nfa_state_T		*out; | 
					
						
							|  |  |  |     nfa_state_T		*out1; | 
					
						
							|  |  |  |     int			id; | 
					
						
							| 
									
										
										
										
											2019-11-30 19:44:38 +01:00
										 |  |  |     int			lastlist[2]; // 0: normal, 1: recursive
 | 
					
						
							| 
									
										
										
										
											2013-05-29 21:14:42 +02:00
										 |  |  |     int			val; | 
					
						
							| 
									
										
										
										
											2013-05-19 19:40:29 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Structure used by the NFA matcher. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | typedef struct | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-11-30 19:44:38 +01:00
										 |  |  |     // These three members implement regprog_T
 | 
					
						
							| 
									
										
										
										
											2013-05-19 19:40:29 +02:00
										 |  |  |     regengine_T		*engine; | 
					
						
							|  |  |  |     unsigned		regflags; | 
					
						
							| 
									
										
										
										
											2014-11-05 14:27:36 +01:00
										 |  |  |     unsigned		re_engine; | 
					
						
							| 
									
										
										
										
											2018-07-17 05:43:58 +02:00
										 |  |  |     unsigned		re_flags; | 
					
						
							|  |  |  |     int			re_in_use; | 
					
						
							| 
									
										
										
										
											2013-05-19 19:40:29 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-30 19:44:38 +01:00
										 |  |  |     nfa_state_T		*start;		// points into state[]
 | 
					
						
							| 
									
										
										
										
											2013-06-06 18:46:06 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-30 19:44:38 +01:00
										 |  |  |     int			reganch;	// pattern starts with ^
 | 
					
						
							|  |  |  |     int			regstart;	// char at start of pattern
 | 
					
						
							|  |  |  |     char_u		*match_text;	// plain text to match with
 | 
					
						
							| 
									
										
										
										
											2013-06-06 18:46:06 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-30 19:44:38 +01:00
										 |  |  |     int			has_zend;	// pattern contains \ze
 | 
					
						
							|  |  |  |     int			has_backref;	// pattern contains \1 .. \9
 | 
					
						
							| 
									
										
										
										
											2013-06-01 23:02:54 +02:00
										 |  |  | #ifdef FEAT_SYN_HL
 | 
					
						
							|  |  |  |     int			reghasz; | 
					
						
							| 
									
										
										
										
											2013-06-02 15:55:55 +02:00
										 |  |  | #endif
 | 
					
						
							|  |  |  |     char_u		*pattern; | 
					
						
							| 
									
										
										
										
											2019-11-30 19:44:38 +01:00
										 |  |  |     int			nsubexp;	// number of ()
 | 
					
						
							| 
									
										
										
										
											2013-05-19 19:40:29 +02:00
										 |  |  |     int			nstate; | 
					
						
							| 
									
										
										
										
											2019-11-30 19:44:38 +01:00
										 |  |  |     nfa_state_T		state[1];	// actually longer..
 | 
					
						
							| 
									
										
										
										
											2013-05-19 19:40:29 +02:00
										 |  |  | } nfa_regprog_T; | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Structure to be used for single-line matching. | 
					
						
							|  |  |  |  * Sub-match "no" starts at "startp[no]" and ends just before "endp[no]". | 
					
						
							|  |  |  |  * When there is no match, the pointer is NULL. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | typedef struct | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     regprog_T		*regprog; | 
					
						
							|  |  |  |     char_u		*startp[NSUBEXP]; | 
					
						
							|  |  |  |     char_u		*endp[NSUBEXP]; | 
					
						
							| 
									
										
										
										
											2022-11-26 11:47:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     colnr_T		rm_matchcol;   // match start without "\zs"
 | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  |     int			rm_ic; | 
					
						
							|  |  |  | } regmatch_T; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Structure to be used for multi-line matching. | 
					
						
							|  |  |  |  * Sub-match "no" starts in line "startpos[no].lnum" column "startpos[no].col" | 
					
						
							|  |  |  |  * and ends in line "endpos[no].lnum" just before column "endpos[no].col". | 
					
						
							|  |  |  |  * The line numbers are relative to the first line, thus startpos[0].lnum is | 
					
						
							|  |  |  |  * always 0. | 
					
						
							|  |  |  |  * When there is no match, the line number is -1. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | typedef struct | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     regprog_T		*regprog; | 
					
						
							|  |  |  |     lpos_T		startpos[NSUBEXP]; | 
					
						
							|  |  |  |     lpos_T		endpos[NSUBEXP]; | 
					
						
							| 
									
										
										
										
											2022-11-26 11:47:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     colnr_T		rmm_matchcol;   // match start without "\zs"
 | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  |     int			rmm_ic; | 
					
						
							| 
									
										
										
										
											2019-11-30 19:44:38 +01:00
										 |  |  |     colnr_T		rmm_maxcol;	// when not zero: maximum column
 | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | } regmmatch_T; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * 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. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | typedef struct | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     short		refcnt; | 
					
						
							|  |  |  |     char_u		*matches[NSUBEXP]; | 
					
						
							|  |  |  | } reg_extmatch_T; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-19 19:40:29 +02:00
										 |  |  | struct regengine | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2022-04-23 10:41:35 +01:00
										 |  |  |     // bt_regcomp or nfa_regcomp
 | 
					
						
							| 
									
										
										
										
											2013-05-19 19:40:29 +02:00
										 |  |  |     regprog_T	*(*regcomp)(char_u*, int); | 
					
						
							| 
									
										
										
										
											2022-04-23 10:41:35 +01:00
										 |  |  |     // bt_regfree or nfa_regfree
 | 
					
						
							| 
									
										
										
										
											2013-06-08 18:19:48 +02:00
										 |  |  |     void	(*regfree)(regprog_T *); | 
					
						
							| 
									
										
										
										
											2022-04-23 10:41:35 +01:00
										 |  |  |     // bt_regexec_nl or nfa_regexec_nl
 | 
					
						
							| 
									
										
										
										
											2017-06-17 18:44:21 +02:00
										 |  |  |     int		(*regexec_nl)(regmatch_T *, char_u *, colnr_T, int); | 
					
						
							| 
									
										
										
										
											2022-04-23 10:41:35 +01:00
										 |  |  |     // bt_regexec_mult or nfa_regexec_mult
 | 
					
						
							| 
									
										
										
										
											2022-06-05 16:55:54 +01:00
										 |  |  |     long	(*regexec_multi)(regmmatch_T *, win_T *, buf_T *, linenr_T, colnr_T, int *); | 
					
						
							| 
									
										
										
										
											2024-01-04 22:54:08 +01:00
										 |  |  | #ifdef DEBUG
 | 
					
						
							|  |  |  |     char_u	*expr; | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2013-05-19 19:40:29 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-30 20:58:55 +01:00
										 |  |  | // Flags used by vim_regsub() and vim_regsub_both()
 | 
					
						
							|  |  |  | #define REGSUB_COPY	    1
 | 
					
						
							|  |  |  | #define REGSUB_MAGIC	    2
 | 
					
						
							|  |  |  | #define REGSUB_BACKSLASH    4
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-30 19:44:38 +01:00
										 |  |  | #endif	// _REGEXP_H
 |