📄 regex_internal.h
字号:
((pstr)->wcs[idx] != WEOF && ((pstr)->len == (idx) \ || (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))#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; /* `node_idx' is the index in dfa->nodes, if `type' == 0. Otherwise `type' indicate the type of this node. */ re_token_type_t type; int node_idx; int first; int next; re_node_set eclosure;};typedef struct bin_tree_t bin_tree_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{ unsigned int hash; re_node_set nodes; re_node_set *entrance_nodes; struct re_dfastate_t **trtable; struct re_dfastate_t **trtable_search; /* If this state is a special state. A state is a special state if the state is the halt state, or a anchor. */ unsigned int context : 2; 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;typedef struct{ /* start <= node < end */ int start; int end;} re_subexp_t;struct re_state_table_entry{ int num; int alloc; re_dfastate_t **array;};/* Array type used in re_sub_match_last_t and re_sub_match_top_t. */typedef struct{ int next_idx; int alloc; re_dfastate_t **array;} state_array_t;/* Store information about the node NODE whose type is OP_CLOSE_SUBEXP. */typedef struct{ int node; int 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{ int str_idx; int node; int next_last_offset; state_array_t *path; int alasts; /* Allocation size of LASTS. */ int nlasts; /* The number of LASTS. */ re_sub_match_last_t **lasts;} re_sub_match_top_t;struct re_backref_cache_entry{ int node; int str_idx; int subexp_from; int subexp_to; int flag;};typedef struct{ /* EFLAGS of the argument of regexec. */ int eflags; /* Where the matching ends. */ int match_last; int last_node; /* The string object corresponding to the input string. */ re_string_t *input; /* The state log used by the matcher. */ re_dfastate_t **state_log; int state_log_top; /* Back reference cache. */ int nbkref_ents; int abkref_ents; struct re_backref_cache_entry *bkref_ents; int max_mb_elem_len; int nsub_tops; int asub_tops; re_sub_match_top_t **sub_tops;} re_match_context_t;typedef struct{ int cur_bkref; int cls_subexp_idx; re_dfastate_t **sifted_states; re_dfastate_t **limited_states; re_node_set limits; int last_node; int last_str_idx; int check_subexp;} re_sift_context_t;struct re_fail_stack_ent_t{ int idx; int node; regmatch_t *regs; re_node_set eps_via_nodes;};struct re_fail_stack_t{ int num; int alloc; struct re_fail_stack_ent_t *stack;};struct re_dfa_t{ re_bitset_ptr_t word_char; /* number of subexpressions `re_nsub' is in regex_t. */ int subexps_alloc; re_subexp_t *subexps; re_token_t *nodes; int nodes_alloc; int nodes_len; bin_tree_t *str_tree; int *nexts; int *org_indices; re_node_set *edests; re_node_set *eclosures; re_node_set *inveclosures; struct re_state_table_entry *state_table; unsigned int state_hash_mask; re_dfastate_t *init_state; re_dfastate_t *init_state_word; re_dfastate_t *init_state_nl; re_dfastate_t *init_state_begbuf; int states_alloc; int init_node; int nbackref; /* The number of backreference in this dfa. */ /* Bitmap expressing which backreference is used. */ unsigned int used_bkref_map;#ifdef DEBUG char* re_str;#endif 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;};typedef struct re_dfa_t re_dfa_t;static reg_errcode_t re_node_set_alloc (re_node_set *set, int size);static reg_errcode_t re_node_set_init_1 (re_node_set *set, int elem);static reg_errcode_t re_node_set_init_2 (re_node_set *set, int elem1, int elem2);#define re_node_set_init_empty(set) memset (set, '\0', sizeof (re_node_set))static reg_errcode_t re_node_set_init_copy (re_node_set *dest, const re_node_set *src);static reg_errcode_t re_node_set_add_intersect (re_node_set *dest, const re_node_set *src1, const re_node_set *src2);static reg_errcode_t re_node_set_init_union (re_node_set *dest, const re_node_set *src1, const re_node_set *src2);static reg_errcode_t re_node_set_merge (re_node_set *dest, const re_node_set *src);static int re_node_set_insert (re_node_set *set, int elem);static int re_node_set_compare (const re_node_set *set1, const re_node_set *set2);static int re_node_set_contains (const re_node_set *set, int elem);static void re_node_set_remove_at (re_node_set *set, int idx);#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)static int re_dfa_add_node (re_dfa_t *dfa, re_token_t token, int mode);static re_dfastate_t *re_acquire_state (reg_errcode_t *err, re_dfa_t *dfa, const re_node_set *nodes);static re_dfastate_t *re_acquire_state_context (reg_errcode_t *err, re_dfa_t *dfa, const re_node_set *nodes, unsigned int context);static void free_state (re_dfastate_t *state);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 operation. */static inline voidbitset_not (set) bitset set;{ int bitset_i; for (bitset_i = 0; bitset_i < BITSET_UINTS; ++bitset_i) set[bitset_i] = ~set[bitset_i];}static inline voidbitset_merge (dest, src) bitset dest; const bitset src;{ int bitset_i; for (bitset_i = 0; bitset_i < BITSET_UINTS; ++bitset_i) dest[bitset_i] |= src[bitset_i];}static inline voidbitset_not_merge (dest, src) bitset dest; const bitset src;{ int i; for (i = 0; i < BITSET_UINTS; ++i) dest[i] |= ~src[i];}#ifdef RE_ENABLE_I18N/* Inline functions for re_string. */static inline intre_string_char_size_at (pstr, idx) const re_string_t *pstr; int idx;{ int byte_idx; if (MB_CUR_MAX == 1) return 1; for (byte_idx = 1; idx + byte_idx < pstr->len; ++byte_idx) if (pstr->wcs[idx + byte_idx] != WEOF) break; return byte_idx;}static inline wint_tre_string_wchar_at (pstr, idx) const re_string_t *pstr; int idx;{ if (MB_CUR_MAX == 1) return (wint_t) pstr->mbs[idx]; return (wint_t) pstr->wcs[idx];}static intre_string_elem_size_at (pstr, idx) const re_string_t *pstr; int 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 + -