Class: StringIO
- Inherits:
-
Object
- Object
- StringIO
- Includes:
- Enumerable, IO::generic_readable, IO::generic_writable
- Defined in:
- ext/stringio/stringio.c
Constant Summary collapse
- VERSION =
The version string
rb_str_new_cstr(STRINGIO_VERSION)
- MAX_LENGTH =
Maximum length that a StringIO instance can hold
LONG2NUM(LONG_MAX)
Class Method Summary collapse
-
.new(*args) ⇒ Object
:nodoc:.
-
.open(string = '', mode = 'r+') {|strio| ... } ⇒ Object
Note that
modedefaults to'r'ifstringis frozen.
Instance Method Summary collapse
-
#binmode ⇒ self
Sets the data mode in
selfto binary mode; see Data Mode. -
#close ⇒ nil
Closes
selffor both reading and writing. -
#close_read ⇒ nil
Closes
selffor reading; closed-write setting remains unchanged. -
#close_write ⇒ nil
Closes
selffor writing; closed-read setting remains unchanged. -
#closed? ⇒ Boolean
Returns
trueifselfis closed for both reading and writing,falseotherwise. -
#closed_read? ⇒ Boolean
Returns
trueifselfis closed for reading,falseotherwise. -
#closed_write? ⇒ Boolean
Returns
trueifselfis closed for writing,falseotherwise. -
#each(*args) ⇒ Object
Calls the block with each remaining line read from the stream; does nothing if already at end-of-file; returns
self. -
#each_byte {|byte| ... } ⇒ self
With a block given, calls the block with each remaining byte in the stream; see Byte IO.
-
#each_char {|c| ... } ⇒ self
With a block given, calls the block with each remaining character in the stream; see Character IO.
-
#each_codepoint {|codepoint| ... } ⇒ self
With a block given, calls the block with each remaining codepoint in the stream; see Codepoint IO.
-
#each_line(*args) ⇒ Object
Calls the block with each remaining line read from the stream; does nothing if already at end-of-file; returns
self. -
#eof? ⇒ Boolean
Returns
trueif positioned at end-of-stream,falseotherwise; see Position. -
#eof? ⇒ Boolean
Returns
trueif positioned at end-of-stream,falseotherwise; see Position. -
#external_encoding ⇒ Encoding
Returns the Encoding object that represents the encoding of the file.
- #fcntl ⇒ Object
- #fileno ⇒ nil
- #flush ⇒ Object
- #fsync ⇒ 0
-
#getbyte ⇒ nil
Reads and returns the next 8-bit byte from the stream; see Byte IO.
-
#getc ⇒ nil
Reads and returns the next character from the stream; see Character IO.
-
#gets(*args) ⇒ Object
Reads and returns a line from the stream; assigns the return value to
$_; see Line IO. -
#new(string = '', mode = 'r+') ⇒ Object
constructor
Note that
modedefaults to'r'ifstringis frozen. -
#initialize_copy(orig) ⇒ Object
:nodoc:.
-
#internal_encoding ⇒ Encoding
Returns the Encoding of the internal string if conversion is specified.
- #isatty ⇒ Object
-
#length ⇒ Object
Returns the size of the buffer string.
-
#lineno ⇒ Object
Returns the current line number in
self; see Line Number. -
#lineno=(new_line_number) ⇒ Object
Sets the current line number in
selfto the givennew_line_number; see Line Number. - #pid ⇒ nil
-
#pos ⇒ Object
Returns the current position (in bytes); see Position.
-
#pos=(new_position) ⇒ Object
Sets the current position (in bytes); see Position.
-
#pread(*args) ⇒ Object
See IO#pread.
-
#putc(obj) ⇒ Object
See IO#putc.
-
#read([length [, outbuf]]) ⇒ String?
See IO#read.
-
#readlines(*args) ⇒ Object
See IO#readlines.
-
#reopen(other, mode = 'r+') ⇒ self
Reinitializes the stream with the given
other(string or StringIO) andmode; see IO.new:. -
#rewind ⇒ 0
Sets the current position and line number to zero; see Position and Line Number.
-
#seek(offset, whence = SEEK_SET) ⇒ 0
Sets the current position to the given integer
offset(in bytes), with respect to a given constantwhence; see Position. -
#set_encoding(ext_enc, [int_enc[, opt]]) ⇒ Object
Specify the encoding of the StringIO as ext_enc.
-
#set_encoding_by_bom ⇒ nil
Sets the encoding according to the BOM (Byte Order Mark) in the string.
-
#size ⇒ Object
Returns the size of the buffer string.
-
#string ⇒ String
Returns underlying string:.
-
#string=(other_string) ⇒ Object
Assigns the underlying string as
other_string, and sets position to zero; returnsother_string:. -
#sync ⇒ true
Returns
true; implemented only for compatibility with other stream classes. - #sync=(boolean) ⇒ Boolean
- #tell ⇒ Object
-
#truncate(integer) ⇒ 0
Truncates the buffer string to at most integer bytes.
- #tty? ⇒ Boolean
-
#ungetbyte(byte) ⇒ nil
Pushes back (“unshifts”) an 8-bit byte onto the stream; see Byte IO.
-
#ungetc(character) ⇒ nil
Pushes back (“unshifts”) a character or integer onto the stream; see Character IO.
-
#write(*args) ⇒ Object
Appends the given string to the underlying buffer string.
Methods included from IO::generic_readable
#read_nonblock, #readbyte, #readchar, #readline, #readpartial, #sysread
Methods included from IO::generic_writable
#<<, #print, #printf, #puts, #syswrite, #write_nonblock
Constructor Details
#new(string = '', mode = 'r+') ⇒ Object
Note that mode defaults to 'r' if string is frozen.
Returns a new StringIO instance formed from string and mode; see Access Modes:
strio = StringIO.new # => #<StringIO>
strio.close
The instance should be closed when no longer needed.
Related: StringIO.open (accepts block; closes automatically).
210 211 212 213 214 215 216 217 218 219 220 |
# File 'ext/stringio/stringio.c', line 210 static VALUE strio_initialize(int argc, VALUE *argv, VALUE self) { struct StringIO *ptr = check_strio(self); if (!ptr) { DATA_PTR(self) = ptr = strio_alloc(); } rb_call_super(0, 0); return strio_init(argc, argv, ptr, self); } |
Class Method Details
.new(*args) ⇒ Object
:nodoc:
372 373 374 375 376 377 378 379 380 381 382 |
# File 'ext/stringio/stringio.c', line 372 static VALUE strio_s_new(int argc, VALUE *argv, VALUE klass) { if (rb_block_given_p()) { VALUE cname = rb_obj_as_string(klass); rb_warn("%"PRIsVALUE"::new() does not take block; use %"PRIsVALUE"::open() instead", cname, cname); } return rb_class_new_instance_kw(argc, argv, klass, RB_PASS_CALLED_KEYWORDS); } |
.open(string = '', mode = 'r+') {|strio| ... } ⇒ Object
Note that mode defaults to 'r' if string is frozen.
Creates a new StringIO instance formed from string and mode; see Access Modes.
With no block, returns the new instance:
strio = StringIO.open # => #<StringIO>
With a block, calls the block with the new instance and returns the block’s value; closes the instance on block exit.
StringIO.open {|strio| p strio }
# => #<StringIO>
Related: StringIO.new.
363 364 365 366 367 368 369 |
# File 'ext/stringio/stringio.c', line 363 static VALUE strio_s_open(int argc, VALUE *argv, VALUE klass) { VALUE obj = rb_class_new_instance_kw(argc, argv, klass, RB_PASS_CALLED_KEYWORDS); if (!rb_block_given_p()) return obj; return rb_ensure(rb_yield, obj, strio_finalize, obj); } |
Instance Method Details
#binmode ⇒ self
Sets the data mode in self to binary mode; see Data Mode.
692 693 694 695 696 697 698 699 700 701 702 703 |
# File 'ext/stringio/stringio.c', line 692 static VALUE strio_binmode(VALUE self) { struct StringIO *ptr = StringIO(self); rb_encoding *enc = rb_ascii8bit_encoding(); ptr->enc = enc; if (WRITABLE(self)) { rb_enc_associate(ptr->string, enc); } return self; } |
#close ⇒ nil
Closes self for both reading and writing.
Raises IOError if reading or writing is attempted.
Related: StringIO#close_read, StringIO#close_write.
516 517 518 519 520 521 522 |
# File 'ext/stringio/stringio.c', line 516 static VALUE strio_close(VALUE self) { StringIO(self); RBASIC(self)->flags &= ~STRIO_READWRITE; return Qnil; } |
#close_read ⇒ nil
Closes self for reading; closed-write setting remains unchanged.
Raises IOError if reading is attempted.
Related: StringIO#close, StringIO#close_write.
534 535 536 537 538 539 540 541 542 543 |
# File 'ext/stringio/stringio.c', line 534 static VALUE strio_close_read(VALUE self) { struct StringIO *ptr = StringIO(self); if (!(ptr->flags & FMODE_READABLE)) { rb_raise(rb_eIOError, "closing non-duplex IO for reading"); } RBASIC(self)->flags &= ~STRIO_READABLE; return Qnil; } |
#close_write ⇒ nil
Closes self for writing; closed-read setting remains unchanged.
Raises IOError if writing is attempted.
Related: StringIO#close, StringIO#close_read.
555 556 557 558 559 560 561 562 563 564 |
# File 'ext/stringio/stringio.c', line 555 static VALUE strio_close_write(VALUE self) { struct StringIO *ptr = StringIO(self); if (!(ptr->flags & FMODE_WRITABLE)) { rb_raise(rb_eIOError, "closing non-duplex IO for writing"); } RBASIC(self)->flags &= ~STRIO_WRITABLE; return Qnil; } |
#closed? ⇒ Boolean
Returns true if self is closed for both reading and writing, false otherwise.
573 574 575 576 577 578 579 |
# File 'ext/stringio/stringio.c', line 573 static VALUE strio_closed(VALUE self) { StringIO(self); if (!CLOSED(self)) return Qfalse; return Qtrue; } |
#closed_read? ⇒ Boolean
Returns true if self is closed for reading, false otherwise.
587 588 589 590 591 592 593 |
# File 'ext/stringio/stringio.c', line 587 static VALUE strio_closed_read(VALUE self) { StringIO(self); if (READABLE(self)) return Qfalse; return Qtrue; } |
#closed_write? ⇒ Boolean
Returns true if self is closed for writing, false otherwise.
601 602 603 604 605 606 607 |
# File 'ext/stringio/stringio.c', line 601 static VALUE strio_closed_write(VALUE self) { StringIO(self); if (WRITABLE(self)) return Qfalse; return Qtrue; } |
#each_line(sep = $/, chomp: false) {|line| ... } ⇒ self #each_line(limit, chomp: false) {|line| ... } ⇒ self #each_line(sep, limit, chomp: false) {|line| ... } ⇒ self
Calls the block with each remaining line read from the stream; does nothing if already at end-of-file; returns self. See Line IO.
1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 |
# File 'ext/stringio/stringio.c', line 1391 static VALUE strio_each(int argc, VALUE *argv, VALUE self) { VALUE line; struct StringIO *ptr = readable(self); struct getline_arg arg; RETURN_ENUMERATOR(self, argc, argv); if (prepare_getline_args(ptr, &arg, argc, argv)->limit == 0) { rb_raise(rb_eArgError, "invalid limit: 0 for each_line"); } while (!NIL_P(line = strio_getline(&arg, ptr))) { rb_yield(line); } return self; } |
#each_byte {|byte| ... } ⇒ self
With a block given, calls the block with each remaining byte in the stream; see Byte IO.
With no block given, returns an enumerator.
860 861 862 863 864 865 866 867 868 869 870 871 872 |
# File 'ext/stringio/stringio.c', line 860 static VALUE strio_each_byte(VALUE self) { struct StringIO *ptr; RETURN_ENUMERATOR(self, 0, 0); while ((ptr = strio_to_read(self)) != NULL) { char c = RSTRING_PTR(ptr->string)[ptr->pos++]; rb_yield(CHR2FIX(c)); } return self; } |
#each_char {|c| ... } ⇒ self
With a block given, calls the block with each remaining character in the stream; see Character IO.
With no block given, returns an enumerator.
1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 |
# File 'ext/stringio/stringio.c', line 1088 static VALUE strio_each_char(VALUE self) { VALUE c; RETURN_ENUMERATOR(self, 0, 0); while (!NIL_P(c = strio_getc(self))) { rb_yield(c); } return self; } |
#each_codepoint {|codepoint| ... } ⇒ self
With a block given, calls the block with each remaining codepoint in the stream; see Codepoint IO.
With no block given, returns an enumerator.
1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 |
# File 'ext/stringio/stringio.c', line 1110 static VALUE strio_each_codepoint(VALUE self) { struct StringIO *ptr; rb_encoding *enc; unsigned int c; int n; RETURN_ENUMERATOR(self, 0, 0); ptr = readable(self); enc = get_enc(ptr); while ((ptr = strio_to_read(self)) != NULL) { c = rb_enc_codepoint_len(RSTRING_PTR(ptr->string)+ptr->pos, RSTRING_END(ptr->string), &n, enc); ptr->pos += n; rb_yield(UINT2NUM(c)); } return self; } |
#each_line(sep = $/, chomp: false) {|line| ... } ⇒ self #each_line(limit, chomp: false) {|line| ... } ⇒ self #each_line(sep, limit, chomp: false) {|line| ... } ⇒ self
Calls the block with each remaining line read from the stream; does nothing if already at end-of-file; returns self. See Line IO.
1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 |
# File 'ext/stringio/stringio.c', line 1391 static VALUE strio_each(int argc, VALUE *argv, VALUE self) { VALUE line; struct StringIO *ptr = readable(self); struct getline_arg arg; RETURN_ENUMERATOR(self, argc, argv); if (prepare_getline_args(ptr, &arg, argc, argv)->limit == 0) { rb_raise(rb_eArgError, "invalid limit: 0 for each_line"); } while (!NIL_P(line = strio_getline(&arg, ptr))) { rb_yield(line); } return self; } |
#eof? ⇒ Boolean
Returns true if positioned at end-of-stream, false otherwise; see Position.
Raises IOError if the stream is not opened for reading.
627 628 629 630 631 632 |
# File 'ext/stringio/stringio.c', line 627 static VALUE strio_eof(VALUE self) { if (strio_to_read(self)) return Qfalse; return Qtrue; } |
#eof? ⇒ Boolean
Returns true if positioned at end-of-stream, false otherwise; see Position.
Raises IOError if the stream is not opened for reading.
627 628 629 630 631 632 |
# File 'ext/stringio/stringio.c', line 627 static VALUE strio_eof(VALUE self) { if (strio_to_read(self)) return Qfalse; return Qtrue; } |
#external_encoding ⇒ Encoding
Returns the Encoding object that represents the encoding of the file. If the stream is write mode and no encoding is specified, returns nil.
1808 1809 1810 1811 1812 1813 |
# File 'ext/stringio/stringio.c', line 1808 static VALUE strio_external_encoding(VALUE self) { struct StringIO *ptr = StringIO(self); return rb_enc_from_encoding(get_enc(ptr)); } |
#fcntl ⇒ Object
#fileno ⇒ nil
#flush ⇒ Object
#fsync ⇒ 0
#getbyte ⇒ nil
Reads and returns the next 8-bit byte from the stream; see Byte IO.
907 908 909 910 911 912 913 914 915 916 917 |
# File 'ext/stringio/stringio.c', line 907 static VALUE strio_getbyte(VALUE self) { struct StringIO *ptr = readable(self); int c; if (NIL_P(ptr->string) || ptr->pos >= RSTRING_LEN(ptr->string)) { return Qnil; } c = RSTRING_PTR(ptr->string)[ptr->pos++]; return CHR2FIX(c); } |
#getc ⇒ nil
Reads and returns the next character from the stream; see Character IO.
881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 |
# File 'ext/stringio/stringio.c', line 881 static VALUE strio_getc(VALUE self) { struct StringIO *ptr = readable(self); rb_encoding *enc = get_enc(ptr); VALUE str = ptr->string; long pos = ptr->pos; int len; char *p; if (NIL_P(str) || pos >= RSTRING_LEN(str)) { return Qnil; } p = RSTRING_PTR(str)+pos; len = rb_enc_mbclen(p, RSTRING_END(str), enc); ptr->pos += len; return enc_subseq(str, pos, len, enc); } |
#gets(sep = $/, chomp: false) ⇒ String? #gets(limit, chomp: false) ⇒ String? #gets(sep, limit, chomp: false) ⇒ String?
Reads and returns a line from the stream; assigns the return value to $_; see Line IO.
1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 |
# File 'ext/stringio/stringio.c', line 1346 static VALUE strio_gets(int argc, VALUE *argv, VALUE self) { struct StringIO *ptr = readable(self); struct getline_arg arg; VALUE str; if (prepare_getline_args(ptr, &arg, argc, argv)->limit == 0) { if (NIL_P(ptr->string)) return Qnil; return rb_enc_str_new(0, 0, get_enc(ptr)); } str = strio_getline(&arg, ptr); rb_lastline_set(str); return str; } |
#initialize_copy(orig) ⇒ Object
:nodoc:
635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 |
# File 'ext/stringio/stringio.c', line 635 static VALUE strio_copy(VALUE copy, VALUE orig) { struct StringIO *ptr, *old_ptr; VALUE old_string = Qundef; orig = rb_convert_type(orig, T_DATA, "StringIO", "to_strio"); if (copy == orig) return copy; ptr = StringIO(orig); old_ptr = check_strio(copy); if (old_ptr) { old_string = old_ptr->string; strio_free(old_ptr); } DATA_PTR(copy) = ptr; RB_OBJ_WRITTEN(copy, old_string, ptr->string); RBASIC(copy)->flags &= ~STRIO_READWRITE; RBASIC(copy)->flags |= RBASIC(orig)->flags & STRIO_READWRITE; ++ptr->count; return copy; } |
#internal_encoding ⇒ Encoding
Returns the Encoding of the internal string if conversion is specified. Otherwise returns nil.
1823 1824 1825 1826 1827 |
# File 'ext/stringio/stringio.c', line 1823 static VALUE strio_internal_encoding(VALUE self) { return Qnil; } |
#isatty ⇒ nil #tty? ⇒ nil
#length ⇒ Integer #size ⇒ Integer
Returns the size of the buffer string.
1764 1765 1766 1767 1768 1769 1770 1771 1772 |
# File 'ext/stringio/stringio.c', line 1764 static VALUE strio_size(VALUE self) { VALUE string = StringIO(self)->string; if (NIL_P(string)) { return INT2FIX(0); } return ULONG2NUM(RSTRING_LEN(string)); } |
#lineno ⇒ Object
Returns the current line number in self; see Line Number.
664 665 666 667 668 |
# File 'ext/stringio/stringio.c', line 664 static VALUE strio_get_lineno(VALUE self) { return LONG2NUM(StringIO(self)->lineno); } |
#lineno=(new_line_number) ⇒ Object
Sets the current line number in self to the given new_line_number; see Line Number.
677 678 679 680 681 682 |
# File 'ext/stringio/stringio.c', line 677 static VALUE strio_set_lineno(VALUE self, VALUE lineno) { StringIO(self)->lineno = NUM2LONG(lineno); return lineno; } |
#pid ⇒ nil
#pos ⇒ Object
Returns the current position (in bytes); see Position.
752 753 754 755 756 |
# File 'ext/stringio/stringio.c', line 752 static VALUE strio_get_pos(VALUE self) { return LONG2NUM(StringIO(self)->pos); } |
#pos=(new_position) ⇒ Object
Sets the current position (in bytes); see Position.
765 766 767 768 769 770 771 772 773 774 775 |
# File 'ext/stringio/stringio.c', line 765 static VALUE strio_set_pos(VALUE self, VALUE pos) { struct StringIO *ptr = StringIO(self); long p = NUM2LONG(pos); if (p < 0) { error_inval(0); } ptr->pos = p; return pos; } |
#pread(maxlen, offset) ⇒ String #pread(maxlen, offset, out_string) ⇒ String
See IO#pread.
1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 |
# File 'ext/stringio/stringio.c', line 1644 static VALUE strio_pread(int argc, VALUE *argv, VALUE self) { VALUE rb_len, rb_offset, rb_buf; rb_scan_args(argc, argv, "21", &rb_len, &rb_offset, &rb_buf); long len = NUM2LONG(rb_len); long offset = NUM2LONG(rb_offset); if (len < 0) { rb_raise(rb_eArgError, "negative string size (or size too big): %" PRIsVALUE, rb_len); } if (len == 0) { if (NIL_P(rb_buf)) { return rb_str_new("", 0); } return rb_buf; } if (offset < 0) { rb_syserr_fail_str(EINVAL, rb_sprintf("pread: Invalid offset argument: %" PRIsVALUE, rb_offset)); } struct StringIO *ptr = readable(self); if (offset >= RSTRING_LEN(ptr->string)) { rb_eof_error(); } if (NIL_P(rb_buf)) { return strio_substr(ptr, offset, len, rb_ascii8bit_encoding()); } long rest = RSTRING_LEN(ptr->string) - offset; if (len > rest) len = rest; rb_str_resize(rb_buf, len); rb_enc_associate(rb_buf, rb_ascii8bit_encoding()); MEMCPY(RSTRING_PTR(rb_buf), RSTRING_PTR(ptr->string) + offset, char, len); return rb_buf; } |
#putc(obj) ⇒ Object
See IO#putc.
1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 |
# File 'ext/stringio/stringio.c', line 1534 static VALUE strio_putc(VALUE self, VALUE ch) { struct StringIO *ptr = writable(self); VALUE str; check_modifiable(ptr); if (RB_TYPE_P(ch, T_STRING)) { if (NIL_P(ptr->string)) return ch; str = rb_str_substr(ch, 0, 1); } else { char c = NUM2CHR(ch); if (NIL_P(ptr->string)) return ch; str = rb_str_new(&c, 1); } strio_write(self, str); return ch; } |
#read([length [, outbuf]]) ⇒ String?
See IO#read.
1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 |
# File 'ext/stringio/stringio.c', line 1568 static VALUE strio_read(int argc, VALUE *argv, VALUE self) { struct StringIO *ptr = readable(self); VALUE str = Qnil; long len; int binary = 0; switch (argc) { case 2: str = argv[1]; if (!NIL_P(str)) { StringValue(str); rb_str_modify(str); } /* fall through */ case 1: if (!NIL_P(argv[0])) { len = NUM2LONG(argv[0]); if (len < 0) { rb_raise(rb_eArgError, "negative length %ld given", len); } if (len > 0 && (NIL_P(ptr->string) || ptr->pos >= RSTRING_LEN(ptr->string))) { if (!NIL_P(str)) rb_str_resize(str, 0); return Qnil; } binary = 1; break; } /* fall through */ case 0: if (NIL_P(ptr->string)) return Qnil; len = RSTRING_LEN(ptr->string); if (len <= ptr->pos) { rb_encoding *enc = get_enc(ptr); if (NIL_P(str)) { str = rb_str_new(0, 0); } else { rb_str_resize(str, 0); } rb_enc_associate(str, enc); return str; } else { len -= ptr->pos; } break; default: rb_error_arity(argc, 0, 2); } if (NIL_P(str)) { rb_encoding *enc = binary ? rb_ascii8bit_encoding() : get_enc(ptr); str = strio_substr(ptr, ptr->pos, len, enc); } else { long rest = RSTRING_LEN(ptr->string) - ptr->pos; if (len > rest) len = rest; rb_str_resize(str, len); MEMCPY(RSTRING_PTR(str), RSTRING_PTR(ptr->string) + ptr->pos, char, len); if (!binary) { rb_enc_copy(str, ptr->string); } } ptr->pos += RSTRING_LEN(str); return str; } |
#readlines(sep = $/, chomp: false) ⇒ Array #readlines(limit, chomp: false) ⇒ Array #readlines(sep, limit, chomp: false) ⇒ Array
See IO#readlines.
1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 |
# File 'ext/stringio/stringio.c', line 1418 static VALUE strio_readlines(int argc, VALUE *argv, VALUE self) { VALUE ary, line; struct StringIO *ptr = readable(self); struct getline_arg arg; if (prepare_getline_args(ptr, &arg, argc, argv)->limit == 0) { rb_raise(rb_eArgError, "invalid limit: 0 for readlines"); } ary = rb_ary_new(); while (!NIL_P(line = strio_getline(&arg, ptr))) { rb_ary_push(ary, line); } return ary; } |
#reopen(other, mode = 'r+') ⇒ self
Reinitializes the stream with the given other (string or StringIO) and mode; see IO.new:
StringIO.open('foo') do |strio|
p strio.string
strio.reopen('bar')
p strio.string
other_strio = StringIO.new('baz')
strio.reopen(other_strio)
p strio.string
other_strio.close
end
Output:
"foo"
"bar"
"baz"
735 736 737 738 739 740 741 742 743 |
# File 'ext/stringio/stringio.c', line 735 static VALUE strio_reopen(int argc, VALUE *argv, VALUE self) { rb_io_taint_check(self); if (argc == 1 && !RB_TYPE_P(*argv, T_STRING)) { return strio_copy(self, *argv); } return strio_init(argc, argv, StringIO(self), self); } |
#rewind ⇒ 0
Sets the current position and line number to zero; see Position and Line Number.
785 786 787 788 789 790 791 792 |
# File 'ext/stringio/stringio.c', line 785 static VALUE strio_rewind(VALUE self) { struct StringIO *ptr = StringIO(self); ptr->pos = 0; ptr->lineno = 0; return INT2FIX(0); } |
#seek(offset, whence = SEEK_SET) ⇒ 0
Sets the current position to the given integer offset (in bytes), with respect to a given constant whence; see Position.
802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 |
# File 'ext/stringio/stringio.c', line 802 static VALUE strio_seek(int argc, VALUE *argv, VALUE self) { VALUE whence; struct StringIO *ptr = StringIO(self); long amount, offset; rb_scan_args(argc, argv, "11", NULL, &whence); amount = NUM2LONG(argv[0]); if (CLOSED(self)) { rb_raise(rb_eIOError, "closed stream"); } switch (NIL_P(whence) ? 0 : NUM2LONG(whence)) { case 0: offset = 0; break; case 1: offset = ptr->pos; break; case 2: offset = RSTRING_LEN(ptr->string); break; default: error_inval("invalid whence"); } if (amount > LONG_MAX - offset || amount + offset < 0) { error_inval(0); } ptr->pos = amount + offset; return INT2FIX(0); } |
#set_encoding(ext_enc, [int_enc[, opt]]) ⇒ Object
Specify the encoding of the StringIO as ext_enc. Use the default external encoding if ext_enc is nil. 2nd argument int_enc and optional hash opt argument are ignored; they are for API compatibility to IO.
1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 |
# File 'ext/stringio/stringio.c', line 1839 static VALUE strio_set_encoding(int argc, VALUE *argv, VALUE self) { rb_encoding* enc; struct StringIO *ptr = StringIO(self); VALUE ext_enc, int_enc, opt; argc = rb_scan_args(argc, argv, "11:", &ext_enc, &int_enc, &opt); if (NIL_P(ext_enc)) { enc = rb_default_external_encoding(); } else { enc = rb_find_encoding(ext_enc); if (!enc) { rb_io_enc_t convconfig; int oflags, fmode; VALUE vmode = rb_str_append(rb_str_new_cstr("r:"), ext_enc); rb_io_extract_modeenc(&vmode, 0, Qnil, &oflags, &fmode, &convconfig); enc = convconfig.enc2; } } ptr->enc = enc; if (!NIL_P(ptr->string) && WRITABLE(self)) { rb_enc_associate(ptr->string, enc); } return self; } |
#set_encoding_by_bom ⇒ nil
Sets the encoding according to the BOM (Byte Order Mark) in the string.
Returns self if the BOM is found, otherwise +nil.
1878 1879 1880 1881 1882 1883 1884 1885 |
# File 'ext/stringio/stringio.c', line 1878 static VALUE strio_set_encoding_by_bom(VALUE self) { struct StringIO *ptr = StringIO(self); if (!set_encoding_by_bom(ptr)) return Qnil; return rb_enc_from_encoding(ptr->enc); } |
#length ⇒ Integer #size ⇒ Integer
Returns the size of the buffer string.
1764 1765 1766 1767 1768 1769 1770 1771 1772 |
# File 'ext/stringio/stringio.c', line 1764 static VALUE strio_size(VALUE self) { VALUE string = StringIO(self)->string; if (NIL_P(string)) { return INT2FIX(0); } return ULONG2NUM(RSTRING_LEN(string)); } |
#string ⇒ String
Returns underlying string:
StringIO.open('foo') do |strio|
p strio.string
strio.string = 'bar'
p strio.string
end
Output:
"foo"
"bar"
Related: StringIO#string= (assigns the underlying string).
465 466 467 468 469 |
# File 'ext/stringio/stringio.c', line 465 static VALUE strio_get_string(VALUE self) { return StringIO(self)->string; } |
#string=(other_string) ⇒ Object
Assigns the underlying string as other_string, and sets position to zero; returns other_string:
StringIO.open('foo') do |strio|
p strio.string
strio.string = 'bar'
p strio.string
end
Output:
"foo"
"bar"
Related: StringIO#string (returns the underlying string).
491 492 493 494 495 496 497 498 499 500 501 502 503 504 |
# File 'ext/stringio/stringio.c', line 491 static VALUE strio_set_string(VALUE self, VALUE string) { struct StringIO *ptr = StringIO(self); rb_io_taint_check(self); ptr->flags &= ~FMODE_READWRITE; StringValue(string); ptr->flags = readonly_string_p(string) ? FMODE_READABLE : FMODE_READWRITE; ptr->pos = 0; ptr->lineno = 0; RB_OBJ_WRITE(self, &ptr->string, string); return string; } |
#sync ⇒ true
Returns true; implemented only for compatibility with other stream classes.
840 841 842 843 844 845 |
# File 'ext/stringio/stringio.c', line 840 static VALUE strio_get_sync(VALUE self) { StringIO(self); return Qtrue; } |
#sync=(boolean) ⇒ Boolean
#tell ⇒ Object
#truncate(integer) ⇒ 0
Truncates the buffer string to at most integer bytes. The stream must be opened for writing.
1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 |
# File 'ext/stringio/stringio.c', line 1781 static VALUE strio_truncate(VALUE self, VALUE len) { VALUE string = writable(self)->string; long l = NUM2LONG(len); long plen; if (l < 0) { error_inval("negative length"); } if (NIL_P(string)) return 0; plen = RSTRING_LEN(string); rb_str_resize(string, l); if (plen < l) { MEMZERO(RSTRING_PTR(string) + plen, char, l - plen); } return INT2FIX(0); } |
#tty? ⇒ Boolean
#ungetbyte(byte) ⇒ nil
Pushes back (“unshifts”) an 8-bit byte onto the stream; see Byte IO.
997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 |
# File 'ext/stringio/stringio.c', line 997 static VALUE strio_ungetbyte(VALUE self, VALUE c) { struct StringIO *ptr = readable(self); check_modifiable(ptr); if (NIL_P(ptr->string)) return Qnil; if (NIL_P(c)) return Qnil; if (RB_INTEGER_TYPE_P(c)) { /* rb_int_and() not visible from exts */ VALUE v = rb_funcall(c, '&', 1, INT2FIX(0xff)); const char cc = NUM2INT(v) & 0xFF; strio_unget_bytes(ptr, &cc, 1); } else { StringValue(c); strio_unget_string(ptr, c); } return Qnil; } |
#ungetc(character) ⇒ nil
Pushes back (“unshifts”) a character or integer onto the stream; see Character IO.
955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 |
# File 'ext/stringio/stringio.c', line 955 static VALUE strio_ungetc(VALUE self, VALUE c) { struct StringIO *ptr = readable(self); rb_encoding *enc, *enc2; check_modifiable(ptr); if (NIL_P(ptr->string)) return Qnil; if (NIL_P(c)) return Qnil; if (RB_INTEGER_TYPE_P(c)) { int len, cc = NUM2INT(c); char buf[16]; enc = rb_enc_get(ptr->string); len = rb_enc_codelen(cc, enc); if (len <= 0) { rb_enc_uint_chr(cc, enc); /* to raise an exception */ UNREACHABLE; } rb_enc_mbcput(cc, buf, enc); return strio_unget_bytes(ptr, buf, len); } else { StringValue(c); if (RSTRING_LEN(c) == 0) return Qnil; enc = rb_enc_get(ptr->string); enc2 = rb_enc_get(c); if (enc != enc2 && enc != rb_ascii8bit_encoding()) { c = rb_str_conv_enc(c, enc2, enc); } strio_unget_string(ptr, c); return Qnil; } } |
#write(string, ...) ⇒ Integer #syswrite(string) ⇒ Integer
Appends the given string to the underlying buffer string. The stream must be opened for writing. If the argument is not a string, it will be converted to a string using to_s. Returns the number of bytes written. See IO#write.
1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 |
# File 'ext/stringio/stringio.c', line 1446 static VALUE strio_write_m(int argc, VALUE *argv, VALUE self) { long len = 0; while (argc-- > 0) { /* StringIO can't exceed long limit */ len += strio_write(self, *argv++); } return LONG2NUM(len); } |