Object* Regexp::match_region(STATE, String* string, Fixnum* start, Fixnum* end, Object* forward) { int beg, max; const UChar *str; OnigRegion *region; Object* md; if(unlikely(!onig_data)) { Exception::argument_error(state, "Not properly initialized Regexp"); } maybe_recompile(state); region = onig_region_new(); max = string->size(); str = (UChar*)string->c_str(state); int* back_match = onig_data->int_map_backward; if(!RTEST(forward)) { beg = onig_search(onig_data, str, str + max, str + end->to_native(), str + start->to_native(), region, ONIG_OPTION_NONE); } else { beg = onig_search(onig_data, str, str + max, str + start->to_native(), str + end->to_native(), region, ONIG_OPTION_NONE); } // Seems like onig must setup int_map_backward lazily, so we have to watch // for it to appear here. if(onig_data->int_map_backward != back_match) { native_int size = sizeof(int) * ONIG_CHAR_TABLE_SIZE; ByteArray* ba = ByteArray::create(state, size); memcpy(ba->raw_bytes(), onig_data->int_map_backward, size); // Dispose of the old one. free(onig_data->int_map_backward); onig_data->int_map_backward = reinterpret_cast<int*>(ba->raw_bytes()); write_barrier(state, ba); } if(beg == ONIG_MISMATCH) { onig_region_free(region, 1); return Qnil; } md = get_match_data(state, region, string, this, 0); onig_region_free(region, 1); return md; }
Object* Regexp::search_from(STATE, String* string, Fixnum* start) { int beg, max; const UChar *str; const UChar *fin; OnigRegion *region; Object* md = Qnil; maybe_recompile(state); region = onig_region_new(); max = string->size(); native_int pos = start->to_native(); str = (UChar*)string->c_str(); fin = str + max; str += pos; int* back_match = onig_data->int_map_backward; beg = onig_search(onig_data, str, fin, str, fin, region, ONIG_OPTION_NONE); // Seems like onig must setup int_map_backward lazily, so we have to watch // for it to appear here. if(onig_data->int_map_backward != back_match) { native_int size = sizeof(int) * ONIG_CHAR_TABLE_SIZE; ByteArray* ba = ByteArray::create(state, size); memcpy(ba->raw_bytes(), onig_data->int_map_backward, size); // Dispose of the old one. free(onig_data->int_map_backward); onig_data->int_map_backward = reinterpret_cast<int*>(ba->raw_bytes()); write_barrier(state, ba); } if(beg != ONIG_MISMATCH) { md = get_match_data(state, region, string, this, pos); } onig_region_free(region, 1); return md; }
Object* Regexp::search_from(STATE, String* string, Fixnum* start) { int beg, max; const UChar *str; const UChar *fin; Object* md = cNil; if(unlikely(!onig_data)) { Exception::argument_error(state, "Not properly initialized Regexp"); } lock_.lock(); maybe_recompile(state, string); max = string->byte_size(); native_int pos = start->to_native(); str = (UChar*)string->byte_address(); fin = str + max; str += pos; int begin_reg[10] = { ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS }; int end_reg[10] = { ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS }; OnigRegion region = { 10, 0, begin_reg, end_reg, 0, 0 }; int* back_match = onig_data->int_map_backward; beg = onig_search(onig_data, str, fin, str, fin, ®ion, ONIG_OPTION_NONE); // Seems like onig must setup int_map_backward lazily, so we have to watch // for it to appear here. if(onig_data->int_map_backward != back_match) { native_int size = sizeof(int) * ONIG_CHAR_TABLE_SIZE; ByteArray* ba = ByteArray::create(state, size); memcpy(ba->raw_bytes(), onig_data->int_map_backward, size); // Dispose of the old one. free(onig_data->int_map_backward); onig_data->int_map_backward = reinterpret_cast<int*>(ba->raw_bytes()); write_barrier(state, ba); } lock_.unlock(); if(beg != ONIG_MISMATCH) { md = get_match_data(state, ®ion, string, this, pos); } onig_region_free(®ion, 0); return md; }
Object* Regexp::match_region(STATE, String* string, Fixnum* start, Fixnum* end, Object* forward) { int beg, max; const UChar *str; Object* md; if(unlikely(!onig_data)) { Exception::argument_error(state, "Not properly initialized Regexp"); } // thread::Mutex::LockGuard lg(state->shared().onig_lock()); max = string->size(); str = (UChar*)string->byte_address(); native_int i_start = start->to_native(); native_int i_end = end->to_native(); // Bounds check. if(i_start < 0 || i_end < 0 || i_start > max || i_end > max) { return Qnil; } lock_.lock(); maybe_recompile(state); int begin_reg[10] = { ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS }; int end_reg[10] = { ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS }; OnigRegion region = { 10, 0, begin_reg, end_reg, 0, 0 }; int* back_match = onig_data->int_map_backward; if(!RTEST(forward)) { beg = onig_search(onig_data, str, str + max, str + i_end, str + i_start, ®ion, ONIG_OPTION_NONE); } else { beg = onig_search(onig_data, str, str + max, str + i_start, str + i_end, ®ion, ONIG_OPTION_NONE); } // Seems like onig must setup int_map_backward lazily, so we have to watch // for it to appear here. if(onig_data->int_map_backward != back_match) { native_int size = sizeof(int) * ONIG_CHAR_TABLE_SIZE; ByteArray* ba = ByteArray::create(state, size); memcpy(ba->raw_bytes(), onig_data->int_map_backward, size); // Dispose of the old one. free(onig_data->int_map_backward); onig_data->int_map_backward = reinterpret_cast<int*>(ba->raw_bytes()); write_barrier(state, ba); } lock_.unlock(); if(beg == ONIG_MISMATCH) { onig_region_free(®ion, 0); return Qnil; } md = get_match_data(state, ®ion, string, this, 0); onig_region_free(®ion, 0); return md; }
MatchData* Regexp::search_from(STATE, String* string, Fixnum* start) { int beg, max; const UChar *str; const UChar *fin; if(unlikely(!onig_source_data(state))) { Exception::argument_error(state, "Not properly initialized Regexp"); } if(unlikely(!CBOOL(string->valid_encoding_p(state)))) { std::ostringstream msg; msg << "invalid byte sequence in " << string->encoding(state)->name()->to_string(state); Exception::argument_error(state, msg.str().c_str()); } lock_.lock(); regex_t* data = maybe_recompile(state, string); if(!data) return 0; max = string->byte_size(); native_int pos = start->to_native(); str = (UChar*)string->byte_address(); fin = str + max; str += pos; OnigPosition begin_reg[10] = { ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS }; OnigPosition end_reg[10] = { ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS, ONIG_REGION_NOTPOS }; OnigRegion region = { 10, 0, begin_reg, end_reg, 0, 0 }; int* back_match = data->int_map_backward; beg = onig_search(data, str, fin, str, fin, ®ion, ONIG_OPTION_NONE); // Seems like onig must setup int_map_backward lazily, so we have to watch // for it to appear here. if(data->int_map_backward != back_match) { native_int size = sizeof(int) * ONIG_CHAR_TABLE_SIZE; ByteArray* ba = ByteArray::create_dirty(state, size); memcpy(ba->raw_bytes(), data->int_map_backward, size); // Dispose of the old one. free(data->int_map_backward); data->int_map_backward = reinterpret_cast<int*>(ba->raw_bytes()); write_barrier(state, ba); } lock_.unlock(); MatchData* md = nil<MatchData>(); if(beg != ONIG_MISMATCH) { md = get_match_data(state, ®ion, string, this, pos); } onig_region_free(®ion, 0); return md; }