1fef3662759cc9b1cd5f5dbd26e97df5de1452f0
[scilab.git] / scilab / modules / elementary_functions / src / cpp / getmode.cpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2011 - DIGITEO - Antoine ELIAS
4  *
5  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13  *
14  */
15 /*--------------------------------------------------------------------------*/
16
17 #include "getmode.hxx"
18 #include "double.hxx"
19 #include "string.hxx"
20
21 extern "C"
22 {
23 #include "Scierror.h"
24 #include "localization.h"
25 }
26
27
28 int getMode(types::typed_list &in, int _iProcess, int _iRef)
29 {
30     int iMode = 0;
31     if (in[_iProcess]->isString())
32     {
33         types::String* pS = in[_iProcess]->getAs<types::String>();
34         if (pS->getSize() != 1)
35         {
36             Scierror(999, _("%s: Wrong size for argument %d: (%d,%d) expected.\n"), "size", _iProcess + 1, 1, 1);
37         }
38
39         switch (pS->get(0)[0])
40         {
41             case 'r' :
42                 iMode = 1;
43                 break;
44             case 'c' :
45                 iMode = 2;
46                 break;
47             case '*' :
48                 iMode = 0;
49                 break;
50             case 'm' :
51                 iMode = -1;
52                 break;
53             default :
54                 Scierror(999, _("%s: Wrong value for input argument #%d: '%s', '%s', '%s' or '%s' expected.\n"), "size", _iProcess + 1, "m" , "*" , "r", "c");
55                 iMode = -2;
56                 break;
57         }
58     }
59     else if (in[1]->isDouble() && in[1]->getAs<types::Double>()->isComplex() == false)
60     {
61         types::Double* pD = in[_iProcess]->getAs<types::Double>();
62         if (pD->getSize() != 1)
63         {
64             Scierror(999, _("%s: Wrong size for argument %d: (%d,%d) expected.\n"), "size", _iProcess + 1, 1, 1);
65             iMode = -2;
66         }
67
68         iMode = static_cast<int>(pD->getReal()[0]);
69         if (pD->getReal()[0] != static_cast<double>(iMode))
70         {
71             Scierror(999, _("%s: Wrong value for input argument #%d: An integer value expected.\n"), "size", 2);
72             iMode = -2;
73         }
74
75         if (iMode <= 0)
76         {
77             Scierror(999, _("%s: Wrong value for input argument #%d: Scalar positive integer expected.\n"), "size", 2);
78             iMode = -2;
79         }
80     }
81     else
82     {
83         Scierror(999, _("%s: Wrong type for input argument #%d: string or scalar expected.\n"), "size", 2);
84         iMode = -2;
85     }
86
87     //special case for -1
88     if (iMode == -1)
89     {
90         iMode = 0;
91         if (in[_iRef]->getAs<types::GenericType>()->getRows() > 1)
92         {
93             iMode = 1;
94         }
95         else if (in[_iRef]->getAs<types::GenericType>()->getCols() > 1)
96         {
97             iMode = 2;
98         }
99     }
100
101     return iMode;
102 }
103