[macruby-changes] [4539] MacRuby/trunk/ext/zlib/zlib.c

source_changes at macosforge.org source_changes at macosforge.org
Sun Sep 26 10:48:43 PDT 2010


Revision: 4539
          http://trac.macosforge.org/projects/ruby/changeset/4539
Author:   watson1978 at gmail.com
Date:     2010-09-26 10:48:42 -0700 (Sun, 26 Sep 2010)
Log Message:
-----------
Fixed some following problems:
 - Can't write into file.
 - Should convert Object into String within rb_gzwriter_write().
 - fix Zlib::Deflate#dup.
 - String's concatenation is not work definitely within zstream_append_buffer().
 - Assertion fails with BSTRING_PTR(rs).

Modified Paths:
--------------
    MacRuby/trunk/ext/zlib/zlib.c

Modified: MacRuby/trunk/ext/zlib/zlib.c
===================================================================
--- MacRuby/trunk/ext/zlib/zlib.c	2010-09-24 21:46:41 UTC (rev 4538)
+++ MacRuby/trunk/ext/zlib/zlib.c	2010-09-26 17:48:42 UTC (rev 4539)
@@ -452,16 +452,19 @@
 	z->stream.avail_out = 0;
 	return;
     }
-    
-    if (rb_bstr_length(z->buf) < (z->buf_filled + len)) {
-	rb_bstr_resize(z->buf, z->buf_filled + len);
+
+    if (BSTRING_LEN(z->buf) < (z->buf_filled + len)) {
 	z->stream.avail_out = 0;
-    } else if (z->stream.avail_out >= len) {
-        z->stream.avail_out -= len;
-    } else {
-        z->stream.avail_out = 0;
     }
+    else {
+	if (z->stream.avail_out >= len) {
+	    z->stream.avail_out -= len;
+	} else {
+	    z->stream.avail_out = 0;
+	}
+    }
 
+    rb_bstr_resize(z->buf, z->buf_filled);
     rb_bstr_concat(z->buf, (const UInt8 *)src, len);
     z->buf_filled += len;
     z->stream.next_out = BSTRING_PTR_BYTEF(z->buf) + z->buf_filled;
@@ -1058,14 +1061,19 @@
 static VALUE
 rb_deflate_init_copy(VALUE self, SEL sel, VALUE orig)
 {
-    struct zstream *z1 = get_zstream(self);
-    struct zstream *z2 = get_zstream(orig);
+    struct zstream *z1, *z2;
     int err;
-    
+
+    Data_Get_Struct(self, struct zstream, z1);
+    z2 = get_zstream(orig);
+
     err = deflateCopy(&z1->stream, &z2->stream);
     if (err != Z_OK) {
 	raise_zlib_error(err, 0);
     }
+    z1->input = NIL_P(z2->input) ? Qnil : rb_str_dup(z2->input);
+    z1->buf   = NIL_P(z2->buf)   ? Qnil : rb_str_dup(z2->buf);
+    z1->buf_filled = z2->buf_filled;
     z1->flags = z2->flags;
 
     return self;
@@ -2228,8 +2236,12 @@
     }
     filename = argv[0];
     FilePathValue(filename);
-    io = rb_f_open(klass, 0, argc, argv);
 
+    VALUE args[2];
+    args[0] = filename;
+    args[1] = rb_str_new2(mode);
+    io = rb_class_new_instance(2, args, rb_cFile);
+
     argv[0] = io;
     return rb_gzfile_s_wrap(klass, 0, argc, argv);
 }
@@ -2613,8 +2625,13 @@
 {
     struct gzfile *gz = get_gzfile(obj);
 
-    StringValue(str);
-    str = rb_str_bstr(str);
+    if (TYPE(str) != T_STRING) {
+	str = rb_obj_as_string(str);
+    }
+    else {
+	StringValue(str);
+	str = rb_str_bstr(str);
+    }
     gzfile_write(gz, BSTRING_PTR_BYTEF(str), BSTRING_LEN(str));
     return INT2FIX(BSTRING_LEN(str));
 }
@@ -2927,7 +2944,7 @@
 static void
 rscheck(const char *rsptr, long rslen, VALUE rs)
 {
-    if ((const char*)BSTRING_PTR(rs) != rsptr && BSTRING_LEN(rs) != rslen)
+    if ((const char*)RSTRING_PTR(rs) != rsptr && RSTRING_LEN(rs) != rslen)
 	rb_raise(rb_eRuntimeError, "rs modified");
 }
 
@@ -2960,13 +2977,13 @@
 	return dst;
     }
 
-    if (BSTRING_LEN(rs) == 0) {
+    if (RSTRING_LEN(rs) == 0) {
 	rsptr = "\n\n";
 	rslen = 2;
 	rspara = 1;
     } else {
-	rsptr = (const char*)BSTRING_PTR(rs);
-	rslen = BSTRING_LEN(rs);
+	rsptr = (const char*)RSTRING_PTR(rs);
+	rslen = RSTRING_LEN(rs);
 	rspara = 0;
     }
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100926/919556b7/attachment.html>


More information about the macruby-changes mailing list