3309be01850ca61525011fa5597b90d2d8588df0
[scilab.git] / scilab / modules / string / sci_gateway / cpp / sci_strchr.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_strchr(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"), "strchr", 2);
39         return types::Function::Error;
40     }
41     if (_iRetCount != 1)
42     {
43         Scierror(78, _("%s: Wrong number of output argument(s): %d expected.\n"), "strchr", 1);
44         return types::Function::Error;
45     }
46     if (in[0]->isString() == false)
47     {
48         Scierror(999, _("%s: Wrong type for input argument #%d: String expected.\n"), "strchr", 1);
49         return types::Function::Error;
50     }
51     if (in[1]->isString() == false)
52     {
53         Scierror(999, _("%s: Wrong type for input argument #%d: String expected.\n"), "strchr", 2);
54         return types::Function::Error;
55     }
56
57     pString      = in[0]->getAs<types::String>();
58     pCharSample  = in[1]->getAs<types::String>();
59
60     if (pString->getSize() == 0)
61     {
62         Scierror(999, _("%s: Wrong size for input argument #%d: Non-empty matrix of strings expected.\n"), "strchr", 1);
63         return types::Function::Error;
64     }
65
66     if (pCharSample->getSize() == 0)
67     {
68         Scierror(999, _("%s: Wrong size for input argument #%d: Non-empty matrix of strings expected.\n"), "strchr", 2);
69         return types::Function::Error;
70     }
71
72     if (pString->getSize() != pCharSample->getSize() && pCharSample->isScalar() == false)
73     {
74         Scierror(999, _("%s: Wrong size for input argument #%d.\n"), "strchr", 2);
75         return types::Function::Error;
76     }
77
78     pOutString  = new types::String(pString->getDims(), pString->getDimsArray());
79
80     int j = 0; /* Input parameter two is dimension one */
81     for (int i = 0 ; i < pString->getSize() ; i++)
82     {
83         if (pCharSample->isScalar() == false)
84         {
85             j = i; /* Input parameter One & two have same dimension */
86         }
87         int iLen = (int)strlen(pCharSample->get(j));
88         if (iLen != 1)
89         {
90             Scierror(999, _("%s: Wrong type for input argument #%d: Char(s) expected.\n"), "strchr", 2);
91             delete pOutString;
92             return types::Function::Error;
93         }
94
95         if (strlen(pString->get(i)) < strlen(pCharSample->get(j)))
96         {
97             pOutString->set(i, "");
98         }
99         else
100         {
101             char* ptrstrstr = strchr(pString->get(i), pCharSample->get(j)[0]);
102             if (ptrstrstr)
103             {
104                 pOutString->set(i, ptrstrstr);
105                 if (pOutString->get(i) == NULL)
106                 {
107                     delete pOutString;
108                     FREE(ptrstrstr);
109                     Scierror(999, _("%s: No more memory.\n"), "strchr");
110                     return types::Function::Error;
111                 }
112             }
113             else
114             {
115                 pOutString->set(i, "");
116                 if (pOutString->get(i) == NULL)
117                 {
118                     delete pOutString;
119                     Scierror(999, _("%s: No more memory.\n"), "strchr");
120                     return types::Function::Error;
121                 }
122             }
123         }
124     }
125
126     out.push_back(pOutString);
127     return types::Function::OK;
128 }
129