utf: module string 2
[scilab.git] / scilab / modules / string / sci_gateway / cpp / sci_strspn.cpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) Digiteo 2011 - Cedric DELAMARRE
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13
14 #include "function.hxx"
15 #include "string.hxx"
16 #include "list.hxx"
17 #include "double.hxx"
18 #include "function.hxx"
19 #include "string_gw.hxx"
20
21 extern "C"
22 {
23 #include "core_math.h"
24 #include "localization.h"
25 #include "Scierror.h"
26 }
27
28
29 types::Function::ReturnValue sci_strspn(types::typed_list &in, int _iRetCount, types::typed_list &out)
30 {
31     types::Double* pOutDouble   = NULL;
32     types::String* pString      = NULL;
33     types::String* pStrSample   = NULL;
34     int j                       = 0;
35     if (in.size() != 2)
36     {
37         Scierror(77, _("%s: Wrong number of input argument(s): %d expected.\n"), "strspn", 2);
38         return types::Function::Error;
39     }
40     if (_iRetCount != 1)
41     {
42         Scierror(78, _("%s: Wrong number of output argument(s): %d expected.\n"), "strspn", 1);
43         return types::Function::Error;
44     }
45     if (in[0]->isString() == false)
46     {
47         Scierror(999, _("%s: Wrong type for input argument #%d: String expected.\n"), "strspn", 1);
48         return types::Function::Error;
49     }
50     if (in[1]->isString() == false)
51     {
52         Scierror(999, _("%s: Wrong type for input argument #%d: String expected.\n"), "strspn", 2);
53         return types::Function::Error;
54     }
55
56     pString     = in[0]->getAs<types::String>();
57     pStrSample  = in[1]->getAs<types::String>();
58
59
60     if (pString->getSize() != pStrSample->getSize() && pStrSample->isScalar() == false)
61     {
62         Scierror(999, _("%s: Wrong size for input argument #%d.\n"), "strspn", 2);
63         return types::Function::Error;
64     }
65
66     pOutDouble  = new types::Double(pString->getDims(), pString->getDimsArray());
67     for (int i = 0 ; i < pString->getSize() ; i++)
68     {
69         if (pStrSample->isScalar() == false)
70         {
71             j = i;
72         }
73
74         wchar_t* w = to_wide_string(pString->get()[i]);
75         wchar_t* s = to_wide_string(pStrSample->get()[j]);
76
77         pOutDouble->set(i, (double)wcsspn(w, s));
78         FREE(s);
79         FREE(w);
80     }
81
82     out.push_back(pOutDouble);
83     return types::Function::OK;
84 }
85