Ruby
2.7.1p83(2020-03-31revisiona0c7c23c9cec0d0ffcba012279cd652d28ad5bf3)
|
Go to the documentation of this file.
16 # include RUBY_EXTCONF_H
19 #ifdef HAVE_ONIG_REGION_MEMSIZE
25 #define STRSCAN_VERSION "1.0.3"
31 static VALUE StringScanner;
32 static VALUE ScanError;
33 static ID id_byteslice;
39 #define FLAG_MATCHED (1 << 0)
58 #define MATCHED_P(s) ((s)->flags & FLAG_MATCHED)
59 #define MATCHED(s) (s)->flags |= FLAG_MATCHED
60 #define CLEAR_MATCH_STATUS(s) (s)->flags &= ~FLAG_MATCHED
62 #define S_PBEG(s) (RSTRING_PTR((s)->str))
63 #define S_LEN(s) (RSTRING_LEN((s)->str))
64 #define S_PEND(s) (S_PBEG(s) + S_LEN(s))
65 #define CURPTR(s) (S_PBEG(s) + (s)->curr)
66 #define S_RESTLEN(s) (S_LEN(s) - (s)->curr)
68 #define EOS_P(s) ((s)->curr >= RSTRING_LEN(p->str))
70 #define GET_SCANNER(obj,var) do {\
71 (var) = check_strscan(obj);\
72 if (NIL_P((var)->str)) rb_raise(rb_eArgError, "uninitialized StringScanner object");\
79 static inline long minl
_((
const long n,
const long x));
80 static VALUE extract_range
_((
struct strscanner *p,
long beg_i,
long end_i));
84 static void strscan_mark
_((
void *p));
85 static void strscan_free
_((
void *p));
86 static size_t strscan_memsize
_((
const void *p));
100 int succptr,
int getstr,
int headonly));
112 static void adjust_registers_to_matched
_((
struct strscanner *p));
149 minl(
const long x,
const long y)
151 return (x < y) ? x : y;
155 extract_range(
struct strscanner *p,
long beg_i,
long end_i)
158 end_i = minl(end_i,
S_LEN(p));
159 return str_new(p,
S_PBEG(p) + beg_i, end_i - beg_i);
167 return str_new(p,
S_PBEG(p) + beg_i,
len);
175 strscan_mark(
void *
ptr)
182 strscan_free(
void *
ptr)
190 strscan_memsize(
const void *
ptr)
193 size_t size =
sizeof(*p) -
sizeof(p->
regs);
194 #ifdef HAVE_ONIG_REGION_MEMSIZE
202 {strscan_mark, strscan_free, strscan_memsize},
236 p = check_strscan(
self);
239 if (!
NIL_P(options)) {
242 keyword_ids[0] =
rb_intern(
"fixed_anchor");
244 if (fixed_anchor ==
Qundef) {
278 self = check_strscan(vself);
279 orig = check_strscan(vorig);
281 self->flags = orig->
flags;
282 self->str = orig->
str;
283 self->prev = orig->
prev;
284 self->curr = orig->
curr;
303 strscan_s_mustc(
VALUE self)
312 strscan_reset(
VALUE self)
330 strscan_terminate(
VALUE self)
345 strscan_clear(
VALUE self)
347 rb_warning(
"StringScanner#clear is obsolete; use #terminate instead");
348 return strscan_terminate(
self);
355 strscan_get_string(
VALUE self)
421 strscan_get_pos(
VALUE self)
443 strscan_get_charpos(
VALUE self)
479 static inline UChar *
492 set_registers(
struct strscanner *p,
size_t length)
533 adjust_register_position(
struct strscanner *p,
long position)
539 return p->
prev + position;
544 strscan_do_scan(
VALUE self,
VALUE pattern,
int succptr,
int getstr,
int headonly)
572 if (!tmpreg)
RREGEXP(pattern)->usecnt++;
591 if (!tmpreg)
RREGEXP(pattern)->usecnt--;
593 if (
RREGEXP(pattern)->usecnt) {
602 if (ret == -2)
rb_raise(ScanError,
"regexp buffer overflow");
626 const long length = last_match_length(p);
628 return extract_beg_len(p, p->
prev, length);
655 return strscan_do_scan(
self, re, 1, 1, 1);
673 return strscan_do_scan(
self, re, 0, 0, 1);
697 return strscan_do_scan(
self, re, 1, 0, 1);
718 return strscan_do_scan(
self, re, 0, 1, 1);
734 return strscan_do_scan(
self, re,
RTEST(s),
RTEST(
f), 1);
752 return strscan_do_scan(
self, re, 1, 1, 0);
771 return strscan_do_scan(
self, re, 0, 0, 0);
793 return strscan_do_scan(
self, re, 1, 0, 0);
812 return strscan_do_scan(
self, re, 0, 1, 0);
827 return strscan_do_scan(
self, re,
RTEST(s),
RTEST(
f), 0);
831 adjust_registers_to_matched(
struct strscanner *p)
857 strscan_getch(
VALUE self)
872 adjust_registers_to_matched(p);
873 return extract_range(p,
874 adjust_register_position(p, p->
regs.
beg[0]),
875 adjust_register_position(p, p->
regs.
end[0]));
895 strscan_get_byte(
VALUE self)
907 adjust_registers_to_matched(p);
908 return extract_range(p,
909 adjust_register_position(p, p->
regs.
beg[0]),
910 adjust_register_position(p, p->
regs.
end[0]));
918 strscan_getbyte(
VALUE self)
920 rb_warning(
"StringScanner#getbyte is obsolete; use #get_byte instead");
921 return strscan_get_byte(
self);
945 return str_new(p,
"", 0);
948 return extract_beg_len(p, p->
curr,
len);
958 rb_warning(
"StringScanner#peep is obsolete; use #peek instead");
959 return strscan_peek(
self, vlen);
974 strscan_unscan(
VALUE self)
980 rb_raise(ScanError,
"unscan failed: previous match record not exist");
999 strscan_bol_p(
VALUE self)
1020 strscan_eos_p(
VALUE self)
1033 strscan_empty_p(
VALUE self)
1035 rb_warning(
"StringScanner#empty? is obsolete; use #eos? instead");
1036 return strscan_eos_p(
self);
1048 strscan_rest_p(
VALUE self)
1066 strscan_matched_p(
VALUE self)
1082 strscan_matched(
VALUE self)
1088 return extract_range(p,
1089 adjust_register_position(p, p->
regs.
beg[0]),
1090 adjust_register_position(p, p->
regs.
end[0]));
1104 strscan_matched_size(
VALUE self)
1119 (
const unsigned char* )
name, (
const unsigned char* )name_end,
regs);
1167 switch (
TYPE(idx)) {
1182 if (
i < 0)
return Qnil;
1186 return extract_range(p,
1187 adjust_register_position(p, p->
regs.
beg[
i]),
1188 adjust_register_position(p, p->
regs.
end[
i]));
1202 strscan_size(
VALUE self)
1224 strscan_captures(
VALUE self)
1236 for (
i = 1;
i < num_regs;
i++) {
1238 adjust_register_position(p, p->
regs.
beg[
i]),
1239 adjust_register_position(p, p->
regs.
end[
i]));
1288 strscan_pre_match(
VALUE self)
1294 return extract_range(p,
1296 adjust_register_position(p, p->
regs.
beg[0]));
1309 strscan_post_match(
VALUE self)
1315 return extract_range(p,
1316 adjust_register_position(p, p->
regs.
end[0]),
1325 strscan_rest(
VALUE self)
1331 return str_new(p,
"", 0);
1333 return extract_range(p, p->
curr,
S_LEN(p));
1340 strscan_rest_size(
VALUE self)
1358 strscan_restsize(
VALUE self)
1360 rb_warning(
"StringScanner#restsize is obsolete; use #rest_size instead");
1361 return strscan_rest_size(
self);
1364 #define INSPECT_LENGTH 5
1378 strscan_inspect(
VALUE self)
1383 p = check_strscan(
self);
1456 strscan_fixed_anchor_p(
VALUE self)
1459 p = check_strscan(
self);
1650 rb_define_method(StringScanner,
"fixed_anchor?", strscan_fixed_anchor_p, 0);
int rb_get_kwargs(VALUE keyword_hash, const ID *table, int required, int optional, VALUE *values)
VALUE rb_define_class(const char *name, VALUE super)
Defines a top-level class.
#define TypedData_Make_Struct(klass, type, data_type, sval)
#define RSTRING_GETMEM(str, ptrvar, lenvar)
ONIG_EXTERN int onig_region_set(OnigRegion *region, int at, int beg, int end)
int rb_const_defined(VALUE, ID)
int rb_enc_mbclen(const char *p, const char *e, rb_encoding *enc)
void rb_warning(const char *fmt,...)
#define RB_TYPE_P(obj, type)
rb_encoding * rb_enc_get(VALUE obj)
rb_encoding * rb_enc_check(VALUE str1, VALUE str2)
VALUE rb_str_length(VALUE)
int rb_reg_region_copy(struct re_registers *, const struct re_registers *)
regex_t * rb_reg_prepare_re(VALUE re, VALUE str)
void rb_define_singleton_method(VALUE obj, const char *name, VALUE(*func)(ANYARGS), int argc)
Defines a singleton method for obj.
void rb_const_set(VALUE, ID, VALUE)
void rb_define_method(VALUE klass, const char *name, VALUE(*func)(ANYARGS), int argc)
ONIG_EXTERN int onig_name_to_backref_number(OnigRegex reg, const OnigUChar *name, const OnigUChar *name_end, const OnigRegion *region)
ONIG_EXTERN OnigPosition onig_search(OnigRegex, const OnigUChar *str, const OnigUChar *end, const OnigUChar *start, const OnigUChar *range, OnigRegion *region, OnigOptionType option)
ONIG_EXTERN void onig_region_init(OnigRegion *region)
ONIG_EXTERN OnigPosition onig_match(OnigRegex, const OnigUChar *str, const OnigUChar *end, const OnigUChar *at, OnigRegion *region, OnigOptionType option)
ONIG_EXTERN void onig_region_free(OnigRegion *region, int free_self)
void rb_raise(VALUE exc, const char *fmt,...)
VALUE rb_obj_class(VALUE)
Equivalent to Object#class in Ruby.
ONIG_EXTERN void onig_free(OnigRegex)
void rb_alias(VALUE, ID, ID)
const typedef OnigEncodingType rb_encoding
#define GET_SCANNER(obj, var)
VALUE rb_ary_push(VALUE ary, VALUE item)
VALUE rb_obj_freeze(VALUE)
Make the object unmodifiable.
#define CLEAR_MATCH_STATUS(s)
size_t onig_region_memsize(const OnigRegion *regs)
void rb_enc_copy(VALUE obj1, VALUE obj2)
int memcmp(const void *s1, const void *s2, size_t len)
VALUE rb_check_hash_type(VALUE hash)
RUBY_EXTERN VALUE rb_cObject
VALUE rb_str_append(VALUE, VALUE)
VALUE rb_sprintf(const char *format,...)
char str[HTML_ESCAPE_MAX_LEN+1]
#define RUBY_TYPED_FREE_IMMEDIATELY
void rb_enc_raise(rb_encoding *enc, VALUE exc, const char *fmt,...)
void rb_gc_mark(VALUE ptr)
void * rb_check_typeddata(VALUE obj, const rb_data_type_t *data_type)
VALUE rb_define_class_under(VALUE outer, const char *name, VALUE super)
Defines a class under the namespace of outer.
ONIG_EXTERN void onig_region_clear(OnigRegion *region)
void rb_define_private_method(VALUE klass, const char *name, VALUE(*func)(ANYARGS), int argc)
VALUE rb_str_cat(VALUE, const char *, long)
void rb_define_alloc_func(VALUE, rb_alloc_func_t)