Hi,
Does anybody have example code that uses the ZLib bindings? I tried to
implement the example described at http://zlib.net/zlib_how.html for
inflation, but compilation failed with errors from gcc about STATUS_OK
etc. symbols not being found. The following patch helped with that for
some reason.
Also, I don't understand how Vala can handle memory for the next_in and
next_out pointers when the inflate call is changing those pointers under
its nose. Wouldn't it be more realistic not to wrap them as an array?
I attached test code that works with this VAPI change (to be compiled
with -X -lz). Any way to make it work without it?
thanks
Philipp
diff --git a/vapi/zlib.vapi b/vapi/zlib.vapi
index b615f6f..14cc973 100644
--- a/vapi/zlib.vapi
+++ b/vapi/zlib.vapi
@@ -49,16 +49,24 @@ namespace ZLib {
public const int BLOCK;
}
- [CCode (cprefix = "Z_")]
namespace Status {
+ [CCode (cname = "Z_OK")]
public const int OK;
+ [CCode (cname = "Z_STREAM_END")]
public const int STREAM_END;
+ [CCode (cname = "Z_NEED_DICT")]
public const int NEED_DICT;
+ [CCode (cname = "Z_ERRNO")]
public const int ERRNO;
+ [CCode (cname = "Z_STREAM_ERROR")]
public const int STREAM_ERROR;
+ [CCode (cname = "Z_DATA_ERROR")]
public const int DATA_ERROR;
+ [CCode (cname = "Z_MEM_ERROR")]
public const int MEM_ERROR;
+ [CCode (cname = "Z_BUF_ERROR")]
public const int BUF_ERROR;
+ [CCode (cname = "Z_VERSION_ERROR")]
public const int VERSION_ERROR;
}
@@ -98,12 +106,12 @@ namespace ZLib {
[CCode (cname = "z_stream", destroy_function = "deflateEnd")]
public struct Stream {
- [CCode (array_length_cname = "avail_in", array_length_type =
"guint")]
- public uchar[] next_in;
+ public uchar* next_in;
+ public uint avail_in;
public ulong total_in;
- [CCode (array_length_cname = "avail_out", array_length_type =
"guint")]
- public uchar[] next_out;
+ public uchar* next_out;
+ public uint avail_out;
public ulong total_out;
public string? msg;
using GLib;
using ZLib;
class ZLibTest : Object {
// 16KB buffer size
const int CHUNK = 16*1024;
uchar[] buf_in;
uchar[] buf_out;
construct {
buf_in = new uchar[CHUNK];
buf_out = new uchar[CHUNK];
}
public int inflate (InputStream source, OutputStream dest) throws Error {
uint have;
int ret = Status.OK;
var strm = InflateStream.full (15 | 32); // no way to check if this failed...
// decompress until deflate stream ends or end of file
do {
strm.avail_in = (int) source.read (buf_in, CHUNK, null);
if (strm.avail_in == 0)
break;
strm.next_in = buf_in;
// run inflate() on input until output buffer not full
do {
strm.avail_out = buf_out.length;
strm.next_out = buf_out;
ret = strm.inflate (Flush.NONE);
assert (ret != Status.STREAM_ERROR); // state not clobbered
if (ret == Status.NEED_DICT)
ret = Status.DATA_ERROR; // and fall through
switch (ret) {
case Status.DATA_ERROR:
case Status.MEM_ERROR:
return ret;
}
have = CHUNK - strm.avail_out;
if (dest.write (buf_out, have, null) != have)
return Status.ERRNO;
} while (strm.avail_out == 0);
// done when inflate () says it's done
} while (ret != Status.STREAM_END);
return ret == Status.STREAM_END ? Status.OK : Status.DATA_ERROR;
}
public static int main (string[] argv) {
var zlib_test = new ZLibTest ();
var infile = File.new_for_path ("test.gz");
var outfile = File.new_for_path ("test.jpg");
InputStream instream;
OutputStream outstream;
try {
instream = infile.read (null);
outstream = outfile.create (FileCreateFlags.NONE, null);
return zlib_test.inflate (instream, outstream);
} catch (Error e) {
stderr.printf ("Error: %s\n", e.message);
return -1;
}
}
}
_______________________________________________
Vala-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/vala-list