fftw module plugged. 08/9008/11
Cedric Delamarre [Fri, 14 Sep 2012 09:10:20 +0000 (11:10 +0200)]
Change-Id: I8712b76397e8a2b9dc734fb5f9b20a22d35563f8

20 files changed:
scilab/etc/modules.xml.in
scilab/modules/fftw/Makefile.am
scilab/modules/fftw/Makefile.in
scilab/modules/fftw/fftw.vcxproj
scilab/modules/fftw/fftw.vcxproj.filters
scilab/modules/fftw/includes/fftw_gw.hxx
scilab/modules/fftw/includes/gw_fftw.h
scilab/modules/fftw/sci_gateway/c/sci_dct.c [deleted file]
scilab/modules/fftw/sci_gateway/c/sci_dst.c [deleted file]
scilab/modules/fftw/sci_gateway/c/sci_fftw.c [deleted file]
scilab/modules/fftw/sci_gateway/cpp/sci_dct.cpp [new file with mode: 0644]
scilab/modules/fftw/sci_gateway/cpp/sci_dst.cpp [new file with mode: 0644]
scilab/modules/fftw/sci_gateway/cpp/sci_fftw.cpp [new file with mode: 0644]
scilab/modules/fftw/sci_gateway/fftw_gateway.xml [deleted file]
scilab/modules/fftw/src/c/sci_data_utilities.c [deleted file]
scilab/modules/fftw/src/c/sci_data_utilities.h [deleted file]
scilab/modules/fftw/src/cpp/fftw_common.cpp [new file with mode: 0644]
scilab/modules/fftw/src/cpp/fftw_common.hxx [new file with mode: 0644]
scilab/modules/fftw/tests/nonreg_tests/bug_9647.dia.ref [deleted file]
scilab/modules/fftw/tests/nonreg_tests/bug_9647.tst [deleted file]

index edf8a50..bb64757 100644 (file)
@@ -63,7 +63,7 @@
 <module name="scicos" activate="@XCOS_ENABLE@"/>
 <module name="scicos_blocks" activate="@XCOS_ENABLE@"/>
 <!-- comments -->
-<module name="fftw" activate="no"/><!-- @FFTW_ENABLE@ -->
+<module name="fftw" activate="@FFTW_ENABLE@"/>
 <module name="umfpack" activate="@UMFPACK_ENABLE@"/>
 <module name="module_skeleton" activate="no"/>
 <!-- comments -->
index f24c558..e81a33e 100644 (file)
@@ -39,33 +39,35 @@ FFTW_C_SOURCES = \
     src/c/callfftw.c \
     src/c/fftwlibname.c \
     src/c/fftw_utilities.c \
-    src/c/sci_data_utilities.c \
     src/c/with_fftw.c
 
+FFTW_CPP_SOURCES = \
+    src/cpp/fftw_common.cpp
+
 GATEWAY_C_SOURCES = \
     sci_gateway/c/gw_fftw.c \
        sci_gateway/c/sci_fftwlibraryisloaded.c \
        sci_gateway/c/sci_disposefftwlibrary.c \
-       sci_gateway/c/sci_fftw.c \
        sci_gateway/c/sci_fftw_flags.c \
        sci_gateway/c/sci_loadfftwlibrary.c \
        sci_gateway/c/sci_get_fftw_wisdom.c \
        sci_gateway/c/sci_set_fftw_wisdom.c \
-       sci_gateway/c/sci_fftw_forget_wisdom.c \
-       sci_gateway/c/sci_dct.c \
-       sci_gateway/c/sci_dst.c
+       sci_gateway/c/sci_fftw_forget_wisdom.c
 
 GATEWAY_CPP_SOURCES = \
-    sci_gateway/cpp/fftw_gw.cpp
+    sci_gateway/cpp/fftw_gw.cpp \
+    sci_gateway/cpp/sci_fftw.cpp \
+    sci_gateway/cpp/sci_dst.cpp \
+    sci_gateway/cpp/sci_dct.cpp
 
 #### fftw : Conf files ####
 libscifftw_la_root_DATA =  license.txt
 
 #### fftw : gateway declaration ####
-libscifftw_la_sci_gatewaydir = $(mydatadir)/sci_gateway
-libscifftw_la_sci_gateway_DATA = sci_gateway/fftw_gateway.xml
+#libscifftw_la_sci_gatewaydir = $(mydatadir)/sci_gateway
+#libscifftw_la_sci_gateway_DATA = sci_gateway/fftw_gateway.xml
 
-libscifftw_algo_la_SOURCES = $(FFTW_C_SOURCES)
+libscifftw_algo_la_SOURCES = $(FFTW_C_SOURCES) $(FFTW_CPP_SOURCES)
 libscifftw_la_SOURCES = $(GATEWAY_C_SOURCES)  $(GATEWAY_CPP_SOURCES)
 libscifftw_algo_la_CPPFLAGS = $(libscifftw_la_CPPFLAGS)
 
@@ -78,6 +80,7 @@ libscifftw_la_LIBADD = libscifftw-algo.la $(FFTW3_LIB)
 libscifftw_la_CPPFLAGS = \
     -I$(srcdir)/includes/ \
     -I$(srcdir)/src/c/ \
+    -I$(srcdir)/src/cpp/ \
     -I$(top_srcdir)/modules/ast/includes/ast/ \
     -I$(top_srcdir)/modules/ast/includes/exps/ \
     -I$(top_srcdir)/modules/ast/includes/operations/ \
@@ -86,6 +89,8 @@ libscifftw_la_CPPFLAGS = \
     -I$(top_srcdir)/modules/ast/includes/system_env/ \
     -I$(top_srcdir)/modules/ast/includes/types/ \
     -I$(top_srcdir)/modules/ast/includes/analysis/ \
+    -I$(top_srcdir)/modules/threads/includes/ \
+    -I$(top_srcdir)/modules/console/includes/ \
     -I$(top_srcdir)/modules/dynamic_link/includes/ \
     -I$(top_srcdir)/modules/fileio/includes/ \
     -I$(top_srcdir)/modules/output_stream/includes/ \
@@ -106,6 +111,7 @@ libscifftw_la_SOURCES = $(FFTW_CPP_SOURCES)
 libscifftw_la_CPPFLAGS = \
 -I$(srcdir)/includes/ \
     -I$(srcdir)/src/c/ \
+    -I$(srcdir)/src/cpp/ \
     -I$(top_srcdir)/modules/ast/includes/ast/ \
     -I$(top_srcdir)/modules/ast/includes/exps/ \
     -I$(top_srcdir)/modules/ast/includes/operations/ \
index 7774945..2545366 100644 (file)
@@ -165,20 +165,21 @@ am__uninstall_files_from_dir = { \
   }
 am__installdirs = "$(DESTDIR)$(pkglibdir)" \
        "$(DESTDIR)$(libscifftw_la_etcdir)" \
-       "$(DESTDIR)$(libscifftw_la_rootdir)" \
-       "$(DESTDIR)$(libscifftw_la_sci_gatewaydir)"
+       "$(DESTDIR)$(libscifftw_la_rootdir)"
 LTLIBRARIES = $(noinst_LTLIBRARIES) $(pkglib_LTLIBRARIES)
 libscifftw_algo_la_LIBADD =
 am__libscifftw_algo_la_SOURCES_DIST = src/c/callfftw.c \
-       src/c/fftwlibname.c src/c/fftw_utilities.c \
-       src/c/sci_data_utilities.c src/c/with_fftw.c
+       src/c/fftwlibname.c src/c/fftw_utilities.c src/c/with_fftw.c \
+       src/nofftw/nofftw.cpp src/cpp/fftw_common.cpp
 am__dirstamp = $(am__leading_dot)dirstamp
 @FFTW_TRUE@am__objects_1 = src/c/libscifftw_algo_la-callfftw.lo \
 @FFTW_TRUE@    src/c/libscifftw_algo_la-fftwlibname.lo \
 @FFTW_TRUE@    src/c/libscifftw_algo_la-fftw_utilities.lo \
-@FFTW_TRUE@    src/c/libscifftw_algo_la-sci_data_utilities.lo \
 @FFTW_TRUE@    src/c/libscifftw_algo_la-with_fftw.lo
-@FFTW_TRUE@am_libscifftw_algo_la_OBJECTS = $(am__objects_1)
+@FFTW_FALSE@am__objects_2 = src/nofftw/libscifftw_algo_la-nofftw.lo
+@FFTW_TRUE@am__objects_2 = src/cpp/libscifftw_algo_la-fftw_common.lo
+@FFTW_TRUE@am_libscifftw_algo_la_OBJECTS = $(am__objects_1) \
+@FFTW_TRUE@    $(am__objects_2)
 libscifftw_algo_la_OBJECTS = $(am_libscifftw_algo_la_OBJECTS)
 AM_V_lt = $(am__v_lt_@AM_V@)
 am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
@@ -190,31 +191,33 @@ am__DEPENDENCIES_1 =
 @FFTW_TRUE@libscifftw_la_DEPENDENCIES = libscifftw-algo.la \
 @FFTW_TRUE@    $(am__DEPENDENCIES_1)
 am__libscifftw_la_SOURCES_DIST = src/nofftw/nofftw.cpp \
-       sci_gateway/c/gw_fftw.c \
+       src/cpp/fftw_common.cpp sci_gateway/c/gw_fftw.c \
        sci_gateway/c/sci_fftwlibraryisloaded.c \
        sci_gateway/c/sci_disposefftwlibrary.c \
-       sci_gateway/c/sci_fftw.c sci_gateway/c/sci_fftw_flags.c \
+       sci_gateway/c/sci_fftw_flags.c \
        sci_gateway/c/sci_loadfftwlibrary.c \
        sci_gateway/c/sci_get_fftw_wisdom.c \
        sci_gateway/c/sci_set_fftw_wisdom.c \
-       sci_gateway/c/sci_fftw_forget_wisdom.c sci_gateway/c/sci_dct.c \
-       sci_gateway/c/sci_dst.c sci_gateway/cpp/fftw_gw.cpp
-@FFTW_FALSE@am__objects_2 = src/nofftw/libscifftw_la-nofftw.lo
-@FFTW_TRUE@am__objects_3 = sci_gateway/c/libscifftw_la-gw_fftw.lo \
+       sci_gateway/c/sci_fftw_forget_wisdom.c \
+       sci_gateway/cpp/fftw_gw.cpp sci_gateway/cpp/sci_fftw.cpp \
+       sci_gateway/cpp/sci_dst.cpp sci_gateway/cpp/sci_dct.cpp
+@FFTW_FALSE@am__objects_3 = src/nofftw/libscifftw_la-nofftw.lo
+@FFTW_TRUE@am__objects_3 = src/cpp/libscifftw_la-fftw_common.lo
+@FFTW_TRUE@am__objects_4 = sci_gateway/c/libscifftw_la-gw_fftw.lo \
 @FFTW_TRUE@    sci_gateway/c/libscifftw_la-sci_fftwlibraryisloaded.lo \
 @FFTW_TRUE@    sci_gateway/c/libscifftw_la-sci_disposefftwlibrary.lo \
-@FFTW_TRUE@    sci_gateway/c/libscifftw_la-sci_fftw.lo \
 @FFTW_TRUE@    sci_gateway/c/libscifftw_la-sci_fftw_flags.lo \
 @FFTW_TRUE@    sci_gateway/c/libscifftw_la-sci_loadfftwlibrary.lo \
 @FFTW_TRUE@    sci_gateway/c/libscifftw_la-sci_get_fftw_wisdom.lo \
 @FFTW_TRUE@    sci_gateway/c/libscifftw_la-sci_set_fftw_wisdom.lo \
-@FFTW_TRUE@    sci_gateway/c/libscifftw_la-sci_fftw_forget_wisdom.lo \
-@FFTW_TRUE@    sci_gateway/c/libscifftw_la-sci_dct.lo \
-@FFTW_TRUE@    sci_gateway/c/libscifftw_la-sci_dst.lo
-@FFTW_TRUE@am__objects_4 = sci_gateway/cpp/libscifftw_la-fftw_gw.lo
-@FFTW_FALSE@am_libscifftw_la_OBJECTS = $(am__objects_2)
-@FFTW_TRUE@am_libscifftw_la_OBJECTS = $(am__objects_3) \
-@FFTW_TRUE@    $(am__objects_4)
+@FFTW_TRUE@    sci_gateway/c/libscifftw_la-sci_fftw_forget_wisdom.lo
+@FFTW_TRUE@am__objects_5 = sci_gateway/cpp/libscifftw_la-fftw_gw.lo \
+@FFTW_TRUE@    sci_gateway/cpp/libscifftw_la-sci_fftw.lo \
+@FFTW_TRUE@    sci_gateway/cpp/libscifftw_la-sci_dst.lo \
+@FFTW_TRUE@    sci_gateway/cpp/libscifftw_la-sci_dct.lo
+@FFTW_FALSE@am_libscifftw_la_OBJECTS = $(am__objects_3)
+@FFTW_TRUE@am_libscifftw_la_OBJECTS = $(am__objects_4) \
+@FFTW_TRUE@    $(am__objects_5)
 libscifftw_la_OBJECTS = $(am_libscifftw_la_OBJECTS)
 libscifftw_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
        $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
@@ -282,8 +285,7 @@ am__can_run_installinfo = \
     n|no|NO) false;; \
     *) (install-info --version) >/dev/null 2>&1;; \
   esac
-DATA = $(libscifftw_la_etc_DATA) $(libscifftw_la_root_DATA) \
-       $(libscifftw_la_sci_gateway_DATA)
+DATA = $(libscifftw_la_etc_DATA) $(libscifftw_la_root_DATA)
 am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
 # Read a list of newline-separated strings from the standard input,
 # and print each of them once, without duplicates.  Input order is
@@ -608,33 +610,36 @@ libscifftw_la_etc_DATA = \
 @FFTW_TRUE@    src/c/callfftw.c \
 @FFTW_TRUE@    src/c/fftwlibname.c \
 @FFTW_TRUE@    src/c/fftw_utilities.c \
-@FFTW_TRUE@    src/c/sci_data_utilities.c \
 @FFTW_TRUE@    src/c/with_fftw.c
 
+@FFTW_FALSE@FFTW_CPP_SOURCES = src/nofftw/nofftw.cpp
+@FFTW_TRUE@FFTW_CPP_SOURCES = \
+@FFTW_TRUE@    src/cpp/fftw_common.cpp
+
 @FFTW_TRUE@GATEWAY_C_SOURCES = \
 @FFTW_TRUE@    sci_gateway/c/gw_fftw.c \
 @FFTW_TRUE@    sci_gateway/c/sci_fftwlibraryisloaded.c \
 @FFTW_TRUE@    sci_gateway/c/sci_disposefftwlibrary.c \
-@FFTW_TRUE@    sci_gateway/c/sci_fftw.c \
 @FFTW_TRUE@    sci_gateway/c/sci_fftw_flags.c \
 @FFTW_TRUE@    sci_gateway/c/sci_loadfftwlibrary.c \
 @FFTW_TRUE@    sci_gateway/c/sci_get_fftw_wisdom.c \
 @FFTW_TRUE@    sci_gateway/c/sci_set_fftw_wisdom.c \
-@FFTW_TRUE@    sci_gateway/c/sci_fftw_forget_wisdom.c \
-@FFTW_TRUE@    sci_gateway/c/sci_dct.c \
-@FFTW_TRUE@    sci_gateway/c/sci_dst.c
+@FFTW_TRUE@    sci_gateway/c/sci_fftw_forget_wisdom.c
 
 @FFTW_TRUE@GATEWAY_CPP_SOURCES = \
-@FFTW_TRUE@    sci_gateway/cpp/fftw_gw.cpp
+@FFTW_TRUE@    sci_gateway/cpp/fftw_gw.cpp \
+@FFTW_TRUE@    sci_gateway/cpp/sci_fftw.cpp \
+@FFTW_TRUE@    sci_gateway/cpp/sci_dst.cpp \
+@FFTW_TRUE@    sci_gateway/cpp/sci_dct.cpp
 
 
 #### fftw : Conf files ####
 @FFTW_TRUE@libscifftw_la_root_DATA = license.txt
 
 #### fftw : gateway declaration ####
-@FFTW_TRUE@libscifftw_la_sci_gatewaydir = $(mydatadir)/sci_gateway
-@FFTW_TRUE@libscifftw_la_sci_gateway_DATA = sci_gateway/fftw_gateway.xml
-@FFTW_TRUE@libscifftw_algo_la_SOURCES = $(FFTW_C_SOURCES)
+#libscifftw_la_sci_gatewaydir = $(mydatadir)/sci_gateway
+#libscifftw_la_sci_gateway_DATA = sci_gateway/fftw_gateway.xml
+@FFTW_TRUE@libscifftw_algo_la_SOURCES = $(FFTW_C_SOURCES) $(FFTW_CPP_SOURCES)
 @FFTW_FALSE@libscifftw_la_SOURCES = $(FFTW_CPP_SOURCES)
 @FFTW_TRUE@libscifftw_la_SOURCES = $(GATEWAY_C_SOURCES)  $(GATEWAY_CPP_SOURCES)
 @FFTW_TRUE@libscifftw_algo_la_CPPFLAGS = $(libscifftw_la_CPPFLAGS)
@@ -646,6 +651,7 @@ libscifftw_la_etc_DATA = \
 @FFTW_FALSE@libscifftw_la_CPPFLAGS = \
 @FFTW_FALSE@-I$(srcdir)/includes/ \
 @FFTW_FALSE@    -I$(srcdir)/src/c/ \
+@FFTW_FALSE@    -I$(srcdir)/src/cpp/ \
 @FFTW_FALSE@    -I$(top_srcdir)/modules/ast/includes/ast/ \
 @FFTW_FALSE@    -I$(top_srcdir)/modules/ast/includes/exps/ \
 @FFTW_FALSE@    -I$(top_srcdir)/modules/ast/includes/operations/ \
@@ -662,6 +668,7 @@ libscifftw_la_etc_DATA = \
 @FFTW_TRUE@libscifftw_la_CPPFLAGS = \
 @FFTW_TRUE@    -I$(srcdir)/includes/ \
 @FFTW_TRUE@    -I$(srcdir)/src/c/ \
+@FFTW_TRUE@    -I$(srcdir)/src/cpp/ \
 @FFTW_TRUE@    -I$(top_srcdir)/modules/ast/includes/ast/ \
 @FFTW_TRUE@    -I$(top_srcdir)/modules/ast/includes/exps/ \
 @FFTW_TRUE@    -I$(top_srcdir)/modules/ast/includes/operations/ \
@@ -670,6 +677,8 @@ libscifftw_la_etc_DATA = \
 @FFTW_TRUE@    -I$(top_srcdir)/modules/ast/includes/system_env/ \
 @FFTW_TRUE@    -I$(top_srcdir)/modules/ast/includes/types/ \
 @FFTW_TRUE@    -I$(top_srcdir)/modules/ast/includes/analysis/ \
+@FFTW_TRUE@    -I$(top_srcdir)/modules/threads/includes/ \
+@FFTW_TRUE@    -I$(top_srcdir)/modules/console/includes/ \
 @FFTW_TRUE@    -I$(top_srcdir)/modules/dynamic_link/includes/ \
 @FFTW_TRUE@    -I$(top_srcdir)/modules/fileio/includes/ \
 @FFTW_TRUE@    -I$(top_srcdir)/modules/output_stream/includes/ \
@@ -681,7 +690,6 @@ libscifftw_la_etc_DATA = \
 @FFTW_TRUE@    $(EIGEN_CPPFLAGS) \
 @FFTW_TRUE@    $(AM_CPPFLAGS)
 
-@FFTW_FALSE@FFTW_CPP_SOURCES = src/nofftw/nofftw.cpp
 
 # Where all the Scilab stuff is installed (macros, help, ...)
 mydatadir = $(pkgdatadir)/modules/$(modulename)
@@ -848,21 +856,31 @@ src/c/libscifftw_algo_la-fftwlibname.lo: src/c/$(am__dirstamp) \
        src/c/$(DEPDIR)/$(am__dirstamp)
 src/c/libscifftw_algo_la-fftw_utilities.lo: src/c/$(am__dirstamp) \
        src/c/$(DEPDIR)/$(am__dirstamp)
-src/c/libscifftw_algo_la-sci_data_utilities.lo: src/c/$(am__dirstamp) \
-       src/c/$(DEPDIR)/$(am__dirstamp)
 src/c/libscifftw_algo_la-with_fftw.lo: src/c/$(am__dirstamp) \
        src/c/$(DEPDIR)/$(am__dirstamp)
-
-libscifftw-algo.la: $(libscifftw_algo_la_OBJECTS) $(libscifftw_algo_la_DEPENDENCIES) $(EXTRA_libscifftw_algo_la_DEPENDENCIES) 
-       $(AM_V_CCLD)$(LINK) $(am_libscifftw_algo_la_rpath) $(libscifftw_algo_la_OBJECTS) $(libscifftw_algo_la_LIBADD) $(LIBS)
 src/nofftw/$(am__dirstamp):
        @$(MKDIR_P) src/nofftw
        @: > src/nofftw/$(am__dirstamp)
 src/nofftw/$(DEPDIR)/$(am__dirstamp):
        @$(MKDIR_P) src/nofftw/$(DEPDIR)
        @: > src/nofftw/$(DEPDIR)/$(am__dirstamp)
+src/nofftw/libscifftw_algo_la-nofftw.lo: src/nofftw/$(am__dirstamp) \
+       src/nofftw/$(DEPDIR)/$(am__dirstamp)
+src/cpp/$(am__dirstamp):
+       @$(MKDIR_P) src/cpp
+       @: > src/cpp/$(am__dirstamp)
+src/cpp/$(DEPDIR)/$(am__dirstamp):
+       @$(MKDIR_P) src/cpp/$(DEPDIR)
+       @: > src/cpp/$(DEPDIR)/$(am__dirstamp)
+src/cpp/libscifftw_algo_la-fftw_common.lo: src/cpp/$(am__dirstamp) \
+       src/cpp/$(DEPDIR)/$(am__dirstamp)
+
+libscifftw-algo.la: $(libscifftw_algo_la_OBJECTS) $(libscifftw_algo_la_DEPENDENCIES) $(EXTRA_libscifftw_algo_la_DEPENDENCIES) 
+       $(AM_V_CXXLD)$(CXXLINK) $(am_libscifftw_algo_la_rpath) $(libscifftw_algo_la_OBJECTS) $(libscifftw_algo_la_LIBADD) $(LIBS)
 src/nofftw/libscifftw_la-nofftw.lo: src/nofftw/$(am__dirstamp) \
        src/nofftw/$(DEPDIR)/$(am__dirstamp)
+src/cpp/libscifftw_la-fftw_common.lo: src/cpp/$(am__dirstamp) \
+       src/cpp/$(DEPDIR)/$(am__dirstamp)
 sci_gateway/c/$(am__dirstamp):
        @$(MKDIR_P) sci_gateway/c
        @: > sci_gateway/c/$(am__dirstamp)
@@ -877,9 +895,6 @@ sci_gateway/c/libscifftw_la-sci_fftwlibraryisloaded.lo:  \
 sci_gateway/c/libscifftw_la-sci_disposefftwlibrary.lo:  \
        sci_gateway/c/$(am__dirstamp) \
        sci_gateway/c/$(DEPDIR)/$(am__dirstamp)
-sci_gateway/c/libscifftw_la-sci_fftw.lo:  \
-       sci_gateway/c/$(am__dirstamp) \
-       sci_gateway/c/$(DEPDIR)/$(am__dirstamp)
 sci_gateway/c/libscifftw_la-sci_fftw_flags.lo:  \
        sci_gateway/c/$(am__dirstamp) \
        sci_gateway/c/$(DEPDIR)/$(am__dirstamp)
@@ -895,10 +910,6 @@ sci_gateway/c/libscifftw_la-sci_set_fftw_wisdom.lo:  \
 sci_gateway/c/libscifftw_la-sci_fftw_forget_wisdom.lo:  \
        sci_gateway/c/$(am__dirstamp) \
        sci_gateway/c/$(DEPDIR)/$(am__dirstamp)
-sci_gateway/c/libscifftw_la-sci_dct.lo: sci_gateway/c/$(am__dirstamp) \
-       sci_gateway/c/$(DEPDIR)/$(am__dirstamp)
-sci_gateway/c/libscifftw_la-sci_dst.lo: sci_gateway/c/$(am__dirstamp) \
-       sci_gateway/c/$(DEPDIR)/$(am__dirstamp)
 sci_gateway/cpp/$(am__dirstamp):
        @$(MKDIR_P) sci_gateway/cpp
        @: > sci_gateway/cpp/$(am__dirstamp)
@@ -908,6 +919,15 @@ sci_gateway/cpp/$(DEPDIR)/$(am__dirstamp):
 sci_gateway/cpp/libscifftw_la-fftw_gw.lo:  \
        sci_gateway/cpp/$(am__dirstamp) \
        sci_gateway/cpp/$(DEPDIR)/$(am__dirstamp)
+sci_gateway/cpp/libscifftw_la-sci_fftw.lo:  \
+       sci_gateway/cpp/$(am__dirstamp) \
+       sci_gateway/cpp/$(DEPDIR)/$(am__dirstamp)
+sci_gateway/cpp/libscifftw_la-sci_dst.lo:  \
+       sci_gateway/cpp/$(am__dirstamp) \
+       sci_gateway/cpp/$(DEPDIR)/$(am__dirstamp)
+sci_gateway/cpp/libscifftw_la-sci_dct.lo:  \
+       sci_gateway/cpp/$(am__dirstamp) \
+       sci_gateway/cpp/$(DEPDIR)/$(am__dirstamp)
 
 libscifftw.la: $(libscifftw_la_OBJECTS) $(libscifftw_la_DEPENDENCIES) $(EXTRA_libscifftw_la_DEPENDENCIES) 
        $(AM_V_CXXLD)$(libscifftw_la_LINK) $(am_libscifftw_la_rpath) $(libscifftw_la_OBJECTS) $(libscifftw_la_LIBADD) $(LIBS)
@@ -920,6 +940,8 @@ mostlyclean-compile:
        -rm -f sci_gateway/cpp/*.lo
        -rm -f src/c/*.$(OBJEXT)
        -rm -f src/c/*.lo
+       -rm -f src/cpp/*.$(OBJEXT)
+       -rm -f src/cpp/*.lo
        -rm -f src/nofftw/*.$(OBJEXT)
        -rm -f src/nofftw/*.lo
 
@@ -927,10 +949,7 @@ distclean-compile:
        -rm -f *.tab.c
 
 @AMDEP_TRUE@@am__include@ @am__quote@sci_gateway/c/$(DEPDIR)/libscifftw_la-gw_fftw.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@sci_gateway/c/$(DEPDIR)/libscifftw_la-sci_dct.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@sci_gateway/c/$(DEPDIR)/libscifftw_la-sci_disposefftwlibrary.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@sci_gateway/c/$(DEPDIR)/libscifftw_la-sci_dst.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@sci_gateway/c/$(DEPDIR)/libscifftw_la-sci_fftw.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@sci_gateway/c/$(DEPDIR)/libscifftw_la-sci_fftw_flags.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@sci_gateway/c/$(DEPDIR)/libscifftw_la-sci_fftw_forget_wisdom.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@sci_gateway/c/$(DEPDIR)/libscifftw_la-sci_fftwlibraryisloaded.Plo@am__quote@
@@ -938,11 +957,16 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@sci_gateway/c/$(DEPDIR)/libscifftw_la-sci_loadfftwlibrary.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@sci_gateway/c/$(DEPDIR)/libscifftw_la-sci_set_fftw_wisdom.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@sci_gateway/cpp/$(DEPDIR)/libscifftw_la-fftw_gw.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@sci_gateway/cpp/$(DEPDIR)/libscifftw_la-sci_dct.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@sci_gateway/cpp/$(DEPDIR)/libscifftw_la-sci_dst.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@sci_gateway/cpp/$(DEPDIR)/libscifftw_la-sci_fftw.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/c/$(DEPDIR)/libscifftw_algo_la-callfftw.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/c/$(DEPDIR)/libscifftw_algo_la-fftw_utilities.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/c/$(DEPDIR)/libscifftw_algo_la-fftwlibname.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/c/$(DEPDIR)/libscifftw_algo_la-sci_data_utilities.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/c/$(DEPDIR)/libscifftw_algo_la-with_fftw.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/cpp/$(DEPDIR)/libscifftw_algo_la-fftw_common.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/cpp/$(DEPDIR)/libscifftw_la-fftw_common.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/nofftw/$(DEPDIR)/libscifftw_algo_la-nofftw.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/nofftw/$(DEPDIR)/libscifftw_la-nofftw.Plo@am__quote@
 
 .c.o:
@@ -990,13 +1014,6 @@ src/c/libscifftw_algo_la-fftw_utilities.lo: src/c/fftw_utilities.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscifftw_algo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/c/libscifftw_algo_la-fftw_utilities.lo `test -f 'src/c/fftw_utilities.c' || echo '$(srcdir)/'`src/c/fftw_utilities.c
 
-src/c/libscifftw_algo_la-sci_data_utilities.lo: src/c/sci_data_utilities.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscifftw_algo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/c/libscifftw_algo_la-sci_data_utilities.lo -MD -MP -MF src/c/$(DEPDIR)/libscifftw_algo_la-sci_data_utilities.Tpo -c -o src/c/libscifftw_algo_la-sci_data_utilities.lo `test -f 'src/c/sci_data_utilities.c' || echo '$(srcdir)/'`src/c/sci_data_utilities.c
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/c/$(DEPDIR)/libscifftw_algo_la-sci_data_utilities.Tpo src/c/$(DEPDIR)/libscifftw_algo_la-sci_data_utilities.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/c/sci_data_utilities.c' object='src/c/libscifftw_algo_la-sci_data_utilities.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscifftw_algo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/c/libscifftw_algo_la-sci_data_utilities.lo `test -f 'src/c/sci_data_utilities.c' || echo '$(srcdir)/'`src/c/sci_data_utilities.c
-
 src/c/libscifftw_algo_la-with_fftw.lo: src/c/with_fftw.c
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscifftw_algo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/c/libscifftw_algo_la-with_fftw.lo -MD -MP -MF src/c/$(DEPDIR)/libscifftw_algo_la-with_fftw.Tpo -c -o src/c/libscifftw_algo_la-with_fftw.lo `test -f 'src/c/with_fftw.c' || echo '$(srcdir)/'`src/c/with_fftw.c
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/c/$(DEPDIR)/libscifftw_algo_la-with_fftw.Tpo src/c/$(DEPDIR)/libscifftw_algo_la-with_fftw.Plo
@@ -1025,13 +1042,6 @@ sci_gateway/c/libscifftw_la-sci_disposefftwlibrary.lo: sci_gateway/c/sci_dispose
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscifftw_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sci_gateway/c/libscifftw_la-sci_disposefftwlibrary.lo `test -f 'sci_gateway/c/sci_disposefftwlibrary.c' || echo '$(srcdir)/'`sci_gateway/c/sci_disposefftwlibrary.c
 
-sci_gateway/c/libscifftw_la-sci_fftw.lo: sci_gateway/c/sci_fftw.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscifftw_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sci_gateway/c/libscifftw_la-sci_fftw.lo -MD -MP -MF sci_gateway/c/$(DEPDIR)/libscifftw_la-sci_fftw.Tpo -c -o sci_gateway/c/libscifftw_la-sci_fftw.lo `test -f 'sci_gateway/c/sci_fftw.c' || echo '$(srcdir)/'`sci_gateway/c/sci_fftw.c
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) sci_gateway/c/$(DEPDIR)/libscifftw_la-sci_fftw.Tpo sci_gateway/c/$(DEPDIR)/libscifftw_la-sci_fftw.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='sci_gateway/c/sci_fftw.c' object='sci_gateway/c/libscifftw_la-sci_fftw.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscifftw_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sci_gateway/c/libscifftw_la-sci_fftw.lo `test -f 'sci_gateway/c/sci_fftw.c' || echo '$(srcdir)/'`sci_gateway/c/sci_fftw.c
-
 sci_gateway/c/libscifftw_la-sci_fftw_flags.lo: sci_gateway/c/sci_fftw_flags.c
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscifftw_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sci_gateway/c/libscifftw_la-sci_fftw_flags.lo -MD -MP -MF sci_gateway/c/$(DEPDIR)/libscifftw_la-sci_fftw_flags.Tpo -c -o sci_gateway/c/libscifftw_la-sci_fftw_flags.lo `test -f 'sci_gateway/c/sci_fftw_flags.c' || echo '$(srcdir)/'`sci_gateway/c/sci_fftw_flags.c
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) sci_gateway/c/$(DEPDIR)/libscifftw_la-sci_fftw_flags.Tpo sci_gateway/c/$(DEPDIR)/libscifftw_la-sci_fftw_flags.Plo
@@ -1067,20 +1077,6 @@ sci_gateway/c/libscifftw_la-sci_fftw_forget_wisdom.lo: sci_gateway/c/sci_fftw_fo
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscifftw_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sci_gateway/c/libscifftw_la-sci_fftw_forget_wisdom.lo `test -f 'sci_gateway/c/sci_fftw_forget_wisdom.c' || echo '$(srcdir)/'`sci_gateway/c/sci_fftw_forget_wisdom.c
 
-sci_gateway/c/libscifftw_la-sci_dct.lo: sci_gateway/c/sci_dct.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscifftw_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sci_gateway/c/libscifftw_la-sci_dct.lo -MD -MP -MF sci_gateway/c/$(DEPDIR)/libscifftw_la-sci_dct.Tpo -c -o sci_gateway/c/libscifftw_la-sci_dct.lo `test -f 'sci_gateway/c/sci_dct.c' || echo '$(srcdir)/'`sci_gateway/c/sci_dct.c
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) sci_gateway/c/$(DEPDIR)/libscifftw_la-sci_dct.Tpo sci_gateway/c/$(DEPDIR)/libscifftw_la-sci_dct.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='sci_gateway/c/sci_dct.c' object='sci_gateway/c/libscifftw_la-sci_dct.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscifftw_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sci_gateway/c/libscifftw_la-sci_dct.lo `test -f 'sci_gateway/c/sci_dct.c' || echo '$(srcdir)/'`sci_gateway/c/sci_dct.c
-
-sci_gateway/c/libscifftw_la-sci_dst.lo: sci_gateway/c/sci_dst.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscifftw_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sci_gateway/c/libscifftw_la-sci_dst.lo -MD -MP -MF sci_gateway/c/$(DEPDIR)/libscifftw_la-sci_dst.Tpo -c -o sci_gateway/c/libscifftw_la-sci_dst.lo `test -f 'sci_gateway/c/sci_dst.c' || echo '$(srcdir)/'`sci_gateway/c/sci_dst.c
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) sci_gateway/c/$(DEPDIR)/libscifftw_la-sci_dst.Tpo sci_gateway/c/$(DEPDIR)/libscifftw_la-sci_dst.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='sci_gateway/c/sci_dst.c' object='sci_gateway/c/libscifftw_la-sci_dst.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscifftw_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sci_gateway/c/libscifftw_la-sci_dst.lo `test -f 'sci_gateway/c/sci_dst.c' || echo '$(srcdir)/'`sci_gateway/c/sci_dst.c
-
 .cpp.o:
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
 @am__fastdepCXX_TRUE@  $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
@@ -1105,6 +1101,20 @@ sci_gateway/c/libscifftw_la-sci_dst.lo: sci_gateway/c/sci_dst.c
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
 
+src/nofftw/libscifftw_algo_la-nofftw.lo: src/nofftw/nofftw.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscifftw_algo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/nofftw/libscifftw_algo_la-nofftw.lo -MD -MP -MF src/nofftw/$(DEPDIR)/libscifftw_algo_la-nofftw.Tpo -c -o src/nofftw/libscifftw_algo_la-nofftw.lo `test -f 'src/nofftw/nofftw.cpp' || echo '$(srcdir)/'`src/nofftw/nofftw.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) src/nofftw/$(DEPDIR)/libscifftw_algo_la-nofftw.Tpo src/nofftw/$(DEPDIR)/libscifftw_algo_la-nofftw.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='src/nofftw/nofftw.cpp' object='src/nofftw/libscifftw_algo_la-nofftw.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscifftw_algo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/nofftw/libscifftw_algo_la-nofftw.lo `test -f 'src/nofftw/nofftw.cpp' || echo '$(srcdir)/'`src/nofftw/nofftw.cpp
+
+src/cpp/libscifftw_algo_la-fftw_common.lo: src/cpp/fftw_common.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscifftw_algo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/cpp/libscifftw_algo_la-fftw_common.lo -MD -MP -MF src/cpp/$(DEPDIR)/libscifftw_algo_la-fftw_common.Tpo -c -o src/cpp/libscifftw_algo_la-fftw_common.lo `test -f 'src/cpp/fftw_common.cpp' || echo '$(srcdir)/'`src/cpp/fftw_common.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) src/cpp/$(DEPDIR)/libscifftw_algo_la-fftw_common.Tpo src/cpp/$(DEPDIR)/libscifftw_algo_la-fftw_common.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='src/cpp/fftw_common.cpp' object='src/cpp/libscifftw_algo_la-fftw_common.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscifftw_algo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/cpp/libscifftw_algo_la-fftw_common.lo `test -f 'src/cpp/fftw_common.cpp' || echo '$(srcdir)/'`src/cpp/fftw_common.cpp
+
 src/nofftw/libscifftw_la-nofftw.lo: src/nofftw/nofftw.cpp
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscifftw_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/nofftw/libscifftw_la-nofftw.lo -MD -MP -MF src/nofftw/$(DEPDIR)/libscifftw_la-nofftw.Tpo -c -o src/nofftw/libscifftw_la-nofftw.lo `test -f 'src/nofftw/nofftw.cpp' || echo '$(srcdir)/'`src/nofftw/nofftw.cpp
 @am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) src/nofftw/$(DEPDIR)/libscifftw_la-nofftw.Tpo src/nofftw/$(DEPDIR)/libscifftw_la-nofftw.Plo
@@ -1112,6 +1122,13 @@ src/nofftw/libscifftw_la-nofftw.lo: src/nofftw/nofftw.cpp
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscifftw_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/nofftw/libscifftw_la-nofftw.lo `test -f 'src/nofftw/nofftw.cpp' || echo '$(srcdir)/'`src/nofftw/nofftw.cpp
 
+src/cpp/libscifftw_la-fftw_common.lo: src/cpp/fftw_common.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscifftw_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/cpp/libscifftw_la-fftw_common.lo -MD -MP -MF src/cpp/$(DEPDIR)/libscifftw_la-fftw_common.Tpo -c -o src/cpp/libscifftw_la-fftw_common.lo `test -f 'src/cpp/fftw_common.cpp' || echo '$(srcdir)/'`src/cpp/fftw_common.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) src/cpp/$(DEPDIR)/libscifftw_la-fftw_common.Tpo src/cpp/$(DEPDIR)/libscifftw_la-fftw_common.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='src/cpp/fftw_common.cpp' object='src/cpp/libscifftw_la-fftw_common.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscifftw_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/cpp/libscifftw_la-fftw_common.lo `test -f 'src/cpp/fftw_common.cpp' || echo '$(srcdir)/'`src/cpp/fftw_common.cpp
+
 sci_gateway/cpp/libscifftw_la-fftw_gw.lo: sci_gateway/cpp/fftw_gw.cpp
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscifftw_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT sci_gateway/cpp/libscifftw_la-fftw_gw.lo -MD -MP -MF sci_gateway/cpp/$(DEPDIR)/libscifftw_la-fftw_gw.Tpo -c -o sci_gateway/cpp/libscifftw_la-fftw_gw.lo `test -f 'sci_gateway/cpp/fftw_gw.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/fftw_gw.cpp
 @am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) sci_gateway/cpp/$(DEPDIR)/libscifftw_la-fftw_gw.Tpo sci_gateway/cpp/$(DEPDIR)/libscifftw_la-fftw_gw.Plo
@@ -1119,6 +1136,27 @@ sci_gateway/cpp/libscifftw_la-fftw_gw.lo: sci_gateway/cpp/fftw_gw.cpp
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscifftw_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o sci_gateway/cpp/libscifftw_la-fftw_gw.lo `test -f 'sci_gateway/cpp/fftw_gw.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/fftw_gw.cpp
 
+sci_gateway/cpp/libscifftw_la-sci_fftw.lo: sci_gateway/cpp/sci_fftw.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscifftw_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT sci_gateway/cpp/libscifftw_la-sci_fftw.lo -MD -MP -MF sci_gateway/cpp/$(DEPDIR)/libscifftw_la-sci_fftw.Tpo -c -o sci_gateway/cpp/libscifftw_la-sci_fftw.lo `test -f 'sci_gateway/cpp/sci_fftw.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_fftw.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) sci_gateway/cpp/$(DEPDIR)/libscifftw_la-sci_fftw.Tpo sci_gateway/cpp/$(DEPDIR)/libscifftw_la-sci_fftw.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='sci_gateway/cpp/sci_fftw.cpp' object='sci_gateway/cpp/libscifftw_la-sci_fftw.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscifftw_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o sci_gateway/cpp/libscifftw_la-sci_fftw.lo `test -f 'sci_gateway/cpp/sci_fftw.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_fftw.cpp
+
+sci_gateway/cpp/libscifftw_la-sci_dst.lo: sci_gateway/cpp/sci_dst.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscifftw_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT sci_gateway/cpp/libscifftw_la-sci_dst.lo -MD -MP -MF sci_gateway/cpp/$(DEPDIR)/libscifftw_la-sci_dst.Tpo -c -o sci_gateway/cpp/libscifftw_la-sci_dst.lo `test -f 'sci_gateway/cpp/sci_dst.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_dst.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) sci_gateway/cpp/$(DEPDIR)/libscifftw_la-sci_dst.Tpo sci_gateway/cpp/$(DEPDIR)/libscifftw_la-sci_dst.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='sci_gateway/cpp/sci_dst.cpp' object='sci_gateway/cpp/libscifftw_la-sci_dst.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscifftw_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o sci_gateway/cpp/libscifftw_la-sci_dst.lo `test -f 'sci_gateway/cpp/sci_dst.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_dst.cpp
+
+sci_gateway/cpp/libscifftw_la-sci_dct.lo: sci_gateway/cpp/sci_dct.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscifftw_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT sci_gateway/cpp/libscifftw_la-sci_dct.lo -MD -MP -MF sci_gateway/cpp/$(DEPDIR)/libscifftw_la-sci_dct.Tpo -c -o sci_gateway/cpp/libscifftw_la-sci_dct.lo `test -f 'sci_gateway/cpp/sci_dct.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_dct.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) sci_gateway/cpp/$(DEPDIR)/libscifftw_la-sci_dct.Tpo sci_gateway/cpp/$(DEPDIR)/libscifftw_la-sci_dct.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='sci_gateway/cpp/sci_dct.cpp' object='sci_gateway/cpp/libscifftw_la-sci_dct.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscifftw_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o sci_gateway/cpp/libscifftw_la-sci_dct.lo `test -f 'sci_gateway/cpp/sci_dct.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_dct.cpp
+
 mostlyclean-libtool:
        -rm -f *.lo
 
@@ -1127,6 +1165,7 @@ clean-libtool:
        -rm -rf sci_gateway/c/.libs sci_gateway/c/_libs
        -rm -rf sci_gateway/cpp/.libs sci_gateway/cpp/_libs
        -rm -rf src/c/.libs src/c/_libs
+       -rm -rf src/cpp/.libs src/cpp/_libs
        -rm -rf src/nofftw/.libs src/nofftw/_libs
 install-libscifftw_la_etcDATA: $(libscifftw_la_etc_DATA)
        @$(NORMAL_INSTALL)
@@ -1170,27 +1209,6 @@ uninstall-libscifftw_la_rootDATA:
        @list='$(libscifftw_la_root_DATA)'; test -n "$(libscifftw_la_rootdir)" || list=; \
        files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
        dir='$(DESTDIR)$(libscifftw_la_rootdir)'; $(am__uninstall_files_from_dir)
-install-libscifftw_la_sci_gatewayDATA: $(libscifftw_la_sci_gateway_DATA)
-       @$(NORMAL_INSTALL)
-       @list='$(libscifftw_la_sci_gateway_DATA)'; test -n "$(libscifftw_la_sci_gatewaydir)" || list=; \
-       if test -n "$$list"; then \
-         echo " $(MKDIR_P) '$(DESTDIR)$(libscifftw_la_sci_gatewaydir)'"; \
-         $(MKDIR_P) "$(DESTDIR)$(libscifftw_la_sci_gatewaydir)" || exit 1; \
-       fi; \
-       for p in $$list; do \
-         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-         echo "$$d$$p"; \
-       done | $(am__base_list) | \
-       while read files; do \
-         echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(libscifftw_la_sci_gatewaydir)'"; \
-         $(INSTALL_DATA) $$files "$(DESTDIR)$(libscifftw_la_sci_gatewaydir)" || exit $$?; \
-       done
-
-uninstall-libscifftw_la_sci_gatewayDATA:
-       @$(NORMAL_UNINSTALL)
-       @list='$(libscifftw_la_sci_gateway_DATA)'; test -n "$(libscifftw_la_sci_gatewaydir)" || list=; \
-       files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-       dir='$(DESTDIR)$(libscifftw_la_sci_gatewaydir)'; $(am__uninstall_files_from_dir)
 
 ID: $(am__tagged_files)
        $(am__define_uniq_tagged_files); mkid -fID $$unique
@@ -1279,7 +1297,7 @@ check-am: all-am
 check: check-am
 all-am: Makefile $(LTLIBRARIES) $(DATA) all-local
 installdirs:
-       for dir in "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(libscifftw_la_etcdir)" "$(DESTDIR)$(libscifftw_la_rootdir)" "$(DESTDIR)$(libscifftw_la_sci_gatewaydir)"; do \
+       for dir in "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(libscifftw_la_etcdir)" "$(DESTDIR)$(libscifftw_la_rootdir)"; do \
          test -z "$$dir" || $(MKDIR_P) "$$dir"; \
        done
 install: install-am
@@ -1314,6 +1332,8 @@ distclean-generic:
        -rm -f sci_gateway/cpp/$(am__dirstamp)
        -rm -f src/c/$(DEPDIR)/$(am__dirstamp)
        -rm -f src/c/$(am__dirstamp)
+       -rm -f src/cpp/$(DEPDIR)/$(am__dirstamp)
+       -rm -f src/cpp/$(am__dirstamp)
        -rm -f src/nofftw/$(DEPDIR)/$(am__dirstamp)
        -rm -f src/nofftw/$(am__dirstamp)
 
@@ -1326,7 +1346,7 @@ clean-am: clean-generic clean-libtool clean-local \
        clean-noinstLTLIBRARIES clean-pkglibLTLIBRARIES mostlyclean-am
 
 distclean: distclean-am
-       -rm -rf sci_gateway/c/$(DEPDIR) sci_gateway/cpp/$(DEPDIR) src/c/$(DEPDIR) src/nofftw/$(DEPDIR)
+       -rm -rf sci_gateway/c/$(DEPDIR) sci_gateway/cpp/$(DEPDIR) src/c/$(DEPDIR) src/cpp/$(DEPDIR) src/nofftw/$(DEPDIR)
        -rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
        distclean-local distclean-tags
@@ -1344,8 +1364,7 @@ info: info-am
 info-am:
 
 install-data-am: install-data-local install-libscifftw_la_etcDATA \
-       install-libscifftw_la_rootDATA \
-       install-libscifftw_la_sci_gatewayDATA
+       install-libscifftw_la_rootDATA
 
 install-dvi: install-dvi-am
 
@@ -1374,7 +1393,7 @@ install-ps-am:
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
-       -rm -rf sci_gateway/c/$(DEPDIR) sci_gateway/cpp/$(DEPDIR) src/c/$(DEPDIR) src/nofftw/$(DEPDIR)
+       -rm -rf sci_gateway/c/$(DEPDIR) sci_gateway/cpp/$(DEPDIR) src/c/$(DEPDIR) src/cpp/$(DEPDIR) src/nofftw/$(DEPDIR)
        -rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
 
@@ -1392,9 +1411,7 @@ ps: ps-am
 ps-am:
 
 uninstall-am: uninstall-libscifftw_la_etcDATA \
-       uninstall-libscifftw_la_rootDATA \
-       uninstall-libscifftw_la_sci_gatewayDATA \
-       uninstall-pkglibLTLIBRARIES
+       uninstall-libscifftw_la_rootDATA uninstall-pkglibLTLIBRARIES
 
 .MAKE: check-am install-am install-strip
 
@@ -1408,17 +1425,14 @@ uninstall-am: uninstall-libscifftw_la_etcDATA \
        install-dvi-am install-exec install-exec-am install-html \
        install-html-am install-html-local install-info \
        install-info-am install-libscifftw_la_etcDATA \
-       install-libscifftw_la_rootDATA \
-       install-libscifftw_la_sci_gatewayDATA install-man install-pdf \
+       install-libscifftw_la_rootDATA install-man install-pdf \
        install-pdf-am install-pkglibLTLIBRARIES install-ps \
        install-ps-am install-strip installcheck installcheck-am \
        installdirs maintainer-clean maintainer-clean-generic \
        mostlyclean mostlyclean-compile mostlyclean-generic \
        mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
        uninstall-am uninstall-libscifftw_la_etcDATA \
-       uninstall-libscifftw_la_rootDATA \
-       uninstall-libscifftw_la_sci_gatewayDATA \
-       uninstall-pkglibLTLIBRARIES
+       uninstall-libscifftw_la_rootDATA uninstall-pkglibLTLIBRARIES
 
 
 # This target enables tests for Scilab
index e8b7e99..b46dfa2 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <ItemGroup Label="ProjectConfigurations">
     <ProjectConfiguration Include="Debug|Win32">
@@ -80,7 +80,7 @@
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <ClCompile>
       <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>includes;src/c;../../libs/Eigen/includes;../../libs/intl;../core/includes;../fileio/includes;../output_stream/includes;../string/includes;../localization/includes;../api_scilab/includes;../elementary_functions/includes;../dynamic_link/includes;../ast/includes/types;../ast/includes/ast;../ast/includes/analysis;../ast/includes/exps;../ast/includes/operations;../ast/includes/symbol;../ast/includes/system_env;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>includes;src/c;src/cpp;../../libs/Eigen/includes;../../libs/intl;../core/includes;../fileio/includes;../output_stream/includes;../string/includes;../localization/includes;../api_scilab/includes;../elementary_functions/includes;../dynamic_link/includes;../ast/includes/types;../ast/includes/ast;../ast/includes/analysis;../ast/includes/exps;../ast/includes/operations;../ast/includes/symbol;../ast/includes/system_env;../threads/includes;../console/includes;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>FORDLL;_DEBUG;_WINDOWS;_USRDLL;FFTW_EXPORTS;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <WarningLevel>Level3</WarningLevel>
@@ -108,7 +108,7 @@ lib /DEF:"$(ProjectDir)Elementary_functions_f_Import.def" /SUBSYSTEM:WINDOWS /MA
     </Midl>
     <ClCompile>
       <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>includes;src/c;../../libs/Eigen/includes;../../libs/intl;../core/includes;../fileio/includes;../output_stream/includes;../string/includes;../localization/includes;../api_scilab/includes;../elementary_functions/includes;../dynamic_link/includes;../ast/includes/types;../ast/includes/ast;../ast/includes/analysis;../ast/includes/exps;../ast/includes/operations;../ast/includes/symbol;../ast/includes/system_env;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>includes;src/c;src/cpp;../../libs/Eigen/includes;../../libs/intl;../core/includes;../fileio/includes;../output_stream/includes;../string/includes;../localization/includes;../api_scilab/includes;../elementary_functions/includes;../dynamic_link/includes;../ast/includes/types;../ast/includes/ast;../ast/includes/analysis;../ast/includes/exps;../ast/includes/operations;../ast/includes/symbol;../ast/includes/system_env;../threads/includes;../console/includes;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>FORDLL;_DEBUG;_WINDOWS;_USRDLL;FFTW_EXPORTS;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <WarningLevel>Level3</WarningLevel>
@@ -134,7 +134,7 @@ lib /DEF:"$(ProjectDir)Elementary_functions_f_Import.def" /SUBSYSTEM:WINDOWS /MA
     <ClCompile>
       <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
       <WholeProgramOptimization>false</WholeProgramOptimization>
-      <AdditionalIncludeDirectories>includes;src/c;../../libs/Eigen/includes;../../libs/intl;../core/includes;../fileio/includes;../output_stream/includes;../string/includes;../localization/includes;../api_scilab/includes;../elementary_functions/includes;../dynamic_link/includes;../ast/includes/types;../ast/includes/ast;../ast/includes/analysis;../ast/includes/exps;../ast/includes/operations;../ast/includes/symbol;../ast/includes/system_env;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>includes;src/c;src/cpp;../../libs/Eigen/includes;../../libs/intl;../core/includes;../fileio/includes;../output_stream/includes;../string/includes;../localization/includes;../api_scilab/includes;../elementary_functions/includes;../dynamic_link/includes;../ast/includes/types;../ast/includes/ast;../ast/includes/analysis;../ast/includes/exps;../ast/includes/operations;../ast/includes/symbol;../ast/includes/system_env;../threads/includes;../console/includes;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>FORDLL;NDEBUG;_WINDOWS;_USRDLL;FFTW_EXPORTS;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
@@ -168,7 +168,7 @@ lib /DEF:"$(ProjectDir)Elementary_functions_f_Import.def" /SUBSYSTEM:WINDOWS /MA
     <ClCompile>
       <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
       <WholeProgramOptimization>false</WholeProgramOptimization>
-      <AdditionalIncludeDirectories>includes;src/c;../../libs/Eigen/includes;../../libs/intl;../core/includes;../fileio/includes;../output_stream/includes;../string/includes;../localization/includes;../api_scilab/includes;../elementary_functions/includes;../dynamic_link/includes;../ast/includes/types;../ast/includes/ast;../ast/includes/analysis;../ast/includes/exps;../ast/includes/operations;../ast/includes/symbol;../ast/includes/system_env;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>includes;src/c;src/cpp;../../libs/Eigen/includes;../../libs/intl;../core/includes;../fileio/includes;../output_stream/includes;../string/includes;../localization/includes;../api_scilab/includes;../elementary_functions/includes;../dynamic_link/includes;../ast/includes/types;../ast/includes/ast;../ast/includes/analysis;../ast/includes/exps;../ast/includes/operations;../ast/includes/symbol;../ast/includes/system_env;../threads/includes;../console/includes;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>FORDLL;NDEBUG;_WINDOWS;_USRDLL;FFTW_EXPORTS;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
@@ -197,34 +197,33 @@ lib /DEF:"$(ProjectDir)Elementary_functions_f_Import.def" /SUBSYSTEM:WINDOWS /MA
   </ItemDefinitionGroup>
   <ItemGroup>
     <ClCompile Include="sci_gateway\cpp\fftw_gw.cpp" />
-    <ClCompile Include="sci_gateway\c\sci_dct.c" />
-    <ClCompile Include="sci_gateway\c\sci_dst.c" />
+    <ClCompile Include="sci_gateway\cpp\sci_dct.cpp" />
+    <ClCompile Include="sci_gateway\cpp\sci_dst.cpp" />
+    <ClCompile Include="sci_gateway\cpp\sci_fftw.cpp" />
+    <ClCompile Include="src\cpp\fftw_common.cpp" />
     <ClCompile Include="src\c\callfftw.c" />
     <ClCompile Include="src\c\DllmainFttw.c" />
     <ClCompile Include="src\c\fftw_utilities.c" />
     <ClCompile Include="src\c\fftwlibname.c" />
     <ClCompile Include="sci_gateway\c\gw_fftw.c" />
     <ClCompile Include="sci_gateway\c\sci_disposefftwlibrary.c" />
-    <ClCompile Include="sci_gateway\c\sci_fftw.c" />
     <ClCompile Include="sci_gateway\c\sci_fftw_flags.c" />
     <ClCompile Include="sci_gateway\c\sci_fftw_forget_wisdom.c" />
     <ClCompile Include="sci_gateway\c\sci_fftwlibraryisloaded.c" />
     <ClCompile Include="sci_gateway\c\sci_get_fftw_wisdom.c" />
     <ClCompile Include="sci_gateway\c\sci_loadfftwlibrary.c" />
     <ClCompile Include="sci_gateway\c\sci_set_fftw_wisdom.c" />
-    <ClCompile Include="src\c\sci_data_utilities.c" />
     <ClCompile Include="src\c\with_fftw.c" />
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="includes\fftw_gw.hxx" />
+    <ClInclude Include="src\cpp\fftw_common.hxx" />
     <ClInclude Include="src\c\callfftw.h" />
     <ClInclude Include="includes\dynlib_fftw.h" />
     <ClInclude Include="src\c\fftw3.h" />
-    <ClInclude Include="src\c\fftw_utilities.h" />
     <ClInclude Include="src\c\fftwlibname.h" />
     <ClInclude Include="includes\gw_fftw.h" />
     <ClInclude Include="includes\with_fftw.h" />
-    <ClInclude Include="src\c\sci_data_utilities.h" />
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="src\c\fftw.rc" />
@@ -258,4 +257,4 @@ lib /DEF:"$(ProjectDir)Elementary_functions_f_Import.def" /SUBSYSTEM:WINDOWS /MA
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
\ No newline at end of file
+</Project>
index 3f433c5..0c20c90 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <ItemGroup>
     <Filter Include="Source Files">
@@ -42,9 +42,6 @@
     <ClCompile Include="sci_gateway\c\sci_disposefftwlibrary.c">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="sci_gateway\c\sci_fftw.c">
-      <Filter>Source Files</Filter>
-    </ClCompile>
     <ClCompile Include="sci_gateway\c\sci_fftw_flags.c">
       <Filter>Source Files</Filter>
     </ClCompile>
     <ClCompile Include="src\c\with_fftw.c">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="sci_gateway\c\sci_dct.c">
+    <ClCompile Include="sci_gateway\cpp\fftw_gw.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="sci_gateway\cpp\sci_dct.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="sci_gateway\c\sci_dst.c">
+    <ClCompile Include="sci_gateway\cpp\sci_dst.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="src\c\sci_data_utilities.c">
+    <ClCompile Include="sci_gateway\cpp\sci_fftw.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="sci_gateway\cpp\fftw_gw.cpp">
+    <ClCompile Include="src\cpp\fftw_common.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
   </ItemGroup>
@@ -89,9 +89,6 @@
     <ClInclude Include="src\c\fftw3.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="src\c\fftw_utilities.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
     <ClInclude Include="src\c\fftwlibname.h">
       <Filter>Header Files</Filter>
     </ClInclude>
     <ClInclude Include="includes\with_fftw.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="src\c\sci_data_utilities.h">
+    <ClInclude Include="includes\fftw_gw.hxx">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="includes\fftw_gw.hxx">
+    <ClInclude Include="src\cpp\fftw_common.hxx">
       <Filter>Header Files</Filter>
     </ClInclude>
   </ItemGroup>
     <None Include="locales\fftw.pot" />
     <None Include="locales\fftw.pot" />
     <None Include="locales\fftw.pot" />
+    <None Include="locales\fftw.pot" />
   </ItemGroup>
-</Project>
\ No newline at end of file
+</Project>
index a97f4fa..95ffca1 100644 (file)
@@ -29,4 +29,8 @@ public:
     }
 };
 
+CPP_GATEWAY_PROTOTYPE_EXPORT(sci_dct, FTTW_SCILAB_IMPEXP);
+CPP_GATEWAY_PROTOTYPE_EXPORT(sci_dst, FTTW_SCILAB_IMPEXP);
+CPP_GATEWAY_PROTOTYPE_EXPORT(sci_fftw, FTTW_SCILAB_IMPEXP);
+
 #endif /* __FFTW_GW_HXX__ */
index 69611cb..af24c45 100644 (file)
 /*--------------------------------------------------------------------------*/
 FTTW_SCILAB_IMPEXP int gw_fftw(void);
 FTTW_SCILAB_IMPEXP int sci_disposefftwlibrary(char *fname, void* pvApiCtx);
-FTTW_SCILAB_IMPEXP int sci_fftw(char *fname, void *pvApiCtx);
 FTTW_SCILAB_IMPEXP int sci_fftw_flags(char *fname, void* pvApiCtx);
 FTTW_SCILAB_IMPEXP int sci_fftw_forget_wisdom(char *fname, void* pvApiCtx);
 FTTW_SCILAB_IMPEXP int sci_fftwlibraryisloaded(char *fname, void* pvApiCtx);
 FTTW_SCILAB_IMPEXP int sci_get_fftw_wisdom(char *fname, void* pvApiCtx);
 FTTW_SCILAB_IMPEXP int sci_loadfftwlibrary(char *fname, void* pvApiCtx);
 FTTW_SCILAB_IMPEXP int sci_set_fftw_wisdom(char *fname, void* pvApiCtx);
-FTTW_SCILAB_IMPEXP int sci_dct(char *fname, void* pvApiCtx);
-FTTW_SCILAB_IMPEXP int sci_dst(char *fname, void* pvApiCtx);
 /*--------------------------------------------------------------------------*/
 #endif /*  __GW_FFTW__ */
 /*--------------------------------------------------------------------------*/
diff --git a/scilab/modules/fftw/sci_gateway/c/sci_dct.c b/scilab/modules/fftw/sci_gateway/c/sci_dct.c
deleted file mode 100644 (file)
index ea25a1b..0000000
+++ /dev/null
@@ -1,1205 +0,0 @@
-/*
-* Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-* Copyright (C) 2012 - INRIA - Serge STEER
-*
-* This file must be used under the terms of the CeCILL.
-* This source file is licensed as described in the file COPYING, which
-* you should have received as part of this distribution.  The terms
-* are also available at
-* http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
-*
-*/
-/*--------------------------------------------------------------------------*/
-#include "fftw_utilities.h"
-#include "sci_data_utilities.h"
-#include "callfftw.h"
-#include "sci_malloc.h"
-#include "gw_fftw.h"
-#include "api_scilab.h"
-#include "localization.h"
-#include "Scierror.h"
-#include "BOOL.h"
-#include "sci_data_utilities.h"
-
-
-/*--------------------------------------------------------------------------*/
-extern void C2F(dscal)(int *n, double *da, double *dx, int *incx); /* blas routine */
-extern void C2F(dset)(int *n, double *da, double *dx, int *incx); /* blas routine */
-/*--------------------------------------------------------------------------*/
-static int sci_dct_gen(void* pvApiCtx, char *fname, int ndimsA, int *dimsA, double *Ar,  double *Ai, int isn, guru_dim_struct gdim, int iopt);
-static int sci_dct_2args(void* pvApiCtx, char *fname, int ndimsA, int *dimsA, double *Ar,  double *Ai, int isn, int iopt);
-static int sci_dct_3args(void* pvApiCtx, char *fname, int ndimsA, int *dimsA, double *Ar,  double *Ai, int isn, int iopt);
-static int sci_dct_4args(void* pvApiCtx, char *fname, int ndimsA, int *dimsA, double *Ar,  double *Ai, int isn, int iopt);
-/*--------------------------------------------------------------------------*/
-
-extern int WITHMKL;
-/* fftw function.
-*
-* Scilab Calling sequence :
-*   dct(A )
-*   dct(A,sign )
-*   dct(A,sel,sign )
-*   dct(A,sign,dim,incr )
-*
-* Input : A : a scilab double complex or real vector, matrix or hypermatrix
-*
-*         sign : a scilab double or integer scalar (-1 or 1): the sign
-*                  in the exponential component
-*
-*         sel : a scilab double or integer vector, the selection of dimensions
-
-*         dim : a scilab double or integer vector: the dimensions
-*                  of the Fast Fourier Transform to perform
-*
-*         incr : a scilab double or integer vector: the increments
-*                  of the Fast Fourier Transform to perform
-*
-* Output : a scilab double complex or real array with same shape as A that
-*          gives the result of the transform.
-*
-*/
-int sci_dct(char *fname,  void* pvApiCtx)
-{
-    SciErr sciErr;
-    int *piAddr = NULL;
-    int rhs = Rhs;
-    int iTypeOne = 0;
-    int iopt = 0;
-
-    int ndimsA = 0;
-    int *dimsA = NULL;
-    double *Ar = NULL, *Ai = NULL;
-    char *option = NULL;
-    int isn = FFTW_FORWARD;
-    WITHMKL = withMKL();
-    /****************************************
-    * Basic constraints on rhs arguments  *
-    ****************************************/
-
-    /* check min/max lhs/rhs arguments of scilab function */
-    CheckRhs(1, 4);
-    CheckLhs(1, 1);
-
-    sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr);
-    if (sciErr.iErr)
-    {
-        printError(&sciErr, 0);
-        Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
-        return 0;
-    }
-
-    sciErr = getVarType(pvApiCtx, piAddr, &iTypeOne);
-    if (sciErr.iErr)
-    {
-        printError(&sciErr, 0);
-        Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
-        return 0;
-    }
-
-    if ((iTypeOne == sci_list) || (iTypeOne == sci_tlist))
-    {
-        OverLoad(1);
-        return 0;
-    }
-
-    if (iTypeOne == sci_mlist)
-    {
-        /* We allow overload for not hypermatrix type */
-        if (!isHyperMatrixMlist(pvApiCtx, piAddr))
-        {
-            OverLoad(1);
-            return 0;
-        }
-    }
-
-    /* checking if last argument is a potential option argument (character string) */
-    sciErr = getVarAddressFromPosition(pvApiCtx, Rhs, &piAddr);
-    if (sciErr.iErr)
-    {
-        printError(&sciErr, 0);
-        Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, Rhs);
-        return 0;
-    }
-
-    if (isStringType(pvApiCtx, piAddr))   /*  dct(...,option); */
-    {
-        if (isScalar(pvApiCtx, piAddr))
-        {
-            if (getAllocatedSingleString(pvApiCtx, piAddr, &option) == 0)
-            {
-                rhs = Rhs - 1;
-            }
-            else
-            {
-                Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-                return 0;
-            }
-        }
-    }
-
-
-
-    /********************  Checking if isn is given  ************************************************/
-    if (rhs == 1)  /*only one rhs argument: forward dct*/
-    {
-        isn = FFTW_FORWARD; /* default value */
-    }
-    else   /*get isn out of second argument*/
-    {
-        sciErr = getScalarIntArg(pvApiCtx, 2, fname, &isn);
-        if (sciErr.iErr)
-        {
-            Scierror(sciErr.iErr, getErrorMessage(sciErr));
-            return 0;
-        }
-        /* check value of second rhs argument */
-        if ((isn !=  FFTW_FORWARD) && (isn !=  FFTW_BACKWARD))
-        {
-            Scierror(53, _("%s: Wrong value for input argument #%d: %d or %d expected.\n"), fname, 2, FFTW_FORWARD, FFTW_BACKWARD);
-            return 0;
-        }
-    }
-
-    if (option != NULL)
-    {
-        if (isn == FFTW_FORWARD)
-        {
-            if (strcmp("dct1", option) == 0)
-            {
-                iopt = 1;
-            }
-            else if (strcmp("dct2", option) == 0)
-            {
-                iopt = 2;
-            }
-            else if (strcmp("dct", option) == 0)
-            {
-                iopt = 0;
-            }
-            else if (strcmp("dct4", option) == 0)
-            {
-                iopt = 4;
-            }
-            else
-            {
-                Scierror(999, _("%s: Wrong value for input argument #%d: Must be in the set {%s}.\n"), fname, Rhs,
-                         "\"dct\", \"dct1\",\"dct2\",\"dct4\"");
-                freeAllocatedSingleString(option);
-                option = NULL;
-                return 0;
-            }
-        }
-        else
-        {
-            if (strcmp("dct1", option) == 0)
-            {
-                iopt = 1;
-            }
-            else if (strcmp("dct3", option) == 0)
-            {
-                iopt = 3;
-            }
-            else if (strcmp("idct", option) == 0)
-            {
-                iopt = 0;
-            }
-            else if (strcmp("dct4", option) == 0)
-            {
-                iopt = 4;
-            }
-            else
-            {
-                Scierror(999, _("%s: Wrong value for input argument #%d: Must be in the set {%s}.\n"), fname, Rhs,
-                         "\"idct\", \"dct1\",\"dct3\",\"dct4\"");
-                freeAllocatedSingleString(option);
-                option = NULL;
-                return 0;
-            }
-
-        }
-        freeAllocatedSingleString(option);
-        option = NULL;
-
-    }
-
-    /********************  getting the array A      ************************************************/
-    getVarAddressFromPosition(pvApiCtx, 1, &piAddr);
-    if (!getArrayOfDouble(pvApiCtx, piAddr, &ndimsA, &dimsA, &Ar, &Ai))
-    {
-        Scierror(999, _("%s: Wrong type for argument #%d: Array of floating point numbers expected.\n"),
-                 fname, 1);
-        return 0;
-    }
-
-
-    /********************  Select proper method     ************************************************/
-    if (rhs < 3)
-    {
-        /* dct(A ,sign)*/
-        sci_dct_2args(pvApiCtx, fname, ndimsA, dimsA, Ar, Ai, isn, iopt);
-    }
-    else if (rhs == 3)
-    {
-        /* dct(A ,sign ,sel)*/
-        sci_dct_3args(pvApiCtx, fname, ndimsA, dimsA, Ar, Ai, isn, iopt);
-    }
-    else if (rhs == 4)
-    {
-        /* dct(A ,sign ,dim,incr)*/
-        sci_dct_4args(pvApiCtx, fname, ndimsA, dimsA, Ar, Ai, isn, iopt);
-    }
-
-    return 0;
-}
-
-int sci_dct_2args(void* pvApiCtx, char *fname, int ndimsA, int *dimsA, double *Ar,  double *Ai, int isn, int iopt)
-{
-    /*FFTW specific library variable */
-    guru_dim_struct gdim = {0, NULL, 0, NULL};
-
-    /* local variable */
-    int ndims = 0; /* number of non singleton dimensions */
-    int first_nonsingleton = -1;
-    int i = 0, j = 0;
-    int prd = 1;
-
-    /* ignore singleton dimensions */
-    first_nonsingleton = -1;
-    ndims = 0;
-    for (i = 0; i < ndimsA; i++)
-    {
-        if (dimsA[i] > 1)
-        {
-            ndims++;
-            if (first_nonsingleton < 0)
-            {
-                first_nonsingleton = i;
-            }
-        }
-    }
-
-    /* void or scalar input gives void output or scalar*/
-    if (ndims == 0 )
-    {
-        AssignOutputVariable(pvApiCtx, 1) =  1;
-        ReturnArguments(pvApiCtx);
-        return 0;
-    }
-
-    gdim.rank = ndims;
-    if ((gdim.dims = (fftw_iodim *)MALLOC(sizeof(fftw_iodim) * gdim.rank)) == NULL)
-    {
-        Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-
-    j = 0;
-    prd = 1;
-    for (i = (first_nonsingleton); i < ndimsA; i++)
-    {
-        if (dimsA[i] > 1)
-        {
-            gdim.dims[j].n = dimsA[i];
-            gdim.dims[j].is = prd;
-            gdim.dims[j].os = prd;
-            prd *= dimsA[i];
-            j++;
-        }
-    }
-    gdim.howmany_rank = 0;
-    gdim.howmany_dims = NULL;
-
-
-    if (!sci_dct_gen(pvApiCtx, fname, ndimsA, dimsA,  Ar,  Ai, isn, gdim, iopt))
-    {
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-
-    /***********************************
-    * Return results in lhs argument *
-    ***********************************/
-
-    ReturnArguments(pvApiCtx);
-
-    FREE(gdim.dims);
-    FREE(gdim.howmany_dims);
-    return 0;
-}
-
-
-int  sci_dct_3args(void* pvApiCtx, char *fname, int ndimsA, int *dimsA, double *Ar,  double *Ai, int isn, int iopt)
-{
-    /* API variables */
-    SciErr sciErr;
-    int *piAddr = NULL;
-
-    int *Sel = NULL;
-    int rank = 0;
-
-    /*FFTW specific library variable */
-    guru_dim_struct gdim = {0, NULL, 0, NULL};
-    /* local variable */
-    int ndims = 0;
-    int first_nonsingleton = -1;
-    int ih = 0;
-    int pd = 1; /* used to store prod(Dims(1:sel(k-1)))*/
-    int pds = 1; /* used to store prod(Dims(sel(k-1):sel(k)))*/
-    int i = 0, j = 0;
-
-    /* ignore singleton dimensions */
-    first_nonsingleton = -1;
-    ndims = 0;
-    for (i = 0; i < ndimsA; i++)
-    {
-        if (dimsA[i] > 1)
-        {
-            ndims++;
-            if (first_nonsingleton < 0)
-            {
-                first_nonsingleton = i;
-            }
-        }
-    }
-
-    /* void or scalar input gives void output or scalar*/
-    if (ndims == 0 )
-    {
-        AssignOutputVariable(pvApiCtx, 1) =  1;
-        ReturnArguments(pvApiCtx);
-        return 0;
-    }
-
-
-    /******************** get and check third argument (sel) ****************************************/
-    getVarAddressFromPosition(pvApiCtx, 3, &piAddr);
-    if (isVarMatrixType(pvApiCtx, piAddr) == 0)
-    {
-        Scierror(999, _("%s: Wrong type for input argument #%d.\n"), fname, 3);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-    sciErr = getVectorIntArg(pvApiCtx, 3, fname, &rank, &Sel);
-    if (sciErr.iErr)
-    {
-        Scierror(sciErr.iErr, getErrorMessage(sciErr));
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        FREE(Sel);
-        return 0;
-    }
-    /* size of Sel must be less than ndimsA */
-    if (rank <= 0 || rank >= ndimsA)
-    {
-        Scierror(999, _("%s: Wrong size for input argument #%d: Must be between %d and %d.\n"), fname, 3, 1, ndimsA - 1);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        FREE(Sel);
-        return 0;
-    }
-    /* check values of Sel[i] */
-    for (i = 0; i < rank; i++)
-    {
-        if (Sel[i] <= 0)
-        {
-            Scierror(999, _("%s: Wrong values for input argument #%d: Positive integers expected.\n"), fname, 3);
-            FREE(gdim.dims);
-            FREE(gdim.howmany_dims);
-            FREE(Sel);
-            return 0;
-        }
-        if (Sel[i] > ndimsA)
-        {
-            Scierror(999, _("%s: Wrong values for input argument #%d: Elements must be less than %d.\n"), fname, 3, ndimsA);
-            FREE(gdim.dims);
-            FREE(gdim.howmany_dims);
-            FREE(Sel);
-            return 0;
-        }
-        if (i > 0 && Sel[i] <= Sel[i - 1])
-        {
-            Scierror(999, _("%s: Wrong values for input argument #%d: Elements must be in increasing order.\n"), fname, 3);
-            FREE(gdim.dims);
-            FREE(gdim.howmany_dims);
-            FREE(Sel);
-            return 0;
-        }
-    }
-
-    /* Create  gdim struct */
-    gdim.rank = rank;
-    if ((gdim.dims = (fftw_iodim *)MALLOC(sizeof(fftw_iodim) * gdim.rank)) == NULL)
-    {
-        Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        FREE(Sel);
-        return 0;
-    }
-
-    pd = 1; /* used to store prod(Dims(1:sel(k-1)))*/
-    pds = 1; /* used to store prod(Dims(sel(k-1):sel(k)))*/
-    j = 0;
-    for (i = 0; i < ndimsA; i++)
-    {
-        if (j >= gdim.rank)
-        {
-            break;
-        }
-        if (Sel[j] == i + 1)
-        {
-            gdim.dims[j].n = dimsA[i];
-            gdim.dims[j].is = pd;
-            gdim.dims[j].os = pd;
-            j++;
-        }
-        pd *= dimsA[i];
-    }
-    /* Compute howmany_rank based on jumps in the Sel sequence */
-    gdim.howmany_rank = 0;
-    if ((Sel[0] != 1) && (Sel[0] != ndimsA))
-    {
-        gdim.howmany_rank++;
-    }
-    for (i = 1; i <= rank - 1; i++)
-    {
-        if (Sel[i] != Sel[i - 1] + 1)
-        {
-            /*check if all dimensions between Sel[i-1]+1 and Sel[i]-1 are
-              equal to one, in this case they can be ignored and there is
-              no jump*/
-            for (j = Sel[i - 1] + 1; j <= Sel[i] - 1; j++)
-            {
-                if (dimsA[j - 1] != 1)
-                {
-                    gdim.howmany_rank++;
-                    break;
-                }
-            }
-        }
-    }
-
-    if ((Sel[rank - 1] != ndimsA) || (rank == 1))
-    {
-        gdim.howmany_rank++;
-    }
-    /* Fill the howmany_dims struct */
-    if (gdim.howmany_rank > 0)
-    {
-        /* it must be the case */
-        if ((gdim.howmany_dims = (fftw_iodim *)MALLOC(gdim.howmany_rank * sizeof(fftw_iodim))) == NULL)
-        {
-            Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-            FREE(gdim.dims);
-            FREE(gdim.howmany_dims);
-            FREE(Sel);
-            return 0;
-        }
-        pd = 1;
-        for (j = 1; j <= (Sel[0] - 1); j++)
-        {
-            pd *= dimsA[j - 1];    /*prod(Dims(1:(sel(1)-1)))*/
-        }
-        ih = 0;
-        if ((Sel[0] != 1) && (Sel[0] != ndimsA))
-        {
-            /* First seleted dimension */
-            gdim.howmany_dims[ih].is = 1;
-            gdim.howmany_dims[ih].os = 1;
-            gdim.howmany_dims[ih].n = pd;
-            ih++;
-        }
-        pd *= dimsA[Sel[0] - 1]; /*prod(Dims(1:sel(1)))*/
-        for (i = 1; i <= rank - 1; i++)
-        {
-            /* intermediate selected dimensions */
-            if (Sel[i] != Sel[i - 1] + 1)
-            {
-                pds = 1;
-                for (j = (Sel[i - 1] + 1); j <= (Sel[i] - 1); j++)
-                {
-                    pds *= dimsA[j - 1];    /*prod(Dims(sel(i-1)+1:(sel(i)-1)))*/
-                }
-                /*check again if all dimensions between Sel[i-1]+1 and
-                  Sel[i]-1 are equal to one, in this case they can be
-                  ignored and there is no jump*/
-                for (j = (Sel[i - 1] + 1); j <= (Sel[i] - 1); j++)
-                {
-                    if (dimsA[j - 1] != 1)
-                    {
-                        gdim.howmany_dims[ih].is = pd;
-                        gdim.howmany_dims[ih].os = pd;
-                        gdim.howmany_dims[ih].n = pds;
-                        ih++;
-                        break;
-                    }
-                }
-            }
-            pd *= pds * dimsA[Sel[i] - 1]; /*prod(Dims(1:sel(i)))*/
-        }
-
-        if (Sel[rank - 1] != ndimsA)
-        {
-            /* last selected dimension*/
-            pds = 1;
-            for (j = (Sel[rank - 1] + 1); j <= ndimsA; j++)
-            {
-                pds *= dimsA[j - 1];    /*prod(Dims(sel(i-1)+1:(sel(i)-1)))*/
-            }
-            gdim.howmany_dims[ih].is = pd;
-            gdim.howmany_dims[ih].os = pd;
-            gdim.howmany_dims[ih].n = pds;
-            ih++;
-        }
-        else if (rank == 1)
-        {
-            /* the only selected dimension is the last one */
-            gdim.howmany_dims[ih].is = 1;
-            gdim.howmany_dims[ih].os = 1;
-            gdim.howmany_dims[ih].n = pd / dimsA[Sel[0] - 1];
-            ih++;
-        }
-    }
-
-    if (!sci_dct_gen(pvApiCtx, fname, ndimsA, dimsA, Ar,  Ai, isn, gdim, iopt))
-    {
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        FREE(Sel);
-        return 0;
-    }
-
-    /***********************************
-    * Return results in lhs argument *
-    ***********************************/
-
-    ReturnArguments(pvApiCtx);
-
-    FREE(gdim.dims);
-    FREE(gdim.howmany_dims);
-    return 0;
-}
-
-int sci_dct_4args(void* pvApiCtx, char *fname, int ndimsA, int *dimsA, double *Ar,  double *Ai, int isn, int iopt)
-{
-    /* API variables */
-    SciErr sciErr;
-    int *piAddr = NULL;
-
-    /* Input  array variables */
-    int *Dim1 = NULL;
-    int ndims = 0;
-    int *Incr = NULL;
-    int nincr = 0;
-
-    /*FFTW specific library variable */
-    guru_dim_struct gdim = {0, NULL, 0, NULL};
-    /* input/output address for transform variables */
-
-    /* local variable */
-    int *Dim = NULL, *Sel = NULL;
-    int pd = 1;
-    int pds = 1;
-    int nd = 0;
-    int rank = 0;
-    int i = 0, j = 0, k = 0, lA = 1;
-
-    for (i = 0; i < ndimsA; i++)
-    {
-        lA *= dimsA[i];
-    }
-
-    /* void or scalar input gives void output or scalar*/
-    if (lA <= 1 )
-    {
-        AssignOutputVariable(pvApiCtx, 1) =  1;
-        ReturnArguments(pvApiCtx);
-        return 0;
-    }
-
-    /******************** get and check third argument (dim) ****************************************/
-    getVarAddressFromPosition(pvApiCtx, 3, &piAddr);
-    if (isVarMatrixType(pvApiCtx, piAddr) == 0)
-    {
-        Scierror(999, _("%s: Wrong type for input argument #%d.\n"), fname, 3);
-        FREE(Dim1);
-        FREE(Incr);
-        FREE(Dim);
-        FREE(Sel);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-    sciErr = getVectorIntArg(pvApiCtx, 3, fname, &ndims, &Dim1);
-    if (sciErr.iErr)
-    {
-        Scierror(sciErr.iErr, getErrorMessage(sciErr));
-        FREE(Dim1);
-        FREE(Incr);
-        FREE(Dim);
-        FREE(Sel);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-    /* check values of Dim1[i] */
-    pd = 1;
-    for (i = 0; i < ndims; i++)
-    {
-        if (Dim1[i] <= 1)
-        {
-            Scierror(999, _("%s: Wrong values for input argument #%d: Elements must be greater than %d.\n"), fname, 3, 1);
-            FREE(Dim1);
-            FREE(Incr);
-            FREE(Dim);
-            FREE(Sel);
-            FREE(gdim.dims);
-            FREE(gdim.howmany_dims);
-            return 0;
-        }
-        pd *= Dim1[i];
-    }
-    if ( pd > lA)
-    {
-        Scierror(999, _("%s: Wrong values for input argument #%d: Must be less than %d.\n"), fname, 3, lA);
-        FREE(Dim1);
-        FREE(Incr);
-        FREE(Dim);
-        FREE(Sel);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-    if (lA % pd)
-    {
-        Scierror(999, _("%s: Wrong values for input argument #%d: Must be a divisor of %d.\n"), fname, 3, lA);
-        FREE(Dim1);
-        FREE(Incr);
-        FREE(Dim);
-        FREE(Sel);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-    /******************** get and check fourth argument (incr) ****************************************/
-    sciErr = getVectorIntArg(pvApiCtx, 4, fname, &nincr, &Incr);
-    if (sciErr.iErr)
-    {
-        Scierror(sciErr.iErr, getErrorMessage(sciErr));
-        FREE(Dim1);
-        FREE(Incr);
-        FREE(Dim);
-        FREE(Sel);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-    if (nincr != ndims)
-    {
-        Scierror(999, _("%s: Incompatible input arguments #%d and #%d: Same sizes expected.\n"), fname, 3, 4);
-        FREE(Dim1);
-        FREE(Incr);
-        FREE(Dim);
-        FREE(Sel);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-
-    /* check values of Incr[i] */
-    if (Incr[0] <= 0)
-    {
-        Scierror(999, _("%s: Wrong values for input argument #%d: Positive integers expected.\n"), fname, 4);
-        FREE(Dim1);
-        FREE(Incr);
-        FREE(Dim);
-        FREE(Sel);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-    for (i = 0; i < ndims; i++)
-    {
-        if (lA % Incr[i])
-        {
-            Scierror(999, _("%s: Wrong values for input argument #%d: Elements must be divisors of %d.\n"), fname, 3, lA);
-            FREE(Dim1);
-            FREE(Incr);
-            FREE(Dim);
-            FREE(Sel);
-            FREE(gdim.dims);
-            FREE(gdim.howmany_dims);
-            return 0;
-        }
-        if (i > 0 && (Incr[i] <= Incr[i - 1]))
-        {
-            Scierror(999, _("%s: Wrong values for input argument #%d: Elements must be in increasing ""order.\n"), fname, 4);
-            FREE(Dim1);
-            FREE(Incr);
-            FREE(Dim);
-            FREE(Sel);
-            FREE(gdim.dims);
-            FREE(gdim.howmany_dims);
-            return 0;
-        }
-    }
-    if ((Dim = (int *)MALLOC((2 * ndims + 1) * sizeof(int))) == NULL)
-    {
-        Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-        FREE(Dim1);
-        FREE(Incr);
-        FREE(Dim);
-        FREE(Sel);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-    if ((Sel = (int *)MALLOC((ndims) * sizeof(int))) == NULL)
-    {
-        Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-        FREE(Dim1);
-        FREE(Incr);
-        FREE(Dim);
-        FREE(Sel);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-
-
-    /*Transform  Dim1 and Incr into Dim and Sel and check validity*/
-
-    nd = 0;
-    pd = 1;
-    if (Incr[0] != 1)
-    {
-        Dim[nd++] = Incr[0];
-        pd *= Incr[0];
-    }
-    Dim[nd++] = Dim1[0];
-    pd *= Dim1[0];
-    Sel[0] = nd;
-
-    for (k = 1; k < ndims; k++)
-    {
-        if (Incr[k] % pd != 0)
-        {
-            Scierror(999, _("%s: Incompatible input arguments #%d and #%d.\n"), fname, 3, 4);
-            FREE(Dim1);
-            FREE(Incr);
-            FREE(Dim);
-            FREE(Sel);
-            FREE(gdim.dims);
-            FREE(gdim.howmany_dims);
-            return 0;
-        }
-        if (Incr[k] != pd)
-        {
-            Dim[nd++] = (int)(Incr[k] / pd);
-            pd = Incr[k];
-        }
-        Dim[nd++] = Dim1[k];
-        pd *= Dim1[k];
-        Sel[k] = nd;
-    }
-    if (pd < lA)
-    {
-        if (lA % pd != 0)
-        {
-            Scierror(999, _("%s: Incompatible input arguments #%d and #%d.\n"), fname, 3, 4);
-            FREE(Dim1);
-            FREE(Incr);
-            FREE(Dim);
-            FREE(Sel);
-            FREE(gdim.dims);
-            FREE(gdim.howmany_dims);
-            return 0;
-        }
-        Dim[nd++] = (int)(lA / pd);
-    }
-
-    rank = ndims;
-    ndims = nd;
-    /* now  same algorithm than sci_dct_3args applies */
-    /* Create  gdim struct */
-    gdim.rank = rank;
-    if ((gdim.dims = (fftw_iodim *)MALLOC(sizeof(fftw_iodim) * gdim.rank)) == NULL)
-    {
-        Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-        FREE(Dim1);
-        FREE(Incr);
-        FREE(Dim);
-        FREE(Sel);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-
-    pd = 1; /* used to store prod(Dims(1:sel(k-1)))*/
-    pds = 1; /* used to store prod(Dims(sel(k-1):sel(k)))*/
-    j = 0;
-    for (i = 0; i < ndims; i++)
-    {
-        if (j >= gdim.rank)
-        {
-            break;
-        }
-        if (Sel[j] == i + 1)
-        {
-            gdim.dims[j].n = Dim[i];
-            gdim.dims[j].is = pd;
-            gdim.dims[j].os = pd;
-            j++;
-        }
-        pd *= Dim[i];
-    }
-    /* Compute howmany_rank based on jumps in the Sel sequence */
-    gdim.howmany_rank = 0;
-    if ((Sel[0] != 1) && (Sel[0] != ndims))
-    {
-        gdim.howmany_rank++;
-    }
-
-    for (i = 1; i <= rank - 1; i++)
-    {
-        if (Sel[i] != Sel[i - 1] + 1)
-        {
-            /*check if all dimensions between Sel[i-1]+1 and Sel[i]-1 are
-              equal to one, in this case they can be ignored and there is
-              no jump*/
-            for (j = Sel[i - 1] + 1; j <= Sel[i] - 1; j++)
-            {
-                if (Dim[j - 1] != 1)
-                {
-                    gdim.howmany_rank++;
-                    break;
-                }
-            }
-        }
-    }
-    if ((Sel[rank - 1] != ndims) || (rank == 1))
-    {
-        gdim.howmany_rank++;
-    }
-    /* Fill the howmany_dims struct */
-    if (gdim.howmany_rank > 0)
-    {
-        /* it must be the case */
-        int ih = 0;
-
-        if ((gdim.howmany_dims = (fftw_iodim *)MALLOC(gdim.howmany_rank * sizeof(fftw_iodim))) == NULL)
-        {
-            Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-            FREE(Dim1);
-            FREE(Incr);
-            FREE(Dim);
-            FREE(Sel);
-            FREE(gdim.dims);
-            FREE(gdim.howmany_dims);
-            return 0;
-        }
-        pd = 1;
-        for (j = 1; j <= (Sel[0] - 1); j++)
-        {
-            pd *= Dim[j - 1];    /*prod(Dims(1:(sel(1)-1)))*/
-        }
-        ih = 0;
-        if ((Sel[0] != 1) && (Sel[0] != ndims))
-        {
-            /* First seleted dimension */
-            gdim.howmany_dims[ih].is = 1;
-            gdim.howmany_dims[ih].os = 1;
-            gdim.howmany_dims[ih].n = pd;
-            ih++;
-        }
-        pd *= Dim[Sel[0] - 1]; /*prod(Dims(1:sel(1)))*/
-
-        for (i = 1; i <= rank - 1; i++)
-        {
-            /* intermediate selected dimensions */
-            if (Sel[i] != Sel[i - 1] + 1)
-            {
-                pds = 1;
-                for (j = (Sel[i - 1] + 1); j <= (Sel[i] - 1); j++)
-                {
-                    pds *= Dim[j - 1];    /*prod(Dims(sel(i-1)+1:(sel(i)-1)))*/
-                }
-                /*check again if all dimensions between Sel[i-1]+1 and
-                  Sel[i]-1 are equal to one, in this case they can be
-                  ignored and there is no jump*/
-                for (j = (Sel[i - 1] + 1); j <= (Sel[i] - 1); j++)
-                {
-                    if (Dim[j - 1] != 1)
-                    {
-                        gdim.howmany_dims[ih].is = pd;
-                        gdim.howmany_dims[ih].os = pd;
-                        gdim.howmany_dims[ih].n = pds;
-                        ih++;
-                        break;
-                    }
-                }
-            }
-
-            pd *= pds * Dim[Sel[i] - 1]; /*prod(Dims(1:sel(i)))*/
-        }
-
-        if (Sel[rank - 1] != ndims)
-        {
-            /* last selected dimension*/
-            pds = 1;
-            for (j = (Sel[rank - 1] + 1); j <= ndims; j++)
-            {
-                pds *= Dim[j - 1];    /*prod(Dims(sel(i-1)+1:(sel(i)-1)))*/
-            }
-            gdim.howmany_dims[ih].is = pd;
-            gdim.howmany_dims[ih].os = pd;
-            gdim.howmany_dims[ih].n = pds;
-            ih++;
-        }
-        else if (rank == 1) /* the only selected dimension is the last one */
-        {
-            gdim.howmany_dims[ih].is = 1;
-            gdim.howmany_dims[ih].os = 1;
-            gdim.howmany_dims[ih].n = pd / Dim[Sel[0] - 1];
-            ih++;
-        }
-    }
-    if (!sci_dct_gen(pvApiCtx, fname, ndimsA, dimsA, Ar,  Ai, isn, gdim, iopt))
-    {
-        FREE(Dim1);
-        FREE(Incr);
-        FREE(Dim);
-        FREE(Sel);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-
-    /***********************************
-    * Return results in lhs argument *
-    ***********************************/
-
-    ReturnArguments(pvApiCtx);
-
-    FREE(Dim1);
-    FREE(Incr);
-    FREE(Dim);
-    FREE(Sel);
-    FREE(gdim.dims);
-    FREE(gdim.howmany_dims);
-    return 0;
-}
-/*--------------------------------------------------------------------------*/
-int sci_dct_gen(void* pvApiCtx, char *fname, int ndimsA, int *dimsA, double *Ar,  double *Ai, int isn, guru_dim_struct gdim, int iopt)
-{
-
-    /* Input  array variables */
-    int  isrealA = (Ai == NULL),  lA = 1;
-    /*for MKL*/
-
-    /*FFTW specific library variable */
-    enum Plan_Type type;
-    fftw_r2r_kind *kind = NULL;
-    fftw_plan p = NULL;
-
-    /* for MKL special cases */
-    int * dims1 = NULL;
-    int * incr1 = NULL;
-
-    /* local variable */
-    int one = 1;
-    int i = 0;
-    int errflag = 0;
-
-    for (i = 0; i < ndimsA; i++)
-    {
-        lA *= dimsA[i];
-    }
-
-
-    AssignOutputVariable(pvApiCtx, 1) =  1;/* assume inplace transform*/
-    if (isn == 1 && iopt == 0)
-    {
-        /* normalization */
-        if (dct_scale_array(Ar, Ai, gdim, isn) == -1)
-        {
-            Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-            return 0;
-        }
-    }
-    /* use inplace transform*/
-    type = R2R_PLAN;
-    if ((kind = (fftw_r2r_kind *)MALLOC(sizeof(fftw_r2r_kind) * gdim.rank)) == NULL)
-    {
-        Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-        return 0;
-    }
-
-    if (isn == -1)
-    {
-        if (iopt == 0 || iopt == 2)
-            for (i = 0; i < gdim.rank; i++)
-            {
-                kind[i] = FFTW_REDFT10;
-            }
-        else if (iopt == 1)
-            for (i = 0; i < gdim.rank; i++)
-            {
-                kind[i] = FFTW_REDFT00;
-            }
-        else if (iopt == 4)
-            for (i = 0; i < gdim.rank; i++)
-            {
-                kind[i] = FFTW_REDFT11;
-            }
-    }
-    else
-    {
-        if (iopt == 0 || iopt == 3)
-            for (i = 0; i < gdim.rank; i++)
-            {
-                kind[i] = FFTW_REDFT01;
-            }
-        else if (iopt == 1)
-            for (i = 0; i < gdim.rank; i++)
-            {
-                kind[i] = FFTW_REDFT00;
-            }
-        else if (iopt == 4)
-            for (i = 0; i < gdim.rank; i++)
-            {
-                kind[i] = FFTW_REDFT11;
-            }
-    }
-
-    if (!WITHMKL || gdim.howmany_rank <= 1)
-    {
-        /* Set Plan */
-        p = GetFFTWPlan(type, &gdim, Ar, NULL, Ar, NULL, getCurrentFftwFlags(), isn , kind, &errflag);
-        if (errflag == 1)
-        {
-            Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-            return 0;
-        }
-        else if (errflag == 2)
-        {
-            Scierror(999, _("%s: Creation of requested fftw plan failed.\n"), fname);
-            return 0;
-        }
-        /* execute FFTW plan */
-        ExecuteFFTWPlan(type, p, Ar, NULL, Ar, NULL);
-        if (!isrealA)
-        {
-            ExecuteFFTWPlan(type, p, Ai, NULL, Ai, NULL);
-        }
-    }
-    else
-    {
-        /*FFTW MKL does not implement yet guru plan with howmany_rank>1             */
-        /*   associated loops described in gdim.howmany_rank and  gdim.howmany_dims */
-        /*   are implemented here by a set of call with howmany_rank==1             */
-        fftw_iodim *howmany_dims = gdim.howmany_dims;
-        int howmany_rank = gdim.howmany_rank;
-        int i1 = 0, i2 = 0;
-        int nloop = 0;
-        int t = 0;
-
-
-        gdim.howmany_rank = 0;
-        gdim.howmany_dims = NULL;
-
-        p = GetFFTWPlan(type, &gdim, Ar, NULL, Ar, NULL, getCurrentFftwFlags(), isn , kind, &errflag);
-        if (errflag == 1)
-        {
-            Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-            FREE(dims1);
-            FREE(incr1);
-            return 0;
-        }
-        else if (errflag == 2)
-        {
-            Scierror(999, _("%s: Creation of requested fftw plan failed.\n"), fname);
-            FREE(dims1);
-            FREE(incr1);
-            return 0;
-        }
-
-        /* flatten  nested loops: replace howmany_rank nested loops by a single one*/
-        /* Build temporary arrays used by flatened loop */
-        if ((dims1 = (int *)MALLOC(sizeof(int) * howmany_rank)) == NULL)
-        {
-            Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-            FREE(dims1);
-            FREE(incr1);
-            return 0;
-        }
-        dims1[0] = howmany_dims[0].n;
-        for (i = 1; i < howmany_rank; i++)
-        {
-            dims1[i] = dims1[i - 1] * howmany_dims[i].n;
-        }
-        nloop = dims1[howmany_rank - 1];
-
-        if ((incr1 = (int *)MALLOC(sizeof(int) * howmany_rank)) == NULL)
-        {
-            Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-            FREE(dims1);
-            FREE(incr1);
-            return 0;
-        }
-        t = 1;
-        for (i = 0; i < howmany_rank; i++)
-        {
-            t += (howmany_dims[i].n - 1) * howmany_dims[i].is;
-            incr1[i] = t;
-        }
-        /*loop on each "plan" */
-        i = 0; /*index on the first plan entry */
-        for (i1 = 1; i1 <= nloop; i1++)
-        {
-            /* the input and output are assumed to be complex because
-               within MKL real cases are transformed to complex ones in
-               previous steps of sci_dct_gen*/
-            ExecuteFFTWPlan(type, p, &Ar[i], NULL, &Ar[i], NULL);
-            if (!isrealA)
-            {
-                ExecuteFFTWPlan(type, p, &Ai[i], NULL, &Ai[i], NULL);
-            }
-
-            i += howmany_dims[0].is;
-            /* check if  a loop ends*/
-            for (i2 = howmany_rank - 2; i2 >= 0; i2--)
-            {
-                if ((i1 % dims1[i2]) == 0)
-                {
-                    /*loop on dimension i2 ends, compute jump on the first plan entry index*/
-                    i += howmany_dims[i2 + 1].is - incr1[i2];
-                    break;
-                }
-            }
-        }
-        /* free temporary arrays */
-        FREE(dims1);
-        FREE(incr1);
-        /* reset initial value of gdim for post treatment*/
-        gdim.howmany_rank = howmany_rank;
-        gdim.howmany_dims = howmany_dims;
-
-    }
-    if (isn == -1 && iopt == 0)
-    {
-        /* normalization */
-
-        if (dct_scale_array(Ar, Ai, gdim, isn) == -1)
-        {
-            Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-            return 0;
-        }
-    }
-    return 1;
-}
-
diff --git a/scilab/modules/fftw/sci_gateway/c/sci_dst.c b/scilab/modules/fftw/sci_gateway/c/sci_dst.c
deleted file mode 100644 (file)
index ca90b96..0000000
+++ /dev/null
@@ -1,1203 +0,0 @@
-/*
-* Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-* Copyright (C) 2012 - INRIA - Serge STEER
-*
-* This file must be used under the terms of the CeCILL.
-* This source file is licensed as described in the file COPYING, which
-* you should have received as part of this distribution.  The terms
-* are also available at
-* http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
-*
-*/
-/*--------------------------------------------------------------------------*/
-#include "fftw_utilities.h"
-#include "sci_data_utilities.h"
-#include "callfftw.h"
-#include "sci_malloc.h"
-#include "gw_fftw.h"
-#include "api_scilab.h"
-#include "localization.h"
-#include "Scierror.h"
-#include "BOOL.h"
-#include "sci_data_utilities.h"
-
-
-/*--------------------------------------------------------------------------*/
-extern void C2F(dscal)(int *n, double *da, double *dx, int *incx); /* blas routine */
-extern void C2F(dset)(int *n, double *da, double *dx, int *incx); /* blas routine */
-/*--------------------------------------------------------------------------*/
-static int sci_dst_gen(void* pvApiCtx, char *fname, int ndimsA, int *dimsA, double *Ar,  double *Ai, int isn, guru_dim_struct gdim, int iopt);
-static int sci_dst_2args(void* pvApiCtx, char *fname, int ndimsA, int *dimsA, double *Ar,  double *Ai, int isn, int iopt);
-static int sci_dst_3args(void* pvApiCtx, char *fname, int ndimsA, int *dimsA, double *Ar,  double *Ai, int isn, int iopt);
-static int sci_dst_4args(void* pvApiCtx, char *fname, int ndimsA, int *dimsA, double *Ar,  double *Ai, int isn, int iopt);
-/*--------------------------------------------------------------------------*/
-
-extern int WITHMKL;
-/* fftw function.
-*
-* Scilab Calling sequence :
-*   dst(A )
-*   dst(A,sign )
-*   dst(A,sel,sign )
-*   dst(A,sign,dim,incr )
-*
-* Input : A : a scilab double complex or real vector, matrix or hypermatrix
-*
-*         sign : a scilab double or integer scalar (-1 or 1): the sign
-*                  in the exponential component
-*
-*         sel : a scilab double or integer vector, the selection of dimensions
-
-*         dim : a scilab double or integer vector: the dimensions
-*                  of the Fast Fourier Transform to perform
-*
-*         incr : a scilab double or integer vector: the increments
-*                  of the Fast Fourier Transform to perform
-*
-* Output : a scilab double complex or real array with same shape as A that
-*          gives the result of the transform.
-*
-*/
-int sci_dst(char *fname,  void* pvApiCtx)
-{
-    SciErr sciErr;
-    int *piAddr = NULL;
-    int rhs = Rhs;
-    int iTypeOne = 0;
-    int iopt = 0;
-
-    int ndimsA = 0;
-    int *dimsA = NULL;
-    double *Ar = NULL, *Ai = NULL;
-    char *option = NULL;
-    int isn = FFTW_FORWARD;
-    WITHMKL = withMKL();
-    /****************************************
-    * Basic constraints on rhs arguments  *
-    ****************************************/
-
-    /* check min/max lhs/rhs arguments of scilab function */
-    CheckRhs(1, 4);
-    CheckLhs(1, 1);
-
-    sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr);
-    if (sciErr.iErr)
-    {
-        printError(&sciErr, 0);
-        Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
-        return 0;
-    }
-
-    sciErr = getVarType(pvApiCtx, piAddr, &iTypeOne);
-    if (sciErr.iErr)
-    {
-        printError(&sciErr, 0);
-        Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
-        return 0;
-    }
-
-    if ((iTypeOne == sci_list) || (iTypeOne == sci_tlist))
-    {
-        OverLoad(1);
-        return 0;
-    }
-
-    if (iTypeOne == sci_mlist)
-    {
-        /* We allow overload for not hypermatrix type */
-        if (!isHyperMatrixMlist(pvApiCtx, piAddr))
-        {
-            OverLoad(1);
-            return 0;
-        }
-    }
-
-    sciErr = getVarAddressFromPosition(pvApiCtx, Rhs, &piAddr);
-    if (sciErr.iErr)
-    {
-        printError(&sciErr, 0);
-        Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, Rhs);
-        return 0;
-    }
-
-    if (isStringType(pvApiCtx, piAddr))   /*  dst(...,option); */
-    {
-        if (isScalar(pvApiCtx, piAddr))
-        {
-            if (getAllocatedSingleString(pvApiCtx, piAddr, &option) == 0)
-            {
-                rhs = Rhs - 1;
-            }
-            else
-            {
-                Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-                return 0;
-            }
-        }
-    }
-
-    /********************  Checking if isn is given  ************************************************/
-    if (rhs == 1)  /*only one rhs argument: forward dst*/
-    {
-        isn = FFTW_FORWARD; /* default value */
-    }
-    else   /*get isn out of second argument*/
-    {
-        sciErr = getScalarIntArg(pvApiCtx, 2, fname, &isn);
-        if (sciErr.iErr)
-        {
-            Scierror(sciErr.iErr, getErrorMessage(sciErr));
-            return 0;
-        }
-        /* check value of second rhs argument */
-        if ((isn !=  FFTW_FORWARD) && (isn !=  FFTW_BACKWARD))
-        {
-            Scierror(53, _("%s: Wrong value for input argument #%d: %d or %d expected.\n"), fname, 2, FFTW_FORWARD, FFTW_BACKWARD);
-            return 0;
-        }
-    }
-
-    if (option != NULL)
-    {
-        if (isn == FFTW_FORWARD)
-        {
-            if (strcmp("dst1", option) == 0)
-            {
-                iopt = 1;
-            }
-            else if (strcmp("dst2", option) == 0)
-            {
-                iopt = 2;
-            }
-            else if (strcmp("dst", option) == 0)
-            {
-                iopt = 0;
-            }
-            else if (strcmp("dst4", option) == 0)
-            {
-                iopt = 4;
-            }
-            else
-            {
-                Scierror(999, _("%s: Wrong value for input argument #%d: Must be in the set {%s}.\n"), fname, Rhs,
-                         "\"dst\", \"dst1\",\"dst2\",\"dst4\"");
-                freeAllocatedSingleString(option);
-                option = NULL;
-                return 0;
-            }
-        }
-        else
-        {
-            if (strcmp("dst1", option) == 0)
-            {
-                iopt = 1;
-            }
-            else if (strcmp("dst3", option) == 0)
-            {
-                iopt = 3;
-            }
-            else if (strcmp("idst", option) == 0)
-            {
-                iopt = 0;
-            }
-            else if (strcmp("dst4", option) == 0)
-            {
-                iopt = 4;
-            }
-            else
-            {
-                Scierror(999, _("%s: Wrong value for input argument #%d: Must be in the set {%s}.\n"), fname, Rhs,
-                         "\"idst\", \"dst1\",\"dst3\",\"dst4\"");
-                freeAllocatedSingleString(option);
-                option = NULL;
-                return 0;
-            }
-
-        }
-        freeAllocatedSingleString(option);
-        option = NULL;
-
-    }
-
-
-    /********************  getting the array A      ************************************************/
-    getVarAddressFromPosition(pvApiCtx, 1, &piAddr);
-    if (!getArrayOfDouble(pvApiCtx, piAddr, &ndimsA, &dimsA, &Ar, &Ai))
-    {
-        Scierror(999, _("%s: Wrong type for argument #%d: Array of floating point numbers expected.\n"),
-                 fname, 1);
-        return 0;
-    }
-
-
-    /********************  Select proper method     ************************************************/
-    if (rhs < 3)
-    {
-        /* dst(A ,sign)*/
-        sci_dst_2args(pvApiCtx, fname, ndimsA, dimsA, Ar, Ai, isn, iopt);
-    }
-    else if (rhs == 3)
-    {
-        /* dst(A ,sign ,sel)*/
-        sci_dst_3args(pvApiCtx, fname, ndimsA, dimsA, Ar, Ai, isn, iopt);
-    }
-    else if (rhs == 4)
-    {
-        /* dst(A ,sign ,dim,incr)*/
-        sci_dst_4args(pvApiCtx, fname, ndimsA, dimsA, Ar, Ai, isn, iopt);
-    }
-
-    return 0;
-}
-
-int sci_dst_2args(void* pvApiCtx, char *fname, int ndimsA, int *dimsA, double *Ar,  double *Ai, int isn, int iopt)
-{
-    /*FFTW specific library variable */
-    guru_dim_struct gdim = {0, NULL, 0, NULL};
-
-    /* local variable */
-    int ndims = 0; /* number of non singleton dimensions */
-    int first_nonsingleton = -1;
-    int i = 0, j = 0;
-    int prd = 1;
-
-    /* ignore singleton dimensions */
-    first_nonsingleton = -1;
-    ndims = 0;
-    for (i = 0; i < ndimsA; i++)
-    {
-        if (dimsA[i] > 1)
-        {
-            ndims++;
-            if (first_nonsingleton < 0)
-            {
-                first_nonsingleton = i;
-            }
-        }
-    }
-
-    /* void or scalar input gives void output or scalar*/
-    if (ndims == 0 )
-    {
-        AssignOutputVariable(pvApiCtx, 1) =  1;
-        ReturnArguments(pvApiCtx);
-        return 0;
-    }
-
-    gdim.rank = ndims;
-    if ((gdim.dims = (fftw_iodim *)MALLOC(sizeof(fftw_iodim) * gdim.rank)) == NULL)
-    {
-        Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-
-    j = 0;
-    prd = 1;
-    for (i = (first_nonsingleton); i < ndimsA; i++)
-    {
-        if (dimsA[i] > 1)
-        {
-            gdim.dims[j].n = dimsA[i];
-            gdim.dims[j].is = prd;
-            gdim.dims[j].os = prd;
-            prd *= dimsA[i];
-            j++;
-        }
-    }
-    gdim.howmany_rank = 0;
-    gdim.howmany_dims = NULL;
-
-
-    if (!sci_dst_gen(pvApiCtx, fname, ndimsA, dimsA,  Ar,  Ai, isn, gdim, iopt))
-    {
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-
-    /***********************************
-    * Return results in lhs argument *
-    ***********************************/
-
-    ReturnArguments(pvApiCtx);
-
-    FREE(gdim.dims);
-    FREE(gdim.howmany_dims);
-    return 0;
-}
-
-
-int  sci_dst_3args(void* pvApiCtx, char *fname, int ndimsA, int *dimsA, double *Ar,  double *Ai, int isn, int iopt)
-{
-    /* API variables */
-    SciErr sciErr;
-    int *piAddr = NULL;
-
-    int *Sel = NULL;
-    int rank = 0;
-
-    /*FFTW specific library variable */
-    guru_dim_struct gdim = {0, NULL, 0, NULL};
-    /* local variable */
-    int ndims = 0;
-    int first_nonsingleton = -1;
-    int ih = 0;
-    int pd = 1; /* used to store prod(Dims(1:sel(k-1)))*/
-    int pds = 1; /* used to store prod(Dims(sel(k-1):sel(k)))*/
-    int i = 0, j = 0;
-
-    /* ignore singleton dimensions */
-    first_nonsingleton = -1;
-    ndims = 0;
-    for (i = 0; i < ndimsA; i++)
-    {
-        if (dimsA[i] > 1)
-        {
-            ndims++;
-            if (first_nonsingleton < 0)
-            {
-                first_nonsingleton = i;
-            }
-        }
-    }
-
-    /* void or scalar input gives void output or scalar*/
-    if (ndims == 0 )
-    {
-        AssignOutputVariable(pvApiCtx, 1) =  1;
-        ReturnArguments(pvApiCtx);
-        return 0;
-    }
-
-
-    /******************** get and check third argument (sel) ****************************************/
-    getVarAddressFromPosition(pvApiCtx, 3, &piAddr);
-    if (isVarMatrixType(pvApiCtx, piAddr) == 0)
-    {
-        Scierror(999, _("%s: Wrong type for input argument #%d.\n"), fname, 3);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-    sciErr = getVectorIntArg(pvApiCtx, 3, fname, &rank, &Sel);
-    if (sciErr.iErr)
-    {
-        Scierror(sciErr.iErr, getErrorMessage(sciErr));
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-    /* size of Sel must be less than ndimsA */
-    if (rank <= 0 || rank >= ndimsA)
-    {
-        Scierror(999, _("%s: Wrong size for input argument #%d: Must be between %d and %d.\n"), fname, 3, 1, ndimsA - 1);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-    /* check values of Sel[i] */
-    for (i = 0; i < rank; i++)
-    {
-        if (Sel[i] <= 0)
-        {
-            Scierror(999, _("%s: Wrong values for input argument #%d: Positive integers expected.\n"), fname, 3);
-            FREE(gdim.dims);
-            FREE(gdim.howmany_dims);
-            return 0;
-        }
-        if (Sel[i] > ndimsA)
-        {
-            Scierror(999, _("%s: Wrong values for input argument #%d: Elements must be less than %d.\n"), fname, 3, ndimsA);
-            FREE(gdim.dims);
-            FREE(gdim.howmany_dims);
-            return 0;
-        }
-        if (i > 0 && Sel[i] <= Sel[i - 1])
-        {
-            Scierror(999, _("%s: Wrong values for input argument #%d: Elements must be in increasing order.\n"), fname, 3);
-            FREE(gdim.dims);
-            FREE(gdim.howmany_dims);
-            return 0;
-        }
-    }
-
-    /* Create  gdim struct */
-    gdim.rank = rank;
-    if ((gdim.dims = (fftw_iodim *)MALLOC(sizeof(fftw_iodim) * gdim.rank)) == NULL)
-    {
-        Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-
-    pd = 1; /* used to store prod(Dims(1:sel(k-1)))*/
-    pds = 1; /* used to store prod(Dims(sel(k-1):sel(k)))*/
-    j = 0;
-    for (i = 0; i < ndimsA; i++)
-    {
-        if (j >= gdim.rank)
-        {
-            break;
-        }
-        if (Sel[j] == i + 1)
-        {
-            gdim.dims[j].n = dimsA[i];
-            gdim.dims[j].is = pd;
-            gdim.dims[j].os = pd;
-            j++;
-        }
-        pd *= dimsA[i];
-    }
-    /* Compute howmany_rank based on jumps in the Sel sequence */
-    gdim.howmany_rank = 0;
-    if ((Sel[0] != 1) && (Sel[0] != ndimsA))
-    {
-        gdim.howmany_rank++;
-    }
-    for (i = 1; i <= rank - 1; i++)
-    {
-        if (Sel[i] != Sel[i - 1] + 1)
-        {
-            /*check if all dimensions between Sel[i-1]+1 and Sel[i]-1 are
-              equal to one, in this case they can be ignored and there is
-              no jump*/
-            for (j = Sel[i - 1] + 1; j <= Sel[i] - 1; j++)
-            {
-                if (dimsA[j - 1] != 1)
-                {
-                    gdim.howmany_rank++;
-                    break;
-                }
-            }
-        }
-    }
-
-    if ((Sel[rank - 1] != ndimsA) || (rank == 1))
-    {
-        gdim.howmany_rank++;
-    }
-    /* Fill the howmany_dims struct */
-    if (gdim.howmany_rank > 0)
-    {
-        /* it must be the case */
-        if ((gdim.howmany_dims = (fftw_iodim *)MALLOC(gdim.howmany_rank * sizeof(fftw_iodim))) == NULL)
-        {
-            Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-            FREE(gdim.dims);
-            FREE(gdim.howmany_dims);
-            return 0;
-        }
-        pd = 1;
-        for (j = 1; j <= (Sel[0] - 1); j++)
-        {
-            pd *= dimsA[j - 1];    /*prod(Dims(1:(sel(1)-1)))*/
-        }
-        ih = 0;
-        if ((Sel[0] != 1) && (Sel[0] != ndimsA))
-        {
-            /* First seleted dimension */
-            gdim.howmany_dims[ih].is = 1;
-            gdim.howmany_dims[ih].os = 1;
-            gdim.howmany_dims[ih].n = pd;
-            ih++;
-        }
-        pd *= dimsA[Sel[0] - 1]; /*prod(Dims(1:sel(1)))*/
-        for (i = 1; i <= rank - 1; i++)
-        {
-            /* intermediate selected dimensions */
-            if (Sel[i] != Sel[i - 1] + 1)
-            {
-                pds = 1;
-                for (j = (Sel[i - 1] + 1); j <= (Sel[i] - 1); j++)
-                {
-                    pds *= dimsA[j - 1];    /*prod(Dims(sel(i-1)+1:(sel(i)-1)))*/
-                }
-                /*check again if all dimensions between Sel[i-1]+1 and
-                  Sel[i]-1 are equal to one, in this case they can be
-                  ignored and there is no jump*/
-                for (j = (Sel[i - 1] + 1); j <= (Sel[i] - 1); j++)
-                {
-                    if (dimsA[j - 1] != 1)
-                    {
-                        gdim.howmany_dims[ih].is = pd;
-                        gdim.howmany_dims[ih].os = pd;
-                        gdim.howmany_dims[ih].n = pds;
-                        ih++;
-                        break;
-                    }
-                }
-            }
-            pd *= pds * dimsA[Sel[i] - 1]; /*prod(Dims(1:sel(i)))*/
-        }
-
-        if (Sel[rank - 1] != ndimsA)
-        {
-            /* last selected dimension*/
-            pds = 1;
-            for (j = (Sel[rank - 1] + 1); j <= ndimsA; j++)
-            {
-                pds *= dimsA[j - 1];    /*prod(Dims(sel(i-1)+1:(sel(i)-1)))*/
-            }
-            gdim.howmany_dims[ih].is = pd;
-            gdim.howmany_dims[ih].os = pd;
-            gdim.howmany_dims[ih].n = pds;
-            ih++;
-        }
-        else if (rank == 1)
-        {
-            /* the only selected dimension is the last one */
-            gdim.howmany_dims[ih].is = 1;
-            gdim.howmany_dims[ih].os = 1;
-            gdim.howmany_dims[ih].n = pd / dimsA[Sel[0] - 1];
-            ih++;
-        }
-    }
-
-    if (!sci_dst_gen(pvApiCtx, fname, ndimsA, dimsA, Ar,  Ai, isn, gdim, iopt))
-    {
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-
-    /***********************************
-    * Return results in lhs argument *
-    ***********************************/
-
-    ReturnArguments(pvApiCtx);
-
-    FREE(gdim.dims);
-    FREE(gdim.howmany_dims);
-    return 0;
-}
-
-int sci_dst_4args(void* pvApiCtx, char *fname, int ndimsA, int *dimsA, double *Ar,  double *Ai, int isn, int iopt)
-{
-    /* API variables */
-    SciErr sciErr;
-    int *piAddr = NULL;
-
-    /* Input  array variables */
-    int *Dim1 = NULL;
-    int ndims = 0;
-    int *Incr = NULL;
-    int nincr = 0;
-
-    /*FFTW specific library variable */
-    guru_dim_struct gdim = {0, NULL, 0, NULL};
-    /* input/output address for transform variables */
-
-    /* local variable */
-    int *Dim = NULL, *Sel = NULL;
-    int pd = 1;
-    int pds = 1;
-    int nd = 0;
-    int rank = 0;
-    int i = 0, j = 0, k = 0, lA = 1;
-
-    for (i = 0; i < ndimsA; i++)
-    {
-        lA *= dimsA[i];
-    }
-
-    /* void or scalar input gives void output or scalar*/
-    if (lA <= 1 )
-    {
-        AssignOutputVariable(pvApiCtx, 1) =  1;
-        ReturnArguments(pvApiCtx);
-        return 0;
-    }
-
-    /******************** get and check third argument (dim) ****************************************/
-    getVarAddressFromPosition(pvApiCtx, 3, &piAddr);
-    if (isVarMatrixType(pvApiCtx, piAddr) == 0)
-    {
-        Scierror(999, _("%s: Wrong type for input argument #%d.\n"), fname, 3);
-        FREE(Dim1);
-        FREE(Incr);
-        FREE(Dim);
-        FREE(Sel);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-    sciErr = getVectorIntArg(pvApiCtx, 3, fname, &ndims, &Dim1);
-    if (sciErr.iErr)
-    {
-        Scierror(sciErr.iErr, getErrorMessage(sciErr));
-        FREE(Dim1);
-        FREE(Incr);
-        FREE(Dim);
-        FREE(Sel);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-    /* check values of Dim1[i] */
-    pd = 1;
-    for (i = 0; i < ndims; i++)
-    {
-        if (Dim1[i] <= 1)
-        {
-            Scierror(999, _("%s: Wrong values for input argument #%d: Elements must be greater than %d.\n"), fname, 3, 1);
-            FREE(Dim1);
-            FREE(Incr);
-            FREE(Dim);
-            FREE(Sel);
-            FREE(gdim.dims);
-            FREE(gdim.howmany_dims);
-            return 0;
-        }
-        pd *= Dim1[i];
-    }
-    if ( pd > lA)
-    {
-        Scierror(999, _("%s: Wrong values for input argument #%d: Must be less than %d.\n"), fname, 3, lA);
-        FREE(Dim1);
-        FREE(Incr);
-        FREE(Dim);
-        FREE(Sel);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-    if (lA % pd)
-    {
-        Scierror(999, _("%s: Wrong values for input argument #%d: Must be a divisor of %d.\n"), fname, 3, lA);
-        FREE(Dim1);
-        FREE(Incr);
-        FREE(Dim);
-        FREE(Sel);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-    /******************** get and check fourth argument (incr) ****************************************/
-    sciErr = getVectorIntArg(pvApiCtx, 4, fname, &nincr, &Incr);
-    if (sciErr.iErr)
-    {
-        Scierror(sciErr.iErr, getErrorMessage(sciErr));
-        FREE(Dim1);
-        FREE(Incr);
-        FREE(Dim);
-        FREE(Sel);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-    if (nincr != ndims)
-    {
-        Scierror(999, _("%s: Incompatible input arguments #%d and #%d: Same sizes expected.\n"), fname, 3, 4);
-        FREE(Dim1);
-        FREE(Incr);
-        FREE(Dim);
-        FREE(Sel);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-
-    /* check values of Incr[i] */
-    if (Incr[0] <= 0)
-    {
-        Scierror(999, _("%s: Wrong values for input argument #%d: Positive integers expected.\n"), fname, 4);
-        FREE(Dim1);
-        FREE(Incr);
-        FREE(Dim);
-        FREE(Sel);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-    for (i = 0; i < ndims; i++)
-    {
-        if (lA % Incr[i])
-        {
-            Scierror(999, _("%s: Wrong values for input argument #%d: Elements must be divisors of %d.\n"), fname, 3, lA);
-            FREE(Dim1);
-            FREE(Incr);
-            FREE(Dim);
-            FREE(Sel);
-            FREE(gdim.dims);
-            FREE(gdim.howmany_dims);
-            return 0;
-        }
-        if (i > 0 && (Incr[i] <= Incr[i - 1]))
-        {
-            Scierror(999, _("%s: Wrong values for input argument #%d: Elements must be in increasing ""order.\n"), fname, 4);
-            FREE(Dim1);
-            FREE(Incr);
-            FREE(Dim);
-            FREE(Sel);
-            FREE(gdim.dims);
-            FREE(gdim.howmany_dims);
-            return 0;
-        }
-    }
-    if ((Dim = (int *)MALLOC((2 * ndims + 1) * sizeof(int))) == NULL)
-    {
-        Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-        FREE(Dim1);
-        FREE(Incr);
-        FREE(Dim);
-        FREE(Sel);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-    if ((Sel = (int *)MALLOC((ndims) * sizeof(int))) == NULL)
-    {
-        Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-        FREE(Dim1);
-        FREE(Incr);
-        FREE(Dim);
-        FREE(Sel);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-
-
-    /*Transform  Dim1 and Incr into Dim and Sel and check validity*/
-
-    nd = 0;
-    pd = 1;
-    if (Incr[0] != 1)
-    {
-        Dim[nd++] = Incr[0];
-        pd *= Incr[0];
-    }
-    Dim[nd++] = Dim1[0];
-    pd *= Dim1[0];
-    Sel[0] = nd;
-
-    for (k = 1; k < ndims; k++)
-    {
-        if (Incr[k] % pd != 0)
-        {
-            Scierror(999, _("%s: Incompatible input arguments #%d and #%d.\n"), fname, 3, 4);
-            FREE(Dim1);
-            FREE(Incr);
-            FREE(Dim);
-            FREE(Sel);
-            FREE(gdim.dims);
-            FREE(gdim.howmany_dims);
-            return 0;
-        }
-        if (Incr[k] != pd)
-        {
-            Dim[nd++] = (int)(Incr[k] / pd);
-            pd = Incr[k];
-        }
-        Dim[nd++] = Dim1[k];
-        pd *= Dim1[k];
-        Sel[k] = nd;
-    }
-    if (pd < lA)
-    {
-        if (lA % pd != 0)
-        {
-            Scierror(999, _("%s: Incompatible input arguments #%d and #%d.\n"), fname, 3, 4);
-            FREE(Dim1);
-            FREE(Incr);
-            FREE(Dim);
-            FREE(Sel);
-            FREE(gdim.dims);
-            FREE(gdim.howmany_dims);
-            return 0;
-        }
-        Dim[nd++] = (int)(lA / pd);
-    }
-
-    rank = ndims;
-    ndims = nd;
-    /* now  same algorithm than sci_dst_3args applies */
-    /* Create  gdim struct */
-    gdim.rank = rank;
-    if ((gdim.dims = (fftw_iodim *)MALLOC(sizeof(fftw_iodim) * gdim.rank)) == NULL)
-    {
-        Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-        FREE(Dim1);
-        FREE(Incr);
-        FREE(Dim);
-        FREE(Sel);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-
-    pd = 1; /* used to store prod(Dims(1:sel(k-1)))*/
-    pds = 1; /* used to store prod(Dims(sel(k-1):sel(k)))*/
-    j = 0;
-    for (i = 0; i < ndims; i++)
-    {
-        if (j >= gdim.rank)
-        {
-            break;
-        }
-        if (Sel[j] == i + 1)
-        {
-            gdim.dims[j].n = Dim[i];
-            gdim.dims[j].is = pd;
-            gdim.dims[j].os = pd;
-            j++;
-        }
-        pd *= Dim[i];
-    }
-    /* Compute howmany_rank based on jumps in the Sel sequence */
-    gdim.howmany_rank = 0;
-    if ((Sel[0] != 1) && (Sel[0] != ndims))
-    {
-        gdim.howmany_rank++;
-    }
-
-    for (i = 1; i <= rank - 1; i++)
-    {
-        if (Sel[i] != Sel[i - 1] + 1)
-        {
-            /*check if all dimensions between Sel[i-1]+1 and Sel[i]-1 are
-              equal to one, in this case they can be ignored and there is
-              no jump*/
-            for (j = Sel[i - 1] + 1; j <= Sel[i] - 1; j++)
-            {
-                if (Dim[j - 1] != 1)
-                {
-                    gdim.howmany_rank++;
-                    break;
-                }
-            }
-        }
-    }
-    if ((Sel[rank - 1] != ndims) || (rank == 1))
-    {
-        gdim.howmany_rank++;
-    }
-    /* Fill the howmany_dims struct */
-    if (gdim.howmany_rank > 0)
-    {
-        /* it must be the case */
-        int ih = 0;
-
-        if ((gdim.howmany_dims = (fftw_iodim *)MALLOC(gdim.howmany_rank * sizeof(fftw_iodim))) == NULL)
-        {
-            Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-            FREE(Dim1);
-            FREE(Incr);
-            FREE(Dim);
-            FREE(Sel);
-            FREE(gdim.dims);
-            FREE(gdim.howmany_dims);
-            return 0;
-        }
-        pd = 1;
-        for (j = 1; j <= (Sel[0] - 1); j++)
-        {
-            pd *= Dim[j - 1];    /*prod(Dims(1:(sel(1)-1)))*/
-        }
-        ih = 0;
-        if ((Sel[0] != 1) && (Sel[0] != ndims))
-        {
-            /* First seleted dimension */
-            gdim.howmany_dims[ih].is = 1;
-            gdim.howmany_dims[ih].os = 1;
-            gdim.howmany_dims[ih].n = pd;
-            ih++;
-        }
-        pd *= Dim[Sel[0] - 1]; /*prod(Dims(1:sel(1)))*/
-
-        for (i = 1; i <= rank - 1; i++)
-        {
-            /* intermediate selected dimensions */
-            if (Sel[i] != Sel[i - 1] + 1)
-            {
-                pds = 1;
-                for (j = (Sel[i - 1] + 1); j <= (Sel[i] - 1); j++)
-                {
-                    pds *= Dim[j - 1];    /*prod(Dims(sel(i-1)+1:(sel(i)-1)))*/
-                }
-                /*check again if all dimensions between Sel[i-1]+1 and
-                  Sel[i]-1 are equal to one, in this case they can be
-                  ignored and there is no jump*/
-                for (j = (Sel[i - 1] + 1); j <= (Sel[i] - 1); j++)
-                {
-                    if (Dim[j - 1] != 1)
-                    {
-                        gdim.howmany_dims[ih].is = pd;
-                        gdim.howmany_dims[ih].os = pd;
-                        gdim.howmany_dims[ih].n = pds;
-                        ih++;
-                        break;
-                    }
-                }
-            }
-
-            pd *= pds * Dim[Sel[i] - 1]; /*prod(Dims(1:sel(i)))*/
-        }
-
-        if (Sel[rank - 1] != ndims)
-        {
-            /* last selected dimension*/
-            pds = 1;
-            for (j = (Sel[rank - 1] + 1); j <= ndims; j++)
-            {
-                pds *= Dim[j - 1];    /*prod(Dims(sel(i-1)+1:(sel(i)-1)))*/
-            }
-            gdim.howmany_dims[ih].is = pd;
-            gdim.howmany_dims[ih].os = pd;
-            gdim.howmany_dims[ih].n = pds;
-            ih++;
-        }
-        else if (rank == 1) /* the only selected dimension is the last one */
-        {
-            gdim.howmany_dims[ih].is = 1;
-            gdim.howmany_dims[ih].os = 1;
-            gdim.howmany_dims[ih].n = pd / Dim[Sel[0] - 1];
-            ih++;
-        }
-    }
-    if (!sci_dst_gen(pvApiCtx, fname, ndimsA, dimsA, Ar,  Ai, isn, gdim, iopt))
-    {
-        FREE(Dim1);
-        FREE(Incr);
-        FREE(Dim);
-        FREE(Sel);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-
-    /***********************************
-    * Return results in lhs argument *
-    ***********************************/
-
-
-    FREE(Dim1);
-    FREE(Incr);
-    FREE(Dim);
-    FREE(Sel);
-    FREE(gdim.dims);
-    FREE(gdim.howmany_dims);
-
-    ReturnArguments(pvApiCtx);
-
-    return 0;
-}
-/*--------------------------------------------------------------------------*/
-int sci_dst_gen(void* pvApiCtx, char *fname, int ndimsA, int *dimsA, double *Ar,  double *Ai, int isn, guru_dim_struct gdim, int iopt)
-{
-
-    /* Input  array variables */
-    int  isrealA = (Ai == NULL),  lA = 1;
-    double half = 0.5;
-
-    /*FFTW specific library variable */
-    enum Plan_Type type;
-    fftw_r2r_kind *kind = NULL;
-    fftw_plan p = NULL;
-
-    /* for MKL special cases */
-    int * dims1 = NULL;
-    int * incr1 = NULL;
-
-    /* local variable */
-    int one = 1;
-    int i = 0;
-    int errflag = 0;
-
-    for (i = 0; i < ndimsA; i++)
-    {
-        lA *= dimsA[i];
-    }
-
-
-    AssignOutputVariable(pvApiCtx, 1) =  1;/* assume inplace transform*/
-    /* Set pointers on real and imaginary part of the input */
-
-    /* use inplace transform*/
-    type = R2R_PLAN;
-    if ((kind = (fftw_r2r_kind *)MALLOC(sizeof(fftw_r2r_kind) * gdim.rank)) == NULL)
-    {
-        Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-        return 0;
-    }
-
-
-    if (isn == -1)
-    {
-        if (iopt == 0 || iopt == 1)
-            for (i = 0; i < gdim.rank; i++)
-            {
-                kind[i] = FFTW_RODFT00;
-            }
-        else if (iopt == 2)
-            for (i = 0; i < gdim.rank; i++)
-            {
-                kind[i] = FFTW_RODFT10;
-            }
-        else if (iopt == 4)
-            for (i = 0; i < gdim.rank; i++)
-            {
-                kind[i] = FFTW_RODFT11;
-            }
-    }
-    else
-    {
-        if (iopt == 0 || iopt == 1)
-            for (i = 0; i < gdim.rank; i++)
-            {
-                kind[i] = FFTW_RODFT00;
-            }
-        else if (iopt == 3)
-            for (i = 0; i < gdim.rank; i++)
-            {
-                kind[i] = FFTW_RODFT01;
-            }
-        else if (iopt == 4)
-            for (i = 0; i < gdim.rank; i++)
-            {
-                kind[i] = FFTW_RODFT11;
-            }
-    }
-
-    if (!WITHMKL || gdim.howmany_rank <= 1)
-    {
-        /* Set Plan */
-        p = GetFFTWPlan(type, &gdim, Ar, NULL, Ar, NULL, getCurrentFftwFlags(), isn , kind, &errflag);
-
-        if (errflag == 1)
-        {
-            Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-            return 0;
-        }
-        else if (errflag == 2)
-        {
-            Scierror(999, _("%s: Creation of requested fftw plan failed.\n"), fname);
-            return 0;
-        }
-        /* execute FFTW plan */
-        ExecuteFFTWPlan(type, p, Ar, NULL, Ar, NULL);
-        if (!isrealA)
-        {
-            ExecuteFFTWPlan(type, p, Ai, NULL, Ai, NULL);
-        }
-
-    }
-    else
-    {
-        /*FFTW MKL does not implement yet guru plan with howmany_rank>1             */
-        /*   associated loops described in gdim.howmany_rank and  gdim.howmany_dims */
-        /*   are implemented here by a set of call with howmany_rank==1             */
-        fftw_iodim *howmany_dims = gdim.howmany_dims;
-        int howmany_rank = gdim.howmany_rank;
-        int i1 = 0, i2 = 0;
-        int nloop = 0;
-        int t = 0;
-
-
-        gdim.howmany_rank = 0;
-        gdim.howmany_dims = NULL;
-
-        p = GetFFTWPlan(type, &gdim, Ar, NULL, Ar, NULL, getCurrentFftwFlags(), isn , kind, &errflag);
-        if (errflag == 1)
-        {
-            Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-            FREE(dims1);
-            FREE(incr1);
-            return 0;
-        }
-        else if (errflag == 2)
-        {
-            Scierror(999, _("%s: Creation of requested fftw plan failed.\n"), fname);
-            FREE(dims1);
-            FREE(incr1);
-            return 0;
-        }
-
-        /* flatten  nested loops: replace howmany_rank nested loops by a single one*/
-        /* Build temporary arrays used by flatened loop */
-        if ((dims1 = (int *)MALLOC(sizeof(int) * howmany_rank)) == NULL)
-        {
-            Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-            FREE(dims1);
-            FREE(incr1);
-            return 0;
-        }
-        dims1[0] = howmany_dims[0].n;
-        for (i = 1; i < howmany_rank; i++)
-        {
-            dims1[i] = dims1[i - 1] * howmany_dims[i].n;
-        }
-        nloop = dims1[howmany_rank - 1];
-
-        if ((incr1 = (int *)MALLOC(sizeof(int) * howmany_rank)) == NULL)
-        {
-            Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-            FREE(dims1);
-            FREE(incr1);
-            return 0;
-        }
-        t = 1;
-        for (i = 0; i < howmany_rank; i++)
-        {
-            t += (howmany_dims[i].n - 1) * howmany_dims[i].is;
-            incr1[i] = t;
-        }
-        /*loop on each "plan" */
-        i = 0; /*index on the first plan entry */
-        for (i1 = 1; i1 <= nloop; i1++)
-        {
-            /* the input and output are assumed to be complex because
-               within MKL real cases are transformed to complex ones in
-               previous steps of sci_dst_gen*/
-            ExecuteFFTWPlan(type, p, &Ar[i], NULL, &Ar[i], NULL);
-            if (!isrealA)
-            {
-                ExecuteFFTWPlan(type, p, &Ai[i], NULL, &Ai[i], NULL);
-            }
-
-            i += howmany_dims[0].is;
-            /* check if  a loop ends*/
-            for (i2 = howmany_rank - 2; i2 >= 0; i2--)
-            {
-                if ((i1 % dims1[i2]) == 0)
-                {
-                    /*loop on dimension i2 ends, compute jump on the first plan entry index*/
-                    i += howmany_dims[i2 + 1].is - incr1[i2];
-                    break;
-                }
-            }
-        }
-        /* free temporary arrays */
-        FREE(dims1);
-        FREE(incr1);
-        /* reset initial value of gdim for post treatment*/
-        gdim.howmany_rank = howmany_rank;
-        gdim.howmany_dims = howmany_dims;
-
-    }
-
-    /* normalization */
-    if (iopt == 0)
-    {
-        if (isn == -1)
-        {
-            C2F(dscal)(&lA, &half, Ar, &one);
-            if (!isrealA)
-            {
-                C2F(dscal)(&lA, &half, Ai, &one);
-            }
-        }
-        else
-        {
-            if (dst_scale_array(Ar, Ai, gdim, isn) == -1)
-            {
-                Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-                return 0;
-            }
-        }
-    }
-    return 1;
-}
diff --git a/scilab/modules/fftw/sci_gateway/c/sci_fftw.c b/scilab/modules/fftw/sci_gateway/c/sci_fftw.c
deleted file mode 100644 (file)
index 75cf86e..0000000
+++ /dev/null
@@ -1,1310 +0,0 @@
-/*
-* Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-* Copyright (C) 2006/2007 - INRIA - Alan LAYEC
-* Copyright (C) 2007 - INRIA - Allan CORNET
-* Copyright (C) 2012 - DIGITEO - Allan CORNET
-* Copyright (C) 2012 - INRIA - Serge STEER
-* Copyright (C) 2012 - Scilab Enterprises - Cedric Delamarre
-*
-* This file must be used under the terms of the CeCILL.
-* This source file is licensed as described in the file COPYING, which
-* you should have received as part of this distribution.  The terms
-* are also available at
-* http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
-*
-*/
-/*--------------------------------------------------------------------------*/
-#include "fftw_utilities.h"
-#include "sci_data_utilities.h"
-#include "callfftw.h"
-#include "sci_malloc.h"
-#include "gw_fftw.h"
-#include "api_scilab.h"
-#include "localization.h"
-#include "Scierror.h"
-#include "BOOL.h"
-#include "elem_common.h" // dset, dcopy, dscal
-/*--------------------------------------------------------------------------*/
-enum Scaling
-{
-    Divide = -1,
-    None = 0,
-    Multiply = 1,
-};
-/*--------------------------------------------------------------------------*/
-static int sci_fft_gen(void* _pvCtx, char *fname, int ndimsA, int *dimsA, double *Ar,  double *Ai, int isn, int iopt, guru_dim_struct gdim);
-static int sci_fft_2args(void* _pvCtx, char *fname, int ndimsA, int *dimsA, double *Ar,  double *Ai, int isn, int iopt);
-static int sci_fft_3args(void* _pvCtx, char *fname, int ndimsA, int *dimsA, double *Ar,  double *Ai, int isn, int iopt);
-static int sci_fft_4args(void* _pvCtx, char *fname, int ndimsA, int *dimsA, double *Ar,  double *Ai, int isn, int iopt);
-/*--------------------------------------------------------------------------*/
-
-int WITHMKL = 0;
-/* fftw function.
-*
-* Scilab Calling sequence :
-*   fftw(A [,option])
-*   fftw(A,sign [,option])
-*   fftw(A,sel,sign [,option])
-*   fftw(A,sign,dim,incr [,option])
-*
-* Input : A : a scilab double complex or real vector, matrix or hypermatrix
-*
-*         sign : a scilab double or integer scalar (-1 or 1): the sign
-*                  in the exponential component
-*
-*         sel : a scilab double or integer vector, the selection of dimensions
-
-*         dim : a scilab double or integer vector: the dimensions
-*                  of the Fast Fourier Transform to perform
-*
-*         incr : a scilab double or integer vector: the increments
-*                  of the Fast Fourier Transform to perform
-*
-* Output : a scilab double complex or real array with same shape as A that
-*          gives the result of the transform.
-*
-*/
-int sci_fftw(char *fname, void* pvApiCtx)
-{
-    SciErr sciErr;
-    int *piAddr = NULL;
-    char *option = NULL;
-    int iopt = 0; /* automatic r2c or c2r transform use decision */
-    int rhs = Rhs;
-    int iTypeOne = 0;
-
-    int ndimsA = 0;
-    int *dimsA = NULL;
-    double *Ar = NULL, *Ai = NULL;
-
-    int isn = FFTW_FORWARD;
-    WITHMKL = withMKL();
-    /****************************************
-    * Basic constraints on rhs arguments  *
-    ****************************************/
-
-    /* check min/max lhs/rhs arguments of scilab function */
-    CheckInputArgument(pvApiCtx, 1, 5);
-    CheckOutputArgument(pvApiCtx, 1, 1);
-
-    sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr);
-    if (sciErr.iErr)
-    {
-        printError(&sciErr, 0);
-        Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
-        return 1;
-    }
-
-    sciErr = getVarType(pvApiCtx, piAddr, &iTypeOne);
-    if (sciErr.iErr)
-    {
-        printError(&sciErr, 0);
-        Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
-        return 1;
-    }
-
-    if ((iTypeOne == sci_list) || (iTypeOne == sci_tlist))
-    {
-        OverLoad(1);
-        return 1;
-    }
-
-    if (iTypeOne == sci_mlist)
-    {
-        /* We allow overload for not hypermatrix type */
-        if (!isHyperMatrixMlist(pvApiCtx, piAddr))
-        {
-            OverLoad(1);
-            return 1;
-        }
-    }
-
-    /* checking if last argument is a potential option argument (character string) */
-    sciErr = getVarAddressFromPosition(pvApiCtx, Rhs, &piAddr);
-    if (sciErr.iErr)
-    {
-        printError(&sciErr, 0);
-        Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, Rhs);
-        return 1;
-    }
-
-    if (isStringType(pvApiCtx, piAddr))   /*  fftw(...,option); */
-    {
-        if (isScalar(pvApiCtx, piAddr))
-        {
-            if (getAllocatedSingleString(pvApiCtx, piAddr, &option) == 0)
-            {
-                if (strcmp("symmetric", option) == 0)
-                {
-                    iopt = 1;    /*user assumes symmetry */
-                }
-                else if (strcmp("nonsymmetric", option) == 0)
-                {
-                    iopt = 2;    /*user claims full transform */
-                }
-                else
-                {
-                    Scierror(999, _("%s: Wrong value for input argument #%d: '%s' or '%s' expected.\n"), fname, Rhs, "\"symmetric\"", "\"nonsymmetric\"");
-                    freeAllocatedSingleString(option);
-                    option = NULL;
-                    return 1;
-                }
-                freeAllocatedSingleString(option);
-                option = NULL;
-                rhs = Rhs - 1;
-            }
-            else
-            {
-                Scierror(999, _("%s: Wrong value for input argument #%d: '%s' or '%s' expected.\n"), fname, Rhs, "\"symmetric\"", "\"nonsymmetric\"");
-                return 1;
-            }
-        }
-    }
-
-
-    /********************  Checking if isn is given  ************************************************/
-    if (rhs == 1)  /*only one rhs argument: forward fft*/
-    {
-        isn = FFTW_FORWARD; /* default value */
-    }
-    else   /*get isn out of second argument*/
-    {
-        sciErr = getScalarIntArg(pvApiCtx, 2, fname, &isn);
-        if (sciErr.iErr)
-        {
-            Scierror(sciErr.iErr, getErrorMessage(sciErr));
-            return 1;
-        }
-        /* check value of second rhs argument */
-        if ((isn !=  FFTW_FORWARD) && (isn !=  FFTW_BACKWARD))
-        {
-            Scierror(53, _("%s: Wrong value for input argument #%d: %d or %d expected.\n"), fname, 2, FFTW_FORWARD, FFTW_BACKWARD);
-            return 1;
-        }
-    }
-
-    /********************  getting the array A      ************************************************/
-    getVarAddressFromPosition(pvApiCtx, 1, &piAddr);
-    if (!getArrayOfDouble(pvApiCtx, piAddr, &ndimsA, &dimsA, &Ar, &Ai))
-    {
-        Scierror(999, _("%s: Wrong type for argument #%d: Array of floating point numbers expected.\n"), fname, 1);
-        return 1;
-    }
-
-
-    /********************  Select proper method     ************************************************/
-    if (rhs < 3)
-    {
-        /* fftw(A ,sign [,option])*/
-        sci_fft_2args(pvApiCtx, fname, ndimsA, dimsA, Ar, Ai, isn, iopt);
-    }
-    else if (rhs == 3)
-    {
-        /* fftw(A ,sign ,sel [,option])*/
-        sci_fft_3args(pvApiCtx, fname, ndimsA, dimsA, Ar, Ai, isn, iopt);
-    }
-    else if (rhs == 4)
-    {
-        /* fftw(A ,sign ,dim,incr [option])*/
-        sci_fft_4args(pvApiCtx, fname, ndimsA, dimsA, Ar, Ai, isn, iopt);
-    }
-
-    return 0;
-}
-
-int sci_fft_2args(void* _pvCtx, char *fname, int ndimsA, int *dimsA, double *Ar,  double *Ai, int isn, int iopt)
-{
-    /*FFTW specific library variable */
-    guru_dim_struct gdim = {0, NULL, 0, NULL};
-
-    /* local variable */
-    int ndims = 0; /* number of non singleton dimensions */
-    int first_nonsingleton = -1;
-    int i = 0, j = 0;
-    int prd = 1;
-
-    /* ignore singleton dimensions */
-    first_nonsingleton = -1;
-    ndims = 0;
-    for (i = 0; i < ndimsA; i++)
-    {
-        if (dimsA[i] > 1)
-        {
-            ndims++;
-            if (first_nonsingleton < 0)
-            {
-                first_nonsingleton = i;
-            }
-        }
-    }
-
-    /* void or scalar input gives void output or scalar*/
-    if (ndims == 0 )
-    {
-        AssignOutputVariable(_pvCtx, 1) =  1;
-        ReturnArguments(_pvCtx);
-        return 0;
-    }
-
-    gdim.rank = ndims;
-    if ((gdim.dims = (fftw_iodim *)MALLOC(sizeof(fftw_iodim) * gdim.rank)) == NULL)
-    {
-        Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-
-    j = 0;
-    prd = 1;
-    for (i = (first_nonsingleton); i < ndimsA; i++)
-    {
-        if (dimsA[i] > 1)
-        {
-            gdim.dims[j].n = dimsA[i];
-            gdim.dims[j].is = prd;
-            gdim.dims[j].os = prd;
-            prd *= dimsA[i];
-            j++;
-        }
-    }
-    gdim.howmany_rank = 0;
-    gdim.howmany_dims = NULL;
-
-
-    if (!sci_fft_gen(_pvCtx, fname, ndimsA, dimsA,  Ar,  Ai, isn, iopt, gdim))
-    {
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-
-    /***********************************
-    * Return results in lhs argument *
-    ***********************************/
-
-    ReturnArguments(_pvCtx);
-
-    FREE(gdim.dims);
-    FREE(gdim.howmany_dims);
-    return 0;
-}
-
-
-int  sci_fft_3args(void* _pvCtx, char *fname, int ndimsA, int *dimsA, double *Ar,  double *Ai, int isn, int iopt)
-{
-    /* API variables */
-    SciErr sciErr;
-    int *piAddr = NULL;
-
-    int *Sel = NULL;
-    int rank = 0;
-
-    /*FFTW specific library variable */
-    guru_dim_struct gdim = {0, NULL, 0, NULL};
-    /* local variable */
-    int ndims = 0;
-    int first_nonsingleton = -1;
-    int ih = 0;
-    int pd = 1; /* used to store prod(Dims(1:sel(k-1)))*/
-    int pds = 1; /* used to store prod(Dims(sel(k-1):sel(k)))*/
-    int i = 0, j = 0;
-
-    /* ignore singleton dimensions */
-    first_nonsingleton = -1;
-    ndims = 0;
-    for (i = 0; i < ndimsA; i++)
-    {
-        if (dimsA[i] > 1)
-        {
-            ndims++;
-            if (first_nonsingleton < 0)
-            {
-                first_nonsingleton = i;
-            }
-        }
-    }
-
-    /* void or scalar input gives void output or scalar*/
-    if (ndims == 0 )
-    {
-        AssignOutputVariable(_pvCtx, 1) =  1;
-        ReturnArguments(_pvCtx);
-        return 0;
-    }
-
-
-    /******************** get and check third argument (sel) ****************************************/
-    getVarAddressFromPosition(_pvCtx, 3, &piAddr);
-    if (isVarMatrixType(_pvCtx, piAddr) == 0)
-    {
-        Scierror(999, _("%s: Wrong type for input argument #%d.\n"), fname, 3);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-    sciErr = getVectorIntArg(_pvCtx, 3, fname, &rank, &Sel);
-    if (sciErr.iErr)
-    {
-        Scierror(sciErr.iErr, getErrorMessage(sciErr));
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-    /* size of Sel must be less than ndimsA */
-    if (rank <= 0 || rank >= ndimsA)
-    {
-        Scierror(999, _("%s: Wrong size for input argument #%d: Must be between %d and %d.\n"), fname, 3, 1, ndimsA - 1);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-    /* check values of Sel[i] */
-    for (i = 0; i < rank; i++)
-    {
-        if (Sel[i] <= 0)
-        {
-            Scierror(999, _("%s: Wrong values for input argument #%d: Positive integers expected.\n"), fname, 3);
-            FREE(gdim.dims);
-            FREE(gdim.howmany_dims);
-            return 0;
-        }
-        if (Sel[i] > ndimsA)
-        {
-            Scierror(999, _("%s: Wrong values for input argument #%d: Elements must be less than %d.\n"), fname, 3, ndimsA);
-            FREE(gdim.dims);
-            FREE(gdim.howmany_dims);
-            return 0;
-        }
-        if (i > 0 && Sel[i] <= Sel[i - 1])
-        {
-            Scierror(999, _("%s: Wrong values for input argument #%d: Elements must be in increasing order.\n"), fname, 3);
-            FREE(gdim.dims);
-            FREE(gdim.howmany_dims);
-            return 0;
-        }
-    }
-
-    /* Create  gdim struct */
-    gdim.rank = rank;
-    if ((gdim.dims = (fftw_iodim *)MALLOC(sizeof(fftw_iodim) * gdim.rank)) == NULL)
-    {
-        Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-
-    pd = 1; /* used to store prod(Dims(1:sel(k-1)))*/
-    pds = 1; /* used to store prod(Dims(sel(k-1):sel(k)))*/
-    j = 0;
-    for (i = 0; i < ndimsA; i++)
-    {
-        if (j >= gdim.rank)
-        {
-            break;
-        }
-        if (Sel[j] == i + 1)
-        {
-            gdim.dims[j].n = dimsA[i];
-            gdim.dims[j].is = pd;
-            gdim.dims[j].os = pd;
-            j++;
-        }
-        pd *= dimsA[i];
-    }
-    /* Compute howmany_rank based on jumps in the Sel sequence */
-    gdim.howmany_rank = 0;
-    if ((Sel[0] != 1) && (Sel[0] != ndimsA))
-    {
-        gdim.howmany_rank++;
-    }
-
-    for (i = 1; i <= rank - 1; i++)
-    {
-        if (Sel[i] != Sel[i - 1] + 1)
-        {
-            /*check if all dimensions between Sel[i-1]+1 and Sel[i]-1 are
-              equal to one, in this case they can be ignored and there is
-              no jump*/
-            for (j = Sel[i - 1] + 1; j <= Sel[i] - 1; j++)
-            {
-                if (dimsA[j - 1] != 1)
-                {
-                    gdim.howmany_rank++;
-                    break;
-                }
-            }
-        }
-    }
-
-    if ((Sel[rank - 1] != ndimsA) || (rank == 1))
-    {
-        gdim.howmany_rank++;
-    }
-
-    /* Fill the howmany_dims struct */
-    if (gdim.howmany_rank > 0)
-    {
-        /* it must be the case */
-        if ((gdim.howmany_dims = (fftw_iodim *)MALLOC(gdim.howmany_rank * sizeof(fftw_iodim))) == NULL)
-        {
-            Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-            FREE(gdim.dims);
-            FREE(gdim.howmany_dims);
-            return 0;
-        }
-        pd = 1;
-        for (j = 1; j <= (Sel[0] - 1); j++)
-        {
-            pd *= dimsA[j - 1];    /*prod(Dims(1:(sel(1)-1)))*/
-        }
-        ih = 0;
-        if ((Sel[0] != 1) && (Sel[0] != ndimsA))
-        {
-            /* First seleted dimension */
-            gdim.howmany_dims[ih].is = 1;
-            gdim.howmany_dims[ih].os = 1;
-            gdim.howmany_dims[ih].n = pd;
-            ih++;
-        }
-        pd *= dimsA[Sel[0] - 1]; /*prod(Dims(1:sel(1)))*/
-        for (i = 1; i <= rank - 1; i++)
-        {
-            /* intermediate selected dimensions */
-            if (Sel[i] != Sel[i - 1] + 1)
-            {
-                pds = 1;
-                for (j = (Sel[i - 1] + 1); j <= (Sel[i] - 1); j++)
-                {
-                    pds *= dimsA[j - 1];    /*prod(Dims(sel(i-1)+1:(sel(i)-1)))*/
-                }
-                /*check again if all dimensions between Sel[i-1]+1 and
-                  Sel[i]-1 are equal to one, in this case they can be
-                  ignored and there is no jump*/
-                for (j = (Sel[i - 1] + 1); j <= (Sel[i] - 1); j++)
-                {
-                    if (dimsA[j - 1] != 1)
-                    {
-                        gdim.howmany_dims[ih].is = pd;
-                        gdim.howmany_dims[ih].os = pd;
-                        gdim.howmany_dims[ih].n = pds;
-                        ih++;
-                        break;
-                    }
-                }
-            }
-            pd *= pds * dimsA[Sel[i] - 1]; /*prod(Dims(1:sel(i)))*/
-        }
-
-        if (Sel[rank - 1] != ndimsA)
-        {
-            /* last selected dimension*/
-            pds = 1;
-            for (j = (Sel[rank - 1] + 1); j <= ndimsA; j++)
-            {
-                pds *= dimsA[j - 1];    /*prod(Dims(sel(i-1)+1:(sel(i)-1)))*/
-            }
-            gdim.howmany_dims[ih].is = pd;
-            gdim.howmany_dims[ih].os = pd;
-            gdim.howmany_dims[ih].n = pds;
-            ih++;
-        }
-        else if (rank == 1)
-        {
-            /* the only selected dimension is the last one */
-            gdim.howmany_dims[ih].is = 1;
-            gdim.howmany_dims[ih].os = 1;
-            gdim.howmany_dims[ih].n = pd / dimsA[Sel[0] - 1];
-            ih++;
-        }
-    }
-
-    if (!sci_fft_gen(_pvCtx, fname, ndimsA, dimsA, Ar,  Ai, isn, iopt, gdim))
-    {
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-
-    /***********************************
-    * Return results in lhs argument *
-    ***********************************/
-
-    ReturnArguments(_pvCtx);
-
-    FREE(gdim.dims);
-    FREE(gdim.howmany_dims);
-    return 0;
-}
-
-int sci_fft_4args(void* _pvCtx, char *fname, int ndimsA, int *dimsA, double *Ar,  double *Ai, int isn, int iopt)
-{
-    /* API variables */
-    SciErr sciErr;
-    int *piAddr = NULL;
-
-    /* Input  array variables */
-    int *Dim1 = NULL;
-    int ndims = 0;
-    int *Incr = NULL;
-    int nincr = 0;
-
-    /*FFTW specific library variable */
-    guru_dim_struct gdim = {0, NULL, 0, NULL};
-    /* input/output address for transform variables */
-
-    /* local variable */
-    int *Dim = NULL, *Sel = NULL;
-    int pd = 1;
-    int pds = 1;
-    int nd = 0;
-    int rank = 0;
-    int i = 0, j = 0, k = 0, lA = 1;
-
-    for (i = 0; i < ndimsA; i++)
-    {
-        lA *= dimsA[i];
-    }
-
-    /* void or scalar input gives void output or scalar*/
-    if (lA <= 1 )
-    {
-        AssignOutputVariable(_pvCtx, 1) =  1;
-        ReturnArguments(_pvCtx);
-        return 0;
-    }
-
-    /******************** get and check third argument (dim) ****************************************/
-    getVarAddressFromPosition(_pvCtx, 3, &piAddr);
-    if (isVarMatrixType(_pvCtx, piAddr) == 0)
-    {
-        Scierror(999, _("%s: Wrong type for input argument #%d.\n"), fname, 3);
-        FREE(Dim1);
-        FREE(Incr);
-        FREE(Dim);
-        FREE(Sel);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-    sciErr = getVectorIntArg(_pvCtx, 3, fname, &ndims, &Dim1);
-    if (sciErr.iErr)
-    {
-        Scierror(sciErr.iErr, getErrorMessage(sciErr));
-        FREE(Dim1);
-        FREE(Incr);
-        FREE(Dim);
-        FREE(Sel);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-    /* check values of Dim1[i] */
-    pd = 1;
-    for (i = 0; i < ndims; i++)
-    {
-        if (Dim1[i] <= 1)
-        {
-            Scierror(999, _("%s: Wrong values for input argument #%d: Elements must be greater than %d.\n"), fname, 3, 1);
-            FREE(Dim1);
-            FREE(Incr);
-            FREE(Dim);
-            FREE(Sel);
-            FREE(gdim.dims);
-            FREE(gdim.howmany_dims);
-            return 0;
-        }
-        pd *= Dim1[i];
-    }
-    if ( pd > lA)
-    {
-        Scierror(999, _("%s: Wrong values for input argument #%d: Must be less than %d.\n"), fname, 3, lA);
-        FREE(Dim1);
-        FREE(Incr);
-        FREE(Dim);
-        FREE(Sel);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-    if (lA % pd)
-    {
-        Scierror(999, _("%s: Wrong values for input argument #%d: Must be a divisor of %d.\n"), fname, 3, lA);
-        FREE(Dim1);
-        FREE(Incr);
-        FREE(Dim);
-        FREE(Sel);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-    /******************** get and check fourth argument (incr) ****************************************/
-    sciErr = getVectorIntArg(_pvCtx, 4, fname, &nincr, &Incr);
-    if (sciErr.iErr)
-    {
-        Scierror(sciErr.iErr, getErrorMessage(sciErr));
-        FREE(Dim1);
-        FREE(Incr);
-        FREE(Dim);
-        FREE(Sel);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-    if (nincr != ndims)
-    {
-        Scierror(999, _("%s: Incompatible input arguments #%d and #%d: Same sizes expected.\n"), fname, 3, 4);
-        FREE(Dim1);
-        FREE(Incr);
-        FREE(Dim);
-        FREE(Sel);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-
-    /* check values of Incr[i] */
-    if (Incr[0] <= 0)
-    {
-        Scierror(999, _("%s: Wrong values for input argument #%d: Positive integers expected.\n"), fname, 4);
-        FREE(Dim1);
-        FREE(Incr);
-        FREE(Dim);
-        FREE(Sel);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-    for (i = 0; i < ndims; i++)
-    {
-        if (lA % Incr[i])
-        {
-            Scierror(999, _("%s: Wrong values for input argument #%d: Elements must be divisors of %d.\n"), fname, 3, lA);
-            FREE(Dim1);
-            FREE(Incr);
-            FREE(Dim);
-            FREE(Sel);
-            FREE(gdim.dims);
-            FREE(gdim.howmany_dims);
-            return 0;
-        }
-        if (i > 0 && (Incr[i] <= Incr[i - 1]))
-        {
-            Scierror(999, _("%s: Wrong values for input argument #%d: Elements must be in increasing ""order.\n"), fname, 4);
-            FREE(Dim1);
-            FREE(Incr);
-            FREE(Dim);
-            FREE(Sel);
-            FREE(gdim.dims);
-            FREE(gdim.howmany_dims);
-            return 0;
-        }
-    }
-    if ((Dim = (int *)MALLOC((2 * ndims + 1) * sizeof(int))) == NULL)
-    {
-        Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-        FREE(Dim1);
-        FREE(Incr);
-        FREE(Dim);
-        FREE(Sel);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-    if ((Sel = (int *)MALLOC((ndims) * sizeof(int))) == NULL)
-    {
-        Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-        FREE(Dim1);
-        FREE(Incr);
-        FREE(Dim);
-        FREE(Sel);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-
-
-    /*Transform  Dim1 and Incr into Dim and Sel and check validity*/
-
-    nd = 0;
-    pd = 1;
-    if (Incr[0] != 1)
-    {
-        Dim[nd++] = Incr[0];
-        pd *= Incr[0];
-    }
-    Dim[nd++] = Dim1[0];
-    pd *= Dim1[0];
-    Sel[0] = nd;
-
-    for (k = 1; k < ndims; k++)
-    {
-        if (Incr[k] % pd != 0)
-        {
-            Scierror(999, _("%s: Incompatible input arguments #%d and #%d.\n"), fname, 3, 4);
-            FREE(Dim1);
-            FREE(Incr);
-            FREE(Dim);
-            FREE(Sel);
-            FREE(gdim.dims);
-            FREE(gdim.howmany_dims);
-            return 0;
-        }
-        if (Incr[k] != pd)
-        {
-            Dim[nd++] = (int)(Incr[k] / pd);
-            pd = Incr[k];
-        }
-        Dim[nd++] = Dim1[k];
-        pd *= Dim1[k];
-        Sel[k] = nd;
-    }
-    if (pd < lA)
-    {
-        if (lA % pd != 0)
-        {
-            Scierror(999, _("%s: Incompatible input arguments #%d and #%d.\n"), fname, 3, 4);
-            FREE(Dim1);
-            FREE(Incr);
-            FREE(Dim);
-            FREE(Sel);
-            FREE(gdim.dims);
-            FREE(gdim.howmany_dims);
-            return 0;
-        }
-        Dim[nd++] = (int)(lA / pd);
-    }
-
-    rank = ndims;
-    ndims = nd;
-
-    /* now one  same algorithm than sci_fft_3args applies */
-    /* Create  gdim struct */
-    gdim.rank = rank;
-    if ((gdim.dims = (fftw_iodim *)MALLOC(sizeof(fftw_iodim) * gdim.rank)) == NULL)
-    {
-        Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-        FREE(Dim1);
-        FREE(Incr);
-        FREE(Dim);
-        FREE(Sel);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-
-    pd = 1; /* used to store prod(Dims(1:sel(k-1)))*/
-    pds = 1; /* used to store prod(Dims(sel(k-1):sel(k)))*/
-    j = 0;
-    for (i = 0; i < ndims; i++)
-    {
-        if (j >= gdim.rank)
-        {
-            break;
-        }
-        if (Sel[j] == i + 1)
-        {
-            gdim.dims[j].n = Dim[i];
-            gdim.dims[j].is = pd;
-            gdim.dims[j].os = pd;
-            j++;
-        }
-        pd *= Dim[i];
-    }
-    /* Compute howmany_rank based on jumps in the Sel sequence */
-    gdim.howmany_rank = 0;
-    if ((Sel[0] != 1) && (Sel[0] != ndims))
-    {
-        gdim.howmany_rank++;
-    }
-
-    for (i = 1; i <= rank - 1; i++)
-    {
-        if (Sel[i] != Sel[i - 1] + 1)
-        {
-            gdim.howmany_rank++;
-        }
-    }
-    if ((Sel[rank - 1] != ndims) || (rank == 1))
-    {
-        gdim.howmany_rank++;
-    }
-    /* Fill the howmany_dims struct */
-    if (gdim.howmany_rank > 0)
-    {
-        /* it must be the case */
-        int ih = 0;
-
-        if ((gdim.howmany_dims = (fftw_iodim *)MALLOC(gdim.howmany_rank * sizeof(fftw_iodim))) == NULL)
-        {
-            Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-            FREE(Dim1);
-            FREE(Incr);
-            FREE(Dim);
-            FREE(Sel);
-            FREE(gdim.dims);
-            FREE(gdim.howmany_dims);
-            return 0;
-        }
-        pd = 1;
-        for (j = 1; j <= (Sel[0] - 1); j++)
-        {
-            pd *= Dim[j - 1];    /*prod(Dims(1:(sel(1)-1)))*/
-        }
-        ih = 0;
-        if ((Sel[0] != 1) && (Sel[0] != ndims))
-        {
-            /* First seleted dimension */
-            gdim.howmany_dims[ih].is = 1;
-            gdim.howmany_dims[ih].os = 1;
-            gdim.howmany_dims[ih].n = pd;
-            ih++;
-        }
-        pd *= Dim[Sel[0] - 1]; /*prod(Dims(1:sel(1)))*/
-        for (i = 2; i <= rank; i++)
-        {
-            /* intermediate selected dimensions */
-            if (Sel[i - 1] != Sel[i - 2] + 1)
-            {
-                pds = 1;
-                for (j = (Sel[i - 2] + 1); j <= (Sel[i - 1] - 1); j++)
-                {
-                    pds *= Dim[j - 1];    /*prod(Dims(sel(i-1)+1:(sel(i)-1)))*/
-                }
-                gdim.howmany_dims[ih].is = pd;
-                gdim.howmany_dims[ih].os = pd;
-                gdim.howmany_dims[ih].n = pds;
-                ih++;
-            }
-            pd *= pds * Dim[Sel[i - 1] - 1]; /*prod(Dims(1:sel(i)))*/
-        }
-
-        if (Sel[rank - 1] != ndims)
-        {
-            /* last selected dimension*/
-            pds = 1;
-            for (j = (Sel[rank - 1] + 1); j <= ndims; j++)
-            {
-                pds *= Dim[j - 1];    /*prod(Dims(sel(i-1)+1:(sel(i)-1)))*/
-            }
-            gdim.howmany_dims[ih].is = pd;
-            gdim.howmany_dims[ih].os = pd;
-            gdim.howmany_dims[ih].n = pds;
-            ih++;
-        }
-        else if (rank == 1) /* the only selected dimension is the last one */
-        {
-            gdim.howmany_dims[ih].is = 1;
-            gdim.howmany_dims[ih].os = 1;
-            gdim.howmany_dims[ih].n = pd / Dim[Sel[0] - 1];
-            ih++;
-        }
-    }
-    if (!sci_fft_gen(_pvCtx, fname, ndimsA, dimsA, Ar,  Ai, isn, iopt, gdim))
-    {
-        FREE(Dim1);
-        FREE(Incr);
-        FREE(Dim);
-        FREE(Sel);
-        FREE(gdim.dims);
-        FREE(gdim.howmany_dims);
-        return 0;
-    }
-
-    /***********************************
-    * Return results in lhs argument *
-    ***********************************/
-
-    FREE(Dim1);
-    FREE(Incr);
-    FREE(Dim);
-    FREE(Sel);
-    FREE(gdim.dims);
-    FREE(gdim.howmany_dims);
-
-    ReturnArguments(_pvCtx);
-
-    return 0;
-}
-/*--------------------------------------------------------------------------*/
-int sci_fft_gen(void* _pvCtx, char *fname, int ndimsA, int *dimsA, double *Ar,  double *Ai, int isn, int iopt, guru_dim_struct gdim)
-{
-    /* API variables */
-    SciErr sciErr;
-
-    /* Input  array variables */
-    int  isrealA = (Ai == NULL), issymA = 1, lA = 1;
-    /*for MKL*/
-    int isrealA_save = isrealA ;
-
-    /*FFTW specific library variable */
-    enum Scaling scale = None;
-    enum Plan_Type type;
-    fftw_plan p;
-
-    /* input/output address for transform variables */
-    double *ri = NULL, *ii = NULL, *ro = NULL, *io = NULL;
-
-    /* for MKL special cases */
-    int * dims1 = NULL;
-    int * incr1 = NULL;
-
-    /* local variable */
-    int one = 1;
-    int i = 0;
-    int errflag = 0;
-
-
-    for (i = 0; i < ndimsA; i++)
-    {
-        lA *= dimsA[i];
-    }
-
-
-    if (iopt == 0)
-    {
-        /* automatically selected algorithm*/
-        issymA =  check_array_symmetry(Ar, Ai, gdim);
-        if (issymA < 0 )
-        {
-            Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-            return 0;
-        }
-    }
-
-    else if (iopt == 1)
-    {
-        issymA = 1; /* user forces symmetry */
-    }
-    else
-    {
-        issymA = 0;
-    }
-
-    AssignOutputVariable(_pvCtx, 1) =  1;/* assume inplace transform*/
-
-    if (WITHMKL)
-    {
-        double dzero = 0.0;
-        if (isrealA)
-        {
-            /*MKL does not implement the r2c nor r2r guru split methods, make A complex */
-            if (issymA)
-            {
-                /* result will be real, the imaginary part of A can be allocated alone */
-                sciErr = allocMatrixOfDouble(_pvCtx, *getNbInputArgument(_pvCtx) + 1, 1, lA, &Ai);
-                if (sciErr.iErr)
-                {
-                    Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-                    return 0;
-                }
-                C2F(dset)(&lA, &dzero, Ai, &one);
-            }
-            else
-            {
-                /* result will be complex, realloc A for inplace computation */
-                sciErr = allocComplexArrayOfDouble(_pvCtx, *getNbInputArgument(_pvCtx) + 1, ndimsA, dimsA, &ri, &Ai);
-                if (sciErr.iErr)
-                {
-                    Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-                    return 0;
-                }
-                C2F(dcopy)(&lA, Ar, &one, ri, &one);
-                Ar = ri;
-                C2F(dset)(&lA, &dzero, Ai, &one);
-                AssignOutputVariable(_pvCtx, 1) =  nbInputArgument(_pvCtx) + 1;
-                isrealA = 0;
-            }
-        }
-    }
-
-    if (!isrealA && issymA) /* A is complex but result is real */
-    {
-        /* result will be complex, realloc real part of A for real part inplace computation */
-        sciErr = allocArrayOfDouble(_pvCtx, *getNbInputArgument(_pvCtx) + 1, ndimsA, dimsA, &ri);
-        if (sciErr.iErr)
-        {
-            Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-            return 0;
-        }
-        C2F(dcopy)(&lA, Ar, &one, ri, &one);
-        Ar = ri;
-        AssignOutputVariable(_pvCtx, 1) = nbInputArgument(_pvCtx) + 1;
-    }
-
-    /* Set pointers on real and imaginary part of the input */
-    ri = Ar;
-    ii = Ai;
-
-    scale = None; /*no scaling needed */
-    if (isn == FFTW_BACKWARD)
-    {
-        scale = Divide;
-    }
-    if (isrealA & !WITHMKL) /* To have type = C2C_PLAN*/
-    {
-        /*A is real */
-        if (issymA)
-        {
-            /*r2r =  isrealA &&  issymA*/
-            /* there is no general plan able to compute r2r transform so it is tranformed into
-            a R2c plan. The computed imaginary part will be zero*/
-            sciErr = allocMatrixOfDouble(_pvCtx, *getNbInputArgument(_pvCtx) + 1, 1, lA,  &io);
-            if (sciErr.iErr)
-            {
-                Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-                return 0;
-            }
-            type = R2C_PLAN;
-            ro = Ar;
-        }
-        else
-        {
-            /*r2c =  isrealA && ~issymA;*/
-            /* transform cannot be done in place */
-            sciErr = allocComplexArrayOfDouble(_pvCtx, *getNbInputArgument(_pvCtx) + 1, ndimsA, dimsA, &ro, &io);
-            if (sciErr.iErr)
-            {
-                Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-                return 0;
-            }
-            AssignOutputVariable(_pvCtx, 1) = nbInputArgument(_pvCtx) + 1;
-            type = R2C_PLAN; /* fftw_plan_guru_split_dft_r2c plans for an FFTW_FORWARD transform*/
-            if (isn == FFTW_BACKWARD)
-            {
-                /*transform problem into a FORWARD fft*/
-                /*ifft(A)=conj(fft(A/N)) cas vect*/
-                /* pre traitement A must be  divided by N cas vect*/
-                /* post treatment result must conjugated */
-            }
-        }
-    }
-    else
-    {
-        /* A is complex */
-        if (!WITHMKL && issymA) /*result is real*/
-        {
-            /*c2r =  ~isrealA &&  issymA*/
-            ro = ri;
-            io = NULL;
-
-            type = C2R_PLAN; /*fftw_plan_guru_split_dft_c2r plans for an FFTW_BACKWARD transform*/
-            if (isn == FFTW_FORWARD)
-            {
-                /*transform problem into a BACKWARD fft : fft(A)=ifft(conj(A))*/
-                double minusone = -1.0;
-                C2F(dscal)(&lA, &minusone, ii, &one);
-            }
-        }
-        else
-        {
-            /*c2c =  ~isrealA && ~issymA;*/
-            /* use inplace transform*/
-            isrealA = 0;
-            type = C2C_PLAN; /*  fftw_plan_guru_split_dft plans for an FFTW_FORWARD transform*/
-            if (isn == FFTW_BACKWARD)
-            {
-                /*transform problem into a FORWARD fft*/
-                /* ifft(A) = %i*conj(fft(%i*conj(A)/N) */
-                /* reverse input */
-                ri = Ai;
-                ii = Ar;
-                /* reverse output */
-                ro = Ai;
-                io = Ar;
-            }
-            else
-            {
-                ro = ri;
-                io = ii;
-            }
-        }
-    }
-
-    /* pre-treatment */
-    if (scale != None)
-    {
-        double ak = 1.0;
-        for (i = 0; i < gdim.rank; i++)
-        {
-            ak = ak * ((double)(gdim.dims[i].n));
-        }
-        if (scale == Divide)
-        {
-            ak = 1.0 / ak;
-        }
-        C2F(dscal)(&lA, &ak, ri, &one);
-        if (isrealA == 0)
-        {
-            C2F(dscal)(&lA, &ak, ii, &one);
-        }
-    }
-
-    if (!WITHMKL || gdim.howmany_rank <= 1)
-    {
-        /* Set Plan */
-        p = GetFFTWPlan(type, &gdim, ri, ii, ro, io, getCurrentFftwFlags(), isn , (fftw_r2r_kind *)NULL, &errflag);
-        if (errflag == 1)
-        {
-            Scierror(999, _("%s: No more memory.\n"), fname);
-            return 0;
-        }
-        else if (errflag == 2)
-        {
-            Scierror(999, _("%s: Creation of requested fftw plan failed.\n"), fname);
-            return 0;
-        }
-        /* execute FFTW plan */
-        ExecuteFFTWPlan(type, p, ri, ii, ro, io);
-    }
-    else
-    {
-        /*FFTW MKL does not implement yet guru plan with howmany_rank>1             */
-        /*   associated loops described in gdim.howmany_rank and  gdim.howmany_dims */
-        /*   are implemented here by a set of call with howmany_rank==1             */
-        fftw_iodim *howmany_dims = gdim.howmany_dims;
-        int howmany_rank = gdim.howmany_rank;
-        int i1 = 0, i2 = 0;
-        int nloop = 0;
-        int t = 0;
-
-
-        gdim.howmany_rank = 0;
-        gdim.howmany_dims = NULL;
-
-        p = GetFFTWPlan(type, &gdim, ri, ii, ro, io, getCurrentFftwFlags(), isn , (fftw_r2r_kind *)NULL, &errflag);
-        if (errflag == 1)
-        {
-            Scierror(999, _("%s: No more memory.\n"), fname);
-            FREE(dims1);
-            FREE(incr1);
-            return 0;
-        }
-        else if (errflag == 2)
-        {
-            Scierror(999, _("%s: Creation of requested fftw plan failed.\n"), fname);
-            FREE(dims1);
-            FREE(incr1);
-            return 0;
-        }
-
-        /* flatten  nested loops: replace howmany_rank nested loops by a single one*/
-        /* Build temporary arrays used by flatened loop */
-        if ((dims1 = (int *)MALLOC(sizeof(int) * howmany_rank)) == NULL)
-        {
-            Scierror(999, _("%s: No more memory.\n"), fname);
-            FREE(dims1);
-            FREE(incr1);
-            return 0;
-        }
-        dims1[0] = howmany_dims[0].n;
-        for (i = 1; i < howmany_rank; i++)
-        {
-            dims1[i] = dims1[i - 1] * howmany_dims[i].n;
-        }
-        nloop = dims1[howmany_rank - 1];
-
-        if ((incr1 = (int *)MALLOC(sizeof(int) * howmany_rank)) == NULL)
-        {
-            Scierror(999, _("%s: No more memory.\n"), fname);
-            FREE(dims1);
-            FREE(incr1);
-            return 0;
-        }
-        t = 1;
-        for (i = 0; i < howmany_rank; i++)
-        {
-            t += (howmany_dims[i].n - 1) * howmany_dims[i].is;
-            incr1[i] = t;
-        }
-        /*loop on each "plan" */
-        i = 0; /*index on the first plan entry */
-        for (i1 = 1; i1 <= nloop; i1++)
-        {
-            /* the input and output are assumed to be complex because
-               within MKL real cases are transformed to complex ones in
-               previous steps of sci_fft_gen*/
-            ExecuteFFTWPlan(type, p, &ri[i], &ii[i], &ro[i], &io[i]);
-            i += howmany_dims[0].is;
-            /* check if  a loop ends*/
-            for (i2 = howmany_rank - 2; i2 >= 0; i2--)
-            {
-                if ((i1 % dims1[i2]) == 0)
-                {
-                    /*loop on dimension i2 ends, compute jump on the first plan entry index*/
-                    i += howmany_dims[i2 + 1].is - incr1[i2];
-                    break;
-                }
-            }
-        }
-        /* free temporary arrays */
-        FREE(dims1);
-        FREE(incr1);
-        /* reset initial value of gdim for post treatment*/
-        gdim.howmany_rank = howmany_rank;
-        gdim.howmany_dims = howmany_dims;
-
-    }
-    /* Post treatment */
-    switch (type)
-    {
-        case R2R_PLAN:
-            if (complete_array(ro, NULL, gdim) == -1)
-            {
-                Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-                return 0;
-            }
-            break;
-        case C2R_PLAN:
-            break;
-        case R2C_PLAN:
-            if (issymA)
-            {
-                /*R2C has been used to solve an r2r problem*/
-                if (complete_array(ro, NULL, gdim) == -1)
-                {
-                    Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-                    return 0;
-                }
-            }
-            else
-            {
-                if (complete_array(ro, io, gdim) == -1)
-                {
-                    Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-                    return 0;
-                }
-                if (isn == FFTW_BACKWARD)
-                {
-                    /*conjugate result */
-                    double ak = -1.0;
-                    C2F(dscal)(&lA, &ak, io, &one);
-                }
-            }
-            break;
-        case C2C_PLAN:
-            if (WITHMKL && isrealA_save)
-            {
-                if (isn == FFTW_FORWARD)
-                {
-                    if (complete_array(ro, io, gdim) == -1)
-                    {
-                        Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-                        return 0;
-                    }
-                }
-                else
-                {
-                    if (complete_array(io, ro, gdim) == -1)
-                    {
-                        Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
-                        return 0;
-                    }
-                }
-            }
-            break;
-    }
-
-    return 1;
-}
diff --git a/scilab/modules/fftw/sci_gateway/cpp/sci_dct.cpp b/scilab/modules/fftw/sci_gateway/cpp/sci_dct.cpp
new file mode 100644 (file)
index 0000000..e65712d
--- /dev/null
@@ -0,0 +1,243 @@
+/*
+* Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+* Copyright (C) 2012 - INRIA - Serge STEER
+* Copyright (C) 2015 - Scilab Enterprises - Antoine ELIAS
+*
+* This file must be used under the terms of the CeCILL.
+* This source file is licensed as described in the file COPYING, which
+* you should have received as part of this distribution.  The terms
+* are also available at
+* http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
+*
+*/
+
+#include "fftw_gw.hxx"
+#include "function.hxx"
+#include "fftw_common.hxx"
+extern "C"
+{
+#include "localization.h"
+#include "charEncoding.h"
+#include "Scierror.h"
+    extern int WITHMKL;
+}
+/*-----------------------------------------------------------------------------------*/
+static int sci_dct_gen(const char *fname, types::Double* A, types::Double** O, int isn, guru_dim_struct gdim, int iopt);
+/*-----------------------------------------------------------------------------------*/
+types::Function::ReturnValue sci_dct(types::typed_list &in, int _iRetCount, types::typed_list &out)
+{
+    std::wstring name(L"dct");
+    return fftw_common(name, in, _iRetCount, out, sci_dct_gen);
+}
+/*-----------------------------------------------------------------------------------*/
+int sci_dct_gen(const char *fname, types::Double* A, types::Double** O, int isn, guru_dim_struct gdim, int iopt)
+{
+    *O = A->clone()->getAs<types::Double>();
+    int ndimsA = (*O)->getDims();
+    int *dimsA = (*O)->getDimsArray();
+    double *Ar = (*O)->get();
+    double *Ai = (*O)->getImg();
+    /* Input  array variables */
+    int  isrealA = (Ai == NULL), lA = 1;
+    /*for MKL*/
+
+    /*FFTW specific library variable */
+    enum Plan_Type type;
+    fftw_r2r_kind *kind = NULL;
+    fftw_plan p = NULL;
+
+    /* for MKL special cases */
+    int * dims1 = NULL;
+    int * incr1 = NULL;
+
+    /* local variable */
+    int one = 1;
+    int i = 0;
+    int errflag = 0;
+
+    for (i = 0; i < ndimsA; i++)
+    {
+        lA *= dimsA[i];
+    }
+
+
+    if (isn == 1 && iopt == 0)
+    {
+        /* normalization */
+        if (dct_scale_array(Ar, Ai, gdim, isn) == -1)
+        {
+            Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
+            return types::Function::Error;
+        }
+    }
+    /* use inplace transform*/
+    type = R2R_PLAN;
+    if ((kind = (fftw_r2r_kind *)MALLOC(sizeof(fftw_r2r_kind) * gdim.rank)) == NULL)
+    {
+        Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
+        return types::Function::Error;
+    }
+
+    if (isn == -1)
+    {
+        if (iopt == 0 || iopt == 2)
+            for (i = 0; i < gdim.rank; i++)
+            {
+                kind[i] = FFTW_REDFT10;
+            }
+        else if (iopt == 1)
+            for (i = 0; i < gdim.rank; i++)
+            {
+                kind[i] = FFTW_REDFT00;
+            }
+        else if (iopt == 4)
+            for (i = 0; i < gdim.rank; i++)
+            {
+                kind[i] = FFTW_REDFT11;
+            }
+    }
+    else
+    {
+        if (iopt == 0 || iopt == 3)
+            for (i = 0; i < gdim.rank; i++)
+            {
+                kind[i] = FFTW_REDFT01;
+            }
+        else if (iopt == 1)
+            for (i = 0; i < gdim.rank; i++)
+            {
+                kind[i] = FFTW_REDFT00;
+            }
+        else if (iopt == 4)
+            for (i = 0; i < gdim.rank; i++)
+            {
+                kind[i] = FFTW_REDFT11;
+            }
+    }
+
+    if (!WITHMKL || gdim.howmany_rank <= 1)
+    {
+        /* Set Plan */
+        p = GetFFTWPlan(type, &gdim, Ar, NULL, Ar, NULL, getCurrentFftwFlags(), isn, kind, &errflag);
+        if (errflag == 1)
+        {
+            Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
+            return types::Function::Error;
+        }
+        else if (errflag == 2)
+        {
+            Scierror(999, _("%s: Creation of requested fftw plan failed.\n"), fname);
+            return types::Function::Error;
+        }
+        /* execute FFTW plan */
+        ExecuteFFTWPlan(type, p, Ar, NULL, Ar, NULL);
+        if (!isrealA)
+        {
+            ExecuteFFTWPlan(type, p, Ai, NULL, Ai, NULL);
+        }
+    }
+    else
+    {
+        /*FFTW MKL does not implement yet guru plan with howmany_rank>1             */
+        /*   associated loops described in gdim.howmany_rank and  gdim.howmany_dims */
+        /*   are implemented here by a set of call with howmany_rank==1             */
+        fftw_iodim *howmany_dims = gdim.howmany_dims;
+        int howmany_rank = gdim.howmany_rank;
+        int i1 = 0, i2 = 0;
+        int nloop = 0;
+        int t = 0;
+
+
+        gdim.howmany_rank = 0;
+        gdim.howmany_dims = NULL;
+
+        p = GetFFTWPlan(type, &gdim, Ar, NULL, Ar, NULL, getCurrentFftwFlags(), isn, kind, &errflag);
+        if (errflag == 1)
+        {
+            Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
+            FREE(dims1);
+            FREE(incr1);
+            return types::Function::Error;
+        }
+        else if (errflag == 2)
+        {
+            Scierror(999, _("%s: Creation of requested fftw plan failed.\n"), fname);
+            FREE(dims1);
+            FREE(incr1);
+            return types::Function::Error;
+        }
+
+        /* flatten  nested loops: replace howmany_rank nested loops by a single one*/
+        /* Build temporary arrays used by flatened loop */
+        if ((dims1 = (int *)MALLOC(sizeof(int) * howmany_rank)) == NULL)
+        {
+            Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
+            FREE(dims1);
+            FREE(incr1);
+            return types::Function::Error;
+        }
+        dims1[0] = howmany_dims[0].n;
+        for (i = 1; i < howmany_rank; i++)
+        {
+            dims1[i] = dims1[i - 1] * howmany_dims[i].n;
+        }
+        nloop = dims1[howmany_rank - 1];
+
+        if ((incr1 = (int *)MALLOC(sizeof(int) * howmany_rank)) == NULL)
+        {
+            Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
+            FREE(dims1);
+            FREE(incr1);
+            return types::Function::Error;
+        }
+        t = 1;
+        for (i = 0; i < howmany_rank; i++)
+        {
+            t += (howmany_dims[i].n - 1) * howmany_dims[i].is;
+            incr1[i] = t;
+        }
+        /*loop on each "plan" */
+        i = 0; /*index on the first plan entry */
+        for (i1 = 1; i1 <= nloop; i1++)
+        {
+            /* the input and output are assumed to be complex because
+            within MKL real cases are transformed to complex ones in
+            previous steps of sci_dct_gen*/
+            ExecuteFFTWPlan(type, p, &Ar[i], NULL, &Ar[i], NULL);
+            if (!isrealA)
+            {
+                ExecuteFFTWPlan(type, p, &Ai[i], NULL, &Ai[i], NULL);
+            }
+
+            i += howmany_dims[0].is;
+            /* check if  a loop ends*/
+            for (i2 = howmany_rank - 2; i2 >= 0; i2--)
+            {
+                if ((i1 % dims1[i2]) == 0)
+                {
+                    /*loop on dimension i2 ends, compute jump on the first plan entry index*/
+                    i += howmany_dims[i2 + 1].is - incr1[i2];
+                    break;
+                }
+            }
+        }
+        /* free temporary arrays */
+        FREE(dims1);
+        FREE(incr1);
+        /* reset initial value of gdim for post treatment*/
+        gdim.howmany_rank = howmany_rank;
+        gdim.howmany_dims = howmany_dims;
+
+    }
+    if (isn == -1 && iopt == 0)
+    {
+        /* normalization */
+
+        if (dct_scale_array(Ar, Ai, gdim, isn) == -1)
+        {
+            Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
+            return types::Function::Error;
+        }
+    }
+    return 1;
+}
diff --git a/scilab/modules/fftw/sci_gateway/cpp/sci_dst.cpp b/scilab/modules/fftw/sci_gateway/cpp/sci_dst.cpp
new file mode 100644 (file)
index 0000000..d8dc8ed
--- /dev/null
@@ -0,0 +1,253 @@
+/*
+* Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+* Copyright (C) 2012 - INRIA - Serge STEER
+* Copyright (C) 2015 - Scilab Enterprises - Antoine ELIAS
+*
+* This file must be used under the terms of the CeCILL.
+* This source file is licensed as described in the file COPYING, which
+* you should have received as part of this distribution.  The terms
+* are also available at
+* http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
+*
+*/
+
+#include "fftw_gw.hxx"
+#include "function.hxx"
+#include "fftw_common.hxx"
+extern "C"
+{
+#include "localization.h"
+#include "charEncoding.h"
+#include "Scierror.h"
+
+    extern int WITHMKL;
+    extern void C2F(dscal)(int *n, double *da, double *dx, int *incx); /* blas routine */
+    extern void C2F(dset)(int *n, double *da, double *dx, int *incx); /* blas routine */
+}
+/*-----------------------------------------------------------------------------------*/
+static int sci_dst_gen(const char *fname, types::Double* A, types::Double** O, int isn, guru_dim_struct gdim, int iopt);
+/*-----------------------------------------------------------------------------------*/
+types::Function::ReturnValue sci_dst(types::typed_list &in, int _iRetCount, types::typed_list &out)
+{
+    std::wstring name(L"dst");
+    return fftw_common(name, in, _iRetCount, out, sci_dst_gen);
+}
+/*-----------------------------------------------------------------------------------*/
+int sci_dst_gen(const char *fname, types::Double* A, types::Double** O, int isn, guru_dim_struct gdim, int iopt)
+{
+    *O = A->clone()->getAs<types::Double>();
+    int ndimsA = (*O)->getDims();
+    int *dimsA = (*O)->getDimsArray();
+    double *Ar = (*O)->get();
+    double *Ai = (*O)->getImg();
+
+    /* Input  array variables */
+    int  isrealA = (Ai == NULL), lA = 1;
+    double half = 0.5;
+
+    /*FFTW specific library variable */
+    enum Plan_Type type;
+    fftw_r2r_kind *kind = NULL;
+    fftw_plan p = NULL;
+
+    /* for MKL special cases */
+    int * dims1 = NULL;
+    int * incr1 = NULL;
+
+    /* local variable */
+    int one = 1;
+    int i = 0;
+    int errflag = 0;
+
+    for (i = 0; i < ndimsA; i++)
+    {
+        lA *= dimsA[i];
+    }
+
+    /* Set pointers on real and imaginary part of the input */
+
+    /* use inplace transform*/
+    type = R2R_PLAN;
+    if ((kind = (fftw_r2r_kind *)MALLOC(sizeof(fftw_r2r_kind) * gdim.rank)) == NULL)
+    {
+        Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
+        return 0;
+    }
+
+
+    if (isn == -1)
+    {
+        if (iopt == 0 || iopt == 1)
+            for (i = 0; i < gdim.rank; i++)
+            {
+                kind[i] = FFTW_RODFT00;
+            }
+        else if (iopt == 2)
+            for (i = 0; i < gdim.rank; i++)
+            {
+                kind[i] = FFTW_RODFT10;
+            }
+        else if (iopt == 4)
+            for (i = 0; i < gdim.rank; i++)
+            {
+                kind[i] = FFTW_RODFT11;
+            }
+    }
+    else
+    {
+        if (iopt == 0 || iopt == 1)
+            for (i = 0; i < gdim.rank; i++)
+            {
+                kind[i] = FFTW_RODFT00;
+            }
+        else if (iopt == 3)
+            for (i = 0; i < gdim.rank; i++)
+            {
+                kind[i] = FFTW_RODFT01;
+            }
+        else if (iopt == 4)
+            for (i = 0; i < gdim.rank; i++)
+            {
+                kind[i] = FFTW_RODFT11;
+            }
+    }
+
+    if (!WITHMKL || gdim.howmany_rank <= 1)
+    {
+        /* Set Plan */
+        p = GetFFTWPlan(type, &gdim, Ar, NULL, Ar, NULL, getCurrentFftwFlags(), isn, kind, &errflag);
+
+        if (errflag == 1)
+        {
+            Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
+            return 0;
+        }
+        else if (errflag == 2)
+        {
+            Scierror(999, _("%s: Creation of requested fftw plan failed.\n"), fname);
+            return 0;
+        }
+        /* execute FFTW plan */
+        ExecuteFFTWPlan(type, p, Ar, NULL, Ar, NULL);
+        if (!isrealA)
+        {
+            ExecuteFFTWPlan(type, p, Ai, NULL, Ai, NULL);
+        }
+
+    }
+    else
+    {
+        /*FFTW MKL does not implement yet guru plan with howmany_rank>1             */
+        /*   associated loops described in gdim.howmany_rank and  gdim.howmany_dims */
+        /*   are implemented here by a set of call with howmany_rank==1             */
+        fftw_iodim *howmany_dims = gdim.howmany_dims;
+        int howmany_rank = gdim.howmany_rank;
+        int i1 = 0, i2 = 0;
+        int nloop = 0;
+        int t = 0;
+
+
+        gdim.howmany_rank = 0;
+        gdim.howmany_dims = NULL;
+
+        p = GetFFTWPlan(type, &gdim, Ar, NULL, Ar, NULL, getCurrentFftwFlags(), isn, kind, &errflag);
+        if (errflag == 1)
+        {
+            Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
+            FREE(dims1);
+            FREE(incr1);
+            return 0;
+        }
+        else if (errflag == 2)
+        {
+            Scierror(999, _("%s: Creation of requested fftw plan failed.\n"), fname);
+            FREE(dims1);
+            FREE(incr1);
+            return 0;
+        }
+
+        /* flatten  nested loops: replace howmany_rank nested loops by a single one*/
+        /* Build temporary arrays used by flatened loop */
+        if ((dims1 = (int *)MALLOC(sizeof(int) * howmany_rank)) == NULL)
+        {
+            Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
+            FREE(dims1);
+            FREE(incr1);
+            return 0;
+        }
+        dims1[0] = howmany_dims[0].n;
+        for (i = 1; i < howmany_rank; i++)
+        {
+            dims1[i] = dims1[i - 1] * howmany_dims[i].n;
+        }
+        nloop = dims1[howmany_rank - 1];
+
+        if ((incr1 = (int *)MALLOC(sizeof(int) * howmany_rank)) == NULL)
+        {
+            Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
+            FREE(dims1);
+            FREE(incr1);
+            return 0;
+        }
+        t = 1;
+        for (i = 0; i < howmany_rank; i++)
+        {
+            t += (howmany_dims[i].n - 1) * howmany_dims[i].is;
+            incr1[i] = t;
+        }
+        /*loop on each "plan" */
+        i = 0; /*index on the first plan entry */
+        for (i1 = 1; i1 <= nloop; i1++)
+        {
+            /* the input and output are assumed to be complex because
+            within MKL real cases are transformed to complex ones in
+            previous steps of sci_dst_gen*/
+            ExecuteFFTWPlan(type, p, &Ar[i], NULL, &Ar[i], NULL);
+            if (!isrealA)
+            {
+                ExecuteFFTWPlan(type, p, &Ai[i], NULL, &Ai[i], NULL);
+            }
+
+            i += howmany_dims[0].is;
+            /* check if  a loop ends*/
+            for (i2 = howmany_rank - 2; i2 >= 0; i2--)
+            {
+                if ((i1 % dims1[i2]) == 0)
+                {
+                    /*loop on dimension i2 ends, compute jump on the first plan entry index*/
+                    i += howmany_dims[i2 + 1].is - incr1[i2];
+                    break;
+                }
+            }
+        }
+        /* free temporary arrays */
+        FREE(dims1);
+        FREE(incr1);
+        /* reset initial value of gdim for post treatment*/
+        gdim.howmany_rank = howmany_rank;
+        gdim.howmany_dims = howmany_dims;
+
+    }
+
+    /* normalization */
+    if (iopt == 0)
+    {
+        if (isn == -1)
+        {
+            C2F(dscal)(&lA, &half, Ar, &one);
+            if (!isrealA)
+            {
+                C2F(dscal)(&lA, &half, Ai, &one);
+            }
+        }
+        else
+        {
+            if (dst_scale_array(Ar, Ai, gdim, isn) == -1)
+            {
+                Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
+                return 0;
+            }
+        }
+    }
+    return 1;
+}
diff --git a/scilab/modules/fftw/sci_gateway/cpp/sci_fftw.cpp b/scilab/modules/fftw/sci_gateway/cpp/sci_fftw.cpp
new file mode 100644 (file)
index 0000000..3d54569
--- /dev/null
@@ -0,0 +1,418 @@
+/*
+* Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+* Copyright (C) 2012 - INRIA - Serge STEER
+* Copyright (C) 2015 - Scilab Enterprises - Antoine ELIAS
+*
+* This file must be used under the terms of the CeCILL.
+* This source file is licensed as described in the file COPYING, which
+* you should have received as part of this distribution.  The terms
+* are also available at
+* http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
+*
+*/
+
+#include "fftw_gw.hxx"
+#include "function.hxx"
+#include "fftw_common.hxx"
+
+extern "C"
+{
+#include "callfftw.h"
+#include "localization.h"
+#include "charEncoding.h"
+#include "Scierror.h"
+
+    int WITHMKL = 0;
+    extern void C2F(dscal)(int *n, double *da, double *dx, int *incx); /* blas routine */
+    extern void C2F(dset)(int *n, double *da, double *dx, int *incx); /* blas routine */
+}
+/*--------------------------------------------------------------------------*/
+enum Scaling
+{
+    Divide = -1,
+    None = 0,
+    Multiply = 1,
+};
+/*--------------------------------------------------------------------------*/
+static int sci_fft_gen(const char *fname, types::Double* A, types::Double** O, int isn, guru_dim_struct gdim, int iopt);
+/*--------------------------------------------------------------------------*/
+types::Function::ReturnValue sci_fftw(types::typed_list &in, int _iRetCount, types::typed_list &out)
+{
+    std::wstring name(L"fftw");
+    return fftw_common(name, in, _iRetCount, out, sci_fft_gen);
+}
+/*--------------------------------------------------------------------------*/
+int sci_fft_gen(const char *fname, types::Double* A, types::Double** O, int isn, guru_dim_struct gdim, int iopt)
+{
+    types::Double* tmp = A->clone()->getAs<types::Double>();
+    int ndimsA = tmp->getDims();
+    int *dimsA = tmp->getDimsArray();
+    double *Ar = tmp->get();
+    double *Ai = tmp->getImg();
+
+    /* Input  array variables */
+    int  isrealA = (Ai == NULL), issymA = 1, lA = 1;
+    /*for MKL*/
+    int isrealA_save = isrealA;
+
+    /*FFTW specific library variable */
+    enum Scaling scale = None;
+    enum Plan_Type type;
+    fftw_plan p;
+
+    /* input/output address for transform variables */
+    double *ri = NULL, *ii = NULL, *ro = NULL, *io = NULL;
+
+    /* for MKL special cases */
+    int * dims1 = NULL;
+    int * incr1 = NULL;
+
+    /* local variable */
+    int one = 1;
+    int i = 0;
+    int errflag = 0;
+
+
+    for (i = 0; i < ndimsA; i++)
+    {
+        lA *= dimsA[i];
+    }
+
+
+    if (iopt == 0)
+    {
+        /* automatically selected algorithm*/
+        issymA = check_array_symmetry(Ar, Ai, gdim);
+        if (issymA < 0)
+        {
+            Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
+            return 0;
+        }
+    }
+    else if (iopt == 1)
+    {
+        issymA = 1; /* user forces symmetry */
+    }
+    else
+    {
+        issymA = 0;
+    }
+
+    if (WITHMKL)
+    {
+        double dzero = 0.0;
+        if (isrealA)
+        {
+            /*MKL does not implement the r2c nor r2r guru split methods, make A complex */
+            if (issymA)
+            {
+                Ai = (double*)malloc(sizeof(double) * lA);
+                C2F(dset)(&lA, &dzero, Ai, &one);
+                //do not forget to release memory
+                //Ai != null && isrealA == 1
+
+                ///* result will be real, the imaginary part of A can be allocated alone */
+                //sciErr = allocMatrixOfDouble(_pvCtx, *getNbInputArgument(_pvCtx) + 1, 1, lA, &Ai);
+                //if (sciErr.iErr)
+                //{
+                //    Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
+                //    return 0;
+                //}
+                //C2F(dset)(&lA, &dzero, Ai, &one);
+            }
+            else
+            {
+                Ai = (double*)malloc(sizeof(double) * lA);
+                C2F(dset)(&lA, &dzero, Ai, &one);
+                ///* result will be complex, realloc A for inplace computation */
+                //sciErr = allocComplexArrayOfDouble(_pvCtx, *getNbInputArgument(_pvCtx) + 1, ndimsA, dimsA, &ri, &Ai);
+                //if (sciErr.iErr)
+                //{
+                //    Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
+                //    return 0;
+                //}
+                //C2F(dcopy)(&lA, Ar, &one, ri, &one);
+                //Ar = ri;
+                //C2F(dset)(&lA, &dzero, Ai, &one);
+                //AssignOutputVariable(_pvCtx, 1) = nbInputArgument(_pvCtx) + 1;
+                isrealA = 0;
+            }
+        }
+    }
+
+    /* Set pointers on real and imaginary part of the input */
+    ri = Ar;
+    ii = Ai;
+
+    scale = None; /*no scaling needed */
+    if (isn == FFTW_BACKWARD)
+    {
+        scale = Divide;
+    }
+    if (isrealA & !WITHMKL) /* To have type = C2C_PLAN*/
+    {
+        /*A is real */
+        if (issymA)
+        {
+            ///*r2r =  isrealA &&  issymA*/
+            ///* there is no general plan able to compute r2r transform so it is tranformed into
+            //a R2c plan. The computed imaginary part will be zero*/
+            double dzero = 0.0;
+            *O = A->clone()->getAs<types::Double>();
+            (*O)->setComplex(false);
+            ro = (*O)->get();
+            io = (double*)malloc(sizeof(double) * lA);
+            C2F(dset)(&lA, &dzero, io, &one);
+            type = R2C_PLAN;
+        }
+        else
+        {
+            /*r2c =  isrealA && ~issymA;*/
+            /* transform cannot be done in place */
+            *O = new types::Double(ndimsA, dimsA, true);
+            ro = (*O)->get();
+            io = (*O)->getImg();
+            type = R2C_PLAN; /* fftw_plan_guru_split_dft_r2c plans for an FFTW_FORWARD transform*/
+            if (isn == FFTW_BACKWARD)
+            {
+                /*transform problem into a FORWARD fft*/
+                /*ifft(A)=conj(fft(A/N)) cas vect*/
+                /* pre traitement A must be  divided by N cas vect*/
+                /* post treatment result must conjugated */
+            }
+        }
+    }
+    else
+    {
+        *O = A->clone()->getAs<types::Double>();
+        /* A is complex */
+        if (!WITHMKL && issymA) /*result is real*/
+        {
+            /*c2r =  ~isrealA &&  issymA*/
+            (*O)->setComplex(false);
+            ro = (*O)->get();
+            io = NULL;
+
+            type = C2R_PLAN; /*fftw_plan_guru_split_dft_c2r plans for an FFTW_BACKWARD transform*/
+            if (isn == FFTW_FORWARD)
+            {
+                /*transform problem into a BACKWARD fft : fft(A)=ifft(conj(A))*/
+                double minusone = -1.0;
+                C2F(dscal)(&lA, &minusone, ii, &one);
+            }
+        }
+        else
+        {
+            /*c2c =  ~isrealA && ~issymA;*/
+            /* use inplace transform*/
+            isrealA = 0;
+            type = C2C_PLAN; /*  fftw_plan_guru_split_dft plans for an FFTW_FORWARD transform*/
+            if (isn == FFTW_BACKWARD)
+            {
+                /*transform problem into a FORWARD fft*/
+                /* ifft(A) = %i*conj(fft(%i*conj(A)/N) */
+                /* reverse input */
+                ri = tmp->getImg();
+                ii = tmp->get();
+                /* reverse output */
+                ro = (*O)->getImg();
+                io = (*O)->get();
+            }
+            else
+            {
+                ro = (*O)->get();
+                io = (*O)->getImg();
+            }
+        }
+    }
+
+    /* pre-treatment */
+    if (scale != None)
+    {
+        double ak = 1.0;
+        for (i = 0; i < gdim.rank; i++)
+        {
+            ak = ak * ((double)(gdim.dims[i].n));
+        }
+        if (scale == Divide)
+        {
+            ak = 1.0 / ak;
+        }
+        C2F(dscal)(&lA, &ak, ri, &one);
+        if (isrealA == 0)
+        {
+            C2F(dscal)(&lA, &ak, ii, &one);
+        }
+    }
+
+    if (!WITHMKL || gdim.howmany_rank <= 1)
+    {
+        /* Set Plan */
+        p = GetFFTWPlan(type, &gdim, ri, ii, ro, io, getCurrentFftwFlags(), isn, (fftw_r2r_kind *)NULL, &errflag);
+        if (errflag == 1)
+        {
+            Scierror(999, _("%s: No more memory.\n"), fname);
+            return 0;
+        }
+        else if (errflag == 2)
+        {
+            Scierror(999, _("%s: Creation of requested fftw plan failed.\n"), fname);
+            return 0;
+        }
+        /* execute FFTW plan */
+        ExecuteFFTWPlan(type, p, ri, ii, ro, io);
+    }
+    else
+    {
+        /*FFTW MKL does not implement yet guru plan with howmany_rank>1             */
+        /*   associated loops described in gdim.howmany_rank and  gdim.howmany_dims */
+        /*   are implemented here by a set of call with howmany_rank==1             */
+        fftw_iodim *howmany_dims = gdim.howmany_dims;
+        int howmany_rank = gdim.howmany_rank;
+        int i1 = 0, i2 = 0;
+        int nloop = 0;
+        int t = 0;
+
+
+        gdim.howmany_rank = 0;
+        gdim.howmany_dims = NULL;
+
+        p = GetFFTWPlan(type, &gdim, ri, ii, ro, io, getCurrentFftwFlags(), isn, (fftw_r2r_kind *)NULL, &errflag);
+        if (errflag == 1)
+        {
+            Scierror(999, _("%s: No more memory.\n"), fname);
+            FREE(dims1);
+            FREE(incr1);
+            return 0;
+        }
+        else if (errflag == 2)
+        {
+            Scierror(999, _("%s: Creation of requested fftw plan failed.\n"), fname);
+            FREE(dims1);
+            FREE(incr1);
+            return 0;
+        }
+
+        /* flatten  nested loops: replace howmany_rank nested loops by a single one*/
+        /* Build temporary arrays used by flatened loop */
+        if ((dims1 = (int *)MALLOC(sizeof(int) * howmany_rank)) == NULL)
+        {
+            Scierror(999, _("%s: No more memory.\n"), fname);
+            FREE(dims1);
+            FREE(incr1);
+            return 0;
+        }
+        dims1[0] = howmany_dims[0].n;
+        for (i = 1; i < howmany_rank; i++)
+        {
+            dims1[i] = dims1[i - 1] * howmany_dims[i].n;
+        }
+        nloop = dims1[howmany_rank - 1];
+
+        if ((incr1 = (int *)MALLOC(sizeof(int) * howmany_rank)) == NULL)
+        {
+            Scierror(999, _("%s: No more memory.\n"), fname);
+            FREE(dims1);
+            FREE(incr1);
+            return 0;
+        }
+        t = 1;
+        for (i = 0; i < howmany_rank; i++)
+        {
+            t += (howmany_dims[i].n - 1) * howmany_dims[i].is;
+            incr1[i] = t;
+        }
+        /*loop on each "plan" */
+        i = 0; /*index on the first plan entry */
+        for (i1 = 1; i1 <= nloop; i1++)
+        {
+            /* the input and output are assumed to be complex because
+            within MKL real cases are transformed to complex ones in
+            previous steps of sci_fft_gen*/
+            ExecuteFFTWPlan(type, p, &ri[i], &ii[i], &ro[i], &io[i]);
+            i += howmany_dims[0].is;
+            /* check if  a loop ends*/
+            for (i2 = howmany_rank - 2; i2 >= 0; i2--)
+            {
+                if ((i1 % dims1[i2]) == 0)
+                {
+                    /*loop on dimension i2 ends, compute jump on the first plan entry index*/
+                    i += howmany_dims[i2 + 1].is - incr1[i2];
+                    break;
+                }
+            }
+        }
+        /* free temporary arrays */
+        FREE(dims1);
+        FREE(incr1);
+        /* reset initial value of gdim for post treatment*/
+        gdim.howmany_rank = howmany_rank;
+        gdim.howmany_dims = howmany_dims;
+
+    }
+    /* Post treatment */
+    switch (type)
+    {
+        case R2R_PLAN:
+            if (complete_array(ro, NULL, gdim) == -1)
+            {
+                Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
+                return 0;
+            }
+            break;
+        case C2R_PLAN:
+            break;
+        case R2C_PLAN:
+            if (issymA)
+            {
+                /*R2C has been used to solve an r2r problem*/
+                if (complete_array(ro, NULL, gdim) == -1)
+                {
+                    Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
+                    return 0;
+                }
+            }
+            else
+            {
+                if (complete_array(ro, io, gdim) == -1)
+                {
+                    Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
+                    return 0;
+                }
+                if (isn == FFTW_BACKWARD)
+                {
+                    /*conjugate result */
+                    double ak = -1.0;
+                    C2F(dscal)(&lA, &ak, io, &one);
+                }
+            }
+            break;
+        case C2C_PLAN:
+            if (WITHMKL && isrealA_save)
+            {
+                if (isn == FFTW_FORWARD)
+                {
+                    if (complete_array(ro, io, gdim) == -1)
+                    {
+                        Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
+                        return 0;
+                    }
+                }
+                else
+                {
+                    if (complete_array(io, ro, gdim) == -1)
+                    {
+                        Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
+                        return 0;
+                    }
+                }
+            }
+            break;
+    }
+
+    if (tmp)
+    {
+        delete tmp;
+    }
+    return 1;
+}
diff --git a/scilab/modules/fftw/sci_gateway/fftw_gateway.xml b/scilab/modules/fftw/sci_gateway/fftw_gateway.xml
deleted file mode 100644 (file)
index 63c49a9..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!--
- * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- * Copyright (C) 2007 - INRIA - Allan CORNET
- * Copyright (C) 2007 - INRIA - Sylvestre LEDRU
- * 
- * This file must be used under the terms of the CeCILL.
- * This source file is licensed as described in the file COPYING, which
- * you should have received as part of this distribution.  The terms
- * are also available at    
- * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
- *
- -->
-
-<!DOCTYPE GATEWAY SYSTEM "../../functions/xml/gateway.dtd">
-<GATEWAY name="fftw">
-    
-    <!--
- Scilab
- Interface description. In this file, we define the list of the function which
- will be available into Scilab and the link to the "native" function.
-
- gatewayId is the position in the hashtable 'Interfaces' defined in the
- file SCI/modules/core/src/c/callinterf.h
-
- primitiveId is the position in the hashtable '<module>Table Tab[]' defined
- in the file modules/<module>/sci_gateway/c/gw_<module>.c
-
- primitiveName is the name of the Scilab function
-
- Don't touch if you do not know what you are doing
--->
-    
-    <PRIMITIVE gatewayId="51" primitiveId="1" primitiveName="loadfftwlibrary" />
-    <PRIMITIVE gatewayId="51" primitiveId="2" primitiveName="disposefftwlibrary" />
-    <PRIMITIVE gatewayId="51" primitiveId="3" primitiveName="fftwlibraryisloaded" />
-    <PRIMITIVE gatewayId="51" primitiveId="4" primitiveName="fftw" />
-    <PRIMITIVE gatewayId="51" primitiveId="5" primitiveName="fftw_flags" />
-    <PRIMITIVE gatewayId="51" primitiveId="6" primitiveName="get_fftw_wisdom" />
-    <PRIMITIVE gatewayId="51" primitiveId="7" primitiveName="set_fftw_wisdom" />
-    <PRIMITIVE gatewayId="51" primitiveId="8" primitiveName="fftw_forget_wisdom" />
-    <PRIMITIVE gatewayId="51" primitiveId="9" primitiveName="dct" />
-    <PRIMITIVE gatewayId="51" primitiveId="10" primitiveName="dst" />
-</GATEWAY>
diff --git a/scilab/modules/fftw/src/c/sci_data_utilities.c b/scilab/modules/fftw/src/c/sci_data_utilities.c
deleted file mode 100644 (file)
index 47e384d..0000000
+++ /dev/null
@@ -1,484 +0,0 @@
-/*
-* Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-* Copyright (C) 2012 - INRIA - Serge STEER
-*
-* This file must be used under the terms of the CeCILL.
-* This source file is licensed as described in the file COPYING, which
-* you should have received as part of this distribution.  The terms
-* are also available at
-* http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
-*
-*/
-#include <string.h>
-#include "sci_malloc.h"
-#include "api_scilab.h"
-#include "localization.h"
-#include "Scierror.h"
-/*--------------------------------------------------------------------------*/
-int getArrayOfDouble(void* pvApiCtx, int *piAddr, int *ndims, int **dims, double **Ar, double **Ai)
-{
-    SciErr sciErr;
-    int *piAddrChild = NULL;
-    int *piOffset = NULL;
-    int *piData = NULL;
-    int nItems = 0;
-    int iRows = 0;
-    int iCols = 0;
-    int iType = 0;
-
-    sciErr = getVarType(pvApiCtx, piAddr, &iType);
-    if (iType == sci_matrix)
-    {
-        *ndims = 2;
-        *dims = &(piAddr[1]);
-        if (isVarComplex(pvApiCtx, piAddr))
-        {
-            getComplexMatrixOfDouble(pvApiCtx, piAddr, &iRows, &iCols, Ar, Ai);
-        }
-        else
-        {
-            getMatrixOfDouble(pvApiCtx, piAddr, &iRows, &iCols, Ar);
-            *Ai = NULL;
-        }
-        return 1;
-    }
-    else if (iType == sci_mlist)
-    {
-        sciErr = getListItemNumber(pvApiCtx, piAddr, &nItems);
-        if (nItems != 3)
-        {
-            return 0;
-        }
-        /*Check if first item is ["hm","dims","entries"] */
-        sciErr = getListItemAddress(pvApiCtx, piAddr, 1, &piAddrChild);
-        sciErr = getVarType(pvApiCtx, piAddrChild, &iType);
-        if (iType != sci_strings)
-        {
-            return 0;
-        }
-        sciErr = getVarDimension(pvApiCtx, piAddrChild, &iRows, &iCols);
-        if (iRows*iCols != 3)
-        {
-            return 0;
-        }
-        /* Check if first entry of the first item is "hm" */
-        piOffset = piAddrChild + 4;
-        if (piOffset[1] - piOffset[0] != 2)
-        {
-            return 0;
-        }
-        piData = piOffset + iRows * iCols + 1;
-        if (piData[0] != 17 || piData[1] != 22)
-        {
-            return 0;    /* check "hm" */
-        }
-        /* Get second item dims */
-        sciErr = getListItemAddress(pvApiCtx, piAddr, 2, &piAddrChild);
-        sciErr = getVarType(pvApiCtx, piAddrChild, &iType);
-        if (iType != sci_ints)
-        {
-            return 0;
-        }
-        sciErr = getMatrixOfInteger32(pvApiCtx, piAddrChild, &iRows, &iCols, dims);
-        if (sciErr.iErr)
-        {
-            return 0;
-        }
-        *ndims = iRows * iCols;
-        /* Get thirds item entries */
-        sciErr = getListItemAddress(pvApiCtx, piAddr, 3, &piAddrChild);
-        sciErr = getVarType(pvApiCtx, piAddrChild, &iType);
-        if (iType != sci_matrix)
-        {
-            return 0;
-        }
-        if (isVarComplex(pvApiCtx, piAddrChild))
-        {
-            getComplexMatrixOfDouble(pvApiCtx, piAddrChild, &iRows, &iCols, Ar, Ai);
-        }
-        else
-        {
-            getMatrixOfDouble(pvApiCtx, piAddrChild, &iRows, &iCols, Ar);
-            *Ai = NULL;
-        }
-        return 1;
-    }
-    else
-    {
-        return 0;
-    }
-}
-
-SciErr allocComplexArrayOfDouble(void* pvApiCtx, int _iVar, int ndims, int *dims, double **Ar, double **Ai)
-{
-    SciErr sciErr;
-    int *piAddr = NULL;
-
-    if (ndims == 2)
-    {
-        sciErr = allocComplexMatrixOfDouble( pvApiCtx, _iVar, dims[0], dims[1], Ar, Ai);
-        if (sciErr.iErr)
-        {
-            return sciErr;
-        }
-    }
-    else
-    {
-        int i = 0;
-        int n = 1;
-        const char * hmType[] = {"hm", "dims", "entries"};
-
-        for (i = 0; i < ndims; i++)
-        {
-            n *= dims[i];
-        }
-
-        sciErr = createMList(pvApiCtx, _iVar, 3, &piAddr);
-        if (sciErr.iErr)
-        {
-            return sciErr;
-        }
-
-        sciErr = createMatrixOfStringInList(pvApiCtx, _iVar, piAddr, 1, 1, 3, hmType);
-        if (sciErr.iErr)
-        {
-            return sciErr;
-        }
-        sciErr = createMatrixOfInteger32InList(pvApiCtx, _iVar, piAddr, 2, 1, ndims, dims);
-        if (sciErr.iErr)
-        {
-            return sciErr;
-        }
-
-        sciErr = allocComplexMatrixOfDoubleInList(pvApiCtx, _iVar, piAddr, 3, n, 1, Ar, Ai);
-        if (sciErr.iErr)
-        {
-            return sciErr;
-        }
-    }
-    return sciErr;
-}
-
-SciErr allocArrayOfDouble(void* pvApiCtx, int _iVar,  int ndims, int *dims, double **Ar)
-{
-    SciErr sciErr;
-    int *piAddr      = NULL;
-
-
-    if (ndims == 2)
-    {
-        sciErr = allocMatrixOfDouble( pvApiCtx, _iVar, dims[0], dims[1], Ar);
-        if (sciErr.iErr)
-        {
-            return sciErr;
-        }
-    }
-    else
-    {
-        int i = 0;
-        int n = 1;
-        const char * hmType[] = {"hm", "dims", "entries"};
-
-        for (i = 0; i < ndims; i++)
-        {
-            n *= dims[i];
-        }
-
-        sciErr = createMList(pvApiCtx,  _iVar, 3, &piAddr);
-        if (sciErr.iErr)
-        {
-            return sciErr;
-        }
-        sciErr = createMatrixOfStringInList(pvApiCtx, _iVar, piAddr, 1, 1, 3, hmType);
-        if (sciErr.iErr)
-        {
-            return sciErr;
-        }
-        sciErr = createMatrixOfInteger32InList(pvApiCtx, _iVar, piAddr, 2, 1, ndims, dims);
-        if (sciErr.iErr)
-        {
-            return sciErr;
-        }
-
-        sciErr = allocMatrixOfDoubleInList(pvApiCtx, _iVar, piAddr, 3, n, 1, Ar);
-        if (sciErr.iErr)
-        {
-            return sciErr;
-        }
-    }
-    return sciErr;
-}
-
-SciErr getScalarIntArg(void* pvApiCtx, int _iVar, char *fname, int *value)
-{
-    SciErr sciErr;
-    int *piAddr = NULL;
-    int iType = 0;
-    int iPrec = 0;
-    double t_d = 0.0;
-    char t_c = 0;
-    unsigned char t_uc = 0;
-    short t_s = 0;
-    unsigned short t_us = 0;
-    int t_i = 0;
-    unsigned int  t_ui = 0;
-    sciErr.iErr = 0;
-    sciErr.iMsgCount = 0;
-
-    sciErr = getVarAddressFromPosition(pvApiCtx, _iVar, &piAddr);
-    if (sciErr.iErr)
-    {
-        addErrorMessage(&sciErr, API_ERROR_GET_STRING,  _("%s: Can not read input argument #%d.\n"), fname, _iVar);
-        return sciErr;
-    }
-
-    //check type
-    sciErr = getVarType(pvApiCtx, piAddr, &iType);
-    if (sciErr.iErr)
-    {
-        addErrorMessage(&sciErr, API_ERROR_GET_INT,  _("%s: Can not read input argument #%d.\n"), fname, _iVar);
-        return sciErr;
-    }
-
-    if (!isScalar(pvApiCtx, piAddr))
-    {
-        addErrorMessage(&sciErr, API_ERROR_GET_INT, _("%s: Wrong size for input argument #%d: A scalar expected.\n"), fname, _iVar);
-        return sciErr;
-    }
-
-    if (iType == sci_matrix)
-    {
-        getScalarDouble(pvApiCtx, piAddr, &t_d);
-        *value = (int)t_d;
-    }
-    else if (iType == sci_ints)
-    {
-        sciErr = getMatrixOfIntegerPrecision(pvApiCtx, piAddr, &iPrec);
-        if (sciErr.iErr)
-        {
-            addErrorMessage(&sciErr, API_ERROR_GET_INT, _("%s: Can not read input argument #%d.\n"), fname, _iVar);
-            return sciErr;
-        }
-
-        switch (iPrec)
-        {
-            case SCI_INT8 :
-            {
-                getScalarInteger8(pvApiCtx, piAddr, &t_c);
-                *value = (int)t_c;
-            }
-            case SCI_INT16 :
-            {
-                getScalarInteger16(pvApiCtx, piAddr, &t_s);
-                *value = (int)t_s;
-            }
-            case SCI_INT32 :
-            {
-                getScalarInteger32(pvApiCtx, piAddr, &t_i);
-                *value = (int)t_i;
-            }
-            case SCI_UINT8 :
-            {
-                getScalarUnsignedInteger8(pvApiCtx, piAddr, &t_uc);
-                *value = (int)t_uc;
-            }
-            case SCI_UINT16 :
-            {
-                getScalarUnsignedInteger16(pvApiCtx, piAddr, &t_us);
-                *value = (int)t_us;
-            }
-            case SCI_UINT32 :
-            {
-                getScalarUnsignedInteger32(pvApiCtx, piAddr, &t_ui);
-                *value = (int)t_ui;
-            }
-        }
-    }
-    else
-    {
-        addErrorMessage(&sciErr, API_ERROR_GET_INT,
-                        _("%s: Wrong type for argument #%d: An integer or a floating point number expected.\n"),
-                        fname, _iVar);
-        return sciErr;
-    }
-    return sciErr;
-}
-
-SciErr getVectorIntArg(void* pvApiCtx, int _iVar, char *fname, int *pndims, int **pDim)
-{
-    SciErr sciErr;
-    int *piAddr = NULL;
-    int iType = 0;
-    int iPrec = 0;
-    int mDim = 0;
-    int nDim = 0;
-    int *Dim = NULL;
-    int ndims = 0;
-
-    double* p_d = NULL;
-    char* p_c = NULL;
-    unsigned char* p_uc = NULL;
-    short* p_s = NULL;
-    unsigned short* p_us = NULL;
-    int* p_i = NULL;
-    unsigned int*  p_ui = NULL;
-    int i = 0;
-
-    sciErr.iErr = 0;
-    sciErr.iMsgCount = 0;
-
-    getVarAddressFromPosition(pvApiCtx, _iVar, &piAddr);
-
-    //check type
-    getVarType(pvApiCtx, piAddr, &iType);
-
-    if (isVarMatrixType(pvApiCtx, piAddr) == 0)
-    {
-        addErrorMessage(&sciErr, API_ERROR_GET_INT, _("%s: Wrong type for input argument #%d.\n"), fname, _iVar);
-        return sciErr;
-    }
-
-    getVarDimension(pvApiCtx, piAddr, &mDim, &nDim);
-
-    ndims = mDim * nDim;
-    *pndims = ndims;
-    if (ndims <= 0)
-    {
-        addErrorMessage(&sciErr, API_ERROR_GET_INT,
-                        _("%s: Wrong size for input argument #%d.\n"), fname, _iVar);
-        return sciErr;
-    }
-    if ((Dim = (int *)MALLOC(ndims * sizeof(int))) == NULL)
-    {
-        addErrorMessage(&sciErr, API_ERROR_GET_INT,
-                        _("%s: Cannot allocate more memory.\n"), fname);
-        return sciErr;
-    }
-    *pDim = Dim;
-    if (iType == sci_matrix)
-    {
-        sciErr = getMatrixOfDouble(pvApiCtx, piAddr, &mDim, &nDim, &p_d);
-        for (i = 0; i < ndims; i++)
-        {
-            Dim[i] = (int)(p_d[i]);
-        }
-    }
-    else if (iType == sci_ints)
-    {
-        getMatrixOfIntegerPrecision(pvApiCtx, piAddr, &iPrec);
-        switch (iPrec)
-        {
-            case SCI_INT8 :
-                getMatrixOfInteger8(pvApiCtx, piAddr, &mDim, &nDim, &p_c);
-                for (i = 0; i < ndims; i++)
-                {
-                    Dim[i]  = (int)(p_c[i]);
-                }
-                break;
-            case SCI_INT16 :
-                getMatrixOfInteger16(pvApiCtx, piAddr, &mDim, &nDim, &p_s);
-                for (i = 0; i < ndims; i++)
-                {
-                    Dim[i]  = (int)(p_s[i]);
-                }
-                break;
-            case SCI_INT32 :
-                getMatrixOfInteger32(pvApiCtx, piAddr, &mDim, &nDim, &p_i);
-                for (i = 0; i < ndims; i++)
-                {
-                    Dim[i]  = (int)(p_i[i]);
-                }
-                break;
-            case SCI_UINT8 :
-                getMatrixOfUnsignedInteger8(pvApiCtx, piAddr, &mDim, &nDim, &p_uc);
-                for (i = 0; i < ndims; i++)
-                {
-                    Dim[i]  = (int)(p_uc[i]);
-                }
-                break;
-            case SCI_UINT16 :
-                getMatrixOfUnsignedInteger16(pvApiCtx, piAddr, &mDim, &nDim, &p_us);
-                for (i = 0; i < ndims; i++)
-                {
-                    Dim[i]  = (int) p_us[i];
-                }
-                break;
-            case SCI_UINT32 :
-                getMatrixOfUnsignedInteger32(pvApiCtx, piAddr, &mDim, &nDim, &p_ui);
-                for (i = 0; i < ndims; i++)
-                {
-                    Dim[i]  = (int)(p_ui[i]);
-                }
-                break;
-        }
-    }
-    else
-    {
-        FREE(Dim);
-        Dim = NULL;
-        addErrorMessage(&sciErr, API_ERROR_GET_INT,
-                        _("%s: Wrong type for argument #%d: An array of floating point or integer numbers expected.\n"), fname, _iVar);
-        return sciErr;
-    }
-    return sciErr;
-}
-
-BOOL isHyperMatrixMlist(void* pvApiCtx, int *piAddressVar)
-{
-    char **fields = NULL;
-    SciErr sciErr;
-    int iType = 0;
-    int m = 0, n = 0;
-
-    if (piAddressVar == NULL)
-    {
-        return FALSE;
-    }
-
-    sciErr = getVarType(pvApiCtx, piAddressVar, &iType);
-    if (sciErr.iErr)
-    {
-        return FALSE;
-    }
-
-    if (iType == sci_mlist)
-    {
-        int* piAddrChild  = NULL;
-        int iItem   = 0;
-
-        sciErr = getListItemNumber(pvApiCtx, piAddressVar, &iItem);
-        if (sciErr.iErr)
-        {
-            return FALSE;
-        }
-
-        sciErr = getListItemAddress(pvApiCtx, piAddressVar, 1, &piAddrChild);
-        if (sciErr.iErr)
-        {
-            return FALSE;
-        }
-
-        if (!isStringType(pvApiCtx, piAddrChild))
-        {
-            return FALSE;
-        }
-
-        if (getAllocatedMatrixOfString(pvApiCtx, piAddrChild, &m, &n , &fields) == 0)
-        {
-            if (strcmp(fields[0], "hm") != 0)
-            {
-                freeAllocatedMatrixOfString(m, n, fields);
-                fields = NULL;
-                return FALSE;
-            }
-            freeAllocatedMatrixOfString(m, n, fields);
-            fields = NULL;
-        }
-        else
-        {
-            return FALSE;
-        }
-        return TRUE;
-    }
-    return FALSE;
-}
diff --git a/scilab/modules/fftw/src/c/sci_data_utilities.h b/scilab/modules/fftw/src/c/sci_data_utilities.h
deleted file mode 100644 (file)
index 92d0e64..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
-* Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-* Copyright (C) 2012 - INRIA - Serge STEER
-*
-* This file must be used under the terms of the CeCILL.
-* This source file is licensed as described in the file COPYING, which
-* you should have received as part of this distribution.  The terms
-* are also available at
-* http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
-*
-*/
-#include "api_scilab.h"
-#ifndef __SCI_DATA_UTILITIES__
-#define __SCI_DATA_UTILITIES__
-int getArrayOfDouble(void* pvApiCtx, int *piAddr, int *ndims, int **dims, double **Ar, double **Ai);
-
-SciErr allocArrayOfDouble(void* _pvCtx, int _iVar, int ndims, int *dims, double **Ar);
-
-SciErr allocComplexArrayOfDouble(void* _pvCtx, int _iVar, int ndims, int *dims, double **Ar, double **Ai);
-
-SciErr getScalarIntArg(void* _pvCtx, int _iVar, char *fname, int *value);
-
-SciErr getVectorIntArg(void* _pvCtx, int _iVar, char *fname, int *pndims, int **pDim);
-
-BOOL isHyperMatrixMlist(void* _pvCtx, int *piAddressVar);
-#endif /* __SCI_DATA_UTILITIES__ */
-/*--------------------------------------------------------------------------*/
diff --git a/scilab/modules/fftw/src/cpp/fftw_common.cpp b/scilab/modules/fftw/src/cpp/fftw_common.cpp
new file mode 100644 (file)
index 0000000..0800318
--- /dev/null
@@ -0,0 +1,961 @@
+/*
+*  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+*  Copyright (C) 2015 - Scilab Enterprises - Antoine ELIAS
+*
+*  This file must be used under the terms of the CeCILL.
+*  This source file is licensed as described in the file COPYING, which
+*  you should have received as part of this distribution.  The terms
+*  are also available at
+*  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+*
+*/
+
+#include "fftw_common.hxx"
+#include "overload.hxx"
+#include "execvisitor.hxx"
+
+extern "C"
+{
+#include "callfftw.h"
+#include "localization.h"
+#include "charEncoding.h"
+#include "Scierror.h"
+
+    extern int WITHMKL;
+}
+types::Function::ReturnValue fftw_common(std::wstring& name, types::typed_list &in, int _iRetCount, types::typed_list &out, fftw_gen func)
+{
+    int iRhs = static_cast<int>(in.size());
+
+    wchar_t* option = nullptr;
+    int isn = FFTW_FORWARD;
+    WITHMKL = withMKL();
+    int iopt = 0;
+
+
+    char* s = wide_string_to_UTF8(name.data());
+    std::string cname(s);
+    FREE(s);
+
+    int iMaxRhs = 4;
+    if (name == L"fftw")
+    {
+        iMaxRhs = 5;
+    }
+    /****************************************
+    * Basic constraints on rhs arguments  *
+    ****************************************/
+
+    /* check min/max lhs/rhs arguments of scilab function */
+    if (in.size() < 1 || in.size() > iMaxRhs)
+    {
+        Scierror(77, _("%s: Wrong number of input argument(s): %d to %d expected.\n"), cname.data(), 1, iMaxRhs);
+        return types::Function::Error;
+    }
+
+    if (_iRetCount > 1)
+    {
+        Scierror(78, _("%s: Wrong number of output argument(s): %d expected.\n"), cname.data(), 1);
+        return types::Function::Error;
+    }
+
+    if (in[0]->isDouble() == false)
+    {
+        return Overload::generateNameAndCall(name, in, _iRetCount, out, new ast::ExecVisitor());
+    }
+
+    //check option, last parameter
+    if (in.back()->isString())
+    {
+        types::String* pOption = in.back()->getAs<types::String>();
+        if (pOption->isScalar())
+        {
+            option = pOption->get()[0];
+            --iRhs;
+        }
+        else
+        {
+            Scierror(999, _("%s: Cannot allocate more memory.\n"), cname.data());
+            return types::Function::Error;
+        }
+    }
+
+    /********************  Checking if isn is given  ************************************************/
+    if (iRhs != 1)
+    {
+        if (in[1]->isDouble() == false)
+        {
+            Scierror(999, _("%s: Wrong type for input argument #%d: A scalar expected.\n"), cname.data(), 2);
+            return types::Function::Error;
+        }
+
+        types::Double* pWay = in[1]->getAs<types::Double>();
+        if (pWay->isScalar() == false)
+        {
+            Scierror(999, _("%s: Wrong size for input argument #%d: A scalar expected.\n"), cname.data(), 2);
+            return types::Function::Error;
+        }
+
+        isn = static_cast<int>(pWay->get()[0]);
+        if (isn != FFTW_FORWARD && isn != FFTW_BACKWARD)
+        {
+            Scierror(53, _("%s: Wrong value for input argument #%d: %d or %d expected.\n"), cname.data(), 2, FFTW_FORWARD, FFTW_BACKWARD);
+            return types::Function::Error;
+        }
+    }
+
+    if (option)
+    {
+        if (cname == "dct" || cname == "dst")
+        {
+            if (isn == FFTW_FORWARD)
+            {
+                if (option == name + L"1")
+                {
+                    iopt = 1;
+                }
+                else if (option == name + L"2")
+                {
+                    iopt = 2;
+                }
+                else if (option == name)
+                {
+                    iopt = 0;
+                }
+                else if (option == name + L"4")
+                {
+                    iopt = 4;
+                }
+                else
+                {
+                    std::string err;
+                    err += "\"" + cname + "\",";
+                    err += "\"" + cname + "1\",";
+                    err += "\"" + cname + "2\",";
+                    err += "\"" + cname + "4\"";
+                    Scierror(999, _("%s: Wrong value for input argument #%d: Must be in the set {%s}.\n"), cname.data(), in.size(), err.data());
+                    return types::Function::Error;
+                }
+            }
+            else
+            {
+                if (option == name + L"1")
+                {
+                    iopt = 1;
+                }
+                else if (option == name + L"3")
+                {
+                    iopt = 3;
+                }
+                else if (option == L"i" + name)
+                {
+                    iopt = 0;
+                }
+                else if (option == name + L"4")
+                {
+                    iopt = 4;
+                }
+                else
+                {
+                    std::string err;
+                    err += "\"i" + cname + "\",";
+                    err += "\"" + cname + "1\",";
+                    err += "\"" + cname + "3\",";
+                    err += "\"" + cname + "4\"";
+                    Scierror(999, _("%s: Wrong value for input argument #%d: Must be in the set {%s}.\n"), cname.data(), in.size(), err.data());
+                    return types::Function::Error;
+                }
+            }
+        }
+        else //fftw
+        {
+            if (option == std::wstring(L"symmetric"))
+            {
+                iopt = 1;
+            }
+            else if (option == std::wstring(L"nonsymmetric"))
+            {
+                iopt = 2;
+            }
+            else
+            {
+                Scierror(999, _("%s: Wrong value for input argument #%d: '%s' or '%s' expected.\n"), name.data(), iRhs, "\"symmetric\"", "\"nonsymmetric\"");
+                return types::Function::Error;
+            }
+        }
+    }
+
+    switch (iRhs)
+    {
+        case 4:
+        {
+            /* dct(A ,sign ,dim, incr)*/
+            return common_4args(cname, in, _iRetCount, out, func, isn, iopt);
+            break;
+        }
+        case 3:
+        {
+            /* dct(A ,sign ,sel)*/
+            return common_3args(cname, in, _iRetCount, out, func, isn, iopt);
+            break;
+        }
+        default:
+        {
+            /* dct(A ,sign)*/
+            return common_2args(cname, in, _iRetCount, out, func, isn, iopt);
+            break;
+        }
+    }
+}
+
+types::Function::ReturnValue common_2args(std::string& name, types::typed_list &in, int _iRetCount, types::typed_list &out, fftw_gen func, int way, int opt)
+{
+    //getting the array A
+    types::Double* A = in[0]->getAs<types::Double>();
+    int ndimsA = A->getDims();
+    int *dimsA = A->getDimsArray();
+
+    /*FFTW specific library variable */
+    guru_dim_struct gdim = {0, NULL, 0, NULL};
+
+    /* local variable */
+    int ndims = 0; /* number of non singleton dimensions */
+    int first_nonsingleton = -1;
+    int i = 0, j = 0;
+    int prd = 1;
+
+    /* ignore singleton dimensions */
+    first_nonsingleton = -1;
+    ndims = 0;
+    for (i = 0; i < ndimsA; i++)
+    {
+        if (dimsA[i] > 1)
+        {
+            ndims++;
+            if (first_nonsingleton < 0)
+            {
+                first_nonsingleton = i;
+            }
+        }
+    }
+
+    /* void or scalar input gives void output or scalar*/
+    if (ndims == 0)
+    {
+        out.push_back(A);
+        return types::Function::OK;
+    }
+
+    gdim.rank = ndims;
+    if ((gdim.dims = (fftw_iodim *)MALLOC(sizeof(fftw_iodim) * gdim.rank)) == nullptr)
+    {
+        Scierror(999, _("%s: Cannot allocate more memory.\n"), name.data());
+        FREE(gdim.dims);
+        FREE(gdim.howmany_dims);
+        return types::Function::OK;
+    }
+
+    j = 0;
+    prd = 1;
+    for (i = (first_nonsingleton); i < ndimsA; i++)
+    {
+        if (dimsA[i] > 1)
+        {
+            gdim.dims[j].n = dimsA[i];
+            gdim.dims[j].is = prd;
+            gdim.dims[j].os = prd;
+            prd *= dimsA[i];
+            j++;
+        }
+    }
+    gdim.howmany_rank = 0;
+    gdim.howmany_dims = nullptr;
+
+
+    //fftw functions work "in place", so we need to clone input data.
+    types::Double* D = nullptr;// A->clone()->getAs<types::Double>();
+    if (!func(name.data(), A, &D, way, gdim, opt))
+    {
+        FREE(gdim.dims);
+        FREE(gdim.howmany_dims);
+        return types::Function::OK;
+    }
+
+    out.push_back(D);
+    return types::Function::OK;
+}
+
+types::Function::ReturnValue common_3args(std::string& name, types::typed_list &in, int _iRetCount, types::typed_list &out, fftw_gen func, int way, int opt)
+{
+    //getting the array A
+    types::Double* A = in[0]->getAs<types::Double>();
+    int ndimsA = A->getDims();
+    int *dimsA = A->getDimsArray();
+
+    int *Sel = nullptr;
+    int rank = 0;
+
+    /*FFTW specific library variable */
+    guru_dim_struct gdim = {0, NULL, 0, NULL};
+    /* local variable */
+    int ndims = 0;
+    int first_nonsingleton = -1;
+    int ih = 0;
+    int pd = 1; /* used to store prod(Dims(1:sel(k-1)))*/
+    int pds = 1; /* used to store prod(Dims(sel(k-1):sel(k)))*/
+    int i = 0, j = 0;
+
+    /* ignore singleton dimensions */
+    first_nonsingleton = -1;
+    ndims = 0;
+    for (i = 0; i < ndimsA; i++)
+    {
+        if (dimsA[i] > 1)
+        {
+            ndims++;
+            if (first_nonsingleton < 0)
+            {
+                first_nonsingleton = i;
+            }
+        }
+    }
+
+    /* void or scalar input gives void output or scalar*/
+    if (ndims == 0)
+    {
+        out.push_back(A);
+        return types::Function::OK;
+    }
+
+    if (in[2]->isGenericType() == false)
+    {
+        Scierror(999, _("%s: Wrong type for input argument #%d.\n"), name.data(), 3);
+        FREE(gdim.dims);
+        FREE(gdim.howmany_dims);
+    }
+
+    getVarAsDims(in[2], rank, Sel);
+
+    /* size of Sel must be less than ndimsA */
+    if (rank <= 0 || rank >= ndimsA)
+    {
+        Scierror(999, _("%s: Wrong size for input argument #%d: Must be between %d and %d.\n"), name.data(), 3, 1, ndimsA - 1);
+        FREE(gdim.dims);
+        FREE(gdim.howmany_dims);
+        FREE(Sel);
+        return types::Function::Error;
+    }
+    /* check values of Sel[i] */
+    for (i = 0; i < rank; i++)
+    {
+        if (Sel[i] <= 0)
+        {
+            Scierror(999, _("%s: Wrong values for input argument #%d: Positive integers expected.\n"), name.data(), 3);
+            FREE(gdim.dims);
+            FREE(gdim.howmany_dims);
+            FREE(Sel);
+            return types::Function::Error;
+        }
+        if (Sel[i] > ndimsA)
+        {
+            Scierror(999, _("%s: Wrong values for input argument #%d: Elements must be less than %d.\n"), name.data(), 3, ndimsA);
+            FREE(gdim.dims);
+            FREE(gdim.howmany_dims);
+            FREE(Sel);
+            return types::Function::Error;
+        }
+        if (i > 0 && Sel[i] <= Sel[i - 1])
+        {
+            Scierror(999, _("%s: Wrong values for input argument #%d: Elements must be in increasing order.\n"), name.data(), 3);
+            FREE(gdim.dims);
+            FREE(gdim.howmany_dims);
+            FREE(Sel);
+            return types::Function::Error;
+        }
+    }
+
+    /* Create  gdim struct */
+    gdim.rank = rank;
+    if ((gdim.dims = (fftw_iodim *)MALLOC(sizeof(fftw_iodim) * gdim.rank)) == nullptr)
+    {
+        Scierror(999, _("%s: Cannot allocate more memory.\n"), name.data());
+        FREE(gdim.dims);
+        FREE(gdim.howmany_dims);
+        FREE(Sel);
+        return types::Function::Error;
+    }
+
+    pd = 1; /* used to store prod(Dims(1:sel(k-1)))*/
+    pds = 1; /* used to store prod(Dims(sel(k-1):sel(k)))*/
+    j = 0;
+    for (i = 0; i < ndimsA; i++)
+    {
+        if (j >= gdim.rank)
+        {
+            break;
+        }
+        if (Sel[j] == i + 1)
+        {
+            gdim.dims[j].n = dimsA[i];
+            gdim.dims[j].is = pd;
+            gdim.dims[j].os = pd;
+            j++;
+        }
+        pd *= dimsA[i];
+    }
+    /* Compute howmany_rank based on jumps in the Sel sequence */
+    gdim.howmany_rank = 0;
+    if ((Sel[0] != 1) && (Sel[0] != ndimsA))
+    {
+        gdim.howmany_rank++;
+    }
+    for (i = 1; i <= rank - 1; i++)
+    {
+        if (Sel[i] != Sel[i - 1] + 1)
+        {
+            /*check if all dimensions between Sel[i-1]+1 and Sel[i]-1 are
+            equal to one, in this case they can be ignored and there is
+            no jump*/
+            for (j = Sel[i - 1] + 1; j <= Sel[i] - 1; j++)
+            {
+                if (dimsA[j - 1] != 1)
+                {
+                    gdim.howmany_rank++;
+                    break;
+                }
+            }
+        }
+    }
+
+    if ((Sel[rank - 1] != ndimsA) || (rank == 1))
+    {
+        gdim.howmany_rank++;
+    }
+    /* Fill the howmany_dims struct */
+    if (gdim.howmany_rank > 0)
+    {
+        /* it must be the case */
+        if ((gdim.howmany_dims = (fftw_iodim *)MALLOC(gdim.howmany_rank * sizeof(fftw_iodim))) == nullptr)
+        {
+            Scierror(999, _("%s: Cannot allocate more memory.\n"), name.data());
+            FREE(gdim.dims);
+            FREE(gdim.howmany_dims);
+            FREE(Sel);
+            return types::Function::Error;
+        }
+        pd = 1;
+        for (j = 1; j <= (Sel[0] - 1); j++)
+        {
+            pd *= dimsA[j - 1];    /*prod(Dims(1:(sel(1)-1)))*/
+        }
+        ih = 0;
+        if ((Sel[0] != 1) && (Sel[0] != ndimsA))
+        {
+            /* First seleted dimension */
+            gdim.howmany_dims[ih].is = 1;
+            gdim.howmany_dims[ih].os = 1;
+            gdim.howmany_dims[ih].n = pd;
+            ih++;
+        }
+        pd *= dimsA[Sel[0] - 1]; /*prod(Dims(1:sel(1)))*/
+        for (i = 1; i <= rank - 1; i++)
+        {
+            /* intermediate selected dimensions */
+            if (Sel[i] != Sel[i - 1] + 1)
+            {
+                pds = 1;
+                for (j = (Sel[i - 1] + 1); j <= (Sel[i] - 1); j++)
+                {
+                    pds *= dimsA[j - 1];    /*prod(Dims(sel(i-1)+1:(sel(i)-1)))*/
+                }
+                /*check again if all dimensions between Sel[i-1]+1 and
+                Sel[i]-1 are equal to one, in this case they can be
+                ignored and there is no jump*/
+                for (j = (Sel[i - 1] + 1); j <= (Sel[i] - 1); j++)
+                {
+                    if (dimsA[j - 1] != 1)
+                    {
+                        gdim.howmany_dims[ih].is = pd;
+                        gdim.howmany_dims[ih].os = pd;
+                        gdim.howmany_dims[ih].n = pds;
+                        ih++;
+                        break;
+                    }
+                }
+            }
+            pd *= pds * dimsA[Sel[i] - 1]; /*prod(Dims(1:sel(i)))*/
+        }
+
+        if (Sel[rank - 1] != ndimsA)
+        {
+            /* last selected dimension*/
+            pds = 1;
+            for (j = (Sel[rank - 1] + 1); j <= ndimsA; j++)
+            {
+                pds *= dimsA[j - 1];    /*prod(Dims(sel(i-1)+1:(sel(i)-1)))*/
+            }
+            gdim.howmany_dims[ih].is = pd;
+            gdim.howmany_dims[ih].os = pd;
+            gdim.howmany_dims[ih].n = pds;
+            ih++;
+        }
+        else if (rank == 1)
+        {
+            /* the only selected dimension is the last one */
+            gdim.howmany_dims[ih].is = 1;
+            gdim.howmany_dims[ih].os = 1;
+            gdim.howmany_dims[ih].n = pd / dimsA[Sel[0] - 1];
+            ih++;
+        }
+    }
+
+    //fftw functions work "in place", so we need to clone input data.
+    types::Double* D = nullptr;// A->clone()->getAs<types::Double>();
+    if (!func(name.data(), A, &D, way, gdim, opt))
+    {
+        FREE(gdim.dims);
+        FREE(gdim.howmany_dims);
+        FREE(Sel);
+        return types::Function::Error;
+    }
+
+    out.push_back(D);
+    return types::Function::OK;
+}
+
+types::Function::ReturnValue common_4args(std::string& name, types::typed_list &in, int _iRetCount, types::typed_list &out, fftw_gen func, int way, int opt)
+{
+    //getting the array A
+    types::Double* A = in[0]->getAs<types::Double>();
+    int ndimsA = A->getDims();
+    int *dimsA = A->getDimsArray();
+
+    /* Input  array variables */
+    int *Dim1 = nullptr;
+    int ndims = 0;
+    int *Incr = nullptr;
+    int nincr = 0;
+
+    /*FFTW specific library variable */
+    guru_dim_struct gdim = {0, NULL, 0, NULL};
+    /* input/output address for transform variables */
+
+    /* local variable */
+    int *Dim = nullptr, *Sel = nullptr;
+    int pd = 1;
+    int pds = 1;
+    int nd = 0;
+    int rank = 0;
+    int i = 0, j = 0, k = 0, lA = 1;
+
+    for (i = 0; i < ndimsA; i++)
+    {
+        lA *= dimsA[i];
+    }
+
+    /* void or scalar input gives void output or scalar*/
+    if (lA == 0)
+    {
+        out.push_back(A);
+        return types::Function::OK;
+    }
+
+    if (in[2]->isGenericType() == false)
+    {
+        Scierror(999, _("%s: Wrong type for input argument #%d.\n"), name.data(), 3);
+        FREE(gdim.dims);
+        FREE(gdim.howmany_dims);
+    }
+
+    getVarAsDims(in[2], ndims, Dim1);
+    /* check values of Dim1[i] */
+    pd = 1;
+    for (i = 0; i < ndims; i++)
+    {
+        if (Dim1[i] <= 1)
+        {
+            Scierror(999, _("%s: Wrong values for input argument #%d: Elements must be greater than %d.\n"), name.data(), 3, 1);
+            FREE(Dim1);
+            FREE(gdim.dims);
+            FREE(gdim.howmany_dims);
+            return types::Function::Error;
+        }
+        pd *= Dim1[i];
+    }
+    if (pd > lA)
+    {
+        Scierror(999, _("%s: Wrong values for input argument #%d: Must be less than %d.\n"), name.data(), 3, lA);
+        FREE(Dim1);
+        FREE(gdim.dims);
+        FREE(gdim.howmany_dims);
+        return types::Function::Error;
+    }
+    if (lA % pd)
+    {
+        Scierror(999, _("%s: Wrong values for input argument #%d: Must be a divisor of %d.\n"), name.data(), 3, lA);
+        FREE(Dim1);
+        FREE(gdim.dims);
+        FREE(gdim.howmany_dims);
+        return types::Function::Error;
+    }
+
+    if (in[3]->isGenericType() == false)
+    {
+        Scierror(999, _("%s: Wrong type for input argument #%d.\n"), name.data(), 4);
+        FREE(Dim1);
+        FREE(gdim.dims);
+        FREE(gdim.howmany_dims);
+    }
+
+    getVarAsDims(in[3], nincr, Incr);
+
+    if (nincr != ndims)
+    {
+        Scierror(999, _("%s: Incompatible input arguments #%d and #%d: Same sizes expected.\n"), name.data(), 3, 4);
+        FREE(Dim1);
+        FREE(Incr);
+        FREE(Dim);
+        FREE(Sel);
+        FREE(gdim.dims);
+        FREE(gdim.howmany_dims);
+        return types::Function::Error;
+    }
+
+    /* check values of Incr[i] */
+    if (Incr[0] <= 0)
+    {
+        Scierror(999, _("%s: Wrong values for input argument #%d: Positive integers expected.\n"), name.data(), 4);
+        FREE(Dim1);
+        FREE(Incr);
+        FREE(gdim.dims);
+        FREE(gdim.howmany_dims);
+        return types::Function::Error;
+    }
+    for (i = 0; i < ndims; i++)
+    {
+        if (lA % Incr[i])
+        {
+            Scierror(999, _("%s: Wrong values for input argument #%d: Elements must be divisors of %d.\n"), name.data(), 3, lA);
+            FREE(Dim1);
+            FREE(Incr);
+            FREE(gdim.dims);
+            FREE(gdim.howmany_dims);
+            return types::Function::Error;
+        }
+        if (i > 0 && (Incr[i] <= Incr[i - 1]))
+        {
+            Scierror(999, _("%s: Wrong values for input argument #%d: Elements must be in increasing ""order.\n"), name.data(), 4);
+            FREE(Dim1);
+            FREE(Incr);
+            FREE(gdim.dims);
+            FREE(gdim.howmany_dims);
+            return types::Function::Error;
+        }
+    }
+    if ((Dim = (int *)MALLOC((2 * ndims + 1) * sizeof(int))) == nullptr)
+    {
+        Scierror(999, _("%s: Cannot allocate more memory.\n"), name.data());
+        FREE(Dim1);
+        FREE(Incr);
+        FREE(Dim);
+        FREE(gdim.dims);
+        FREE(gdim.howmany_dims);
+        return types::Function::Error;
+    }
+    if ((Sel = (int *)MALLOC((ndims) * sizeof(int))) == nullptr)
+    {
+        Scierror(999, _("%s: Cannot allocate more memory.\n"), name.data());
+        FREE(Dim1);
+        FREE(Incr);
+        FREE(Dim);
+        FREE(Sel);
+        FREE(gdim.dims);
+        FREE(gdim.howmany_dims);
+        return types::Function::Error;
+    }
+
+
+    /*Transform  Dim1 and Incr into Dim and Sel and check validity*/
+
+    nd = 0;
+    pd = 1;
+    if (Incr[0] != 1)
+    {
+        Dim[nd++] = Incr[0];
+        pd *= Incr[0];
+    }
+    Dim[nd++] = Dim1[0];
+    pd *= Dim1[0];
+    Sel[0] = nd;
+
+    for (k = 1; k < ndims; k++)
+    {
+        if (Incr[k] % pd != 0)
+        {
+            Scierror(999, _("%s: Incompatible input arguments #%d and #%d.\n"), name.data(), 3, 4);
+            FREE(Dim1);
+            FREE(Incr);
+            FREE(Dim);
+            FREE(Sel);
+            FREE(gdim.dims);
+            FREE(gdim.howmany_dims);
+            return types::Function::Error;
+        }
+        if (Incr[k] != pd)
+        {
+            Dim[nd++] = (int)(Incr[k] / pd);
+            pd = Incr[k];
+        }
+        Dim[nd++] = Dim1[k];
+        pd *= Dim1[k];
+        Sel[k] = nd;
+    }
+    if (pd < lA)
+    {
+        if (lA % pd != 0)
+        {
+            Scierror(999, _("%s: Incompatible input arguments #%d and #%d.\n"), name.data(), 3, 4);
+            FREE(Dim1);
+            FREE(Incr);
+            FREE(Dim);
+            FREE(Sel);
+            FREE(gdim.dims);
+            FREE(gdim.howmany_dims);
+            return types::Function::Error;
+        }
+        Dim[nd++] = (int)(lA / pd);
+    }
+
+    rank = ndims;
+    ndims = nd;
+    /* now  same algorithm than sci_dct_3args applies */
+    /* Create  gdim struct */
+    gdim.rank = rank;
+    if ((gdim.dims = (fftw_iodim *)MALLOC(sizeof(fftw_iodim) * gdim.rank)) == nullptr)
+    {
+        Scierror(999, _("%s: Cannot allocate more memory.\n"), name.data());
+        FREE(Dim1);
+        FREE(Incr);
+        FREE(Dim);
+        FREE(Sel);
+        FREE(gdim.dims);
+        FREE(gdim.howmany_dims);
+        return types::Function::Error;
+    }
+
+    pd = 1; /* used to store prod(Dims(1:sel(k-1)))*/
+    pds = 1; /* used to store prod(Dims(sel(k-1):sel(k)))*/
+    j = 0;
+    for (i = 0; i < ndims; i++)
+    {
+        if (j >= gdim.rank)
+        {
+            break;
+        }
+        if (Sel[j] == i + 1)
+        {
+            gdim.dims[j].n = Dim[i];
+            gdim.dims[j].is = pd;
+            gdim.dims[j].os = pd;
+            j++;
+        }
+        pd *= Dim[i];
+    }
+    /* Compute howmany_rank based on jumps in the Sel sequence */
+    gdim.howmany_rank = 0;
+    if ((Sel[0] != 1) && (Sel[0] != ndims))
+    {
+        gdim.howmany_rank++;
+    }
+
+    for (i = 1; i <= rank - 1; i++)
+    {
+        if (Sel[i] != Sel[i - 1] + 1)
+        {
+            /*check if all dimensions between Sel[i-1]+1 and Sel[i]-1 are
+            equal to one, in this case they can be ignored and there is
+            no jump*/
+            for (j = Sel[i - 1] + 1; j <= Sel[i] - 1; j++)
+            {
+                if (Dim[j - 1] != 1)
+                {
+                    gdim.howmany_rank++;
+                    break;
+                }
+            }
+        }
+    }
+    if ((Sel[rank - 1] != ndims) || (rank == 1))
+    {
+        gdim.howmany_rank++;
+    }
+    /* Fill the howmany_dims struct */
+    if (gdim.howmany_rank > 0)
+    {
+        /* it must be the case */
+        int ih = 0;
+
+        if ((gdim.howmany_dims = (fftw_iodim *)MALLOC(gdim.howmany_rank * sizeof(fftw_iodim))) == nullptr)
+        {
+            Scierror(999, _("%s: Cannot allocate more memory.\n"), name.data());
+            FREE(Dim1);
+            FREE(Incr);
+            FREE(Dim);
+            FREE(Sel);
+            FREE(gdim.dims);
+            FREE(gdim.howmany_dims);
+            return types::Function::Error;
+        }
+        pd = 1;
+        for (j = 1; j <= (Sel[0] - 1); j++)
+        {
+            pd *= Dim[j - 1];    /*prod(Dims(1:(sel(1)-1)))*/
+        }
+        ih = 0;
+        if ((Sel[0] != 1) && (Sel[0] != ndims))
+        {
+            /* First seleted dimension */
+            gdim.howmany_dims[ih].is = 1;
+            gdim.howmany_dims[ih].os = 1;
+            gdim.howmany_dims[ih].n = pd;
+            ih++;
+        }
+        pd *= Dim[Sel[0] - 1]; /*prod(Dims(1:sel(1)))*/
+
+        for (i = 1; i <= rank - 1; i++)
+        {
+            /* intermediate selected dimensions */
+            if (Sel[i] != Sel[i - 1] + 1)
+            {
+                pds = 1;
+                for (j = (Sel[i - 1] + 1); j <= (Sel[i] - 1); j++)
+                {
+                    pds *= Dim[j - 1];    /*prod(Dims(sel(i-1)+1:(sel(i)-1)))*/
+                }
+                /*check again if all dimensions between Sel[i-1]+1 and
+                Sel[i]-1 are equal to one, in this case they can be
+                ignored and there is no jump*/
+                for (j = (Sel[i - 1] + 1); j <= (Sel[i] - 1); j++)
+                {
+                    if (Dim[j - 1] != 1)
+                    {
+                        gdim.howmany_dims[ih].is = pd;
+                        gdim.howmany_dims[ih].os = pd;
+                        gdim.howmany_dims[ih].n = pds;
+                        ih++;
+                        break;
+                    }
+                }
+            }
+
+            pd *= pds * Dim[Sel[i] - 1]; /*prod(Dims(1:sel(i)))*/
+        }
+
+        if (Sel[rank - 1] != ndims)
+        {
+            /* last selected dimension*/
+            pds = 1;
+            for (j = (Sel[rank - 1] + 1); j <= ndims; j++)
+            {
+                pds *= Dim[j - 1];    /*prod(Dims(sel(i-1)+1:(sel(i)-1)))*/
+            }
+            gdim.howmany_dims[ih].is = pd;
+            gdim.howmany_dims[ih].os = pd;
+            gdim.howmany_dims[ih].n = pds;
+            ih++;
+        }
+        else if (rank == 1) /* the only selected dimension is the last one */
+        {
+            gdim.howmany_dims[ih].is = 1;
+            gdim.howmany_dims[ih].os = 1;
+            gdim.howmany_dims[ih].n = pd / Dim[Sel[0] - 1];
+            ih++;
+        }
+    }
+
+    //fftw functions work "in place", so we need to clone input data.
+    types::Double* D = nullptr;// A->clone()->getAs<types::Double>();
+    if (!func(name.data(), A, &D, way, gdim, opt))
+    {
+        FREE(Dim1);
+        FREE(Incr);
+        FREE(Dim);
+        FREE(Sel);
+        FREE(gdim.dims);
+        FREE(gdim.howmany_dims);
+        return types::Function::Error;
+    }
+
+    FREE(Dim1);
+    FREE(Incr);
+    FREE(Dim);
+    FREE(Sel);
+    FREE(gdim.dims);
+    FREE(gdim.howmany_dims);
+
+    out.push_back(D);
+    return types::Function::OK;
+}
+
+void getVarAsDims(types::InternalType* t, int& rank, int*& Sel)
+{
+    switch (t->getType())
+    {
+        case types::InternalType::ScilabDouble:
+        {
+            getVarAsDims(t->getAs<types::Double>(), rank, Sel);
+            break;
+        }
+        case types::InternalType::ScilabInt8:
+        {
+            getVarAsDims(t->getAs<types::Int8>(), rank, Sel);
+            break;
+        }
+        case types::InternalType::ScilabInt16:
+        {
+            getVarAsDims(t->getAs<types::Int16>(), rank, Sel);
+            break;
+        }
+        case types::InternalType::ScilabInt32:
+        {
+            getVarAsDims(t->getAs<types::Int32>(), rank, Sel);
+            break;
+        }
+        case types::InternalType::ScilabInt64:
+        {
+            getVarAsDims(t->getAs<types::Int64>(), rank, Sel);
+            break;
+        }
+        case types::InternalType::ScilabUInt8:
+        {
+            getVarAsDims(t->getAs<types::UInt8>(), rank, Sel);
+            break;
+        }
+        case types::InternalType::ScilabUInt16:
+        {
+            getVarAsDims(t->getAs<types::UInt16>(), rank, Sel);
+            break;
+        }
+        case types::InternalType::ScilabUInt32:
+        {
+            getVarAsDims(t->getAs<types::UInt32>(), rank, Sel);
+            break;
+        }
+        case types::InternalType::ScilabUInt64:
+        {
+            getVarAsDims(t->getAs<types::UInt64>(), rank, Sel);
+            break;
+        }
+    }
+}
+
+template<class T>
+void getVarAsDims(T* t, int& dims, int*& pdims)
+{
+    dims = t->getSize();
+    pdims = new int[dims];
+    for (int i = 0; i < dims; ++i)
+    {
+        pdims[i] = static_cast<int>(t->get(i));
+    }
+}
diff --git a/scilab/modules/fftw/src/cpp/fftw_common.hxx b/scilab/modules/fftw/src/cpp/fftw_common.hxx
new file mode 100644 (file)
index 0000000..35b32c3
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+*  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+*  Copyright (C) 2015 - Scilab Enterprises - Antoine ELIAS
+*
+*  This file must be used under the terms of the CeCILL.
+*  This source file is licensed as described in the file COPYING, which
+*  you should have received as part of this distribution.  The terms
+*  are also available at
+*  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+*
+*/
+
+#include "double.hxx"
+extern "C"
+{
+#include "fftw_utilities.h"
+}
+
+typedef int(*fftw_gen)(const char *fname, types::Double* A, types::Double** O, int isn, guru_dim_struct gdim, int iopt);
+
+types::Function::ReturnValue fftw_common(std::wstring& name, types::typed_list &in, int _iRetCount, types::typed_list &out, fftw_gen func);
+types::Function::ReturnValue common_2args(std::string& name, types::typed_list &in, int _iRetCount, types::typed_list &out, fftw_gen func, int way, int opt);
+types::Function::ReturnValue common_3args(std::string& name, types::typed_list &in, int _iRetCount, types::typed_list &out, fftw_gen func, int way, int opt);
+types::Function::ReturnValue common_4args(std::string& name, types::typed_list &in, int _iRetCount, types::typed_list &out, fftw_gen func, int way, int opt);
+
+template<class T>
+void getVarAsDims(T* t, int& dims, int*& pdims);
+void getVarAsDims(types::InternalType* t, int& dims, int*& pdims);
+
diff --git a/scilab/modules/fftw/tests/nonreg_tests/bug_9647.dia.ref b/scilab/modules/fftw/tests/nonreg_tests/bug_9647.dia.ref
deleted file mode 100644 (file)
index 690669b..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-// =============================================================================
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) 2011 - DIGITEO - Allan CORNET
-//
-//  This file is distributed under the same license as the Scilab package.
-// =============================================================================
-//
-// <-- CLI SHELL MODE -->
-//
-// <-- Non-regression test for bug 9647 -->
-//
-// <-- Bugzilla URL -->
-// http://bugzilla.scilab.org/show_bug.cgi?id=9647
-//
-// <-- Short Description -->
-// On Scilab startup, the variable fft was declared by default while it should not.
-//
-if %fftw then
-    assert_checkequal(isdef("fft"), %T);
-    assert_checkequal(funptr("fft"), funptr("fftw"));
-else
-    assert_checkequal(isdef("fft"), %F);
-end
diff --git a/scilab/modules/fftw/tests/nonreg_tests/bug_9647.tst b/scilab/modules/fftw/tests/nonreg_tests/bug_9647.tst
deleted file mode 100644 (file)
index a9842b1..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-// =============================================================================
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) 2011 - DIGITEO - Allan CORNET
-//
-//  This file is distributed under the same license as the Scilab package.
-// =============================================================================
-//
-// <-- CLI SHELL MODE -->
-//
-// <-- Non-regression test for bug 9647 -->
-//
-// <-- Bugzilla URL -->
-// http://bugzilla.scilab.org/show_bug.cgi?id=9647
-//
-// <-- Short Description -->
-// On Scilab startup, the variable fft was declared by default while it should not.
-//
-
-if %fftw then
-    assert_checkequal(isdef("fft"), %T);
-    assert_checkequal(funptr("fft"), funptr("fftw"));
-else
-    assert_checkequal(isdef("fft"), %F);
-end