# 21 SWIG and MzScheme

- Creating native MzScheme structures

This section contains information on SWIG's support of MzScheme.

## 21.1 Creating native MzScheme structures

Example interface file:

    /* define a macro for the struct creation */
    %define handle_ptr(TYPE,NAME)
    %typemap(mzscheme,argout) TYPE *NAME{
        Scheme_Object *o = SWIG_NewStructFromPtr($1, $*1_mangle);
        SWIG_APPEND_VALUE(o);
    }

    %typemap(mzscheme,in,numinputs=0) TYPE *NAME (TYPE temp) {
        $1 = &temp;
    }
    %enddef

    /* setup the typemaps for the pointer to an output parameter cntrs */
    handle_ptr(struct diag_cntrs, cntrs);

Then in scheme, you can use regular struct access procedures like

    	; suppose a function created a struct foo as
    	; (define foo (make-diag-cntrs (#x1 #x2 #x3) (make-inspector))
    	; Then you can do
    	(format "0x~x" (diag-cntrs-field1 foo))
    	(format "0x~x" (diag-cntrs-field2 foo))
    	;etc...

That's pretty much it. It works with nested structs as well.