strscan 1.0.3 → 3.0.2.pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/ext/strscan/strscan.c +47 -49
  3. metadata +9 -35
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 126a67b7200ba8c3f3aeb661e55a30a37b23bdd9fe68c3f8ebfc4ad9f6c2cdcb
4
- data.tar.gz: d0fafda0d3353b100c32a1437ee58258742f914a2dbb49dfde267cb15974f9f5
3
+ metadata.gz: a9fd5b208e7aacf23888bbe6a3f8b935b094c1baef2ab4756b9e7b41804a1b8c
4
+ data.tar.gz: 709f8ad4e2d4d8832e2d85e1be00654f621312533646df6f5234f0cb9ea414db
5
5
  SHA512:
6
- metadata.gz: ef088b41a17fd9afbee17734527fa911aea8f5b16b6f4547efb6246648f1b81ce54c6c09ebddd8c1d5b9d8c02b997d9e12f83d32214a2f25bcb5854238ad9f0d
7
- data.tar.gz: 4d93362e2c96ffd62c8ccfdbfff4d77558d1948173901176ff80f0b0c12b272bd6787a6016146756bb71b19a68a00d6add0de3cb95086cec78142873584ff6c6
6
+ metadata.gz: 4a08b38d5075dee6450a14904b6e0220423247609d78e84e28272e1f257235d45d4902de656db61286d98e03dcfc1231a60174cdf5eb26b5e2b6735c59dda9a6
7
+ data.tar.gz: cc2b8c1637db23c98a590f1d20f59a56ac64b3372afba40dd7aee85fa98fe47708e40238d70ca322a9e93e4d89c216f82a7c9d545c7189e177b5b0e7d0feec77
@@ -4,8 +4,8 @@
4
4
  Copyright (c) 1999-2006 Minero Aoki
5
5
 
6
6
  This program is free software.
7
- You can distribute/modify this program under the terms of
8
- the Ruby License. For details, see the file COPYING.
7
+ You can redistribute this program under the terms of the Ruby's or 2-clause
8
+ BSD License. For details, see the COPYING and LICENSE.txt files.
9
9
  */
10
10
 
11
11
  #include "ruby/ruby.h"
@@ -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 "1.0.3"
25
+ #define STRSCAN_VERSION "3.0.2.pre1"
26
26
 
27
27
  /* =======================================================================
28
28
  Data Type Definitions
@@ -77,7 +77,6 @@ struct strscanner
77
77
  ======================================================================= */
78
78
 
79
79
  static inline long minl _((const long n, const long x));
80
- static VALUE infect _((VALUE str, struct strscanner *p));
81
80
  static VALUE extract_range _((struct strscanner *p, long beg_i, long end_i));
82
81
  static VALUE extract_beg_len _((struct strscanner *p, long beg_i, long len));
83
82
 
@@ -138,13 +137,6 @@ static VALUE inspect2 _((struct strscanner *p));
138
137
  Utils
139
138
  ======================================================================= */
140
139
 
141
- static VALUE
142
- infect(VALUE str, struct strscanner *p)
143
- {
144
- OBJ_INFECT(str, p->str);
145
- return str;
146
- }
147
-
148
140
  static VALUE
149
141
  str_new(struct strscanner *p, const char *ptr, long len)
150
142
  {
@@ -164,7 +156,7 @@ extract_range(struct strscanner *p, long beg_i, long end_i)
164
156
  {
165
157
  if (beg_i > S_LEN(p)) return Qnil;
166
158
  end_i = minl(end_i, S_LEN(p));
167
- return infect(str_new(p, S_PBEG(p) + beg_i, end_i - beg_i), p);
159
+ return str_new(p, S_PBEG(p) + beg_i, end_i - beg_i);
168
160
  }
169
161
 
170
162
  static VALUE
@@ -172,7 +164,7 @@ extract_beg_len(struct strscanner *p, long beg_i, long len)
172
164
  {
173
165
  if (beg_i > S_LEN(p)) return Qnil;
174
166
  len = minl(len, S_LEN(p) - beg_i);
175
- return infect(str_new(p, S_PBEG(p) + beg_i, len), p);
167
+ return str_new(p, S_PBEG(p) + beg_i, len);
176
168
  }
177
169
 
178
170
  /* =======================================================================
@@ -184,6 +176,7 @@ strscan_mark(void *ptr)
184
176
  {
185
177
  struct strscanner *p = ptr;
186
178
  rb_gc_mark(p->str);
179
+ rb_gc_mark(p->regex);
187
180
  }
188
181
 
189
182
  static void
@@ -220,6 +213,7 @@ strscan_s_allocate(VALUE klass)
220
213
  CLEAR_MATCH_STATUS(p);
221
214
  onig_region_init(&(p->regs));
222
215
  p->str = Qnil;
216
+ p->regex = Qnil;
223
217
  return obj;
224
218
  }
225
219
 
@@ -441,23 +435,20 @@ strscan_get_pos(VALUE self)
441
435
  *
442
436
  * In short, it's a 0-based index into the string.
443
437
  *
444
- * s = StringScanner.new("abcädeföghi")
445
- * s.charpos # -> 0
446
- * s.scan_until(/ä/) # -> "abcä"
447
- * s.pos # -> 5
448
- * s.charpos # -> 4
438
+ * s = StringScanner.new("abc\u00e4def\u00f6ghi")
439
+ * s.charpos # -> 0
440
+ * s.scan_until(/\u00e4/) # -> "abc\u00E4"
441
+ * s.pos # -> 5
442
+ * s.charpos # -> 4
449
443
  */
450
444
  static VALUE
451
445
  strscan_get_charpos(VALUE self)
452
446
  {
453
447
  struct strscanner *p;
454
- VALUE substr;
455
448
 
456
449
  GET_SCANNER(self, p);
457
450
 
458
- substr = rb_funcall(p->str, id_byteslice, 2, INT2FIX(0), INT2NUM(p->curr));
459
-
460
- return rb_str_length(substr);
451
+ return LONG2NUM(rb_enc_strlen(S_PBEG(p), CURPTR(p), rb_enc_get(p->str)));
461
452
  }
462
453
 
463
454
  /*
@@ -481,7 +472,7 @@ strscan_set_pos(VALUE self, VALUE v)
481
472
  if (i < 0) rb_raise(rb_eRangeError, "index out of range");
482
473
  if (i > S_LEN(p)) rb_raise(rb_eRangeError, "index out of range");
483
474
  p->curr = i;
484
- return INT2NUM(i);
475
+ return LONG2NUM(i);
485
476
  }
486
477
 
487
478
  static inline UChar *
@@ -499,13 +490,17 @@ match_target(struct strscanner *p)
499
490
  static inline void
500
491
  set_registers(struct strscanner *p, size_t length)
501
492
  {
502
- onig_region_clear(&(p->regs));
493
+ const int at = 0;
494
+ OnigRegion *regs = &(p->regs);
495
+ onig_region_clear(regs);
496
+ if (onig_region_set(regs, at, 0, 0)) return;
503
497
  if (p->fixed_anchor_p) {
504
- onig_region_set(&(p->regs), 0, p->curr, p->curr + length);
498
+ regs->beg[at] = p->curr;
499
+ regs->end[at] = p->curr + length;
505
500
  }
506
501
  else
507
502
  {
508
- onig_region_set(&(p->regs), 0, 0, length);
503
+ regs->end[at] = length;
509
504
  }
510
505
  }
511
506
 
@@ -852,9 +847,8 @@ adjust_registers_to_matched(struct strscanner *p)
852
847
  * s.getch # => "b"
853
848
  * s.getch # => nil
854
849
  *
855
- * $KCODE = 'EUC'
856
- * s = StringScanner.new("\244\242")
857
- * s.getch # => "\244\242" # Japanese hira-kana "A" in EUC-JP
850
+ * s = StringScanner.new("\244\242".force_encoding("euc-jp"))
851
+ * s.getch # => "\x{A4A2}" # Japanese hira-kana "A" in EUC-JP
858
852
  * s.getch # => nil
859
853
  */
860
854
  static VALUE
@@ -889,10 +883,9 @@ strscan_getch(VALUE self)
889
883
  * s.get_byte # => "b"
890
884
  * s.get_byte # => nil
891
885
  *
892
- * $KCODE = 'EUC'
893
- * s = StringScanner.new("\244\242")
894
- * s.get_byte # => "\244"
895
- * s.get_byte # => "\242"
886
+ * s = StringScanner.new("\244\242".force_encoding("euc-jp"))
887
+ * s.get_byte # => "\xA4"
888
+ * s.get_byte # => "\xA2"
896
889
  * s.get_byte # => nil
897
890
  */
898
891
  static VALUE
@@ -946,7 +939,7 @@ strscan_peek(VALUE self, VALUE vlen)
946
939
 
947
940
  len = NUM2LONG(vlen);
948
941
  if (EOS_P(p))
949
- return infect(str_new(p, "", 0), p);
942
+ return str_new(p, "", 0);
950
943
 
951
944
  len = minl(len, S_RESTLEN(p));
952
945
  return extract_beg_len(p, p->curr, len);
@@ -988,7 +981,7 @@ strscan_unscan(VALUE self)
988
981
  }
989
982
 
990
983
  /*
991
- * Returns +true+ iff the scan pointer is at the beginning of the line.
984
+ * Returns +true+ if and only if the scan pointer is at the beginning of the line.
992
985
  *
993
986
  * s = StringScanner.new("test\ntest\n")
994
987
  * s.bol? # => true
@@ -1041,7 +1034,7 @@ strscan_empty_p(VALUE self)
1041
1034
  }
1042
1035
 
1043
1036
  /*
1044
- * Returns true iff there is more data in the string. See #eos?.
1037
+ * Returns true if and only if there is more data in the string. See #eos?.
1045
1038
  * This method is obsolete; use #eos? instead.
1046
1039
  *
1047
1040
  * s = StringScanner.new('test string')
@@ -1058,7 +1051,7 @@ strscan_rest_p(VALUE self)
1058
1051
  }
1059
1052
 
1060
1053
  /*
1061
- * Returns +true+ iff the last match was successful.
1054
+ * Returns +true+ if and only if the last match was successful.
1062
1055
  *
1063
1056
  * s = StringScanner.new('test string')
1064
1057
  * s.match?(/\w+/) # => 4
@@ -1095,8 +1088,9 @@ strscan_matched(VALUE self)
1095
1088
  }
1096
1089
 
1097
1090
  /*
1098
- * Returns the size of the most recent match (see #matched), or +nil+ if there
1099
- * was no recent match.
1091
+ * Returns the size of the most recent match in bytes, or +nil+ if there
1092
+ * was no recent match. This is different than <tt>matched.size</tt>,
1093
+ * which will return the size in characters.
1100
1094
  *
1101
1095
  * s = StringScanner.new('test string')
1102
1096
  * s.check /\w+/ # -> "test"
@@ -1111,7 +1105,7 @@ strscan_matched_size(VALUE self)
1111
1105
 
1112
1106
  GET_SCANNER(self, p);
1113
1107
  if (! MATCHED_P(p)) return Qnil;
1114
- return INT2NUM(p->regs.end[0] - p->regs.beg[0]);
1108
+ return LONG2NUM(p->regs.end[0] - p->regs.beg[0]);
1115
1109
  }
1116
1110
 
1117
1111
  static int
@@ -1173,7 +1167,7 @@ strscan_aref(VALUE self, VALUE idx)
1173
1167
  idx = rb_sym2str(idx);
1174
1168
  /* fall through */
1175
1169
  case T_STRING:
1176
- if (!p->regex) return Qnil;
1170
+ if (!RTEST(p->regex)) return Qnil;
1177
1171
  RSTRING_GETMEM(idx, name, i);
1178
1172
  i = name_to_backref_number(&(p->regs), p->regex, name, name + i, rb_enc_get(idx));
1179
1173
  break;
@@ -1332,7 +1326,7 @@ strscan_rest(VALUE self)
1332
1326
 
1333
1327
  GET_SCANNER(self, p);
1334
1328
  if (EOS_P(p)) {
1335
- return infect(str_new(p, "", 0), p);
1329
+ return str_new(p, "", 0);
1336
1330
  }
1337
1331
  return extract_range(p, p->curr, S_LEN(p));
1338
1332
  }
@@ -1387,11 +1381,11 @@ strscan_inspect(VALUE self)
1387
1381
  p = check_strscan(self);
1388
1382
  if (NIL_P(p->str)) {
1389
1383
  a = rb_sprintf("#<%"PRIsVALUE" (uninitialized)>", rb_obj_class(self));
1390
- return infect(a, p);
1384
+ return a;
1391
1385
  }
1392
1386
  if (EOS_P(p)) {
1393
1387
  a = rb_sprintf("#<%"PRIsVALUE" fin>", rb_obj_class(self));
1394
- return infect(a, p);
1388
+ return a;
1395
1389
  }
1396
1390
  if (p->curr == 0) {
1397
1391
  b = inspect2(p);
@@ -1399,7 +1393,7 @@ strscan_inspect(VALUE self)
1399
1393
  rb_obj_class(self),
1400
1394
  p->curr, S_LEN(p),
1401
1395
  b);
1402
- return infect(a, p);
1396
+ return a;
1403
1397
  }
1404
1398
  a = inspect1(p);
1405
1399
  b = inspect2(p);
@@ -1407,7 +1401,7 @@ strscan_inspect(VALUE self)
1407
1401
  rb_obj_class(self),
1408
1402
  p->curr, S_LEN(p),
1409
1403
  a, b);
1410
- return infect(a, p);
1404
+ return a;
1411
1405
  }
1412
1406
 
1413
1407
  static VALUE
@@ -1540,7 +1534,7 @@ strscan_fixed_anchor_p(VALUE self)
1540
1534
  *
1541
1535
  * === Finding Where we Are
1542
1536
  *
1543
- * - #beginning_of_line? (#bol?)
1537
+ * - #beginning_of_line? (<tt>#bol?</tt>)
1544
1538
  * - #eos?
1545
1539
  * - #rest?
1546
1540
  * - #rest_size
@@ -1557,13 +1551,13 @@ strscan_fixed_anchor_p(VALUE self)
1557
1551
  * - #matched
1558
1552
  * - #matched?
1559
1553
  * - #matched_size
1560
- * - []
1554
+ * - <tt>#[]</tt>
1561
1555
  * - #pre_match
1562
1556
  * - #post_match
1563
1557
  *
1564
1558
  * === Miscellaneous
1565
1559
  *
1566
- * - <<
1560
+ * - <tt><<</tt>
1567
1561
  * - #concat
1568
1562
  * - #string
1569
1563
  * - #string=
@@ -1574,6 +1568,10 @@ strscan_fixed_anchor_p(VALUE self)
1574
1568
  void
1575
1569
  Init_strscan(void)
1576
1570
  {
1571
+ #ifdef HAVE_RB_EXT_RACTOR_SAFE
1572
+ rb_ext_ractor_safe(true);
1573
+ #endif
1574
+
1577
1575
  #undef rb_intern
1578
1576
  ID id_scanerr = rb_intern("ScanError");
1579
1577
  VALUE tmp;
metadata CHANGED
@@ -1,48 +1,22 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: strscan
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 3.0.2.pre1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Minero Aoki
8
8
  - Sutou Kouhei
9
+ - Charles Oliver Nutter
9
10
  autorequire:
10
11
  bindir: bin
11
12
  cert_chain: []
12
- date: 2019-10-13 00:00:00.000000000 Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
15
- name: rake-compiler
16
- requirement: !ruby/object:Gem::Requirement
17
- requirements:
18
- - - ">="
19
- - !ruby/object:Gem::Version
20
- version: '0'
21
- type: :development
22
- prerelease: false
23
- version_requirements: !ruby/object:Gem::Requirement
24
- requirements:
25
- - - ">="
26
- - !ruby/object:Gem::Version
27
- version: '0'
28
- - !ruby/object:Gem::Dependency
29
- name: benchmark-driver
30
- requirement: !ruby/object:Gem::Requirement
31
- requirements:
32
- - - ">="
33
- - !ruby/object:Gem::Version
34
- version: '0'
35
- type: :development
36
- prerelease: false
37
- version_requirements: !ruby/object:Gem::Requirement
38
- requirements:
39
- - - ">="
40
- - !ruby/object:Gem::Version
41
- version: '0'
13
+ date: 2022-04-19 00:00:00.000000000 Z
14
+ dependencies: []
42
15
  description: Provides lexical scanning operations on a String.
43
16
  email:
44
17
  -
45
18
  - kou@cozmixng.org
19
+ - headius@headius.com
46
20
  executables: []
47
21
  extensions:
48
22
  - ext/strscan/extconf.rb
@@ -52,6 +26,7 @@ files:
52
26
  - ext/strscan/strscan.c
53
27
  homepage: https://github.com/ruby/strscan
54
28
  licenses:
29
+ - Ruby
55
30
  - BSD-2-Clause
56
31
  metadata: {}
57
32
  post_install_message:
@@ -65,12 +40,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
65
40
  version: 2.4.0
66
41
  required_rubygems_version: !ruby/object:Gem::Requirement
67
42
  requirements:
68
- - - ">="
43
+ - - ">"
69
44
  - !ruby/object:Gem::Version
70
- version: '0'
45
+ version: 1.3.1
71
46
  requirements: []
72
- rubyforge_project:
73
- rubygems_version: 2.7.6.2
47
+ rubygems_version: 3.3.7
74
48
  signing_key:
75
49
  specification_version: 4
76
50
  summary: Provides lexical scanning operations on a String.