Merge remote-tracking branch 'origin/master' into windows
[scilab.git] / scilab / modules / fileio / sci_gateway / cpp / sci_isfile.cpp
1 /*
2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2009 - DIGITEO - Allan CORNET
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 "sci_malloc.h"
24 #include "localization.h"
25 #include "Scierror.h"
26 #include "FileExist.h"
27 #include "isdir.h"
28 #include "expandPathVariable.h"
29 }
30
31 /*--------------------------------------------------------------------------*/
32 types::Function::ReturnValue sci_isfile(types::typed_list &in, int _iRetCount, types::typed_list &out)
33 {
34     if (in.size() != 1)
35     {
36         Scierror(77, _("%s: Wrong number of input arguments: %d expected.\n"), "isfile" , 1);
37         return types::Function::Error;
38     }
39
40     if (_iRetCount != 1)
41     {
42         Scierror(78, _("%s: Wrong number of output argument(s): %d expected.\n"), "isfile", 1);
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"), "isfile", 1);
49         return types::Function::Error;
50     }
51
52     types::String* pS = in[0]->getAs<types::String>();
53     types::Bool* pOut = new types::Bool(pS->getRows(), pS->getCols());
54
55     for (int i = 0 ; i < pS->getSize() ; i++)
56     {
57         char *expandedPath = expandPathVariable(pS->get(i));
58         if (expandedPath)
59         {
60             pOut->get()[i] = !isdir(expandedPath) && FileExist(expandedPath);
61             FREE(expandedPath);
62             expandedPath = NULL;
63         }
64         else
65         {
66             pOut->get()[i] = FALSE;
67         }
68     }
69
70     out.push_back(pOut);
71     return types::Function::OK;
72 }
73 /*--------------------------------------------------------------------------*/