strscan 3.0.6 → 3.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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:
|