📄 regex_internal.h
字号:
#endifstatic reg_errcode_t re_string_realloc_buffers (re_string_t *pstr, Idx new_buf_len) internal_function;#ifdef RE_ENABLE_I18Nstatic void build_wcs_buffer (re_string_t *pstr) internal_function;static reg_errcode_t build_wcs_upper_buffer (re_string_t *pstr) internal_function;#endif /* RE_ENABLE_I18N */static void build_upper_buffer (re_string_t *pstr) internal_function;static void re_string_translate_buffer (re_string_t *pstr) internal_function;static unsigned int re_string_context_at (const re_string_t *input, Idx idx, int eflags) internal_function __attribute ((pure));#define re_string_peek_byte(pstr, offset) \ ((pstr)->mbs[(pstr)->cur_idx + offset])#define re_string_fetch_byte(pstr) \ ((pstr)->mbs[(pstr)->cur_idx++])#define re_string_first_byte(pstr, idx) \ ((idx) == (pstr)->valid_len || (pstr)->wcs[idx] != WEOF)#define re_string_is_single_byte_char(pstr, idx) \ ((pstr)->wcs[idx] != WEOF && ((pstr)->valid_len == (idx) + 1 \ || (pstr)->wcs[(idx) + 1] != WEOF))#define re_string_eoi(pstr) ((pstr)->stop <= (pstr)->cur_idx)#define re_string_cur_idx(pstr) ((pstr)->cur_idx)#define re_string_get_buffer(pstr) ((pstr)->mbs)#define re_string_length(pstr) ((pstr)->len)#define re_string_byte_at(pstr,idx) ((pstr)->mbs[idx])#define re_string_skip_bytes(pstr,idx) ((pstr)->cur_idx += (idx))#define re_string_set_index(pstr,idx) ((pstr)->cur_idx = (idx))#include <alloca.h>#ifndef _LIBC# if HAVE_ALLOCA/* The OS usually guarantees only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely allocate anything larger than 4096 bytes. Also care for the possibility of a few compiler-allocated temporary stack slots. */# define __libc_use_alloca(n) ((n) < 4032)# else/* alloca is implemented with malloc, so just use malloc. */# define __libc_use_alloca(n) 0# endif#endif#ifndef MAX# define MAX(a,b) ((a) < (b) ? (b) : (a))#endif#define re_malloc(t,n) ((t *) malloc ((n) * sizeof (t)))#define re_realloc(p,t,n) ((t *) realloc (p, (n) * sizeof (t)))#define re_free(p) free (p)struct bin_tree_t{ struct bin_tree_t *parent; struct bin_tree_t *left; struct bin_tree_t *right; struct bin_tree_t *first; struct bin_tree_t *next; re_token_t token; /* `node_idx' is the index in dfa->nodes, if `type' == 0. Otherwise `type' indicate the type of this node. */ Idx node_idx;};typedef struct bin_tree_t bin_tree_t;#define BIN_TREE_STORAGE_SIZE \ ((1024 - sizeof (void *)) / sizeof (bin_tree_t))struct bin_tree_storage_t{ struct bin_tree_storage_t *next; bin_tree_t data[BIN_TREE_STORAGE_SIZE];};typedef struct bin_tree_storage_t bin_tree_storage_t;#define CONTEXT_WORD 1#define CONTEXT_NEWLINE (CONTEXT_WORD << 1)#define CONTEXT_BEGBUF (CONTEXT_NEWLINE << 1)#define CONTEXT_ENDBUF (CONTEXT_BEGBUF << 1)#define IS_WORD_CONTEXT(c) ((c) & CONTEXT_WORD)#define IS_NEWLINE_CONTEXT(c) ((c) & CONTEXT_NEWLINE)#define IS_BEGBUF_CONTEXT(c) ((c) & CONTEXT_BEGBUF)#define IS_ENDBUF_CONTEXT(c) ((c) & CONTEXT_ENDBUF)#define IS_ORDINARY_CONTEXT(c) ((c) == 0)#define IS_WORD_CHAR(ch) (isalnum (ch) || (ch) == '_')#define IS_NEWLINE(ch) ((ch) == NEWLINE_CHAR)#define IS_WIDE_WORD_CHAR(ch) (iswalnum (ch) || (ch) == L'_')#define IS_WIDE_NEWLINE(ch) ((ch) == WIDE_NEWLINE_CHAR)#define NOT_SATISFY_PREV_CONSTRAINT(constraint,context) \ ((((constraint) & PREV_WORD_CONSTRAINT) && !IS_WORD_CONTEXT (context)) \ || ((constraint & PREV_NOTWORD_CONSTRAINT) && IS_WORD_CONTEXT (context)) \ || ((constraint & PREV_NEWLINE_CONSTRAINT) && !IS_NEWLINE_CONTEXT (context))\ || ((constraint & PREV_BEGBUF_CONSTRAINT) && !IS_BEGBUF_CONTEXT (context)))#define NOT_SATISFY_NEXT_CONSTRAINT(constraint,context) \ ((((constraint) & NEXT_WORD_CONSTRAINT) && !IS_WORD_CONTEXT (context)) \ || (((constraint) & NEXT_NOTWORD_CONSTRAINT) && IS_WORD_CONTEXT (context)) \ || (((constraint) & NEXT_NEWLINE_CONSTRAINT) && !IS_NEWLINE_CONTEXT (context)) \ || (((constraint) & NEXT_ENDBUF_CONSTRAINT) && !IS_ENDBUF_CONTEXT (context)))struct re_dfastate_t{ re_hashval_t hash; re_node_set nodes; re_node_set non_eps_nodes; re_node_set inveclosure; re_node_set *entrance_nodes; struct re_dfastate_t **trtable, **word_trtable; unsigned int context : 4; unsigned int halt : 1; /* If this state can accept `multi byte'. Note that we refer to multibyte characters, and multi character collating elements as `multi byte'. */ unsigned int accept_mb : 1; /* If this state has backreference node(s). */ unsigned int has_backref : 1; unsigned int has_constraint : 1;};typedef struct re_dfastate_t re_dfastate_t;struct re_state_table_entry{ Idx num; Idx alloc; re_dfastate_t **array;};/* Array type used in re_sub_match_last_t and re_sub_match_top_t. */typedef struct{ Idx next_idx; Idx alloc; re_dfastate_t **array;} state_array_t;/* Store information about the node NODE whose type is OP_CLOSE_SUBEXP. */typedef struct{ Idx node; Idx str_idx; /* The position NODE match at. */ state_array_t path;} re_sub_match_last_t;/* Store information about the node NODE whose type is OP_OPEN_SUBEXP. And information about the node, whose type is OP_CLOSE_SUBEXP, corresponding to NODE is stored in LASTS. */typedef struct{ Idx str_idx; Idx node; state_array_t *path; Idx alasts; /* Allocation size of LASTS. */ Idx nlasts; /* The number of LASTS. */ re_sub_match_last_t **lasts;} re_sub_match_top_t;struct re_backref_cache_entry{ Idx node; Idx str_idx; Idx subexp_from; Idx subexp_to; char more; char unused; unsigned short int eps_reachable_subexps_map;};typedef struct{ /* The string object corresponding to the input string. */ re_string_t input;#if defined _LIBC || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L) const re_dfa_t *const dfa;#else const re_dfa_t *dfa;#endif /* EFLAGS of the argument of regexec. */ int eflags; /* Where the matching ends. */ Idx match_last; Idx last_node; /* The state log used by the matcher. */ re_dfastate_t **state_log; Idx state_log_top; /* Back reference cache. */ Idx nbkref_ents; Idx abkref_ents; struct re_backref_cache_entry *bkref_ents; int max_mb_elem_len; Idx nsub_tops; Idx asub_tops; re_sub_match_top_t **sub_tops;} re_match_context_t;typedef struct{ re_dfastate_t **sifted_states; re_dfastate_t **limited_states; Idx last_node; Idx last_str_idx; re_node_set limits;} re_sift_context_t;struct re_fail_stack_ent_t{ Idx idx; Idx node; regmatch_t *regs; re_node_set eps_via_nodes;};struct re_fail_stack_t{ Idx num; Idx alloc; struct re_fail_stack_ent_t *stack;};struct re_dfa_t{ re_token_t *nodes; size_t nodes_alloc; size_t nodes_len; Idx *nexts; Idx *org_indices; re_node_set *edests; re_node_set *eclosures; re_node_set *inveclosures; struct re_state_table_entry *state_table; re_dfastate_t *init_state; re_dfastate_t *init_state_word; re_dfastate_t *init_state_nl; re_dfastate_t *init_state_begbuf; bin_tree_t *str_tree; bin_tree_storage_t *str_tree_storage; re_bitset_ptr_t sb_char; int str_tree_storage_idx; /* number of subexpressions `re_nsub' is in regex_t. */ re_hashval_t state_hash_mask; Idx init_node; Idx nbackref; /* The number of backreference in this dfa. */ /* Bitmap expressing which backreference is used. */ bitset_word_t used_bkref_map; bitset_word_t completed_bkref_map; unsigned int has_plural_match : 1; /* If this dfa has "multibyte node", which is a backreference or a node which can accept multibyte character or multi character collating element. */ unsigned int has_mb_node : 1; unsigned int is_utf8 : 1; unsigned int map_notascii : 1; unsigned int word_ops_used : 1; int mb_cur_max; bitset_t word_char; reg_syntax_t syntax; Idx *subexp_map;#ifdef DEBUG char* re_str;#endif#ifdef _LIBC __libc_lock_define (, lock)#endif};#define re_node_set_init_empty(set) memset (set, '\0', sizeof (re_node_set))#define re_node_set_remove(set,id) \ (re_node_set_remove_at (set, re_node_set_contains (set, id) - 1))#define re_node_set_empty(p) ((p)->nelem = 0)#define re_node_set_free(set) re_free ((set)->elems)typedef enum{ SB_CHAR, MB_CHAR, EQUIV_CLASS, COLL_SYM, CHAR_CLASS} bracket_elem_type;typedef struct{ bracket_elem_type type; union { unsigned char ch; unsigned char *name; wchar_t wch; } opr;} bracket_elem_t;/* Inline functions for bitset_t operation. */static inline voidbitset_set (bitset_t set, Idx i){ set[i / BITSET_WORD_BITS] |= (bitset_word_t) 1 << i % BITSET_WORD_BITS;}static inline voidbitset_clear (bitset_t set, Idx i){ set[i / BITSET_WORD_BITS] &= ~ ((bitset_word_t) 1 << i % BITSET_WORD_BITS);}static inline boolbitset_contain (const bitset_t set, Idx i){ return (set[i / BITSET_WORD_BITS] >> i % BITSET_WORD_BITS) & 1;}static inline voidbitset_empty (bitset_t set){ memset (set, '\0', sizeof (bitset_t));}static inline voidbitset_set_all (bitset_t set){ memset (set, -1, sizeof (bitset_word_t) * (SBC_MAX / BITSET_WORD_BITS)); if (SBC_MAX % BITSET_WORD_BITS != 0) set[BITSET_WORDS - 1] = ((bitset_word_t) 1 << SBC_MAX % BITSET_WORD_BITS) - 1;}static inline voidbitset_copy (bitset_t dest, const bitset_t src){ memcpy (dest, src, sizeof (bitset_t));}static inline voidbitset_not (bitset_t set){ int bitset_i; for (bitset_i = 0; bitset_i < SBC_MAX / BITSET_WORD_BITS; ++bitset_i) set[bitset_i] = ~set[bitset_i]; if (SBC_MAX % BITSET_WORD_BITS != 0) set[BITSET_WORDS - 1] = ((((bitset_word_t) 1 << SBC_MAX % BITSET_WORD_BITS) - 1) & ~set[BITSET_WORDS - 1]);}static inline voidbitset_merge (bitset_t dest, const bitset_t src){ int bitset_i; for (bitset_i = 0; bitset_i < BITSET_WORDS; ++bitset_i) dest[bitset_i] |= src[bitset_i];}static inline voidbitset_mask (bitset_t dest, const bitset_t src){ int bitset_i; for (bitset_i = 0; bitset_i < BITSET_WORDS; ++bitset_i) dest[bitset_i] &= src[bitset_i];}#ifdef RE_ENABLE_I18N/* Inline functions for re_string. */static inline intinternal_function __attribute ((pure))re_string_char_size_at (const re_string_t *pstr, Idx idx){ int byte_idx; if (pstr->mb_cur_max == 1) return 1; for (byte_idx = 1; idx + byte_idx < pstr->valid_len; ++byte_idx) if (pstr->wcs[idx + byte_idx] != WEOF) break; return byte_idx;}static inline wint_tinternal_function __attribute ((pure))re_string_wchar_at (const re_string_t *pstr, Idx idx){ if (pstr->mb_cur_max == 1) return (wint_t) pstr->mbs[idx]; return (wint_t) pstr->wcs[idx];}static intinternal_function __attribute ((pure))re_string_elem_size_at (const re_string_t *pstr, Idx idx){# ifdef _LIBC const unsigned char *p, *extra; const int32_t *table, *indirect; int32_t tmp;# include <locale/weight.h> uint_fast32_t nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES); if (nrules != 0) { table = (const int32_t *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB); extra = (const unsigned char *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB); indirect = (const int32_t *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTMB); p = pstr->mbs + idx; tmp = findidx (&p); return p - pstr->mbs - idx; } else# endif /* _LIBC */ return 1;}#endif /* RE_ENABLE_I18N */#endif /* _REGEX_INTERNAL_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -