@@ -10,14 +10,80 @@ class BufferedIO
10
10
11
11
attr_accessor :read_timeout , :write_timeout
12
12
13
- def initialize ( io , read_timeout :, write_timeout :, chunk_size : 4096 )
14
- @io = io
15
- @buffer = +""
16
- @offset = 0
17
- @chunk_size = chunk_size
18
- @read_timeout = read_timeout
19
- @write_timeout = write_timeout
20
- @blocking_reads = false
13
+ if String . method_defined? ( :byteindex ) # Ruby 3.2+
14
+ ENCODING = Encoding ::UTF_8
15
+
16
+ def initialize ( io , read_timeout :, write_timeout :, chunk_size : 4096 )
17
+ @io = io
18
+ @buffer = +""
19
+ @offset = 0
20
+ @chunk_size = chunk_size
21
+ @read_timeout = read_timeout
22
+ @write_timeout = write_timeout
23
+ @blocking_reads = false
24
+ end
25
+
26
+ def gets_chomp
27
+ fill_buffer ( false ) if @offset >= @buffer . bytesize
28
+ until eol_index = @buffer . byteindex ( EOL , @offset )
29
+ fill_buffer ( false )
30
+ end
31
+
32
+ line = @buffer . byteslice ( @offset , eol_index - @offset )
33
+ @offset = eol_index + EOL_SIZE
34
+ line
35
+ end
36
+
37
+ def read_chomp ( bytes )
38
+ ensure_remaining ( bytes + EOL_SIZE )
39
+ str = @buffer . byteslice ( @offset , bytes )
40
+ @offset += bytes + EOL_SIZE
41
+ str
42
+ end
43
+
44
+ private def ensure_line
45
+ fill_buffer ( false ) if @offset >= @buffer . bytesize
46
+ until @buffer . byteindex ( EOL , @offset )
47
+ fill_buffer ( false )
48
+ end
49
+ end
50
+ else
51
+ ENCODING = Encoding ::BINARY
52
+
53
+ def initialize ( io , read_timeout :, write_timeout :, chunk_size : 4096 )
54
+ @io = io
55
+ @buffer = "" . b
56
+ @offset = 0
57
+ @chunk_size = chunk_size
58
+ @read_timeout = read_timeout
59
+ @write_timeout = write_timeout
60
+ @blocking_reads = false
61
+ end
62
+
63
+ def gets_chomp
64
+ fill_buffer ( false ) if @offset >= @buffer . bytesize
65
+ until eol_index = @buffer . index ( EOL , @offset )
66
+ fill_buffer ( false )
67
+ end
68
+
69
+ line = @buffer . byteslice ( @offset , eol_index - @offset )
70
+ @offset = eol_index + EOL_SIZE
71
+ line
72
+ end
73
+
74
+ def read_chomp ( bytes )
75
+ ensure_remaining ( bytes + EOL_SIZE )
76
+ str = @buffer . byteslice ( @offset , bytes )
77
+ @offset += bytes + EOL_SIZE
78
+ str . force_encoding ( Encoding ::UTF_8 )
79
+ end
80
+
81
+ private def ensure_line
82
+ fill_buffer ( false ) if @offset >= @buffer . bytesize
83
+ until @buffer . index ( EOL , @offset )
84
+ fill_buffer ( false )
85
+ end
86
+ end
21
87
end
22
88
23
89
def close
@@ -90,17 +156,6 @@ def getbyte
90
156
byte
91
157
end
92
158
93
- def gets_chomp
94
- fill_buffer ( false ) if @offset >= @buffer . bytesize
95
- until eol_index = @buffer . index ( EOL , @offset )
96
- fill_buffer ( false )
97
- end
98
-
99
- line = @buffer . byteslice ( @offset , eol_index - @offset )
100
- @offset = eol_index + EOL_SIZE
101
- line
102
- end
103
-
104
159
def gets_integer
105
160
int = 0
106
161
offset = @offset
@@ -124,22 +179,8 @@ def gets_integer
124
179
int
125
180
end
126
181
127
- def read_chomp ( bytes )
128
- ensure_remaining ( bytes + EOL_SIZE )
129
- str = @buffer . byteslice ( @offset , bytes )
130
- @offset += bytes + EOL_SIZE
131
- str
132
- end
133
-
134
182
private
135
183
136
- def ensure_line
137
- fill_buffer ( false ) if @offset >= @buffer . bytesize
138
- until @buffer . index ( EOL , @offset )
139
- fill_buffer ( false )
140
- end
141
- end
142
-
143
184
def ensure_remaining ( bytes )
144
185
needed = bytes - ( @buffer . bytesize - @offset )
145
186
if needed > 0
@@ -171,9 +212,9 @@ def fill_buffer(strict, size = @chunk_size)
171
212
if empty_buffer
172
213
@offset = start
173
214
empty_buffer = false
174
- @buffer . force_encoding ( Encoding :: UTF_8 ) unless @buffer . encoding == Encoding :: UTF_8
215
+ @buffer . force_encoding ( ENCODING ) unless @buffer . encoding == ENCODING
175
216
else
176
- @buffer << bytes . force_encoding ( Encoding :: UTF_8 )
217
+ @buffer << bytes . force_encoding ( ENCODING )
177
218
end
178
219
remaining -= bytes . bytesize
179
220
return if !strict || remaining <= 0
0 commit comments