fix link return order and bug 3639 c file 63/16363/2
Anais AUBERT [Tue, 14 Apr 2015 08:40:56 +0000 (10:40 +0200)]
test_run("dynamic_link","bug_3639",["no_check_error_output" ]);

Change-Id: I63b0773b74ee379f4be8b5a07a2b4ceece055963

scilab/modules/dynamic_link/sci_gateway/cpp/sci_link.cpp
scilab/modules/dynamic_link/tests/nonreg_tests/bug_3639.c

index e190989..8b91b44 100644 (file)
@@ -57,9 +57,9 @@ types::Function::ReturnValue sci_link(types::typed_list &in, int _iRetCount, typ
         }
 
         types::String* pSFunctionNames = new types::String(1, (int)FunctionsList.size());
-        for (int i = 0 ; i < FunctionsList.size() ; i++)
+        for (int i = 0 ; i < FunctionsList.size(); i++)
         {
-            pSFunctionNames->set(i, FunctionsList[i].c_str());
+            pSFunctionNames->set(FunctionsList.size() - i - 1, FunctionsList[i].c_str());
         }
 
         out.push_back(pSFunctionNames);
index 1f3d7e3..e117e7f 100644 (file)
@@ -1,6 +1,5 @@
 /* ============================================== */
-#define __USE_DEPRECATED_STACK_FUNCTIONS__
-#include "stack-c.h"
+#include "api_scilab.h"
 #include "sciprint.h"
 #include "Scierror.h"
 /* ============================================== */
 void c_sum(double *b, double *c, double *a);
 void c_sub(double *b, double *c, double *a);
 /* ============================================== */
-int c_intsum(char *fname)
+int c_intsum(char *fname, void * pvApiCtx)
 {
-    int l1 = 0, m1 = 0, n1 = 0, l2 = 0, m2 = 0, n2 = 0, l3 = 0, m3 = 1, n3 = 1;
     int minlhs = 1, maxlhs = 1, minrhs = 2, maxrhs = 2;
 
+    int l1 = 0, rows1 = 0, cols1 = 0, l2 = 0, rows2 = 0, cols2 = 0, l3 = 0, rows3 = 1, cols3 = 1;
+    double *pdbl1 = NULL, *pdbl2 = NULL, *pdblOut = NULL;
+
+    int* piAddr1 = NULL;
+    int* piAddr2 = NULL;
+    int* piAddr3 = NULL;
+
+    SciErr sciErr;
+
+
     /* Check number of inputs (rhs=2) and outputs (lhs=1) */
     CheckRhs(minrhs, maxrhs) ;
     CheckLhs(minlhs, maxlhs) ;
 
-    /* Get Qdata (#1) and Param (#2) and create C (#3) as double ("d") matrices */
-    GetRhsVar(1, MATRIX_OF_DOUBLE_DATATYPE, &m1, &n1, &l1);   /* b */
-    GetRhsVar(2, MATRIX_OF_DOUBLE_DATATYPE, &m2, &n2, &l2);   /* c */
+    //get var 1
+    sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr1);
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return 0;
+    }
+    sciErr = getVarDimension(pvApiCtx, piAddr1, &rows1, &cols1);
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return 0;
+    }
+    sciErr = getMatrixOfDouble(pvApiCtx, piAddr1, &rows1, &cols1, &pdbl1);
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return 0;
+    }
+
+    //get var 2
+    sciErr = getVarAddressFromPosition(pvApiCtx, 2, &piAddr2);
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return 0;
+    }
+    sciErr = getVarDimension(pvApiCtx, piAddr2, &rows2, &cols2);
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return 0;
+    }
+    sciErr = getMatrixOfDouble(pvApiCtx, piAddr2, &rows2, &cols2, &pdbl2);
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return 0;
+    }
 
-    CreateVar(Rhs + 1, MATRIX_OF_DOUBLE_DATATYPE, &m3, &n3, &l3); /* Result : a = b+c */
+    //aloc return variable
+    sciErr = allocMatrixOfDouble(pvApiCtx, Rhs + 1, rows3, cols3, &pdblOut);
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return 0;
+    }
 
     /* Check dimensions  */
-    if (!(m1 == 1) | !(n1 == 1))
+    if (!(rows1 == 1) | !(cols1 == 1))
     {
         Scierror(999, "%s: Wrong inputs \r\n", "c_fun");
         return 0;
     }
-    if (!(m2 == 1) | !(n2 == 1))
+    if (!(rows2 == 1) | !(cols2 == 1))
     {
         Scierror(999, "%s: Wrong inputs \r\n", "c_fun");
         return 0;
     }
 
     /* Call c_fun */
-    c_sum(stk(l1), stk(l2), stk(l3));
+    c_sum(pdbl1, pdbl2, pdblOut);
 
     /*  Return result  */
     LhsVar(1) = Rhs + 1;
+    PutLhsVar();
     return 0;
 }
 /* ============================================== */
-int c_intsub(char *fname)
+int c_intsub(char *fname, void * pvApiCtx)
 {
-    int l1 = 0, m1 = 0, n1 = 0, l2 = 0, m2 = 0, n2 = 0, l3 = 0, m3 = 1, n3 = 1;
+    int l1 = 0, rows1 = 0, cols1 = 0, l2 = 0, rows2 = 0, cols2 = 0, l3 = 0, rows3 = 1, cols3 = 1;
     int minlhs = 1, maxlhs = 1, minrhs = 2, maxrhs = 2;
 
+    double *pdbl1 = NULL, *pdbl2 = NULL, *pdblOut = NULL;
+
+    int* piAddr1 = NULL;
+    int* piAddr2 = NULL;
+    int* piAddr3 = NULL;
+
+    SciErr sciErr;
+
     /* Check number of inputs (rhs=2) and outputs (lhs=1) */
     CheckRhs(minrhs, maxrhs) ;
     CheckLhs(minlhs, maxlhs) ;
 
-    /* Get Qdata (#1) and Param (#2) and create C (#3) as double ("d") matrices */
-    GetRhsVar(1, MATRIX_OF_DOUBLE_DATATYPE, &m1, &n1, &l1);   /* b */
-    GetRhsVar(2, MATRIX_OF_DOUBLE_DATATYPE, &m2, &n2, &l2);   /* c */
+    sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr1);
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return 0;
+    }
+    sciErr = getVarDimension(pvApiCtx, piAddr1, &rows1, &cols1);
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return 0;
+    }
+    sciErr = getMatrixOfDouble(pvApiCtx, piAddr1, &rows1, &cols1, &pdbl1);
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return 0;
+    }
 
-    CreateVar(Rhs + 1, MATRIX_OF_DOUBLE_DATATYPE, &m3, &n3, &l3); /* Result : a = b-c */
+    sciErr = getVarAddressFromPosition(pvApiCtx, 2, &piAddr2);
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return 0;
+    }
+    sciErr = getVarDimension(pvApiCtx, piAddr2, &rows2, &cols2);
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return 0;
+    }
+    sciErr = getMatrixOfDouble(pvApiCtx, piAddr2, &rows2, &cols2, &pdbl2);
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return 0;
+    }
+
+    sciErr = allocMatrixOfDouble(pvApiCtx, Rhs + 1, rows3, cols3, &pdblOut);
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return 0;
+    }
 
     /* Check dimensions  */
-    if (!(m1 == 1) | !(n1 == 1))
+    if (!(rows1 == 1) | !(cols1 == 1))
     {
         Scierror(999, "%s: Wrong inputs \r\n", "c_fun");
         return 0;
     }
-    if (!(m2 == 1) | !(n2 == 1))
+    if (!(rows2 == 1) | !(cols2 == 1))
     {
         Scierror(999, "%s: Wrong inputs \r\n", "c_fun");
         return 0;
     }
 
     /* Call c_fun */
-    c_sub(stk(l1), stk(l2), stk(l3));
+    c_sub(pdbl1, pdbl2, pdblOut);
 
     /*  Return result  */
     LhsVar(1) = Rhs + 1;
+    PutLhsVar();
     return 0;
 }
 /* ============================================== */