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