utf: module string 2
[scilab.git] / scilab / modules / string / sci_gateway / cpp / sci_isascii.cpp
1 /*
2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2013 - Scilab Enterprises - 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 #include "string_gw.hxx"
14 #include "function.hxx"
15 #include "string.hxx"
16 #include "double.hxx"
17 #include "bool.hxx"
18
19 extern "C"
20 {
21 #include "BOOL.h"
22 #include "Scierror.h"
23 #include "localization.h"
24 #include "isascii.h"
25 }
26
27 types::Function::ReturnValue sci_isascii(types::typed_list &in, int _iRetCount, types::typed_list &out)
28 {
29     types::Bool* pBOut = NULL;
30
31     if (in.size() != 1)
32     {
33         Scierror(999, _("%s: Wrong number of input arguments: %d expected.\n"), "isascii", 1);
34         return types::Function::Error;
35     }
36
37     if (_iRetCount != 1)
38     {
39         Scierror(999, _("%s: Wrong number of output arguments: %d expected.\n"), "isascii", 1);
40         return types::Function::Error;
41     }
42
43     if (in[0]->isString())
44     {
45         types::String* pIn = in[0]->getAs<types::String>();
46         if (pIn->getSize() == 0)
47         {
48             out.push_back(types::Double::Empty());
49             return types::Function::OK;
50         }
51
52         // concatenate all strings
53         std::string s(pIn->get(0));
54         for (int i = 1; i < pIn->getSize(); i++)
55         {
56             s += std::string(pIn->get(i));
57         }
58
59         int iResultSize = 0;
60         int* pbResult = (int*)isasciiString(s.c_str(), &iResultSize);
61         if (pbResult == NULL)
62         {
63             out.push_back(types::Double::Empty());
64             return types::Function::OK;
65         }
66
67         pBOut = new types::Bool(1, iResultSize);
68         pBOut->set(pbResult);
69         FREE(pbResult);
70         out.push_back(pBOut);
71     }
72     else if (in[0]->isDouble())
73     {
74         types::Double* pIn = in[0]->getAs<types::Double>();
75         int* pbResult = (int*)isasciiMatrix(pIn->get(), pIn->getSize());
76         if (pbResult == NULL)
77         {
78             out.push_back(types::Double::Empty());
79             return types::Function::OK;
80         }
81
82         pBOut = new types::Bool(1, pIn->getSize());
83         pBOut->set(pbResult);
84         FREE(pbResult);
85         out.push_back(pBOut);
86     }
87     else
88     {
89         Scierror(999, _("%s: Wrong type for input argument #%d: string or matrix expected.\n"), "isascii", 1);
90         return types::Function::Error;
91     }
92
93     return types::Function::OK;
94 }
95 /*-------------------------------------------------------------------------------------*/