ab74fa082ca3a75b1d71bd8b12ad9455ee295d10
[scilab.git] / scilab / contrib / toolbox_skeleton / sci_gateway / c / sci_csub.c
1 /* ==================================================================== */
2 /* Template toolbox_skeleton */
3 /* This file is released under the 3-clause BSD license. See COPYING-BSD. */
4 /* ==================================================================== */
5 #include "api_scilab.h"
6 #include "Scierror.h"
7 #include "MALLOC.h"
8 #include "csub.h"
9 /* ==================================================================== */
10 int sci_csub(char *fname)
11 {
12     SciErr sciErr;
13
14     int m1 = 0, n1 = 0;
15     int *piAddressVarOne = NULL;
16     double *pdVarOne = NULL;
17     int iType1 = 0;
18
19     int m2 = 0, n2 = 0;
20     int *piAddressVarTwo = NULL;
21     double *pdVarTwo = NULL;
22     int iType2 = 0;
23
24     int m_out = 0, n_out = 0;
25     double dOut = 0.0;
26
27     /* --> result = csub(3,8)
28     /* check that we have only 2 input arguments */
29     /* check that we have only 1 output argument */
30     CheckInputArgument(pvApiCtx, 2, 2);
31     CheckOutputArgument(pvApiCtx, 1, 1);
32
33     /* get Address of inputs */
34     sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddressVarOne);
35     if (sciErr.iErr)
36     {
37         printError(&sciErr, 0);
38         return 0;
39     }
40
41     sciErr = getVarAddressFromPosition(pvApiCtx, 2, &piAddressVarTwo);
42     if (sciErr.iErr)
43     {
44         printError(&sciErr, 0);
45         return 0;
46     }
47
48     /* check input type */
49     sciErr = getVarType(pvApiCtx, piAddressVarOne, &iType1);
50     if (sciErr.iErr)
51     {
52         printError(&sciErr, 0);
53         return 0;
54     }
55
56     if ( iType1 != sci_matrix )
57     {
58         Scierror(999, "%s: Wrong type for input argument #%d: A scalar expected.\n", fname, 1);
59         return 0;
60     }
61
62     sciErr = getVarType(pvApiCtx, piAddressVarTwo, &iType2);
63     if (sciErr.iErr)
64     {
65         printError(&sciErr, 0);
66         return 0;
67     }
68
69     if ( iType2 != sci_matrix )
70     {
71         Scierror(999, "%s: Wrong type for input argument #%d: A scalar expected.\n", fname, 2);
72         return 0;
73     }
74
75     /* get matrix */
76     sciErr = getMatrixOfDouble(pvApiCtx, piAddressVarOne, &m1, &n1, &pdVarOne);
77     if (sciErr.iErr)
78     {
79         printError(&sciErr, 0);
80         return 0;
81     }
82
83     sciErr = getMatrixOfDouble(pvApiCtx, piAddressVarTwo, &m2, &n2, &pdVarTwo);
84     if (sciErr.iErr)
85     {
86         printError(&sciErr, 0);
87         return 0;
88     }
89
90     /* check size */
91     if ( (m1 != n1) && (n1 != 1) )
92     {
93         Scierror(999, "%s: Wrong size for input argument #%d: A scalar expected.\n", fname, 1);
94         return 0;
95     }
96     if ( (m2 != n2) && (n2 != 1) )
97     {
98         Scierror(999, "%s: Wrong size for input argument #%d: A scalar expected.\n", fname, 2);
99         return 0;
100     }
101
102     /* call c function csub */
103     csub(&pdVarOne[0], &pdVarTwo[0], &dOut);
104
105     /* create result on stack */
106     m_out = 1;
107     n_out = 1;
108     createMatrixOfDouble(pvApiCtx, nbInputArgument(pvApiCtx) + 1, m_out, n_out, &dOut);
109
110     AssignOutputVariable(pvApiCtx, 1) = nbInputArgument(pvApiCtx) + 1;
111
112     ReturnArguments(pvApiCtx);
113
114     return 0;
115 }
116 /* ==================================================================== */
117