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