Dynamic link update:
[scilab.git] / scilab / modules / dynamic_link / sci_gateway / c / sci_c_link.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) INRIA - Allan CORNET
4  * Copyright (C) DIGITEO - 2011 - Antoine ELIAS
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-en.txt
11  *
12  */
13
14 /*--------------------------------------------------------------------------*/
15 #include "gw_dynamic_link.h"
16 #include "stack-c.h"
17 #include "api_scilab.h"
18 #include "api_oldstack.h"
19 #include "dynamic_link.h"
20 #include "MALLOC.h"
21 #include "localization.h"
22 #include "Scierror.h"
23 /*--------------------------------------------------------------------------*/
24 int sci_c_link(char *fname, int* _piKey)
25 {
26     SciErr sciErr;
27     int iRet = 0;
28     int ilib = 0;
29     int* piAddress;
30     int iType;
31
32     char *routinename   = NULL;
33     int paramoutINT     = 0;
34     BOOL FindFunction   = FALSE;
35
36     CheckRhs(1,2);
37     CheckLhs(1,2);
38
39     /* [test,ilib]=c_link(routine-name)  */
40     /* test = c_link(routine-name)  */
41     /* test = c_link(routine-name,num)  */
42
43     if(Rhs == 2)
44     {
45         sciErr = getVarAddressFromPosition(_piKey, 2, &piAddress);
46         if(sciErr.iErr)
47         {
48             printError(&sciErr, 0);
49             return sciErr.iErr;
50         }
51         sciErr = getVarType(_piKey, piAddress, &iType);
52         if(sciErr.iErr)
53         {
54             printError(&sciErr, 0);
55             return sciErr.iErr;
56         }
57
58         if(isDoubleType(_piKey, piAddress))
59         {
60             double pdblReal = 0;
61             if(getScalarDouble(_piKey, piAddress, &pdblReal))
62             {
63                 Scierror(999, _("%s : second argument must be a unique id of a shared library.\n"),fname);
64                 return 1;
65             }
66
67             ilib = (int)pdblReal;
68         }
69         else
70         {
71             Scierror(999 ,_("%s : second argument must be a unique id of a shared library.\n"),fname);
72             return 0;
73         }
74     }
75     else 
76     {
77         ilib = -1;
78     }
79
80     sciErr = getVarAddressFromPosition(_piKey, 1, &piAddress);
81     if(sciErr.iErr)
82     {
83         printError(&sciErr, 0);
84         return sciErr.iErr;
85     }
86
87     if(isStringType(_piKey, piAddress) == FALSE)
88     {
89         Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 1);
90         return 1;
91     }
92
93     if(getAllocatedSingleString(_piKey, piAddress, &routinename))
94     {
95         return 1;
96     }
97
98     FindFunction = c_link(routinename, &ilib);
99     FREE(routinename);
100
101     if(FindFunction)
102     {
103         paramoutINT = (int)(TRUE);
104     }
105
106     if(createScalarBoolean(_piKey, Rhs + 1, paramoutINT))
107     {
108         return 1;
109     }
110
111     LhsVar(1) = Rhs + 1;
112
113     if(Lhs == 2)
114     {
115         if(createScalarDouble(_piKey, Rhs + 2, ilib))
116         {
117             return 1;
118         }
119
120         LhsVar(2) = Rhs + 2;
121     }
122
123     PutLhsVar();
124     return 0;
125 }
126 /*--------------------------------------------------------------------------*/