add "-append" argument to export_to_hdf5 function, fix some memory leaks in hdf5...
[scilab.git] / scilab / modules / hdf5 / src / c / h5_fileManagement.c
1 /*
2 *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 *  Copyright (C) 2009-2009 - DIGITEO - Bruno JOFRET
4 *  Copyright (C) 2010 - DIGITEO - Antoine ELIAS
5 *  Copyright (C) 2010 - DIGITEO - Allan CORNET
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 #include <hdf5.h>
16 #include <string.h>
17 #include "h5_fileManagement.h"
18 #include "FileExist.h"
19 #include "deleteafile.h"
20 #include "isdir.h"
21 #include "splitpath.h"
22 #include "scicurdir.h"
23 #include "MALLOC.h"
24 #ifdef _MSC_VER
25 #include "strdup_windows.h"
26 #endif
27 /*--------------------------------------------------------------------------*/
28 static char *getPathFilename(char *fullfilename);
29 static char *getFilenameWithExtension(char *fullfilename);
30 /*--------------------------------------------------------------------------*/
31 int createHDF5File(char *name)
32 {
33     hid_t       file;
34     hid_t fapl = H5Pcreate(H5P_FILE_ACCESS);
35     char *pathdest = getPathFilename(name);
36     char *currentpath = NULL;
37     char *filename = getFilenameWithExtension(name);
38     int ierr = 0;
39
40     //H5Pset_fclose_degree(fapl, H5F_CLOSE_STRONG);
41
42     /* TO DO : remove when HDF5 will be fixed ... */
43     /* HDF5 does not manage no ANSI characters */
44     /* UGLY workaround :( */
45     /* We split path, move in this path, open file */
46     /* and return in previous place */
47     /* see BUG 6440 */
48     currentpath = scigetcwd(&ierr);
49
50     //prevent error msg to change directory to ""
51     if (strcmp(pathdest, "") != 0)
52     {
53         scichdir(pathdest);
54     }
55
56     FREE(pathdest);
57     /*bug 5629 : to prevent replace directory by file*/
58     if (isdir(filename))
59     {
60         FREE(filename);
61         FREE(currentpath);
62         return -2;
63     }
64
65     if (FileExist(filename))
66     {
67         deleteafile(filename);
68     }
69     /*
70     * Create a new file using the default properties.
71     */
72
73     file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl);
74
75     scichdir(currentpath);
76
77     FREE(currentpath);
78     FREE(filename);
79
80     return file;
81 }
82 /*--------------------------------------------------------------------------*/
83 int openHDF5File(char *name)
84 {
85     hid_t           file;
86     char *pathdest = getPathFilename(name);
87     char *currentpath = NULL;
88     char *filename = getFilenameWithExtension(name);
89     int ierr = 0;
90     void *oldclientdata = NULL;
91     /* Used to avoid stack trace to be displayed */
92     H5E_auto2_t oldfunc;
93     
94     /* TO DO : remove when HDF5 will be fixed ... */
95     /* HDF5 does not manage no ANSI characters */
96     /* UGLY workaround :( */
97     /* We split path, move in this path, open file */
98     /* and return in previous place */
99     /* see BUG 6440 */
100     currentpath = scigetcwd(&ierr);
101
102     //prevent error msg to change directory to ""
103     if (strcmp(pathdest, "") != 0)
104     {
105         scichdir(pathdest);
106     }
107
108     /* Save old error handler */
109     H5Eget_auto2(H5E_DEFAULT, &oldfunc, &oldclientdata);
110
111     /* Turn off error handling */
112     H5Eset_auto2(H5E_DEFAULT, NULL, NULL);
113
114     file = H5Fopen(filename, H5F_ACC_RDWR, H5P_DEFAULT);
115     /* The following test will display the backtrace in case of error */
116     /* Deactivated because displayed each time we call 'load' to open a non-HDF5 file */
117     /*if (file < 0)
118     {
119         H5Eprint(stderr);
120         }*/
121     /* Restore previous error handler */
122     H5Eset_auto2(H5E_DEFAULT, oldfunc, oldclientdata);
123
124     scichdir(currentpath);
125
126     if (currentpath)
127     {
128         FREE(currentpath);
129         currentpath = NULL;
130     }
131     if (filename)
132     {
133         FREE(filename);
134         filename = NULL;
135     }
136     if (pathdest)
137     {
138         FREE(pathdest);
139         pathdest = NULL;
140     }
141
142     return file;
143 }
144 /*--------------------------------------------------------------------------*/
145 int isHDF5File(char* _pstFilename)
146 {
147     int iRet = 0;
148     char *pathdest = getPathFilename(_pstFilename);
149     char *currentpath = NULL;
150     char *filename = getFilenameWithExtension(_pstFilename);
151     int ierr = 0;
152
153     /* TO DO : remove when HDF5 will be fixed ... */
154     /* HDF5 does not manage no ANSI characters */
155     /* UGLY workaround :( */
156     /* We split path, move in this path, open file */
157     /* and return in previous place */
158     /* see BUG 6440 */
159     currentpath = scigetcwd(&ierr);
160
161     //prevent error msg to change directory to ""
162     if (strcmp(pathdest, "") != 0)
163     {
164         scichdir(pathdest);
165     }
166
167     iRet = H5Fis_hdf5(filename);
168     return iRet > 0 ? 1 : 0;
169 }
170
171 void closeHDF5File(int file)
172 {
173     herr_t status                                       = 0;
174
175     //  H5Fflush(file, H5F_SCOPE_GLOBAL);
176     status = H5Fclose(file);
177     if (status < 0)
178     {
179         fprintf(stderr, "%s", "failed to close file");
180     }
181 }
182 /*--------------------------------------------------------------------------*/
183 static char *getPathFilename(char *fullfilename)
184 {
185     char *path = NULL;
186     if (fullfilename)
187     {
188         char* drv  = strdup(fullfilename);
189         char* dir  = strdup(fullfilename);
190         char* name = strdup(fullfilename);
191         char* ext  = strdup(fullfilename);
192
193         path = strdup(fullfilename);
194
195         if (drv && dir && name && ext && path)
196         {
197             splitpath(fullfilename, FALSE, drv, dir, name, ext);
198
199             if (strcmp(drv, "") == 0)
200             {
201                 strcpy(path, dir);
202             }
203             else
204             {
205                 strcpy(path, drv);
206                 strcat(path, dir);
207             }
208         }
209
210         if (drv)
211         {
212             FREE(drv);
213             drv = NULL;
214         }
215         if (dir)
216         {
217             FREE(dir);
218             dir = NULL;
219         }
220         if (name)
221         {
222             FREE(name);
223             name = NULL;
224         }
225         if (ext)
226         {
227             FREE(ext);
228             ext = NULL;
229         }
230     }
231     return path;
232 }
233 /*--------------------------------------------------------------------------*/
234 static char *getFilenameWithExtension(char *fullfilename)
235 {
236     char *filename = NULL;
237     if (fullfilename)
238     {
239         char* drv  = strdup(fullfilename);
240         char* dir  = strdup(fullfilename);
241         char* name = strdup(fullfilename);
242         char* ext  = strdup(fullfilename);
243
244         filename = strdup(fullfilename);
245
246         if (drv && dir && name && ext && filename)
247         {
248             splitpath(fullfilename, FALSE, drv, dir, name, ext);
249
250             if (strcmp(ext, "") == 0)
251             {
252                 strcpy(filename, name);
253             }
254             else
255             {
256                 strcpy(filename, name);
257                 strcat(filename, ext);
258             }
259         }
260
261         if (drv)
262         {
263             FREE(drv);
264             drv = NULL;
265         }
266         if (dir)
267         {
268             FREE(dir);
269             dir = NULL;
270         }
271         if (name)
272         {
273             FREE(name);
274             name = NULL;
275         }
276         if (ext)
277         {
278             FREE(ext);
279             ext = NULL;
280         }
281     }
282     return filename;
283 }
284 /*--------------------------------------------------------------------------*/
285