[macruby-changes] [1240] MacRuby/branches/experimental/io.c
source_changes at macosforge.org
source_changes at macosforge.org
Sat Mar 28 16:47:54 PDT 2009
Revision: 1240
http://trac.macosforge.org/projects/ruby/changeset/1240
Author: pthomson at apple.com
Date: 2009-03-28 16:47:54 -0700 (Sat, 28 Mar 2009)
Log Message:
-----------
First stage of a bug fix in gets. Oh, and I implemented readline.
Modified Paths:
--------------
MacRuby/branches/experimental/io.c
Modified: MacRuby/branches/experimental/io.c
===================================================================
--- MacRuby/branches/experimental/io.c 2009-03-28 21:07:14 UTC (rev 1239)
+++ MacRuby/branches/experimental/io.c 2009-03-28 23:47:54 UTC (rev 1240)
@@ -1248,15 +1248,17 @@
CFDataSetLength(data, r.location);
}
} else {
- // this is kind of a stupid implementation...
+ // Though this isn't the worst possible implementation, it could
+ // certainly use a little work. If it causes problems we'll take a look at it.
long string_offset = 0;
+ int seplen = RSTRING_LEN(sep);
for(;;) {
- CFDataIncreaseLength(data, 1);
+ CFDataIncreaseLength(data, seplen);
UInt8 *b = CFDataGetMutableBytePtr(data) + string_offset;
- long read = rb_io_read_internal(io_struct, b, 1);
+ long read = rb_io_read_internal(io_struct, b, seplen);
CFRange r = CFStringFind((CFStringRef)bstr, (CFStringRef)sep, 0);
- if (r.location != kCFNotFound) {
- CFDataSetLength(data, r.location + RSTRING_LEN(sep));
+ if ((r.location != kCFNotFound) || (rb_io_eof(io, 0) == Qtrue)) {
+ CFDataSetLength(data, r.location + (seplen));
break;
} else {
string_offset += read;
@@ -1331,7 +1333,9 @@
static VALUE
rb_io_readline(VALUE io, SEL sel, int argc, VALUE *argv)
{
-rb_notimplement();
+ VALUE ret = rb_io_gets_m(io, sel, argc, argv);
+ if(NIL_P(ret)) rb_eof_error();
+ return ret;
}
/*
@@ -1843,44 +1847,7 @@
VALUE
rb_io_gets(VALUE io, SEL sel)
{
- rb_io_t *io_struct = ExtractIOStruct(io);
- rb_io_assert_readable(io_struct);
-
- VALUE outbuf = rb_bytestring_new();
- CFMutableDataRef data = rb_bytestring_wrapped_data(outbuf);
-
- long s = 512;
- CFDataSetLength(data, s);
- UInt8 *buf = CFDataGetMutableBytePtr(data);
-
- // FIXME this is a very naive implementation
-
- long data_read = 0;
- while (true) {
- UInt8 byte;
- if (rb_io_read_internal(io_struct, &byte, 1) != 1) {
- break;
- }
-
- if (data_read >= s) {
- s += s;
- CFDataSetLength(data, s);
- buf = CFDataGetMutableBytePtr(data);
- }
- buf[data_read++] = byte;
-
- if (byte == '\n') {
- break;
- }
- }
-
- if (data_read == 0) {
- return Qnil;
- }
-
- CFDataSetLength(data, data_read);
-
- return outbuf;
+ return rb_io_gets_m(io, sel, 0, NULL);
}
/*
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090328/8181a8c6/attachment.html>
More information about the macruby-changes
mailing list