update toolbox skeleton to scilab 6 and allow link on c++ gateway 44/14444/5
Antoine ELIAS [Tue, 22 Apr 2014 08:41:22 +0000 (10:41 +0200)]
Change-Id: Iead24d20d798901f87cce1acc763550f0bac56ca

33 files changed:
scilab/contrib/toolbox_skeleton/builder.sce
scilab/contrib/toolbox_skeleton/etc/toolbox_skeleton.quit
scilab/contrib/toolbox_skeleton/etc/toolbox_skeleton.start
scilab/contrib/toolbox_skeleton/sci_gateway/builder_gateway.sce
scilab/contrib/toolbox_skeleton/sci_gateway/c/sci_cerror.c
scilab/contrib/toolbox_skeleton/sci_gateway/c/sci_csub.c
scilab/contrib/toolbox_skeleton/sci_gateway/c/sci_csum.c
scilab/contrib/toolbox_skeleton/sci_gateway/c/sci_foo.c
scilab/contrib/toolbox_skeleton/sci_gateway/c/sci_multiplybypi.c
scilab/contrib/toolbox_skeleton/sci_gateway/cpp/builder_gateway_cpp.sce
scilab/contrib/toolbox_skeleton/sci_gateway/cpp/sci_cpp_find.cxx
scilab/contrib/toolbox_skeleton/sci_gateway/cpp/sci_cpperror.cpp [new file with mode: 0644]
scilab/contrib/toolbox_skeleton/sci_gateway/cpp/sci_cppfoo.cpp [new file with mode: 0644]
scilab/contrib/toolbox_skeleton/sci_gateway/cpp/sci_cppmultiplybypi.cpp [new file with mode: 0644]
scilab/contrib/toolbox_skeleton/sci_gateway/cpp/sci_cppsub.cpp [new file with mode: 0644]
scilab/contrib/toolbox_skeleton/sci_gateway/cpp/sci_cppsum.cpp [new file with mode: 0644]
scilab/contrib/toolbox_skeleton/sci_gateway/fortran/sci_fsum.c
scilab/contrib/toolbox_skeleton/src/builder_src.sce
scilab/modules/dynamic_link/macros/ilib_build.sci
scilab/modules/dynamic_link/macros/ilib_compile.sci
scilab/modules/dynamic_link/macros/ilib_gen_gateway.sci
scilab/modules/dynamic_link/macros/windows/dlwGenerateMakefile.sci
scilab/modules/dynamic_link/macros/windows/dlwGetScilabIncludes.sci
scilab/modules/dynamic_link/sci_gateway/cpp/sci_ulink.cpp
scilab/modules/modules_manager/help/en_US/tbx_build_gateway.xml
scilab/modules/symbol/includes/addGatewayInContext.h [deleted file]
scilab/modules/symbol/includes/scope.hxx
scilab/modules/symbol/includes/variables.hxx
scilab/modules/symbol/src/cpp/context.cpp
scilab/modules/symbol/src/cpp/scope.cpp
scilab/modules/symbol/symbol.vcxproj
scilab/modules/symbol/symbol.vcxproj.filters
scilab/modules/types/includes/cpp_gateway_prototype.hxx

index 8aed84e..7c080d9 100644 (file)
@@ -8,6 +8,7 @@ lines(0);
 
 function main_builder()
 
+    setenv('DEBUG_SCILAB_DYNAMIC_LINK','YES')
     TOOLBOX_NAME  = "toolbox_skeleton";
     TOOLBOX_TITLE = "Toolbox Skeleton";
     toolbox_dir   = get_absolute_file_path("builder.sce");
@@ -40,7 +41,7 @@ function main_builder()
     tbx_builder_src(toolbox_dir);
     tbx_builder_gateway(toolbox_dir);
     tbx_build_localization(TOOLBOX_NAME, toolbox_dir);
-    tbx_builder_help(toolbox_dir);
+    //tbx_builder_help(toolbox_dir);
     tbx_build_loader(TOOLBOX_NAME, toolbox_dir);
     tbx_build_cleaner(TOOLBOX_NAME, toolbox_dir);
 
index 6b6e145..37a7d3e 100644 (file)
@@ -4,15 +4,31 @@
 
 function quitModule()
 
-  etc_tlbx  = get_absolute_file_path("toolbox_skeleton.quit"); 
-  etc_tlbx  = getshortpathname(etc_tlbx);
-  root_tlbx = strncpy( etc_tlbx, length(etc_tlbx)-length("\etc\") );
+    etc_tlbx  = get_absolute_file_path("toolbox_skeleton.quit");
+    etc_tlbx  = getshortpathname(etc_tlbx);
+    root_tlbx = strncpy( etc_tlbx, length(etc_tlbx)-length("\etc\") );
 
-  // Remove Preferences GUI
-  // =============================================================================
-  if getscilabmode() == "STD" then
+    //unlink libraries
+    [bOK, ilib] = c_link('skeleton_cpp');
+    if bOK then
+        ulink(ilib);
+    end
+
+    [bOK, ilib] = c_link('skeleton_c');
+    if bOK then
+        ulink(ilib);
+    end
+
+    [bOK, ilib] = c_link('skeleton_fortran');
+    if bOK then
+        ulink(ilib);
+    end
+
+    // Remove Preferences GUI
+    // =============================================================================
+    if getscilabmode() == "STD" then
     removeModulePreferences(root_tlbx);
-  end
+    end
 
 endfunction
 
index 6ad227b..da9b1cb 100644 (file)
@@ -32,7 +32,7 @@ function toolbox_skeletonlib = startModule()
   mprintf("\tLoad gateways\n");
   exec(pathconvert(root_tlbx+"/sci_gateway/loader_gateway.sce",%f));
   mprintf("\tLoad Java libraries\n");
-  exec(pathconvert(root_tlbx+"/src/java/loader.sce",%f));
+  //exec(pathconvert(root_tlbx+"/src/java/loader.sce",%f));
   ilib_verbose(verboseMode);
 
 // load localization
@@ -40,13 +40,13 @@ function toolbox_skeletonlib = startModule()
 
 // Load and add help chapter
 // =============================================================================
-  if or(getscilabmode() == ["NW";"STD"]) then
-    mprintf("\tLoad help\n");
-    path_addchapter = pathconvert(root_tlbx+"/jar");
-    if ( isdir(path_addchapter) <> [] ) then
-      add_help_chapter(TOOLBOX_NAME, path_addchapter, %F);
-    end
-  end
+//  if or(getscilabmode() == ["NW";"STD"]) then
+//    mprintf("\tLoad help\n");
+//    path_addchapter = pathconvert(root_tlbx+"/jar");
+//    if ( isdir(path_addchapter) <> [] ) then
+//      add_help_chapter(TOOLBOX_NAME, path_addchapter, %F);
+//    end
+//  end
 
 // Load demos
 // =============================================================================
index 5fceee2..0db1558 100644 (file)
@@ -3,7 +3,7 @@
 function builder_gateway()
 
     sci_gateway_dir = get_absolute_file_path("builder_gateway.sce");
-    languages       = ["fortran" "c" "cpp"];
+    languages       = ["c" "fortran" "cpp"];
 
     tbx_builder_gateway_lang(languages,sci_gateway_dir);
     tbx_build_gateway_loader(languages,sci_gateway_dir);
index c6071a8..0ea4437 100644 (file)
@@ -8,7 +8,7 @@
 #include <localization.h>
 
 /* ==================================================================== */
-int sci_cerror(char *fname)
+int sci_cerror(char *fname, void* pvApiCtx)
 {
     int iRhs = nbInputArgument(pvApiCtx);
 
index a510be8..4947db8 100644 (file)
@@ -9,7 +9,7 @@
 #include <localization.h>
 
 /* ==================================================================== */
-int sci_csub(char *fname)
+int sci_csub(char *fname, void* pvApiCtx)
 {
     SciErr sciErr;
 
index a4729c5..9e04479 100644 (file)
@@ -9,7 +9,7 @@
 #include <localization.h>
 
 /* ==================================================================== */
-int sci_csum(char *fname)
+int sci_csum(char *fname, void* pvApiCtx)
 {
     SciErr sciErr;
 
index 976a9f7..920db15 100644 (file)
@@ -8,7 +8,7 @@
 #include <localization.h>
 
 /* ==================================================================== */
-int sci_foo(char *fname, unsigned long fname_len)
+int sci_foo(char *fname, void* pvApiCtx)
 {
     // Error management variable
     SciErr sciErr;
index edd5b70..2467a75 100644 (file)
@@ -9,7 +9,7 @@
 #include <localization.h>
 
 /* ==================================================================== */
-int sci_multiplybypi(char *fname)
+int sci_multiplybypi(char *fname, void* pvApiCtx)
 {
     SciErr sciErr;
 
index 0743045..c691b1a 100644 (file)
@@ -2,10 +2,20 @@
 
 function builder_gw_cpp()
 
+    includes_src_c = ilib_include_flag(get_absolute_file_path("builder_gateway_cpp.sce") + "../../src/c");
+
     tbx_build_gateway("skeleton_cpp", ..
-    ["cpp_find","sci_cpp_find"], ..
-    ["sci_cpp_find.cxx"], ..
-    get_absolute_file_path("builder_gateway_cpp.sce"));
+        ["cpp_find","sci_cpp_find", "csci"; ..
+        "cpp_error", "sci_cpperror", "cppsci"; ..
+        "cpp_foo", "sci_cppfoo", "cppsci"; ..
+        "cpp_sum", "sci_cppsum", "cppsci"; ..
+        "cpp_sub", "sci_cppsub", "cppsci"; ..
+        "cpp_multiplybypi", "sci_cppmultiplybypi", "cppsci"], ..
+        ["sci_cpp_find.cxx", "sci_cpperror.cpp", "sci_cppfoo.cpp", "sci_cppsum.cpp", "sci_cppsub.cpp", "sci_cppmultiplybypi.cpp"], ..
+        get_absolute_file_path("builder_gateway_cpp.sce"), ..
+        ["../../src/c/libcsum"], ..
+        "", ..
+        includes_src_c);
 
 endfunction
 
index b0e7179..63dba83 100644 (file)
 /* ==================================================================== */
 extern "C" 
 {
-/* ==================================================================== */     
-  #include "api_scilab.h"
-  #include "Scierror.h"
-  #include "MALLOC.h"
-  #include <localization.h>
+    /* ==================================================================== */ 
+#include "api_scilab.h"
+#include "Scierror.h"
+#include "MALLOC.h"
+#include <localization.h>
 
-/* ==================================================================== */
-  int sci_cpp_find(char *fname) 
-  {
-    SciErr sciErr;
-    
-    int m1 = 0, n1 = 0;
-    int *piAddressVarOne = NULL;
-    char *pStVarOne = NULL;
-    int lenStVarOne = 0;
-    int iType1 = 0;
-    
-    int m2 = 0, n2 = 0;
-    int *piAddressVarTwo = NULL;
-    char *pStVarTwo = NULL;
-    int lenStVarTwo = 0;
-    int iType2 = 0;
-    
-    /* Check the number of input argument */
-    CheckInputArgument(pvApiCtx, 2,2); 
-    
-    /* Check the number of output argument */
-    CheckOutputArgument(pvApiCtx, 1,1);
-    
-    /* get Address of inputs */
-    sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddressVarOne);
-    if(sciErr.iErr)
-    {
-      printError(&sciErr, 0);
-      return 0;
-    }     
-    sciErr = getVarAddressFromPosition(pvApiCtx, 2, &piAddressVarTwo);
-    if(sciErr.iErr)
-    {
-      printError(&sciErr, 0);
-      return 0;
-    } 
-    
-    /* checks types */
-    sciErr = getVarType(pvApiCtx, piAddressVarOne, &iType1);
-    if(sciErr.iErr)
-    {
-      printError(&sciErr, 0);
-      return 0;
-    } 
-    
-    if ( iType1 != sci_strings )
-    {
-      Scierror(999,_("%s: Wrong type for input argument #%d: A string expected.\n"),fname,1);
-      return 0;
-    }
-  
-    sciErr = getVarType(pvApiCtx, piAddressVarTwo, &iType2);
-    if(sciErr.iErr)
-    {
-      printError(&sciErr, 0);
-      return 0;
-    } 
-    
-    if ( iType2 != sci_strings )
-    {
-      Scierror(999,_("%s: Wrong type for input argument #%d: A string expected.\n"),fname,2);
-      return 0;
-    }
-    
-    /* get strings */
-    
-    sciErr = getMatrixOfString(pvApiCtx, piAddressVarOne,&m1,&n1,&lenStVarOne,&pStVarOne);
-    if(sciErr.iErr)
-    {
-      printError(&sciErr, 0);
-      return 0;
-    } 
-    
-    /* check size */
-    if ( (m1 != n1) && (n1 != 1) ) 
+    /* ==================================================================== */
+    int sci_cpp_find(char *fname, void* pvApiCtx) 
     {
-      Scierror(999,_("%s: Wrong size for input argument #%d: A string expected.\n"),fname,1);
-      return 0;
-    }
-    /* alloc string */
-    pStVarOne = (char*)MALLOC(sizeof(char)*(lenStVarOne + 1));
-    /* get string One */
-    sciErr = getMatrixOfString(pvApiCtx, piAddressVarOne,&m1,&n1,&lenStVarOne,&pStVarOne);
-    if(sciErr.iErr)
-    {
-      printError(&sciErr, 0);
-      return 0;
-    } 
-    
-    sciErr = getMatrixOfString(pvApiCtx, piAddressVarTwo,&m2,&n2,&lenStVarTwo,&pStVarTwo);
-    if(sciErr.iErr)
-    {
-      printError(&sciErr, 0);
-      return 0;
-    } 
-    
-    if ( (m2 != n2) && (n2 != 1) ) 
-    {
-      Scierror(999,_("%s: Wrong size for input argument #%d: A string expected.\n"),fname,2);
-      return 0;
-    }
-    /* alloc string */
-    pStVarTwo = (char*)MALLOC(sizeof(char)*(lenStVarTwo + 1));
-    /* get string Two */
-    sciErr = getMatrixOfString(pvApiCtx, piAddressVarTwo,&m2,&n2,&lenStVarTwo,&pStVarTwo);
-    if(sciErr.iErr)
-    {
-      printError(&sciErr, 0);
-      return 0;
-    } 
-    
-    
-    std::string myMessage (pStVarOne);
-    if (pStVarOne)
-      {
-       FREE(pStVarOne); 
-       pStVarOne = NULL;
-      }
-       
-    std::string search(pStVarTwo);
-    if (pStVarTwo)
-      {
-       FREE(pStVarTwo);
-       pStVarTwo = NULL;
-      }
-
-    /* Where we will store the position */
-    double dOut = 0.0;
-    if (myMessage.find(search) != std::string::npos) 
-    {
-      /* The actual operation */
-      dOut = myMessage.find(search); 
-    } 
-    else 
-    {
-      dOut = -1; /* Substring not found */
+        SciErr sciErr;
+
+        int m1 = 0, n1 = 0;
+        int *piAddressVarOne = NULL;
+        char *pStVarOne = NULL;
+        int lenStVarOne = 0;
+        int iType1 = 0;
+
+        int m2 = 0, n2 = 0;
+        int *piAddressVarTwo = NULL;
+        char *pStVarTwo = NULL;
+        int lenStVarTwo = 0;
+        int iType2 = 0;
+
+        /* Check the number of input argument */
+        CheckInputArgument(pvApiCtx, 2,2); 
+
+        /* Check the number of output argument */
+        CheckOutputArgument(pvApiCtx, 1,1);
+
+        /* get Address of inputs */
+        sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddressVarOne);
+        if(sciErr.iErr)
+        {
+            printError(&sciErr, 0);
+            return 0;
+        }     
+        sciErr = getVarAddressFromPosition(pvApiCtx, 2, &piAddressVarTwo);
+        if(sciErr.iErr)
+        {
+            printError(&sciErr, 0);
+            return 0;
+        } 
+
+        /* checks types */
+        sciErr = getVarType(pvApiCtx, piAddressVarOne, &iType1);
+        if(sciErr.iErr)
+        {
+            printError(&sciErr, 0);
+            return 0;
+        } 
+
+        if ( iType1 != sci_strings )
+        {
+            Scierror(999,_("%s: Wrong type for input argument #%d: A string expected.\n"),fname,1);
+            return 0;
+        }
+
+        sciErr = getVarType(pvApiCtx, piAddressVarTwo, &iType2);
+        if(sciErr.iErr)
+        {
+            printError(&sciErr, 0);
+            return 0;
+        } 
+
+        if ( iType2 != sci_strings )
+        {
+            Scierror(999,_("%s: Wrong type for input argument #%d: A string expected.\n"),fname,2);
+            return 0;
+        }
+
+        /* get strings */
+
+        sciErr = getMatrixOfString(pvApiCtx, piAddressVarOne,&m1,&n1,&lenStVarOne,&pStVarOne);
+        if(sciErr.iErr)
+        {
+            printError(&sciErr, 0);
+            return 0;
+        } 
+
+        /* check size */
+        if ( (m1 != n1) && (n1 != 1) ) 
+        {
+            Scierror(999,_("%s: Wrong size for input argument #%d: A string expected.\n"),fname,1);
+            return 0;
+        }
+        /* alloc string */
+        pStVarOne = (char*)MALLOC(sizeof(char)*(lenStVarOne + 1));
+        /* get string One */
+        sciErr = getMatrixOfString(pvApiCtx, piAddressVarOne,&m1,&n1,&lenStVarOne,&pStVarOne);
+        if(sciErr.iErr)
+        {
+            printError(&sciErr, 0);
+            return 0;
+        } 
+
+        sciErr = getMatrixOfString(pvApiCtx, piAddressVarTwo,&m2,&n2,&lenStVarTwo,&pStVarTwo);
+        if(sciErr.iErr)
+        {
+            printError(&sciErr, 0);
+            return 0;
+        } 
+
+        if ( (m2 != n2) && (n2 != 1) ) 
+        {
+            Scierror(999,_("%s: Wrong size for input argument #%d: A string expected.\n"),fname,2);
+            return 0;
+        }
+        /* alloc string */
+        pStVarTwo = (char*)MALLOC(sizeof(char)*(lenStVarTwo + 1));
+        /* get string Two */
+        sciErr = getMatrixOfString(pvApiCtx, piAddressVarTwo,&m2,&n2,&lenStVarTwo,&pStVarTwo);
+        if(sciErr.iErr)
+        {
+            printError(&sciErr, 0);
+            return 0;
+        } 
+
+
+        std::string myMessage (pStVarOne);
+        if (pStVarOne)
+        {
+            FREE(pStVarOne); 
+            pStVarOne = NULL;
+        }
+
+        std::string search(pStVarTwo);
+        if (pStVarTwo)
+        {
+            FREE(pStVarTwo);
+            pStVarTwo = NULL;
+        }
+
+        /* Where we will store the position */
+        double dOut = 0.0;
+        if (myMessage.find(search) != std::string::npos) 
+        {
+            /* The actual operation */
+            dOut = myMessage.find(search); 
+        } 
+        else 
+        {
+            dOut = -1; /* Substring not found */
+        }
+
+        /* create result on stack */
+        int m_out = 1;
+        int n_out = 1;
+
+        createMatrixOfDouble(pvApiCtx, nbInputArgument(pvApiCtx) + 1, m_out, n_out, &dOut);
+
+        AssignOutputVariable(pvApiCtx, 1) = nbInputArgument(pvApiCtx) + 1; 
+
+        return 0;
     }
-    
-    /* create result on stack */
-    int m_out = 1;
-    int n_out = 1;
-    
-    createMatrixOfDouble(pvApiCtx, nbInputArgument(pvApiCtx) + 1, m_out, n_out, &dOut);
-    
-    AssignOutputVariable(pvApiCtx, 1) = nbInputArgument(pvApiCtx) + 1; 
-
-    return 0;
-       }
-/* ==================================================================== */     
+    /* ==================================================================== */ 
 } /* extern "C" */
 /* ==================================================================== */
diff --git a/scilab/contrib/toolbox_skeleton/sci_gateway/cpp/sci_cpperror.cpp b/scilab/contrib/toolbox_skeleton/sci_gateway/cpp/sci_cpperror.cpp
new file mode 100644 (file)
index 0000000..f98a820
--- /dev/null
@@ -0,0 +1,23 @@
+/* ==================================================================== */
+/* Template toolbox_skeleton */
+/* This file is released under the 3-clause BSD license. See COPYING-BSD. */
+/* ==================================================================== */
+#include "function.hxx"
+#include "Scierror.h"
+#include "localization.h"
+
+/* ==================================================================== */
+types::Function::ReturnValue sci_cpperror(types::typed_list &in, int _iRetCount, types::typed_list &out)
+{
+    if (in.size() != 1)
+    {
+        Scierror(999, _d("toolbox_skeleton", "%s: I'm waiting for only one argument.\n"), "cerror");
+        return types::Function::Error;
+    }
+    else
+    {
+        Scierror(999, _d("toolbox_skeleton", "%s: Yeah! %d is a good number of arguments but I prefer fail, sorry.\n"), "cerror", 1);
+        return types::Function::Error;
+    }
+}
+/* ==================================================================== */
diff --git a/scilab/contrib/toolbox_skeleton/sci_gateway/cpp/sci_cppfoo.cpp b/scilab/contrib/toolbox_skeleton/sci_gateway/cpp/sci_cppfoo.cpp
new file mode 100644 (file)
index 0000000..178d73f
--- /dev/null
@@ -0,0 +1,79 @@
+/* ==================================================================== */
+/* Template toolbox_skeleton */
+/* Example detail in "API_scilab getting started" help page */
+/* This file is released under the 3-clause BSD license. See COPYING-BSD. */
+/* ==================================================================== */
+#include "function.hxx"
+#include "double.hxx"
+#include "bool.hxx"
+
+extern "C"
+{
+#include "Scierror.h"
+#include "localization.h"
+}
+
+/* ==================================================================== */
+types::Function::ReturnValue sci_cppfoo(types::typed_list &in, int _iRetCount, types::typed_list &out)
+{
+    ////////// Check the number of input and output arguments //////////
+    /* --> [c, d] = foo(a, b) */
+    /* check that we have only 2 input arguments */
+    if (in.size() != 2)
+    {
+        Scierror(77, _("%s: Wrong number of input argument(s): %d expected.\n"), "cppfoo", 2);
+        return types::Function::Error;
+    }
+
+    /* check that we have only 2 output argument */
+    if (_iRetCount != 2)
+    {
+        Scierror(78, _("%s: Wrong number of output argument(s): %d expected."), "cppfoo", 2);
+        return types::Function::Error;
+    }
+
+    ////////// Manage the first input argument (double) //////////
+
+    /* Check that the first input argument is a real matrix (and not complex) */
+    if (in[0]->getType() != types::InternalType::RealDouble || in[0]->getAs<types::Double>()->isComplex())
+    {
+        Scierror(999, _("%s: Wrong type for input argument #%d: A real matrix expected.\n"), "cppfoo", 1);
+        return types::Function::Error;
+    }
+
+    types::Double* pdbl = in[0]->getAs<types::Double>();
+
+    ////////// Manage the second input argument (boolean) //////////
+    if (in[1]->getType() != types::InternalType::RealBool)
+    {
+        Scierror(999, _("%s: Wrong type for input argument #%d: A boolean matrix expected.\n"), "cppfoo", 2);
+        return types::Function::Error;
+    }
+
+    types::Bool* pb = in[0]->getAs<types::Bool>();
+
+
+    ////////// Application code //////////
+    // Could be replaced by a call to a library
+
+    types::Double* pOut1 = new types::Double(pdbl->getDims(), pdbl->getDimsArray());
+    for (int i = 0 ; i < pdbl->getSize() ; ++i)
+    {
+        /* For each element of the matrix, multiply by 2 */
+        pOut1->set(i, pdbl->get(i) * 2);
+    }
+
+    types::Bool* pOut2 = new types::Bool(pb->getDims(), pb->getDimsArray());
+    for (int i = 0 ; i < pb->getSize() ; ++i)
+    {
+        /* For each element of the matrix, invert the value */
+        pOut2->set(i, pb->get(i) == FALSE ? TRUE : FALSE);
+    }
+
+    ////////// return output parameters //////////
+    out.push_back(pOut1);
+    out.push_back(pOut2);
+    return types::Function::OK;
+}
+/* ==================================================================== */
+
diff --git a/scilab/contrib/toolbox_skeleton/sci_gateway/cpp/sci_cppmultiplybypi.cpp b/scilab/contrib/toolbox_skeleton/sci_gateway/cpp/sci_cppmultiplybypi.cpp
new file mode 100644 (file)
index 0000000..591c9db
--- /dev/null
@@ -0,0 +1,61 @@
+/* ==================================================================== */
+/* Template toolbox_skeleton */
+/* This file is released under the 3-clause BSD license. See COPYING-BSD. */
+/* ==================================================================== */
+#include "function.hxx"
+#include "double.hxx"
+#include "Scierror.h"
+#include "localization.h"
+
+extern "C"
+{
+#include "multiplybypi.h"
+}
+
+/* ==================================================================== */
+types::Function::ReturnValue sci_cppmultiplybypi(types::typed_list &in, int _iRetCount, types::typed_list &out)
+{
+    /* --> result = multiplybypi(8) */
+    /* --> result = multiplybypi([12, 42; 42, 12]) */
+
+    /* check that we have only 1 input argument */
+    if (in.size() != 1)
+    {
+        Scierror(77, _("%s: Wrong number of input argument(s): %d expected.\n"), "cppmultiplybypi", 1);
+        return types::Function::Error;
+    }
+
+    /* check that we have only 1 output argument */
+    if (_iRetCount != 1)
+    {
+        Scierror(78, _("%s: Wrong number of output argument(s): %d expected."), "cppmultiplybypi", 1);
+        return types::Function::Error;
+    }
+
+    /* check input type */
+    if (in[0]->getType() != types::InternalType::RealDouble)
+    {
+        Scierror(999, _("%s: Wrong type for input argument #%d: A matrix expected.\n"), "cppmultiplybypi", 1);
+        return types::Function::Error;
+    }
+
+    /* get matrix */
+    types::Double* pdblIn = in[0]->getAs<types::Double>();
+
+    //create output variable
+    types::Double* pdblOut = new types::Double(pdblIn->getDims(), pdblIn->getDimsArray());
+
+    /* The difference with the csum & csub is that we give the argument as copy
+     * and not as reference */
+    for (int i = 0 ; i < pdblIn->getSize() ; ++i)
+    {
+        /* For each element of the matrix, multiply by pi */
+        pdblOut->set(i, multiplybypi(pdblIn->get(i)));
+    }
+
+    //set output paramter
+    out.push_back(pdblOut);
+    return types::Function::OK;
+}
+/* ==================================================================== */
+
diff --git a/scilab/contrib/toolbox_skeleton/sci_gateway/cpp/sci_cppsub.cpp b/scilab/contrib/toolbox_skeleton/sci_gateway/cpp/sci_cppsub.cpp
new file mode 100644 (file)
index 0000000..b708ca6
--- /dev/null
@@ -0,0 +1,73 @@
+/* ==================================================================== */
+/* Template toolbox_skeleton */
+/* This file is released under the 3-clause BSD license. See COPYING-BSD. */
+/* ==================================================================== */
+#include "function.hxx"
+#include "double.hxx"
+#include "Scierror.h"
+#include "localization.h"
+
+extern "C"
+{
+#include "csub.h"
+}
+
+/* ==================================================================== */
+types::Function::ReturnValue sci_cppsub(types::typed_list &in, int _iRetCount, types::typed_list &out)
+{
+    /* --> result = csub(3,8)
+
+    /* check that we have only 2 input arguments */
+    if (in.size() != 2)
+    {
+        Scierror(77, _("%s: Wrong number of input argument(s): %d expected.\n"), "cpp_sub", 2);
+        return types::Function::Error;
+    }
+
+    /* check that we have only 1 output argument */
+    if (_iRetCount != 1)
+    {
+        Scierror(78, _("%s: Wrong number of output argument(s): %d expected."), "cpp_sub", 1);
+        return types::Function::Error;
+    }
+
+    if (in[0]->isDouble() == false)
+    {
+        Scierror(999, _("%s: Wrong type for input argument #%d: A scalar expected.\n"), "cpp_sub", 1);
+        return types::Function::Error;
+    }
+
+    types::Double* pIn1 = in[0]->getAs<types::Double>();
+
+    if (in[1]->isDouble() == false)
+    {
+        Scierror(999, _("%s: Wrong type for input argument #%d: A scalar expected.\n"), "cpp_sub", 2);
+        return types::Function::Error;
+    }
+
+    types::Double* pIn2 = in[1]->getAs<types::Double>();
+
+    /* check size */
+    if (pIn1->getSize() != 1)
+    {
+        Scierror(999, _("%s: Wrong size for input argument #%d: A scalar expected.\n"), "cpp_sub", 1);
+        return types::Function::Error;
+    }
+
+    if (pIn2->getSize() != 1)
+    {
+        Scierror(999, _("%s: Wrong size for input argument #%d: A scalar expected.\n"), "cpp_sub", 2);
+        return types::Function::Error;
+    }
+
+    types::Double* pOut = new types::Double(1, 1);
+    /* call c function csub */
+    csub(pIn1->get(), pIn2->get(), pOut->get());
+
+    /* return result */
+    out.push_back(pOut);
+
+    return types::Function::OK;
+}
+/* ==================================================================== */
+
diff --git a/scilab/contrib/toolbox_skeleton/sci_gateway/cpp/sci_cppsum.cpp b/scilab/contrib/toolbox_skeleton/sci_gateway/cpp/sci_cppsum.cpp
new file mode 100644 (file)
index 0000000..0d9d783
--- /dev/null
@@ -0,0 +1,73 @@
+/* ==================================================================== */
+/* Template toolbox_skeleton */
+/* This file is released under the 3-clause BSD license. See COPYING-BSD. */
+/* ==================================================================== */
+#include "function.hxx"
+#include "double.hxx"
+#include "Scierror.h"
+#include "localization.h"
+
+extern "C"
+{
+#include "csum.h"
+}
+
+/* ==================================================================== */
+types::Function::ReturnValue sci_cppsum(types::typed_list &in, int _iRetCount, types::typed_list &out)
+{
+    /* --> result = csum(3,8)
+
+    /* check that we have only 2 input arguments */
+    if (in.size() != 2)
+    {
+        Scierror(77, _("%s: Wrong number of input argument(s): %d expected.\n"), "cpp_sum", 2);
+        return types::Function::Error;
+    }
+
+    /* check that we have only 1 output argument */
+    if (_iRetCount != 1)
+    {
+        Scierror(78, _("%s: Wrong number of output argument(s): %d expected."), "cpp_sum", 1);
+        return types::Function::Error;
+    }
+
+    if (in[0]->isDouble() == false)
+    {
+        Scierror(999, _("%s: Wrong type for input argument #%d: A scalar expected.\n"), "cpp_sum", 1);
+        return types::Function::Error;
+    }
+
+    types::Double* pIn1 = in[0]->getAs<types::Double>();
+
+    if (in[1]->isDouble() == false)
+    {
+        Scierror(999, _("%s: Wrong type for input argument #%d: A scalar expected.\n"), "cpp_sum", 2);
+        return types::Function::Error;
+    }
+
+    types::Double* pIn2 = in[1]->getAs<types::Double>();
+
+    /* check size */
+    if (pIn1->getSize() != 1)
+    {
+        Scierror(999, _("%s: Wrong size for input argument #%d: A scalar expected.\n"), "cpp_sum", 1);
+        return types::Function::Error;
+    }
+
+    if (pIn2->getSize() != 1)
+    {
+        Scierror(999, _("%s: Wrong size for input argument #%d: A scalar expected.\n"), "cpp_sum", 2);
+        return types::Function::Error;
+    }
+
+    types::Double* pOut = new types::Double(1, 1);
+    /* call c function csub */
+    csum(pIn1->get(), pIn2->get(), pOut->get());
+
+    /* return result */
+    out.push_back(pOut);
+
+    return types::Function::OK;
+}
+/* ==================================================================== */
+
index afcbea0..d62ffcf 100644 (file)
@@ -10,7 +10,7 @@
 /* ==================================================================== */
 extern int F2C(fsum)(double *a, double *b, double *c);
 /* ==================================================================== */
-int sci_fsum(char *fname)
+int sci_fsum(char *fname, void* pvApiCtx)
 {
     SciErr sciErr;
 
index db7ff7f..9bd10ff 100644 (file)
@@ -1,7 +1,7 @@
 // This file is released under the 3-clause BSD license. See COPYING-BSD.
 
 function builder_src()
-    langage_src = ["fortran" "c" "java"];
+    langage_src = ["fortran" "c"];
     path_src = get_absolute_file_path("builder_src.sce");
     tbx_builder_src_lang(langage_src, path_src);
 endfunction
index 25e293c..c4dd19d 100644 (file)
@@ -127,7 +127,7 @@ function ilib_build(ilib_name, ..
     if ( ilib_verbose() <> 0 ) then
         mprintf(_("   Generate a cleaner file\n"));
     end
-    ilib_gen_cleaner(makename, "loader.sce", [libn; file_gw_name]);
+    ilib_gen_cleaner(makename, "loader.sce", [libn; file_gw_name']);
 
 endfunction
 //=============================================================================
index ef32de9..155db9b 100644 (file)
@@ -77,7 +77,7 @@ function libn = ilib_compile(lib_name, ..
         // Source tree version
         // Headers are dispatched in the source tree
         if isdir(SCI+"/modules/core/includes/") then
-            defaultModulesCHeader=[ "core", "mexlib","api_scilab","output_stream","localization", "operations", "symbol", "types" ];
+            defaultModulesCHeader=[ "core", "mexlib","api_scilab","output_stream","localization", "operations", "symbol", "types", "ast",  "dynamic_link"];
             defaultModulesFHeader=[ "core" ];
             ScilabTreeFound=%t
 
index 4a5dbbe..6a761e0 100644 (file)
@@ -9,7 +9,7 @@
 // http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
 
 //=============================================================================
-// ilib_gen_gateway used by ilib_build
+// ilib_gen_gateway_cpp used by ilib_build
 //=============================================================================
 // generate an interface gateway named name
 // from table table taking into account
@@ -24,7 +24,7 @@ function gateway_filename = ilib_gen_gateway(name,tables)
         return
     end
 
-    gateway_filename = "";
+    gateway_filename = ["","",""];
     k = strindex(name,["/","\"]);
     if k~=[] then
         path = part(name,1:k($));
@@ -63,54 +63,113 @@ function gateway_filename = ilib_gen_gateway(name,tables)
             nt = 3;
         end
 
-        prototype = "(char* fname, int* _piKey);";
-        addGWFunction = "addGatewayInContext";
-        if isdef("ismex") & ismex == %t then
-            prototype = "(int nlhs, int* plhs[], int nrhs, int* prhs[]);";
-            addGWFunction = "addMexGatewayInContext";
-        end
-
-
         if ( nt <> 3 ) then
             error(msprintf(gettext("%s: Wrong size for input argument #%d: %d expected.\n"),"ilib_gen_gateway",2,3));
         end
         [gate,names] = new_names(table);
+
+        //generate cpp interface file
         t = [
-        "#ifdef __cpluplus";
-        "extern ""C"" {"
-        "#endif"
-        "#include <wchar.h> ";
-        "#include ""mex.h"" ";
-        "#include ""sci_gateway.h""";
-        "#include ""api_scilab.h""";
-        "#include ""MALLOC.h""";
-        "#include ""addGatewayInContext.h""";
+        "#include ""context.hxx""";
+        "#include """ + tname + ".hxx""";
+        "extern ""C""";
+        "{";
+        "#include """ + tname + ".h""";
+        "}";
         "";
         "#define MODULE_NAME L""" + tname + """";
         "";
-        "extern int " + names(:) + prototype;
-        "";
-        "int " + tname + "(wchar_t* _pwstName)";
+        "int " + tname + "(wchar_t* _pwstFuncName)";
         "{";
-        "   if(wcscmp(_pwstName, L""" + table(:,1) + """) == 0){" + addGWFunction + "(L""" + table(:,1) + """, &" + names(:) + ", MODULE_NAME);}";
-        "}";
-        "#ifdef __cplusplus";
-        "}";
-        "#endif"];
+        "    if(wcscmp(_pwstFuncName, L""" + table(:,1) + """) == 0){ " + "symbol::Context::getInstance()->addFunction(types::Function::createFunction(L""" + table(:,1) + """, &" + names(:) + ", MODULE_NAME)); }";
+        "";
+        "    return 1;";
+        "}"];
+
+        gateway_filename(1) = path + tname + ".cpp";
+        // first check if we have already a gateway
+        [fd, ierr] = mopen(gateway_filename(1), "rt");
+        if ierr == 0 then
+            // file already exists
+            t1 = mgetl(fd);
+            mclose(fd);
+            if or(t1 <> t) then
+                mputl(t, gateway_filename(1));
+            end
+        else
+            // file does not exist we create it
+            mputl(t, gateway_filename(1)) ;
+        end
+
+        if ilib_verbose() > 1 then
+            disp(t);
+        end
 
-        gateway_filename = path + tname + ".c";
+        //prepare .hxx file
+        TNAME = convstr(tname, "u");
+        t = [
+        "#ifndef __" + TNAME + "_GW_HXX__";
+        "#define __" + TNAME + "_GW_HXX__";
+        "";
+        "#include ""c_gateway_prototype.h""";
+        "#include ""cpp_gateway_prototype.hxx""";
+        "";
+        "#ifdef _MSC_VER";
+        "#ifdef " + TNAME + "_GW_EXPORTS";
+        "#define " + TNAME + "_GW_IMPEXP __declspec(dllexport)";
+        "#else";
+        "#define " + TNAME + "_GW_IMPEXP __declspec(dllimport)";
+        "#endif";
+        "#else";
+        "#define " + TNAME + "_GW_IMPEXP";
+        "#endif";
+        "";
+        "extern ""C"" " + TNAME + "_GW_IMPEXP int " + tname + "(wchar_t* _pwstFuncName);";
+        "";
+        gate(:, 2);
+        "";
+        "#endif /* __" + TNAME + "_GW_HXX__ */"];
+
+        gateway_filename(2) = path + tname + ".hxx";
         // first check if we have already a gateway
-        [fd, ierr] = mopen(gateway_filename, "rt");
+        [fd, ierr] = mopen(gateway_filename(2), "rt");
         if ierr == 0 then
             // file already exists
             t1 = mgetl(fd);
             mclose(fd);
             if or(t1 <> t) then
-                mputl(t, gateway_filename);
+                mputl(t, gateway_filename(2));
             end
         else
             // file does not exist we create it
-            mputl(t, gateway_filename) ;
+            mputl(t, gateway_filename(2)) ;
+        end
+
+        //prepare .h file
+        TNAME = convstr(tname, "u");
+        t = [
+        "#ifndef __" + TNAME + "_GW_H__";
+        "#define __" + TNAME + "_GW_H__";
+        "";
+        "#include ""c_gateway_prototype.h""";
+        "";
+        gate(:, 1);
+        "";
+        "#endif /* __" + TNAME + "_GW_H__ */"];
+
+        gateway_filename(3) = path + tname + ".h";
+        // first check if we have already a gateway
+        [fd, ierr] = mopen(gateway_filename(3), "rt");
+        if ierr == 0 then
+            // file already exists
+            t1 = mgetl(fd);
+            mclose(fd);
+            if or(t1 <> t) then
+                mputl(t, gateway_filename(3));
+            end
+        else
+            // file does not exist we create it
+            mputl(t, gateway_filename(3)) ;
         end
 
         if ilib_verbose() > 1 then
@@ -124,45 +183,33 @@ endfunction
 function [gate,names] = new_names(table)
     // change names according to types
     [mt,nt] = size(table);
-    gate = "mex_gateway";
-    gate = gate(ones(mt,1));
+    gate = [""];
+    gate = gate(ones(mt, 2));
     names = " ";
     names = names(ones(mt,1));
     for i = 1:mt
         select table(i,3)
         case "cmex" then
-            names(i) = "mex_" + table(i,2) ;
+            names(i) = "mex_" + table(i,2);
+            gate(i, 1) = "C_GATEWAY_PROTOTYPE(" + names(i) + ");";
         case "fmex" then
-            gate(i) = "(Myinterfun)fortran_mex_gateway" ;
-            names(i) = "C2F(mex" + table(i,2) + ")" ;
+            names(i) = "C2F(mex" + table(i,2) + ")";
+            gate(i, 1) = "C_GATEWAY_PROTOTYPE(" + names(i) + ");";
         case "Fmex" then
-            gate(i) = "(Myinterfun)fortran_mex_gateway" ;
-            names(i) = "C2F(mex" + table(i,2) + ")" ;
+            names(i) = "C2F(mex" + table(i,2) + ")";
+            gate(i, 1) = "C_GATEWAY_PROTOTYPE(" + names(i) + ");";
         case "csci"  then
-            if isdef("WITHOUT_AUTO_PUTLHSVAR") then
-                if (WITHOUT_AUTO_PUTLHSVAR == %T) then
-                    gate(i) = "(Myinterfun)sci_gateway_without_putlhsvar" ;
-                else
-                    gate(i) = "(Myinterfun)sci_gateway" ;
-                end
-            else
-                gate(i) = "(Myinterfun)sci_gateway" ;
-            end
-            names(i) = table(i,2) ;
+            names(i) = table(i,2);
+            gate(i, 1) = "C_GATEWAY_PROTOTYPE(" + names(i) + ");";
         case "fsci"  then
-            if isdef("WITHOUT_AUTO_PUTLHSVAR") then
-                if (WITHOUT_AUTO_PUTLHSVAR == %T) then
-                    gate(i) = "(Myinterfun)sci_gateway_without_putlhsvar" ;
-                else
-                    gate(i) = "(Myinterfun)sci_gateway" ;
-                end
-            else
-                gate(i) = "(Myinterfun)sci_gateway" ;
-            end
-            names(i) = "C2F(" + table(i,2) + ")" ;
+            names(i) = "C2F(" + table(i,2) + ")";
+            gate(i, 1) = "C_GATEWAY_PROTOTYPE(" + names(i) + ");";
+        case "cppsci"  then
+            names(i) = table(i,2);
+            gate(i, 2) = "CPP_GATEWAY_PROTOTYPE(" + names(i) + ");";
         case "direct"  then
-            gate(i) = "(Myinterfun)direct_gateway" ;
-            names(i) = "C2F(" + table(i,2) + ")" ;
+            names(i) = table(i,2);
+            gate(i, 1) = "C_GATEWAY_PROTOTYPE(" + names(i) + ");";
         else
             error(999,"Wrong interface type " + table(i,3));
         end
index 05263b0..57200f0 100644 (file)
@@ -145,10 +145,10 @@ function ilib_gen_Make_win32(name, ..
 
     if with_gateway then
         if L == 1 then
-            FILES_SRC_MATRIX = [FILES_SRC_MATRIX , name + ".c"];
+            FILES_SRC_MATRIX = [FILES_SRC_MATRIX , name + ".cpp"];
         else
             for i=1:L
-                FILES_SRC_MATRIX = [FILES_SRC_MATRIX , name + string(i) + ".c"];
+                FILES_SRC_MATRIX = [FILES_SRC_MATRIX , name + string(i) + ".cpp"];
             end
         end
     end
@@ -243,6 +243,7 @@ function ilib_gen_Make_win32(name, ..
         MAKEFILE_VC = strsubst(MAKEFILE_VC, "CC = __CC__","#CC = ");
     end
 
+    CFLAGS = CFLAGS + " -D" + convstr(name, "u") + "_GW_EXPORTS";
     MAKEFILE_VC = strsubst(MAKEFILE_VC, "__CFLAGS__", CFLAGS);
     MAKEFILE_VC = strsubst(MAKEFILE_VC, "__MEXCFLAGS__", MEXCFLAGS);
     MAKEFILE_VC = strsubst(MAKEFILE_VC, "__FFLAGS__", FFLAGS);
index 8424e60..9961bbb 100644 (file)
@@ -25,6 +25,7 @@ function scilabincludeslist = dlwGetScilabIncludes()
     "$(SCIDIR)/modules/windows_tools/includes"; ..
     "$(SCIDIR)/modules/symbol/includes"; ..
     "$(SCIDIR)/modules/types/includes"; ..
-    "$(SCIDIR)/modules/operations/includes"];
+    "$(SCIDIR)/modules/operations/includes"; ..
+    "$(SCIDIR)/modules/ast/includes"];
 endfunction
 //=============================================================================
\ No newline at end of file
index 41de6c9..9634bb5 100644 (file)
@@ -46,20 +46,20 @@ types::Function::ReturnValue sci_ulink(types::typed_list &in, int _iRetCount, ty
     {
         unLinkAll();
     }
-    else if (in.size() == 1)
+    else if (in.size() == 1 && in[0]->isDouble())
     {
         types::Double* pDIds = in[0]->getAs<types::Double>();
-        if (pDIds == NULL)
-        {
-            Scierror(999, _("%s: Wrong type for input argument #%d: Matrix expected.\n"), "ulink", 1);
-            return types::Function::Error;
-        }
 
         for (int i = 0 ; i < pDIds->getSize() ; i++)
         {
-            unLink(pDIds->get(i));
+            unLink((int)pDIds->get(i));
         }
     }
+    else
+    {
+        Scierror(999, _("%s: Wrong type for input argument #%d: real scalar expected.\n"), "ulink", 1);
+        return types::Function::Error;
+    }
 
     return types::Function::OK;
 }
@@ -75,8 +75,12 @@ void unLinkAll()
 /*--------------------------------------------------------------------------*/
 void unLink(int _iLib)
 {
-    unsigned long long iLib = ConfigVariable::getDynamicLibrary(_iLib)->hLib;
-    ConfigVariable::removeDynamicLibrary(_iLib);
-    Sci_dlclose(iLib);
+    ConfigVariable::DynamicLibraryStr* pStr = ConfigVariable::getDynamicLibrary(_iLib);
+    if (pStr)
+    {
+        unsigned long long iLib = ConfigVariable::getDynamicLibrary(_iLib)->hLib;
+        ConfigVariable::removeDynamicLibrary(_iLib);
+        Sci_dlclose(iLib);
+    }
 }
 /*--------------------------------------------------------------------------*/
index e4ff0d9..93d54ba 100644 (file)
             <varlistentry>
                 <term>names</term>
                 <listitem>
-                    <para>2 column string matrix giving the table of pairs 'scilab-name', 'interface name'</para>
+                    <para>2 or 3 columns string matrix giving the table of pairs 'scilab-name', 'interface name', ['language']</para>
+                    <para><literal>language</literal> can be :
+                    <listitem>
+                        <para>csci : C entry point for API Scilab ( default value )</para>
+                        <para>fsci : Fortran entry point for API Scilab</para>
+                        <para>cmex : C mexlib entry point for MexLib</para>
+                        <para>fmex : Fortran mexlib entry point for MexLib</para>
+                        <para>cppsci : C++ entry point for C++ API Scilab</para>
+                    </listitem>
+                    </para>
                 </listitem>
             </varlistentry>
             <varlistentry>
diff --git a/scilab/modules/symbol/includes/addGatewayInContext.h b/scilab/modules/symbol/includes/addGatewayInContext.h
deleted file mode 100644 (file)
index b283730..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- *  Copyright (C) 2011 - DIGITEO - 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
- *
- */
-
-#ifndef __ADDGATEWAYINCONTEXT_H__
-#define __ADDGATEWAYINCONTEXT_H__
-#include "export_symbol.h"
-#include "c_gateway_prototype.h"
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-    EXTERN_SYMBOL void addGatewayInContext(wchar_t* _pwstName, OLDGW_FUNC _pFunc, wchar_t* _pwstModule);
-    EXTERN_SYMBOL void addMexGatewayInContext(wchar_t* _pwstName, MEXGW_FUNC _pFunc, wchar_t* _pwstModule);
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* !__ADDGATEWAYINCONTEXT_H__ */
\ No newline at end of file
index 02f740d..3fb07ce 100644 (file)
@@ -63,6 +63,7 @@ private :
     void put(const Symbol& _key, types::InternalType& _iT, int _iLevel);
 public :
     void put(const Symbol& _key, types::InternalType& _iT);
+    void addFunction(const Symbol& _key, types::Function& _info);
     void putInPreviousScope(const Symbol& _key, types::InternalType& _iT);
 
     /* getters */
index 1a14015..c138021 100644 (file)
@@ -17,6 +17,7 @@
 #include <list>
 #include "types.hxx"
 #include "symbol.hxx"
+#include "function.hxx"
 
 namespace symbol
 {
index 270915a..0956d16 100644 (file)
 #include "function.hxx"
 #include "macro.hxx"
 #include "macrofile.hxx"
-#include "addGatewayInContext.h"
-
-void addGatewayInContext(wchar_t* _pwstName, OLDGW_FUNC _pFunc, wchar_t* _pwstModule)
-{
-    symbol::Context::getInstance()->addFunction(types::Function::createFunction(_pwstName, _pFunc, _pwstModule));
-}
-
-void addMexGatewayInContext(wchar_t* _pwstName, MEXGW_FUNC _pFunc, wchar_t* _pwstModule)
-{
-    symbol::Context::getInstance()->addFunction(types::Function::createFunction(_pwstName, _pFunc, _pwstModule));
-}
 
 namespace symbol
 {
@@ -115,7 +104,7 @@ bool Context::putInPreviousScope(const symbol::Symbol& _key, types::InternalType
 
 bool Context::addFunction(types::Function *_info)
 {
-    m_scopes->put(symbol::Symbol(_info->getName()), *_info);
+    m_scopes->addFunction(symbol::Symbol(_info->getName()), *_info);
     return true;
 }
 
index 27dcccc..7d1e3a5 100644 (file)
@@ -117,6 +117,11 @@ void Scopes::putInPreviousScope(const Symbol& _key, types::InternalType& _iT)
     put(_key, _iT, m_iLevel - 1);
 }
 
+void Scopes::addFunction(const Symbol& _key, types::Function& _func)
+{
+    m_scopes.front()->put(_key, _func);
+}
+
 /* getters */
 types::InternalType* Scopes::get(const Symbol& _key) const
 {
index 868ae1b..a89cd7a 100644 (file)
     <ClCompile Include="src\cpp\variables.cpp" />
   </ItemGroup>
   <ItemGroup>
-    <ClInclude Include="includes\addGatewayInContext.h" />
     <ClInclude Include="includes\context.hxx" />
     <ClInclude Include="includes\export_symbol.h" />
     <ClInclude Include="includes\libraries.hxx" />
index 4145e45..7ea6bc0 100644 (file)
@@ -41,9 +41,6 @@
     <ClInclude Include="includes\symbol.hxx">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="includes\addGatewayInContext.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
     <ClInclude Include="includes\variables.hxx">
       <Filter>Header Files</Filter>
     </ClInclude>
index 28cfbb5..c06b75f 100644 (file)
@@ -16,9 +16,9 @@
 #include "types.hxx"
 #include "callable.hxx"
 
-#define CPP_GATEWAY_PROTOTYPE(__gateway__) extern "C" types::Callable::ReturnValue (__gateway__)(types::typed_list &in, int _iRetCount, types::typed_list &out)
+#define CPP_GATEWAY_PROTOTYPE(__gateway__) types::Callable::ReturnValue (__gateway__)(types::typed_list &in, int _iRetCount, types::typed_list &out)
 #define CPP_GATEWAY_PROTOTYPE_EXPORT(__gateway__, __export__) extern "C" __export__ types::Callable::ReturnValue (__gateway__)(types::typed_list &in, int _iRetCount, types::typed_list &out)
-#define CPP_OPT_GATEWAY_PROTOTYPE(__gateway__) extern "C" types::Callable::ReturnValue (__gateway__)(types::typed_list &in, types::optional_list &opt, int _iRetCount, types::typed_list &out)
+#define CPP_OPT_GATEWAY_PROTOTYPE(__gateway__) types::Callable::ReturnValue (__gateway__)(types::typed_list &in, types::optional_list &opt, int _iRetCount, types::typed_list &out)
 #define CPP_OPT_GATEWAY_PROTOTYPE_EXPORT(__gateway__, __export__) extern "C" __export__ types::Callable::ReturnValue (__gateway__)(types::typed_list &in, types::optional_list &opt, int _iRetCount, types::typed_list &out)
 
 #endif /* !__CPP_GATEWAY_PROTOTYPE_HXX__ */