%module ruby_manual_proxy %typemap(in, numinputs=0) SWIGTYPE ** ($*1_ltype temp) "$1 = &temp;"; %typemap(argout) SWIGTYPE **OUTPARAM { $result = SWIG_Ruby_AppendOutput($result, SWIG_NewPointerObj(*$1, $*1_descriptor, 0)); } %apply SWIGTYPE **OUTPARAM { svn_fs_t ** }; %typemap(check) svn_fs_t * { if (!$1) { svn_swig_rb_raise_svn_fs_already_close(); } } %{ typedef struct svn_fs_t { char path[256]; } svn_fs_t; void svn_fs_create(svn_fs_t **fs_p, const char *path) { svn_fs_t *fs = (svn_fs_t *)malloc(sizeof(svn_fs_t)); strncpy(fs->path, path, 256); *fs_p = fs; } const char *svn_fs_path(svn_fs_t *fs) { return fs->path; } %} typedef struct svn_fs_t svn_fs_t; void svn_fs_create(svn_fs_t **fs_p, const char *path); const char *svn_fs_path(svn_fs_t *fs); %{ static void svn_swig_rb_raise_svn_fs_already_close(void) { rb_raise(rb_eIOError, "already closed"); } static VALUE svn_fs_swig_rb_close(VALUE self) { if (!DATA_PTR(self)) { svn_swig_rb_raise_svn_fs_already_close(); } DATA_PTR(self) = NULL; return Qnil; } static VALUE svn_fs_swig_rb_closed(VALUE self) { return DATA_PTR(self) ? Qfalse : Qtrue; } %} %insert("init") %{ { VALUE cSvnfs; cSvnfs = rb_const_get(_mSWIG, rb_intern("TYPE_p_svn_fs_t")); rb_define_method(cSvnfs, "close", VALUEFUNC(svn_fs_swig_rb_close), 0); } %}