setfield and bug_5588 tests updated because setfield function returns now variable...
[scilab.git] / scilab / modules / data_structures / sci_gateway / cpp / sci_setfield.cpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2013 - Scilab Enterprises - 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 /*--------------------------------------------------------------------------*/
17 #include "data_structures_gw.hxx"
18 #include "function.hxx"
19 #include "string.hxx"
20 #include "list.hxx"
21 #include "mlist.hxx"
22 #include "tlist.hxx"
23
24 extern "C"
25 {
26 #include "Scierror.h"
27 #include "sci_malloc.h"
28 #include "localization.h"
29 #include "freeArrayOfString.h"
30 }
31
32 /*-----------------------------------------------------------------------------------*/
33 types::Function::ReturnValue sci_setfield(types::typed_list &in, int _iRetCount, types::typed_list &out)
34 {
35     if (in.size() != 3)
36     {
37         Scierror(77, _("%s: Wrong number of input argument(s): %d expected.\n"), "setfield", 3);
38         return types::Function::Error;
39     }
40
41     if (_iRetCount > 1)
42     {
43         Scierror(78, _("%s: Wrong number of output argument(s): %d expected.\n"), "setfield", 1);
44         return types::Function::Error;
45     }
46
47
48     types::InternalType* pIndex = in[0];
49     types::InternalType* pData = in[1];
50     types::List* pL = in[2]->getAs<types::List>();
51     if (pL->isDeletable() == false)
52     {
53         pL = pL->clone();
54     }
55
56     if (pL->isList() == false && pL->isMList() == false && pL->isTList() == false)
57     {
58         Scierror(999, _("%s:  Wrong type for input argument #%d: List expected.\n"), "setfield", 3);
59         return types::Function::Error;
60     }
61
62     if (pIndex->isString())
63     {
64         //insertion by fieldname
65         types::String* pS = pIndex->getAs<types::String>();
66         if ((pL->isMList() == false && pL->isTList() == false) || pS->getSize() != 1)
67         {
68             Scierror(999, _("%s: Not implemented in scilab...\n"), "setfield");
69             return types::Function::Error;
70         }
71
72         types::TList* pT = pL->getAs<types::TList>();
73
74         std::wstring stField = pS->get(0);
75         types::TList* pRet = pT->set(stField, pData);
76         if (pRet == nullptr)
77         {
78             Scierror(999, _("%s: Invalid index.\n"), "setfield");
79             return types::Function::Error;
80         }
81
82         out.push_back(pRet);
83     }
84     else
85     {
86         //insertion by index
87         types::typed_list Args;
88         Args.push_back(pIndex);
89         types::InternalType* pRet = pL->insert(&Args, pData);
90         if (pRet == nullptr)
91         {
92             Scierror(999, _("%s: Invalid index.\n"), "setfield");
93             return types::Function::Error;
94         }
95
96         out.push_back(pRet);
97     }
98
99     return types::Function::OK;
100 }
101 /*-----------------------------------------------------------------------------------*/