⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 regexec.c

📁 gnu tar 源码包。 tar 软件是 Unix 系统下的一个打包软件
💻 C
📖 第 1 页 / 共 5 页
字号:
/* -*- buffer-read-only: t -*- vi: set ro: *//* DO NOT EDIT! GENERATED AUTOMATICALLY! *//* Extended regular expression matching and search library.   Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation,   Inc.   This file is part of the GNU C Library.   Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.   This program is free software; you can redistribute it and/or modify   it under the terms of the GNU General Public License as published by   the Free Software Foundation; either version 3, or (at your option)   any later version.   This program is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   GNU General Public License for more details.   You should have received a copy of the GNU General Public License along   with this program; if not, write to the Free Software Foundation,   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */static reg_errcode_t match_ctx_init (re_match_context_t *cache, int eflags,				     Idx n) internal_function;static void match_ctx_clean (re_match_context_t *mctx) internal_function;static void match_ctx_free (re_match_context_t *cache) internal_function;static reg_errcode_t match_ctx_add_entry (re_match_context_t *cache, Idx node,					  Idx str_idx, Idx from, Idx to)     internal_function;static Idx search_cur_bkref_entry (const re_match_context_t *mctx, Idx str_idx)     internal_function;static reg_errcode_t match_ctx_add_subtop (re_match_context_t *mctx, Idx node,					   Idx str_idx) internal_function;static re_sub_match_last_t * match_ctx_add_sublast (re_sub_match_top_t *subtop,						    Idx node, Idx str_idx)     internal_function;static void sift_ctx_init (re_sift_context_t *sctx, re_dfastate_t **sifted_sts,			   re_dfastate_t **limited_sts, Idx last_node,			   Idx last_str_idx)     internal_function;static reg_errcode_t re_search_internal (const regex_t *preg,					 const char *string, Idx length,					 Idx start, Idx last_start, Idx stop,					 size_t nmatch, regmatch_t pmatch[],					 int eflags) internal_function;static regoff_t re_search_2_stub (struct re_pattern_buffer *bufp,				  const char *string1, Idx length1,				  const char *string2, Idx length2,				  Idx start, regoff_t range,				  struct re_registers *regs,				  Idx stop, bool ret_len) internal_function;static regoff_t re_search_stub (struct re_pattern_buffer *bufp,				const char *string, Idx length, Idx start,				regoff_t range, Idx stop,				struct re_registers *regs,				bool ret_len) internal_function;static unsigned int re_copy_regs (struct re_registers *regs, regmatch_t *pmatch,				  Idx nregs, int regs_allocated)     internal_function;static reg_errcode_t prune_impossible_nodes (re_match_context_t *mctx)     internal_function;static Idx check_matching (re_match_context_t *mctx, bool fl_longest_match,			   Idx *p_match_first) internal_function;static Idx check_halt_state_context (const re_match_context_t *mctx,				     const re_dfastate_t *state, Idx idx)     internal_function;static void update_regs (const re_dfa_t *dfa, regmatch_t *pmatch,			 regmatch_t *prev_idx_match, Idx cur_node,			 Idx cur_idx, Idx nmatch) internal_function;static reg_errcode_t push_fail_stack (struct re_fail_stack_t *fs,				      Idx str_idx, Idx dest_node, Idx nregs,				      regmatch_t *regs,				      re_node_set *eps_via_nodes)     internal_function;static reg_errcode_t set_regs (const regex_t *preg,			       const re_match_context_t *mctx,			       size_t nmatch, regmatch_t *pmatch,			       bool fl_backtrack) internal_function;static reg_errcode_t free_fail_stack_return (struct re_fail_stack_t *fs)     internal_function;#ifdef RE_ENABLE_I18Nstatic int sift_states_iter_mb (const re_match_context_t *mctx,				re_sift_context_t *sctx,				Idx node_idx, Idx str_idx, Idx max_str_idx)     internal_function;#endif /* RE_ENABLE_I18N */static reg_errcode_t sift_states_backward (const re_match_context_t *mctx,					   re_sift_context_t *sctx)     internal_function;static reg_errcode_t build_sifted_states (const re_match_context_t *mctx,					  re_sift_context_t *sctx, Idx str_idx,					  re_node_set *cur_dest)     internal_function;static reg_errcode_t update_cur_sifted_state (const re_match_context_t *mctx,					      re_sift_context_t *sctx,					      Idx str_idx,					      re_node_set *dest_nodes)     internal_function;static reg_errcode_t add_epsilon_src_nodes (const re_dfa_t *dfa,					    re_node_set *dest_nodes,					    const re_node_set *candidates)     internal_function;static bool check_dst_limits (const re_match_context_t *mctx,			      const re_node_set *limits,			      Idx dst_node, Idx dst_idx, Idx src_node,			      Idx src_idx) internal_function;static int check_dst_limits_calc_pos_1 (const re_match_context_t *mctx,					int boundaries, Idx subexp_idx,					Idx from_node, Idx bkref_idx)     internal_function;static int check_dst_limits_calc_pos (const re_match_context_t *mctx,				      Idx limit, Idx subexp_idx,				      Idx node, Idx str_idx,				      Idx bkref_idx) internal_function;static reg_errcode_t check_subexp_limits (const re_dfa_t *dfa,					  re_node_set *dest_nodes,					  const re_node_set *candidates,					  re_node_set *limits,					  struct re_backref_cache_entry *bkref_ents,					  Idx str_idx) internal_function;static reg_errcode_t sift_states_bkref (const re_match_context_t *mctx,					re_sift_context_t *sctx,					Idx str_idx, const re_node_set *candidates)     internal_function;static reg_errcode_t merge_state_array (const re_dfa_t *dfa,					re_dfastate_t **dst,					re_dfastate_t **src, Idx num)     internal_function;static re_dfastate_t *find_recover_state (reg_errcode_t *err,					 re_match_context_t *mctx) internal_function;static re_dfastate_t *transit_state (reg_errcode_t *err,				     re_match_context_t *mctx,				     re_dfastate_t *state) internal_function;static re_dfastate_t *merge_state_with_log (reg_errcode_t *err,					    re_match_context_t *mctx,					    re_dfastate_t *next_state)     internal_function;static reg_errcode_t check_subexp_matching_top (re_match_context_t *mctx,						re_node_set *cur_nodes,						Idx str_idx) internal_function;#if 0static re_dfastate_t *transit_state_sb (reg_errcode_t *err,					re_match_context_t *mctx,					re_dfastate_t *pstate)     internal_function;#endif#ifdef RE_ENABLE_I18Nstatic reg_errcode_t transit_state_mb (re_match_context_t *mctx,				       re_dfastate_t *pstate)     internal_function;#endif /* RE_ENABLE_I18N */static reg_errcode_t transit_state_bkref (re_match_context_t *mctx,					  const re_node_set *nodes)     internal_function;static reg_errcode_t get_subexp (re_match_context_t *mctx,				 Idx bkref_node, Idx bkref_str_idx)     internal_function;static reg_errcode_t get_subexp_sub (re_match_context_t *mctx,				     const re_sub_match_top_t *sub_top,				     re_sub_match_last_t *sub_last,				     Idx bkref_node, Idx bkref_str)     internal_function;static Idx find_subexp_node (const re_dfa_t *dfa, const re_node_set *nodes,			     Idx subexp_idx, int type) internal_function;static reg_errcode_t check_arrival (re_match_context_t *mctx,				    state_array_t *path, Idx top_node,				    Idx top_str, Idx last_node, Idx last_str,				    int type) internal_function;static reg_errcode_t check_arrival_add_next_nodes (re_match_context_t *mctx,						   Idx str_idx,						   re_node_set *cur_nodes,						   re_node_set *next_nodes)     internal_function;static reg_errcode_t check_arrival_expand_ecl (const re_dfa_t *dfa,					       re_node_set *cur_nodes,					       Idx ex_subexp, int type)     internal_function;static reg_errcode_t check_arrival_expand_ecl_sub (const re_dfa_t *dfa,						   re_node_set *dst_nodes,						   Idx target, Idx ex_subexp,						   int type) internal_function;static reg_errcode_t expand_bkref_cache (re_match_context_t *mctx,					 re_node_set *cur_nodes, Idx cur_str,					 Idx subexp_num, int type)     internal_function;static bool build_trtable (const re_dfa_t *dfa,			   re_dfastate_t *state) internal_function;#ifdef RE_ENABLE_I18Nstatic int check_node_accept_bytes (const re_dfa_t *dfa, Idx node_idx,				    const re_string_t *input, Idx idx)     internal_function;# ifdef _LIBCstatic unsigned int find_collation_sequence_value (const unsigned char *mbs,						   size_t name_len)     internal_function;# endif /* _LIBC */#endif /* RE_ENABLE_I18N */static Idx group_nodes_into_DFAstates (const re_dfa_t *dfa,				       const re_dfastate_t *state,				       re_node_set *states_node,				       bitset_t *states_ch) internal_function;static bool check_node_accept (const re_match_context_t *mctx,			       const re_token_t *node, Idx idx)     internal_function;static reg_errcode_t extend_buffers (re_match_context_t *mctx)     internal_function;/* Entry point for POSIX code.  *//* regexec searches for a given pattern, specified by PREG, in the   string STRING.   If NMATCH is zero or REG_NOSUB was set in the cflags argument to   `regcomp', we ignore PMATCH.  Otherwise, we assume PMATCH has at   least NMATCH elements, and we set them to the offsets of the   corresponding matched substrings.   EFLAGS specifies `execution flags' which affect matching: if   REG_NOTBOL is set, then ^ does not match at the beginning of the   string; if REG_NOTEOL is set, then $ does not match at the end.   We return 0 if we find a match and REG_NOMATCH if not.  */intregexec (preg, string, nmatch, pmatch, eflags)    const regex_t *_Restrict_ preg;    const char *_Restrict_ string;    size_t nmatch;    regmatch_t pmatch[_Restrict_arr_];    int eflags;{  reg_errcode_t err;  Idx start, length;#ifdef _LIBC  re_dfa_t *dfa = (re_dfa_t *) preg->buffer;#endif  if (eflags & ~(REG_NOTBOL | REG_NOTEOL | REG_STARTEND))    return REG_BADPAT;  if (eflags & REG_STARTEND)    {      start = pmatch[0].rm_so;      length = pmatch[0].rm_eo;    }  else    {      start = 0;      length = strlen (string);    }  __libc_lock_lock (dfa->lock);  if (preg->no_sub)    err = re_search_internal (preg, string, length, start, length,			      length, 0, NULL, eflags);  else    err = re_search_internal (preg, string, length, start, length,			      length, nmatch, pmatch, eflags);  __libc_lock_unlock (dfa->lock);  return err != REG_NOERROR;}#ifdef _LIBC# include <shlib-compat.h>versioned_symbol (libc, __regexec, regexec, GLIBC_2_3_4);# if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4)__typeof__ (__regexec) __compat_regexec;intattribute_compat_text_section__compat_regexec (const regex_t *_Restrict_ preg,		  const char *_Restrict_ string, size_t nmatch,		  regmatch_t pmatch[], int eflags){  return regexec (preg, string, nmatch, pmatch,		  eflags & (REG_NOTBOL | REG_NOTEOL));}compat_symbol (libc, __compat_regexec, regexec, GLIBC_2_0);# endif#endif/* Entry points for GNU code.  *//* re_match, re_search, re_match_2, re_search_2   The former two functions operate on STRING with length LENGTH,   while the later two operate on concatenation of STRING1 and STRING2   with lengths LENGTH1 and LENGTH2, respectively.   re_match() matches the compiled pattern in BUFP against the string,   starting at index START.   re_search() first tries matching at index START, then it tries to match   starting from index START + 1, and so on.  The last start position tried   is START + RANGE.  (Thus RANGE = 0 forces re_search to operate the same   way as re_match().)   The parameter STOP of re_{match,search}_2 specifies that no match exceeding   the first STOP characters of the concatenation of the strings should be   concerned.   If REGS is not NULL, and BUFP->no_sub is not set, the offsets of the match   and all groups is stored in REGS.  (For the "_2" variants, the offsets are   computed relative to the concatenation, not relative to the individual   strings.)   On success, re_match* functions return the length of the match, re_search*   return the position of the start of the match.  Return value -1 means no   match was found and -2 indicates an internal error.  */regoff_tre_match (bufp, string, length, start, regs)    struct re_pattern_buffer *bufp;    const char *string;    Idx length, start;    struct re_registers *regs;{  return re_search_stub (bufp, string, length, start, 0, length, regs, true);}#ifdef _LIBCweak_alias (__re_match, re_match)#endifregoff_tre_search (bufp, string, length, start, range, regs)    struct re_pattern_buffer *bufp;    const char *string;    Idx length, start;    regoff_t range;    struct re_registers *regs;{  return re_search_stub (bufp, string, length, start, range, length, regs,			 false);}#ifdef _LIBCweak_alias (__re_search, re_search)#endifregoff_tre_match_2 (bufp, string1, length1, string2, length2, start, regs, stop)    struct re_pattern_buffer *bufp;    const char *string1, *string2;    Idx length1, length2, start, stop;    struct re_registers *regs;{  return re_search_2_stub (bufp, string1, length1, string2, length2,			   start, 0, regs, stop, true);}#ifdef _LIBCweak_alias (__re_match_2, re_match_2)#endifregoff_tre_search_2 (bufp, string1, length1, string2, length2, start, range, regs, stop)    struct re_pattern_buffer *bufp;    const char *string1, *string2;    Idx length1, length2, start, stop;    regoff_t range;    struct re_registers *regs;{  return re_search_2_stub (bufp, string1, length1, string2, length2,			   start, range, regs, stop, false);}#ifdef _LIBCweak_alias (__re_search_2, re_search_2)#endifstatic regoff_tinternal_functionre_search_2_stub (struct re_pattern_buffer *bufp,		  const char *string1, Idx length1,		  const char *string2, Idx length2,		  Idx start, regoff_t range, struct re_registers *regs,		  Idx stop, bool ret_len){  const char *str;  regoff_t rval;  Idx len = length1 + length2;  char *s = NULL;  if (BE (length1 < 0 || length2 < 0 || stop < 0 || len < length1, 0))    return -2;  /* Concatenate the strings.  */  if (length2 > 0)    if (length1 > 0)      {	s = re_malloc (char, len);	if (BE (s == NULL, 0))	  return -2;#ifdef _LIBC	memcpy (__mempcpy (s, string1, length1), string2, length2);#else	memcpy (s, string1, length1);	memcpy (s + length1, string2, length2);#endif	str = s;      }    else      str = string2;  else    str = string1;  rval = re_search_stub (bufp, str, len, start, range, stop, regs,			 ret_len);  re_free (s);  return rval;}/* The parameters have the same meaning as those of re_search.   Additional parameters:   If RET_LEN is true the length of the match is returned (re_match style);   otherwise the position of the match is returned.  */static regoff_tinternal_functionre_search_stub (struct re_pattern_buffer *bufp,		const char *string, Idx length,		Idx start, regoff_t range, Idx stop, struct re_registers *regs,		bool ret_len){  reg_errcode_t result;  regmatch_t *pmatch;  Idx nregs;  regoff_t rval;  int eflags = 0;#ifdef _LIBC  re_dfa_t *dfa = (re_dfa_t *) bufp->buffer;#endif  Idx last_start = start + range;  /* Check for out-of-range.  */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -