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