306 lines
9.2 KiB
C
306 lines
9.2 KiB
C
$NetBSD: patch-bz2.c,v 1.2 2014/03/16 07:24:22 taca Exp $
|
|
|
|
* for ruby-1.9 and later.
|
|
|
|
--- bz2.c.orig 2004-12-04 14:36:59.000000000 +0000
|
|
+++ bz2.c
|
|
@@ -1,7 +1,15 @@
|
|
#include <ruby.h>
|
|
+#ifdef HAVE_RUBY_IO_H
|
|
+#include <ruby/io.h>
|
|
+#else
|
|
#include <rubyio.h>
|
|
+#endif
|
|
#include <bzlib.h>
|
|
+#ifdef HAVE_RUBY_VERSION_H
|
|
+#include <ruby/version.h>
|
|
+#else
|
|
#include <version.h>
|
|
+#endif
|
|
|
|
static VALUE bz_cWriter, bz_cReader, bz_cInternal;
|
|
static VALUE bz_eError, bz_eConfigError, bz_eEOZError;
|
|
@@ -109,11 +117,11 @@ bz_find_struct(obj, ptr, posp)
|
|
struct bz_iv *bziv;
|
|
int i;
|
|
|
|
- for (i = 0; i < RARRAY(bz_internal_ary)->len; i++) {
|
|
- Data_Get_Struct(RARRAY(bz_internal_ary)->ptr[i], struct bz_iv, bziv);
|
|
+ for (i = 0; i < RARRAY_LEN(bz_internal_ary); i++) {
|
|
+ Data_Get_Struct(RARRAY_PTR(bz_internal_ary)[i], struct bz_iv, bziv);
|
|
if (ptr) {
|
|
if (TYPE(bziv->io) == T_FILE &&
|
|
- RFILE(bziv->io)->fptr == (OpenFile *)ptr) {
|
|
+ RFILE(bziv->io)->fptr == (rb_io_t *)ptr) {
|
|
if (posp) *posp = i;
|
|
return bziv;
|
|
}
|
|
@@ -215,8 +223,8 @@ bz_internal_finalize(ary, obj)
|
|
struct bz_iv *bziv;
|
|
struct bz_file *bzf;
|
|
|
|
- for (i = 0; i < RARRAY(bz_internal_ary)->len; i++) {
|
|
- elem = RARRAY(bz_internal_ary)->ptr[i];
|
|
+ for (i = 0; i < RARRAY_LEN(bz_internal_ary); i++) {
|
|
+ elem = RARRAY_PTR(bz_internal_ary)[i];
|
|
Data_Get_Struct(elem, struct bz_iv, bziv);
|
|
if (bziv->bz2) {
|
|
RDATA(bziv->bz2)->dfree = ruby_xfree;
|
|
@@ -249,7 +257,11 @@ bz_writer_close(obj)
|
|
Get_BZ2(obj, bzf);
|
|
res = bz_writer_internal_close(bzf);
|
|
if (!NIL_P(res) && (bzf->flags & BZ2_RB_INTERNAL)) {
|
|
+#if RUBY_API_VERSION_MAJOR >=2 && RUBY_API_VERSION_MINOR >= 1
|
|
+ rb_obj_reveal(res, rb_cString);
|
|
+#else
|
|
RBASIC(res)->klass = rb_cString;
|
|
+#endif
|
|
}
|
|
return res;
|
|
}
|
|
@@ -301,7 +313,8 @@ bz_io_data_finalize(ptr)
|
|
(*bziv->finalize)(ptr);
|
|
}
|
|
else if (TYPE(bzf->io) == T_FILE) {
|
|
- OpenFile *file = (OpenFile *)ptr;
|
|
+ rb_io_t *file = (rb_io_t *)ptr;
|
|
+#ifndef HAVE_RUBY_IO_H
|
|
if (file->f) {
|
|
fclose(file->f);
|
|
file->f = 0;
|
|
@@ -310,6 +323,16 @@ bz_io_data_finalize(ptr)
|
|
fclose(file->f2);
|
|
file->f2 = 0;
|
|
}
|
|
+#else
|
|
+ if (file->fd) {
|
|
+ close(file->fd);
|
|
+ file->fd = -1;
|
|
+ }
|
|
+ if (file->stdio_file) {
|
|
+ fclose(file->stdio_file);
|
|
+ file->stdio_file = 0;
|
|
+ }
|
|
+#endif
|
|
}
|
|
}
|
|
}
|
|
@@ -396,8 +419,8 @@ bz_str_write(obj, str)
|
|
if (TYPE(str) != T_STRING) {
|
|
rb_raise(rb_eArgError, "expected a String");
|
|
}
|
|
- if (RSTRING(str)->len) {
|
|
- rb_str_cat(obj, RSTRING(str)->ptr, RSTRING(str)->len);
|
|
+ if (RSTRING_LEN(str)) {
|
|
+ rb_str_cat(obj, RSTRING_PTR(str), RSTRING_LEN(str));
|
|
}
|
|
return str;
|
|
}
|
|
@@ -436,7 +459,7 @@ bz_writer_init(argc, argv, obj)
|
|
else {
|
|
VALUE iv;
|
|
struct bz_iv *bziv;
|
|
- OpenFile *fptr;
|
|
+ rb_io_t *fptr;
|
|
|
|
rb_io_taint_check(a);
|
|
if (!rb_respond_to(a, id_write)) {
|
|
@@ -507,8 +530,8 @@ bz_writer_write(obj, a)
|
|
bzf->buflen = BZ_RB_BLOCKSIZE;
|
|
bzf->buf[0] = bzf->buf[bzf->buflen] = '\0';
|
|
}
|
|
- bzf->bzs.next_in = RSTRING(a)->ptr;
|
|
- bzf->bzs.avail_in = RSTRING(a)->len;
|
|
+ bzf->bzs.next_in = RSTRING_PTR(a);
|
|
+ bzf->bzs.avail_in = RSTRING_LEN(a);
|
|
while (bzf->bzs.avail_in) {
|
|
bzf->bzs.next_out = bzf->buf;
|
|
bzf->bzs.avail_out = bzf->buflen;
|
|
@@ -523,7 +546,7 @@ bz_writer_write(obj, a)
|
|
rb_funcall(bzf->io, id_write, 1, rb_str_new(bzf->buf, n));
|
|
}
|
|
}
|
|
- return INT2NUM(RSTRING(a)->len);
|
|
+ return INT2NUM(RSTRING_LEN(a));
|
|
}
|
|
|
|
static VALUE
|
|
@@ -614,7 +637,7 @@ bz_reader_init(argc, argv, obj)
|
|
}
|
|
if (rb_respond_to(a, id_read)) {
|
|
if (TYPE(a) == T_FILE) {
|
|
- OpenFile *fptr;
|
|
+ rb_io_t *fptr;
|
|
|
|
GetOpenFile(a, fptr);
|
|
rb_io_check_readable(fptr);
|
|
@@ -691,14 +714,14 @@ bz_next_available(bzf, in)
|
|
}
|
|
if (!bzf->bzs.avail_in) {
|
|
bzf->in = rb_funcall(bzf->io, id_read, 1, INT2FIX(1024));
|
|
- if (TYPE(bzf->in) != T_STRING || RSTRING(bzf->in)->len == 0) {
|
|
+ if (TYPE(bzf->in) != T_STRING || RSTRING_LEN(bzf->in) == 0) {
|
|
BZ2_bzDecompressEnd(&(bzf->bzs));
|
|
bzf->bzs.avail_out = 0;
|
|
bzf->state = BZ_UNEXPECTED_EOF;
|
|
bz_raise(bzf->state);
|
|
}
|
|
- bzf->bzs.next_in = RSTRING(bzf->in)->ptr;
|
|
- bzf->bzs.avail_in = RSTRING(bzf->in)->len;
|
|
+ bzf->bzs.next_in = RSTRING_PTR(bzf->in);
|
|
+ bzf->bzs.avail_in = RSTRING_LEN(bzf->in);
|
|
}
|
|
if ((bzf->buflen - in) < (BZ_RB_BLOCKSIZE / 2)) {
|
|
bzf->buf = REALLOC_N(bzf->buf, char, bzf->buflen+BZ_RB_BLOCKSIZE+1);
|
|
@@ -780,7 +803,7 @@ bz_read_until(bzf, str, len, td1)
|
|
if (nex) {
|
|
res = rb_str_cat(res, bzf->buf, nex);
|
|
}
|
|
- if (RSTRING(res)->len) {
|
|
+ if (RSTRING_LEN(res)) {
|
|
return res;
|
|
}
|
|
return Qnil;
|
|
@@ -845,8 +868,8 @@ bz_reader_read(argc, argv, obj)
|
|
}
|
|
while (1) {
|
|
total = bzf->bzs.avail_out;
|
|
- if (n != -1 && (RSTRING(res)->len + total) >= n) {
|
|
- n -= RSTRING(res)->len;
|
|
+ if (n != -1 && (RSTRING_LEN(res) + total) >= n) {
|
|
+ n -= RSTRING_LEN(res);
|
|
res = rb_str_cat(res, bzf->bzs.next_out, n);
|
|
bzf->bzs.next_out += n;
|
|
bzf->bzs.avail_out -= n;
|
|
@@ -868,10 +891,10 @@ bz_getc(obj)
|
|
{
|
|
VALUE length = INT2FIX(1);
|
|
VALUE res = bz_reader_read(1, &length, obj);
|
|
- if (NIL_P(res) || RSTRING(res)->len == 0) {
|
|
+ if (NIL_P(res) || RSTRING_LEN(res) == 0) {
|
|
return EOF;
|
|
}
|
|
- return RSTRING(res)->ptr[0];
|
|
+ return RSTRING_PTR(res)[0];
|
|
}
|
|
|
|
static VALUE
|
|
@@ -911,15 +934,15 @@ bz_reader_ungets(obj, a)
|
|
if (!bzf->buf) {
|
|
bz_raise(BZ_SEQUENCE_ERROR);
|
|
}
|
|
- if ((bzf->bzs.avail_out + RSTRING(a)->len) < bzf->buflen) {
|
|
- bzf->bzs.next_out -= RSTRING(a)->len;
|
|
- MEMCPY(bzf->bzs.next_out, RSTRING(a)->ptr, char, RSTRING(a)->len);
|
|
- bzf->bzs.avail_out += RSTRING(a)->len;
|
|
+ if ((bzf->bzs.avail_out + RSTRING_LEN(a)) < bzf->buflen) {
|
|
+ bzf->bzs.next_out -= RSTRING_LEN(a);
|
|
+ MEMCPY(bzf->bzs.next_out, RSTRING_PTR(a), char, RSTRING_LEN(a));
|
|
+ bzf->bzs.avail_out += RSTRING_LEN(a);
|
|
}
|
|
else {
|
|
- bzf->buf = REALLOC_N(bzf->buf, char, bzf->buflen + RSTRING(a)->len + 1);
|
|
- MEMCPY(bzf->buf + bzf->buflen, RSTRING(a)->ptr, char,RSTRING(a)->len);
|
|
- bzf->buflen += RSTRING(a)->len;
|
|
+ bzf->buf = REALLOC_N(bzf->buf, char, bzf->buflen + RSTRING_LEN(a) + 1);
|
|
+ MEMCPY(bzf->buf + bzf->buflen, RSTRING_PTR(a), char,RSTRING_LEN(a));
|
|
+ bzf->buflen += RSTRING_LEN(a);
|
|
bzf->buf[bzf->buflen] = '\0';
|
|
bzf->bzs.next_out = bzf->buf;
|
|
bzf->bzs.avail_out = bzf->buflen;
|
|
@@ -966,8 +989,8 @@ bz_reader_gets_internal(argc, argv, obj,
|
|
if (NIL_P(rs)) {
|
|
return bz_reader_read(1, &rs, obj);
|
|
}
|
|
- rslen = RSTRING(rs)->len;
|
|
- if (rs == rb_default_rs || (rslen == 1 && RSTRING(rs)->ptr[0] == '\n')) {
|
|
+ rslen = RSTRING_LEN(rs);
|
|
+ if (rs == rb_default_rs || (rslen == 1 && RSTRING_PTR(rs)[0] == '\n')) {
|
|
return bz_reader_gets(obj);
|
|
}
|
|
|
|
@@ -977,7 +1000,7 @@ bz_reader_gets_internal(argc, argv, obj,
|
|
rspara = 1;
|
|
}
|
|
else {
|
|
- rsptr = RSTRING(rs)->ptr;
|
|
+ rsptr = RSTRING_PTR(rs);
|
|
rspara = 0;
|
|
}
|
|
|
|
@@ -1024,13 +1047,13 @@ bz_reader_set_unused(obj, a)
|
|
Check_Type(a, T_STRING);
|
|
Get_BZ2(obj, bzf);
|
|
if (!bzf->in) {
|
|
- bzf->in = rb_str_new(RSTRING(a)->ptr, RSTRING(a)->len);
|
|
+ bzf->in = rb_str_new(RSTRING_PTR(a), RSTRING_LEN(a));
|
|
}
|
|
else {
|
|
- bzf->in = rb_str_cat(bzf->in, RSTRING(a)->ptr, RSTRING(a)->len);
|
|
+ bzf->in = rb_str_cat(bzf->in, RSTRING_PTR(a), RSTRING_LEN(a));
|
|
}
|
|
- bzf->bzs.next_in = RSTRING(bzf->in)->ptr;
|
|
- bzf->bzs.avail_in = RSTRING(bzf->in)->len;
|
|
+ bzf->bzs.next_in = RSTRING_PTR(bzf->in);
|
|
+ bzf->bzs.avail_in = RSTRING_LEN(bzf->in);
|
|
return Qnil;
|
|
}
|
|
|
|
@@ -1042,10 +1065,10 @@ bz_reader_getc(obj)
|
|
VALUE len = INT2FIX(1);
|
|
|
|
str = bz_reader_read(1, &len, obj);
|
|
- if (NIL_P(str) || RSTRING(str)->len == 0) {
|
|
+ if (NIL_P(str) || RSTRING_LEN(str) == 0) {
|
|
return Qnil;
|
|
}
|
|
- return INT2FIX(RSTRING(str)->ptr[0] & 0xff);
|
|
+ return INT2FIX(RSTRING_PTR(str)[0] & 0xff);
|
|
}
|
|
|
|
static void
|
|
@@ -1319,7 +1342,7 @@ bz_reader_s_foreach(argc, argv, obj)
|
|
rb_raise(rb_eArgError, "call out of a block");
|
|
}
|
|
rb_scan_args(argc, argv, "11", &fname, &sep);
|
|
- Check_SafeStr(fname);
|
|
+ SafeStringValue(fname);
|
|
arg.argc = argc - 1;
|
|
arg.sep = sep;
|
|
arg.obj = rb_funcall2(rb_mKernel, id_open, 1, &fname);
|
|
@@ -1357,7 +1380,7 @@ bz_reader_s_readlines(argc, argv, obj)
|
|
struct bz_file *bzf;
|
|
|
|
rb_scan_args(argc, argv, "11", &fname, &sep);
|
|
- Check_SafeStr(fname);
|
|
+ SafeStringValue(fname);
|
|
arg.argc = argc - 1;
|
|
arg.sep = sep;
|
|
arg.obj = rb_funcall2(rb_mKernel, id_open, 1, &fname);
|
|
@@ -1411,7 +1434,7 @@ bz_str_read(argc, argv, obj)
|
|
Data_Get_Struct(obj, struct bz_str, bzs);
|
|
rb_scan_args(argc, argv, "01", &len);
|
|
if (NIL_P(len)) {
|
|
- count = RSTRING(bzs->str)->len;
|
|
+ count = RSTRING_LEN(bzs->str);
|
|
}
|
|
else {
|
|
count = NUM2INT(len);
|
|
@@ -1422,13 +1445,13 @@ bz_str_read(argc, argv, obj)
|
|
if (!count || bzs->pos == -1) {
|
|
return Qnil;
|
|
}
|
|
- if ((bzs->pos + count) >= RSTRING(bzs->str)->len) {
|
|
- res = rb_str_new(RSTRING(bzs->str)->ptr + bzs->pos,
|
|
- RSTRING(bzs->str)->len - bzs->pos);
|
|
+ if ((bzs->pos + count) >= RSTRING_LEN(bzs->str)) {
|
|
+ res = rb_str_new(RSTRING_PTR(bzs->str) + bzs->pos,
|
|
+ RSTRING_LEN(bzs->str) - bzs->pos);
|
|
bzs->pos = -1;
|
|
}
|
|
else {
|
|
- res = rb_str_new(RSTRING(bzs->str)->ptr + bzs->pos, count);
|
|
+ res = rb_str_new(RSTRING_PTR(bzs->str) + bzs->pos, count);
|
|
bzs->pos += count;
|
|
}
|
|
return res;
|