aboutsummaryrefslogtreecommitdiff
path: root/tclpd.i
blob: 4d889d0bd9c2cc76fff9f4890ee5637909dc7754 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
%module tclpd

%{
#undef EXTERN
#include "tclpd.h"
#define __attribute__(x)
%}

%include exception.i
%include cpointer.i
%include carrays.i
%include typemaps.i

%pointer_functions(t_atom, atom);
%pointer_functions(t_symbol, symbol);

/*
%array_functions(t_atom_array, atom_array);
Creates four functions.

type *new_name(int nelements)
type *delete_name(type *ary)
type name_getitem(type *ary, int index)
void name_setitem(type *ary, int index, type value)
 */

%typemap(in) (int argc, t_atom *argv) {
    if(Tcl_ListObjLength(interp, $input, &$1) == TCL_ERROR) {
        SWIG_exception_fail(SWIG_RuntimeError, "failed to get list length");
    }
    $2 = (t_atom *)getbytes(sizeof(t_atom) * $1);
    int i;
    Tcl_Obj *oi;
    for(i = 0; i < $1; i++) {
        if(Tcl_ListObjIndex(interp, $input, i, &oi) == TCL_ERROR) {
            SWIG_exception_fail(SWIG_RuntimeError, "failed to access list element");
        }
        if(tcl_to_pdatom(oi, &$2[i]) == TCL_ERROR) {
            SWIG_exception_fail(SWIG_RuntimeError, "failed tcl_to_pdatom conversion");
        }
    }
}

%typemap(freearg) (int argc, t_atom *argv) {
    if($2) freebytes($2, sizeof(t_atom) * $1);
}

%typemap(in) t_atom * {
    $1 = (t_atom *)getbytes(sizeof(t_atom));
    if(tcl_to_pdatom($input, $1) == TCL_ERROR) {
        SWIG_exception_fail(SWIG_RuntimeError, "failed tcl_to_pdatom conversion");
    }
}

%typemap(freearg) t_atom * {
    freebytes($1, sizeof(t_atom));
}

%typemap(out) t_atom * {
    Tcl_Obj *lst;
    if(pdatom_to_tcl($1, &lst) == TCL_ERROR) {
        SWIG_exception_fail(SWIG_RuntimeError, "failed pdatom_to_tcl conversion");
    }
    Tcl_SetObjResult(interp, lst);
}

%typemap(in) t_symbol * {
    if(tcl_to_pdsymbol($input, &$1) == TCL_ERROR) {
        SWIG_exception_fail(SWIG_RuntimeError, "failed tcl_to_pdsymbol conversion");
    }
}

%typemap(out) t_symbol * {
    Tcl_Obj *lst;
    if(pdsymbol_to_tcl($1, &lst) == TCL_ERROR) {
        SWIG_exception_fail(SWIG_RuntimeError, "failed pdsymbol_to_tcl conversion");
    }
    Tcl_SetObjResult(interp, lst);
}

%typemap(in) t_tcl * {
    const char *str = Tcl_GetStringFromObj($input, NULL);
    $1 = object_table_get(str);
    SWIG_contract_assert($1, "not a t_tcl * instance") {};
}

%typemap(in) t_pd * {
    const char *str = Tcl_GetStringFromObj($input, NULL);
    $1 = object_table_get(str);
    SWIG_contract_assert($1, "not a t_pd * instance") {};
    // XXX: %typemap(out) missing!!!
}

%typemap(in) t_text * {
    int res = SWIG_ConvertPtr($input, &$1, $1_descriptor, 0 |  0 );
    if(!SWIG_IsOK(res)) {
        const char *str = Tcl_GetStringFromObj($input, NULL);
        t_tcl *x = object_table_get(str);
        SWIG_contract_assert(x, "not a t_text * instance") {};
        $1 = &x->o;
    }
}

%typemap(in) t_object * {
    const char *str = Tcl_GetStringFromObj($input, NULL);
    t_tcl *x = object_table_get(str);
    SWIG_contract_assert(x, "not a t_object * instance") {};
    $1 = &x->o;
}

%typemap(in) struct _class * {
    const char *str = Tcl_GetStringFromObj($input, NULL);
    t_class *c = class_table_get(str);
    SWIG_contract_assert(c, "invalid class name") {};
    $1 = c;
}

/* functions that are in m_pd.h but don't exist in modern versions of pd */
%ignore pd_getfilename;
%ignore pd_getdirname;
%ignore pd_anything;
%ignore class_parentwidget;
%ignore sys_isreadablefile;
%ignore garray_get;
%ignore c_extern;
%ignore c_addmess;

/* functions that we can't auto-wrap, because they have varargs */
%ignore post;
%ignore class_new;

/* functions that we can't auto-wrap, because <insert reason here> */
%ignore glist_new;
%ignore canvas_zapallfortemplate;
%ignore canvas_fattenforscalars;
%ignore canvas_visforscalars;
%ignore canvas_clicksub;
%ignore text_xcoord;
%ignore text_ycoord;
%ignore canvas_getglistonsuper;
%ignore canvas_getfont;
%ignore canvas_setusedastemplate;
%ignore canvas_vistext;
%ignore rtext_remove;
%ignore canvas_recurapply;
%ignore gobj_properties;

/* function that we don't want to wrap, because they are internal */
%ignore tclpd_setup;
%ignore tclpd_interp_error;
%ignore tcl_to_pdatom;
%ignore tcl_to_pdsymbol;
%ignore pdatom_to_tcl;
%ignore pdsymbol_to_tcl;
%ignore class_table_add;
%ignore class_table_remove;
%ignore class_table_get;
%ignore object_table_add;
%ignore object_table_remove;
%ignore object_table_get;

/* not needed - typemaps take care of this */
%ignore gensym;

/* end of ignore-list */

%include "m_pd.h"
%include "g_canvas.h"
%include "tclpd.h"

/* this does the trick of solving
 TypeError in method 'xyz', argument 4 of type 't_atom *' */
/*%name(outlet_list) EXTERN void outlet_list(t_outlet *x, t_symbol *s, int argc, t_atom_array *argv);
%name(outlet_anything) EXTERN void outlet_anything(t_outlet *x, t_symbol *s, int argc, t_atom_array *argv);
*/