summaryrefslogtreecommitdiff
path: root/Examples/chicken/zlib/example.i
diff options
context:
space:
mode:
Diffstat (limited to 'Examples/chicken/zlib/example.i')
-rw-r--r--Examples/chicken/zlib/example.i76
1 files changed, 76 insertions, 0 deletions
diff --git a/Examples/chicken/zlib/example.i b/Examples/chicken/zlib/example.i
new file mode 100644
index 0000000..dd962ad
--- /dev/null
+++ b/Examples/chicken/zlib/example.i
@@ -0,0 +1,76 @@
+/* File : example.i */
+%module example
+%{
+/* Put headers and other declarations here */
+#include "zlib.h"
+%}
+
+%include typemaps.i
+
+%rename(VERSION) ZLIB_VERSION;
+%rename(z_error) zError;
+%apply char * { Bytef * };
+
+/* Allow the sourceLen to be automatically filled in from the length
+ of the 'source' string */
+%typemap(in) (const Bytef *source, uLong sourceLen)
+%{ if (!C_swig_is_string ($input)) {
+ swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Argument $input is not a string");
+ }
+ $2 = (uLong) C_header_size ($input);
+ $1 = C_c_string ($input);
+%}
+
+/* Allocate space the size of which is determined by the Scheme
+ integer argument, and make a temporary integer so we can set
+ destLen. */
+%typemap(in) (Bytef *dest, uLongf *destLen) (uLong len)
+%{ if (!C_swig_is_fixnum ($input)) {
+ swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Argument $input is not a integer");
+ }
+ len = (uLong) C_unfix ($input);
+ $2 = &len;
+ $1 = (char *) malloc (*$2);
+%}
+
+/* Return the mutated string as a new object. */
+%typemap(argout) (Bytef *dest, uLongf *destLen)
+(C_word *scmstr)
+%{ scmstr = C_alloc (C_SIZEOF_STRING (*$2));
+ SWIG_APPEND_VALUE(C_string (&scmstr, *$2, $1));
+ free ($1);
+%}
+
+%include "zconf.h"
+%include "zlib.h"
+
+/* Ignore destLen as an input argument, and make a temporary integer so
+ we can set destLen. */
+%typemap(numinputs=0) uLongf *destLen (uLong len)
+"$1 = &len;";
+
+/* Return a sized string as a new object. */
+%typemap(argout)
+(void *outstr, uLongf *destLen) (C_word *scmstr)
+%{ scmstr = C_alloc (C_SIZEOF_STRING (*$2));
+ SWIG_APPEND_VALUE(C_string (&scmstr, *$2, $1));
+%}
+
+%inline %{
+/* %inline blocks are seen by SWIG and are inserted into the header
+ portion of example_wrap.c, so that they are also seen by the C
+ compiler. */
+int deflate_init(z_streamp strm, int level) {
+ return deflateInit(strm,level); /* call macro */
+}
+int inflate_init(z_streamp strm) {
+ return inflateInit(strm); /* call macro */
+}
+void* z_stream_save_next_out(z_streamp strm) {
+ return (void*) strm->next_out;
+}
+void z_stream_get_next_chunk(z_streamp strm, void *outstr, uLongf *destLen) {
+ *destLen = strm->next_out - (Bytef*)outstr;
+}
+%}
+