1 //===-- Regex.cpp - Regular Expression matcher implementation -------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements a POSIX regular expression matcher.
12 //===----------------------------------------------------------------------===//
13 #include "llvm/Support/Regex.h"
14 #include "llvm/Support/ErrorHandling.h"
15 #include "llvm/Support/raw_ostream.h"
16 #include "regex_impl.h"
20 Regex::Regex(const StringRef
®ex
, unsigned Flags
)
23 preg
= new struct llvm_regex
;
24 preg
->re_endp
= regex
.end();
25 if (Flags
& IgnoreCase
)
35 error
= llvm_regcomp(preg
, regex
.data(), flags
|REG_EXTENDED
|REG_PEND
);
38 bool Regex::isValid(std::string
&Error
)
43 size_t len
= llvm_regerror(error
, preg
, NULL
, 0);
44 char *errbuff
= new char[len
];
45 llvm_regerror(error
, preg
, errbuff
, len
);
46 Error
.assign(errbuff
);
56 bool Regex::match(const StringRef
&String
, SmallVectorImpl
<StringRef
> *Matches
)
58 unsigned nmatch
= Matches
? preg
->re_nsub
+1 : 0;
61 assert(sub
&& "Substring matching requested but pattern compiled without");
65 // pmatch needs to have at least one element.
66 SmallVector
<llvm_regmatch_t
, 2> pm
;
67 pm
.resize(nmatch
> 0 ? nmatch
: 1);
69 pm
[0].rm_eo
= String
.size();
71 int rc
= llvm_regexec(preg
, String
.data(), nmatch
, pm
.data(), REG_STARTEND
);
73 if (rc
== REG_NOMATCH
)
76 // regexec can fail due to invalid pattern or running out of memory.
83 if (Matches
) { // match position requested
84 for (unsigned i
=0;i
<nmatch
; i
++) {
85 if (pm
[i
].rm_so
== -1) {
86 // this group didn't match
87 Matches
->push_back(StringRef());
90 assert(pm
[i
].rm_eo
> pm
[i
].rm_so
);
91 Matches
->push_back(StringRef(String
.data()+pm
[i
].rm_so
,
92 pm
[i
].rm_eo
-pm
[i
].rm_so
));