License Header change: Removed the LICENSE_END before beta
[scilab.git] / scilab / modules / boolean / sci_gateway / cpp / sci_and.cpp
1 /*
2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) INRIA - Allan CORNET
4 * Copyright (C) DIGITEO - 2012 - Allan CORNET
5 * Copyright (C) 2014 - Scilab Enterprises - Anais AUBERT
6 *
7  * Copyright (C) 2012 - 2016 - Scilab Enterprises
8  *
9  * This file is hereby licensed under the terms of the GNU GPL v2.0,
10  * pursuant to article 5.3.4 of the CeCILL v.2.1.
11  * This file was originally licensed under the terms of the CeCILL v2.1,
12  * and continues to be available under such terms.
13  * For more information, see the COPYING file which you should have received
14  * along with this program.
15 *
16 */
17
18 #include "boolean_gw.hxx"
19 #include "function.hxx"
20 #include "string.hxx"
21 #include "overload.hxx"
22 #include "types.hxx"
23 #include "bool.hxx"
24 #include "double.hxx"
25
26 extern "C"
27 {
28 #include <string.h>
29 #include "Scierror.h"
30 #include "localization.h"
31 #include "vect_and.h"
32 }
33 /*--------------------------------------------------------------------------*/
34 /* SCILAB function : and */
35 /*--------------------------------------------------------------------------*/
36 types::Function::ReturnValue sci_and(types::typed_list &in, int _iRetCount, types::typed_list &out)
37 {
38
39     int m1 = 0, n1 = 0;
40     int opt = 0;
41     int *pBoolValuesOne = NULL;
42     int *pBoolResult = NULL;
43
44     int *piAddressVarOne = NULL;
45
46     if ((in.size() < 1) || (in.size() > 2))
47     {
48         Scierror(999, _("%s: Wrong number of input arguments: %d to %d expected.\n"), "and", 1, 2);
49         return types::Function::Error;
50     }
51
52     if (_iRetCount > 1)
53     {
54         Scierror(999, _("%s: Wrong number of output arguments: %d to %d expected.\n"), "and", 1);
55         return types::Function::Error;
56     }
57
58     if (in[0]->isGenericType() && in[0]->getAs<types::GenericType>()->getDims() > 2)
59     {
60         //hypermatrix are manage in external macro
61         return Overload::call(L"%hm_and", in, _iRetCount, out);
62     }
63
64     if (in[0]->isBool() == false)
65     {
66         std::wstring wstFuncName = L"%" + in[0]->getShortTypeStr() + L"_and";
67         return Overload::call(wstFuncName, in, _iRetCount, out);
68     }
69
70     if (in.size() == 2)
71     {
72         if (in[1]->getAs<types::GenericType>()->isScalar() == false)
73         {
74             Scierror(999, _("%s: Wrong size for input argument #%d.\n"), "and", 2);
75             return types::Function::Error;
76         }
77
78         if (in[1]->isString())
79         {
80             char *pStr =  wide_string_to_UTF8(in[1]->getAs<types::String>()->get(0));
81             size_t len = strlen(pStr);
82             switch (pStr[0])
83             {
84                 case 'r':
85                 {
86                     opt = AND_BY_ROWS;
87                     break;
88                 }
89                 case '*':
90                 {
91                     opt = AND_ON_ALL;
92                     break;
93                 }
94                 case 'c':
95                 {
96                     opt = AND_BY_COLUMNS;
97                     break;
98                 }
99                 default:
100                 {
101                     Scierror(999, _("%s: Wrong value for input argument #%d.\n"), "and", 2);
102                     return types::Function::Error;
103                 }
104             }
105
106             delete pStr;
107             if (len != 1)
108             {
109                 Scierror(999, _("%s: Wrong value for input argument #%d.\n"), "and", 2);
110                 return types::Function::Error;
111             }
112         }
113         else if (in[1]->isDouble())
114         {
115             types::Double *pdblIn = in[1]->getAs<types::Double>();
116             if (pdblIn->isComplex())
117             {
118                 Scierror(999, _("%s: Wrong value for input argument #%d.\n"), "and", 2);
119                 return types::Function::Error;
120             }
121
122             opt = static_cast<int>(pdblIn->get(0));
123             if (opt != pdblIn->get(0))
124             {
125                 Scierror(999, _("%s: Wrong value for input argument #%d: An integer value expected.\n"), "and", 2);
126                 return types::Function::Error;
127             }
128         }
129         else
130         {
131             Scierror(999, _("%s: Wrong type for input argument #%d.\n"), "and", 2);
132             return types::Function::Error;
133         }
134     }
135
136     types::Bool *pboolIn = in[0]->getAs<types::Bool>();
137     int rowIn = pboolIn->getRows();
138     int colIn = pboolIn->getCols();
139     pBoolValuesOne = pboolIn->get();
140
141     int rowOut = 1;
142     int colOut = 1;
143
144     if (opt > 2)
145     {
146         Scierror(999, _("%s: Wrong value for input argument #%d.\n"), "and", 2);
147         return types::Function::Error;
148     }
149
150     switch (opt)
151     {
152         case 1:
153             colOut = colIn;
154             break;
155         case 2 :
156             rowOut = rowIn;
157             break;
158     }
159
160     types::Bool *pboolOut = new types::Bool(rowOut, colOut);
161     vect_and(pBoolValuesOne, rowIn, colIn, pboolOut->get(), opt);
162
163     out.push_back(pboolOut);
164     return types::Function::OK;
165 }
166 /*--------------------------------------------------------------------------*/