dd135639171ee160a7be86a2c1127d1cac0b78d0
[scilab.git] / scilab / modules / hdf5 / sci_gateway / cpp / sci_h5dump.cpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2011 - Scilab Enterprises - Calixte DENIZET
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 #include <set>
14 #include <string>
15
16 extern "C"
17 {
18 #include "gw_hdf5.h"
19 #include "Scierror.h"
20 #include "api_scilab.h"
21 #include "localization.h"
22 #include "expandPathVariable.h"
23 }
24
25 #include "HDF5Scilab.hxx"
26 #include "H5File.hxx"
27
28 using namespace org_modules_hdf5;
29
30 /*--------------------------------------------------------------------------*/
31 int sci_h5dump(char *fname, unsigned long fname_len)
32 {
33     H5Object * hobj = 0;
34     SciErr err;
35     int * addr = 0;
36     char * path = 0;
37     char * expandedPath = 0;
38     char * name = 0;
39     std::map<haddr_t, std::string> visited;
40     bool mustDelete = true;
41
42     CheckLhs(1, 1);
43     CheckRhs(1, 2);
44
45     if (Rhs == 2)
46     {
47         err = getVarAddressFromPosition(pvApiCtx, 2, &addr);
48         if (err.iErr)
49         {
50             printError(&err, 0);
51             Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 2);
52             return 0;
53         }
54
55         if (!isStringType(pvApiCtx, addr) || !checkVarDimension(pvApiCtx, addr, 1, 1))
56         {
57             Scierror(999, gettext("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 2);
58             return 0;
59         }
60
61         if (getAllocatedSingleString(pvApiCtx, addr, &name) != 0)
62         {
63             Scierror(999, _("%s: No more memory.\n"), fname);
64             return 0;
65         }
66     }
67
68     err = getVarAddressFromPosition(pvApiCtx, 1, &addr);
69     if (err.iErr)
70     {
71         printError(&err, 0);
72         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
73         return 0;
74     }
75
76     if (HDF5Scilab::isH5Object(addr, pvApiCtx))
77     {
78         hobj = HDF5Scilab::getH5Object(addr, pvApiCtx);
79         if (!hobj)
80         {
81             Scierror(999, _("%s: Invalid H5Object.\n"), fname);
82             return 0;
83         }
84
85         if (Rhs == 2)
86         {
87             try
88             {
89                 hobj = &H5Object::getObject(*hobj, name);
90             }
91             catch (H5Exception & e)
92             {
93                 Scierror(999, gettext("%s: %s\n"), fname, e.what());
94                 return 0;
95             }
96         }
97         else
98         {
99             mustDelete = false;
100         }
101     }
102     else
103     {
104         if (!isStringType(pvApiCtx, addr) || !checkVarDimension(pvApiCtx, addr, 1, 1))
105         {
106             Scierror(999, gettext("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 1);
107             return 0;
108         }
109
110         if (getAllocatedSingleString(pvApiCtx, addr, &path) != 0)
111         {
112             Scierror(999, _("%s: No more memory.\n"), fname);
113             return 0;
114         }
115         expandedPath = expandPathVariable(path);
116         freeAllocatedSingleString(path);
117         try
118         {
119             if (Rhs == 2)
120             {
121                 hobj = new H5File((const char *)expandedPath, (const char *)name, "r");
122             }
123             else
124             {
125                 hobj = new H5File((const char *)expandedPath, "/", "r");
126             }
127             FREE(expandedPath);
128         }
129         catch (const H5Exception & e)
130         {
131             Scierror(999, _("%s: %s\n"), fname, e.what());
132             FREE(expandedPath);
133             return 0;
134         }
135     }
136
137     try
138     {
139         HDF5Scilab::scilabPrint(hobj->dump(visited));
140         if (mustDelete)
141         {
142             delete hobj;
143         }
144     }
145     catch (const H5Exception & e)
146     {
147         Scierror(999, _("%s: %s\n"), fname, e.what());
148         if (mustDelete)
149         {
150             delete hobj;
151         }
152         return 0;
153     }
154
155     LhsVar(1) = 0;
156     PutLhsVar();
157
158     return 0;
159 }
160
161 /*--------------------------------------------------------------------------*/