b376a05177a869f641136c5217d52ac20510384a
[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  * 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 "funcmanager.hxx"
18 #include "string_gw.hxx"
19
20 extern "C"
21 {
22 #include "sci_malloc.h"
23 #include "os_string.h"
24 #include "core_math.h"
25 #include "localization.h"
26 #include "Scierror.h"
27 }
28
29
30 types::Function::ReturnValue sci_strrchr(types::typed_list &in, int _iRetCount, types::typed_list &out)
31 {
32     types::String* pOutString   = NULL;
33     types::String* pString      = NULL;
34     types::String* pCharSample  = NULL;
35
36     if (in.size() != 2)
37     {
38         Scierror(77, _("%s: Wrong number of input argument(s): %d expected.\n"), "strrchr", 2);
39         return types::Function::Error;
40     }
41
42     if (_iRetCount != 1)
43     {
44         Scierror(78, _("%s: Wrong number of output argument(s): %d expected.\n"), "strrchr", 1);
45         return types::Function::Error;
46     }
47
48     if (in[0]->isString() == false)
49     {
50         Scierror(999, _("%s: Wrong type for input argument #%d: String expected.\n"), "strrchr", 1);
51         return types::Function::Error;
52     }
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)strlen(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 (strlen(pString->get(i)) < strlen(pCharSample->get(j)))
99         {
100             pOutString->set(i, "");
101         }
102         else
103         {
104             char* ptrstrstr = strrchr(pString->get(i), pCharSample->get(j)[0]);
105             if (ptrstrstr)
106             {
107                 pOutString->set(i, ptrstrstr);
108                 if (pOutString->get(i) == NULL)
109                 {
110                     delete pOutString;
111                     FREE(ptrstrstr);
112                     Scierror(999, _("%s: No more memory.\n"), "strrchr");
113                     return types::Function::Error;
114                 }
115             }
116             else
117             {
118                 pOutString->set(i, "");
119                 if (pOutString->get(i) == NULL)
120                 {
121                     delete pOutString;
122                     Scierror(999, _("%s: No more memory.\n"), "strrchr");
123                     return types::Function::Error;
124                 }
125             }
126         }
127     }
128
129     out.push_back(pOutString);
130     return types::Function::OK;
131 }
132