strscan 3.0.6 → 3.0.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ext/strscan/extconf.rb +1 -0
- data/ext/strscan/strscan.c +83 -48
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 55b86790043219a7a959b084db7665576bd1d6342b4cbef90dbfe4da131920cb
|
4
|
+
data.tar.gz: f80e735c0376d490dd5f565a39cbdf68a97b0f6bd34d01d16b493d7205453fa1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 95157252dd0df23caafd499d2e4bc09821cfb637d5dc1bc6f3ea2c290aa7263269899145fa6fd4e0b9ca5757fc33aaee694bd1a11dc0219f4760648bbafa0408
|
7
|
+
data.tar.gz: df2aa355dfa01e01ce60fea0ea13dc058dbf1067b51eb54086adc1a9ef5e6a210d05a073a916190490dc7b0f315133c010edcdac3344098f161a555915722e35
|
data/ext/strscan/extconf.rb
CHANGED
data/ext/strscan/strscan.c
CHANGED
@@ -22,7 +22,7 @@ extern size_t onig_region_memsize(const struct re_registers *regs);
|
|
22
22
|
|
23
23
|
#include <stdbool.h>
|
24
24
|
|
25
|
-
#define STRSCAN_VERSION "3.0.
|
25
|
+
#define STRSCAN_VERSION "3.0.8"
|
26
26
|
|
27
27
|
/* =======================================================================
|
28
28
|
Data Type Definitions
|
@@ -539,6 +539,68 @@ adjust_register_position(struct strscanner *p, long position)
|
|
539
539
|
}
|
540
540
|
}
|
541
541
|
|
542
|
+
/* rb_reg_onig_match is available in Ruby 3.3 and later. */
|
543
|
+
#ifndef HAVE_RB_REG_ONIG_MATCH
|
544
|
+
static OnigPosition
|
545
|
+
rb_reg_onig_match(VALUE re, VALUE str,
|
546
|
+
OnigPosition (*match)(regex_t *reg, VALUE str, struct re_registers *regs, void *args),
|
547
|
+
void *args, struct re_registers *regs)
|
548
|
+
{
|
549
|
+
regex_t *reg = rb_reg_prepare_re(re, str);
|
550
|
+
|
551
|
+
bool tmpreg = reg != RREGEXP_PTR(re);
|
552
|
+
if (!tmpreg) RREGEXP(re)->usecnt++;
|
553
|
+
|
554
|
+
OnigPosition result = match(reg, str, regs, args);
|
555
|
+
|
556
|
+
if (!tmpreg) RREGEXP(re)->usecnt--;
|
557
|
+
if (tmpreg) {
|
558
|
+
if (RREGEXP(re)->usecnt) {
|
559
|
+
onig_free(reg);
|
560
|
+
}
|
561
|
+
else {
|
562
|
+
onig_free(RREGEXP_PTR(re));
|
563
|
+
RREGEXP_PTR(re) = reg;
|
564
|
+
}
|
565
|
+
}
|
566
|
+
|
567
|
+
if (result < 0) {
|
568
|
+
if (result != ONIG_MISMATCH) {
|
569
|
+
rb_raise(ScanError, "regexp buffer overflow");
|
570
|
+
}
|
571
|
+
}
|
572
|
+
|
573
|
+
return result;
|
574
|
+
}
|
575
|
+
#endif
|
576
|
+
|
577
|
+
static OnigPosition
|
578
|
+
strscan_match(regex_t *reg, VALUE str, struct re_registers *regs, void *args_ptr)
|
579
|
+
{
|
580
|
+
struct strscanner *p = (struct strscanner *)args_ptr;
|
581
|
+
|
582
|
+
return onig_match(reg,
|
583
|
+
match_target(p),
|
584
|
+
(UChar* )(CURPTR(p) + S_RESTLEN(p)),
|
585
|
+
(UChar* )CURPTR(p),
|
586
|
+
regs,
|
587
|
+
ONIG_OPTION_NONE);
|
588
|
+
}
|
589
|
+
|
590
|
+
static OnigPosition
|
591
|
+
strscan_search(regex_t *reg, VALUE str, struct re_registers *regs, void *args_ptr)
|
592
|
+
{
|
593
|
+
struct strscanner *p = (struct strscanner *)args_ptr;
|
594
|
+
|
595
|
+
return onig_search(reg,
|
596
|
+
match_target(p),
|
597
|
+
(UChar *)(CURPTR(p) + S_RESTLEN(p)),
|
598
|
+
(UChar *)CURPTR(p),
|
599
|
+
(UChar *)(CURPTR(p) + S_RESTLEN(p)),
|
600
|
+
regs,
|
601
|
+
ONIG_OPTION_NONE);
|
602
|
+
}
|
603
|
+
|
542
604
|
static VALUE
|
543
605
|
strscan_do_scan(VALUE self, VALUE pattern, int succptr, int getstr, int headonly)
|
544
606
|
{
|
@@ -560,47 +622,14 @@ strscan_do_scan(VALUE self, VALUE pattern, int succptr, int getstr, int headonly
|
|
560
622
|
}
|
561
623
|
|
562
624
|
if (RB_TYPE_P(pattern, T_REGEXP)) {
|
563
|
-
regex_t *rb_reg_prepare_re(VALUE re, VALUE str);
|
564
|
-
regex_t *re;
|
565
|
-
long ret;
|
566
|
-
int tmpreg;
|
567
|
-
|
568
625
|
p->regex = pattern;
|
569
|
-
|
570
|
-
|
571
|
-
|
572
|
-
|
573
|
-
|
574
|
-
ret = onig_match(re,
|
575
|
-
match_target(p),
|
576
|
-
(UChar* )(CURPTR(p) + S_RESTLEN(p)),
|
577
|
-
(UChar* )CURPTR(p),
|
578
|
-
&(p->regs),
|
579
|
-
ONIG_OPTION_NONE);
|
580
|
-
}
|
581
|
-
else {
|
582
|
-
ret = onig_search(re,
|
583
|
-
match_target(p),
|
584
|
-
(UChar* )(CURPTR(p) + S_RESTLEN(p)),
|
585
|
-
(UChar* )CURPTR(p),
|
586
|
-
(UChar* )(CURPTR(p) + S_RESTLEN(p)),
|
587
|
-
&(p->regs),
|
588
|
-
ONIG_OPTION_NONE);
|
589
|
-
}
|
590
|
-
if (!tmpreg) RREGEXP(pattern)->usecnt--;
|
591
|
-
if (tmpreg) {
|
592
|
-
if (RREGEXP(pattern)->usecnt) {
|
593
|
-
onig_free(re);
|
594
|
-
}
|
595
|
-
else {
|
596
|
-
onig_free(RREGEXP_PTR(pattern));
|
597
|
-
RREGEXP_PTR(pattern) = re;
|
598
|
-
}
|
599
|
-
}
|
626
|
+
OnigPosition ret = rb_reg_onig_match(pattern,
|
627
|
+
p->str,
|
628
|
+
headonly ? strscan_match : strscan_search,
|
629
|
+
(void *)p,
|
630
|
+
&(p->regs));
|
600
631
|
|
601
|
-
if (ret ==
|
602
|
-
if (ret < 0) {
|
603
|
-
/* not matched */
|
632
|
+
if (ret == ONIG_MISMATCH) {
|
604
633
|
return Qnil;
|
605
634
|
}
|
606
635
|
}
|
@@ -1214,10 +1243,10 @@ strscan_size(VALUE self)
|
|
1214
1243
|
* If nothing was priorly matched, it returns nil.
|
1215
1244
|
*
|
1216
1245
|
* s = StringScanner.new("Fri Dec 12 1975 14:39")
|
1217
|
-
* s.scan(/(\w+) (\w+) (\d+)
|
1218
|
-
* s.captures
|
1219
|
-
* s.scan(/(\w+) (\w+) (\d+)
|
1220
|
-
* s.captures
|
1246
|
+
* s.scan(/(\w+) (\w+) (\d+) (1980)?/) # -> "Fri Dec 12 "
|
1247
|
+
* s.captures # -> ["Fri", "Dec", "12", nil]
|
1248
|
+
* s.scan(/(\w+) (\w+) (\d+) (1980)?/) # -> nil
|
1249
|
+
* s.captures # -> nil
|
1221
1250
|
*/
|
1222
1251
|
static VALUE
|
1223
1252
|
strscan_captures(VALUE self)
|
@@ -1233,9 +1262,13 @@ strscan_captures(VALUE self)
|
|
1233
1262
|
new_ary = rb_ary_new2(num_regs);
|
1234
1263
|
|
1235
1264
|
for (i = 1; i < num_regs; i++) {
|
1236
|
-
VALUE str
|
1237
|
-
|
1238
|
-
|
1265
|
+
VALUE str;
|
1266
|
+
if (p->regs.beg[i] == -1)
|
1267
|
+
str = Qnil;
|
1268
|
+
else
|
1269
|
+
str = extract_range(p,
|
1270
|
+
adjust_register_position(p, p->regs.beg[i]),
|
1271
|
+
adjust_register_position(p, p->regs.end[i]));
|
1239
1272
|
rb_ary_push(new_ary, str);
|
1240
1273
|
}
|
1241
1274
|
|
@@ -1502,7 +1535,9 @@ strscan_named_captures(VALUE self)
|
|
1502
1535
|
named_captures_data data;
|
1503
1536
|
data.self = self;
|
1504
1537
|
data.captures = rb_hash_new();
|
1505
|
-
|
1538
|
+
if (!RB_NIL_P(p->regex)) {
|
1539
|
+
onig_foreach_name(RREGEXP_PTR(p->regex), named_captures_iter, &data);
|
1540
|
+
}
|
1506
1541
|
|
1507
1542
|
return data.captures;
|
1508
1543
|
}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: strscan
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.
|
4
|
+
version: 3.0.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Minero Aoki
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2024-01-12 00:00:00.000000000 Z
|
14
14
|
dependencies: []
|
15
15
|
description: Provides lexical scanning operations on a String.
|
16
16
|
email:
|