* Bug 16365 fixed: median(m,'r'|'c') was wrong after 5dc990
[scilab.git] / scilab / modules / string / sci_gateway / cpp / sci_strcspn.cpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) Digiteo 2011 - Cedric DELAMARRE
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 "function.hxx"
18 #include "string.hxx"
19 #include "list.hxx"
20 #include "double.hxx"
21 #include "function.hxx"
22 #include "string_gw.hxx"
23
24 extern "C"
25 {
26 #include "core_math.h"
27 #include "localization.h"
28 #include "Scierror.h"
29 }
30
31
32 types::Function::ReturnValue sci_strcspn(types::typed_list &in, int _iRetCount, types::typed_list &out)
33 {
34     types::Double* pOutDouble   = NULL;
35     types::String* pString      = NULL;
36     types::String* pStrSample   = NULL;
37     int j                       = 0;
38     if (in.size() != 2)
39     {
40         Scierror(77, _("%s: Wrong number of input argument(s): %d expected.\n"), "strcspn", 2);
41         return types::Function::Error;
42     }
43     if (_iRetCount > 1)
44     {
45         Scierror(78, _("%s: Wrong number of output argument(s): %d expected.\n"), "strcspn", 1);
46         return types::Function::Error;
47     }
48     if (in[0]->isString() == false)
49     {
50         Scierror(999, _("%s: Wrong type for input argument #%d: String expected.\n"), "strcspn", 1);
51         return types::Function::Error;
52     }
53     if (in[1]->isString() == false)
54     {
55         Scierror(999, _("%s: Wrong type for input argument #%d: String expected.\n"), "strcspn", 2);
56         return types::Function::Error;
57     }
58
59     pString     = in[0]->getAs<types::String>();
60     pStrSample  = in[1]->getAs<types::String>();
61
62
63     if (pString->getSize() != pStrSample->getSize() && pStrSample->isScalar() == false)
64     {
65         Scierror(999, _("%s: Wrong size for input argument #%d.\n"), "strcspn", 2);
66         return types::Function::Error;
67     }
68
69     pOutDouble  = new types::Double(pString->getDims(), pString->getDimsArray());
70     for (int i = 0 ; i < pString->getSize() ; i++)
71     {
72         if (pStrSample->isScalar() == false)
73         {
74             j = i;
75         }
76
77         pOutDouble->set(i, (double)wcscspn(pString->get(i), pStrSample->get(j)));
78     }
79
80     out.push_back(pOutDouble);
81     return types::Function::OK;
82 }
83