Fix some easy to fix warnings
[scilab.git] / scilab / modules / core / sci_gateway / cpp / sci_who.cpp
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2011-2011 - DIGITEO - Bruno JOFRET
4  *  Copyright (C) 2014 - Scilab Enterprises - Cedric Delamarre
5  *
6  * Copyright (C) 2012 - 2016 - Scilab Enterprises
7  *
8  * This file is hereby licensed under the terms of the GNU GPL v2.0,
9  * pursuant to article 5.3.4 of the CeCILL v.2.1.
10  * This file was originally licensed under the terms of the CeCILL v2.1,
11  * and continues to be available under such terms.
12  * For more information, see the COPYING file which you should have received
13  * along with this program.
14  *
15  */
16
17
18 #include <sstream>
19 #include "core_gw.hxx"
20 #include "function.hxx"
21 #include "context.hxx"
22 #include "scilabWrite.hxx"
23 #include "string.hxx"
24
25 extern "C"
26 {
27 #include "Scierror.h"
28 #include "localization.h"
29 }
30
31 types::Function::ReturnValue sci_who(types::typed_list& in, int _iRetCount, types::typed_list& out)
32 {
33     std::wstring wcsWhat(L"");
34     bool bSorted = false;
35     types::String* pStrOut = NULL;
36     types::Double* pDblOut = NULL;
37     std::list<std::wstring> lstVar;
38     int size = 0;
39
40     if (in.size() > 2)
41     {
42         Scierror(77, _("%s: Wrong number of input argument(s): %d to %d expected.\n"), "who", 0, 2);
43         return types::Function::Error;
44     }
45
46     if (_iRetCount > 2)
47     {
48         Scierror(78, _("%s: Wrong number of output argument(s): %d to %d expected.\n"), "who", 0, 2);
49         return types::Function::Error;
50     }
51
52     if (in.size() == 0)
53     {
54         std::wstringstream wstream;
55         symbol::Context::getInstance()->print(wstream, bSorted);
56         wstream << std::endl;
57         scilabForcedWriteW(wstream.str().c_str());
58         return types::Function::OK;
59     }
60
61     if (in.size() == 2)
62     {
63         if (in[1]->isString() == false)
64         {
65             Scierror(999, _("%s: Wrong type for input argument #%d: string expected.\n"), "who", 2);
66             return types::Function::Error;
67         }
68
69         types::String* pStrSorted = in[1]->getAs<types::String>();
70
71         if (pStrSorted->isScalar() == false)
72         {
73             Scierror(999, _("%s: Wrong type for input argument #%d: A single string expected.\n"), "who", 2);
74             return types::Function::Error;
75         }
76
77         if (wcscmp(pStrSorted->get(0), L"sorted") == 0)
78         {
79             bSorted = true;
80         }
81         else
82         {
83             Scierror(999, _("%s: Wrong value for input argument #%d: 'sorted' expected.\n"), "who", 2);
84             return types::Function::Error;
85         }
86     }
87
88     if (in.size() > 0)
89     {
90         if (in[0]->isString() == false)
91         {
92             Scierror(999, _("%s: Wrong type for input argument #%d: string expected.\n"), "who", 1);
93             return types::Function::Error;
94         }
95
96         types::String* pStrWhat = in[0]->getAs<types::String>();
97
98         if (pStrWhat->isScalar() == false)
99         {
100             Scierror(999, _("%s: Wrong type for input argument #%d: A single string expected.\n"), "who", 1);
101             return types::Function::Error;
102         }
103
104         wcsWhat = pStrWhat->get(0);
105     }
106
107     if (wcsWhat == L"local" || wcsWhat == L"get")
108     {
109         size = symbol::Context::getInstance()->getVarsNameForWho(lstVar, bSorted);
110     }
111     else if (wcsWhat == L"global")
112     {
113         size = symbol::Context::getInstance()->getGlobalNameForWho(lstVar, bSorted);
114     }
115     else if (bSorted == false && wcsWhat == L"sorted")
116     {
117         bSorted = true;
118         std::wstringstream wstream;
119         symbol::Context::getInstance()->print(wstream, bSorted);
120         wstream << std::endl;
121         scilabForcedWriteW(wstream.str().c_str());
122         return types::Function::OK;
123     }
124     else
125     {
126         if (bSorted)
127         {
128             Scierror(999, _("%s: Wrong value for input argument #%d: 'local', 'get' or 'global' expected.\n"), "who", 1);
129         }
130         else
131         {
132             Scierror(999, _("%s: Wrong value for input argument #%d: 'local', 'get', 'global' or 'sorted' expected.\n"), "who", 1);
133         }
134
135         return types::Function::Error;
136     }
137
138     if (lstVar.empty())
139     {
140         out.push_back(types::Double::Empty());
141         if (_iRetCount == 2)
142         {
143             out.push_back(types::Double::Empty());
144         }
145
146         return types::Function::OK;
147     }
148
149     pStrOut = new types::String(size, 1);
150     int i = 0;
151     for (auto it : lstVar)
152     {
153         pStrOut->set(i++, it.c_str());
154     }
155
156     out.push_back(pStrOut);
157
158     if (_iRetCount == 2)
159     {
160         pDblOut = new types::Double(pStrOut->getDims(), pStrOut->getDimsArray());
161         memset(pDblOut->get(), 0x00, pDblOut->getSize() * sizeof(double));
162         out.push_back(pDblOut);
163     }
164
165     return types::Function::OK;
166 }