@@ -190,40 +190,33 @@ strio_initialize(int argc, VALUE *argv, VALUE self)
190
190
static VALUE
191
191
strio_init (int argc , VALUE * argv , struct StringIO * ptr , VALUE self )
192
192
{
193
- VALUE string , mode ;
194
- int trunc = 0 ;
193
+ VALUE string , vmode , opt ;
194
+ int oflags ;
195
+ struct rb_io_enc_t convconfig ;
195
196
196
- switch (rb_scan_args (argc , argv , "02" , & string , & mode )) {
197
- case 2 :
198
- if (FIXNUM_P (mode )) {
199
- int flags = FIX2INT (mode );
200
- ptr -> flags = rb_io_oflags_fmode (flags );
201
- trunc = flags & O_TRUNC ;
202
- }
203
- else {
204
- const char * m = StringValueCStr (mode );
205
- ptr -> flags = rb_io_modestr_fmode (m );
206
- trunc = * m == 'w' ;
207
- }
197
+ argc = rb_scan_args (argc , argv , "02:" , & string , & vmode , & opt );
198
+ rb_io_extract_modeenc (& vmode , 0 , opt , & oflags , & ptr -> flags , & convconfig );
199
+ if (argc ) {
208
200
StringValue (string );
209
- if ((ptr -> flags & FMODE_WRITABLE ) && OBJ_FROZEN (string )) {
201
+ }
202
+ else {
203
+ string = rb_enc_str_new ("" , 0 , rb_default_external_encoding ());
204
+ }
205
+ if (OBJ_FROZEN_RAW (string )) {
206
+ if (ptr -> flags & FMODE_WRITABLE ) {
210
207
rb_syserr_fail (EACCES , 0 );
211
208
}
212
- if (trunc ) {
213
- rb_str_resize (string , 0 );
209
+ }
210
+ else {
211
+ if (NIL_P (vmode )) {
212
+ ptr -> flags |= FMODE_WRITABLE ;
214
213
}
215
- break ;
216
- case 1 :
217
- StringValue (string );
218
- ptr -> flags = OBJ_FROZEN (string ) ? FMODE_READABLE : FMODE_READWRITE ;
219
- break ;
220
- case 0 :
221
- string = rb_enc_str_new ("" , 0 , rb_default_external_encoding ());
222
- ptr -> flags = FMODE_READWRITE ;
223
- break ;
214
+ }
215
+ if (ptr -> flags & FMODE_TRUNC ) {
216
+ rb_str_resize (string , 0 );
224
217
}
225
218
ptr -> string = string ;
226
- ptr -> enc = 0 ;
219
+ ptr -> enc = convconfig . enc ;
227
220
ptr -> pos = 0 ;
228
221
ptr -> lineno = 0 ;
229
222
RBASIC (self )-> flags |= (ptr -> flags & FMODE_READWRITE ) * (STRIO_READABLE / FMODE_READABLE );
0 commit comments