1/* This is part of the netCDF package.
2   Copyright 2005 University Corporation for Atmospheric Research/Unidata
3   See COPYRIGHT file for conditions of use.
4
5   Test HDF5 file code. These are not intended to be exhaustive tests,
6   but they use HDF5 the same way that netCDF-4 does, so if these
7   tests don't work, than netCDF-4 won't work either.
8
9   This file creates the same file as file tst_xplatform2_3 (created
10   by tst_xplatform2.c).
11*/
12
13#include "h5_err_macros.h"
14#include <hdf5.h>
15
16#define MY_CHUNK_CACHE_SIZE 32000000
17#define STR_LEN 255
18
19/* The file we create. */
20#define FILE_NAME "tst_h_atts3.h5"
21
22#define NUM_OBJ 3
23#define NUM_VL 1
24#define S1_TYPE_NAME "cmp_t"
25#define X_NAME "x"
26#define Y_NAME "y"
27#define S1_NAME "s1"
28#define VLEN_TYPE_NAME "Magna_Carta_VLEN"
29#define S3_ATT_NAME "King_John"
30#define S3_TYPE_NAME "barons"
31#define VL_NAME "No scutage or aid may be levied in our kingdom without its general consent"
32#define ATT_LEN 1
33
34int
35main()
36{
37   printf("\n*** Checking HDF5 attribute functions some more.\n");
38#ifdef EXTRA_TESTS
39   printf("*** Creating tst_xplatform2_3.nc with HDF only...");
40   {
41      hid_t fapl_idfcpl_id;
42      size_t chunk_cache_size = MY_CHUNK_CACHE_SIZE;
43      size_t chunk_cache_nelems = CHUNK_CACHE_NELEMS;
44      float chunk_cache_preemption = CHUNK_CACHE_PREEMPTION;
45      hid_t fileidgrpidattidspaceid;
46      hid_t s1_typeidvlen_typeids3_typeid;
47      hid_t file_typeid1[NUM_OBJ], native_typeid1[NUM_OBJ];
48      hid_t file_typeid2native_typeid2;
49      hsize_t num_obj;
50      H5O_info_t obj_info;
51      char obj_name[STR_LEN + 1];
52      hsize_t dims[1] = {ATT_LEN}; /* netcdf attributes always 1-D. */
53      struct s1
54      {
55  float x;
56  double y;
57      };
58      struct s3
59      {
60  hvl_t data[NUM_VL];
61      };
62      /* cvc stands for "Compound with Vlen of Compound." */
63      struct s3 cvc_out[ATT_LEN];
64      int ijk;
65
66      /* Create some output data: a struct s3 array (length ATT_LEN)
67       * which holds an array of vlen (length NUM_VL) of struct s1. */
68      for (i = 0; i < ATT_LENi++)
69  for (j = 0; j < NUM_VLj++)
70  {
71     cvc_out[i].data[j].len = i + 1;
72     if (!(cvc_out[i].data[j].p = calloc(sizeof(struct s1), cvc_out[i].data[j].len))) ERR;
73     for (k = 0; k < cvc_out[i].data[j].lenk++)
74     {
75        ((struct s1 *)cvc_out[i].data[j].p)[k].x = 42.42;
76        ((struct s1 *)cvc_out[i].data[j].p)[k].y = 2.0;
77     }
78  }
79
80      /* Create the HDF5 file, with cache control, creation order, and
81       * all the timmings. */
82      if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
83      if (H5Pset_fclose_degree(fapl_idH5F_CLOSE_STRONG)) ERR;
84      if (H5Pset_cache(fapl_id, 0, chunk_cache_nelemschunk_cache_size,
85        chunk_cache_preemption) < 0) ERR;
86      if (H5Pset_libver_bounds(fapl_idH5F_LIBVER_LATEST,
87        H5F_LIBVER_LATEST) < 0) ERR;
88      if ((fcpl_id = H5Pcreate(H5P_FILE_CREATE)) < 0) ERR;
89      if (H5Pset_link_creation_order(fcpl_id, (H5P_CRT_ORDER_TRACKED |
90        H5P_CRT_ORDER_INDEXED)) < 0) ERR;
91      if (H5Pset_attr_creation_order(fcpl_id, (H5P_CRT_ORDER_TRACKED |
92        H5P_CRT_ORDER_INDEXED)) < 0) ERR;
93      if ((fileid = H5Fcreate(FILE_NAMEH5F_ACC_TRUNCfcpl_idfapl_id)) < 0) ERR;
94      if (H5Pclose(fapl_id) < 0) ERR;
95      if (H5Pclose(fcpl_id) < 0) ERR;
96
97      /* Open the root group. */
98      if ((grpid = H5Gopen2(fileid, "/", H5P_DEFAULT)) < 0) ERR;
99
100      /* Create the compound type for struct s1. */
101      if ((s1_typeid = H5Tcreate(H5T_COMPOUND, sizeof(struct s1))) < 0) ERR;
102      if (H5Tinsert(s1_typeidX_NAMEoffsetof(struct s1x),
103     H5T_NATIVE_FLOAT) < 0) ERR;
104      if (H5Tinsert(s1_typeidY_NAMEoffsetof(struct s1y),
105     H5T_NATIVE_DOUBLE) < 0) ERR;
106      if (H5Tcommit(grpidS1_TYPE_NAMEs1_typeid) < 0) ERR;
107
108      /* Create a vlen type. Its a vlen of stuct s1. */
109      if ((vlen_typeid = H5Tvlen_create(s1_typeid)) < 0) ERR;
110      if (H5Tcommit(grpidVLEN_TYPE_NAMEvlen_typeid) < 0) ERR;
111
112      /* Create the struct s3 type, which contains the vlen. */
113      if ((s3_typeid = H5Tcreate(H5T_COMPOUND, sizeof(struct s3))) < 0) ERR;
114      if (H5Tinsert(s3_typeidVL_NAMEoffsetof(struct s3data),
115     vlen_typeid) < 0) ERR;
116      if (H5Tcommit(grpidS3_TYPE_NAMEs3_typeid) < 0) ERR;
117
118      /* Create an attribute of this new type. */
119      if ((spaceid = H5Screate_simple(1, dimsNULL)) < 0) ERR;
120      if ((attid = H5Acreate(grpidS3_ATT_NAMEs3_typeidspaceid,
121      H5P_DEFAULT)) < 0) ERR;
122      if (H5Awrite(attids3_typeidcvc_out) < 0) ERR;
123
124      /* Close the types. */
125      if (H5Tclose(s1_typeid) < 0 ||
126   H5Tclose(vlen_typeid) < 0 ||
127   H5Tclose(s3_typeid) < 0) ERR;
128
129      /* Close the att. */
130      if (H5Aclose(attid) < 0) ERR;
131
132      /* Close the space. */
133      if (H5Sclose(spaceid) < 0) ERR;
134
135      /* Close the group and file. */
136      if (H5Gclose(grpid) < 0 ||
137   H5Fclose(fileid) < 0) ERR;
138
139      /* Reopen the file. */
140      if ((fileid = H5Fopen(FILE_NAMEH5F_ACC_RDWRH5P_DEFAULT)) < 0) ERR;
141      if ((grpid = H5Gopen(fileid, "/")) < 0) ERR;
142
143      /* How many objects in this group? (There should be 3, the
144       * types. Atts don't count as objects to HDF5.) */
145      if (H5Gget_num_objs(grpid, &num_obj) < 0) ERR;
146      if (num_obj != NUM_OBJERR;
147
148      /* For each object in the group... */
149      for (i = 0; i < num_obji++)
150      {
151  /* Get the name, and make sure this is a type. */
152  if (H5Oget_info_by_idx(grpid, ".", H5_INDEX_CRT_ORDERH5_ITER_INC,
153 i, &obj_infoH5P_DEFAULT) < 0) ERR;
154  if (H5Lget_name_by_idx(grpid, ".", H5_INDEX_NAMEH5_ITER_INCi,
155 obj_nameSTR_LEN + 1, H5P_DEFAULT) < 0) ERR;
156  if (obj_info.type != H5O_TYPE_NAMED_DATATYPEERR;
157
158  /* Get the typeid and native typeid. */
159  if ((file_typeid1[i] = H5Topen2(grpidobj_nameH5P_DEFAULT)) < 0) ERR;
160  if ((native_typeid1[i] = H5Tget_native_type(file_typeid1[i],
161      H5T_DIR_DEFAULT)) < 0) ERR;
162      }
163
164      /* There is one att: open it by index. */
165      if ((attid = H5Aopen_idx(grpid, 0)) < 0) ERR;
166
167      /* Get file and native typeids of the att. */
168      if ((file_typeid2 = H5Aget_type(attid)) < 0) ERR;
169      if ((native_typeid2 = H5Tget_native_type(file_typeid2H5T_DIR_DEFAULT)) < 0) ERR;
170
171      /* Close the attribute. */
172      if (H5Aclose(attid) < 0) ERR;
173
174      /* Close the typeids. */
175      for (i = 0; i < NUM_OBJi++)
176      {
177  if (H5Tclose(file_typeid1[i]) < 0) ERR;
178  if (H5Tclose(native_typeid1[i]) < 0) ERR;
179      }
180      if (H5Tclose(file_typeid2) < 0) ERR;
181      if (H5Tclose(native_typeid2) < 0) ERR;
182
183      /* Close the group and file. */
184      if (H5Gclose(grpid) < 0 ||
185   H5Fclose(fileid) < 0) ERR;
186
187      /* Deallocate our vlens. */
188      for (i = 0; i < ATT_LENi++)
189  for (j = 0; j < NUM_VLj++)
190     free(cvc_out[i].data[j].p);
191   }
192   SUMMARIZE_ERR;
193   printf("*** Checking vlen of compound file...");
194   {
195#define NUM_OBJ_1 1
196#define ATT_NAME "Poseidon"
197      hid_t fapl_idfcpl_id;
198      hid_t fileidgrpidattidspaceid;
199      hid_t vlen_typeid;
200      hid_t file_typeid1[NUM_OBJ_1], native_typeid1[NUM_OBJ_1];
201      hid_t file_typeid2native_typeid2;
202      hsize_t num_obj;
203      H5O_info_t obj_info;
204      char obj_name[STR_LEN + 1];
205      hsize_t dims[1] = {ATT_LEN}; /* netcdf attributes always 1-D. */
206
207      /* vc stands for "Vlen of Compound." */
208      hvl_t vc_out[ATT_LEN];
209      int ik;
210
211      /* Create some output data: an array of vlen (length ATT_LEN) of
212       * int. */
213      for (i = 0; i < ATT_LENi++)
214      {
215  vc_out[i].len = i + 1;
216  if (!(vc_out[i].p = calloc(sizeof(int), vc_out[i].len))) ERR;
217  for (k = 0; k < vc_out[i].lenk++)
218     ((int *)vc_out[i].p)[k] = 42;
219      }
220
221      /* Create the HDF5 file with creation order. */
222      if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
223      if ((fcpl_id = H5Pcreate(H5P_FILE_CREATE)) < 0) ERR;
224      if (H5Pset_link_creation_order(fcpl_id, (H5P_CRT_ORDER_TRACKED |
225        H5P_CRT_ORDER_INDEXED)) < 0) ERR;
226      if (H5Pset_attr_creation_order(fcpl_id, (H5P_CRT_ORDER_TRACKED |
227        H5P_CRT_ORDER_INDEXED)) < 0) ERR;
228      if ((fileid = H5Fcreate(FILE_NAMEH5F_ACC_TRUNCfcpl_idfapl_id)) < 0) ERR;
229      if (H5Pclose(fapl_id) < 0) ERR;
230      if (H5Pclose(fcpl_id) < 0) ERR;
231
232      /* Open the root group. */
233      if ((grpid = H5Gopen2(fileid, "/", H5P_DEFAULT)) < 0) ERR;
234
235      /* Create a vlen type. Its a vlen of int. */
236      if ((vlen_typeid = H5Tvlen_create(H5T_NATIVE_INT)) < 0) ERR;
237      if (H5Tcommit(grpidVLEN_TYPE_NAMEvlen_typeid) < 0) ERR;
238
239      /* Create an attribute of this new type. */
240      if ((spaceid = H5Screate_simple(1, dimsNULL)) < 0) ERR;
241      if ((attid = H5Acreate(grpidATT_NAMEvlen_typeidspaceid,
242      H5P_DEFAULT)) < 0) ERR;
243      if (H5Awrite(attidvlen_typeidvc_out) < 0) ERR;
244
245      /* Close the type. */
246      if (H5Tclose(vlen_typeid) < 0) ERR;
247
248      /* Close the att. */
249      if (H5Aclose(attid) < 0) ERR;
250
251      /* Close the space. */
252      if (H5Sclose(spaceid) < 0) ERR;
253
254      /* Close the group and file. */
255      if (H5Gclose(grpid) < 0 ||
256   H5Fclose(fileid) < 0) ERR;
257
258      /* Reopen the file. */
259      if ((fileid = H5Fopen(FILE_NAMEH5F_ACC_RDWRH5P_DEFAULT)) < 0) ERR;
260      if ((grpid = H5Gopen(fileid, "/")) < 0) ERR;
261
262      /* How many objects in this group? (There should be 2, the
263       * types. Atts don't count as objects to HDF5.) */
264      if (H5Gget_num_objs(grpid, &num_obj) < 0) ERR;
265      if (num_obj != NUM_OBJ_1ERR;
266
267      /* For each object in the group... */
268      for (i = 0; i < num_obji++)
269      {
270  /* Get the name, and make sure this is a type. */
271  if (H5Oget_info_by_idx(grpid, ".", H5_INDEX_CRT_ORDERH5_ITER_INC,
272 i, &obj_infoH5P_DEFAULT) < 0) ERR;
273  if (H5Lget_name_by_idx(grpid, ".", H5_INDEX_NAMEH5_ITER_INCi,
274 obj_nameSTR_LEN + 1, H5P_DEFAULT) < 0) ERR;
275  if (obj_info.type != H5O_TYPE_NAMED_DATATYPEERR;
276
277  /* Get the typeid and native typeid. */
278  if ((file_typeid1[i] = H5Topen2(grpidobj_nameH5P_DEFAULT)) < 0) ERR;
279  if ((native_typeid1[i] = H5Tget_native_type(file_typeid1[i],
280      H5T_DIR_DEFAULT)) < 0) ERR;
281      }
282
283      /* There is one att: open it by index. */
284      if ((attid = H5Aopen_idx(grpid, 0)) < 0) ERR;
285
286      /* Get file and native typeids of the att. */
287      if ((file_typeid2 = H5Aget_type(attid)) < 0) ERR;
288      if ((native_typeid2 = H5Tget_native_type(file_typeid2H5T_DIR_DEFAULT)) < 0) ERR;
289
290      /* Close the attribute. */
291      if (H5Aclose(attid) < 0) ERR;
292
293      /* Close the typeids. */
294      for (i = 0; i < NUM_OBJ_1i++)
295      {
296  if (H5Tclose(file_typeid1[i]) < 0) ERR;
297  if (H5Tclose(native_typeid1[i]) < 0) ERR;
298      }
299      if (H5Tclose(file_typeid2) < 0) ERR;
300      if (H5Tclose(native_typeid2) < 0) ERR;
301
302      /* Close the group and file. */
303      if (H5Gclose(grpid) < 0 ||
304   H5Fclose(fileid) < 0) ERR;
305
306      /* Deallocate our vlens. */
307      for (i = 0; i < ATT_LENi++)
308  free(vc_out[i].p);
309   }
310   SUMMARIZE_ERR;
311#endif /* EXTRA_TESTS */
312   FINAL_RESULTS;
313}


HyperKWIC - Version 7.20DA executed at 11:37 on 27 Oct 2017 | Polyhedron Solutions - INTERNAL USE | COMMERCIAL (Any O/S) SN 4AKIed