Merge remote-tracking branch 'origin/master' into windows
[scilab.git] / scilab / modules / functions / sci_gateway / cpp / sci_testGVN.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 "gvn/TestGVNVisitor.hxx"
19
20 #include "parser.hxx"
21 #include "functions_gw.hxx"
22 #include "prettyprintvisitor.hxx"
23 #include "printvisitor.hxx"
24 #include "visitor_common.hxx"
25 #include "scilabWrite.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 /*--------------------------------------------------------------------------*/
39 types::Function::ReturnValue sci_testGVN(types::typed_list &in, int _iRetCount, types::typed_list &out)
40 {
41     ast::Exp * pExp = 0;
42
43     if (in.size() != 1)
44     {
45         Scierror(999, _("%s: Wrong number of input arguments: %d expected.\n"), "jit" , 1);
46         return types::Function::Error;
47     }
48
49     if (!in[0]->isString() || in[0]->getAs<types::String>()->getSize() != 1)
50     {
51         Scierror(999, _("%s: Wrong type for input argument #%d: string expected.\n"), "jit" , 1);
52         return types::Function::Error;
53     }
54
55     Parser parser;
56     parser.parse(in[0]->getAs<types::String>()->get(0));
57     if (parser.getExitStatus() != Parser::Succeded)
58     {
59         Scierror(999, "%s", parser.getErrorMessage());
60         return types::Function::Error;
61     }
62
63     pExp = parser.getTree();
64
65     if (!pExp)
66     {
67         return types::Function::Error;
68     }
69
70     analysis::TestGVNVisitor gvn;
71     pExp->accept(gvn);
72     gvn.print_info();
73
74     types::Struct * pOut = new types::Struct(1, 1);
75     std::map<std::string, uint64_t> maps = gvn.getSymMap();
76     for (const auto & p : maps)
77     {
78         pOut->addField(p.first);
79         pOut->get(0)->set(p.first, new types::Double((double)p.second));
80     }
81
82     out.push_back(pOut);
83
84     delete pExp;
85
86     return types::Function::OK;
87 }