mirror of
https://github.com/GnoConsortium/gno.git
synced 2024-09-28 18:54:51 +00:00
initial checkin
This commit is contained in:
parent
4f8059fffa
commit
a5c3c955aa
56
lib/libc/regex/COPYRIGHT
Normal file
56
lib/libc/regex/COPYRIGHT
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
Copyright 1992, 1993, 1994 Henry Spencer. All rights reserved.
|
||||||
|
This software is not subject to any license of the American Telephone
|
||||||
|
and Telegraph Company or of the Regents of the University of California.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose on
|
||||||
|
any computer system, and to alter it and redistribute it, subject
|
||||||
|
to the following restrictions:
|
||||||
|
|
||||||
|
1. The author is not responsible for the consequences of use of this
|
||||||
|
software, no matter how awful, even if they arise from flaws in it.
|
||||||
|
|
||||||
|
2. The origin of this software must not be misrepresented, either by
|
||||||
|
explicit claim or by omission. Since few users ever read sources,
|
||||||
|
credits must appear in the documentation.
|
||||||
|
|
||||||
|
3. Altered versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software. Since few users
|
||||||
|
ever read sources, credits must appear in the documentation.
|
||||||
|
|
||||||
|
4. This notice may not be removed or altered.
|
||||||
|
|
||||||
|
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||||
|
/*-
|
||||||
|
* Copyright (c) 1994
|
||||||
|
* The Regents of the University of California. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the University of
|
||||||
|
* California, Berkeley and its contributors.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* @(#)COPYRIGHT 8.1 (Berkeley) 3/16/94
|
||||||
|
*/
|
94
lib/libc/regex/WHATSNEW
Normal file
94
lib/libc/regex/WHATSNEW
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
# @(#)WHATSNEW 8.3 (Berkeley) 3/18/94
|
||||||
|
|
||||||
|
New in alpha3.4: The complex bug alluded to below has been fixed (in a
|
||||||
|
slightly kludgey temporary way that may hurt efficiency a bit; this is
|
||||||
|
another "get it out the door for 4.4" release). The tests at the end of
|
||||||
|
the tests file have accordingly been uncommented. The primary sign of
|
||||||
|
the bug was that something like a?b matching ab matched b rather than ab.
|
||||||
|
(The bug was essentially specific to this exact situation, else it would
|
||||||
|
have shown up earlier.)
|
||||||
|
|
||||||
|
New in alpha3.3: The definition of word boundaries has been altered
|
||||||
|
slightly, to more closely match the usual programming notion that "_"
|
||||||
|
is an alphabetic. Stuff used for pre-ANSI systems is now in a subdir,
|
||||||
|
and the makefile no longer alludes to it in mysterious ways. The
|
||||||
|
makefile has generally been cleaned up some. Fixes have been made
|
||||||
|
(again!) so that the regression test will run without -DREDEBUG, at
|
||||||
|
the cost of weaker checking. A workaround for a bug in some folks'
|
||||||
|
<assert.h> has been added. And some more things have been added to
|
||||||
|
tests, including a couple right at the end which are commented out
|
||||||
|
because the code currently flunks them (complex bug; fix coming).
|
||||||
|
Plus the usual minor cleanup.
|
||||||
|
|
||||||
|
New in alpha3.2: Assorted bits of cleanup and portability improvement
|
||||||
|
(the development base is now a BSDI system using GCC instead of an ancient
|
||||||
|
Sun system, and the newer compiler exposed some glitches). Fix for a
|
||||||
|
serious bug that affected REs using many [] (including REG_ICASE REs
|
||||||
|
because of the way they are implemented), *sometimes*, depending on
|
||||||
|
memory-allocation patterns. The header-file prototypes no longer name
|
||||||
|
the parameters, avoiding possible name conflicts. The possibility that
|
||||||
|
some clot has defined CHAR_MIN as (say) `-128' instead of `(-128)' is
|
||||||
|
now handled gracefully. "uchar" is no longer used as an internal type
|
||||||
|
name (too many people have the same idea). Still the same old lousy
|
||||||
|
performance, alas.
|
||||||
|
|
||||||
|
New in alpha3.1: Basically nothing, this release is just a bookkeeping
|
||||||
|
convenience. Stay tuned.
|
||||||
|
|
||||||
|
New in alpha3.0: Performance is no better, alas, but some fixes have been
|
||||||
|
made and some functionality has been added. (This is basically the "get
|
||||||
|
it out the door in time for 4.4" release.) One bug fix: regfree() didn't
|
||||||
|
free the main internal structure (how embarrassing). It is now possible
|
||||||
|
to put NULs in either the RE or the target string, using (resp.) a new
|
||||||
|
REG_PEND flag and the old REG_STARTEND flag. The REG_NOSPEC flag to
|
||||||
|
regcomp() makes all characters ordinary, so you can match a literal
|
||||||
|
string easily (this will become more useful when performance improves!).
|
||||||
|
There are now primitives to match beginnings and ends of words, although
|
||||||
|
the syntax is disgusting and so is the implementation. The REG_ATOI
|
||||||
|
debugging interface has changed a bit. And there has been considerable
|
||||||
|
internal cleanup of various kinds.
|
||||||
|
|
||||||
|
New in alpha2.3: Split change list out of README, and moved flags notes
|
||||||
|
into Makefile. Macro-ized the name of regex(7) in regex(3), since it has
|
||||||
|
to change for 4.4BSD. Cleanup work in engine.c, and some new regression
|
||||||
|
tests to catch tricky cases thereof.
|
||||||
|
|
||||||
|
New in alpha2.2: Out-of-date manpages updated. Regerror() acquires two
|
||||||
|
small extensions -- REG_ITOA and REG_ATOI -- which avoid debugging kludges
|
||||||
|
in my own test program and might be useful to others for similar purposes.
|
||||||
|
The regression test will now compile (and run) without REDEBUG. The
|
||||||
|
BRE \$ bug is fixed. Most uses of "uchar" are gone; it's all chars now.
|
||||||
|
Char/uchar parameters are now written int/unsigned, to avoid possible
|
||||||
|
portability problems with unpromoted parameters. Some unsigned casts have
|
||||||
|
been introduced to minimize portability problems with shifting into sign
|
||||||
|
bits.
|
||||||
|
|
||||||
|
New in alpha2.1: Lots of little stuff, cleanup and fixes. The one big
|
||||||
|
thing is that regex.h is now generated, using mkh, rather than being
|
||||||
|
supplied in the distribution; due to circularities in dependencies,
|
||||||
|
you have to build regex.h explicitly by "make h". The two known bugs
|
||||||
|
have been fixed (and the regression test now checks for them), as has a
|
||||||
|
problem with assertions not being suppressed in the absence of REDEBUG.
|
||||||
|
No performance work yet.
|
||||||
|
|
||||||
|
New in alpha2: Backslash-anything is an ordinary character, not an
|
||||||
|
error (except, of course, for the handful of backslashed metacharacters
|
||||||
|
in BREs), which should reduce script breakage. The regression test
|
||||||
|
checks *where* null strings are supposed to match, and has generally
|
||||||
|
been tightened up somewhat. Small bug fixes in parameter passing (not
|
||||||
|
harmful, but technically errors) and some other areas. Debugging
|
||||||
|
invoked by defining REDEBUG rather than not defining NDEBUG.
|
||||||
|
|
||||||
|
New in alpha+3: full prototyping for internal routines, using a little
|
||||||
|
helper program, mkh, which extracts prototypes given in stylized comments.
|
||||||
|
More minor cleanup. Buglet fix: it's CHAR_BIT, not CHAR_BITS. Simple
|
||||||
|
pre-screening of input when a literal string is known to be part of the
|
||||||
|
RE; this does wonders for performance.
|
||||||
|
|
||||||
|
New in alpha+2: minor bits of cleanup. Notably, the number "32" for the
|
||||||
|
word width isn't hardwired into regexec.c any more, the public header
|
||||||
|
file prototypes the functions if __STDC__ is defined, and some small typos
|
||||||
|
in the manpages have been fixed.
|
||||||
|
|
||||||
|
New in alpha+1: improvements to the manual pages, and an important
|
||||||
|
extension, the REG_STARTEND option to regexec().
|
70
lib/libc/regex/cclass.h
Normal file
70
lib/libc/regex/cclass.h
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
/*-
|
||||||
|
* Copyright (c) 1992, 1993, 1994 Henry Spencer.
|
||||||
|
* Copyright (c) 1992, 1993, 1994
|
||||||
|
* The Regents of the University of California. All rights reserved.
|
||||||
|
*
|
||||||
|
* This code is derived from software contributed to Berkeley by
|
||||||
|
* Henry Spencer.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the University of
|
||||||
|
* California, Berkeley and its contributors.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* @(#)cclass.h 8.3 (Berkeley) 3/20/94
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* character-class table */
|
||||||
|
static struct cclass {
|
||||||
|
char *name;
|
||||||
|
char *chars;
|
||||||
|
char *multis;
|
||||||
|
} cclasses[] = {
|
||||||
|
"alnum", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\
|
||||||
|
0123456789", "",
|
||||||
|
"alpha", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
|
||||||
|
"",
|
||||||
|
"blank", " \t", "",
|
||||||
|
"cntrl", "\007\b\t\n\v\f\r\1\2\3\4\5\6\16\17\20\21\22\23\24\
|
||||||
|
\25\26\27\30\31\32\33\34\35\36\37\177", "",
|
||||||
|
"digit", "0123456789", "",
|
||||||
|
"graph", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\
|
||||||
|
0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~",
|
||||||
|
"",
|
||||||
|
"lower", "abcdefghijklmnopqrstuvwxyz",
|
||||||
|
"",
|
||||||
|
"print", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\
|
||||||
|
0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ ",
|
||||||
|
"",
|
||||||
|
"punct", "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~",
|
||||||
|
"",
|
||||||
|
"space", "\t\n\v\f\r ", "",
|
||||||
|
"upper", "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
|
||||||
|
"",
|
||||||
|
"xdigit", "0123456789ABCDEFabcdef",
|
||||||
|
"",
|
||||||
|
NULL, 0, ""
|
||||||
|
};
|
141
lib/libc/regex/cname.h
Normal file
141
lib/libc/regex/cname.h
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
/*-
|
||||||
|
* Copyright (c) 1992, 1993, 1994 Henry Spencer.
|
||||||
|
* Copyright (c) 1992, 1993, 1994
|
||||||
|
* The Regents of the University of California. All rights reserved.
|
||||||
|
*
|
||||||
|
* This code is derived from software contributed to Berkeley by
|
||||||
|
* Henry Spencer.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the University of
|
||||||
|
* California, Berkeley and its contributors.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* @(#)cname.h 8.3 (Berkeley) 3/20/94
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* character-name table */
|
||||||
|
static struct cname {
|
||||||
|
char *name;
|
||||||
|
char code;
|
||||||
|
} cnames[] = {
|
||||||
|
"NUL", '\0',
|
||||||
|
"SOH", '\001',
|
||||||
|
"STX", '\002',
|
||||||
|
"ETX", '\003',
|
||||||
|
"EOT", '\004',
|
||||||
|
"ENQ", '\005',
|
||||||
|
"ACK", '\006',
|
||||||
|
"BEL", '\007',
|
||||||
|
"alert", '\007',
|
||||||
|
"BS", '\010',
|
||||||
|
"backspace", '\b',
|
||||||
|
"HT", '\011',
|
||||||
|
"tab", '\t',
|
||||||
|
"LF", '\012',
|
||||||
|
"newline", '\n',
|
||||||
|
"VT", '\013',
|
||||||
|
"vertical-tab", '\v',
|
||||||
|
"FF", '\014',
|
||||||
|
"form-feed", '\f',
|
||||||
|
"CR", '\015',
|
||||||
|
"carriage-return", '\r',
|
||||||
|
"SO", '\016',
|
||||||
|
"SI", '\017',
|
||||||
|
"DLE", '\020',
|
||||||
|
"DC1", '\021',
|
||||||
|
"DC2", '\022',
|
||||||
|
"DC3", '\023',
|
||||||
|
"DC4", '\024',
|
||||||
|
"NAK", '\025',
|
||||||
|
"SYN", '\026',
|
||||||
|
"ETB", '\027',
|
||||||
|
"CAN", '\030',
|
||||||
|
"EM", '\031',
|
||||||
|
"SUB", '\032',
|
||||||
|
"ESC", '\033',
|
||||||
|
"IS4", '\034',
|
||||||
|
"FS", '\034',
|
||||||
|
"IS3", '\035',
|
||||||
|
"GS", '\035',
|
||||||
|
"IS2", '\036',
|
||||||
|
"RS", '\036',
|
||||||
|
"IS1", '\037',
|
||||||
|
"US", '\037',
|
||||||
|
"space", ' ',
|
||||||
|
"exclamation-mark", '!',
|
||||||
|
"quotation-mark", '"',
|
||||||
|
"number-sign", '#',
|
||||||
|
"dollar-sign", '$',
|
||||||
|
"percent-sign", '%',
|
||||||
|
"ampersand", '&',
|
||||||
|
"apostrophe", '\'',
|
||||||
|
"left-parenthesis", '(',
|
||||||
|
"right-parenthesis", ')',
|
||||||
|
"asterisk", '*',
|
||||||
|
"plus-sign", '+',
|
||||||
|
"comma", ',',
|
||||||
|
"hyphen", '-',
|
||||||
|
"hyphen-minus", '-',
|
||||||
|
"period", '.',
|
||||||
|
"full-stop", '.',
|
||||||
|
"slash", '/',
|
||||||
|
"solidus", '/',
|
||||||
|
"zero", '0',
|
||||||
|
"one", '1',
|
||||||
|
"two", '2',
|
||||||
|
"three", '3',
|
||||||
|
"four", '4',
|
||||||
|
"five", '5',
|
||||||
|
"six", '6',
|
||||||
|
"seven", '7',
|
||||||
|
"eight", '8',
|
||||||
|
"nine", '9',
|
||||||
|
"colon", ':',
|
||||||
|
"semicolon", ';',
|
||||||
|
"less-than-sign", '<',
|
||||||
|
"equals-sign", '=',
|
||||||
|
"greater-than-sign", '>',
|
||||||
|
"question-mark", '?',
|
||||||
|
"commercial-at", '@',
|
||||||
|
"left-square-bracket", '[',
|
||||||
|
"backslash", '\\',
|
||||||
|
"reverse-solidus", '\\',
|
||||||
|
"right-square-bracket", ']',
|
||||||
|
"circumflex", '^',
|
||||||
|
"circumflex-accent", '^',
|
||||||
|
"underscore", '_',
|
||||||
|
"low-line", '_',
|
||||||
|
"grave-accent", '`',
|
||||||
|
"left-brace", '{',
|
||||||
|
"left-curly-bracket", '{',
|
||||||
|
"vertical-line", '|',
|
||||||
|
"right-brace", '}',
|
||||||
|
"right-curly-bracket", '}',
|
||||||
|
"tilde", '~',
|
||||||
|
"DEL", '\177',
|
||||||
|
NULL, 0,
|
||||||
|
};
|
1091
lib/libc/regex/engine.c
Normal file
1091
lib/libc/regex/engine.c
Normal file
File diff suppressed because it is too large
Load Diff
1698
lib/libc/regex/regcomp.c
Normal file
1698
lib/libc/regex/regcomp.c
Normal file
File diff suppressed because it is too large
Load Diff
180
lib/libc/regex/regerror.c
Normal file
180
lib/libc/regex/regerror.c
Normal file
@ -0,0 +1,180 @@
|
|||||||
|
/*-
|
||||||
|
* Copyright (c) 1992, 1993, 1994 Henry Spencer.
|
||||||
|
* Copyright (c) 1992, 1993, 1994
|
||||||
|
* The Regents of the University of California. All rights reserved.
|
||||||
|
*
|
||||||
|
* This code is derived from software contributed to Berkeley by
|
||||||
|
* Henry Spencer.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the University of
|
||||||
|
* California, Berkeley and its contributors.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* @(#)regerror.c 8.4 (Berkeley) 3/20/94
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined(LIBC_SCCS) && !defined(lint)
|
||||||
|
static char sccsid[] = "@(#)regerror.c 8.4 (Berkeley) 3/20/94";
|
||||||
|
#endif /* LIBC_SCCS and not lint */
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <regex.h>
|
||||||
|
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
|
/* ========= begin header generated by ./mkh ========= */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* === regerror.c === */
|
||||||
|
static char *regatoi __P((const regex_t *preg, char *localbuf));
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/* ========= end header generated by ./mkh ========= */
|
||||||
|
/*
|
||||||
|
= #define REG_NOMATCH 1
|
||||||
|
= #define REG_BADPAT 2
|
||||||
|
= #define REG_ECOLLATE 3
|
||||||
|
= #define REG_ECTYPE 4
|
||||||
|
= #define REG_EESCAPE 5
|
||||||
|
= #define REG_ESUBREG 6
|
||||||
|
= #define REG_EBRACK 7
|
||||||
|
= #define REG_EPAREN 8
|
||||||
|
= #define REG_EBRACE 9
|
||||||
|
= #define REG_BADBR 10
|
||||||
|
= #define REG_ERANGE 11
|
||||||
|
= #define REG_ESPACE 12
|
||||||
|
= #define REG_BADRPT 13
|
||||||
|
= #define REG_EMPTY 14
|
||||||
|
= #define REG_ASSERT 15
|
||||||
|
= #define REG_INVARG 16
|
||||||
|
= #define REG_ATOI 255 // convert name to number (!)
|
||||||
|
= #define REG_ITOA 0400 // convert number to name (!)
|
||||||
|
*/
|
||||||
|
static struct rerr {
|
||||||
|
int code;
|
||||||
|
char *name;
|
||||||
|
char *explain;
|
||||||
|
} rerrs[] = {
|
||||||
|
REG_NOMATCH, "REG_NOMATCH", "regexec() failed to match",
|
||||||
|
REG_BADPAT, "REG_BADPAT", "invalid regular expression",
|
||||||
|
REG_ECOLLATE, "REG_ECOLLATE", "invalid collating element",
|
||||||
|
REG_ECTYPE, "REG_ECTYPE", "invalid character class",
|
||||||
|
REG_EESCAPE, "REG_EESCAPE", "trailing backslash (\\)",
|
||||||
|
REG_ESUBREG, "REG_ESUBREG", "invalid backreference number",
|
||||||
|
REG_EBRACK, "REG_EBRACK", "brackets ([ ]) not balanced",
|
||||||
|
REG_EPAREN, "REG_EPAREN", "parentheses not balanced",
|
||||||
|
REG_EBRACE, "REG_EBRACE", "braces not balanced",
|
||||||
|
REG_BADBR, "REG_BADBR", "invalid repetition count(s)",
|
||||||
|
REG_ERANGE, "REG_ERANGE", "invalid character range",
|
||||||
|
REG_ESPACE, "REG_ESPACE", "out of memory",
|
||||||
|
REG_BADRPT, "REG_BADRPT", "repetition-operator operand invalid",
|
||||||
|
REG_EMPTY, "REG_EMPTY", "empty (sub)expression",
|
||||||
|
REG_ASSERT, "REG_ASSERT", "\"can't happen\" -- you found a bug",
|
||||||
|
REG_INVARG, "REG_INVARG", "invalid argument to regex routine",
|
||||||
|
0, "", "*** unknown regexp error code ***",
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
- regerror - the interface to error numbers
|
||||||
|
= extern size_t regerror(int, const regex_t *, char *, size_t);
|
||||||
|
*/
|
||||||
|
/* ARGSUSED */
|
||||||
|
size_t
|
||||||
|
regerror(errcode, preg, errbuf, errbuf_size)
|
||||||
|
int errcode;
|
||||||
|
const regex_t *preg;
|
||||||
|
char *errbuf;
|
||||||
|
size_t errbuf_size;
|
||||||
|
{
|
||||||
|
register struct rerr *r;
|
||||||
|
register size_t len;
|
||||||
|
register int target = errcode &~ REG_ITOA;
|
||||||
|
register char *s;
|
||||||
|
char convbuf[50];
|
||||||
|
|
||||||
|
if (errcode == REG_ATOI)
|
||||||
|
s = regatoi(preg, convbuf);
|
||||||
|
else {
|
||||||
|
for (r = rerrs; r->code != 0; r++)
|
||||||
|
if (r->code == target)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (errcode®_ITOA) {
|
||||||
|
if (r->code != 0)
|
||||||
|
(void) strcpy(convbuf, r->name);
|
||||||
|
else
|
||||||
|
sprintf(convbuf, "REG_0x%x", target);
|
||||||
|
assert(strlen(convbuf) < sizeof(convbuf));
|
||||||
|
s = convbuf;
|
||||||
|
} else
|
||||||
|
s = r->explain;
|
||||||
|
}
|
||||||
|
|
||||||
|
len = strlen(s) + 1;
|
||||||
|
if (errbuf_size > 0) {
|
||||||
|
if (errbuf_size > len)
|
||||||
|
(void) strcpy(errbuf, s);
|
||||||
|
else {
|
||||||
|
(void) strncpy(errbuf, s, errbuf_size-1);
|
||||||
|
errbuf[errbuf_size-1] = '\0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return(len);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
- regatoi - internal routine to implement REG_ATOI
|
||||||
|
== static char *regatoi(const regex_t *preg, char *localbuf);
|
||||||
|
*/
|
||||||
|
static char *
|
||||||
|
regatoi(preg, localbuf)
|
||||||
|
const regex_t *preg;
|
||||||
|
char *localbuf;
|
||||||
|
{
|
||||||
|
register struct rerr *r;
|
||||||
|
register size_t siz;
|
||||||
|
register char *p;
|
||||||
|
|
||||||
|
for (r = rerrs; r->code != 0; r++)
|
||||||
|
if (strcmp(r->name, preg->re_endp) == 0)
|
||||||
|
break;
|
||||||
|
if (r->code == 0)
|
||||||
|
return("0");
|
||||||
|
|
||||||
|
sprintf(localbuf, "%d", r->code);
|
||||||
|
return(localbuf);
|
||||||
|
}
|
173
lib/libc/regex/regex2.h
Normal file
173
lib/libc/regex/regex2.h
Normal file
@ -0,0 +1,173 @@
|
|||||||
|
/*-
|
||||||
|
* Copyright (c) 1992, 1993, 1994 Henry Spencer.
|
||||||
|
* Copyright (c) 1992, 1993, 1994
|
||||||
|
* The Regents of the University of California. All rights reserved.
|
||||||
|
*
|
||||||
|
* This code is derived from software contributed to Berkeley by
|
||||||
|
* Henry Spencer.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the University of
|
||||||
|
* California, Berkeley and its contributors.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* @(#)regex2.h 8.4 (Berkeley) 3/20/94
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* First, the stuff that ends up in the outside-world include file
|
||||||
|
= typedef off_t regoff_t;
|
||||||
|
= typedef struct {
|
||||||
|
= int re_magic;
|
||||||
|
= size_t re_nsub; // number of parenthesized subexpressions
|
||||||
|
= const char *re_endp; // end pointer for REG_PEND
|
||||||
|
= struct re_guts *re_g; // none of your business :-)
|
||||||
|
= } regex_t;
|
||||||
|
= typedef struct {
|
||||||
|
= regoff_t rm_so; // start of match
|
||||||
|
= regoff_t rm_eo; // end of match
|
||||||
|
= } regmatch_t;
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* internals of regex_t
|
||||||
|
*/
|
||||||
|
#define MAGIC1 ((('r'^0200)<<8) | 'e')
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The internal representation is a *strip*, a sequence of
|
||||||
|
* operators ending with an endmarker. (Some terminology etc. is a
|
||||||
|
* historical relic of earlier versions which used multiple strips.)
|
||||||
|
* Certain oddities in the representation are there to permit running
|
||||||
|
* the machinery backwards; in particular, any deviation from sequential
|
||||||
|
* flow must be marked at both its source and its destination. Some
|
||||||
|
* fine points:
|
||||||
|
*
|
||||||
|
* - OPLUS_ and O_PLUS are *inside* the loop they create.
|
||||||
|
* - OQUEST_ and O_QUEST are *outside* the bypass they create.
|
||||||
|
* - OCH_ and O_CH are *outside* the multi-way branch they create, while
|
||||||
|
* OOR1 and OOR2 are respectively the end and the beginning of one of
|
||||||
|
* the branches. Note that there is an implicit OOR2 following OCH_
|
||||||
|
* and an implicit OOR1 preceding O_CH.
|
||||||
|
*
|
||||||
|
* In state representations, an operator's bit is on to signify a state
|
||||||
|
* immediately *preceding* "execution" of that operator.
|
||||||
|
*/
|
||||||
|
typedef unsigned long sop; /* strip operator */
|
||||||
|
typedef long sopno;
|
||||||
|
#define OPRMASK 0xf8000000
|
||||||
|
#define OPDMASK 0x07ffffff
|
||||||
|
#define OPSHIFT ((unsigned)27)
|
||||||
|
#define OP(n) ((n)&OPRMASK)
|
||||||
|
#define OPND(n) ((n)&OPDMASK)
|
||||||
|
#define SOP(op, opnd) ((op)|(opnd))
|
||||||
|
/* operators meaning operand */
|
||||||
|
/* (back, fwd are offsets) */
|
||||||
|
#define OEND (1<<OPSHIFT) /* endmarker - */
|
||||||
|
#define OCHAR (2<<OPSHIFT) /* character unsigned char */
|
||||||
|
#define OBOL (3<<OPSHIFT) /* left anchor - */
|
||||||
|
#define OEOL (4<<OPSHIFT) /* right anchor - */
|
||||||
|
#define OANY (5<<OPSHIFT) /* . - */
|
||||||
|
#define OANYOF (6<<OPSHIFT) /* [...] set number */
|
||||||
|
#define OBACK_ (7<<OPSHIFT) /* begin \d paren number */
|
||||||
|
#define O_BACK (8<<OPSHIFT) /* end \d paren number */
|
||||||
|
#define OPLUS_ (9<<OPSHIFT) /* + prefix fwd to suffix */
|
||||||
|
#define O_PLUS (10<<OPSHIFT) /* + suffix back to prefix */
|
||||||
|
#define OQUEST_ (11<<OPSHIFT) /* ? prefix fwd to suffix */
|
||||||
|
#define O_QUEST (12<<OPSHIFT) /* ? suffix back to prefix */
|
||||||
|
#define OLPAREN (13<<OPSHIFT) /* ( fwd to ) */
|
||||||
|
#define ORPAREN (14<<OPSHIFT) /* ) back to ( */
|
||||||
|
#define OCH_ (15<<OPSHIFT) /* begin choice fwd to OOR2 */
|
||||||
|
#define OOR1 (16<<OPSHIFT) /* | pt. 1 back to OOR1 or OCH_ */
|
||||||
|
#define OOR2 (17<<OPSHIFT) /* | pt. 2 fwd to OOR2 or O_CH */
|
||||||
|
#define O_CH (18<<OPSHIFT) /* end choice back to OOR1 */
|
||||||
|
#define OBOW (19<<OPSHIFT) /* begin word - */
|
||||||
|
#define OEOW (20<<OPSHIFT) /* end word - */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Structure for [] character-set representation. Character sets are
|
||||||
|
* done as bit vectors, grouped 8 to a byte vector for compactness.
|
||||||
|
* The individual set therefore has both a pointer to the byte vector
|
||||||
|
* and a mask to pick out the relevant bit of each byte. A hash code
|
||||||
|
* simplifies testing whether two sets could be identical.
|
||||||
|
*
|
||||||
|
* This will get trickier for multicharacter collating elements. As
|
||||||
|
* preliminary hooks for dealing with such things, we also carry along
|
||||||
|
* a string of multi-character elements, and decide the size of the
|
||||||
|
* vectors at run time.
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
uch *ptr; /* -> uch [csetsize] */
|
||||||
|
uch mask; /* bit within array */
|
||||||
|
uch hash; /* hash code */
|
||||||
|
size_t smultis;
|
||||||
|
char *multis; /* -> char[smulti] ab\0cd\0ef\0\0 */
|
||||||
|
} cset;
|
||||||
|
/* note that CHadd and CHsub are unsafe, and CHIN doesn't yield 0/1 */
|
||||||
|
#define CHadd(cs, c) ((cs)->ptr[(uch)(c)] |= (cs)->mask, (cs)->hash += (c))
|
||||||
|
#define CHsub(cs, c) ((cs)->ptr[(uch)(c)] &= ~(cs)->mask, (cs)->hash -= (c))
|
||||||
|
#define CHIN(cs, c) ((cs)->ptr[(uch)(c)] & (cs)->mask)
|
||||||
|
#define MCadd(p, cs, cp) mcadd(p, cs, cp) /* regcomp() internal fns */
|
||||||
|
#define MCsub(p, cs, cp) mcsub(p, cs, cp)
|
||||||
|
#define MCin(p, cs, cp) mcin(p, cs, cp)
|
||||||
|
|
||||||
|
/* stuff for character categories */
|
||||||
|
typedef unsigned char cat_t;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* main compiled-expression structure
|
||||||
|
*/
|
||||||
|
struct re_guts {
|
||||||
|
int magic;
|
||||||
|
# define MAGIC2 ((('R'^0200)<<8)|'E')
|
||||||
|
sop *strip; /* malloced area for strip */
|
||||||
|
int csetsize; /* number of bits in a cset vector */
|
||||||
|
int ncsets; /* number of csets in use */
|
||||||
|
cset *sets; /* -> cset [ncsets] */
|
||||||
|
uch *setbits; /* -> uch[csetsize][ncsets/CHAR_BIT] */
|
||||||
|
int cflags; /* copy of regcomp() cflags argument */
|
||||||
|
sopno nstates; /* = number of sops */
|
||||||
|
sopno firststate; /* the initial OEND (normally 0) */
|
||||||
|
sopno laststate; /* the final OEND */
|
||||||
|
int iflags; /* internal flags */
|
||||||
|
# define USEBOL 01 /* used ^ */
|
||||||
|
# define USEEOL 02 /* used $ */
|
||||||
|
# define BAD 04 /* something wrong */
|
||||||
|
int nbol; /* number of ^ used */
|
||||||
|
int neol; /* number of $ used */
|
||||||
|
int ncategories; /* how many character categories */
|
||||||
|
cat_t *categories; /* ->catspace[-CHAR_MIN] */
|
||||||
|
char *must; /* match must contain this string */
|
||||||
|
int mlen; /* length of must */
|
||||||
|
size_t nsub; /* copy of re_nsub */
|
||||||
|
int backrefs; /* does it use back references? */
|
||||||
|
sopno nplus; /* how deep does it nest +s? */
|
||||||
|
/* catspace must be last */
|
||||||
|
cat_t catspace[1]; /* actually [NC] */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* misc utilities */
|
||||||
|
#define OUT (CHAR_MAX+1) /* a non-character value */
|
||||||
|
#define ISWORD(c) (isalnum(c) || (c) == '_')
|
181
lib/libc/regex/regexec.c
Normal file
181
lib/libc/regex/regexec.c
Normal file
@ -0,0 +1,181 @@
|
|||||||
|
/*-
|
||||||
|
* Copyright (c) 1992, 1993, 1994 Henry Spencer.
|
||||||
|
* Copyright (c) 1992, 1993, 1994
|
||||||
|
* The Regents of the University of California. All rights reserved.
|
||||||
|
*
|
||||||
|
* This code is derived from software contributed to Berkeley by
|
||||||
|
* Henry Spencer.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the University of
|
||||||
|
* California, Berkeley and its contributors.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* @(#)regexec.c 8.3 (Berkeley) 3/20/94
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined(LIBC_SCCS) && !defined(lint)
|
||||||
|
static char sccsid[] = "@(#)regexec.c 8.3 (Berkeley) 3/20/94";
|
||||||
|
#endif /* LIBC_SCCS and not lint */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* the outer shell of regexec()
|
||||||
|
*
|
||||||
|
* This file includes engine.c *twice*, after muchos fiddling with the
|
||||||
|
* macros that code uses. This lets the same code operate on two different
|
||||||
|
* representations for state sets.
|
||||||
|
*/
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <regex.h>
|
||||||
|
|
||||||
|
#include "utils.h"
|
||||||
|
#include "regex2.h"
|
||||||
|
|
||||||
|
static int nope = 0; /* for use in asserts; shuts lint up */
|
||||||
|
|
||||||
|
/* macros for manipulating states, small version */
|
||||||
|
#define states long
|
||||||
|
#define states1 states /* for later use in regexec() decision */
|
||||||
|
#define CLEAR(v) ((v) = 0)
|
||||||
|
#define SET0(v, n) ((v) &= ~(1 << (n)))
|
||||||
|
#define SET1(v, n) ((v) |= 1 << (n))
|
||||||
|
#define ISSET(v, n) ((v) & (1 << (n)))
|
||||||
|
#define ASSIGN(d, s) ((d) = (s))
|
||||||
|
#define EQ(a, b) ((a) == (b))
|
||||||
|
#define STATEVARS int dummy /* dummy version */
|
||||||
|
#define STATESETUP(m, n) /* nothing */
|
||||||
|
#define STATETEARDOWN(m) /* nothing */
|
||||||
|
#define SETUP(v) ((v) = 0)
|
||||||
|
#define onestate int
|
||||||
|
#define INIT(o, n) ((o) = (unsigned)1 << (n))
|
||||||
|
#define INC(o) ((o) <<= 1)
|
||||||
|
#define ISSTATEIN(v, o) ((v) & (o))
|
||||||
|
/* some abbreviations; note that some of these know variable names! */
|
||||||
|
/* do "if I'm here, I can also be there" etc without branches */
|
||||||
|
#define FWD(dst, src, n) ((dst) |= ((unsigned)(src)&(here)) << (n))
|
||||||
|
#define BACK(dst, src, n) ((dst) |= ((unsigned)(src)&(here)) >> (n))
|
||||||
|
#define ISSETBACK(v, n) ((v) & ((unsigned)here >> (n)))
|
||||||
|
/* function names */
|
||||||
|
#define SNAMES /* engine.c looks after details */
|
||||||
|
|
||||||
|
#include "engine.c"
|
||||||
|
|
||||||
|
/* now undo things */
|
||||||
|
#undef states
|
||||||
|
#undef CLEAR
|
||||||
|
#undef SET0
|
||||||
|
#undef SET1
|
||||||
|
#undef ISSET
|
||||||
|
#undef ASSIGN
|
||||||
|
#undef EQ
|
||||||
|
#undef STATEVARS
|
||||||
|
#undef STATESETUP
|
||||||
|
#undef STATETEARDOWN
|
||||||
|
#undef SETUP
|
||||||
|
#undef onestate
|
||||||
|
#undef INIT
|
||||||
|
#undef INC
|
||||||
|
#undef ISSTATEIN
|
||||||
|
#undef FWD
|
||||||
|
#undef BACK
|
||||||
|
#undef ISSETBACK
|
||||||
|
#undef SNAMES
|
||||||
|
|
||||||
|
/* macros for manipulating states, large version */
|
||||||
|
#define states char *
|
||||||
|
#define CLEAR(v) memset(v, 0, m->g->nstates)
|
||||||
|
#define SET0(v, n) ((v)[n] = 0)
|
||||||
|
#define SET1(v, n) ((v)[n] = 1)
|
||||||
|
#define ISSET(v, n) ((v)[n])
|
||||||
|
#define ASSIGN(d, s) memcpy(d, s, m->g->nstates)
|
||||||
|
#define EQ(a, b) (memcmp(a, b, m->g->nstates) == 0)
|
||||||
|
#define STATEVARS int vn; char *space
|
||||||
|
#define STATESETUP(m, nv) { (m)->space = malloc((nv)*(m)->g->nstates); \
|
||||||
|
if ((m)->space == NULL) return(REG_ESPACE); \
|
||||||
|
(m)->vn = 0; }
|
||||||
|
#define STATETEARDOWN(m) { free((m)->space); }
|
||||||
|
#define SETUP(v) ((v) = &m->space[m->vn++ * m->g->nstates])
|
||||||
|
#define onestate int
|
||||||
|
#define INIT(o, n) ((o) = (n))
|
||||||
|
#define INC(o) ((o)++)
|
||||||
|
#define ISSTATEIN(v, o) ((v)[o])
|
||||||
|
/* some abbreviations; note that some of these know variable names! */
|
||||||
|
/* do "if I'm here, I can also be there" etc without branches */
|
||||||
|
#define FWD(dst, src, n) ((dst)[here+(n)] |= (src)[here])
|
||||||
|
#define BACK(dst, src, n) ((dst)[here-(n)] |= (src)[here])
|
||||||
|
#define ISSETBACK(v, n) ((v)[here - (n)])
|
||||||
|
/* function names */
|
||||||
|
#define LNAMES /* flag */
|
||||||
|
|
||||||
|
#include "engine.c"
|
||||||
|
|
||||||
|
/*
|
||||||
|
- regexec - interface for matching
|
||||||
|
= extern int regexec(const regex_t *, const char *, size_t, \
|
||||||
|
= regmatch_t [], int);
|
||||||
|
= #define REG_NOTBOL 00001
|
||||||
|
= #define REG_NOTEOL 00002
|
||||||
|
= #define REG_STARTEND 00004
|
||||||
|
= #define REG_TRACE 00400 // tracing of execution
|
||||||
|
= #define REG_LARGE 01000 // force large representation
|
||||||
|
= #define REG_BACKR 02000 // force use of backref code
|
||||||
|
*
|
||||||
|
* We put this here so we can exploit knowledge of the state representation
|
||||||
|
* when choosing which matcher to call. Also, by this point the matchers
|
||||||
|
* have been prototyped.
|
||||||
|
*/
|
||||||
|
int /* 0 success, REG_NOMATCH failure */
|
||||||
|
regexec(preg, string, nmatch, pmatch, eflags)
|
||||||
|
const regex_t *preg;
|
||||||
|
const char *string;
|
||||||
|
size_t nmatch;
|
||||||
|
regmatch_t pmatch[];
|
||||||
|
int eflags;
|
||||||
|
{
|
||||||
|
register struct re_guts *g = preg->re_g;
|
||||||
|
#ifdef REDEBUG
|
||||||
|
# define GOODFLAGS(f) (f)
|
||||||
|
#else
|
||||||
|
# define GOODFLAGS(f) ((f)&(REG_NOTBOL|REG_NOTEOL|REG_STARTEND))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (preg->re_magic != MAGIC1 || g->magic != MAGIC2)
|
||||||
|
return(REG_BADPAT);
|
||||||
|
assert(!(g->iflags&BAD));
|
||||||
|
if (g->iflags&BAD) /* backstop for no-debug case */
|
||||||
|
return(REG_BADPAT);
|
||||||
|
eflags = GOODFLAGS(eflags);
|
||||||
|
|
||||||
|
if (g->nstates <= CHAR_BIT*sizeof(states1) && !(eflags®_LARGE))
|
||||||
|
return(smatcher(g, (char *)string, nmatch, pmatch, eflags));
|
||||||
|
else
|
||||||
|
return(lmatcher(g, (char *)string, nmatch, pmatch, eflags));
|
||||||
|
}
|
80
lib/libc/regex/regfree.c
Normal file
80
lib/libc/regex/regfree.c
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
/*-
|
||||||
|
* Copyright (c) 1992, 1993, 1994 Henry Spencer.
|
||||||
|
* Copyright (c) 1992, 1993, 1994
|
||||||
|
* The Regents of the University of California. All rights reserved.
|
||||||
|
*
|
||||||
|
* This code is derived from software contributed to Berkeley by
|
||||||
|
* Henry Spencer.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the University of
|
||||||
|
* California, Berkeley and its contributors.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* @(#)regfree.c 8.3 (Berkeley) 3/20/94
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined(LIBC_SCCS) && !defined(lint)
|
||||||
|
static char sccsid[] = "@(#)regfree.c 8.3 (Berkeley) 3/20/94";
|
||||||
|
#endif /* LIBC_SCCS and not lint */
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <regex.h>
|
||||||
|
|
||||||
|
#include "utils.h"
|
||||||
|
#include "regex2.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
- regfree - free everything
|
||||||
|
= extern void regfree(regex_t *);
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
regfree(preg)
|
||||||
|
regex_t *preg;
|
||||||
|
{
|
||||||
|
register struct re_guts *g;
|
||||||
|
|
||||||
|
if (preg->re_magic != MAGIC1) /* oops */
|
||||||
|
return; /* nice to complain, but hard */
|
||||||
|
|
||||||
|
g = preg->re_g;
|
||||||
|
if (g == NULL || g->magic != MAGIC2) /* oops again */
|
||||||
|
return;
|
||||||
|
preg->re_magic = 0; /* mark it invalid */
|
||||||
|
g->magic = 0; /* mark it invalid */
|
||||||
|
|
||||||
|
if (g->strip != NULL)
|
||||||
|
free((char *)g->strip);
|
||||||
|
if (g->sets != NULL)
|
||||||
|
free((char *)g->sets);
|
||||||
|
if (g->setbits != NULL)
|
||||||
|
free((char *)g->setbits);
|
||||||
|
if (g->must != NULL)
|
||||||
|
free(g->must);
|
||||||
|
free((char *)g);
|
||||||
|
}
|
57
lib/libc/regex/utils.h
Normal file
57
lib/libc/regex/utils.h
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
/*-
|
||||||
|
* Copyright (c) 1992, 1993, 1994 Henry Spencer.
|
||||||
|
* Copyright (c) 1992, 1993, 1994
|
||||||
|
* The Regents of the University of California. All rights reserved.
|
||||||
|
*
|
||||||
|
* This code is derived from software contributed to Berkeley by
|
||||||
|
* Henry Spencer.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the University of
|
||||||
|
* California, Berkeley and its contributors.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* @(#)utils.h 8.3 (Berkeley) 3/20/94
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* utility definitions */
|
||||||
|
#define DUPMAX _POSIX2_RE_DUP_MAX /* xxx is this right? */
|
||||||
|
#define INFINITY (DUPMAX + 1)
|
||||||
|
#define NC (CHAR_MAX - CHAR_MIN + 1)
|
||||||
|
typedef unsigned char uch;
|
||||||
|
|
||||||
|
/* switch off assertions (if not already off) if no REDEBUG */
|
||||||
|
#ifndef REDEBUG
|
||||||
|
#ifndef NDEBUG
|
||||||
|
#define NDEBUG /* no assertions please */
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
/* for old systems with bcopy() but no memmove() */
|
||||||
|
#ifdef USEBCOPY
|
||||||
|
#define memmove(d, s, c) bcopy(s, d, c)
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user