9OnigString::OnigString(
const std::string& str)
10 : _content(str), _utf8Ptr(reinterpret_cast<const UChar*>(_content.c_str())) {
13OnigString::~OnigString() {
17void OnigString::dispose() {
24OnigScanner::OnigScanner(
const std::vector<std::string>& sources)
25 : _sources(sources), _regSet(nullptr), _disposed(false) {
26 _regexes.resize(sources.size(),
nullptr);
30OnigScanner::~OnigScanner() {
34bool OnigScanner::compilePatterns() {
35 OnigEncoding encoding = ONIG_ENCODING_UTF8;
36 OnigSyntaxType* syntax = ONIG_SYNTAX_DEFAULT;
38 for (
size_t i = 0; i < _sources.size(); i++) {
39 const std::string& pattern = _sources[i];
40 OnigRegex reg =
nullptr;
42 const UChar* patternPtr =
reinterpret_cast<const UChar*
>(pattern.c_str());
43 const UChar* patternEnd = patternPtr + pattern.length();
46 int r = onig_new(®, patternPtr, patternEnd, ONIG_OPTION_CAPTURE_GROUP,
47 encoding, syntax, &einfo);
49 if (r != ONIG_NORMAL) {
51 OnigUChar s[ONIG_MAX_ERROR_MESSAGE_LEN];
52 onig_error_code_to_str(s, r, &einfo);
61 if (!_regexes.empty()) {
62 int n = _regexes.size();
63 OnigRegex* regArray =
new OnigRegex[n];
64 for (
int i = 0; i < n; i++) {
65 regArray[i] = _regexes[i];
68 int r = onig_regset_new(&_regSet, n, regArray);
71 if (r != ONIG_NORMAL) {
79IOnigMatch* OnigScanner::findNextMatchSync(
const std::string&
string,
81 OrMask<FindOption> options) {
82 OnigString onigStr(
string);
83 return findNextMatchSync(&onigStr, startPosition, options);
86IOnigMatch* OnigScanner::findNextMatchSync(OnigString*
string,
88 OrMask<FindOption> options) {
89 if (_disposed || _regSet ==
nullptr ||
string ==
nullptr) {
93 const UChar* strPtr =
string->utf8Ptr();
94 const UChar* strEnd = strPtr +
string->utf8Length();
95 const UChar* start = strPtr + startPosition;
102 OnigOptionType onigOptions = ONIG_OPTION_NONE;
103 if (options & NotBeginString) {
104 onigOptions |= ONIG_OPTION_NOT_BEGIN_STRING;
106 if (options & NotEndString) {
107 onigOptions |= ONIG_OPTION_NOT_END_STRING;
109 if (options & NotBeginPosition) {
110 onigOptions |= ONIG_OPTION_NOT_BEGIN_POSITION;
114 OnigRegSetLead lead = ONIG_REGSET_POSITION_LEAD;
116 int regIndex = onig_regset_search(_regSet, strPtr, strEnd, start, strEnd,
117 lead, onigOptions, &matchPos);
125 OnigRegex matchedReg = _regexes[regIndex];
126 if (matchedReg ==
nullptr) {
131 OnigRegion* region = onig_region_new();
134 int r = onig_search(matchedReg, strPtr, strEnd, start, strEnd, region, onigOptions);
136 onig_region_free(region, 1);
141 IOnigMatch* match =
new IOnigMatch();
142 match->index = regIndex;
145 for (
int i = 0; i < region->num_regs; i++) {
146 int captureStart = region->beg[i];
147 int captureEnd = region->end[i];
149 if (captureStart >= 0 && captureEnd >= 0) {
150 match->captureIndices.push_back(IOnigCaptureIndex(captureStart, captureEnd));
152 match->captureIndices.push_back(IOnigCaptureIndex(0, 0));
157 onig_region_free(region, 1);
162void OnigScanner::dispose() {
167 if (_regSet !=
nullptr) {
170 onig_regset_free(_regSet);
174 for (
size_t i = 0; i < _regexes.size(); i++) {
175 _regexes[i] =
nullptr;
179 for (
size_t i = 0; i < _regexes.size(); i++) {
180 if (_regexes[i] !=
nullptr) {
181 onig_free(_regexes[i]);
182 _regexes[i] =
nullptr;
192DefaultOnigLib::DefaultOnigLib() {
197DefaultOnigLib::~DefaultOnigLib() {
202OnigScanner* DefaultOnigLib::createOnigScanner(
const std::vector<std::string>& sources) {
203 return new OnigScanner(sources);
206OnigString* DefaultOnigLib::createOnigString(
const std::string& str) {
207 return new OnigString(str);
212void disposeOnigString(OnigString* str) {
213 if (str !=
nullptr) {