Merge remote-tracking branch 'origin/master' into windows
[scilab.git] / scilab / modules / core / sci_gateway / cpp / sci_isfield.cpp
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2011-2011 - DIGITEO - Bruno JOFRET
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 "core_gw.hxx"
17 #include "function.hxx"
18 #include "struct.hxx"
19 #include "bool.hxx"
20 #include "string.hxx"
21 #include "tlist.hxx"
22 #include "mlist.hxx"
23
24 extern "C"
25 {
26 #include "Scierror.h"
27 #include "localization.h"
28 #include "charEncoding.h"
29 }
30
31 types::Function::ReturnValue sci_isfield(types::typed_list &in, int _iRetCount, types::typed_list &out)
32 {
33     if (_iRetCount != 1)
34     {
35         Scierror(999, _("%s: Wrong number of output argument(s): %d expected.\n"), "isfield", 1);
36         return types::Function::Error;
37     }
38
39     if (in.size() != 2)
40     {
41         Scierror(999, _("%s: Wrong number of input argument(s): %d expected.\n"), "isfield", 2);
42         return types::Function::Error;
43     }
44
45     if (in[0]->isStruct() == false &&
46             in[0]->isTList()  == false &&
47             in[0]->isMList()  == false)
48     {
49         Scierror(999, _("%s: Wrong type for input argument #%d: struct array or tlist or mlist expected.\n"), "isfield", 1);
50         return types::Function::Error;
51     }
52
53     if (in[1]->isString() == false)
54     {
55         Scierror(999, _("%s: Wrong type for input argument #%d: string expected.\n"), "isfield", 2);
56         return types::Function::Error;
57     }
58
59     types::String *pInString = in[1]->getAs<types::String>();
60     char** cStr = pInString->get();
61     types::Bool *pOutBool = new types::Bool(pInString->getRows(), pInString->getCols());
62
63     switch (in[0]->getType())
64     {
65         case types::GenericType::ScilabStruct :
66         {
67             types::Struct* pStruct = in[0]->getAs<types::Struct>();
68             for (int i = 0; i < pInString->getSize(); i++)
69             {
70                 pOutBool->set(i, pStruct->exists(cStr[i]));
71             }
72             break;
73         }
74         case types::GenericType::ScilabTList :
75         case types::GenericType::ScilabMList :
76         {
77             types::TList* pTL = in[0]->getAs<types::TList>();
78             for (int i = 0; i < pInString->getSize(); i++)
79             {
80                 pOutBool->set(i, pTL->exists(cStr[i]));
81             }
82             break;
83         }
84         default:
85             // never occurs
86             return types::Function::Error;
87     }
88
89     out.push_back(pOutBool);
90     return types::Function::OK;
91 }