fileio: fix crash at Scilab startup
[scilab.git] / scilab / modules / fileio / sci_gateway / cpp / sci_getshortpathname.cpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2007 - INRIA - Allan CORNET
4  * Copyright (C) 2009 - DIGITEO - Allan CORNET
5  * Copyright (C) 2010 - DIGITEO - Antoine ELIAS
6  *
7  * Copyright (C) 2012 - 2016 - Scilab Enterprises
8  *
9  * This file is hereby licensed under the terms of the GNU GPL v2.0,
10  * pursuant to article 5.3.4 of the CeCILL v.2.1.
11  * This file was originally licensed under the terms of the CeCILL v2.1,
12  * and continues to be available under such terms.
13  * For more information, see the COPYING file which you should have received
14  * along with this program.
15  *
16  */
17 /*--------------------------------------------------------------------------*/
18 #include "fileio_gw.hxx"
19 #include "function.hxx"
20 #include "string.hxx"
21 #include "bool.hxx"
22
23 extern "C"
24 {
25 #include "pathconvert.h"
26 #include "getshortpathname.h"
27 #include "sci_malloc.h"
28 #include "Scierror.h"
29 #include "localization.h"
30 }
31 /*--------------------------------------------------------------------------*/
32 types::Function::ReturnValue sci_getshortpathname(types::typed_list &in, int _iRetCount, types::typed_list &out)
33 {
34     if (in.size() != 1)
35     {
36         Scierror(999, _("%s: Wrong number of input arguments: %d expected.\n"), "getshortpathname", 1);
37         return types::Function::Error;
38     }
39
40     if (_iRetCount > 2)
41     {
42         Scierror(78, _("%s: Wrong number of output argument(s): %d to %d expected.\n"), "getshortpathname", 1, 2);
43         return types::Function::Error;
44     }
45
46     if (in[0]->isString() == false)
47     {
48         Scierror(999, _("%s: Wrong type for input argument #%d: Matrix of strings expected.\n"), "getshortpathname", 1);
49         return types::Function::Error;
50     }
51
52     types::String* pS = in[0]->getAs<types::String>();
53
54     types::String* pOut1 = new types::String(pS->getRows(), pS->getCols());
55     types::Bool* pOut2 = new types::Bool(pS->getRows(), pS->getCols());
56     int* pBool = pOut2->get();
57     wchar_t** p = pS->get();
58     int size = pS->getSize();
59     for (int i = 0; i < size; i++)
60     {
61         BOOL flagtrail = FALSE;
62         wchar_t* tmp = getshortpathnameW(p[i], (BOOL*)&pBool[i]);
63         size_t len = wcslen(p[i]);
64         if (len > 0 && (p[i][len - 1] == '\\' || p[i][len - 1] == '/'))
65         {
66             flagtrail = TRUE;
67         }
68
69         wchar_t* pwstPath = pathconvertW(tmp, flagtrail, FALSE, AUTO_STYLE);
70         pOut1->set(i, pwstPath);
71         FREE(pwstPath);
72         FREE(tmp);
73     }
74
75     out.push_back(pOut1);
76     if (_iRetCount == 2)
77     {
78         out.push_back(pOut2);
79     }
80     else
81     {
82         pOut2->killMe();
83     }
84
85     return types::Function::OK;
86 }
87 /*--------------------------------------------------------------------------*/