use builtin base2dec
[scilab.git] / scilab / modules / elementary_functions / sci_gateway / c / sci_base2dec.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2011 - DIGITEO - Allan CORNET
4  * 
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at    
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12 /*--------------------------------------------------------------------------*/ 
13 #include <math.h>
14 #include "gw_elementary_functions.h"
15 #include "MALLOC.h"
16 #include "api_scilab.h"
17 #include "stack-c.h"
18 #include "Scierror.h"
19 #include "localization.h"
20 #include "convertbase.h"
21 /*--------------------------------------------------------------------------*/
22 int sci_base2dec(char *fname,unsigned long fname_len)
23 {
24     SciErr sciErr;
25     int *piAddressVarOne = NULL;
26     int *piAddressVarTwo = NULL;
27     int iValue = 0;
28     double dValue = 0.;
29     char **pStrs = NULL;
30     int m = 0;
31     int n = 0;
32     double *dResults = NULL;
33     int i = 0;
34
35     CheckRhs(2, 2);
36     CheckLhs(0, 1);
37
38     sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddressVarOne);
39     if(sciErr.iErr)
40     {
41         printError(&sciErr, 0);
42         return 0;
43     }
44
45     if (!isStringType(pvApiCtx, piAddressVarOne))
46     {
47         Scierror(999,_("%s: Wrong type for input argument #%d: A matrix of string expected.\n"), fname, 1);
48         return 0;
49     }
50
51     sciErr = getVarAddressFromPosition(pvApiCtx, 2, &piAddressVarTwo);
52     if(sciErr.iErr)
53     {
54         printError(&sciErr, 0);
55         return 0;
56     }
57
58     if (!isDoubleType(pvApiCtx, piAddressVarTwo))
59     {
60         Scierror(999,_("%s: Wrong type for input argument #%d: A integer value expected.\n"), fname, 2);
61         return 0;
62     }
63
64     if (!isScalar(pvApiCtx, piAddressVarTwo))
65     {
66         Scierror(999,_("%s: Wrong size for input argument #%d.\n"), fname, 2);
67         return 0;
68     }
69
70     if (getScalarDouble(pvApiCtx, piAddressVarTwo, &dValue) != 0)
71     {
72         Scierror(999, _("%s: No more memory.\n"), fname);
73         return 0;
74     }
75
76     iValue = (int)dValue;
77     if (dValue != (double)iValue)
78     {
79         Scierror(999, _("%s: Wrong value for input argument #%d: A integer value expected.\n"), fname, 2);
80         return 0;
81     }
82
83     if ((iValue < 2) && (iValue > 36))
84     {
85         Scierror(999, _("%s: Wrong value for input argument #%d: Must be between %d and %d."), fname, 2, 2, 36);
86         return 0;
87     }
88
89     if (getAllocatedMatrixOfString(pvApiCtx, piAddressVarOne, &m, &n, &pStrs) != 0)
90     {
91         Scierror(999, _("%s: No more memory.\n"), fname);
92         return 0;
93     }
94
95     dResults = (double*)MALLOC(sizeof(double) * (m * n));
96     if (dResults == NULL)
97     {
98         freeAllocatedMatrixOfString(m, n, pStrs);
99         pStrs = NULL;
100
101         Scierror(999, _("%s: No more memory.\n"), fname);
102         return 0;
103     }
104
105     for (i = 0; i < m * n; i++)
106     {
107         int ierr = 0;
108         dResults[i] = convertBase2Dec(pStrs[i], iValue, &ierr);
109         if (ierr)
110         {
111             freeAllocatedMatrixOfString(m, n, pStrs);
112             pStrs = NULL;
113
114             FREE(dResults);
115             dResults = NULL;
116
117             Scierror(999, _("%s: Wrong value for input argument(s): Valid base %d representations expected.\n"), fname, iValue);
118             return 0;
119
120         }
121     }
122
123     freeAllocatedMatrixOfString(m, n, pStrs);
124     pStrs = NULL;
125
126     sciErr = createMatrixOfDouble(pvApiCtx, Rhs + 1, m, n, dResults);
127
128     FREE(dResults);
129     dResults = NULL;
130
131     if (sciErr.iErr)
132     {
133         printError(&sciErr, 0);
134         return 0;
135     }
136
137     LhsVar(1) = Rhs + 1;
138     PutLhsVar();
139
140     return 0;
141 }
142 /*--------------------------------------------------------------------------*/