* Bug 16365 fixed: median(m,'r'|'c') was wrong after 5dc990
[scilab.git] / scilab / modules / string / sci_gateway / cpp / sci_convstr.cpp
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2011-2011 - DIGITEO - Bruno JOFRET
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 #include "string_gw.hxx"
17 #include "function.hxx"
18 #include "string.hxx"
19 #include "double.hxx"
20
21 extern "C"
22 {
23 #include "Scierror.h"
24 #include "localization.h"
25 }
26
27 types::Function::ReturnValue sci_convstr(types::typed_list &in, int _iRetCount, types::typed_list &out)
28 {
29     int iConvertMode = -1; // Default is TO_LOWER
30
31     if (_iRetCount > 1)
32     {
33         Scierror(78, _("%s: Wrong number of output argument(s): %d expected.\n"), "convstr", 1);
34         return types::Function::Error;
35     }
36
37     if (in.size() != 1 && in.size() != 2)
38     {
39         Scierror(77, _("%s: Wrong number of input argument(s): %d or %d expected.\n"), "convstr", 1, 2);
40         return types::Function::Error;
41     }
42
43     if (in[0]->isString() == false && !(in[0]->isDouble() == true && in[0]->getAs<types::Double>()->isEmpty() == true))
44     {
45         Scierror(999, _("%s: Wrong type for input argument #%d: Matrix of strings expected.\n"), "convstr", 2);
46         return types::Function::Error;
47     }
48
49     if (in.size() == 2 && in[1]->isString() == true)
50     {
51         types::String *pInConvertMode = in[1]->getAs<types::String>();
52         if (pInConvertMode->getSize() != 1 || wcslen(pInConvertMode->get(0)) != 1)
53         {
54             Scierror(999, _("%s: Wrong value for input argument #%d: 'u' (Upper) or 'l' (Lower) expected.\n"), "convstr", 2);
55             return types::Function::Error;
56         }
57
58         wchar_t wcConvertMode = pInConvertMode->get(0)[0];
59         if (wcConvertMode == L'l' || wcConvertMode == L'L' )
60         {
61             iConvertMode = -1;
62         }
63         else if (wcConvertMode == L'u' || wcConvertMode == L'U')
64         {
65             iConvertMode = 1;
66         }
67         else
68         {
69             Scierror(999, _("%s: Wrong value for input argument #%d: 'u' (Upper) or 'l' (Lower) expected.\n"), "convstr", 2);
70             return types::Function::Error;
71         }
72     }
73
74     // Special case convstr([], *) == []
75     if (in[0]->isDouble())
76     {
77         out.push_back(types::Double::Empty());
78         return types::Function::OK;
79     }
80
81
82     types::String* pstConvertMe = static_cast<types::String*>(in[0]->getAs<types::String>()->clone());
83
84     for (int i = 0 ; i < pstConvertMe->getSize() ; ++i)
85     {
86         wchar_t *pwcsCurrent = pstConvertMe->get(i);
87         for (int j = 0 ; j < wcslen(pwcsCurrent) ; ++j)
88         {
89             if (iConvertMode == 1)
90             {
91                 pwcsCurrent[j] = towupper(pwcsCurrent[j]);
92             }
93             else
94             {
95                 pwcsCurrent[j] = towlower(pwcsCurrent[j]);
96             }
97         }
98     }
99
100     out.push_back(pstConvertMe);
101
102     return types::Function::OK;
103 }