* posix/Makefile (distribute): Add regcomp.c, regexec.c,
	regex_internal.c, and regex_internal.h.
	(CFLAGS-regex.c): Replace -DMBS_SUPPORT with -DRE_ENABLE_I18N.
	* posix/regex.c: Complete rewrite.
	* posix/regexec.c: New file.
	* posix/regcomp.c: New file.
	* posix/regex_internal.c: New file.
	* posix/regex_internal.h: New file.
	* posix/regex.h (RE_ICASE): New macro.
	Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
This commit is contained in:
Ulrich Drepper 2002-02-26 19:06:03 +00:00
parent 73f1b06797
commit 3b0bdc7235
8 changed files with 6832 additions and 8 deletions

View File

@ -1,5 +1,16 @@
2002-02-26 Ulrich Drepper <drepper@redhat.com> 2002-02-26 Ulrich Drepper <drepper@redhat.com>
* posix/Makefile (distribute): Add regcomp.c, regexec.c,
regex_internal.c, and regex_internal.h.
(CFLAGS-regex.c): Replace -DMBS_SUPPORT with -DRE_ENABLE_I18N.
* posix/regex.c: Complete rewrite.
* posix/regexec.c: New file.
* posix/regcomp.c: New file.
* posix/regex_internal.c: New file.
* posix/regex_internal.h: New file.
* posix/regex.h (RE_ICASE): New macro.
Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
* stdio-common/vfscanf.c (_IO_vfwscanf): Always use ungetc, never * stdio-common/vfscanf.c (_IO_vfwscanf): Always use ungetc, never
ungetwc. It's a macro. ungetwc. It's a macro.
* libio/tst-swscanf.c (do_test): Adjust for now fixed wscanf * libio/tst-swscanf.c (do_test): Adjust for now fixed wscanf

5
NEWS
View File

@ -1,4 +1,4 @@
GNU C Library NEWS -- history of user-visible changes. 2002-1-28 GNU C Library NEWS -- history of user-visible changes. 2002-2-26
Copyright (C) 1992-2000, 2001, 2002 Free Software Foundation, Inc. Copyright (C) 1992-2000, 2001, 2002 Free Software Foundation, Inc.
See the end for copying conditions. See the end for copying conditions.
@ -25,6 +25,9 @@ Version 2.3
* The malloc functions were completely rewritten by Wolfram Gloger based * The malloc functions were completely rewritten by Wolfram Gloger based
on Doug Lea's malloc-2.7.0.c. on Doug Lea's malloc-2.7.0.c.
* Isamu Hasegawa contributed a completely new and POSIX conforming
implementation of regex.
Version 2.2.5 Version 2.2.5

View File

@ -1,4 +1,4 @@
# Copyright (C) 1991-1999, 2000, 2001 Free Software Foundation, Inc. # Copyright (C) 1991-1999, 2000, 2001, 2002 Free Software Foundation, Inc.
# This file is part of the GNU C Library. # This file is part of the GNU C Library.
# The GNU C Library is free software; you can redistribute it and/or # The GNU C Library is free software; you can redistribute it and/or
@ -32,7 +32,8 @@ headers := sys/utsname.h sys/times.h sys/wait.h sys/types.h unistd.h \
distribute := confstr.h TESTS TESTS2C.sed testcases.h \ distribute := confstr.h TESTS TESTS2C.sed testcases.h \
PTESTS PTESTS2C.sed ptestcases.h \ PTESTS PTESTS2C.sed ptestcases.h \
globtest.c globtest.sh wordexp-tst.sh annexc.c fnmatch_loop.c \ globtest.c globtest.sh wordexp-tst.sh annexc.c fnmatch_loop.c \
spawn_int.h tst-getconf.sh spawn_int.h tst-getconf.sh regcomp.c regexec.c regex_internal.c \
regex_internal.h
routines := \ routines := \
uname \ uname \
@ -109,7 +110,7 @@ $(objpfx)wordexp-tst.out: wordexp-tst.sh $(objpfx)wordexp-test
endif endif
endif endif
CFLAGS-regex.c = -Wno-strict-prototypes -DMBS_SUPPORT CFLAGS-regex.c = -Wno-strict-prototypes -DRE_ENABLE_I18N
CFLAGS-getaddrinfo.c = -DRESOLVER CFLAGS-getaddrinfo.c = -DRESOLVER
tstgetopt-ARGS = -a -b -cfoobar --required foobar --optional=bazbug \ tstgetopt-ARGS = -a -b -cfoobar --required foobar --optional=bazbug \
--none random --col --color --colour --none random --col --color --colour

3092
posix/regcomp.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,8 +1,8 @@
/* Definitions for data structures and routines for the regular /* Definitions for data structures and routines for the regular
expression library, version 0.12. expression library.
Copyright (C) 1985,1989-93,1995-98,2000,2001 Free Software Foundation, Inc. Copyright (C) 1985,1989-93,1995-98,2000,2001,2002
This file is part of the GNU C Library. Its master source is NOT part of Free Software Foundation, Inc.
the C library, however. The master source lives in /gd/gnu/lib. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public modify it under the terms of the GNU Lesser General Public
@ -164,6 +164,10 @@ typedef unsigned long int reg_syntax_t;
treated as 'a\{1'. */ treated as 'a\{1'. */
#define RE_INVALID_INTERVAL_ORD (RE_DEBUG << 1) #define RE_INVALID_INTERVAL_ORD (RE_DEBUG << 1)
/* If this bit is set, then ignore case when matching.
If not set, then case is significant. */
#define RE_ICASE (RE_INVALID_INTERVAL_ORD << 1)
/* This global variable defines the particular regexp syntax to use (for /* This global variable defines the particular regexp syntax to use (for
some interfaces). When a regexp is compiled, the syntax used is some interfaces). When a regexp is compiled, the syntax used is
stored in the pattern buffer, so changing this does not affect stored in the pattern buffer, so changing this does not affect

1095
posix/regex_internal.c Normal file

File diff suppressed because it is too large Load Diff

542
posix/regex_internal.h Normal file
View File

@ -0,0 +1,542 @@
/* Extended regular expression matching and search library.
Copyright (C) 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#ifndef _REGEX_INTERNAL_H
#define _REGEX_INTERNAL_H 1
/* Number of bits in a byte. */
#define BYTE_BITS 8
/* Number of single byte character. */
#define SBC_MAX 256
#define COLL_ELEM_LEN_MAX 8
/* The character which represents newline. */
#define NEWLINE_CHAR '\n'
/* Rename to standard API for using out of glibc. */
#ifndef _LIBC
# define __wctype wctype
# define __iswctype iswctype
# define __btowc btowc
# define __mempcpy memcpy
#endif
extern const char re_error_msgid[];
extern const size_t re_error_msgid_idx[];
/* Number of bits in an unsinged int. */
#define UINT_BITS (sizeof (unsigned int) * BYTE_BITS)
/* Number of unsigned int in an bit_set. */
#define BITSET_UINTS ((SBC_MAX + UINT_BITS - 1) / UINT_BITS)
typedef unsigned int bitset[BITSET_UINTS];
typedef unsigned int *re_bitset_ptr_t;
#define bitset_set(set,i) (set[i / UINT_BITS] |= 1 << i % UINT_BITS)
#define bitset_clear(set,i) (set[i / UINT_BITS] &= ~(1 << i % UINT_BITS))
#define bitset_contain(set,i) (set[i / UINT_BITS] & (1 << i % UINT_BITS))
#define bitset_empty(set) memset (set, 0, sizeof (unsigned int) * BITSET_UINTS)
#define bitset_set_all(set) \
memset (set, 255, sizeof (unsigned int) * BITSET_UINTS)
#define bitset_copy(dest,src) \
memcpy (dest, src, sizeof (unsigned int) * BITSET_UINTS)
static inline void bitset_not (bitset set);
static inline void bitset_merge (bitset dest, const bitset src);
static inline void bitset_not_merge (bitset dest, const bitset src);
#define PREV_WORD_CONSTRAINT 0x0001
#define PREV_NOTWORD_CONSTRAINT 0x0002
#define NEXT_WORD_CONSTRAINT 0x0004
#define NEXT_NOTWORD_CONSTRAINT 0x0008
#define PREV_NEWLINE_CONSTRAINT 0x0010
#define NEXT_NEWLINE_CONSTRAINT 0x0020
#define PREV_BEGBUF_CONSTRAINT 0x0040
#define NEXT_ENDBUF_CONSTRAINT 0x0080
#define DUMMY_CONSTRAINT 0x0100
typedef enum
{
INSIDE_WORD = PREV_WORD_CONSTRAINT | NEXT_WORD_CONSTRAINT,
WORD_FIRST = PREV_NOTWORD_CONSTRAINT | NEXT_WORD_CONSTRAINT,
WORD_LAST = PREV_WORD_CONSTRAINT | NEXT_NOTWORD_CONSTRAINT,
LINE_FIRST = PREV_NEWLINE_CONSTRAINT,
LINE_LAST = NEXT_NEWLINE_CONSTRAINT,
BUF_FIRST = PREV_BEGBUF_CONSTRAINT,
BUF_LAST = NEXT_ENDBUF_CONSTRAINT,
WORD_DELIM = DUMMY_CONSTRAINT
} re_context_type;
typedef struct
{
int alloc;
int nelem;
int *elems;
} re_node_set;
typedef enum
{
NON_TYPE = 0,
/* Token type, these are used only by token. */
OP_OPEN_SUBEXP,
OP_CLOSE_SUBEXP,
OP_OPEN_BRACKET,
OP_CLOSE_BRACKET,
OP_CHARSET_RANGE,
OP_OPEN_DUP_NUM,
OP_CLOSE_DUP_NUM,
OP_NON_MATCH_LIST,
OP_OPEN_COLL_ELEM,
OP_CLOSE_COLL_ELEM,
OP_OPEN_EQUIV_CLASS,
OP_CLOSE_EQUIV_CLASS,
OP_OPEN_CHAR_CLASS,
OP_CLOSE_CHAR_CLASS,
OP_WORD,
OP_NOTWORD,
BACK_SLASH,
/* Tree type, these are used only by tree. */
CONCAT,
ALT,
SUBEXP,
SIMPLE_BRACKET,
COMPLEX_BRACKET,
/* Node type, These are used by token, node, tree. */
OP_PERIOD,
CHARACTER,
END_OF_RE,
OP_ALT,
OP_DUP_ASTERISK,
OP_DUP_PLUS,
OP_DUP_QUESTION,
OP_BACK_REF,
ANCHOR,
OP_CONTEXT_NODE,
/* Dummy marker. */
END_OF_RE_TOKEN_T
} re_token_type_t;
typedef struct
{
/* If this character set is the non-matching list. */
unsigned int non_match : 1;
/* Multibyte characters. */
wchar_t *mbchars;
int nmbchars;
/* Collating symbols. */
#ifdef _LIBC
int32_t *coll_syms;
#endif
int ncoll_syms;
/* Equivalence classes. */
#ifdef _LIBC
int32_t *equiv_classes;
#endif
int nequiv_classes;
/* Range expressions. */
#ifdef _LIBC
uint32_t *range_starts;
uint32_t *range_ends;
#endif
int nranges;
/* Character classes. */
wctype_t *char_classes;
int nchar_classes;
} re_charset_t;
typedef struct
{
re_token_type_t type;
union
{
unsigned char c; /* for CHARACTER */
re_bitset_ptr_t sbcset; /* for SIMPLE_BRACKET */
re_charset_t *mbcset; /* for COMPLEX_BRACKET */
int idx; /* for BACK_REF */
re_context_type ctx_type; /* for ANCHOR */
struct
{
int entity; /* for OP_CONTEXT_NODE, index of the entity */
re_node_set *bkref_eclosure;
} *ctx_info;
} opr;
unsigned int constraint : 10; /* context constraint */
unsigned int duplicated : 1;
#ifdef RE_ENABLE_I18N
unsigned int mb_partial : 1;
#endif
} re_token_t;
#define IS_EPSILON_NODE(type) \
((type) == OP_ALT || (type) == OP_DUP_ASTERISK || (type) == OP_DUP_PLUS || \
(type) == OP_DUP_QUESTION || (type) == ANCHOR)
#define ACCEPT_MB_NODE(type) \
((type) == COMPLEX_BRACKET || (type) == OP_PERIOD)
struct re_string_t
{
/* Store the multibyte string. In case of "case insensitive mode" like
REG_ICASE, upper cases of the string are stored. */
const unsigned char *mbs;
/* Store the case sensitive multibyte string. In case of
"case insensitive mode", the original string are stored,
otherwise MBS_CASE points the same address that MBS points. */
const unsigned char *mbs_case;
int cur_idx;
int len;
#ifdef RE_ENABLE_I18N
/* Store the wide character string which is corresponding to MBS. */
wchar_t *wcs;
#endif
/* 1 if mbs is allocated by regex library. */
unsigned int mbs_alloc : 1;
/* 1 if mbs_case is allocated by regex library. */
unsigned int mbs_case_alloc : 1;
};
typedef struct re_string_t re_string_t;
static reg_errcode_t re_string_construct (re_string_t *pstr,
const unsigned char *str, int len,
RE_TRANSLATE_TYPE trans);
static reg_errcode_t re_string_construct_toupper (re_string_t *pstr,
const unsigned char *str,
int len,
RE_TRANSLATE_TYPE trans);
static void re_string_destruct (re_string_t *pstr);
#ifdef RE_ENABLE_I18N
static int re_string_elem_size_at (const re_string_t *pstr, int idx);
static inline int re_string_char_size_at (const re_string_t *pstr, int idx);
static inline wint_t re_string_wchar_at (const re_string_t *pstr, int idx);
#endif /* RE_ENABLE_I18N */
static unsigned int re_string_context_at (const re_string_t *input, int idx,
int eflags, int newline_anchor);
#define re_string_peek_byte(pstr, offset) \
((pstr)->mbs[(pstr)->cur_idx + offset])
#define re_string_peek_byte_case(pstr, offset) \
((pstr)->mbs_case[(pstr)->cur_idx + offset])
#define re_string_fetch_byte(pstr) \
((pstr)->mbs[(pstr)->cur_idx++])
#define re_string_fetch_byte_case(pstr) \
((pstr)->mbs_case[(pstr)->cur_idx++])
#define re_string_first_byte(pstr, idx) \
((idx) == (pstr)->len || (pstr)->wcs[idx] != WEOF)
#define re_string_is_single_byte_char(pstr, idx) \
((pstr)->wcs[idx] != WEOF && ((pstr)->len == (idx) \
|| (pstr)->wcs[(idx) + 1] != WEOF))
#define re_string_eoi(pstr) ((pstr)->len == (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;
struct re_backref_cache_entry
{
int node;
int from;
int to;
int flag;
};
typedef struct
{
int eflags;
int match_first;
int match_last;
int state_log_top;
/* Back reference cache. */
int nbkref_ents;
int abkref_ents;
struct re_backref_cache_entry *bkref_ents;
int max_bkref_len;
} re_match_context_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 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;
union
{
re_dfastate_t *state;
re_dfastate_t **array;
} entry;
};
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 *firsts;
int *nexts;
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. */
/* 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_intersect (re_node_set *dest,
const re_node_set *src1,
const re_node_set *src2);
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_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 (re_dfa_t *dfa,
const re_node_set *nodes);
static re_dfastate_t *re_acquire_state_context (re_dfa_t *dfa,
const re_node_set *nodes,
unsigned int context);
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 void
bitset_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 void
bitset_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 void
bitset_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 int
re_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_t
re_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 int
re_string_elem_size_at (pstr, idx)
const re_string_t *pstr;
int idx;
{
#ifdef _LIBC
const unsigned char *p;
const char *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 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 - (const unsigned char *) pstr->mbs - idx;
}
else
#endif /* _LIBC */
return 1;
}
#endif /* RE_ENABLE_I18N */
#endif /* _REGEX_INTERNAL_H */

2076
posix/regexec.c Normal file

File diff suppressed because it is too large Load Diff