Merge remote-tracking branch 'origin/master' into YaSp
[scilab.git] / scilab / modules / elementary_functions / sci_gateway / c / sci_log10.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2007 - INRIA - Jean-Baptiste SILVY
4  * Copyright (C) 2007 - INRIA - Allan CORNET
5  * Copyright (C) 2007 - INRIA - Cong WU
6  *
7  * This file must be used under the terms of the CeCILL.
8  * This source file is licensed as described in the file COPYING, which
9  * you should have received as part of this distribution.  The terms
10  * are also available at
11  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
12  *
13  */
14
15 /*------------------------------------------------------------------------*/
16 #include <string.h>
17 #include "gw_elementary_functions.h"
18 #include "api_scilab.h"
19 #include "Scierror.h"
20 #include "sci_malloc.h"
21 #include "localization.h"
22 #include "sciprint.h"
23 #include "setieee.h"
24
25 /*--------------------------------------------------------------------------*/
26 int sci_log10(char *fname, void* pvApiCtx)
27 {
28     SciErr sciErr;
29     int i = 0;
30     int complex = 0;
31     int check_ieee = 0;
32
33     int* piAddr = NULL;
34     int iType = 0;
35     int iRows = 0;
36     int iCols = 0;
37     double* pIn = NULL;
38     double* pOutR = NULL;
39     double* pOutI = NULL;
40     double imag = M_PI / log(10.0);
41
42     int iRhs = nbInputArgument(pvApiCtx);
43
44     CheckInputArgument(pvApiCtx, 1, 1);
45     CheckOutputArgument(pvApiCtx, 1, 1);
46
47     sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr);
48     if (sciErr.iErr)
49     {
50         printError(&sciErr, 0);
51         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 2);
52         return 0;
53     }
54
55     sciErr = getVarType(pvApiCtx, piAddr, &iType);
56     if (sciErr.iErr)
57     {
58         printError(&sciErr, 0);
59         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
60         return 0;
61     }
62
63     if (iType != sci_matrix || isVarComplex(pvApiCtx, piAddr))
64     {
65         //manage complex log10 via %s_log macro
66         OverLoad(1);
67         return 0;
68     }
69
70     sciErr = getMatrixOfDouble(pvApiCtx, piAddr, &iRows, &iCols, &pIn);
71     if (sciErr.iErr)
72     {
73         printError(&sciErr, 0);
74         return 0;
75     }
76
77     //check values
78     for (i = 0 ; i < iRows * iCols ; ++i)
79     {
80         double d = pIn[i];
81         if (d < 0)
82         {
83             complex = 1;
84         }
85
86         if (d == 0)
87         {
88             check_ieee = 1;
89         }
90     }
91
92     if (check_ieee)
93     {
94         if (getieee() == 0)
95         {
96             Scierror(999, "Singularity of log or tan function.\n");
97             return 0;
98         }
99
100         if (getieee() == 1)
101         {
102             sciprint(_("Warning : singularity of 'log' or 'tan' function.\n"));
103         }
104     }
105
106     if (complex)
107     {
108         sciErr = allocComplexMatrixOfDouble(pvApiCtx, iRhs + 1, iRows, iCols, &pOutR, &pOutI);
109         if (sciErr.iErr)
110         {
111             Scierror(999, _("%s: Memory allocation error.\n"), fname);
112             return 0;
113         }
114
115         memset(pOutI, 0x00, iRows * iCols * sizeof(double));
116     }
117     else
118     {
119         sciErr = allocMatrixOfDouble(pvApiCtx, iRhs + 1, iRows, iCols, &pOutR);
120         if (sciErr.iErr)
121         {
122             Scierror(999, _("%s: Memory allocation error.\n"), fname);
123             return 0;
124         }
125     }
126
127
128     for (i = 0 ; i < iRows * iCols ; ++i)
129     {
130         if (pIn[i] < 0)
131         {
132             pOutR[i] = log10(-pIn[i]);
133             pOutI[i] = imag;
134         }
135         else
136         {
137             pOutR[i] = log10(pIn[i]);
138         }
139     }
140
141     AssignOutputVariable(pvApiCtx, 1) = iRhs + 1;
142     ReturnArguments(pvApiCtx);
143     return 0;
144 }