2c50dd45e373204809d6caec737c96fc01b65cd0
[scilab.git] / scilab / modules / fileio / sci_gateway / cpp / sci_getlongpathname.cpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 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 "fileio_gw.hxx"
17 #include "function.hxx"
18 #include "string.hxx"
19 #include "bool.hxx"
20
21 extern "C"
22 {
23 #include "pathconvert.h"
24 #include "getlongpathname.h"
25 #include "Scierror.h"
26 #include "localization.h"
27 }
28 /*--------------------------------------------------------------------------*/
29 types::Function::ReturnValue sci_getlongpathname(types::typed_list &in, int _iRetCount, types::typed_list &out)
30 {
31     if (in.size() != 1)
32     {
33         Scierror(999, _("%s: Wrong number of input arguments: %d expected.\n"), "getlongpathname", 1);
34         return types::Function::Error;
35     }
36
37     if (_iRetCount > 2)
38     {
39         Scierror(78, _("%s: Wrong number of output argument(s): %d to %d expected.\n"), "getlongpathname", 1, 2);
40         return types::Function::Error;
41     }
42
43     if (in[0]->isString() == false)
44     {
45         Scierror(999, _("%s: Wrong type for input argument #%d: Matrix of strings expected.\n"), "getlongpathname", 1);
46         return types::Function::Error;
47     }
48
49     types::String* pS = in[0]->getAs<types::String>();
50
51     types::String* pOut1 = new types::String(pS->getRows(), pS->getCols());
52     types::Bool* pOut2 = new types::Bool(pS->getRows(), pS->getCols());
53     int* pBool = pOut2->get();
54     int size = pS->getSize();
55     wchar_t** p = pS->get();
56     for (int i = 0; i < size; i++)
57     {
58         BOOL flagtrail = FALSE;
59         wchar_t* tmp = getlongpathnameW(p[i], (BOOL*)&pBool[i]);
60         if (p[i][wcslen(p[i]) - 1] == '\\' || p[i][wcslen(p[i]) - 1] == '/')
61         {
62             flagtrail = TRUE;
63         }
64
65         wchar_t* pwstPath = pathconvertW(tmp, flagtrail, FALSE, AUTO_STYLE);
66         pOut1->set(i, pwstPath);
67         FREE(pwstPath);
68         FREE(tmp);
69     }
70
71     out.push_back(pOut1);
72     if (_iRetCount == 2)
73     {
74         out.push_back(pOut2);
75     }
76     else
77     {
78         delete pOut2;
79     }
80
81     return types::Function::OK;
82 }
83 /*--------------------------------------------------------------------------*/