* Bug 16365 fixed: median(m,'r'|'c') was wrong after 5dc990
[scilab.git] / scilab / modules / string / sci_gateway / cpp / sci_strrchr.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 "funcmanager.hxx"
21 #include "string_gw.hxx"
22
23 extern "C"
24 {
25 #include "sci_malloc.h"
26 #include "os_string.h"
27 #include "core_math.h"
28 #include "localization.h"
29 #include "Scierror.h"
30 }
31
32
33 types::Function::ReturnValue sci_strrchr(types::typed_list &in, int _iRetCount, types::typed_list &out)
34 {
35     types::String* pOutString   = NULL;
36     types::String* pString      = NULL;
37     types::String* pCharSample  = NULL;
38
39     if (in.size() != 2)
40     {
41         Scierror(77, _("%s: Wrong number of input argument(s): %d expected.\n"), "strrchr", 2);
42         return types::Function::Error;
43     }
44     if (_iRetCount > 1)
45     {
46         Scierror(78, _("%s: Wrong number of output argument(s): %d expected.\n"), "strrchr", 1);
47         return types::Function::Error;
48     }
49     if (in[0]->isString() == false)
50     {
51         Scierror(999, _("%s: Wrong type for input argument #%d: String expected.\n"), "strrchr", 1);
52         return types::Function::Error;
53     }
54     if (in[1]->isString() == false)
55     {
56         Scierror(999, _("%s: Wrong type for input argument #%d: String expected.\n"), "strrchr", 2);
57         return types::Function::Error;
58     }
59
60     pString      = in[0]->getAs<types::String>();
61     pCharSample  = in[1]->getAs<types::String>();
62
63     if (pString->getSize() == 0)
64     {
65         Scierror(999, _("%s: Wrong size for input argument #%d: Non-empty matrix of strings expected.\n"), "strrchr", 1);
66         return types::Function::Error;
67     }
68
69     if (pCharSample->getSize() == 0)
70     {
71         Scierror(999, _("%s: Wrong size for input argument #%d: Non-empty matrix of strings expected.\n"), "strrchr", 2);
72         return types::Function::Error;
73     }
74
75     if (pString->getSize() != pCharSample->getSize() && pCharSample->isScalar() == false)
76     {
77         Scierror(999, _("%s: Wrong size for input argument #%d.\n"), "strrchr", 2);
78         return types::Function::Error;
79     }
80
81     pOutString  = new types::String(pString->getDims(), pString->getDimsArray());
82
83     int j = 0; /* Input parameter two is dimension one */
84     for (int i = 0 ; i < pString->getSize() ; i++)
85     {
86         if (pCharSample->isScalar() == false)
87         {
88             j = i; /* Input parameter One & two have same dimension */
89         }
90         int iLen = (int)wcslen(pCharSample->get(j));
91         if (iLen != 1)
92         {
93             Scierror(999, _("%s: Wrong type for input argument #%d: Char(s) expected.\n"), "strrchr", 2);
94             delete pOutString;
95             return types::Function::Error;
96         }
97
98         if (wcslen(pString->get(i)) < wcslen(pCharSample->get(j)))
99         {
100             pOutString->set(i, L"");
101         }
102         else
103         {
104             wchar_t* ptrwstrstr = wcsrchr(pString->get(i), pCharSample->get(j)[0]);
105
106             if (ptrwstrstr)
107             {
108                 pOutString->set(i, ptrwstrstr);
109                 if (pOutString->get(i) == NULL)
110                 {
111                     delete pOutString;
112                     FREE(ptrwstrstr);
113                     Scierror(999, _("%s: No more memory.\n"), "strrchr");
114                     return types::Function::Error;
115                 }
116             }
117             else
118             {
119                 pOutString->set(i, L"");
120                 if (pOutString->get(i) == NULL)
121                 {
122                     delete pOutString;
123                     Scierror(999, _("%s: No more memory.\n"), "strrchr");
124                     return types::Function::Error;
125                 }
126             }
127         }
128     }
129
130     out.push_back(pOutString);
131     return types::Function::OK;
132 }
133