diff options
Diffstat (limited to 'gnu/usr.bin/cvs/lib/regex.h')
-rw-r--r-- | gnu/usr.bin/cvs/lib/regex.h | 337 |
1 files changed, 174 insertions, 163 deletions
diff --git a/gnu/usr.bin/cvs/lib/regex.h b/gnu/usr.bin/cvs/lib/regex.h index 211ad09..408dd21 100644 --- a/gnu/usr.bin/cvs/lib/regex.h +++ b/gnu/usr.bin/cvs/lib/regex.h @@ -1,7 +1,7 @@ /* Definitions for data structures and routines for the regular - expression library, version REPLACE-WITH-VERSION. + expression library, version 0.12. - Copyright (C) 1985, 1989, 1990, 1991, 1992 Free Software Foundation, Inc. + Copyright (C) 1985, 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc. 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 @@ -20,7 +20,15 @@ #ifndef __REGEXP_LIBRARY_H__ #define __REGEXP_LIBRARY_H__ -/* POSIX says that <sys/types.h> must be included before <regex.h>. */ +/* POSIX says that <sys/types.h> must be included (by the caller) before + <regex.h>. */ + +#ifdef VMS +/* VMS doesn't have `size_t' in <sys/types.h>, even though POSIX says it + should be there. */ +#include <stddef.h> +#endif + /* The following bits are used to determine the regexp syntax we recognize. The set/not-set meanings are chosen so that Emacs syntax @@ -45,17 +53,17 @@ typedef unsigned reg_syntax_t; #define RE_CHAR_CLASSES (RE_BK_PLUS_QM << 1) /* If this bit is set, then ^ and $ are always anchors (outside bracket - expressions). + expressions, of course). If this bit is not set, then it depends: ^ is an anchor if it is at the beginning of a regular expression or after an open-group or an alternation operator; $ is an anchor if it is at the end of a regular expression, or before a close-group or an alternation operator. + This bit could be (re)combined with RE_CONTEXT_INDEP_OPS, because - POSIX now says that the behavior of * etc. in leading positions is - undefined. We have already implemented a previous draft which - made those constructs invalid, so we may as well not change the code - back. */ + POSIX draft 11.2 says that * etc. in leading positions is undefined. + We already implemented a previous draft which made those constructs + invalid, 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 special @@ -67,16 +75,14 @@ typedef unsigned reg_syntax_t; #define RE_CONTEXT_INDEP_OPS (RE_CONTEXT_INDEP_ANCHORS << 1) /* If this bit is set, then *, +, ?, and { cannot be first in an re or - immediately after an alternation or begin-group operator. - Furthermore, alternation cannot be first or last in an re, or - immediately follow another alternation or begin-group. */ + immediately after an alternation or begin-group operator. */ #define RE_CONTEXT_INVALID_OPS (RE_CONTEXT_INDEP_OPS << 1) -/* If this bit is set, then . matches a newline. +/* 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 period doesn't match a null. +/* 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) @@ -89,7 +95,7 @@ typedef unsigned reg_syntax_t; 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 this bit is set, +, ? and | aren't recognized as operators. If not set, they are. */ #define RE_LIMITED_OPS (RE_INTERVALS << 1) @@ -97,104 +103,112 @@ typedef unsigned reg_syntax_t; If not set, newline is literal. */ #define RE_NEWLINE_ALT (RE_LIMITED_OPS << 1) -/* If this bit is set, newline in the pattern is an ordinary character. - If not set, newline before ^ or after $ allows the ^ or $ to be an - anchor. */ -#define RE_NEWLINE_ORDINARY (RE_NEWLINE_ALT << 1) - -/* If this bit is not set, then \{ and \} defines an interval, - and { and } are literals. - If set, then { and } defines an interval, and \{ and \} are literals. */ -#define RE_NO_BK_BRACES (RE_NEWLINE_ORDINARY << 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 back references (i.e., \<digit>) are not - recognized. - If not set, then they are. */ +/* 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 you can't have empty alternatives. - If not set, then you can. */ -#define RE_NO_EMPTY_ALTS (RE_NO_BK_VBAR << 1) - -/* If this bit is set, then you can't have empty groups. - If not set, then you can. */ -#define RE_NO_EMPTY_GROUPS (RE_NO_EMPTY_ALTS << 1) - -/* If this bit is set, then an ending range point has to collate higher - than or equal to the starting range point. - If not set, then when the ending range point collates higher than the - starting range point, we consider such a range to be empty. */ -#define RE_NO_EMPTY_RANGES (RE_NO_EMPTY_GROUPS << 1) +/* If this bit is set, then an ending range point collating higher + than the starting range point, as in [z-a], is invalid. + If not set, then when ending range point collates higher than the + starting range point, the range is ignored. */ +#define RE_NO_EMPTY_RANGES (RE_NO_BK_VBAR << 1) -/* If this bit is set, then all back references must refer to a preceding - subexpression. - If not set, then a back reference to a nonexistent subexpression is - treated as literal characters. */ -#define RE_NO_MISSING_BK_REF (RE_NO_EMPTY_RANGES << 1) - -/* If this bit is set, then Regex considers an unmatched close-group - operator to be the ordinary character parenthesis. - If not set, then an unmatched close-group operator is invalid. */ -#define RE_UNMATCHED_RIGHT_PAREN_ORD (RE_NO_MISSING_BK_REF << 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) /* This global variable defines the particular regexp syntax to use (for some interfaces). When a regexp is compiled, the syntax used is stored in the pattern buffer, so changing this does not affect already-compiled regexps. */ -extern reg_syntax_t obscure_syntax; - - - +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.) */ + (The [[[ comments delimit what gets put into the Texinfo file, so + don't delete them!) */ /* [[[begin syntaxes]]] */ #define RE_SYNTAX_EMACS 0 -#define RE_SYNTAX_POSIX_AWK \ - (RE_CONTEXT_INDEP_ANCHORS | RE_CONTEXT_INDEP_OPS | RE_NO_BK_PARENS \ - | RE_NO_BK_VBAR) - #define RE_SYNTAX_AWK \ - (RE_BACKSLASH_ESCAPE_IN_LISTS | RE_SYNTAX_POSIX_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_UNMATCHED_RIGHT_PAREN_ORD) + +#define RE_SYNTAX_POSIX_AWK \ + (RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS) #define RE_SYNTAX_GREP \ - (RE_BK_PLUS_QM | RE_NEWLINE_ALT) + (RE_BK_PLUS_QM | RE_CHAR_CLASSES \ + | RE_HAT_LISTS_NOT_NEWLINE | RE_INTERVALS \ + | RE_NEWLINE_ALT) #define RE_SYNTAX_EGREP \ - (RE_CONTEXT_INDEP_ANCHORS | RE_CONTEXT_INDEP_OPS \ - | RE_NEWLINE_ALT | RE_NO_BK_PARENS | RE_NO_BK_VBAR) + (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_CHAR_CLASSES | RE_DOT_NEWLINE \ - | RE_DOT_NOT_NULL | RE_INTERVALS | RE_LIMITED_OPS \ - | RE_NEWLINE_ORDINARY | RE_NO_EMPTY_RANGES | RE_NO_MISSING_BK_REF) + (_RE_SYNTAX_POSIX_COMMON | RE_BK_PLUS_QM) + +/* Differs from ..._POSIX_BASIC only in that RE_BK_PLUS_QM becomes + RE_LIMITED_OPS, i.e., \? \+ \| are not recognized. Actually, this + isn'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_CHAR_CLASSES | RE_CONTEXT_INDEP_ANCHORS \ - | RE_CONTEXT_INVALID_OPS | RE_DOT_NEWLINE | RE_DOT_NOT_NULL \ - | RE_INTERVALS | RE_NEWLINE_ORDINARY | RE_NO_BK_BRACES \ - | RE_NO_BK_PARENS | RE_NO_BK_REFS | RE_NO_BK_VBAR \ - | RE_NO_EMPTY_ALTS | RE_NO_EMPTY_GROUPS | RE_NO_EMPTY_RANGES \ + (_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) -/* [[[end syntaxes]]] */ - - +/* Differs from ..._POSIX_EXTENDED in that RE_CONTEXT_INVALID_OPS + replaces 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. */ +/* Maximum number of duplicates an interval can allow. Some systems + (erroneously) define this in other header files, but we want our + value, so remove any previous define. */ +#ifdef RE_DUP_MAX #undef RE_DUP_MAX -#define RE_DUP_MAX ((1 << 15) - 1) +#endif +#define RE_DUP_MAX ((1 << 15) - 1) -/* POSIX `cflags' bits (i.e., information for regcomp). */ +/* 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. */ @@ -254,9 +268,6 @@ typedef enum 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 calling the pattern compiler, the fields `buffer', `allocated', `fastmap', @@ -295,19 +306,28 @@ struct re_pattern_buffer /* Number of subexpressions found by the compiler. */ size_t re_nsub; - /* Set to 1 by re_compile_fastmap if this pattern can match the - null string; 0 prevents the searcher from matching it with - the null string. Set to 2 if it might match the null string - either at the end of a search range or just before a - character listed in the fastmap. */ - unsigned can_be_null : 2; - - /* Set to zero when regex_compile compiles a pattern; set to one - by re_compile_fastmap when it updates the fastmap, if any. */ + /* Zero if this pattern cannot match the empty string, one else. + Well, in truth it's used only in `re_search_2', to see + whether or not we should use the fastmap, so we don't set + this absolutely perfectly; see `re_compile_fastmap' (the + `duplicate' case). */ + unsigned can_be_null : 1; + + /* If REGS_UNALLOCATED, allocate space in the `regs' structure + for `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 2 + unsigned regs_allocated : 2; + + /* Set to zero when `regex_compile' compiles a pattern; set to one + by `re_compile_fastmap' if it updates the fastmap. */ unsigned fastmap_accurate : 1; - /* If set, regexec reports only success or failure and does not - return anything in pmatch. */ + /* If set, `re_match_2' does not return information about + subexpressions. */ unsigned no_sub : 1; /* If set, a beginning-of-line anchor doesn't match at the @@ -320,10 +340,6 @@ struct re_pattern_buffer /* If true, an anchor at a newline matches. */ unsigned newline_anchor : 1; - /* If set, re_match_2 assumes a non-null REGS argument is - initialized. If not set, REGS is initialized to the max of - RE_NREGS and re_nsub + 1 registers. */ - unsigned caller_allocated_regs : 1; /* [[[end pattern_buffer]]] */ }; @@ -333,12 +349,8 @@ typedef struct re_pattern_buffer regex_t; /* search.c (search_buffer) in Emacs needs this one opcode value. It is defined both in `regex.c' and here. */ #define RE_EXACTN_VALUE 1 - - - -/* Type for byte offsets within the string. POSIX mandates us defining - this. */ +/* Type for byte offsets within the string. POSIX mandates this. */ typedef int regoff_t; @@ -352,8 +364,9 @@ struct re_registers }; -/* If `caller_allocated_regs' is zero in the pattern buffer, re_match_2 - returns information about this many registers. */ +/* If `regs_allocated' is REGS_UNALLOCATED in the pattern buffer, + `re_match_2' returns information about at least this many registers + the first time a `regs' structure is passed. */ #ifndef RE_NREGS #define RE_NREGS 30 #endif @@ -367,29 +380,41 @@ 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 a + prototype (if we are ANSI), and once without (if we aren't) -- we + use the following macro to declare argument types. This + unfortunately clutters up the declarations a bit, but I think it's + worth it. */ + #if __STDC__ -/* Sets the current syntax to SYNTAX. You can also simply assign to the - `obscure_syntax' variable. */ -extern reg_syntax_t re_set_syntax (reg_syntax_t syntax); +#define _RE_ARGS(args) args + +#else /* not __STDC__ */ + +#define _RE_ARGS(args) () + +#endif /* not __STDC__ */ + +/* Sets the current default syntax to SYNTAX, and return the old syntax. + You can also simply assign to the `re_syntax_options' variable. */ +extern reg_syntax_t re_set_syntax _RE_ARGS ((reg_syntax_t syntax)); /* Compile the regular expression PATTERN, with length LENGTH - and syntax given by the global `obscure_syntax', into the buffer + and syntax given by the global `re_syntax_options', into the buffer BUFFER. Return NULL if successful, and an error string if not. */ -extern const char *re_compile_pattern (const char *pattern, int length, - struct re_pattern_buffer *buffer); +extern const char *re_compile_pattern + _RE_ARGS ((const char *pattern, int length, + struct re_pattern_buffer *buffer)); /* Compile a fastmap for the compiled pattern in BUFFER; used to accelerate searches. Return 0 if successful and -2 if was an internal error. */ -extern int re_compile_fastmap (struct re_pattern_buffer *buffer); +extern int re_compile_fastmap _RE_ARGS ((struct re_pattern_buffer *buffer)); /* Search in the string STRING (with length LENGTH) for the pattern @@ -397,78 +422,64 @@ extern int re_compile_fastmap (struct re_pattern_buffer *buffer); characters. Return the starting position of the match, -1 for no match, or -2 for an internal error. Also return register information in REGS (if REGS and BUFFER->no_sub are nonzero). */ -extern int re_search (struct re_pattern_buffer *buffer, - const char *string, int length, - int start, int range, - struct re_registers *regs); +extern int re_search + _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string, + int length, int start, int range, struct re_registers *regs)); /* Like `re_search', but search in the concatenation of STRING1 and STRING2. Also, stop searching at index START + STOP. */ -extern int re_search_2 (struct re_pattern_buffer *buffer, - const char *string1, int length1, - const char *string2, int length2, - int start, int range, - struct re_registers *regs, - int stop); +extern int re_search_2 + _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1, + int length1, const char *string2, int length2, + int start, int range, struct re_registers *regs, int stop)); /* Like `re_search', but return how many characters in STRING the regexp in BUFFER matched, starting at position START. */ -extern int re_match (const struct re_pattern_buffer *buffer, - const char *string, int length, - int start, struct re_registers *regs); +extern int re_match + _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string, + int length, int start, struct re_registers *regs)); /* Relates to `re_match' as `re_search_2' relates to `re_search'. */ -extern int re_match_2 (const struct re_pattern_buffer *buffer, - const char *string1, int length1, - const char *string2, int length2, - int start, - struct re_registers *regs, - int stop); +extern int re_match_2 + _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1, + int length1, const char *string2, int length2, + int start, struct re_registers *regs, int stop)); -#ifndef __386BSD__ -/* 4.2 bsd compatibility. */ -#ifndef bsdi -extern const char *re_comp (const char *); -#endif -extern int re_exec (const char *); -#endif +/* Set REGS to hold NUM_REGS registers, storing them in STARTS and + ENDS. Subsequent matches using BUFFER and REGS will use this memory + for recording register information. STARTS and ENDS must be + allocated with malloc, and must each be at least `NUM_REGS * sizeof + (regoff_t)' bytes long. -/* POSIX compatibility. */ -extern int regcomp (regex_t *preg, const char *pattern, int cflags); -extern int regexec (const regex_t *preg, const char *string, size_t nmatch, - regmatch_t pmatch[], int eflags); -extern size_t regerror (int errcode, const regex_t *preg, char *errbuf, - size_t errbuf_size); -extern void regfree (regex_t *preg); + If NUM_REGS == 0, then subsequent matches should allocate their own + register data. -#else /* not __STDC__ */ + Unless this function is called, the first search or match using + PATTERN_BUFFER will allocate its own register data, without + freeing the old data. */ +extern void re_set_registers + _RE_ARGS ((struct re_pattern_buffer *buffer, struct re_registers *regs, + unsigned num_regs, regoff_t *starts, regoff_t *ends)); -/* Support old C compilers. */ -#define const - -extern reg_syntax_t re_set_syntax (); -extern char *re_compile_pattern (); -extern int re_search (), re_search_2 (); -extern int re_match (), re_match_2 (); - -/* 4.2 BSD compatibility. */ -extern char *re_comp (); -extern int re_exec (); +/* 4.2 bsd compatibility. */ +extern char *re_comp _RE_ARGS ((const char *)); +extern int re_exec _RE_ARGS ((const char *)); /* POSIX compatibility. */ -extern int regcomp (); -extern int regexec (); -extern size_t regerror (); -extern void regfree (); +extern int regcomp _RE_ARGS ((regex_t *preg, const char *pattern, int cflags)); +extern int regexec + _RE_ARGS ((const regex_t *preg, const char *string, size_t nmatch, + regmatch_t pmatch[], int eflags)); +extern size_t regerror + _RE_ARGS ((int errcode, const regex_t *preg, char *errbuf, + size_t errbuf_size)); +extern void regfree _RE_ARGS ((regex_t *preg)); -#endif /* not __STDC__ */ #endif /* not __REGEXP_LIBRARY_H__ */ - - /* Local variables: |