Rev 24109 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
/* Definitions for data structures and routines for the regularexpression library, version 0.12.Copyright (C) 1985,89,90,91,92,93,95,96,97,98 Free Software Foundation, Inc.This file is part of the GNU C Library. Its master source is NOT part ofthe C library, however. The master source lives in /gd/gnu/lib.The GNU C Library is free software; you can redistribute it and/ormodify it under the terms of the GNU Library General Public License aspublished by the Free Software Foundation; either version 2 of theLicense, 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 ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNULibrary General Public License for more details.You should have received a copy of the GNU Library General PublicLicense along with the GNU C Library; see the file COPYING.LIB. If not,write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,Boston, MA 02111-1307, USA. */#ifndef _REGEX_H#define _REGEX_H 1/* remap entry points */# define regfree(preg) Rf_regfree (preg)# define regexec(pr, st, nm, pm, ef) Rf_regexec (pr, st, nm, pm, ef)# define regcomp(preg, pattern, cflags) Rf_regcomp (preg, pattern, cflags)# define regerror(errcode, preg, errbuf, errbuf_size) \Rf_regerror(errcode, preg, errbuf, errbuf_size)/* Allow the use in C++ code. */#ifdef __cplusplusextern "C" {#endif/* POSIX says that <sys/types.h> must be included (by the caller) before<regex.h>. */#if !defined _POSIX_C_SOURCE && !defined _POSIX_SOURCE && defined VMS/* VMS doesn't have `size_t' in <sys/types.h>, even though POSIX says itshould be there. */# include <stddef.h>#endif#ifdef Macintosh# include <stddef.h>#endif /* mac *//* The following two types have to be signed and unsigned integer typewide enough to hold a value of a pointer. For most ANSI compilersptrdiff_t and size_t should be likely OK. Still size of these twotypes is 2 for Microsoft C. Ugh... */typedef long int s_reg_t;typedef unsigned long int active_reg_t;/* The following bits are used to determine the regexp syntax werecognize. The set/not-set meanings are chosen so that Emacs syntaxremains the value 0. The bits are given in alphabetical order, andthe definitions shifted by one from the previous bit; thus, when weadd or remove a bit, only one other definition need change. */typedef unsigned long int reg_syntax_t;/* If this bit is not set, then \ inside a bracket expression is literal.If set, then such a \ quotes the following character. */#define RE_BACKSLASH_ESCAPE_IN_LISTS ((unsigned long int) 1)/* If this bit is not set, then + and ? are operators, and \+ and \? areliterals.If set, then \+ and \? are operators and + and ? are literals. */#define RE_BK_PLUS_QM (RE_BACKSLASH_ESCAPE_IN_LISTS << 1)/* If this bit is set, then character classes are supported. They are:[:alpha:], [:upper:], [:lower:], [:digit:], [:alnum:], [:xdigit:],[:space:], [:print:], [:punct:], [:graph:], and [:cntrl:].If not set, then character classes are not supported. */#define RE_CHAR_CLASSES (RE_BK_PLUS_QM << 1)/* If this bit is set, then ^ and $ are always anchors (outside bracketexpressions, of course).If this bit is not set, then it depends:^ is an anchor if it is at the beginning of a regularexpression or after an open-group or an alternation operator;$ is an anchor if it is at the end of a regular expression, orbefore a close-group or an alternation operator.This bit could be (re)combined with RE_CONTEXT_INDEP_OPS, becausePOSIX draft 11.2 says that * etc. in leading positions is undefined.We already implemented a previous draft which made those constructsinvalid, though, so we haven't changed the code back. */#define RE_CONTEXT_INDEP_ANCHORS (RE_CHAR_CLASSES << 1)/* If this bit is set, then special characters are always specialregardless of where they are in the pattern.If this bit is not set, then special characters are special only insome contexts; otherwise they are ordinary. Specifically,* + ? and intervals are only special when not after the beginning,open-group, or alternation operator. */#define RE_CONTEXT_INDEP_OPS (RE_CONTEXT_INDEP_ANCHORS << 1)/* If this bit is set, then *, +, ?, and { cannot be first in an re orimmediately after an alternation or begin-group operator. */#define RE_CONTEXT_INVALID_OPS (RE_CONTEXT_INDEP_OPS << 1)/* If this bit is set, then . matches newline.If not set, then it doesn't. */#define RE_DOT_NEWLINE (RE_CONTEXT_INVALID_OPS << 1)/* If this bit is set, then . doesn't match NUL.If not set, then it does. */#define RE_DOT_NOT_NULL (RE_DOT_NEWLINE << 1)/* If this bit is set, nonmatching lists [^...] do not match newline.If not set, they do. */#define RE_HAT_LISTS_NOT_NEWLINE (RE_DOT_NOT_NULL << 1)/* If this bit is set, either \{...\} or {...} defines aninterval, depending on RE_NO_BK_BRACES.If not set, \{, \}, {, and } are literals. */#define RE_INTERVALS (RE_HAT_LISTS_NOT_NEWLINE << 1)/* If this bit is set, +, ? and | aren't recognized as operators.If not set, they are. */#define RE_LIMITED_OPS (RE_INTERVALS << 1)/* If this bit is set, newline is an alternation operator.If not set, newline is literal. */#define RE_NEWLINE_ALT (RE_LIMITED_OPS << 1)/* If this bit is set, then `{...}' defines an interval, and \{ and \}are literals.If not set, then `\{...\}' defines an interval. */#define RE_NO_BK_BRACES (RE_NEWLINE_ALT << 1)/* If this bit is set, (...) defines a group, and \( and \) are literals.If not set, \(...\) defines a group, and ( and ) are literals. */#define RE_NO_BK_PARENS (RE_NO_BK_BRACES << 1)/* If this bit is set, then \<digit> matches <digit>.If not set, then \<digit> is a back-reference. */#define RE_NO_BK_REFS (RE_NO_BK_PARENS << 1)/* If this bit is set, then | is an alternation operator, and \| is literal.If not set, then \| is an alternation operator, and | is literal. */#define RE_NO_BK_VBAR (RE_NO_BK_REFS << 1)/* If this bit is set, then an ending range point collating higherthan the starting range point, as in [z-a], is invalid.If not set, then when ending range point collates higher than thestarting range point, the range is ignored. */#define RE_NO_EMPTY_RANGES (RE_NO_BK_VBAR << 1)/* If this bit is set, then an unmatched ) is ordinary.If not set, then an unmatched ) is invalid. */#define RE_UNMATCHED_RIGHT_PAREN_ORD (RE_NO_EMPTY_RANGES << 1)/* If this bit is set, succeed as soon as we match the whole pattern,without further backtracking. */#define RE_NO_POSIX_BACKTRACKING (RE_UNMATCHED_RIGHT_PAREN_ORD << 1)/* If this bit is set, do not process the GNU regex operators.If not set, then the GNU regex operators are recognized. */#define RE_NO_GNU_OPS (RE_NO_POSIX_BACKTRACKING << 1)/* If this bit is set, turn on internal regex debugging.If not set, and debugging was on, turn it off.This only works if regex.c is compiled -DDEBUG.We define this bit always, so that all that's needed to turn ondebugging is to recompile regex.c; the calling code can always havethis bit set, and it won't affect anything in the normal case. */#define RE_DEBUG (RE_NO_GNU_OPS << 1)/* This global variable defines the particular regexp syntax to use (forsome interfaces). When a regexp is compiled, the syntax used isstored in the pattern buffer, so changing this does not affectalready-compiled regexps. *//* extern reg_syntax_t re_syntax_options; *//* Define combinations of the above bits for the standard possibilities.(The [[[ comments delimit what gets put into the Texinfo file, sodon't delete them!) *//* [[[begin syntaxes]]] */#define RE_SYNTAX_EMACS 0#define RE_SYNTAX_AWK \(RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DOT_NOT_NULL \| RE_NO_BK_PARENS | RE_NO_BK_REFS \| RE_NO_BK_VBAR | RE_NO_EMPTY_RANGES \| RE_DOT_NEWLINE | RE_CONTEXT_INDEP_ANCHORS \| RE_UNMATCHED_RIGHT_PAREN_ORD | RE_NO_GNU_OPS)#define RE_SYNTAX_GNU_AWK \((RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DEBUG) \& ~(RE_DOT_NOT_NULL | RE_INTERVALS | RE_CONTEXT_INDEP_OPS))#define RE_SYNTAX_POSIX_AWK \(RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS \| RE_INTERVALS | RE_NO_GNU_OPS)#define RE_SYNTAX_GREP \(RE_BK_PLUS_QM | RE_CHAR_CLASSES \| RE_HAT_LISTS_NOT_NEWLINE | RE_INTERVALS \| RE_NEWLINE_ALT)#define RE_SYNTAX_EGREP \(RE_CHAR_CLASSES | RE_CONTEXT_INDEP_ANCHORS \| RE_CONTEXT_INDEP_OPS | RE_HAT_LISTS_NOT_NEWLINE \| RE_NEWLINE_ALT | RE_NO_BK_PARENS \| RE_NO_BK_VBAR)#define RE_SYNTAX_POSIX_EGREP \(RE_SYNTAX_EGREP | RE_INTERVALS | RE_NO_BK_BRACES)/* P1003.2/D11.2, section 4.20.7.1, lines 5078ff. */#define RE_SYNTAX_ED RE_SYNTAX_POSIX_BASIC#define RE_SYNTAX_SED RE_SYNTAX_POSIX_BASIC/* Syntax bits common to both basic and extended POSIX regex syntax. */#define _RE_SYNTAX_POSIX_COMMON \(RE_CHAR_CLASSES | RE_DOT_NEWLINE | RE_DOT_NOT_NULL \| RE_INTERVALS | RE_NO_EMPTY_RANGES)#define RE_SYNTAX_POSIX_BASIC \(_RE_SYNTAX_POSIX_COMMON | RE_BK_PLUS_QM)/* Differs from ..._POSIX_BASIC only in that RE_BK_PLUS_QM becomesRE_LIMITED_OPS, i.e., \? \+ \| are not recognized. Actually, thisisn't minimal, since other operators, such as \`, aren't disabled. */#define RE_SYNTAX_POSIX_MINIMAL_BASIC \(_RE_SYNTAX_POSIX_COMMON | RE_LIMITED_OPS)#define RE_SYNTAX_POSIX_EXTENDED \(_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \| RE_CONTEXT_INDEP_OPS | RE_NO_BK_BRACES \| RE_NO_BK_PARENS | RE_NO_BK_VBAR \| RE_UNMATCHED_RIGHT_PAREN_ORD)/* Differs from ..._POSIX_EXTENDED in that RE_CONTEXT_INVALID_OPSreplaces RE_CONTEXT_INDEP_OPS and RE_NO_BK_REFS is added. */#define RE_SYNTAX_POSIX_MINIMAL_EXTENDED \(_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \| RE_CONTEXT_INVALID_OPS | RE_NO_BK_BRACES \| RE_NO_BK_PARENS | RE_NO_BK_REFS \| RE_NO_BK_VBAR | RE_UNMATCHED_RIGHT_PAREN_ORD)/* [[[end syntaxes]]] *//* Maximum number of duplicates an interval can allow. Some systems(erroneously) define this in other header files, but we want ourvalue, so remove any previous define. */#ifdef RE_DUP_MAX# undef RE_DUP_MAX#endif/* If sizeof(int) == 2, then ((1 << 15) - 1) overflows. */#define RE_DUP_MAX (0x7fff)/* POSIX `cflags' bits (i.e., information for `regcomp'). *//* If this bit is set, then use extended regular expression syntax.If not set, then use basic regular expression syntax. */#define REG_EXTENDED 1/* If this bit is set, then ignore case when matching.If not set, then case is significant. */#define REG_ICASE (REG_EXTENDED << 1)/* If this bit is set, then anchors do not match at newlinecharacters in the string.If not set, then anchors do match at newlines. */#define REG_NEWLINE (REG_ICASE << 1)/* If this bit is set, then report only success or fail in regexec.If not set, then returns differ between not matching and errors. */#define REG_NOSUB (REG_NEWLINE << 1)/* POSIX `eflags' bits (i.e., information for regexec). *//* If this bit is set, then the beginning-of-line operator doesn't matchthe beginning of the string (presumably because it's not thebeginning of a line).If not set, then the beginning-of-line operator does match thebeginning of the string. */#define REG_NOTBOL 1/* Like REG_NOTBOL, except for the end-of-line. */#define REG_NOTEOL (1 << 1)/* If any error codes are removed, changed, or added, update the`re_error_msg' table in regex.c. */typedef enum{#ifdef _XOPEN_SOURCEREG_ENOSYS = -1, /* This will never happen for this implementation. */#endifREG_NOERROR = 0, /* Success. */REG_NOMATCH, /* Didn't find a match (for regexec). *//* POSIX regcomp return error codes. (In the order listed in thestandard.) */REG_BADPAT, /* Invalid pattern. */REG_ECOLLATE, /* Not implemented. */REG_ECTYPE, /* Invalid character class name. */REG_EESCAPE, /* Trailing backslash. */REG_ESUBREG, /* Invalid back reference. */REG_EBRACK, /* Unmatched left bracket. */REG_EPAREN, /* Parenthesis imbalance. */REG_EBRACE, /* Unmatched \{. */REG_BADBR, /* Invalid contents of \{\}. */REG_ERANGE, /* Invalid range end. */REG_ESPACE, /* Ran out of memory. */REG_BADRPT, /* No preceding re for repetition op. *//* Error codes we've added. */REG_EEND, /* Premature end. */REG_ESIZE, /* Compiled pattern bigger than 2^16 bytes. */REG_ERPAREN /* Unmatched ) or \); not returned from regcomp. */} reg_errcode_t;/* This data structure represents a compiled pattern. Before callingthe pattern compiler, the fields `buffer', `allocated', `fastmap',`translate', and `no_sub' can be set. After the pattern has beencompiled, the `re_nsub' field is available. All other fields areprivate to the regex routines. */#ifndef RE_TRANSLATE_TYPE# define RE_TRANSLATE_TYPE char *#endifstruct re_pattern_buffer{/* [[[begin pattern_buffer]]] *//* Space that holds the compiled pattern. It is declared as`unsigned char *' because its elements aresometimes used as array indexes. */unsigned char *buffer;/* Number of bytes to which `buffer' points. */unsigned long int allocated;/* Number of bytes actually used in `buffer'. */unsigned long int used;/* Syntax setting with which the pattern was compiled. */reg_syntax_t syntax;/* Pointer to a fastmap, if any, otherwise zero. re_search usesthe fastmap, if there is one, to skip over impossiblestarting points for matches. */char *fastmap;/* Either a translate table to apply to all characters beforecomparing them, or zero for no translation. The translationis applied to a pattern when it is compiled and to a stringwhen it is matched. */RE_TRANSLATE_TYPE translate;/* Number of subexpressions found by the compiler. */size_t re_nsub;/* Zero if this pattern cannot match the empty string, one else.Well, in truth it's used only in `re_search_2', to seewhether or not we should use the fastmap, so we don't setthis absolutely perfectly; see `re_compile_fastmap' (the`duplicate' case). */unsigned can_be_null : 1;/* If REGS_UNALLOCATED, allocate space in the `regs' structurefor `max (RE_NREGS, re_nsub + 1)' groups.If REGS_REALLOCATE, reallocate space if necessary.If REGS_FIXED, use what's there. */#define REGS_UNALLOCATED 0#define REGS_REALLOCATE 1#define REGS_FIXED 2unsigned regs_allocated : 2;/* Set to zero when `regex_compile' compiles a pattern; set to oneby `re_compile_fastmap' if it updates the fastmap. */unsigned fastmap_accurate : 1;/* If set, `re_match_2' does not return information aboutsubexpressions. */unsigned no_sub : 1;/* If set, a beginning-of-line anchor doesn't match at thebeginning of the string. */unsigned not_bol : 1;/* Similarly for an end-of-line anchor. */unsigned not_eol : 1;/* If true, an anchor at a newline matches. */unsigned newline_anchor : 1;/* [[[end pattern_buffer]]] */};typedef struct re_pattern_buffer regex_t;/* Type for byte offsets within the string. POSIX mandates this. */typedef int regoff_t;/* This is the structure we store register match data in. Seeregex.texinfo for a full description of what registers match. */struct re_registers{unsigned num_regs;regoff_t *start;regoff_t *end;};/* If `regs_allocated' is REGS_UNALLOCATED in the pattern buffer,`re_match_2' returns information about at least this many registersthe first time a `regs' structure is passed. */#ifndef RE_NREGS# define RE_NREGS 30#endif/* POSIX specification for registers. Aside from the different names than`re_registers', POSIX uses an array of structures, instead of astructure of arrays. */typedef struct{regoff_t rm_so; /* Byte offset from string's start to substring's start. */regoff_t rm_eo; /* Byte offset from string's start to substring's end. */} regmatch_t;/* Declarations for routines. *//* To avoid duplicating every routine declaration -- once with aprototype (if we are ANSI), and once without (if we aren't) -- weuse the following macro to declare argument types. Thisunfortunately clutters up the declarations a bit, but I think it'sworth it. */#if __STDC__# define _RE_ARGS(args) args#else /* not __STDC__ */# define _RE_ARGS(args) ()#endif /* not __STDC__ */#if defined _REGEX_RE_COMP || defined _LIBC# ifndef _CRAY/* 4.2 bsd compatibility. */extern char *re_comp _RE_ARGS ((const char *));extern int re_exec _RE_ARGS ((const char *));# endif#endif/* POSIX compatibility. */extern int Rf_regcomp _RE_ARGS ((regex_t *__preg, const char *__pattern,int __cflags));extern int Rf_regexec _RE_ARGS ((const regex_t *__preg,const char *__string, size_t __nmatch,regmatch_t __pmatch[], int __eflags));extern size_t Rf_regerror _RE_ARGS ((int __errcode, const regex_t *__preg,char *__errbuf, size_t __errbuf_size));extern void Rf_regfree _RE_ARGS ((regex_t *__preg));#ifdef __cplusplus}#endif /* C++ */#endif