aboutsummaryrefslogtreecommitdiff
path: root/tcl.i
blob: af4628be0763d17a0cc67e85671ee70aeef9c1ff (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
%module tclpd
%include exception.i
%include cpointer.i

#define __attribute__(x)

/* 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;

/* end of ignore-list */

%include "m_pd.h"
%include "g_canvas.h"
%include "tcl_extras.h"

%{
    #include "m_pd.h"
    #include "tcl_extras.h"

    typedef t_atom t_atom_array;
%}

/* 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);

%typemap(in) (int argc, t_atom *argv) {
    if(Tcl_ListObjLength(tcl_for_pd, $input, &$1) == TCL_ERROR)
        return TCL_ERROR;
    $2 = (t_atom *)getbytes(sizeof(t_atom) * $1);
    int i;
    Tcl_Obj *oi;
    for(i = 0; i < len; i++) {
        oi = Tcl_ListObjIndex(tcl_for_pd, $input, i, &oi);
        if(tcl_to_pdatom(oi, $2[i]) == TCL_ERROR) {
            SWIG_fail;
        }
    }
}

%typemap(in) t_atom * {
    t_atom *a = (t_atom*)getbytes(sizeof(t_atom));
    if(tcl_to_pdatom($input, a) == TCL_ERROR) {
        SWIG_fail;
    }
    $1 = a;
}

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

%typemap(out) t_atom * {
    Tcl_Obj* res_obj;
    if(pdatom_to_tcl($1, &res_obj) == TCL_ERROR) {
        SWIG_fail;
    }
    Tcl_SetObjResult(tcl_for_pd, res_obj);
}

%typemap(in) t_symbol * {
    t_symbol *s;
    if(tcl_to_pdsymbol($input, &s) == TCL_ERROR) {
        SWIG_fail;
    }
    $1 = s;
}

%typemap(out) t_symbol * {
    Tcl_Obj* res_obj;
    if(pdsymbol_to_tcl($1, &res_obj) == TCL_ERROR) {
        SWIG_fail;
    }
    Tcl_SetObjResult(tcl_for_pd, res_obj);
}

/* helper functions for t_atom arrays */
%inline %{
    t_atom_array *new_atom_array(int size) {
        return (t_atom_array*)getbytes(size*sizeof(t_atom));
    }

    void delete_atom_array(t_atom_array *a, int size) {
        freebytes(a, size*sizeof(t_atom));
    }

    t_atom* get_atom_array(t_atom_array *a, int index) {
        return &a[index];
    }

    void set_atom_array(t_atom_array *a, int index, t_atom *n) {
        memcpy(&a[index], n, sizeof(t_atom));
    }
%}