remove GetenvB not called function
[scilab.git] / scilab / modules / dynamic_link / src / c / addinter.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) INRIA/ENPC
4  * Copyright (C) 2008 - INRIA - Allan CORNET
5  *
6  * This file must be used under the terms of the CeCILL.
7  * This source file is licensed as described in the file COPYING, which
8  * you should have received as part of this distribution.  The terms
9  * are also available at
10  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
11  *
12  */
13
14 /*-----------------------------------------------------------------------------------*/
15 #include <string.h>
16 #include <stdio.h>
17 #include <stdlib.h>
18 #ifdef _MSC_VER
19 #include <windows.h>
20 #endif
21
22 #include "core_math.h"
23 #include "dynamic_link.h"
24 #include "men_Sutils.h"
25 #include "addinter.h"
26
27 #include "do_error_number.h"
28 #include "stack-c.h"
29 #include "MALLOC.h" /* MALLOC */
30 #include "sciprint.h"
31 #include "Funtab.h"
32 #include "warningmode.h"
33 #include "localization.h"
34 #include "Scierror.h"
35 #ifdef _MSC_VER
36 #include "ExceptionMessage.h"
37 #endif
38
39 /* size of interface name */
40 /* scilab limitation to nlgh characters (24)*/
41 #define INTERFSIZE nlgh + 1
42 /*-----------------------------------------------------------------------------------*/
43 typedef struct
44 {
45     char name[INTERFSIZE]; /** name of interface **/
46     void (*func)();        /** entrypoint for the interface **/
47     int Nshared; /** id of the shared library **/
48     BOOL ok;    /** flag set to TRUE if entrypoint can be used **/
49 } InterfaceElement;
50 /*-----------------------------------------------------------------------------------*/
51 InterfaceElement *DynInterf = NULL;
52 static int MaxInterfaces = MAXDYNINTERF;
53 /*-----------------------------------------------------------------------------------*/
54 static int LastInterf = 0;
55 static void initializeInterfaces(void);
56 static BOOL reallocDynInterf(void);
57 /*-----------------------------------------------------------------------------------*/
58 int AddInterfaceToScilab(char *filenamelib, char *spname, char **fcts, int sizefcts)
59 {
60     int IdLib = -1; /* Id of library */
61     int idinput = -1; /* Id of a function */
62     int ierr1 = 0;
63     int one = 1;
64     char **subname = NULL;
65     int ierr = 0;
66     int i = 0;
67     int inum = 0;
68     int k1 = 0;
69
70     initializeLink();
71     initializeInterfaces();
72
73     /** Try to unlink the interface if it was previously linked **/
74
75     for ( i = 0 ; i < LastInterf ; i++)
76     {
77         if (strcmp(spname, DynInterf[i].name) == 0)
78         {
79             unlinksharedlib(&DynInterf[i].Nshared);
80             break;
81         }
82     }
83
84     /** Try to find a free position in the interface table : inum **/
85     inum = -1;
86     for ( i = 0 ; i < LastInterf ; i++)
87     {
88         if ( DynInterf[i].ok == 0 )
89         {
90             inum = i;
91         }
92     }
93
94     inum = ( inum == -1 ) ? LastInterf : inum ;
95
96     /** Linking Files and add entry point name iname */
97
98     if ( inum >=  MaxInterfaces )
99     {
100         /* Try to resize DynInterf */
101         if ( ( !reallocDynInterf() ) || ( inum >=  MaxInterfaces ) )
102         {
103             return -1;
104         }
105     }
106
107     subname = (char **)MALLOC(sizeof (char*));
108     subname[0] = spname;
109
110     /* link then search  */
111     /* Trying with the fortran symbol */
112     IdLib =  scilabLink(idinput, filenamelib, subname, one, TRUE, &ierr1);
113     if (ierr1 != 0)
114     {
115         /* Haven't been able to find the symbol. Try C symbol */
116         IdLib =  scilabLink(idinput, filenamelib, subname, one, FALSE, &ierr1);
117     }
118
119     subname[0] = NULL;
120     if (subname)
121     {
122         FREE(subname);
123         subname = NULL;
124     }
125
126     if ( IdLib < 0 )
127     {
128         return IdLib;
129     }
130
131     /** store the linked function in the interface function table DynInterf **/
132     DynInterf[inum].Nshared = IdLib;
133
134     if ( SearchInDynLinks(spname, &DynInterf[inum].func) < 0 )
135     {
136         /* Maximum number of dynamic interfaces */
137         return -6;
138     }
139     else
140     {
141         strncpy(DynInterf[inum].name, spname, INTERFSIZE);
142         DynInterf[inum].ok = TRUE;
143     }
144     if ( inum == LastInterf )
145     {
146         LastInterf++;
147     }
148
149     k1 = inum + 1;
150     for (i = 0; i < sizefcts; i++)
151     {
152         int id[nsiz], zero = 0, three = 3, fptr = 0, fptr1 = 0, four = 4;
153
154         /* find a previous functions with same name */
155         C2F(cvname)(id, fcts[i], &zero, (unsigned long)strlen(fcts[i]));
156         fptr1 = fptr = (DynInterfStart + k1) * 1000 + (i + 1);
157         /* clear previous def set fptr1 to 0*/
158         C2F(funtab)(id, &fptr1, &four, "NULL_NAME", 0);
159         /* reinstall */
160         C2F(funtab)(id, &fptr, &three, fcts[i], (unsigned long)strlen(fcts[i]));
161     }
162
163     return ierr;
164 }
165 /*-----------------------------------------------------------------------------------*/
166 static void initializeInterfaces(void)
167 {
168     static int first_entry_interfaces = 0;
169
170     if ( first_entry_interfaces == 0)
171     {
172         if (DynInterf == NULL)
173         {
174             DynInterf = (InterfaceElement*)MALLOC(sizeof(InterfaceElement) * MaxInterfaces);
175             if (DynInterf)
176             {
177                 int i = 0;
178                 for ( i = 0 ; i < MaxInterfaces ; i++)
179                 {
180                     strcpy(DynInterf[i].name, "");
181                     DynInterf[i].func = NULL;
182
183                     DynInterf[i].Nshared = -1;
184                     DynInterf[i].ok = FALSE;
185                 }
186             }
187         }
188         first_entry_interfaces++;
189     }
190 }
191 /*-----------------------------------------------------------------------------------*/
192 /*********************************
193 * used in unlinksharedlib(i)
194 *********************************/
195 void RemoveInterf(int id)
196 {
197     int i = 0;
198     for ( i = 0 ; i < LastInterf ; i++ )
199     {
200         if ( DynInterf[i].Nshared == id )
201         {
202             DynInterf[i].ok = FALSE;
203             break;
204         }
205     }
206 }
207 /*-----------------------------------------------------------------------------------*/
208 /************************************************
209 * Used when one want to call a function added
210 * with addinterf the dynamic interface number
211 * is given by *k - (DynInterfStart+1)
212 ************************************************/
213 void C2F(userlk)(int *k)
214 {
215     int k1 = *k - (DynInterfStart + 1) ;
216
217     int imes = 9999;
218     if ( k1 >= LastInterf || k1 < 0 )
219     {
220         if (getWarningMode())
221         {
222             Scierror(999, _("Error: Not a valid internal routine number %d.\n"), *k);
223         }
224         SciError(imes);
225         return;
226     }
227
228     if ( DynInterf[k1].ok == 1 )
229     {
230 #ifdef _MSC_VER
231 #ifndef _DEBUG
232         _try
233         {
234             (*DynInterf[k1].func)();
235         }
236         _except (EXCEPTION_EXECUTE_HANDLER)
237         {
238             ExceptionMessage(GetExceptionCode(), DynInterf[k1].name);
239         }
240 #else
241         (*DynInterf[k1].func)();
242 #endif
243 #else
244         (*DynInterf[k1].func)();
245 #endif
246     }
247     else
248     {
249         if (getWarningMode())
250         {
251             sciprint(_("Interface %s not linked.\n"), DynInterf[k1].name);
252         }
253         SciError(imes);
254         return;
255     }
256 }
257 /*-----------------------------------------------------------------------------------*/
258 static BOOL reallocDynInterf(void)
259 {
260     /* increase table of interfaces by 2 */
261     int newMaxInterfaces = MaxInterfaces * 2;
262
263     if (newMaxInterfaces < ENTRYMAX)
264     {
265         if (DynInterf)
266         {
267             int i = 0;
268             InterfaceElement *newDynInterf = NULL;
269
270             newDynInterf = (InterfaceElement*)REALLOC(DynInterf, sizeof(InterfaceElement) * newMaxInterfaces);
271             if (newDynInterf == NULL)
272             {
273                 return FALSE;
274             }
275
276             DynInterf = newDynInterf;
277
278             for ( i = MaxInterfaces ; i < newMaxInterfaces ; i++)
279             {
280                 strcpy(DynInterf[i].name, "");
281                 DynInterf[i].func = NULL;
282                 DynInterf[i].Nshared = -1;
283                 DynInterf[i].ok = FALSE;
284             }
285             MaxInterfaces = newMaxInterfaces;
286             return TRUE;
287         }
288         else
289         {
290             return FALSE;
291         }
292     }
293     return FALSE;
294 }
295 /*-----------------------------------------------------------------------------------*/