* Bug 16365 fixed: median(m,'r'|'c') was wrong after 5dc990
[scilab.git] / scilab / modules / string / sci_gateway / cpp / sci_strtok.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 "double.hxx"
19 #include "string.hxx"
20 #include "list.hxx"
21 #include "funcmanager.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 #include "os_string.h"
30 #include "os_wcstok.h"
31 #include <stdio.h>
32 }
33
34 types::Function::ReturnValue sci_strtok(types::typed_list &in, int _iRetCount, types::typed_list &out)
35 {
36     static wchar_t *pwstState  = NULL;
37     wchar_t *pwstString = NULL;
38
39     wchar_t* pwstSeps           = NULL;
40     int dims                    = 2;
41     int dimsArray[2]            = {1, 1};
42
43     if (in.size() < 1 || in.size() > 2)
44     {
45         Scierror(77, _("%s: Wrong number of input argument(s): %d to %d expected.\n"), "strtok", 1, 2);
46         return types::Function::Error;
47     }
48
49     if (_iRetCount > 1)
50     {
51         Scierror(78, _("%s: Wrong number of output argument(s): %d expected.\n"), "strtok", 1);
52         return types::Function::Error;
53     }
54
55     if (in[0]->isString() == false || in[0]->getAs<types::String>()->isScalar() == false)
56     {
57         Scierror(999, _("%s: Wrong type for input argument #%d: String expected.\n"), "strtok", 1);
58         return types::Function::Error;
59     }
60
61     if (in.size() == 2 && (in[1]->isString() == false || in[1]->getAs<types::String>()->isScalar() == false))
62     {
63         Scierror(999, _("%s: Wrong type for input argument #%d: String expected.\n"), "strtok", 2);
64         return types::Function::Error;
65     }
66
67     if (in.size() == 1)
68     {
69         pwstSeps    = in[0]->getAs<types::String>()->get(0);
70     }
71     else
72     {
73         pwstString = StringModule::setToken(in[0]->getAs<types::String>()->get()[0]);
74         pwstSeps    = in[1]->getAs<types::String>()->get(0);
75         pwstState   = NULL;
76
77         if (wcslen(pwstString) == 0)
78         {
79             out.push_back(new types::String(L""));
80             return types::Function::OK;
81         }
82     }
83
84     wchar_t* pwstToken = NULL;
85     if (pwstString == NULL && pwstState == NULL)
86     {
87         // set an empty string
88         pwstToken = L"";
89     }
90     else
91     {
92         pwstToken = os_wcstok(pwstString, pwstSeps, &pwstState);
93     }
94
95     if (pwstToken)
96     {
97         out.push_back(new types::String(pwstToken));
98     }
99     else
100     {
101         StringModule::deleteToken();
102         out.push_back(new types::String(L""));
103     }
104
105     return types::Function::OK;
106 }
107