usr
/
include
/
Go to Home Directory
+
Upload
Create File
root@0UT1S:~$
Execute
By Order of Mr.0UT1S
[DIR] ..
N/A
[DIR] GL
N/A
[DIR] X11
N/A
[DIR] apache2
N/A
[DIR] arpa
N/A
[DIR] asm
N/A
[DIR] asm-generic
N/A
[DIR] bind9
N/A
[DIR] bits
N/A
[DIR] bsock
N/A
[DIR] c++
N/A
[DIR] criu
N/A
[DIR] curl
N/A
[DIR] drm
N/A
[DIR] e2p
N/A
[DIR] et
N/A
[DIR] event2
N/A
[DIR] ext2fs
N/A
[DIR] finclude
N/A
[DIR] fontconfig
N/A
[DIR] freetype2
N/A
[DIR] fstrm
N/A
[DIR] gdb
N/A
[DIR] gdbm
N/A
[DIR] gnu
N/A
[DIR] google
N/A
[DIR] gssapi
N/A
[DIR] gssrpc
N/A
[DIR] json-c
N/A
[DIR] kadm5
N/A
[DIR] krb5
N/A
[DIR] libdb
N/A
[DIR] libexslt
N/A
[DIR] libltdl
N/A
[DIR] libpng16
N/A
[DIR] libxml2
N/A
[DIR] libxslt
N/A
[DIR] linux
N/A
[DIR] lua-5.1
N/A
[DIR] lzma
N/A
[DIR] misc
N/A
[DIR] mtd
N/A
[DIR] mysql
N/A
[DIR] ncurses
N/A
[DIR] ncursesw
N/A
[DIR] net
N/A
[DIR] netash
N/A
[DIR] netatalk
N/A
[DIR] netax25
N/A
[DIR] neteconet
N/A
[DIR] netinet
N/A
[DIR] netipx
N/A
[DIR] netiucv
N/A
[DIR] netpacket
N/A
[DIR] netrom
N/A
[DIR] netrose
N/A
[DIR] nfs
N/A
[DIR] openssl
N/A
[DIR] perf
N/A
[DIR] protobuf-c
N/A
[DIR] protocols
N/A
[DIR] python2.7
N/A
[DIR] python3.6m
N/A
[DIR] python3.8
N/A
[DIR] rdma
N/A
[DIR] rpc
N/A
[DIR] sasl
N/A
[DIR] scsi
N/A
[DIR] security
N/A
[DIR] selinux
N/A
[DIR] sepol
N/A
[DIR] sound
N/A
[DIR] sys
N/A
[DIR] uuid
N/A
[DIR] video
N/A
[DIR] webp
N/A
[DIR] xcb
N/A
[DIR] xen
N/A
FlexLexer.h
6.73 KB
Rename
Delete
a.out.h
4.25 KB
Rename
Delete
aio.h
7.28 KB
Rename
Delete
aliases.h
1.98 KB
Rename
Delete
alloca.h
1.17 KB
Rename
Delete
ar.h
1.69 KB
Rename
Delete
argp.h
24.82 KB
Rename
Delete
argz.h
5.91 KB
Rename
Delete
assert.h
4.45 KB
Rename
Delete
autosprintf.h
2.33 KB
Rename
Delete
byteswap.h
1.37 KB
Rename
Delete
bzlib.h
6.10 KB
Rename
Delete
com_err.h
2.07 KB
Rename
Delete
complex.h
7.00 KB
Rename
Delete
cpio.h
2.21 KB
Rename
Delete
cpuidle.h
844 bytes
Rename
Delete
crypt.h
8.90 KB
Rename
Delete
ctype.h
10.71 KB
Rename
Delete
curses.h
97.29 KB
Rename
Delete
cursesapp.h
6.62 KB
Rename
Delete
cursesf.h
27.20 KB
Rename
Delete
cursesm.h
19.22 KB
Rename
Delete
cursesp.h
8.40 KB
Rename
Delete
cursesw.h
48.55 KB
Rename
Delete
cursslk.h
7.13 KB
Rename
Delete
db.h
120.22 KB
Rename
Delete
db_185.h
5.84 KB
Rename
Delete
dbm.h
1.38 KB
Rename
Delete
dirent.h
12.19 KB
Rename
Delete
dlfcn.h
7.07 KB
Rename
Delete
elf.h
170.73 KB
Rename
Delete
endian.h
3.11 KB
Rename
Delete
entities.h
4.81 KB
Rename
Delete
envz.h
2.80 KB
Rename
Delete
err.h
2.16 KB
Rename
Delete
errno.h
1.64 KB
Rename
Delete
error.h
1.99 KB
Rename
Delete
eti.h
2.82 KB
Rename
Delete
etip.h
9.47 KB
Rename
Delete
evdns.h
1.97 KB
Rename
Delete
event.h
2.68 KB
Rename
Delete
evhttp.h
1.99 KB
Rename
Delete
evrpc.h
1.97 KB
Rename
Delete
evutil.h
1.74 KB
Rename
Delete
execinfo.h
1.49 KB
Rename
Delete
expat.h
42.66 KB
Rename
Delete
expat_config.h
3.43 KB
Rename
Delete
expat_external.h
5.40 KB
Rename
Delete
fcntl.h
10.70 KB
Rename
Delete
features.h
15.69 KB
Rename
Delete
fenv.h
5.72 KB
Rename
Delete
fmtmsg.h
3.16 KB
Rename
Delete
fnmatch.h
2.24 KB
Rename
Delete
form.h
18.17 KB
Rename
Delete
fpu_control.h
3.50 KB
Rename
Delete
fstab.h
3.04 KB
Rename
Delete
fstrm.h
12.71 KB
Rename
Delete
fts.h
8.18 KB
Rename
Delete
ftw.h
5.13 KB
Rename
Delete
gconv.h
4.31 KB
Rename
Delete
gcrypt.h
68.71 KB
Rename
Delete
gd.h
56.42 KB
Rename
Delete
gd_color_map.h
478 bytes
Rename
Delete
gd_errors.h
1.47 KB
Rename
Delete
gd_io.h
3.05 KB
Rename
Delete
gdbm.h
10.10 KB
Rename
Delete
gdcache.h
2.83 KB
Rename
Delete
gdfontg.h
553 bytes
Rename
Delete
gdfontl.h
551 bytes
Rename
Delete
gdfontmb.h
519 bytes
Rename
Delete
gdfonts.h
515 bytes
Rename
Delete
gdfontt.h
546 bytes
Rename
Delete
gdfx.h
497 bytes
Rename
Delete
gdpp.h
50.94 KB
Rename
Delete
getopt.h
1.43 KB
Rename
Delete
gettext-po.h
15.17 KB
Rename
Delete
glob.h
6.46 KB
Rename
Delete
gnu-versions.h
2.29 KB
Rename
Delete
gnumake.h
2.84 KB
Rename
Delete
gpg-error.h
66.29 KB
Rename
Delete
gpgrt.h
66.29 KB
Rename
Delete
grp.h
6.53 KB
Rename
Delete
gshadow.h
4.42 KB
Rename
Delete
gssapi.h
181 bytes
Rename
Delete
iconv.h
1.81 KB
Rename
Delete
idn-free.h
2.41 KB
Rename
Delete
idn-int.h
20 bytes
Rename
Delete
idna.h
3.48 KB
Rename
Delete
ieee754.h
4.79 KB
Rename
Delete
ifaddrs.h
2.77 KB
Rename
Delete
inttypes.h
11.61 KB
Rename
Delete
jconfig-64.h
2.17 KB
Rename
Delete
jconfig.h
246 bytes
Rename
Delete
jerror.h
14.73 KB
Rename
Delete
jmorecfg.h
14.70 KB
Rename
Delete
jpegint.h
15.22 KB
Rename
Delete
jpeglib.h
48.71 KB
Rename
Delete
kdb.h
67.66 KB
Rename
Delete
keyutils.h
7.52 KB
Rename
Delete
krad.h
8.72 KB
Rename
Delete
krb5.h
402 bytes
Rename
Delete
langinfo.h
17.43 KB
Rename
Delete
lastlog.h
126 bytes
Rename
Delete
lber.h
14.95 KB
Rename
Delete
lber_types.h
1.43 KB
Rename
Delete
ldap.h
63.57 KB
Rename
Delete
ldap_cdefs.h
9.24 KB
Rename
Delete
ldap_features.h
1.77 KB
Rename
Delete
ldap_schema.h
9.23 KB
Rename
Delete
ldap_utf8.h
3.39 KB
Rename
Delete
ldif.h
4.58 KB
Rename
Delete
libaio.h
8.73 KB
Rename
Delete
libgen.h
1.35 KB
Rename
Delete
libintl.h
4.47 KB
Rename
Delete
limits.h
5.29 KB
Rename
Delete
link.h
7.05 KB
Rename
Delete
locale.h
7.49 KB
Rename
Delete
ltdl.h
5.58 KB
Rename
Delete
lzma.h
9.59 KB
Rename
Delete
magic.h
5.46 KB
Rename
Delete
malloc.h
5.96 KB
Rename
Delete
math.h
52.07 KB
Rename
Delete
mcheck.h
2.38 KB
Rename
Delete
memory.h
955 bytes
Rename
Delete
menu.h
11.91 KB
Rename
Delete
mntent.h
3.28 KB
Rename
Delete
monetary.h
1.76 KB
Rename
Delete
mqueue.h
3.67 KB
Rename
Delete
nc_tparm.h
4.10 KB
Rename
Delete
ncurses.h
97.29 KB
Rename
Delete
ncurses_dll.h
4.18 KB
Rename
Delete
ndbm.h
2.40 KB
Rename
Delete
netdb.h
27.44 KB
Rename
Delete
nl_types.h
1.71 KB
Rename
Delete
nss.h
1.83 KB
Rename
Delete
obstack.h
20.81 KB
Rename
Delete
panel.h
4.03 KB
Rename
Delete
paths.h
2.91 KB
Rename
Delete
pcre.h
30.97 KB
Rename
Delete
pcre2.h
43.75 KB
Rename
Delete
pcre2posix.h
5.67 KB
Rename
Delete
pcre_scanner.h
6.45 KB
Rename
Delete
pcre_stringpiece.h
6.16 KB
Rename
Delete
pcrecpp.h
25.91 KB
Rename
Delete
pcrecpparg.h
6.62 KB
Rename
Delete
pcreposix.h
5.32 KB
Rename
Delete
png.h
140.77 KB
Rename
Delete
pngconf.h
22.31 KB
Rename
Delete
pnglibconf.h
7.39 KB
Rename
Delete
poll.h
22 bytes
Rename
Delete
pr29.h
2.07 KB
Rename
Delete
printf.h
6.64 KB
Rename
Delete
proc_service.h
3.39 KB
Rename
Delete
profile.h
11.87 KB
Rename
Delete
pthread.h
40.30 KB
Rename
Delete
pty.h
1.53 KB
Rename
Delete
punycode.h
9.16 KB
Rename
Delete
pwd.h
6.01 KB
Rename
Delete
re_comp.h
962 bytes
Rename
Delete
regex.h
24.14 KB
Rename
Delete
regexp.h
1.41 KB
Rename
Delete
resolv.h
11.79 KB
Rename
Delete
sched.h
4.62 KB
Rename
Delete
search.h
5.10 KB
Rename
Delete
semaphore.h
2.34 KB
Rename
Delete
setjmp.h
3.58 KB
Rename
Delete
sgtty.h
1.31 KB
Rename
Delete
shadow.h
5.34 KB
Rename
Delete
signal.h
11.96 KB
Rename
Delete
slapi-plugin.h
37.45 KB
Rename
Delete
spawn.h
6.53 KB
Rename
Delete
stab.h
264 bytes
Rename
Delete
stdc-predef.h
2.24 KB
Rename
Delete
stdint.h
8.27 KB
Rename
Delete
stdio.h
29.46 KB
Rename
Delete
stdio_ext.h
2.73 KB
Rename
Delete
stdlib.h
34.82 KB
Rename
Delete
string.h
17.17 KB
Rename
Delete
stringprep.h
8.03 KB
Rename
Delete
strings.h
4.64 KB
Rename
Delete
syscall.h
25 bytes
Rename
Delete
sysexits.h
5.11 KB
Rename
Delete
syslog.h
24 bytes
Rename
Delete
tar.h
3.70 KB
Rename
Delete
term.h
40.22 KB
Rename
Delete
term_entry.h
8.55 KB
Rename
Delete
termcap.h
3.39 KB
Rename
Delete
termio.h
214 bytes
Rename
Delete
termios.h
3.51 KB
Rename
Delete
tgmath.h
30.75 KB
Rename
Delete
thread_db.h
15.65 KB
Rename
Delete
threads.h
6.50 KB
Rename
Delete
tic.h
13.32 KB
Rename
Delete
tiff.h
35.14 KB
Rename
Delete
tiffconf-64.h
3.35 KB
Rename
Delete
tiffconf.h
250 bytes
Rename
Delete
tiffio.h
22.68 KB
Rename
Delete
tiffio.hxx
1.66 KB
Rename
Delete
tiffvers.h
410 bytes
Rename
Delete
time.h
10.12 KB
Rename
Delete
tld.h
4.54 KB
Rename
Delete
ttyent.h
2.44 KB
Rename
Delete
uchar.h
1.95 KB
Rename
Delete
ucontext.h
1.99 KB
Rename
Delete
ulimit.h
1.55 KB
Rename
Delete
unctrl.h
3.03 KB
Rename
Delete
unistd.h
41.74 KB
Rename
Delete
utime.h
1.47 KB
Rename
Delete
utmp.h
3.15 KB
Rename
Delete
utmpx.h
4.00 KB
Rename
Delete
values.h
1.91 KB
Rename
Delete
verto-module.h
6.48 KB
Rename
Delete
verto.h
18.98 KB
Rename
Delete
wait.h
22 bytes
Rename
Delete
wchar.h
30.38 KB
Rename
Delete
wctype.h
5.42 KB
Rename
Delete
wordexp.h
2.44 KB
Rename
Delete
zconf.h
15.88 KB
Rename
Delete
zlib.h
94.00 KB
Rename
Delete
// Copyright (c) 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS 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 COPYRIGHT // OWNER 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. // // Author: Sanjay Ghemawat // Support for PCRE_XXX modifiers added by Giuseppe Maxia, July 2005 #ifndef _PCRECPP_H #define _PCRECPP_H // C++ interface to the pcre regular-expression library. RE supports // Perl-style regular expressions (with extensions like \d, \w, \s, // ...). // // ----------------------------------------------------------------------- // REGEXP SYNTAX: // // This module is part of the pcre library and hence supports its syntax // for regular expressions. // // The syntax is pretty similar to Perl's. For those not familiar // with Perl's regular expressions, here are some examples of the most // commonly used extensions: // // "hello (\\w+) world" -- \w matches a "word" character // "version (\\d+)" -- \d matches a digit // "hello\\s+world" -- \s matches any whitespace character // "\\b(\\w+)\\b" -- \b matches empty string at a word boundary // "(?i)hello" -- (?i) turns on case-insensitive matching // "/\\*(.*?)\\*/" -- .*? matches . minimum no. of times possible // // ----------------------------------------------------------------------- // MATCHING INTERFACE: // // The "FullMatch" operation checks that supplied text matches a // supplied pattern exactly. // // Example: successful match // pcrecpp::RE re("h.*o"); // re.FullMatch("hello"); // // Example: unsuccessful match (requires full match): // pcrecpp::RE re("e"); // !re.FullMatch("hello"); // // Example: creating a temporary RE object: // pcrecpp::RE("h.*o").FullMatch("hello"); // // You can pass in a "const char*" or a "string" for "text". The // examples below tend to use a const char*. // // You can, as in the different examples above, store the RE object // explicitly in a variable or use a temporary RE object. The // examples below use one mode or the other arbitrarily. Either // could correctly be used for any of these examples. // // ----------------------------------------------------------------------- // MATCHING WITH SUB-STRING EXTRACTION: // // You can supply extra pointer arguments to extract matched subpieces. // // Example: extracts "ruby" into "s" and 1234 into "i" // int i; // string s; // pcrecpp::RE re("(\\w+):(\\d+)"); // re.FullMatch("ruby:1234", &s, &i); // // Example: does not try to extract any extra sub-patterns // re.FullMatch("ruby:1234", &s); // // Example: does not try to extract into NULL // re.FullMatch("ruby:1234", NULL, &i); // // Example: integer overflow causes failure // !re.FullMatch("ruby:1234567891234", NULL, &i); // // Example: fails because there aren't enough sub-patterns: // !pcrecpp::RE("\\w+:\\d+").FullMatch("ruby:1234", &s); // // Example: fails because string cannot be stored in integer // !pcrecpp::RE("(.*)").FullMatch("ruby", &i); // // The provided pointer arguments can be pointers to any scalar numeric // type, or one of // string (matched piece is copied to string) // StringPiece (StringPiece is mutated to point to matched piece) // T (where "bool T::ParseFrom(const char*, int)" exists) // NULL (the corresponding matched sub-pattern is not copied) // // CAVEAT: An optional sub-pattern that does not exist in the matched // string is assigned the empty string. Therefore, the following will // return false (because the empty string is not a valid number): // int number; // pcrecpp::RE::FullMatch("abc", "[a-z]+(\\d+)?", &number); // // ----------------------------------------------------------------------- // DO_MATCH // // The matching interface supports at most 16 arguments per call. // If you need more, consider using the more general interface // pcrecpp::RE::DoMatch(). See pcrecpp.h for the signature for DoMatch. // // ----------------------------------------------------------------------- // PARTIAL MATCHES // // You can use the "PartialMatch" operation when you want the pattern // to match any substring of the text. // // Example: simple search for a string: // pcrecpp::RE("ell").PartialMatch("hello"); // // Example: find first number in a string: // int number; // pcrecpp::RE re("(\\d+)"); // re.PartialMatch("x*100 + 20", &number); // assert(number == 100); // // ----------------------------------------------------------------------- // UTF-8 AND THE MATCHING INTERFACE: // // By default, pattern and text are plain text, one byte per character. // The UTF8 flag, passed to the constructor, causes both pattern // and string to be treated as UTF-8 text, still a byte stream but // potentially multiple bytes per character. In practice, the text // is likelier to be UTF-8 than the pattern, but the match returned // may depend on the UTF8 flag, so always use it when matching // UTF8 text. E.g., "." will match one byte normally but with UTF8 // set may match up to three bytes of a multi-byte character. // // Example: // pcrecpp::RE_Options options; // options.set_utf8(); // pcrecpp::RE re(utf8_pattern, options); // re.FullMatch(utf8_string); // // Example: using the convenience function UTF8(): // pcrecpp::RE re(utf8_pattern, pcrecpp::UTF8()); // re.FullMatch(utf8_string); // // NOTE: The UTF8 option is ignored if pcre was not configured with the // --enable-utf8 flag. // // ----------------------------------------------------------------------- // PASSING MODIFIERS TO THE REGULAR EXPRESSION ENGINE // // PCRE defines some modifiers to change the behavior of the regular // expression engine. // The C++ wrapper defines an auxiliary class, RE_Options, as a vehicle // to pass such modifiers to a RE class. // // Currently, the following modifiers are supported // // modifier description Perl corresponding // // PCRE_CASELESS case insensitive match /i // PCRE_MULTILINE multiple lines match /m // PCRE_DOTALL dot matches newlines /s // PCRE_DOLLAR_ENDONLY $ matches only at end N/A // PCRE_EXTRA strict escape parsing N/A // PCRE_EXTENDED ignore whitespaces /x // PCRE_UTF8 handles UTF8 chars built-in // PCRE_UNGREEDY reverses * and *? N/A // PCRE_NO_AUTO_CAPTURE disables matching parens N/A (*) // // (For a full account on how each modifier works, please check the // PCRE API reference manual). // // (*) Both Perl and PCRE allow non matching parentheses by means of the // "?:" modifier within the pattern itself. e.g. (?:ab|cd) does not // capture, while (ab|cd) does. // // For each modifier, there are two member functions whose name is made // out of the modifier in lowercase, without the "PCRE_" prefix. For // instance, PCRE_CASELESS is handled by // bool caseless(), // which returns true if the modifier is set, and // RE_Options & set_caseless(bool), // which sets or unsets the modifier. // // Moreover, PCRE_EXTRA_MATCH_LIMIT can be accessed through the // set_match_limit() and match_limit() member functions. // Setting match_limit to a non-zero value will limit the executation of // pcre to keep it from doing bad things like blowing the stack or taking // an eternity to return a result. A value of 5000 is good enough to stop // stack blowup in a 2MB thread stack. Setting match_limit to zero will // disable match limiting. Alternately, you can set match_limit_recursion() // which uses PCRE_EXTRA_MATCH_LIMIT_RECURSION to limit how much pcre // recurses. match_limit() caps the number of matches pcre does; // match_limit_recrusion() caps the depth of recursion. // // Normally, to pass one or more modifiers to a RE class, you declare // a RE_Options object, set the appropriate options, and pass this // object to a RE constructor. Example: // // RE_options opt; // opt.set_caseless(true); // // if (RE("HELLO", opt).PartialMatch("hello world")) ... // // RE_options has two constructors. The default constructor takes no // arguments and creates a set of flags that are off by default. // // The optional parameter 'option_flags' is to facilitate transfer // of legacy code from C programs. This lets you do // RE(pattern, RE_Options(PCRE_CASELESS|PCRE_MULTILINE)).PartialMatch(str); // // But new code is better off doing // RE(pattern, // RE_Options().set_caseless(true).set_multiline(true)).PartialMatch(str); // (See below) // // If you are going to pass one of the most used modifiers, there are some // convenience functions that return a RE_Options class with the // appropriate modifier already set: // CASELESS(), UTF8(), MULTILINE(), DOTALL(), EXTENDED() // // If you need to set several options at once, and you don't want to go // through the pains of declaring a RE_Options object and setting several // options, there is a parallel method that give you such ability on the // fly. You can concatenate several set_xxxxx member functions, since each // of them returns a reference to its class object. e.g.: to pass // PCRE_CASELESS, PCRE_EXTENDED, and PCRE_MULTILINE to a RE with one // statement, you may write // // RE(" ^ xyz \\s+ .* blah$", RE_Options() // .set_caseless(true) // .set_extended(true) // .set_multiline(true)).PartialMatch(sometext); // // ----------------------------------------------------------------------- // SCANNING TEXT INCREMENTALLY // // The "Consume" operation may be useful if you want to repeatedly // match regular expressions at the front of a string and skip over // them as they match. This requires use of the "StringPiece" type, // which represents a sub-range of a real string. Like RE, StringPiece // is defined in the pcrecpp namespace. // // Example: read lines of the form "var = value" from a string. // string contents = ...; // Fill string somehow // pcrecpp::StringPiece input(contents); // Wrap in a StringPiece // // string var; // int value; // pcrecpp::RE re("(\\w+) = (\\d+)\n"); // while (re.Consume(&input, &var, &value)) { // ...; // } // // Each successful call to "Consume" will set "var/value", and also // advance "input" so it points past the matched text. // // The "FindAndConsume" operation is similar to "Consume" but does not // anchor your match at the beginning of the string. For example, you // could extract all words from a string by repeatedly calling // pcrecpp::RE("(\\w+)").FindAndConsume(&input, &word) // // ----------------------------------------------------------------------- // PARSING HEX/OCTAL/C-RADIX NUMBERS // // By default, if you pass a pointer to a numeric value, the // corresponding text is interpreted as a base-10 number. You can // instead wrap the pointer with a call to one of the operators Hex(), // Octal(), or CRadix() to interpret the text in another base. The // CRadix operator interprets C-style "0" (base-8) and "0x" (base-16) // prefixes, but defaults to base-10. // // Example: // int a, b, c, d; // pcrecpp::RE re("(.*) (.*) (.*) (.*)"); // re.FullMatch("100 40 0100 0x40", // pcrecpp::Octal(&a), pcrecpp::Hex(&b), // pcrecpp::CRadix(&c), pcrecpp::CRadix(&d)); // will leave 64 in a, b, c, and d. // // ----------------------------------------------------------------------- // REPLACING PARTS OF STRINGS // // You can replace the first match of "pattern" in "str" with // "rewrite". Within "rewrite", backslash-escaped digits (\1 to \9) // can be used to insert text matching corresponding parenthesized // group from the pattern. \0 in "rewrite" refers to the entire // matching text. E.g., // // string s = "yabba dabba doo"; // pcrecpp::RE("b+").Replace("d", &s); // // will leave "s" containing "yada dabba doo". The result is true if // the pattern matches and a replacement occurs, or false otherwise. // // GlobalReplace() is like Replace(), except that it replaces all // occurrences of the pattern in the string with the rewrite. // Replacements are not subject to re-matching. E.g., // // string s = "yabba dabba doo"; // pcrecpp::RE("b+").GlobalReplace("d", &s); // // will leave "s" containing "yada dada doo". It returns the number // of replacements made. // // Extract() is like Replace(), except that if the pattern matches, // "rewrite" is copied into "out" (an additional argument) with // substitutions. The non-matching portions of "text" are ignored. // Returns true iff a match occurred and the extraction happened // successfully. If no match occurs, the string is left unaffected. #include <string> #include <pcre.h> #include <pcrecpparg.h> // defines the Arg class // This isn't technically needed here, but we include it // anyway so folks who include pcrecpp.h don't have to. #include <pcre_stringpiece.h> namespace pcrecpp { #define PCRE_SET_OR_CLEAR(b, o) \ if (b) all_options_ |= (o); else all_options_ &= ~(o); \ return *this #define PCRE_IS_SET(o) \ (all_options_ & o) == o /***** Compiling regular expressions: the RE class *****/ // RE_Options allow you to set options to be passed along to pcre, // along with other options we put on top of pcre. // Only 9 modifiers, plus match_limit and match_limit_recursion, // are supported now. class PCRECPP_EXP_DEFN RE_Options { public: // constructor RE_Options() : match_limit_(0), match_limit_recursion_(0), all_options_(0) {} // alternative constructor. // To facilitate transfer of legacy code from C programs // // This lets you do // RE(pattern, RE_Options(PCRE_CASELESS|PCRE_MULTILINE)).PartialMatch(str); // But new code is better off doing // RE(pattern, // RE_Options().set_caseless(true).set_multiline(true)).PartialMatch(str); RE_Options(int option_flags) : match_limit_(0), match_limit_recursion_(0), all_options_(option_flags) {} // we're fine with the default destructor, copy constructor, etc. // accessors and mutators int match_limit() const { return match_limit_; }; RE_Options &set_match_limit(int limit) { match_limit_ = limit; return *this; } int match_limit_recursion() const { return match_limit_recursion_; }; RE_Options &set_match_limit_recursion(int limit) { match_limit_recursion_ = limit; return *this; } bool caseless() const { return PCRE_IS_SET(PCRE_CASELESS); } RE_Options &set_caseless(bool x) { PCRE_SET_OR_CLEAR(x, PCRE_CASELESS); } bool multiline() const { return PCRE_IS_SET(PCRE_MULTILINE); } RE_Options &set_multiline(bool x) { PCRE_SET_OR_CLEAR(x, PCRE_MULTILINE); } bool dotall() const { return PCRE_IS_SET(PCRE_DOTALL); } RE_Options &set_dotall(bool x) { PCRE_SET_OR_CLEAR(x, PCRE_DOTALL); } bool extended() const { return PCRE_IS_SET(PCRE_EXTENDED); } RE_Options &set_extended(bool x) { PCRE_SET_OR_CLEAR(x, PCRE_EXTENDED); } bool dollar_endonly() const { return PCRE_IS_SET(PCRE_DOLLAR_ENDONLY); } RE_Options &set_dollar_endonly(bool x) { PCRE_SET_OR_CLEAR(x, PCRE_DOLLAR_ENDONLY); } bool extra() const { return PCRE_IS_SET(PCRE_EXTRA); } RE_Options &set_extra(bool x) { PCRE_SET_OR_CLEAR(x, PCRE_EXTRA); } bool ungreedy() const { return PCRE_IS_SET(PCRE_UNGREEDY); } RE_Options &set_ungreedy(bool x) { PCRE_SET_OR_CLEAR(x, PCRE_UNGREEDY); } bool utf8() const { return PCRE_IS_SET(PCRE_UTF8); } RE_Options &set_utf8(bool x) { PCRE_SET_OR_CLEAR(x, PCRE_UTF8); } bool no_auto_capture() const { return PCRE_IS_SET(PCRE_NO_AUTO_CAPTURE); } RE_Options &set_no_auto_capture(bool x) { PCRE_SET_OR_CLEAR(x, PCRE_NO_AUTO_CAPTURE); } RE_Options &set_all_options(int opt) { all_options_ = opt; return *this; } int all_options() const { return all_options_ ; } // TODO: add other pcre flags private: int match_limit_; int match_limit_recursion_; int all_options_; }; // These functions return some common RE_Options static inline RE_Options UTF8() { return RE_Options().set_utf8(true); } static inline RE_Options CASELESS() { return RE_Options().set_caseless(true); } static inline RE_Options MULTILINE() { return RE_Options().set_multiline(true); } static inline RE_Options DOTALL() { return RE_Options().set_dotall(true); } static inline RE_Options EXTENDED() { return RE_Options().set_extended(true); } // Interface for regular expression matching. Also corresponds to a // pre-compiled regular expression. An "RE" object is safe for // concurrent use by multiple threads. class PCRECPP_EXP_DEFN RE { public: // We provide implicit conversions from strings so that users can // pass in a string or a "const char*" wherever an "RE" is expected. RE(const string& pat) { Init(pat, NULL); } RE(const string& pat, const RE_Options& option) { Init(pat, &option); } RE(const char* pat) { Init(pat, NULL); } RE(const char* pat, const RE_Options& option) { Init(pat, &option); } RE(const unsigned char* pat) { Init(reinterpret_cast<const char*>(pat), NULL); } RE(const unsigned char* pat, const RE_Options& option) { Init(reinterpret_cast<const char*>(pat), &option); } // Copy constructor & assignment - note that these are expensive // because they recompile the expression. RE(const RE& re) { Init(re.pattern_, &re.options_); } const RE& operator=(const RE& re) { if (this != &re) { Cleanup(); // This is the code that originally came from Google // Init(re.pattern_.c_str(), &re.options_); // This is the replacement from Ari Pollak Init(re.pattern_, &re.options_); } return *this; } ~RE(); // The string specification for this RE. E.g. // RE re("ab*c?d+"); // re.pattern(); // "ab*c?d+" const string& pattern() const { return pattern_; } // If RE could not be created properly, returns an error string. // Else returns the empty string. const string& error() const { return *error_; } /***** The useful part: the matching interface *****/ // This is provided so one can do pattern.ReplaceAll() just as // easily as ReplaceAll(pattern-text, ....) bool FullMatch(const StringPiece& text, const Arg& ptr1 = no_arg, const Arg& ptr2 = no_arg, const Arg& ptr3 = no_arg, const Arg& ptr4 = no_arg, const Arg& ptr5 = no_arg, const Arg& ptr6 = no_arg, const Arg& ptr7 = no_arg, const Arg& ptr8 = no_arg, const Arg& ptr9 = no_arg, const Arg& ptr10 = no_arg, const Arg& ptr11 = no_arg, const Arg& ptr12 = no_arg, const Arg& ptr13 = no_arg, const Arg& ptr14 = no_arg, const Arg& ptr15 = no_arg, const Arg& ptr16 = no_arg) const; bool PartialMatch(const StringPiece& text, const Arg& ptr1 = no_arg, const Arg& ptr2 = no_arg, const Arg& ptr3 = no_arg, const Arg& ptr4 = no_arg, const Arg& ptr5 = no_arg, const Arg& ptr6 = no_arg, const Arg& ptr7 = no_arg, const Arg& ptr8 = no_arg, const Arg& ptr9 = no_arg, const Arg& ptr10 = no_arg, const Arg& ptr11 = no_arg, const Arg& ptr12 = no_arg, const Arg& ptr13 = no_arg, const Arg& ptr14 = no_arg, const Arg& ptr15 = no_arg, const Arg& ptr16 = no_arg) const; bool Consume(StringPiece* input, const Arg& ptr1 = no_arg, const Arg& ptr2 = no_arg, const Arg& ptr3 = no_arg, const Arg& ptr4 = no_arg, const Arg& ptr5 = no_arg, const Arg& ptr6 = no_arg, const Arg& ptr7 = no_arg, const Arg& ptr8 = no_arg, const Arg& ptr9 = no_arg, const Arg& ptr10 = no_arg, const Arg& ptr11 = no_arg, const Arg& ptr12 = no_arg, const Arg& ptr13 = no_arg, const Arg& ptr14 = no_arg, const Arg& ptr15 = no_arg, const Arg& ptr16 = no_arg) const; bool FindAndConsume(StringPiece* input, const Arg& ptr1 = no_arg, const Arg& ptr2 = no_arg, const Arg& ptr3 = no_arg, const Arg& ptr4 = no_arg, const Arg& ptr5 = no_arg, const Arg& ptr6 = no_arg, const Arg& ptr7 = no_arg, const Arg& ptr8 = no_arg, const Arg& ptr9 = no_arg, const Arg& ptr10 = no_arg, const Arg& ptr11 = no_arg, const Arg& ptr12 = no_arg, const Arg& ptr13 = no_arg, const Arg& ptr14 = no_arg, const Arg& ptr15 = no_arg, const Arg& ptr16 = no_arg) const; bool Replace(const StringPiece& rewrite, string *str) const; int GlobalReplace(const StringPiece& rewrite, string *str) const; bool Extract(const StringPiece &rewrite, const StringPiece &text, string *out) const; // Escapes all potentially meaningful regexp characters in // 'unquoted'. The returned string, used as a regular expression, // will exactly match the original string. For example, // 1.5-2.0? // may become: // 1\.5\-2\.0\? // Note QuoteMeta behaves the same as perl's QuoteMeta function, // *except* that it escapes the NUL character (\0) as backslash + 0, // rather than backslash + NUL. static string QuoteMeta(const StringPiece& unquoted); /***** Generic matching interface *****/ // Type of match (TODO: Should be restructured as part of RE_Options) enum Anchor { UNANCHORED, // No anchoring ANCHOR_START, // Anchor at start only ANCHOR_BOTH // Anchor at start and end }; // General matching routine. Stores the length of the match in // "*consumed" if successful. bool DoMatch(const StringPiece& text, Anchor anchor, int* consumed, const Arg* const* args, int n) const; // Return the number of capturing subpatterns, or -1 if the // regexp wasn't valid on construction. int NumberOfCapturingGroups() const; // The default value for an argument, to indicate the end of the argument // list. This must be used only in optional argument defaults. It should NOT // be passed explicitly. Some people have tried to use it like this: // // FullMatch(x, y, &z, no_arg, &w); // // This is a mistake, and will not work. static Arg no_arg; private: void Init(const string& pattern, const RE_Options* options); void Cleanup(); // Match against "text", filling in "vec" (up to "vecsize" * 2/3) with // pairs of integers for the beginning and end positions of matched // text. The first pair corresponds to the entire matched text; // subsequent pairs correspond, in order, to parentheses-captured // matches. Returns the number of pairs (one more than the number of // the last subpattern with a match) if matching was successful // and zero if the match failed. // I.e. for RE("(foo)|(bar)|(baz)") it will return 2, 3, and 4 when matching // against "foo", "bar", and "baz" respectively. // When matching RE("(foo)|hello") against "hello", it will return 1. // But the values for all subpattern are filled in into "vec". int TryMatch(const StringPiece& text, int startpos, Anchor anchor, bool empty_ok, int *vec, int vecsize) const; // Append the "rewrite" string, with backslash subsitutions from "text" // and "vec", to string "out". bool Rewrite(string *out, const StringPiece& rewrite, const StringPiece& text, int *vec, int veclen) const; // internal implementation for DoMatch bool DoMatchImpl(const StringPiece& text, Anchor anchor, int* consumed, const Arg* const args[], int n, int* vec, int vecsize) const; // Compile the regexp for the specified anchoring mode pcre* Compile(Anchor anchor); string pattern_; RE_Options options_; pcre* re_full_; // For full matches pcre* re_partial_; // For partial matches const string* error_; // Error indicator (or points to empty string) }; } // namespace pcrecpp #endif /* _PCRECPP_H */
Save