Analysis: fix bugs found with Coverity
[scilab.git] / scilab / modules / functions / sci_gateway / cpp / sci_testAnalysis.cpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2015 - Scilab Enterprises - Calixte DENIZET
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 <string.h>
14
15 #include "AnalysisVisitor.hxx"
16
17 #include "parser.hxx"
18 #include "functions_gw.hxx"
19 #include "execvisitor.hxx"
20 #include "mutevisitor.hxx"
21 #include "debugvisitor.hxx"
22 #include "printvisitor.hxx"
23 #include "visitor_common.hxx"
24 #include "scilabWrite.hxx"
25 #include "configvariable.hxx"
26 #include "context.hxx"
27
28 #include <iostream>
29 #include <fstream>
30 #include <string>
31
32 extern "C"
33 {
34 #include "Scierror.h"
35 #include "localization.h"
36 }
37
38 using namespace std;
39 using namespace types;
40 using namespace ast;
41
42 /*--------------------------------------------------------------------------*/
43 Function::ReturnValue sci_testAnalysis(types::typed_list &in, int _iRetCount, types::typed_list &out)
44 {
45     if (in.size() == 0)
46     {
47         Scierror(999, _("%s: Wrong number of input arguments: at least %d expected.\n"), "testAnalysis", 1);
48         return Function::Error;
49     }
50
51     // check that arguments are a string
52     unsigned int i = 1;
53     Location loc;
54     ast::exps_t * args = new exps_t();
55     args->reserve(in.size() - 1);
56     for (const auto arg : in)
57     {
58         if (!arg->isString() || arg->getAs<types::String>()->getSize() != 1)
59         {
60             delete args;
61             Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"), "testAnalysis", i);
62             return Function::Error;
63         }
64         if (i > 1)
65         {
66             symbol::Symbol sym(arg->getAs<types::String>()->get(0));
67             args->emplace_back(new ast::SimpleVar(loc, sym));
68         }
69         ++i;
70     }
71
72     symbol::Symbol sym(in[0]->getAs<types::String>()->get(0));
73     ast::SimpleVar * var = new ast::SimpleVar(loc, sym);
74     ast::CallExp ce(loc, *var, *args);
75
76     analysis::AnalysisVisitor analysis;
77     ce.accept(analysis);
78
79     //analysis.print_info();
80
81     analysis::TIType & t = analysis.getResult().getType();
82     Struct * pOut = new Struct(1, 1);
83     pOut->addField(L"type");
84     pOut->get(0)->set(L"type", new String(analysis::TIType::toString(t.type).c_str()));
85
86     pOut->addField(L"rows");
87     if (t.rows.isConstant())
88     {
89         pOut->get(0)->set(L"rows", new Double(t.rows.getConstant()));
90     }
91     else
92     {
93         pOut->get(0)->set(L"rows", new Double(analysis::tools::NaN()));
94     }
95
96     pOut->addField(L"cols");
97     if (t.cols.isConstant())
98     {
99         pOut->get(0)->set(L"cols", new Double(t.cols.getConstant()));
100     }
101     else
102     {
103         pOut->get(0)->set(L"cols", new Double(analysis::tools::NaN()));
104     }
105     out.push_back(pOut);
106
107     //ast::DebugVisitor debugMe;
108     //pExp->accept(debugMe);
109
110     //ast::PrintVisitor printMe(std::wcout);
111     //pExp->accept(printMe);
112
113     return Function::OK;
114 }