effb835e50868022c85737515f1d18d2aa288384
[scilab.git] / scilab / modules / hdf5 / sci_gateway / cpp / sci_h5read.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 extern "C"
14 {
15 #include "gw_hdf5.h"
16 #include "Scierror.h"
17 #include "api_scilab.h"
18 #include "localization.h"
19 #include "expandPathVariable.h"
20 }
21
22 #include "HDF5Scilab.hxx"
23
24 using namespace org_modules_hdf5;
25
26 /*--------------------------------------------------------------------------*/
27 int sci_h5read(char *fname, unsigned long fname_len)
28 {
29     SciErr err;
30     H5Object * hobj = 0;
31     int * addr = 0;
32     char * path = 0;
33     char * expandedPath = 0;
34     char * location = 0;
35     std::string _expandedPath;
36     std::string _location;
37
38     CheckLhs(1, 1);
39     CheckRhs(1, 2);
40
41     err = getVarAddressFromPosition(pvApiCtx, 1, &addr);
42     if (err.iErr)
43     {
44         printError(&err, 0);
45         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
46         return 0;
47     }
48
49     if (HDF5Scilab::isH5Object(addr, pvApiCtx))
50     {
51         hobj = HDF5Scilab::getH5Object(addr, pvApiCtx);
52         if (!hobj)
53         {
54             Scierror(999, _("%s: Can not print H5Object: invalid object.\n"), fname);
55             return 0;
56         }
57     }
58     else
59     {
60         if (Rhs != 2)
61         {
62             Scierror(999, _("%s: Invalid number of arguments: %d expected.\n"), fname, 2);
63             return 0;
64         }
65
66         if (!isStringType(pvApiCtx, addr) || !checkVarDimension(pvApiCtx, addr, 1, 1))
67         {
68             Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 1);
69             return 0;
70         }
71
72         if (getAllocatedSingleString(pvApiCtx, addr, &path) != 0)
73         {
74             Scierror(999, _("%s: No more memory.\n"), fname);
75             return 0;
76         }
77
78         expandedPath = expandPathVariable(path);
79         _expandedPath = std::string(expandedPath);
80         FREE(expandedPath);
81         freeAllocatedSingleString(path);
82     }
83
84     if (Rhs == 2)
85     {
86         err = getVarAddressFromPosition(pvApiCtx, 2, &addr);
87         if (err.iErr)
88         {
89             printError(&err, 0);
90             Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 2);
91             return 0;
92         }
93
94         if (!isStringType(pvApiCtx, addr) || !checkVarDimension(pvApiCtx, addr, 1, 1))
95         {
96             Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 1);
97             return 0;
98         }
99
100         if (getAllocatedSingleString(pvApiCtx, addr, &location) != 0)
101         {
102             Scierror(999, _("%s: No more memory.\n"), fname);
103             return 0;
104         }
105
106         _location = std::string(location);
107         freeAllocatedSingleString(location);
108     }
109     else
110     {
111         _location = std::string(".");
112     }
113
114     try
115     {
116         if (hobj)
117         {
118             HDF5Scilab::readData(*hobj, _location, Rhs + 1, pvApiCtx);
119         }
120         else
121         {
122             HDF5Scilab::readData(_expandedPath, _location, Rhs + 1, pvApiCtx);
123         }
124     }
125     catch (const H5Exception & e)
126     {
127         Scierror(999, _("%s: %s\n"), fname, e.what());
128         return 0;
129     }
130
131     LhsVar(1) = Rhs + 1;
132     PutLhsVar();
133
134     return 0;
135 }
136
137 /*--------------------------------------------------------------------------*/