fix link return order and bug 3639 c file
[scilab.git] / scilab / modules / dynamic_link / tests / nonreg_tests / bug_3639.c
1 /* ============================================== */
2 #include "api_scilab.h"
3 #include "sciprint.h"
4 #include "Scierror.h"
5 /* ============================================== */
6 /*  Interfaces for c fonctions */
7 /* ============================================== */
8 void c_sum(double *b, double *c, double *a);
9 void c_sub(double *b, double *c, double *a);
10 /* ============================================== */
11 int c_intsum(char *fname, void * pvApiCtx)
12 {
13     int minlhs = 1, maxlhs = 1, minrhs = 2, maxrhs = 2;
14
15     int l1 = 0, rows1 = 0, cols1 = 0, l2 = 0, rows2 = 0, cols2 = 0, l3 = 0, rows3 = 1, cols3 = 1;
16     double *pdbl1 = NULL, *pdbl2 = NULL, *pdblOut = NULL;
17
18     int* piAddr1 = NULL;
19     int* piAddr2 = NULL;
20     int* piAddr3 = NULL;
21
22     SciErr sciErr;
23
24
25     /* Check number of inputs (rhs=2) and outputs (lhs=1) */
26     CheckRhs(minrhs, maxrhs) ;
27     CheckLhs(minlhs, maxlhs) ;
28
29     //get var 1
30     sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr1);
31     if (sciErr.iErr)
32     {
33         printError(&sciErr, 0);
34         return 0;
35     }
36     sciErr = getVarDimension(pvApiCtx, piAddr1, &rows1, &cols1);
37     if (sciErr.iErr)
38     {
39         printError(&sciErr, 0);
40         return 0;
41     }
42     sciErr = getMatrixOfDouble(pvApiCtx, piAddr1, &rows1, &cols1, &pdbl1);
43     if (sciErr.iErr)
44     {
45         printError(&sciErr, 0);
46         return 0;
47     }
48
49     //get var 2
50     sciErr = getVarAddressFromPosition(pvApiCtx, 2, &piAddr2);
51     if (sciErr.iErr)
52     {
53         printError(&sciErr, 0);
54         return 0;
55     }
56     sciErr = getVarDimension(pvApiCtx, piAddr2, &rows2, &cols2);
57     if (sciErr.iErr)
58     {
59         printError(&sciErr, 0);
60         return 0;
61     }
62     sciErr = getMatrixOfDouble(pvApiCtx, piAddr2, &rows2, &cols2, &pdbl2);
63     if (sciErr.iErr)
64     {
65         printError(&sciErr, 0);
66         return 0;
67     }
68
69     //aloc return variable
70     sciErr = allocMatrixOfDouble(pvApiCtx, Rhs + 1, rows3, cols3, &pdblOut);
71     if (sciErr.iErr)
72     {
73         printError(&sciErr, 0);
74         return 0;
75     }
76
77     /* Check dimensions  */
78     if (!(rows1 == 1) | !(cols1 == 1))
79     {
80         Scierror(999, "%s: Wrong inputs \r\n", "c_fun");
81         return 0;
82     }
83     if (!(rows2 == 1) | !(cols2 == 1))
84     {
85         Scierror(999, "%s: Wrong inputs \r\n", "c_fun");
86         return 0;
87     }
88
89     /* Call c_fun */
90     c_sum(pdbl1, pdbl2, pdblOut);
91
92     /*  Return result  */
93     LhsVar(1) = Rhs + 1;
94     PutLhsVar();
95     return 0;
96 }
97 /* ============================================== */
98 int c_intsub(char *fname, void * pvApiCtx)
99 {
100     int l1 = 0, rows1 = 0, cols1 = 0, l2 = 0, rows2 = 0, cols2 = 0, l3 = 0, rows3 = 1, cols3 = 1;
101     int minlhs = 1, maxlhs = 1, minrhs = 2, maxrhs = 2;
102
103     double *pdbl1 = NULL, *pdbl2 = NULL, *pdblOut = NULL;
104
105     int* piAddr1 = NULL;
106     int* piAddr2 = NULL;
107     int* piAddr3 = NULL;
108
109     SciErr sciErr;
110
111     /* Check number of inputs (rhs=2) and outputs (lhs=1) */
112     CheckRhs(minrhs, maxrhs) ;
113     CheckLhs(minlhs, maxlhs) ;
114
115     sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr1);
116     if (sciErr.iErr)
117     {
118         printError(&sciErr, 0);
119         return 0;
120     }
121     sciErr = getVarDimension(pvApiCtx, piAddr1, &rows1, &cols1);
122     if (sciErr.iErr)
123     {
124         printError(&sciErr, 0);
125         return 0;
126     }
127     sciErr = getMatrixOfDouble(pvApiCtx, piAddr1, &rows1, &cols1, &pdbl1);
128     if (sciErr.iErr)
129     {
130         printError(&sciErr, 0);
131         return 0;
132     }
133
134     sciErr = getVarAddressFromPosition(pvApiCtx, 2, &piAddr2);
135     if (sciErr.iErr)
136     {
137         printError(&sciErr, 0);
138         return 0;
139     }
140     sciErr = getVarDimension(pvApiCtx, piAddr2, &rows2, &cols2);
141     if (sciErr.iErr)
142     {
143         printError(&sciErr, 0);
144         return 0;
145     }
146     sciErr = getMatrixOfDouble(pvApiCtx, piAddr2, &rows2, &cols2, &pdbl2);
147     if (sciErr.iErr)
148     {
149         printError(&sciErr, 0);
150         return 0;
151     }
152
153     sciErr = allocMatrixOfDouble(pvApiCtx, Rhs + 1, rows3, cols3, &pdblOut);
154     if (sciErr.iErr)
155     {
156         printError(&sciErr, 0);
157         return 0;
158     }
159
160     /* Check dimensions  */
161     if (!(rows1 == 1) | !(cols1 == 1))
162     {
163         Scierror(999, "%s: Wrong inputs \r\n", "c_fun");
164         return 0;
165     }
166     if (!(rows2 == 1) | !(cols2 == 1))
167     {
168         Scierror(999, "%s: Wrong inputs \r\n", "c_fun");
169         return 0;
170     }
171
172     /* Call c_fun */
173     c_sub(pdbl1, pdbl2, pdblOut);
174
175     /*  Return result  */
176     LhsVar(1) = Rhs + 1;
177     PutLhsVar();
178     return 0;
179 }
180 /* ============================================== */
181 void c_sum(double *b, double *c, double *a)
182 {
183     *a = *b + *c;
184 }
185 /* ============================================== */
186 void c_sub(double *b, double *c, double *a)
187 {
188     *a = *b - *c;
189 }
190 /* ============================================== */
191