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