diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-10-27 09:29:26 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-10-27 09:29:26 +0000 |
commit | 018837b84f26adf1dd43ff0f41b211a41f5289e8 (patch) | |
tree | 4e552ee5749181b14dd80da1eb05d0dc9ed86645 /ext/zlib | |
parent | 6ffdbac5edcdeb0a9c916735cab125674c5a693d (diff) |
* node.h (NODE_TYPESHIFT): allow 4 more bits for line numbers.
[ruby-talk:117841]
* ruby.h (FL_ABLE): nodes are not subject for flag operations.
* io.c (ARGF_FORWARD): should have specified argv explicitly,
since we no longer have frame->argv saved. [ruby-dev:24602]
* string.c (RESIZE_CAPA): check string attribute before modifying
capacity member of string structure. [ruby-dev:24594]
* ext/zlib/zlib.c (gzreader_gets): use memchr() to to gain
performance. [ruby-talk:117701]
* sprintf.c (rb_f_sprintf): raise ArgumentError for extra
arguments, unless (digit)$ style used.
* io.c (rb_io_fptr_finalize): leave stdin/stdout/stderr open in
interpreter termination. [ruby-dev:24579]
* eval.c (frame_free): Guy Decoux solved the leak problem.
Thanks. [ruby-core:03549]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@7121 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/zlib')
-rw-r--r-- | ext/zlib/zlib.c | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/ext/zlib/zlib.c b/ext/zlib/zlib.c index 9b6080f21b..21bcfbcff8 100644 --- a/ext/zlib/zlib.c +++ b/ext/zlib/zlib.c @@ -701,7 +701,7 @@ zstream_run(z, src, len, flush) uInt n; int err; - if (len == 0) { + if (NIL_P(z->input) && len == 0) { z->stream.next_in = ""; z->stream.avail_in = 0; } @@ -3137,6 +3137,16 @@ gzreader_skip_linebreaks(gz) gzfile_calc_crc(gz, str); } +static void +rscheck(rsptr, rslen, rs) + char *rsptr; + long rslen; + VALUE rs; +{ + if (RSTRING(rs)->ptr != rsptr && RSTRING(rs)->len != rslen) + rb_raise(rb_eRuntimeError, "rs modified"); +} + static VALUE gzreader_gets(argc, argv, obj) int argc; @@ -3144,8 +3154,9 @@ gzreader_gets(argc, argv, obj) VALUE obj; { struct gzfile *gz = get_gzfile(obj); - VALUE rs, dst; - char *rsptr, *p; + volatile VALUE rs; + VALUE dst; + char *rsptr, *p, *res; long rslen, n; int rspara; @@ -3187,16 +3198,24 @@ gzreader_gets(argc, argv, obj) gzfile_read_more(gz); } - n = rslen; p = RSTRING(gz->z.buf)->ptr; + n = rslen; for (;;) { if (n > gz->z.buf_filled) { if (ZSTREAM_IS_FINISHED(&gz->z)) break; gzfile_read_more(gz); p = RSTRING(gz->z.buf)->ptr + n - rslen; } - if (memcmp(p, rsptr, rslen) == 0) break; - p++, n++; + if (!rspara) rscheck(rsptr, rslen, rs); + res = memchr(p, rsptr[0], (gz->z.buf_filled - n + 1)); + if (!res) { + n = gz->z.buf_filled + 1; + } else { + n += (long)(res - p); + p = res; + if (rslen == 1 || memcmp(p, rsptr, rslen) == 0) break; + p++, n++; + } } gz->lineno++; |