stringio 3.1.0 → 3.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.document +5 -0
- data/.rdoc_options +2 -0
- data/COPYING +56 -0
- data/LICENSE.txt +22 -0
- data/NEWS.md +166 -0
- data/README.md +1 -1
- data/docs/io.rb +8 -0
- data/ext/stringio/.document +1 -0
- data/ext/stringio/stringio.c +114 -74
- metadata +19 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0f8291051ef78bfdd817200ff02c25db3e2fa495d9b4a164c9737511d6eadb38
|
4
|
+
data.tar.gz: 8593995f8dbb66e6a3dc9f2755f97d0cc05e2d363e6cd027cc15a7d46deaf60f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5060643c29e66ccc88df7a7ab4c19943d89ce3779641b9be7e0cfc61ce79db7c53af06367875b1892b80f31d98be32d10da2590445cb86425b7d89f285a30b5f
|
7
|
+
data.tar.gz: 1a6dcf694eaa38dd0d939b8db9cb4f29cc96db93ac545f5f06d6354ad5e75f92fb9807f529f54ae6801a3f791e7139db7ad371bf8efd6b7ca34f45f61fb10429
|
data/.rdoc_options
ADDED
data/COPYING
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
Ruby is copyrighted free software by Yukihiro Matsumoto <matz@netlab.jp>.
|
2
|
+
You can redistribute it and/or modify it under either the terms of the
|
3
|
+
2-clause BSDL (see the file BSDL), or the conditions below:
|
4
|
+
|
5
|
+
1. You may make and give away verbatim copies of the source form of the
|
6
|
+
software without restriction, provided that you duplicate all of the
|
7
|
+
original copyright notices and associated disclaimers.
|
8
|
+
|
9
|
+
2. You may modify your copy of the software in any way, provided that
|
10
|
+
you do at least ONE of the following:
|
11
|
+
|
12
|
+
a. place your modifications in the Public Domain or otherwise
|
13
|
+
make them Freely Available, such as by posting said
|
14
|
+
modifications to Usenet or an equivalent medium, or by allowing
|
15
|
+
the author to include your modifications in the software.
|
16
|
+
|
17
|
+
b. use the modified software only within your corporation or
|
18
|
+
organization.
|
19
|
+
|
20
|
+
c. give non-standard binaries non-standard names, with
|
21
|
+
instructions on where to get the original software distribution.
|
22
|
+
|
23
|
+
d. make other distribution arrangements with the author.
|
24
|
+
|
25
|
+
3. You may distribute the software in object code or binary form,
|
26
|
+
provided that you do at least ONE of the following:
|
27
|
+
|
28
|
+
a. distribute the binaries and library files of the software,
|
29
|
+
together with instructions (in the manual page or equivalent)
|
30
|
+
on where to get the original distribution.
|
31
|
+
|
32
|
+
b. accompany the distribution with the machine-readable source of
|
33
|
+
the software.
|
34
|
+
|
35
|
+
c. give non-standard binaries non-standard names, with
|
36
|
+
instructions on where to get the original software distribution.
|
37
|
+
|
38
|
+
d. make other distribution arrangements with the author.
|
39
|
+
|
40
|
+
4. You may modify and include the part of the software into any other
|
41
|
+
software (possibly commercial). But some files in the distribution
|
42
|
+
are not written by the author, so that they are not under these terms.
|
43
|
+
|
44
|
+
For the list of those files and their copying conditions, see the
|
45
|
+
file LEGAL.
|
46
|
+
|
47
|
+
5. The scripts and library files supplied as input to or produced as
|
48
|
+
output from the software do not automatically fall under the
|
49
|
+
copyright of the software, but belong to whomever generated them,
|
50
|
+
and may be sold commercially, and may be aggregated with this
|
51
|
+
software.
|
52
|
+
|
53
|
+
6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
|
54
|
+
IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
55
|
+
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
56
|
+
PURPOSE.
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (C) 1993-2013 Yukihiro Matsumoto. All rights reserved.
|
2
|
+
|
3
|
+
Redistribution and use in source and binary forms, with or without
|
4
|
+
modification, are permitted provided that the following conditions
|
5
|
+
are met:
|
6
|
+
1. Redistributions of source code must retain the above copyright
|
7
|
+
notice, this list of conditions and the following disclaimer.
|
8
|
+
2. Redistributions in binary form must reproduce the above copyright
|
9
|
+
notice, this list of conditions and the following disclaimer in the
|
10
|
+
documentation and/or other materials provided with the distribution.
|
11
|
+
|
12
|
+
THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
13
|
+
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
14
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
15
|
+
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
16
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
17
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
18
|
+
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
19
|
+
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
20
|
+
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
21
|
+
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
22
|
+
SUCH DAMAGE.
|
data/NEWS.md
ADDED
@@ -0,0 +1,166 @@
|
|
1
|
+
# News
|
2
|
+
|
3
|
+
## 3.1.1 - 2024-06-13
|
4
|
+
|
5
|
+
### Improvements
|
6
|
+
|
7
|
+
* JRuby: Improved.
|
8
|
+
* GH-83
|
9
|
+
* GH-84
|
10
|
+
* GH-85
|
11
|
+
|
12
|
+
* Added `StringIO::MAX_LENGTH`.
|
13
|
+
|
14
|
+
* Added support for NULL `StringIO` by `StringIO.new(nil)`.
|
15
|
+
|
16
|
+
* Improved IO compatibility for partial read.
|
17
|
+
* GH-95
|
18
|
+
* https://bugs.ruby-lang.org/issues/20418
|
19
|
+
|
20
|
+
### Fixes
|
21
|
+
|
22
|
+
* Fixed a bug that coderange isn't updated after overwrite.
|
23
|
+
* Reported by Tiago Cardoso.
|
24
|
+
* https://bugs.ruby-lang.org/issues/20185
|
25
|
+
* GH-77
|
26
|
+
* GH-79
|
27
|
+
|
28
|
+
### Thanks
|
29
|
+
|
30
|
+
* Tiago Cardoso
|
31
|
+
|
32
|
+
## 3.1.0 - 2023-11-28
|
33
|
+
|
34
|
+
### Fixes
|
35
|
+
|
36
|
+
* TruffleRuby: Do not compile the C extension
|
37
|
+
|
38
|
+
GH-71
|
39
|
+
|
40
|
+
## 3.0.9 - 2023-11-08
|
41
|
+
|
42
|
+
### Improvements
|
43
|
+
|
44
|
+
* JRuby: Aligned `StringIO#gets` behavior with the C implementation.
|
45
|
+
|
46
|
+
GH-61
|
47
|
+
|
48
|
+
### Fixes
|
49
|
+
|
50
|
+
* CRuby: Fixed `StringIO#pread` with the length 0.
|
51
|
+
|
52
|
+
Patch by Jean byroot Boussier.
|
53
|
+
|
54
|
+
GH-67
|
55
|
+
|
56
|
+
* CRuby: Fixed a bug that `StringIO#gets` with non ASCII compatible
|
57
|
+
encoding such as UTF-16 doesn't detect correct new line characters.
|
58
|
+
|
59
|
+
Reported by IWAMOTO Kouichi.
|
60
|
+
|
61
|
+
GH-68
|
62
|
+
|
63
|
+
### Thanks
|
64
|
+
|
65
|
+
* Jean byroot Boussier
|
66
|
+
|
67
|
+
* IWAMOTO Kouichi
|
68
|
+
|
69
|
+
## 3.0.8 - 2023-08-10
|
70
|
+
|
71
|
+
### Improvements
|
72
|
+
|
73
|
+
* Added `StringIO#pread`.
|
74
|
+
|
75
|
+
Patch by Jean byroot Boussier.
|
76
|
+
|
77
|
+
GH-56
|
78
|
+
|
79
|
+
* JRuby: Added `StringIO::VERSION`.
|
80
|
+
|
81
|
+
GH-57 GH-59
|
82
|
+
|
83
|
+
### Thanks
|
84
|
+
|
85
|
+
* Jean byroot Boussier
|
86
|
+
|
87
|
+
## 3.0.7 - 2023-06-02
|
88
|
+
|
89
|
+
* CRuby: Avoid direct struct usage. This change is for supporting
|
90
|
+
Ruby 3.3.
|
91
|
+
|
92
|
+
GH-54
|
93
|
+
|
94
|
+
## 3.0.6 - 2023-04-14
|
95
|
+
|
96
|
+
### Improvements
|
97
|
+
|
98
|
+
* CRuby: Added support for write barrier.
|
99
|
+
|
100
|
+
* JRuby: Added missing arty-checking.
|
101
|
+
|
102
|
+
GH-48
|
103
|
+
|
104
|
+
* JRuby: Added support for `StringIO.new(encoding:)`.
|
105
|
+
|
106
|
+
GH-45
|
107
|
+
|
108
|
+
## 3.0.5 - 2023-02-02
|
109
|
+
|
110
|
+
### Improvements
|
111
|
+
|
112
|
+
### Fixes
|
113
|
+
|
114
|
+
* Fixed a bug that `StringIO#gets("2+ character", chomp: true)` did not
|
115
|
+
remove the separator at the end.
|
116
|
+
[[Bug #19389](https://bugs.ruby-lang.org/issues/19389)]
|
117
|
+
|
118
|
+
## 3.0.4 - 2022-12-09
|
119
|
+
|
120
|
+
### Improvements
|
121
|
+
|
122
|
+
* JRuby: Changed to use flag registry.
|
123
|
+
[[GitHub#33](https://github.com/ruby/stringio/pull/26)]
|
124
|
+
|
125
|
+
## 3.0.3 - 2022-12-08
|
126
|
+
|
127
|
+
### Improvements
|
128
|
+
|
129
|
+
* Improved documents.
|
130
|
+
[[GitHub#33](https://github.com/ruby/stringio/pull/33)]
|
131
|
+
[[GitHub#34](https://github.com/ruby/stringio/pull/34)]
|
132
|
+
[[GitHub#35](https://github.com/ruby/stringio/pull/35)]
|
133
|
+
[[GitHub#36](https://github.com/ruby/stringio/pull/36)]
|
134
|
+
[[GitHub#37](https://github.com/ruby/stringio/pull/37)]
|
135
|
+
[Patch by Burdette Lamar]
|
136
|
+
|
137
|
+
### Fixes
|
138
|
+
|
139
|
+
* Fixed a bug that large `StringIO#ungetc`/`StringIO#ungetbyte`
|
140
|
+
break internal buffer.
|
141
|
+
|
142
|
+
* Fixed a bug that `StringIO#each("2+ character", chomp: true)` cause
|
143
|
+
infinite loop.
|
144
|
+
[[Bug #18769](https://bugs.ruby-lang.org/issues/18769)]
|
145
|
+
|
146
|
+
* Fixed a bug that `StringIO#each(nil, chomp: true)` chomps.
|
147
|
+
[[Bug #18770](https://bugs.ruby-lang.org/issues/18770)]
|
148
|
+
|
149
|
+
* Fixed a bug that `StringIO#each("", chomp: true)` isn't compatible
|
150
|
+
with `IO#each("", chomp: true)`.
|
151
|
+
[[Bug #18768](https://bugs.ruby-lang.org/issues/18768)]
|
152
|
+
|
153
|
+
* Fixed a bug that `StringIO#set_encoding` doesn't accept external
|
154
|
+
and internal encodings pairo.
|
155
|
+
[[GitHub#16](https://github.com/ruby/stringio/issues/16)]
|
156
|
+
[Reported by Kenta Murata]
|
157
|
+
|
158
|
+
* Fixed a bug that `StringIO#truncate` isn't compatible with
|
159
|
+
`File#truncate`.
|
160
|
+
|
161
|
+
### Thanks
|
162
|
+
|
163
|
+
* Kenta Murata
|
164
|
+
|
165
|
+
* Burdette Lamar
|
166
|
+
|
data/README.md
CHANGED
@@ -12,7 +12,7 @@ This library is based on MoonWolf version written in Ruby. Thanks a lot.
|
|
12
12
|
|
13
13
|
* `fileno` raises `NotImplementedError`.
|
14
14
|
* encoding conversion is not implemented, and ignored silently.
|
15
|
-
* there is no `#to_io` method because this is not an `IO
|
15
|
+
* there is no `#to_io` method because this is not an `IO`.
|
16
16
|
|
17
17
|
## Installation
|
18
18
|
|
data/docs/io.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
*.[ch]
|
data/ext/stringio/stringio.c
CHANGED
@@ -13,7 +13,9 @@
|
|
13
13
|
**********************************************************************/
|
14
14
|
|
15
15
|
static const char *const
|
16
|
-
STRINGIO_VERSION = "3.1.
|
16
|
+
STRINGIO_VERSION = "3.1.1";
|
17
|
+
|
18
|
+
#include <stdbool.h>
|
17
19
|
|
18
20
|
#include "ruby.h"
|
19
21
|
#include "ruby/io.h"
|
@@ -48,7 +50,13 @@ static long strio_write(VALUE self, VALUE str);
|
|
48
50
|
|
49
51
|
#define IS_STRIO(obj) (rb_typeddata_is_kind_of((obj), &strio_data_type))
|
50
52
|
#define error_inval(msg) (rb_syserr_fail(EINVAL, msg))
|
51
|
-
#define get_enc(ptr) ((ptr)->enc ? (ptr)->enc : rb_enc_get((ptr)->string))
|
53
|
+
#define get_enc(ptr) ((ptr)->enc ? (ptr)->enc : !NIL_P((ptr)->string) ? rb_enc_get((ptr)->string) : NULL)
|
54
|
+
|
55
|
+
static bool
|
56
|
+
readonly_string_p(VALUE string)
|
57
|
+
{
|
58
|
+
return OBJ_FROZEN_RAW(string);
|
59
|
+
}
|
52
60
|
|
53
61
|
static struct StringIO *
|
54
62
|
strio_alloc(void)
|
@@ -166,7 +174,10 @@ writable(VALUE strio)
|
|
166
174
|
static void
|
167
175
|
check_modifiable(struct StringIO *ptr)
|
168
176
|
{
|
169
|
-
if (
|
177
|
+
if (NIL_P(ptr->string)) {
|
178
|
+
/* Null device StringIO */
|
179
|
+
}
|
180
|
+
else if (OBJ_FROZEN_RAW(ptr->string)) {
|
170
181
|
rb_raise(rb_eIOError, "not modifiable string");
|
171
182
|
}
|
172
183
|
}
|
@@ -281,13 +292,14 @@ strio_init(int argc, VALUE *argv, struct StringIO *ptr, VALUE self)
|
|
281
292
|
|
282
293
|
argc = rb_scan_args(argc, argv, "02:", &string, &vmode, &opt);
|
283
294
|
rb_io_extract_modeenc(&vmode, 0, opt, &oflags, &ptr->flags, &convconfig);
|
284
|
-
if (
|
295
|
+
if (!NIL_P(string)) {
|
285
296
|
StringValue(string);
|
286
297
|
}
|
287
|
-
else {
|
298
|
+
else if (!argc) {
|
288
299
|
string = rb_enc_str_new("", 0, rb_default_external_encoding());
|
289
300
|
}
|
290
|
-
|
301
|
+
|
302
|
+
if (!NIL_P(string) && readonly_string_p(string)) {
|
291
303
|
if (ptr->flags & FMODE_WRITABLE) {
|
292
304
|
rb_syserr_fail(EACCES, 0);
|
293
305
|
}
|
@@ -297,11 +309,11 @@ strio_init(int argc, VALUE *argv, struct StringIO *ptr, VALUE self)
|
|
297
309
|
ptr->flags |= FMODE_WRITABLE;
|
298
310
|
}
|
299
311
|
}
|
300
|
-
if (ptr->flags & FMODE_TRUNC) {
|
312
|
+
if (!NIL_P(string) && (ptr->flags & FMODE_TRUNC)) {
|
301
313
|
rb_str_resize(string, 0);
|
302
314
|
}
|
303
315
|
RB_OBJ_WRITE(self, &ptr->string, string);
|
304
|
-
if (argc == 1) {
|
316
|
+
if (argc == 1 && !NIL_P(string)) {
|
305
317
|
ptr->enc = rb_enc_get(string);
|
306
318
|
}
|
307
319
|
else {
|
@@ -481,7 +493,7 @@ strio_set_string(VALUE self, VALUE string)
|
|
481
493
|
rb_io_taint_check(self);
|
482
494
|
ptr->flags &= ~FMODE_READWRITE;
|
483
495
|
StringValue(string);
|
484
|
-
ptr->flags =
|
496
|
+
ptr->flags = readonly_string_p(string) ? FMODE_READABLE : FMODE_READWRITE;
|
485
497
|
ptr->pos = 0;
|
486
498
|
ptr->lineno = 0;
|
487
499
|
RB_OBJ_WRITE(self, &ptr->string, string);
|
@@ -595,6 +607,7 @@ static struct StringIO *
|
|
595
607
|
strio_to_read(VALUE self)
|
596
608
|
{
|
597
609
|
struct StringIO *ptr = readable(self);
|
610
|
+
if (NIL_P(ptr->string)) return NULL;
|
598
611
|
if (ptr->pos < RSTRING_LEN(ptr->string)) return ptr;
|
599
612
|
return NULL;
|
600
613
|
}
|
@@ -872,7 +885,7 @@ strio_getc(VALUE self)
|
|
872
885
|
int len;
|
873
886
|
char *p;
|
874
887
|
|
875
|
-
if (pos >= RSTRING_LEN(str)) {
|
888
|
+
if (NIL_P(str) || pos >= RSTRING_LEN(str)) {
|
876
889
|
return Qnil;
|
877
890
|
}
|
878
891
|
p = RSTRING_PTR(str)+pos;
|
@@ -893,7 +906,7 @@ strio_getbyte(VALUE self)
|
|
893
906
|
{
|
894
907
|
struct StringIO *ptr = readable(self);
|
895
908
|
int c;
|
896
|
-
if (ptr->pos >= RSTRING_LEN(ptr->string)) {
|
909
|
+
if (NIL_P(ptr->string) || ptr->pos >= RSTRING_LEN(ptr->string)) {
|
897
910
|
return Qnil;
|
898
911
|
}
|
899
912
|
c = RSTRING_PTR(ptr->string)[ptr->pos++];
|
@@ -915,9 +928,6 @@ strio_extend(struct StringIO *ptr, long pos, long len)
|
|
915
928
|
if (pos > olen)
|
916
929
|
MEMZERO(RSTRING_PTR(ptr->string) + olen, char, pos - olen);
|
917
930
|
}
|
918
|
-
else {
|
919
|
-
rb_str_modify(ptr->string);
|
920
|
-
}
|
921
931
|
}
|
922
932
|
|
923
933
|
/*
|
@@ -934,6 +944,7 @@ strio_ungetc(VALUE self, VALUE c)
|
|
934
944
|
rb_encoding *enc, *enc2;
|
935
945
|
|
936
946
|
check_modifiable(ptr);
|
947
|
+
if (NIL_P(ptr->string)) return Qnil;
|
937
948
|
if (NIL_P(c)) return Qnil;
|
938
949
|
if (RB_INTEGER_TYPE_P(c)) {
|
939
950
|
int len, cc = NUM2INT(c);
|
@@ -971,12 +982,13 @@ strio_ungetbyte(VALUE self, VALUE c)
|
|
971
982
|
struct StringIO *ptr = readable(self);
|
972
983
|
|
973
984
|
check_modifiable(ptr);
|
985
|
+
if (NIL_P(ptr->string)) return Qnil;
|
974
986
|
if (NIL_P(c)) return Qnil;
|
975
987
|
if (RB_INTEGER_TYPE_P(c)) {
|
976
|
-
|
977
|
-
|
978
|
-
|
979
|
-
|
988
|
+
/* rb_int_and() not visible from exts */
|
989
|
+
VALUE v = rb_funcall(c, '&', 1, INT2FIX(0xff));
|
990
|
+
const char cc = NUM2INT(v) & 0xFF;
|
991
|
+
strio_unget_bytes(ptr, &cc, 1);
|
980
992
|
}
|
981
993
|
else {
|
982
994
|
long cl;
|
@@ -1157,41 +1169,41 @@ prepare_getline_args(struct StringIO *ptr, struct getline_arg *arg, int argc, VA
|
|
1157
1169
|
break;
|
1158
1170
|
|
1159
1171
|
case 1:
|
1160
|
-
|
1161
|
-
|
1172
|
+
if (!NIL_P(rs) && !RB_TYPE_P(rs, T_STRING)) {
|
1173
|
+
VALUE tmp = rb_check_string_type(rs);
|
1162
1174
|
if (NIL_P(tmp)) {
|
1163
|
-
|
1164
|
-
|
1175
|
+
limit = NUM2LONG(rs);
|
1176
|
+
rs = rb_rs;
|
1165
1177
|
}
|
1166
1178
|
else {
|
1167
|
-
|
1179
|
+
rs = tmp;
|
1168
1180
|
}
|
1169
1181
|
}
|
1170
1182
|
break;
|
1171
1183
|
|
1172
1184
|
case 2:
|
1173
|
-
|
1185
|
+
if (!NIL_P(rs)) StringValue(rs);
|
1174
1186
|
if (!NIL_P(lim)) limit = NUM2LONG(lim);
|
1175
1187
|
break;
|
1176
1188
|
}
|
1177
|
-
if (!NIL_P(rs)) {
|
1178
|
-
|
1179
|
-
|
1180
|
-
|
1181
|
-
|
1182
|
-
|
1183
|
-
|
1184
|
-
|
1185
|
-
|
1186
|
-
|
1187
|
-
|
1188
|
-
|
1189
|
-
|
1190
|
-
|
1191
|
-
|
1192
|
-
|
1193
|
-
|
1194
|
-
|
1189
|
+
if (!NIL_P(ptr->string) && !NIL_P(rs)) {
|
1190
|
+
rb_encoding *enc_rs, *enc_io;
|
1191
|
+
enc_rs = rb_enc_get(rs);
|
1192
|
+
enc_io = get_enc(ptr);
|
1193
|
+
if (enc_rs != enc_io &&
|
1194
|
+
(rb_enc_str_coderange(rs) != ENC_CODERANGE_7BIT ||
|
1195
|
+
(RSTRING_LEN(rs) > 0 && !rb_enc_asciicompat(enc_io)))) {
|
1196
|
+
if (rs == rb_rs) {
|
1197
|
+
rs = rb_enc_str_new(0, 0, enc_io);
|
1198
|
+
rb_str_buf_cat_ascii(rs, "\n");
|
1199
|
+
rs = rs;
|
1200
|
+
}
|
1201
|
+
else {
|
1202
|
+
rb_raise(rb_eArgError, "encoding mismatch: %s IO with %s RS",
|
1203
|
+
rb_enc_name(enc_io),
|
1204
|
+
rb_enc_name(enc_rs));
|
1205
|
+
}
|
1206
|
+
}
|
1195
1207
|
}
|
1196
1208
|
arg->rs = rs;
|
1197
1209
|
arg->limit = limit;
|
@@ -1203,9 +1215,9 @@ prepare_getline_args(struct StringIO *ptr, struct getline_arg *arg, int argc, VA
|
|
1203
1215
|
keywords[0] = rb_intern_const("chomp");
|
1204
1216
|
}
|
1205
1217
|
rb_get_kwargs(opts, keywords, 0, 1, &vchomp);
|
1206
|
-
|
1218
|
+
if (respect_chomp) {
|
1207
1219
|
arg->chomp = (vchomp != Qundef) && RTEST(vchomp);
|
1208
|
-
|
1220
|
+
}
|
1209
1221
|
}
|
1210
1222
|
return arg;
|
1211
1223
|
}
|
@@ -1229,7 +1241,7 @@ strio_getline(struct getline_arg *arg, struct StringIO *ptr)
|
|
1229
1241
|
long w = 0;
|
1230
1242
|
rb_encoding *enc = get_enc(ptr);
|
1231
1243
|
|
1232
|
-
if (ptr->pos >= (n = RSTRING_LEN(ptr->string))) {
|
1244
|
+
if (NIL_P(ptr->string) || ptr->pos >= (n = RSTRING_LEN(ptr->string))) {
|
1233
1245
|
return Qnil;
|
1234
1246
|
}
|
1235
1247
|
s = RSTRING_PTR(ptr->string);
|
@@ -1245,7 +1257,7 @@ strio_getline(struct getline_arg *arg, struct StringIO *ptr)
|
|
1245
1257
|
str = strio_substr(ptr, ptr->pos, e - s - w, enc);
|
1246
1258
|
}
|
1247
1259
|
else if ((n = RSTRING_LEN(str)) == 0) {
|
1248
|
-
|
1260
|
+
const char *paragraph_end = NULL;
|
1249
1261
|
p = s;
|
1250
1262
|
while (p[(p + 1 < e) && (*p == '\r') && 0] == '\n') {
|
1251
1263
|
p += *p == '\r';
|
@@ -1255,18 +1267,18 @@ strio_getline(struct getline_arg *arg, struct StringIO *ptr)
|
|
1255
1267
|
}
|
1256
1268
|
s = p;
|
1257
1269
|
while ((p = memchr(p, '\n', e - p)) && (p != e)) {
|
1258
|
-
|
1259
|
-
|
1260
|
-
|
1261
|
-
|
1262
|
-
|
1263
|
-
|
1264
|
-
|
1265
|
-
|
1266
|
-
|
1267
|
-
|
1268
|
-
|
1269
|
-
|
1270
|
+
p++;
|
1271
|
+
if (!((p < e && *p == '\n') ||
|
1272
|
+
(p + 1 < e && *p == '\r' && *(p+1) == '\n'))) {
|
1273
|
+
continue;
|
1274
|
+
}
|
1275
|
+
paragraph_end = p - ((*(p-2) == '\r') ? 2 : 1);
|
1276
|
+
while ((p < e && *p == '\n') ||
|
1277
|
+
(p + 1 < e && *p == '\r' && *(p+1) == '\n')) {
|
1278
|
+
p += (*p == '\r') ? 2 : 1;
|
1279
|
+
}
|
1280
|
+
e = p;
|
1281
|
+
break;
|
1270
1282
|
}
|
1271
1283
|
if (arg->chomp && paragraph_end) {
|
1272
1284
|
w = e - paragraph_end;
|
@@ -1326,6 +1338,7 @@ strio_gets(int argc, VALUE *argv, VALUE self)
|
|
1326
1338
|
VALUE str;
|
1327
1339
|
|
1328
1340
|
if (prepare_getline_args(ptr, &arg, argc, argv)->limit == 0) {
|
1341
|
+
if (NIL_P(ptr->string)) return Qnil;
|
1329
1342
|
return rb_enc_str_new(0, 0, get_enc(ptr));
|
1330
1343
|
}
|
1331
1344
|
|
@@ -1440,6 +1453,7 @@ strio_write(VALUE self, VALUE str)
|
|
1440
1453
|
if (!RB_TYPE_P(str, T_STRING))
|
1441
1454
|
str = rb_obj_as_string(str);
|
1442
1455
|
enc = get_enc(ptr);
|
1456
|
+
if (!enc) return 0;
|
1443
1457
|
enc2 = rb_enc_get(str);
|
1444
1458
|
if (enc != enc2 && enc != ascii8bit && enc != (usascii = rb_usascii_encoding())) {
|
1445
1459
|
VALUE converted = rb_str_conv_enc(str, enc2, enc);
|
@@ -1465,6 +1479,7 @@ strio_write(VALUE self, VALUE str)
|
|
1465
1479
|
}
|
1466
1480
|
else {
|
1467
1481
|
strio_extend(ptr, ptr->pos, len);
|
1482
|
+
rb_str_modify(ptr->string);
|
1468
1483
|
memmove(RSTRING_PTR(ptr->string)+ptr->pos, RSTRING_PTR(str), len);
|
1469
1484
|
}
|
1470
1485
|
RB_GC_GUARD(str);
|
@@ -1511,10 +1526,12 @@ strio_putc(VALUE self, VALUE ch)
|
|
1511
1526
|
|
1512
1527
|
check_modifiable(ptr);
|
1513
1528
|
if (RB_TYPE_P(ch, T_STRING)) {
|
1529
|
+
if (NIL_P(ptr->string)) return ch;
|
1514
1530
|
str = rb_str_substr(ch, 0, 1);
|
1515
1531
|
}
|
1516
1532
|
else {
|
1517
1533
|
char c = NUM2CHR(ch);
|
1534
|
+
if (NIL_P(ptr->string)) return ch;
|
1518
1535
|
str = rb_str_new(&c, 1);
|
1519
1536
|
}
|
1520
1537
|
strio_write(self, str);
|
@@ -1557,7 +1574,8 @@ strio_read(int argc, VALUE *argv, VALUE self)
|
|
1557
1574
|
if (len < 0) {
|
1558
1575
|
rb_raise(rb_eArgError, "negative length %ld given", len);
|
1559
1576
|
}
|
1560
|
-
if (len > 0 &&
|
1577
|
+
if (len > 0 &&
|
1578
|
+
(NIL_P(ptr->string) || ptr->pos >= RSTRING_LEN(ptr->string))) {
|
1561
1579
|
if (!NIL_P(str)) rb_str_resize(str, 0);
|
1562
1580
|
return Qnil;
|
1563
1581
|
}
|
@@ -1566,6 +1584,7 @@ strio_read(int argc, VALUE *argv, VALUE self)
|
|
1566
1584
|
}
|
1567
1585
|
/* fall through */
|
1568
1586
|
case 0:
|
1587
|
+
if (NIL_P(ptr->string)) return Qnil;
|
1569
1588
|
len = RSTRING_LEN(ptr->string);
|
1570
1589
|
if (len <= ptr->pos) {
|
1571
1590
|
rb_encoding *enc = get_enc(ptr);
|
@@ -1583,7 +1602,7 @@ strio_read(int argc, VALUE *argv, VALUE self)
|
|
1583
1602
|
}
|
1584
1603
|
break;
|
1585
1604
|
default:
|
1586
|
-
|
1605
|
+
rb_error_arity(argc, 0, 2);
|
1587
1606
|
}
|
1588
1607
|
if (NIL_P(str)) {
|
1589
1608
|
rb_encoding *enc = binary ? rb_ascii8bit_encoding() : get_enc(ptr);
|
@@ -1594,10 +1613,9 @@ strio_read(int argc, VALUE *argv, VALUE self)
|
|
1594
1613
|
if (len > rest) len = rest;
|
1595
1614
|
rb_str_resize(str, len);
|
1596
1615
|
MEMCPY(RSTRING_PTR(str), RSTRING_PTR(ptr->string) + ptr->pos, char, len);
|
1597
|
-
if (binary)
|
1598
|
-
rb_enc_associate(str, rb_ascii8bit_encoding());
|
1599
|
-
else
|
1616
|
+
if (!binary) {
|
1600
1617
|
rb_enc_copy(str, ptr->string);
|
1618
|
+
}
|
1601
1619
|
}
|
1602
1620
|
ptr->pos += RSTRING_LEN(str);
|
1603
1621
|
return str;
|
@@ -1619,28 +1637,28 @@ strio_pread(int argc, VALUE *argv, VALUE self)
|
|
1619
1637
|
long offset = NUM2LONG(rb_offset);
|
1620
1638
|
|
1621
1639
|
if (len < 0) {
|
1622
|
-
|
1640
|
+
rb_raise(rb_eArgError, "negative string size (or size too big): %" PRIsVALUE, rb_len);
|
1623
1641
|
}
|
1624
1642
|
|
1625
1643
|
if (len == 0) {
|
1626
|
-
|
1627
|
-
|
1628
|
-
|
1629
|
-
|
1644
|
+
if (NIL_P(rb_buf)) {
|
1645
|
+
return rb_str_new("", 0);
|
1646
|
+
}
|
1647
|
+
return rb_buf;
|
1630
1648
|
}
|
1631
1649
|
|
1632
1650
|
if (offset < 0) {
|
1633
|
-
|
1651
|
+
rb_syserr_fail_str(EINVAL, rb_sprintf("pread: Invalid offset argument: %" PRIsVALUE, rb_offset));
|
1634
1652
|
}
|
1635
1653
|
|
1636
1654
|
struct StringIO *ptr = readable(self);
|
1637
1655
|
|
1638
1656
|
if (offset >= RSTRING_LEN(ptr->string)) {
|
1639
|
-
|
1657
|
+
rb_eof_error();
|
1640
1658
|
}
|
1641
1659
|
|
1642
1660
|
if (NIL_P(rb_buf)) {
|
1643
|
-
|
1661
|
+
return strio_substr(ptr, offset, len, rb_ascii8bit_encoding());
|
1644
1662
|
}
|
1645
1663
|
|
1646
1664
|
long rest = RSTRING_LEN(ptr->string) - offset;
|
@@ -1700,8 +1718,14 @@ strio_read_nonblock(int argc, VALUE *argv, VALUE self)
|
|
1700
1718
|
return val;
|
1701
1719
|
}
|
1702
1720
|
|
1721
|
+
/*
|
1722
|
+
* See IO#write
|
1723
|
+
*/
|
1703
1724
|
#define strio_syswrite rb_io_write
|
1704
1725
|
|
1726
|
+
/*
|
1727
|
+
* See IO#write_nonblock
|
1728
|
+
*/
|
1705
1729
|
static VALUE
|
1706
1730
|
strio_syswrite_nonblock(int argc, VALUE *argv, VALUE self)
|
1707
1731
|
{
|
@@ -1729,7 +1753,7 @@ strio_size(VALUE self)
|
|
1729
1753
|
{
|
1730
1754
|
VALUE string = StringIO(self)->string;
|
1731
1755
|
if (NIL_P(string)) {
|
1732
|
-
|
1756
|
+
return INT2FIX(0);
|
1733
1757
|
}
|
1734
1758
|
return ULONG2NUM(RSTRING_LEN(string));
|
1735
1759
|
}
|
@@ -1746,10 +1770,12 @@ strio_truncate(VALUE self, VALUE len)
|
|
1746
1770
|
{
|
1747
1771
|
VALUE string = writable(self)->string;
|
1748
1772
|
long l = NUM2LONG(len);
|
1749
|
-
long plen
|
1773
|
+
long plen;
|
1750
1774
|
if (l < 0) {
|
1751
1775
|
error_inval("negative length");
|
1752
1776
|
}
|
1777
|
+
if (NIL_P(string)) return 0;
|
1778
|
+
plen = RSTRING_LEN(string);
|
1753
1779
|
rb_str_resize(string, l);
|
1754
1780
|
if (plen < l) {
|
1755
1781
|
MEMZERO(RSTRING_PTR(string) + plen, char, l - plen);
|
@@ -1820,13 +1846,22 @@ strio_set_encoding(int argc, VALUE *argv, VALUE self)
|
|
1820
1846
|
}
|
1821
1847
|
}
|
1822
1848
|
ptr->enc = enc;
|
1823
|
-
if (WRITABLE(self)) {
|
1849
|
+
if (!NIL_P(ptr->string) && WRITABLE(self)) {
|
1824
1850
|
rb_enc_associate(ptr->string, enc);
|
1825
1851
|
}
|
1826
1852
|
|
1827
1853
|
return self;
|
1828
1854
|
}
|
1829
1855
|
|
1856
|
+
/*
|
1857
|
+
* call-seq:
|
1858
|
+
* strio.set_encoding_by_bom => strio or nil
|
1859
|
+
*
|
1860
|
+
* Sets the encoding according to the BOM (Byte Order Mark) in the
|
1861
|
+
* string.
|
1862
|
+
*
|
1863
|
+
* Returns +self+ if the BOM is found, otherwise +nil.
|
1864
|
+
*/
|
1830
1865
|
static VALUE
|
1831
1866
|
strio_set_encoding_by_bom(VALUE self)
|
1832
1867
|
{
|
@@ -1859,10 +1894,15 @@ Init_stringio(void)
|
|
1859
1894
|
|
1860
1895
|
VALUE StringIO = rb_define_class("StringIO", rb_cObject);
|
1861
1896
|
|
1897
|
+
/* The version string */
|
1862
1898
|
rb_define_const(StringIO, "VERSION", rb_str_new_cstr(STRINGIO_VERSION));
|
1863
1899
|
|
1864
1900
|
rb_include_module(StringIO, rb_mEnumerable);
|
1865
1901
|
rb_define_alloc_func(StringIO, strio_s_allocate);
|
1902
|
+
|
1903
|
+
/* Maximum length that a StringIO instance can hold */
|
1904
|
+
rb_define_const(StringIO, "MAX_LENGTH", LONG2NUM(LONG_MAX));
|
1905
|
+
|
1866
1906
|
rb_define_singleton_method(StringIO, "new", strio_s_new, -1);
|
1867
1907
|
rb_define_singleton_method(StringIO, "open", strio_s_open, -1);
|
1868
1908
|
rb_define_method(StringIO, "initialize", strio_initialize, -1);
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stringio
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.1.
|
4
|
+
version: 3.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nobu Nakada
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2024-06-13 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: Pseudo `IO` class from/to `String`.
|
15
15
|
email:
|
@@ -18,9 +18,24 @@ email:
|
|
18
18
|
executables: []
|
19
19
|
extensions:
|
20
20
|
- ext/stringio/extconf.rb
|
21
|
-
extra_rdoc_files:
|
21
|
+
extra_rdoc_files:
|
22
|
+
- ".document"
|
23
|
+
- ".rdoc_options"
|
24
|
+
- COPYING
|
25
|
+
- LICENSE.txt
|
26
|
+
- NEWS.md
|
27
|
+
- README.md
|
28
|
+
- docs/io.rb
|
29
|
+
- ext/stringio/.document
|
22
30
|
files:
|
31
|
+
- ".document"
|
32
|
+
- ".rdoc_options"
|
33
|
+
- COPYING
|
34
|
+
- LICENSE.txt
|
35
|
+
- NEWS.md
|
23
36
|
- README.md
|
37
|
+
- docs/io.rb
|
38
|
+
- ext/stringio/.document
|
24
39
|
- ext/stringio/extconf.rb
|
25
40
|
- ext/stringio/stringio.c
|
26
41
|
homepage: https://github.com/ruby/stringio
|
@@ -43,7 +58,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
43
58
|
- !ruby/object:Gem::Version
|
44
59
|
version: '0'
|
45
60
|
requirements: []
|
46
|
-
rubygems_version: 3.
|
61
|
+
rubygems_version: 3.5.11
|
47
62
|
signing_key:
|
48
63
|
specification_version: 4
|
49
64
|
summary: Pseudo IO on String
|