* bug 16280 fixed: allow users to use mode() inside a macro.
[scilab.git] / scilab / modules / core / sci_gateway / cpp / sci_mode.cpp
1 /*
2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2010 - 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 "core_gw.hxx"
18 #include "configvariable.hxx"
19 #include "double.hxx"
20 #include "function.hxx"
21
22 extern "C"
23 {
24 #include "Scierror.h"
25 #include "sciprint.h"
26 #include "localization.h"
27 }
28
29 /*--------------------------------------------------------------------------*/
30 types::Function::ReturnValue sci_mode(types::typed_list &in, int _iRetCount, types::typed_list &out)
31 {
32     types::InternalType *pIT = NULL;
33
34     /* Check the number of input argument */
35     if (in.size() > 1)
36     {
37         Scierror(999, _("%s: Wrong number of input arguments: %d or %d expected.\n"), "mode", 0, 1);
38         return types::Function::Error;
39     }
40
41     /* Check the number of output argument */
42     if (_iRetCount > 1)
43     {
44         Scierror(78, _("%s: Wrong number of output argument(s): %d expected.\n"), "mode", 1);
45         return types::Function::Error;
46     }
47
48     if (in.size() == 0)
49     {
50         out.push_back(new types::Double(ConfigVariable::getUserMode()));
51     }
52     else
53     {
54         if (in[0]->isDouble() == false)
55         {
56             Scierror(999, _("%s: Wrong type for input argument #%d: Scalar expected.\n"), "mode", 1);
57             return types::Function::Error;
58         }
59
60         types::Double* pDblIn = in[0]->getAs<types::Double>();
61
62         if (pDblIn->isScalar() == false)
63         {
64             Scierror(999, _("%s: Wrong size for input argument #%d: A scalar expected.\n"), "mode", 1);
65             return types::Function::Error;
66         }
67
68         int iScilabMode = (int)pDblIn->get(0);
69         if (pDblIn->get(0) != (double)iScilabMode)
70         {
71             Scierror(999, _("%s: Wrong type for input argument #%d: An integer value expected.\n"), "mode", 1);
72             return types::Function::Error;
73         }
74
75         ConfigVariable::setUserMode(iScilabMode);
76
77         if (ConfigVariable::isPrintInteractive())
78         {
79             sciprint(_("Pause mode: enter empty lines to continue.\n"));
80         }
81     }
82
83     return types::Function::OK;
84 }