class MmapScanner
Public Class Methods
new(p1, p2 = v2, p3 = v3)
click to toggle source
static VALUE initialize(int argc, VALUE *argv, VALUE obj) { VALUE src, voffset, vsize; size_t offset, size; size_t src_offset = 0, src_size = 0; mmapscanner_t *self; int src_size_defined = 0; rb_scan_args(argc, argv, "12", &src, &voffset, &vsize); if (voffset != Qnil && NUM2LL(voffset) < 0) rb_raise(rb_eRangeError, "offset out of range: %lld", NUM2LL(voffset)); if (vsize != Qnil && NUM2LL(vsize) < 0) rb_raise(rb_eRangeError, "length out of range: %lld", NUM2LL(vsize)); offset = voffset == Qnil ? 0 : NUM2SIZET(voffset); if (rb_obj_class(src) == cMmapScanner) { mmapscanner_t *ms; Data_Get_Struct(src, mmapscanner_t, ms); src_offset = ms->offset; src_size = ms->size; src = ms->data; src_size_defined = 1; } else if (TYPE(src) == T_FILE) { int fd = FIX2INT(rb_funcall(src, rb_intern("fileno"), 0)); struct stat st; if (fstat(fd, &st) < 0) rb_sys_fail("fstat"); if (st.st_size == 0) { src = rb_str_new(NULL, 0); src_size = 0; } else { src = rb_funcall(cMmap, rb_intern("new"), 1, src); } } if (rb_obj_class(src) == cMmap) { if (!src_size_defined) { mmap_data_t *data; Data_Get_Struct(src, mmap_data_t, data); src_size = data->size; } } else if (TYPE(src) == T_STRING) { if (!src_size_defined) src_size = RSTRING_LEN(src); } else { rb_raise(rb_eTypeError, "wrong argument type %s (expected File/String/MmapScanner/MmapScanner::Mmap)", rb_obj_classname(src)); } if (offset > src_size) rb_raise(rb_eRangeError, "length out of range: %zu > %zu", offset, src_size); size = vsize == Qnil ? src_size - offset : NUM2SIZET(vsize); if (size > src_size - offset) size = src_size - offset; Data_Get_Struct(obj, mmapscanner_t, self); self->offset = src_offset + offset; self->size = size; self->pos = 0; self->matched = 0; self->matched_pos = 0; self->data = src; return Qnil; }
Public Instance Methods
check(p1)
click to toggle source
static VALUE check(VALUE obj, VALUE re) { return scan_sub(obj, re, 0, 1, 0); }
check_until(p1)
click to toggle source
static VALUE check_until(VALUE obj, VALUE re) { return scan_sub(obj, re, 0, 0, 0); }
data()
click to toggle source
static VALUE data(VALUE obj) { mmapscanner_t *ms; Data_Get_Struct(obj, mmapscanner_t, ms); return ms->data; }
eos?()
click to toggle source
static VALUE eos_p(VALUE obj) { mmapscanner_t *ms; Data_Get_Struct(obj, mmapscanner_t, ms); return ms->pos >= ms->size ? Qtrue : Qfalse; }
exist?(p1)
click to toggle source
static VALUE exist_p(VALUE obj, VALUE re) { return scan_sub(obj, re, 0, 0, 1); }
inspect()
click to toggle source
static VALUE inspect(VALUE obj) { return rb_str_new2("#<MmapScanner>"); }
match?(p1)
click to toggle source
static VALUE match_p(VALUE obj, VALUE re) { return scan_sub(obj, re, 0, 1, 1); }
matched(*args)
click to toggle source
static VALUE matched(int argc, VALUE *argv, VALUE obj) { mmapscanner_t *ms; size_t pos, len; Data_Get_Struct(obj, mmapscanner_t, ms); if (matched_sub(argc, argv, ms, &pos, &len) == 0) return Qnil; return create_from_mmapscanner(obj, pos, len); }
matched_str(*args)
click to toggle source
static VALUE matched_str(int argc, VALUE *argv, VALUE obj) { mmapscanner_t *ms; mmap_data_t *mdata; size_t pos, len; Data_Get_Struct(obj, mmapscanner_t, ms); if (matched_sub(argc, argv, ms, &pos, &len) == 0) return Qnil; if (TYPE(ms->data) == T_STRING) return rb_str_new(RSTRING_PTR(ms->data)+ms->offset+pos, len); Data_Get_Struct(ms->data, mmap_data_t, mdata); if (mdata->ptr == NULL) rb_raise(rb_eRuntimeError, "already unmapped"); return rb_str_new(mdata->ptr+ms->offset+pos, len); }
peek(p1)
click to toggle source
static VALUE peek(VALUE obj, VALUE size) { mmapscanner_t *ms; size_t sz = NUM2SIZET(size); Data_Get_Struct(obj, mmapscanner_t, ms); if (sz > ms->size - ms->pos) sz = ms->size - ms->pos; return create_from_mmapscanner(obj, ms->pos, sz); }
pos()
click to toggle source
static VALUE pos(VALUE obj) { mmapscanner_t *ms; Data_Get_Struct(obj, mmapscanner_t, ms); return SIZET2NUM(ms->pos); }
pos=(p1)
click to toggle source
static VALUE set_pos(VALUE obj, VALUE pos) { mmapscanner_t *ms; size_t p, size; Data_Get_Struct(obj, mmapscanner_t, ms); if (NUM2LL(pos) < 0) rb_raise(rb_eRangeError, "out of range: %lld", NUM2LL(pos)); p = NUM2SIZET(pos); size = ms->size; if (p > size) rb_raise(rb_eRangeError, "out of range: %zu > %zu", p, size); ms->pos = p; return pos; }
rest()
click to toggle source
static VALUE rest(VALUE obj) { mmapscanner_t *ms; Data_Get_Struct(obj, mmapscanner_t, ms); return create_from_mmapscanner(obj, ms->pos, ms->size - ms->pos); }
scan(p1)
click to toggle source
static VALUE scan(VALUE obj, VALUE re) { return scan_sub(obj, re, 1, 1, 0); }
scan_full(p1, p2, p3)
click to toggle source
static VALUE scan_full(VALUE obj, VALUE re, VALUE forward, VALUE ret_ms) { return scan_sub(obj, re, (forward != Qnil && forward != Qfalse), 1, (ret_ms == Qnil || ret_ms == Qfalse)); }
scan_until(p1)
click to toggle source
static VALUE scan_until(VALUE obj, VALUE re) { return scan_sub(obj, re, 1, 0, 0); }
search_full(p1, p2, p3)
click to toggle source
static VALUE search_full(VALUE obj, VALUE re, VALUE forward, VALUE ret_ms) { return scan_sub(obj, re, (forward != Qnil && forward != Qfalse), 0, (ret_ms == Qnil || ret_ms == Qfalse)); }
size()
click to toggle source
static VALUE size(VALUE obj) { mmapscanner_t *ms; Data_Get_Struct(obj, mmapscanner_t, ms); return SIZET2NUM(ms->size); }
Also aliased as: length
skip(p1)
click to toggle source
static VALUE skip(VALUE obj, VALUE re) { return scan_sub(obj, re, 1, 1, 1); }
skip_until(p1)
click to toggle source
static VALUE skip_until(VALUE obj, VALUE re) { return scan_sub(obj, re, 1, 0, 1); }
slice(p1, p2)
click to toggle source
static VALUE slice(VALUE obj, VALUE pos, VALUE len) { if (NUM2LL(pos) < 0) rb_raise(rb_eRangeError, "offset out of range: %lld", NUM2LL(pos)); if (NUM2LL(len) < 0) rb_raise(rb_eRangeError, "length out of range: %lld", NUM2LL(len)); return create_from_mmapscanner(obj, NUM2ULL(pos), NUM2ULL(len)); }
terminate()
click to toggle source
static VALUE terminate(VALUE obj) { mmapscanner_t *ms; Data_Get_Struct(obj, mmapscanner_t, ms); ms->pos = ms->size; return obj; }
to_s()
click to toggle source
static VALUE to_s(VALUE obj) { mmapscanner_t *ms; mmap_data_t *mdata; Data_Get_Struct(obj, mmapscanner_t, ms); if (TYPE(ms->data) == T_STRING) return rb_str_new(RSTRING_PTR(ms->data) + ms->offset, ms->size); Data_Get_Struct(ms->data, mmap_data_t, mdata); if (mdata->ptr == NULL) rb_raise(rb_eRuntimeError, "already unmapped"); return rb_str_new(mdata->ptr + ms->offset, ms->size); }