manages PutLhsVar as in scilab internal function
Allan CORNET [Sat, 8 Aug 2009 21:18:38 +0000 (23:18 +0200)]
scilab/contrib/toolbox_skeleton/sci_gateway/c/builder_gateway_c.sce
scilab/contrib/toolbox_skeleton/sci_gateway/c/sci_csub.c
scilab/contrib/toolbox_skeleton/sci_gateway/c/sci_csum.c
scilab/modules/dynamic_link/help/en_US/ilib_gen_gateway.xml
scilab/modules/dynamic_link/macros/ilib_gen_gateway.sci
scilab/modules/mexlib/includes/sci_gateway.h
scilab/modules/mexlib/src/c/sci_gateway.c

index f2b1441..caac7f8 100644 (file)
@@ -12,8 +12,15 @@ else
   includes_src_c = '-I' + get_absolute_file_path('builder_gateway_c.sce') + '../../src/c';
 end
 
+// PutLhsVar managed by user in sci_sum and in sci_sub
+// if you do not this variable, PutLhsVar is added
+// in gateway generated (default mode in scilab 4.x and 5.x)
+WITHOUT_AUTO_PUTLHSVAR = %t;
+
 tbx_build_gateway('skeleton_c', ['c_sum','sci_csum';'c_sub','sci_csub'], ['sci_csum.c','sci_csub.c'], ..
                   get_absolute_file_path('builder_gateway_c.sce'), ..
                   ['../../src/c/libcsum'],'',includes_src_c);
 
+clear WITHOUT_AUTO_PUTLHSVAR;
+
 clear tbx_build_gateway;
index 0833fcc..b5812b5 100644 (file)
@@ -72,6 +72,13 @@ int sci_csub(char *fname)
   createMatrixOfDouble(Rhs + 1, m_out, n_out, &dOut);
   LhsVar(1) = Rhs + 1; 
   
+  /* This function put on scilab stack, the lhs variable
+  which are at the position lhs(i) on calling stack */
+  /* You need to add PutLhsVar here because WITHOUT_ADD_PUTLHSVAR 
+  was defined and equal to %t */
+  /* without this, you do not need to add PutLhsVar here */
+  PutLhsVar();
+  
   return 0;
 }
 /* ==================================================================== */
index 67f9e50..de83c6a 100644 (file)
@@ -71,6 +71,13 @@ int sci_csum(char *fname)
   createMatrixOfDouble(Rhs + 1, m_out, n_out, &dOut);
   LhsVar(1) = Rhs + 1; 
   
+  /* This function put on scilab stack, the lhs variable
+  which are at the position lhs(i) on calling stack */
+  /* You need to add PutLhsVar here because WITHOUT_ADD_PUTLHSVAR 
+  was defined and equal to %t */
+  /* without this, you do not need to add PutLhsVar here */
+  PutLhsVar();
+  
   return 0;
 }
 /* ==================================================================== */
index 1f66ebf..24d2873 100644 (file)
     <para>Utility function used by <literal>ilib_build</literal> This function
     generates a gateway file used by <literal>addinter</literal>.</para>
 
-    <para>if WITH_ADD_PUTLHSVAR variable is defined and equals to %t,
-    PutLhsVar(); will be added in generated gateway.</para>
+    <para>if WITHOUT_AUTO_PUTLHSVAR variable is defined and equals to %t,
+    PutLhsVar(); will need to manage PutLhsVar in each interface as internal scilab
+    functions.</para>
 
-    <para>In another case (default, for compatibility) , you will need to
-    manage PutLhsVar(); in each interface.</para>
+    <para>In another case (default, for compatibility with previous version) ,
+    PutLhsVar(); is added in each interface.</para>
   </refsection>
 
   <refsection>
index f6da199..6c6a336 100644 (file)
@@ -62,23 +62,18 @@ function gateway_filename = ilib_gen_gateway(name,tables)
     [gate,names] = new_names(table); 
     t = [ '#include <mex.h> ';
           '#include <sci_gateway.h>';
-               'static int direct_gateway(char *fname,void F(void)) { F();return 0;};';
-               'extern Gatefunc ' + names(:) + ';';
-               'static GenericTable Tab[]={';
-               '  {'+ gate(:)+','+ names(:)+',""'+table(:,1)+'""},';
-               '};';
-               ' ';
-               'int C2F('+tname+')()';
-               '{';
-               '  Rhs = Max(0, Rhs);';
-               '  if (*(Tab[Fin-1].f) != NULL) (*(Tab[Fin-1].f))(Tab[Fin-1].name,Tab[Fin-1].F);'];
-               
-    if isdef('WITH_ADD_PUTLHSVAR') then
-      if (WITH_ADD_PUTLHSVAR == %t) then
-        t = [t;'PutLhsVar();'];
-      end
-         end
-         t = [t ; '  return 0;'; '}'];
+          'static int direct_gateway(char *fname,void F(void)) { F();return 0;};';
+          'extern Gatefunc ' + names(:) + ';';
+          'static GenericTable Tab[]={';
+          '  {'+ gate(:)+','+ names(:)+',""'+table(:,1)+'""},';
+          '};';
+          ' ';
+          'int C2F(' + tname + ')()';
+          '{';
+          '  Rhs = Max(0, Rhs);';
+          '  if (*(Tab[Fin-1].f) != NULL) (*(Tab[Fin-1].f))(Tab[Fin-1].name,Tab[Fin-1].F);';
+          '  return 0;';
+          '}'];
 
          gateway_filename = path + tname + '.c';
     // first chek if we already have a gateway 
@@ -123,11 +118,27 @@ function [gate,names] = new_names(table)
      case 'Fmex' then 
        gate(i) = "(Myinterfun)fortran_mex_gateway" ;
        names(i) = "C2F(mex" + table(i,2) + ")" ;
-     case 'csci'  then 
-       gate(i) = "(Myinterfun)sci_gateway" ;
+     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) ;
      case 'fsci'  then 
-       gate(i) = "(Myinterfun)sci_gateway" ;
+       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) + ")" ;
      case 'direct'  then 
        gate(i) = "(Myinterfun)direct_gateway" ;
index b8a6e99..ef224f5 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) DIGITEO - 2009 - Sylvestre LEDRU
+ * Copyright (C) 2009 - DIGITEO - Allan CORNET
  * 
  * This file must be used under the terms of the CeCILL.
  * This source file is licensed as described in the file COPYING, which
  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
  *
  */
-
+/*-----------------------------------------------------------------------------------*/
 typedef int (*GatefuncS) (char *fname, int l);
-
+/*-----------------------------------------------------------------------------------*/
 /**
  * This function manages the call of a native function which has been added
- * through addinter
+ * through addinter with PutLhsVar (Compatibility Scilab 4.x and 5.1)
  *
  * @param fname name of the function
  * @param F
  * @param SharedLibraryName name of the library
  */
 int sci_gateway(char *fname, GatefuncS F);
+/*-----------------------------------------------------------------------------------*/
+/**
+* This function manages the call of a native function which has been added
+* through addinter without PutLhsVar in gateway (as for internal scilab functions)
+*
+* @param fname name of the function
+* @param F
+* @param SharedLibraryName name of the library
+*/
+int sci_gateway_without_putlhsvar(char *fname, GatefuncS F);
+/*-----------------------------------------------------------------------------------*/
index da03785..d5553ee 100644 (file)
@@ -1,6 +1,7 @@
 /*
 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 * Copyright (C) 2009 - DIGITEO - Sylvestre LEDRU
+* Copyright (C) 2009 - DIGITEO - Allan CORNET
 *
 * This file must be used under the terms of the CeCILL.
 * This source file is licensed as described in the file COPYING, which
 * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
 *
 */
+/*-----------------------------------------------------------------------------------*/
 #include <string.h>
 #include "stack-c.h"
 #include "sci_gateway.h"
-
+/*-----------------------------------------------------------------------------------*/
+static int callExternalFunction(char *fname, GatefuncS F,BOOL withPutLhsVar);
+/*-----------------------------------------------------------------------------------*/
 /** generic scilab interface **/
 int sci_gateway(char *fname, GatefuncS F)
 {
-  (*F)(fname,(int)strlen(fname));
-  PutLhsVar();
-  return 0;
+       return callExternalFunction(fname,F,TRUE);
 }
+/*-----------------------------------------------------------------------------------*/
+int sci_gateway_without_putlhsvar(char *fname, GatefuncS F)
+{
+       return callExternalFunction(fname,F,FALSE);
+}
+/*-----------------------------------------------------------------------------------*/
+static int callExternalFunction(char *fname, GatefuncS F,BOOL withPutLhsVar)
+{
+       (*F)(fname,(int)strlen(fname));
+       if (withPutLhsVar)PutLhsVar();
+       return 0;
+}
+/*-----------------------------------------------------------------------------------*/