xref: /Universal-ctags/main/lregex_p.h (revision 6a8d5b709af994ff278390eed2a62d718f05a409)
1 /*
2 *   Copyright (c) 2000-2003, Darren Hiebert
3 *   Copyright (c) 2017, Red Hat, Inc.
4 *   Copyright (c) 2017, Masatake YAMATO
5 *
6 *   This source code is released for free distribution under the terms of the
7 *   GNU General Public License version 2 or (at your option) any later version.
8 *
9 *   This module contains functions for applying regular expression matching.
10 *
11 *   The code for utilizing the Gnu regex package with regards to processing the
12 *   regex option and checking for regex matches was adapted from routines in
13 *   Gnu etags.
14 */
15 #ifndef CTAGS_MAIN_LREGEX_PRIVATE_H
16 #define CTAGS_MAIN_LREGEX_PRIVATE_H
17 
18 /*
19 *   INCLUDE FILES
20 */
21 #include "general.h"
22 #include "flags_p.h"
23 #include "kind_p.h"
24 #include "lregex.h"
25 #include "parse.h"
26 
27 #include <regex.h>
28 
29 /*
30 *   MACRO DEFINITIONS
31 */
32 /* Back-references \0 through \9 */
33 #define BACK_REFERENCE_COUNT 10
34 
35 /*
36 *   DATA DECLARATIONS
37 */
38 enum regexParserType {
39 	REG_PARSER_SINGLE_LINE,
40 	REG_PARSER_MULTI_LINE,
41 	REG_PARSER_MULTI_TABLE,
42 };
43 
44 struct lregexControlBlock;
45 
46 typedef struct sRegexCompiledCode {
47 	struct regexBackend *backend;
48 	void * code;
49 } regexCompiledCode;
50 
51 struct regexBackend {
52 	flagDefinition *fdefs;
53 	unsigned int fdef_count;
54 
55 	void              (* set_icase_flag) (int *);
56 	regexCompiledCode (* compile)     (struct regexBackend *,
57 									   const char* const,
58 									   int);
59 	int               (* match)       (struct regexBackend *,
60 									   void *, const char *, size_t,
61 									   regmatch_t[BACK_REFERENCE_COUNT]);
62 	void              (* delete_code) (void *);
63 };
64 
65 struct flagDefsDescriptor {
66 	struct regexBackend *backend;
67 	int flags;
68 	enum regexParserType regptype;
69 };
70 
71 /*
72 *   FUNCTION PROTOTYPES
73 */
74 extern struct lregexControlBlock* allocLregexControlBlock (parserDefinition *parser);
75 extern void freeLregexControlBlock (struct lregexControlBlock* lcb);
76 
77 extern void processTagRegexOption (struct lregexControlBlock *lcb,
78 								   enum regexParserType,
79 								   const char* const parameter);
80 extern void addTagRegex (struct lregexControlBlock *lcb, const char* const regex,
81 						 const char* const name, const char* const kinds, const char* const flags,
82 						 bool *disabled);
83 extern void addTagMultiLineRegex (struct lregexControlBlock *lcb, const char* const regex,
84 								  const char* const name, const char* const kinds, const char* const flags,
85 								  bool *disabled);
86 extern void addTagMultiTableRegex(struct lregexControlBlock *lcb,
87 								  const char* const table_name,
88 								  const char* const regex,
89 								  const char* const name, const char* const kinds, const char* const flags,
90 								  bool *disabled);
91 
92 extern bool matchRegex (struct lregexControlBlock *lcb, const vString* const line);
93 extern bool doesExpectCorkInRegex (struct lregexControlBlock *lcb);
94 extern void addCallbackRegex (struct lregexControlBlock *lcb,
95 							  const char* const regex,
96 							  const char* const flags,
97 							  const regexCallback callback,
98 							  bool *disabled,
99 							  void * userData);
100 extern bool regexNeedsMultilineBuffer (struct lregexControlBlock *lcb);
101 extern bool matchMultilineRegex (struct lregexControlBlock *lcb, const vString* const allLines);
102 extern bool matchMultitableRegex (struct lregexControlBlock *lcb, const vString* const allLines);
103 
104 extern void notifyRegexInputStart (struct lregexControlBlock *lcb);
105 extern void notifyRegexInputEnd (struct lregexControlBlock *lcb);
106 
107 extern void addRegexTable (struct lregexControlBlock *lcb, const char *name);
108 extern void extendRegexTable (struct lregexControlBlock *lcb, const char *src, const char *dist);
109 
110 extern void initRegexOptscript (void);
111 extern void listRegexOpscriptOperators (FILE *fp);
112 
113 extern void addOptscriptToHook (struct lregexControlBlock *lcb, enum scriptHook hook, const char *code);
114 
115 extern void printMultitableStatistics (struct lregexControlBlock *lcb);
116 
117 extern void basic_regex_flag_short (char c, void* data);
118 extern void basic_regex_flag_long (const char* const s, const char* const unused, void* data);
119 extern void extend_regex_flag_short (char c, void* data);
120 extern void extend_regex_flag_long (const char* const s, const char* const unused, void* data);
121 #ifdef HAVE_PCRE2
122 extern void pcre2_regex_flag_short (char c, void* data);
123 extern void pcre2_regex_flag_long (const char* const s, const char* const unused, void* data);
124 #endif
125 
126 #endif	/* CTAGS_MAIN_LREGEX_PRIVATEH */
127