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