summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-10-27 09:29:26 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-10-27 09:29:26 +0000
commit018837b84f26adf1dd43ff0f41b211a41f5289e8 (patch)
tree4e552ee5749181b14dd80da1eb05d0dc9ed86645 /ext
parent6ffdbac5edcdeb0a9c916735cab125674c5a693d (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')
-rw-r--r--ext/openssl/ossl_ssl.c1
-rw-r--r--ext/zlib/zlib.c31
2 files changed, 25 insertions, 7 deletions
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index 4d8a64fc11..24bca62084 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -544,7 +544,6 @@ ossl_ssl_write(VALUE self, VALUE str)
{
SSL *ssl;
int nwrite = 0;
- FILE *fp;
Data_Get_Struct(self, SSL, ssl);
StringValue(str);
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++;