1 %header %{
2     #ifndef SWIG
3     typedef struct
4     {
5         SV *fct;
6         SV *data;
7     } SavedEnv;
8     #endif
callback_d_cp_vp(double d,const char * cp,void * vp)9     int callback_d_cp_vp(double d, const char *cp, void *vp)
10     {
11         int count, ret;
12         SavedEnv *env_ptr = (SavedEnv *)vp;
13         dSP;
14         ENTER;
15         SAVETMPS;
16         PUSHMARK(SP);
17         XPUSHs(sv_2mortal(newSVnv(d)));
18         XPUSHs(sv_2mortal(newSVpv(cp, 0)));
19         if (env_ptr->data)
20             XPUSHs(env_ptr->data);
21         PUTBACK;
22         count = call_sv(env_ptr->fct, G_SCALAR);
23         SPAGAIN;
24         if (count != 1) {
25             fprintf(stderr, "The callback must return only one value.\n");
26             return 0; /* interrupt */
27         }
28         ret = POPi;
29         PUTBACK;
30         FREETMPS;
31         LEAVE;
32         return ret;
33     }
34     #ifndef SWIG
35     static SV *VSIStdoutSetRedirectionFct = &PL_sv_undef;
36     #endif
callback_fwrite(const void * ptr,size_t size,size_t nmemb,FILE * stream)37     size_t callback_fwrite(const void *ptr, size_t size, size_t nmemb,
38                            FILE *stream)
39     {
40         dSP;
41         ENTER;
42         SAVETMPS;
43         PUSHMARK(SP);
44         XPUSHs(sv_2mortal(newSVpv((const char*)ptr, size*nmemb)));
45         PUTBACK;
46         call_sv(VSIStdoutSetRedirectionFct, G_DISCARD);
47         FREETMPS;
48         LEAVE;
49         return size*nmemb;
50     }
51 %}
52