3105ccc161ae990866f74f186f5c765cbb7444f7
[scilab.git] / scilab / modules / hdf5 / sci_gateway / cpp / sci_percent_H5Object_e.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 "H5Exception.hxx"
14 #include "HDF5Scilab.hxx"
15 #include "H5Object.hxx"
16
17 extern "C"
18 {
19 #include "gw_hdf5.h"
20 #include "Scierror.h"
21 #include "api_scilab.h"
22 #include "sciprint.h"
23 #include "localization.h"
24 }
25
26 using namespace org_modules_hdf5;
27
28 /*--------------------------------------------------------------------------*/
29 int sci_percent_H5Object_e(char * fname, unsigned long fname_len)
30 {
31     H5Object * obj = 0;
32     int id;
33     SciErr err;
34     int * fieldaddr = 0;
35     int * mlistaddr = 0;
36     char * field = 0;
37     int fieldtype;
38     double index;
39
40     CheckLhs(1, 1);
41     CheckRhs(2, 2);
42
43     err = getVarAddressFromPosition(pvApiCtx, 1, &fieldaddr);
44     if (err.iErr)
45     {
46         printError(&err, 0);
47         return 0;
48     }
49
50     err = getVarType(pvApiCtx, fieldaddr, &fieldtype);
51     if (err.iErr)
52     {
53         printError(&err, 0);
54         return 0;
55     }
56
57     if (fieldtype != sci_matrix && fieldtype != sci_strings)
58     {
59         Scierror(999, gettext("%s: Wrong type for input argument #%i: A string or a double expected.\n"), fname, 1);
60         return 0;
61     }
62
63     err = getVarAddressFromPosition(pvApiCtx, 2, &mlistaddr);
64     if (err.iErr)
65     {
66         printError(&err, 0);
67         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 2);
68         return 0;
69     }
70
71     if (fieldtype == sci_strings)
72     {
73         if (getAllocatedSingleString(pvApiCtx, fieldaddr, &field) != 0)
74         {
75             Scierror(999, _("%s: No more memory.\n"), fname);
76             return 0;
77         }
78     }
79     else
80     {
81         if (getScalarDouble(pvApiCtx, fieldaddr, &index) != 0)
82         {
83             Scierror(999, _("%s: No more memory.\n"), fname);
84             return 0;
85         }
86     }
87
88     try
89     {
90         id = HDF5Scilab::getH5ObjectId(mlistaddr, pvApiCtx);
91         obj = H5VariableScope::getVariableFromId(id);
92
93         if (fieldtype == sci_strings)
94         {
95             obj->getAccessibleAttribute(std::string(field), Rhs + 1, pvApiCtx);
96         }
97         else
98         {
99             obj->getAccessibleAttribute(index - 1, Rhs + 1, pvApiCtx);
100         }
101     }
102     catch (std::exception & e)
103     {
104         if (fieldtype == sci_strings)
105         {
106             freeAllocatedSingleString(field);
107         }
108         Scierror(999, _("%s: Error in retrieving field content:\n%s\n"), fname, e.what());
109
110         return 0;
111     }
112
113     if (fieldtype == sci_strings)
114     {
115         freeAllocatedSingleString(field);
116     }
117
118     LhsVar(1) = Rhs + 1;
119     PutLhsVar();
120
121     return 0;
122 }