* Bug #13102 fixed - matio: 7.3 support
[scilab.git] / scilab / modules / matio / sci_gateway / c / sci_matfile_close.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2008 - INRIA - Vincent COUVERT
4  * Copyright (C) 2010 - DIGITEO - Yann COLLETTE
5  *
6  * This file must be used under the terms of the CeCILL.
7  * This source file is licensed as described in the file COPYING, which
8  * you should have received as part of this distribution.  The terms
9  * are also available at
10  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
11  *
12  */
13
14 #include "matfile_manager.h"
15 #include "localization.h"
16 #include "gw_matio.h"
17 #include "Scierror.h"
18 #include "sciprint.h"
19
20 #include "api_scilab.h"
21
22 /*******************************************************************************
23 Interface for MATIO function called Mat_Close
24 Scilab function name : matfile_close
25 *******************************************************************************/
26 int sci_matfile_close(char *fname, unsigned long fname_len)
27 {
28     mat_t * matfile = NULL;
29     int fileIndex = 0;
30     int nbRow = 0, nbCol = 0;
31     int * fd_addr = NULL;
32     int flag = 1, var_type;
33     double * fd_val = NULL;
34     SciErr sciErr;
35
36     CheckRhs(1, 1);
37     CheckLhs(1, 1);
38
39     /* First Rhs is the index of the file to close */
40     sciErr = getVarAddressFromPosition(pvApiCtx, 1, &fd_addr);
41     if (sciErr.iErr)
42     {
43         printError(&sciErr, 0);
44         return 0;
45     }
46     sciErr = getVarType(pvApiCtx, fd_addr, &var_type);
47     if (sciErr.iErr)
48     {
49         printError(&sciErr, 0);
50         return 0;
51     }
52
53     if (var_type == sci_matrix)
54     {
55         sciErr = getMatrixOfDouble(pvApiCtx, fd_addr, &nbRow, &nbCol, &fd_val);
56         if (sciErr.iErr)
57         {
58             printError(&sciErr, 0);
59             return 0;
60         }
61         if (nbRow * nbCol != 1)
62         {
63             Scierror(999, _("%s: Wrong size for first input argument: Single double expected.\n"), fname);
64             return FALSE;
65         }
66         fileIndex = (int) * fd_val;
67     }
68     else
69     {
70         Scierror(999, _("%s: Wrong type for first input argument: Double expected.\n"), fname);
71         return FALSE;
72     }
73
74     /* Gets the corresponding matfile to close it */
75     /* The manager clears its static matfile table */
76     matfile_manager(MATFILEMANAGER_DELFILE, &fileIndex, &matfile);
77
78     /* If the file has not already been closed, it's closed */
79     if (matfile != NULL)
80     {
81         flag = Mat_Close(matfile);
82     }
83     else /* The user is informed */
84     {
85         sciprint("File already closed.\n");
86     }
87
88     /* Return execution flag */
89     var_type = (flag == 0);
90     createScalarBoolean(pvApiCtx, Rhs + 1, var_type);
91
92     LhsVar(1) = Rhs + 1;
93
94     PutLhsVar();
95
96     return TRUE;
97 }