fileinfo transposes intput matrix if it's not a column vector
[scilab.git] / scilab / modules / fileio / sci_gateway / cpp / sci_fileinfo.cpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2006 - INRIA - Allan CORNET
4  * Copyright (C) 2009 - DIGITEO - Allan CORNET
5  * Copyright (C) 2010 - DIGITEO - Antoine ELIAS
6  *
7  * This file must be used under the terms of the CeCILL.
8  * This source file is licensed as described in the file COPYING, which
9  * you should have received as part of this distribution.  The terms
10  * are also available at
11  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
12  *
13  */
14 /*--------------------------------------------------------------------------*/
15
16 #include "function.hxx"
17 #include "string.hxx"
18 #include "double.hxx"
19 #include "filemanager.hxx"
20 #include "fileio_gw.hxx"
21
22 extern "C"
23 {
24 #include "sci_malloc.h"
25 #include "fileinfo.h"
26 #include "localization.h"
27 #include "Scierror.h"
28 }
29
30 using namespace types;
31
32 /*--------------------------------------------------------------------------*/
33 Function::ReturnValue sci_fileinfo(typed_list &in, int _iRetCount, typed_list &out)
34 {
35     if (in.size() != 1)
36     {
37         Scierror(77, _("%s: Wrong number of input argument(s): %d expected.\n"), "fileinfo", 1);
38         return Function::Error;
39     }
40
41     if (in[0]->isString() == false )
42     {
43         Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"), "fileinfo", 1);
44         return Function::Error;
45     }
46
47     if (_iRetCount > 2)
48     {
49         Scierror(78, _("%s: Wrong number of output arguments: %d or %d expected.\n"), "fileinfo", 1, 2);
50         return Function::Error;
51     }
52
53     String* pS = in[0]->getAs<types::String>();
54     InternalType* iT = NULL;
55     String* pS1 = NULL;
56
57     if (pS->getCols() != 1)
58     {
59         pS->transpose(iT);
60         pS = iT->getAs<types::String>();
61     }
62     int *piErr = new int[pS->getRows()];
63     double* pData = filesinfoW(pS->get(), pS->getRows(), piErr);
64
65     /* fileinfo returns [] for single non existing file to match the behavior
66        of Scilab < 6 */
67     if (pS->getRows() == 1 && *piErr == -1)
68     {
69         out.push_back(Double::Empty());
70     }
71     else
72     {
73         Double *pOut = new Double(pS->getRows(), FILEINFO_ARRAY_SIZE);
74         pOut->set(pData);
75         out.push_back(pOut);
76     }
77
78     if (_iRetCount == 2)
79     {
80         Double* pErr = new Double(pS->getRows(), 1);
81         pErr->setInt(piErr);
82         out.push_back(pErr);
83     }
84
85     delete[] piErr;
86     FREE(pData);
87     return Function::OK;
88 }
89 /*--------------------------------------------------------------------------*/
90