%module "Math::GSL::Poly" // this brakes stuff // %include "typemaps.i" %include "gsl_typemaps.i" %include "renames.i" %{ #include "gsl/gsl_sys.h" %} %typemap(in) double * (double dvalue) { SV* tempsv; if (!SvROK($input)) { croak("$input is not a reference!\n"); } tempsv = SvRV($input); if ((!SvNOK(tempsv)) && (!SvIOK(tempsv))) { croak("$input is not a reference to number!\n"); } dvalue = SvNV(tempsv); $1 = &dvalue; } #gsl_complex gsl_complex_poly_complex_eval (const gsl_complex c [], const int len, const gsl_complex z); %typemap(argout) gsl_complex { AV* tempav = newAV(); double x,y; if (argvi >= items) { EXTEND(sp,1); } //fprintf(stderr,"--> %g <--\n", GSL_REAL($1)); //fprintf(stderr,"--> %g <--\n", GSL_IMAG($1)); $result = sv_newmortal(); x = GSL_REAL($1); y = GSL_IMAG($1); /* the next 2 lines blow up sv_setnv($result, x); argvi++; */ }; %typemap(argout) double * { SV *tempsv; tempsv = SvRV($input); sv_setnv(tempsv, *$1); } %typemap(in) gsl_complex const [] { AV *tempav; I32 len; int i, magic, stuff; double x,y; gsl_complex z; SV **elem, **helem, **real, **imag; HV *hash, *htmp; SV *svtmp, tmp; double result[2]; printf("gsl_complex typemap\n"); if (!SvROK($input)) croak("Math::GSL : $input is not a reference!"); if (SvTYPE(SvRV($input)) != SVt_PVAV) croak("Math::GSL : $input is not an array ref!"); z = gsl_complex_rect(0,0); tempav = (AV*)SvRV($input); len = av_len(tempav); $1 = (gsl_complex *) malloc((len+1)*sizeof(gsl_complex)); for (i = 0; i <= len; i++) { elem = av_fetch(tempav, i, 0); hash = (HV*) SvRV(*elem); helem = hv_fetch(hash, "dat", 3, 0); magic = mg_get(*helem); if ( magic != 0) croak("FETCH magic failed!\n"); printf("magic = %d\n", magic); if( *helem == NULL) croak("Structure does not contain 'dat' element\n"); printf("helem is:\n"); //Perl_sv_dump(*helem); if( i == 0){ svtmp = (SV*)SvRV(*helem); //Perl_sv_dump(svtmp); } printf("re z = %f\n", GSL_REAL(z) ); printf("im z = %f\n", GSL_IMAG(z) ); $1[i] = z; } } %{ #include "gsl/gsl_nan.h" #include "gsl/gsl_poly.h" #include "gsl/gsl_complex.h" #include "gsl/gsl_complex_math.h" %} %include "gsl/gsl_nan.h" %include "gsl/gsl_poly.h" %include "gsl/gsl_complex.h" %include "gsl/gsl_complex_math.h" %include "../pod/Poly.pod"