static Value ripe_fftw_plan2d_new(Value x, Value y, Value v_sign) { Value v_self = obj_new(klass_FftwPlan2D); FftwPlan2D* self = obj_c_data(v_self); self->x = val_to_int64(x); self->y = val_to_int64(y); if (self->x < 1 or self->y < 1){ exc_raise("invalid dimensions of Fftw.Plan2D (%" PRId64"x%" PRId64")", self->x, self->y); } self->in = (fftw_complex*) fftw_malloc( sizeof(fftw_complex) * self->x * self->y ); self->out = (fftw_complex*) fftw_malloc( sizeof(fftw_complex) * self->x * self->y ); int64 sign = val_to_int64(v_sign); if (sign != FFTW_FORWARD and sign != FFTW_BACKWARD){ exc_raise("invalid flag for FFT (passed %" PRId64")", sign); } self->plan = fftw_plan_dft_2d(self->x, self->y, self->in, self->out, sign, FFTW_ESTIMATE); return v_self; }
void* func_get_ptr(Value v_func, int16 num_params) { obj_verify(v_func, klass_func); Func* c_data = obj_c_data(v_func); if (c_data->num_params != num_params){ exc_raise("func_get_ptr() mismatch (Function has %"PRIu16 " but called with %"PRIu16")", c_data->num_params, num_params); } return (void*) c_data->func0; }
// Map Ripe index to C array index (or throw an exception if it isn't valid. int64 util_index(const char* klass_name, int64 idx, int64 size) { if (idx > 0){ if (idx > size) goto invalid_idx; return idx - 1; } if (idx == 0) goto invalid_idx; if (idx < -size) goto invalid_idx; return size + idx; invalid_idx: exc_raise("invalid index %"PRId64" in %s of size %"PRId64, idx, klass_name, size); }