Add c interface to manage dyn link function via index 21/15821/9
Antoine ELIAS [Thu, 15 Jan 2015 10:14:08 +0000 (11:14 +0100)]
 * getEntryPointPosition() replaces iislink()
 * getEntryPointFromPosition() replaces GetDynFunc()

Change-Id: Ida466f100180b0bb0b591e9dd1b5ed24dc370d06

scilab/modules/ast/includes/system_env/configvariable.hxx
scilab/modules/ast/includes/system_env/configvariable_interface.h
scilab/modules/ast/src/cpp/system_env/configvariable.cpp
scilab/modules/ast/src/cpp/system_env/configvariable_interface.cpp
scilab/modules/dynamic_link/src/cpp/addinter.cpp
scilab/modules/dynamic_link/src/cpp/dynamic_link.cpp
scilab/modules/elementary_functions/sci_gateway/cpp/elem_func_gw.cpp
scilab/modules/scicos/src/c/Dynamic_link_Import.def
scilab/modules/scicos/src/c/scicos.c

index d050330..84f1124 100644 (file)
@@ -255,11 +255,13 @@ public :
         DynLibHandle hLib;        /** handle of the library **/
     } DynamicLibraryStr;
 
+    typedef void(*dynlib_ptr)();
+
     typedef struct
     {
         wchar_t* pwstEntryPointName;    /** name of interface **/
         int iLibIndex;                  /** name of interface **/
-        void (*functionPtr)(wchar_t*);          /** entrypoint for the interface **/
+        dynlib_ptr functionPtr;         /** entrypoint for the interface **/
         bool bOK;                       /** flag set to TRUE if entrypoint can be used **/
     } EntryPointStr;
 
@@ -288,6 +290,9 @@ public :
     static void addEntryPoint(EntryPointStr* _pEP);
     static void removeEntryPoint(int _iEntryPointIndex);
     static EntryPointStr* getEntryPoint(wchar_t* _pwstEntryPointName, int _iDynamicLibraryIndex = -1);
+    static int getEntryPointPosition(wchar_t* _pwstEntryPointName, int _iDynamicLibraryIndex = -1);
+    static dynlib_ptr getEntryPointFromPosition(int position);
+
     static std::vector<std::wstring> getEntryPointNameList();
 
     //dynamic modules
index 126b641..b174a23 100644 (file)
@@ -70,4 +70,10 @@ EXTERN_AST int checkReferenceModule(const wchar_t* _module);
 EXTERN_AST void addReferenceModule(const wchar_t* _module);
 EXTERN_AST void removeReferenceModule(const wchar_t* _module);
 
+
+
+EXTERN_AST int getEntryPointPosition(wchar_t* _pwstEntryPointName);
+typedef void(*dynlib_ptr)();
+EXTERN_AST dynlib_ptr getEntryPointFromPosition(int position);
+
 #endif /* !__CONFIGVARIABLE_INTERFACE_H__ */
index a682bc7..130dc39 100644 (file)
@@ -763,6 +763,38 @@ ConfigVariable::EntryPointStr* ConfigVariable::getEntryPoint(wchar_t* _pwstEntry
     return NULL;
 }
 
+dynlib_ptr ConfigVariable::getEntryPointFromPosition(int position)
+{
+    std::list<EntryPointStr*>::const_iterator it;
+    int pos = 0;
+    for (it = m_EntryPointList.begin(); it != m_EntryPointList.end(); it++, ++pos)
+    {
+        if (pos == position)
+        {
+            return (*it)->functionPtr;
+        }
+    }
+    return NULL;
+}
+
+int ConfigVariable::getEntryPointPosition(wchar_t* _pwstEntryPointName, int _iDynamicLibraryIndex)
+{
+    int pos = 0;
+    std::list<EntryPointStr*>::const_iterator it;
+    for (it = m_EntryPointList.begin(); it != m_EntryPointList.end(); it++, ++pos)
+    {
+        //by pass iLibIndex check if _iDynamicLibraryIndex == -1
+        if (_iDynamicLibraryIndex == -1 || (*it)->iLibIndex == _iDynamicLibraryIndex)
+        {
+            if (wcscmp((*it)->pwstEntryPointName, _pwstEntryPointName) == 0)
+            {
+                return pos;
+            }
+        }
+    }
+    return -1;
+}
+
 std::vector<std::wstring> ConfigVariable::getEntryPointNameList()
 {
     std::vector<std::wstring> EntryPointNames;
index e25e562..5e50918 100644 (file)
@@ -181,3 +181,13 @@ void removeReferenceModule(const wchar_t* _module)
 {
     ConfigVariable::removeReferenceModule(_module);
 }
+
+int getEntryPointPosition(wchar_t* _pwstEntryPointName)
+{
+    return ConfigVariable::getEntryPointPosition(_pwstEntryPointName);
+}
+
+dynlib_ptr getEntryPointFromPosition(int position)
+{
+    return ConfigVariable::getEntryPointFromPosition(position);
+}
index 079fa98..f56a1be 100644 (file)
@@ -21,6 +21,8 @@ extern "C"
 #include "addinter.h"
 }
 
+typedef void(*function)(wchar_t*);
+
 int AddInterfaceToScilab(wchar_t* _pwstDynamicLibraryName, wchar_t* _pwstModuleName, wchar_t** _pwstEntryPointName, int _iEntryPointSize)
 {
     int iLibID = -1; /* Id of library */
@@ -56,7 +58,7 @@ int AddInterfaceToScilab(wchar_t* _pwstDynamicLibraryName, wchar_t* _pwstModuleN
 
     for (int i = 0 ; i < _iEntryPointSize ; i++)
     {
-        pEP->functionPtr(_pwstEntryPointName[i]);
+        ((function)pEP->functionPtr)(_pwstEntryPointName[i]);
     }
     return 0;
 }
index 5bfb878..f5b88f5 100644 (file)
@@ -61,7 +61,7 @@ extern "C"
 
 static void Underscores(BOOL _bFortran, wchar_t* _pwstEntryPointName, wchar_t* _pwstTrailingName);
 
-typedef void (*function) (wchar_t*);
+typedef void (*function) ();
 
 
 int scilabLink(int _iLibID, wchar_t* _pwstLibraryName, wchar_t** _pwstEntryPointName, int _iEntryPointSize, BOOL _bFortran , int *_piErr)
index aa57e7c..c94f8e2 100644 (file)
@@ -194,7 +194,7 @@ bool getDimsFromArguments(types::typed_list& in, char* _pstName, int* _iDims, in
                     {
                         delete[] * _piDims;
                         Scierror(999, _("%s: variable size exceeded : less than %d expected.\n"), _pstName, INT_MAX);
-                        return types::Function::Error;
+                        return false;
                     }
                     (*_piDims)[i] = static_cast<int>(llValue);
                     break;
index 84b42a5..6798c78 100644 (file)
@@ -2,5 +2,3 @@ LIBRARY    dynamic_link.dll
 
 
 EXPORTS
-GetDynFunc
-iislink_
\ No newline at end of file
index e1aece0..0f4cb4d 100644 (file)
@@ -36,6 +36,7 @@
 /*--------------------------------------------------------------------------*/
 #include <stdlib.h>
 #include <string.h>
+#include <wchar.h>
 #include <math.h>
 
 /* Sundials includes */
@@ -77,6 +78,8 @@
 #include "sciblk4.h"
 #include "dynlib_scicos.h"
 
+#include "configvariable_interface.h" /* getEntryPointPosition() and getEntryPointFromPosition() */
+
 #include "lsodar.h"           /* prototypes for lsodar fcts. and consts. */
 #include "ddaskr.h"           /* prototypes for ddaskr fcts. and consts. */
 
@@ -575,8 +578,7 @@ int C2F(scicos)(double *x_in, int *xptr_in, double *z__,
         else
         {
             i -= (ntabsim + 1);
-            //TODO: see in dynamic_lin how to get funcptr from index
-            //GetDynFunc(i, &Blocks[kf].funpt);
+            Blocks[kf].funpt = getEntryPointFromPosition(i);
             if ( Blocks[kf].funpt == (voidf) 0)
             {
                 sciprint(_("Function not found\n"));
@@ -6115,6 +6117,7 @@ int C2F(funnum)(char * fname)
 {
     int i = 0, ln = 0;
     int loc = -1;
+    wchar_t* fname_wchar_t = NULL;
     while ( tabsim[i].name != (char *) NULL)
     {
         if ( strcmp(fname, tabsim[i].name) == 0 )
@@ -6125,9 +6128,10 @@ int C2F(funnum)(char * fname)
     }
     ln = (int)strlen(fname);
 
-    //TODO: see in dynamic_lin how to check if a function os already link to Scilab
-    //C2F(iislink)(fname, &loc);
-    //C2F(iislink)(fname, &loc);
+    // Look for 'fname' in the Scilab dynamically linked functions
+    fname_wchar_t = to_wide_string(fname);
+    loc = getEntryPointPosition(fname_wchar_t);
+    FREE(fname_wchar_t);
     if (loc >= 0)
     {
         return (ntabsim + (int)loc + 1);