* Bug #15034 fixed : Unable to create a structure using mlist.
[scilab.git] / scilab / modules / ast / src / cpp / types / mlist.cpp
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2010-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 #include <sstream>
17 #include "mlist.hxx"
18 #include "callable.hxx"
19 #include "overload.hxx"
20 #include "configvariable.hxx"
21 #include "exp.hxx"
22
23 #ifndef NDEBUG
24 #include "inspector.hxx"
25 #endif
26
27 namespace types
28 {
29 bool MList::invoke(typed_list & in, optional_list & /*opt*/, int _iRetCount, typed_list & out, const ast::Exp & e)
30 {
31     if (in.size() == 0)
32     {
33         out.push_back(this);
34         return true;
35     }
36     else if (in.size() == 1)
37     {
38         InternalType * arg = in[0];
39         InternalType* _out = NULL;
40         if (arg->isString())
41         {
42             std::list<std::wstring> stFields;
43             String * pString = arg->getAs<types::String>();
44             for (int i = 0; i < pString->getSize(); ++i)
45             {
46                 stFields.push_back(pString->get(i));
47             }
48
49             _out = extractStrings(stFields);
50
51             if (_out)
52             {
53                 List* pList = _out->getAs<types::List>();
54                 for (int i = 0; i < pList->getSize(); i++)
55                 {
56                     out.push_back(pList->get(i));
57                 }
58                 delete pList;
59             }
60         }
61
62         if (!out.empty())
63         {
64             return true;
65         }
66     }
67
68     Callable::ReturnValue ret;
69     // Overload of extraction need
70     // the mlist from where we extract
71     this->IncreaseRef();
72     in.push_back(this);
73
74     try
75     {
76         ret = Overload::call(L"%" + getShortTypeStr() + L"_e", in, _iRetCount, out);
77     }
78     catch (ast::InternalError & /*se*/)
79     {
80         ret = Overload::call(L"%l_e", in, _iRetCount, out);
81     }
82
83     // Remove this from "in" for keep "in" unchanged.
84     this->DecreaseRef();
85     in.pop_back();
86
87     if (ret == Callable::Error)
88     {
89         throw ast::InternalError(ConfigVariable::getLastErrorMessage(), ConfigVariable::getLastErrorNumber(), e.getLocation());
90     }
91
92     return true;
93 }
94 }