29 |
// |
// |
30 |
// Author: Sanjay Ghemawat |
// Author: Sanjay Ghemawat |
31 |
|
|
32 |
|
#ifdef HAVE_CONFIG_H |
33 |
|
#include "config.h" |
34 |
|
#endif |
35 |
|
|
36 |
|
#ifdef _WIN32 |
37 |
|
#define HAVE_STRTOQ 1 |
38 |
|
#define strtoll _strtoui64 |
39 |
|
#define strtoull _strtoi64 |
40 |
|
#endif |
41 |
|
|
42 |
#include <stdlib.h> |
#include <stdlib.h> |
43 |
#include <stdio.h> |
#include <stdio.h> |
44 |
#include <ctype.h> |
#include <ctype.h> |
47 |
#include <errno.h> |
#include <errno.h> |
48 |
#include <string> |
#include <string> |
49 |
#include <algorithm> |
#include <algorithm> |
50 |
#include "config.h" |
|
51 |
// We need this to compile the proper dll on windows/msys. This is copied |
#include "pcrecpp_internal.h" |
|
// from pcre_internal.h. It would probably be better just to include that. |
|
|
#define PCRE_DEFINITION /* Win32 __declspec(export) trigger for .dll */ |
|
52 |
#include "pcre.h" |
#include "pcre.h" |
|
#include "pcre_stringpiece.h" |
|
53 |
#include "pcrecpp.h" |
#include "pcrecpp.h" |
54 |
|
#include "pcre_stringpiece.h" |
55 |
|
|
56 |
|
|
57 |
namespace pcrecpp { |
namespace pcrecpp { |
61 |
static const int kVecSize = (1 + kMaxArgs) * 3; // results + PCRE workspace |
static const int kVecSize = (1 + kMaxArgs) * 3; // results + PCRE workspace |
62 |
|
|
63 |
// Special object that stands-in for no argument |
// Special object that stands-in for no argument |
64 |
Arg no_arg((void*)NULL); |
PCRECPP_EXP_DEFN Arg no_arg((void*)NULL); |
65 |
|
|
66 |
// If a regular expression has no error, its error_ field points here |
// If a regular expression has no error, its error_ field points here |
67 |
static const string empty_string; |
static const string empty_string; |
82 |
|
|
83 |
re_partial_ = Compile(UNANCHORED); |
re_partial_ = Compile(UNANCHORED); |
84 |
if (re_partial_ != NULL) { |
if (re_partial_ != NULL) { |
85 |
// Check for complicated patterns. The following change is |
re_full_ = Compile(ANCHOR_BOTH); |
|
// conservative in that it may treat some "simple" patterns |
|
|
// as "complex" (e.g., if the vertical bar is in a character |
|
|
// class or is escaped). But it seems good enough. |
|
|
if (strchr(pat.c_str(), '|') == NULL) { |
|
|
// Simple pattern: we can use position-based checks to perform |
|
|
// fully anchored matches |
|
|
re_full_ = re_partial_; |
|
|
} else { |
|
|
// We need a special pattern for anchored matches |
|
|
re_full_ = Compile(ANCHOR_BOTH); |
|
|
} |
|
86 |
} |
} |
87 |
} |
} |
88 |
|
|
89 |
void RE::Cleanup() { |
void RE::Cleanup() { |
90 |
if (re_full_ != NULL && re_full_ != re_partial_) (*pcre_free)(re_full_); |
if (re_full_ != NULL) (*pcre_free)(re_full_); |
91 |
if (re_partial_ != NULL) (*pcre_free)(re_partial_); |
if (re_partial_ != NULL) (*pcre_free)(re_partial_); |
92 |
if (error_ != &empty_string) delete error_; |
if (error_ != &empty_string) delete error_; |
93 |
} |
} |
94 |
|
|
95 |
|
|
468 |
return 0; |
return 0; |
469 |
} |
} |
470 |
|
|
471 |
pcre_extra extra = { 0 }; |
pcre_extra extra = { 0, 0, 0, 0, 0, 0 }; |
472 |
if (options_.match_limit() > 0) { |
if (options_.match_limit() > 0) { |
473 |
extra.flags |= PCRE_EXTRA_MATCH_LIMIT; |
extra.flags |= PCRE_EXTRA_MATCH_LIMIT; |
474 |
extra.match_limit = options_.match_limit(); |
extra.match_limit = options_.match_limit(); |
501 |
rc = vecsize / 2; |
rc = vecsize / 2; |
502 |
} |
} |
503 |
|
|
|
if ((anchor == ANCHOR_BOTH) && (re_full_ == re_partial_)) { |
|
|
// We need an extra check to make sure that the match extended |
|
|
// to the end of the input string |
|
|
assert(vec[0] == 0); // PCRE_ANCHORED forces starting match |
|
|
if (vec[1] != text.size()) return 0; // Did not get ending match |
|
|
} |
|
|
|
|
504 |
return rc; |
return rc; |
505 |
} |
} |
506 |
|
|