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 deals with HDF5 attributes.
10
11   $Id: tst_h_atts.c,v 1.20 2010/06/01 15:34:51 ed Exp $
12*/
13#include "h5_err_macros.h"
14#include <nc_tests.h>
15#include <hdf5.h>
16#include <H5DSpublic.h>
17
18#define FILE_NAME "tst_h_atts.h5"
19#define GRP_NAME "Hamlet"
20#define ATT1_NAME "Hamlets_Self_Evaluation"
21#define ATT2_NAME "Commentary"
22#define MAX_LEN 50
23#define NUM_EMPS 6
24#define EMP_GRP "Emperors"
25#define NC3_STRICT_ATT_NAME "_nc3_strict"
26
27char txt[] = "O, what a rogue and peasant slave am I!\n"
28"Is it not monstrous that this player here,\n"
29"But in a fiction, in a dream of passion,\n"
30"Could force his soul so to his own conceit\n"
31"That from her working all his visage wann'd,\n"
32"Tears in his eyes, distraction in's aspect,\n"
33"A broken voice, and his whole function suiting\n"
34"With forms to his conceit? and all for nothing!\n"
35"For Hecuba!\n"
36"What's Hecuba to him, or he to Hecuba,\n"
37"That he should weep for her?";
38
39int
40main()
41{
42   hid_t fileidgrpidspaceidtypeidattid;
43   char *txt_in;
44   size_t txt_size;
45   hssize_t size;
46   size_t type_size;
47   int ndims;
48   hsize_t num_obj;
49
50   printf("\n*** Checking HDF5 attribute functions.\n");
51   printf("*** Checking HDF5 attribute ordering...");
52
53   {
54      float val = 99;
55      char emp[NUM_EMPS][MAX_LEN + 1] = {"Augustus", "Tiberius",
56      "Caligula", "Claudius",
57      "Ne_r_o", "V.esp.asi.an"};
58      char obj_name[MAX_LEN + 1];
59      int ei;
60
61      /* Open file and create group. */
62      if ((fileid = H5Fcreate(FILE_NAMEH5F_ACC_TRUNCH5P_DEFAULT,
63       H5P_DEFAULT)) < 0) ERR;
64      if ((grpid = H5Gcreate(fileidEMP_GRP, 0)) < 0) ERR;
65
66      /* Create space fo zero-length attributes. */
67      if ((spaceid = H5Screate(H5S_NULL)) < 0) ERR;
68
69      /* Attach some zero-length float attributes! */
70      for (e = 0; e < NUM_EMPSe++)
71      {
72  if ((attid = H5Acreate(grpidemp[e], H5T_NATIVE_FLOATspaceid,
73 H5P_DEFAULT)) < 0) ERR;
74  if (H5Awrite(attidH5T_NATIVE_FLOAT, &val) < 0) ERR;
75  if (H5Aclose(attid) < 0) ERR;
76      }
77
78      /* Close everything. */
79      if (H5Sclose(spaceid) < 0) ERR;
80      if (H5Gclose(grpid) < 0) ERR;
81      if (H5Fclose(fileid) < 0) ERR;
82
83      /* Now open the file again and read in the attributes. */
84      if ((fileid = H5Fopen(FILE_NAMEH5F_ACC_RDWR,
85     H5P_DEFAULT)) < 0) ERR;
86      if ((grpid = H5Gopen(fileidEMP_GRP)) < 0) ERR;
87
88      /* How many attributes are there? */
89      if ((num_obj = H5Aget_num_attrs(grpid)) != NUM_EMPSERR;
90
91      /* Make sure the names are in the correct order. */
92      for (i = 0; i < num_obji++)
93      {
94  if ((attid = H5Aopen_idx(grpid, (unsigned int)i)) < 0) ERR;
95  if (H5Aget_name(attidMAX_LEN + 1, obj_name) < 0) ERR;
96  if (H5Aclose(attid) < 0) ERR;
97  if (strcmp(obj_nameemp[i])) ERR;
98      }
99      if (H5Gclose(grpid) < 0 ||
100   H5Fclose(fileid) < 0) ERR;
101   }
102
103   SUMMARIZE_ERR;
104   printf("*** Checking HDF5 attribute deletes...");
105   {
106      /* Create a file and open the root group. */
107      if ((fileid = H5Fcreate(FILE_NAMEH5F_ACC_TRUNCH5P_DEFAULT,
108       H5P_DEFAULT)) < 0) ERR;
109      if ((grpid = H5Gopen(fileid, "/")) < 0) ERR;
110
111      /* Attach a text attribute with some of Hamlet's lines. */
112      if ((spaceid = H5Screate(H5S_SCALAR)) < 0) ERR;
113      if ((typeid = H5Tcopy(H5T_C_S1)) < 0) ERR;
114      if (H5Tset_size(typeid, strlen(txt) + 1) < 0) ERR;
115      if ((attid = H5Acreate(grpidATT1_NAMEtypeidspaceid,
116      H5P_DEFAULT)) < 0) ERR;
117      if (H5Awrite(attidtypeidtxt) < 0) ERR;
118
119      /* Delete the attribute. */
120      if (H5Aclose(attid) < 0) ERR;
121      if (H5Adelete(grpidATT1_NAME) < 0) ERR;
122
123      /* Create and write it again. */
124      if ((attid = H5Acreate(grpidATT1_NAMEtypeidspaceid,
125      H5P_DEFAULT)) < 0) ERR;
126      if (H5Awrite(attidtypeidtxt) < 0) ERR;
127
128      /* Close everything. */
129      if (H5Aclose(attid) < 0 ||
130   H5Sclose(spaceid) < 0 ||
131   H5Tclose(typeid) < 0 ||
132   H5Gclose(grpid) < 0 ||
133   H5Fclose(fileid) < 0) ERR;
134
135   }
136   SUMMARIZE_ERR;
137   printf("*** Checking HDF5 attributes attached to the fileid...");
138   {
139      /* See if we can write an attribute to the root group. */
140      if ((fileid = H5Fcreate(FILE_NAMEH5F_ACC_TRUNCH5P_DEFAULT,
141       H5P_DEFAULT)) < 0) ERR;
142      if ((grpid = H5Gopen(fileid, "/")) < 0) ERR;
143
144      /* Attach a text attribute with some of Hamlet's lines. */
145      if ((spaceid = H5Screate(H5S_SCALAR)) < 0) ERR;
146      if ((typeid = H5Tcopy(H5T_C_S1)) < 0) ERR;
147      if (H5Tset_size(typeid, strlen(txt) + 1) < 0) ERR;
148      if ((attid = H5Acreate(grpidATT1_NAMEtypeidspaceid,
149      H5P_DEFAULT)) < 0) ERR;
150      if (H5Awrite(attidtypeidtxt) < 0) ERR;
151      if (H5Aclose(attid) < 0 ||
152   H5Sclose(spaceid) < 0 ||
153   H5Tclose(typeid) < 0 ||
154   H5Gclose(grpid) < 0 ||
155   H5Fclose(fileid) < 0) ERR;
156   }
157   SUMMARIZE_ERR;
158   printf("*** Checking HDF5 attributes in a group...");
159   {
160      /* Open file and create group. */
161      if ((fileid = H5Fcreate(FILE_NAMEH5F_ACC_TRUNCH5P_DEFAULT,
162       H5P_DEFAULT)) < 0) ERR;
163      if ((grpid = H5Gcreate(fileidGRP_NAME, 0)) < 0) ERR;
164
165      /* Attach a text attribute with some of Hamlet's lines. */
166      if ((spaceid = H5Screate(H5S_SCALAR)) < 0) ERR;
167      if ((typeid = H5Tcopy(H5T_C_S1)) < 0) ERR;
168      if (H5Tset_size(typeid, strlen(txt) + 1) < 0) ERR;
169      if ((attid = H5Acreate(grpidATT1_NAMEtypeidspaceid,
170      H5P_DEFAULT)) < 0) ERR;
171      if (H5Awrite(attidtypeidtxt) < 0) ERR;
172      if (H5Aclose(attid) < 0 ||
173   H5Sclose(spaceid) < 0 ||
174   H5Tclose(typeid) < 0 ||
175   H5Gclose(grpid) < 0 ||
176   H5Fclose(fileid) < 0) ERR;
177
178      /* Now open the file again and read in the attribute. */
179      if ((fileid = H5Fopen(FILE_NAMEH5F_ACC_RDONLY,
180     H5P_DEFAULT)) < 0) ERR;
181      if ((grpid = H5Gopen(fileidGRP_NAME)) < 0) ERR;
182      if ((attid = H5Aopen_name(grpidATT1_NAME)) < 0) ERR;
183      if ((typeid = H5Aget_type(attid)) < 0) ERR;
184
185      /* Check the size of the string in the attribute. */
186      if (H5Tget_class(typeid) != H5T_STRINGERR;
187      if (!(txt_size = H5Tget_size(typeid))) ERR;
188      if (txt_size != strlen(txt) + 1) ERR;
189
190      /* Now read the attribute. But if I don't malloc the memory first,
191       * I get zapped with a seg-fault. Aren't strings supposed to be
192       * different? */
193      if (!(txt_in = malloc(txt_size+1))) ERR;
194      if (H5Aread(attidtypeidtxt_in) < 0) ERR;
195      if (strcmp(txt_intxt)) ERR;
196      if (strlen(txt_in) != strlen(txt)) ERR;
197
198      /* For a scalar, ndims is 0 but simple_extent_npoints is 1. For a
199       * NULL dataspace (see below), they are both 0. */
200      if ((spaceid = H5Aget_space(attid)) < 0) ERR;
201      if ((size = H5Sget_simple_extent_npoints(spaceid)) < 0) ERR;
202      if (size != 1) ERR;
203      if ((ndims = H5Sget_simple_extent_ndims(spaceid)) < 0) ERR;
204      if (ndims != 0) ERR;
205      if (!(type_size = H5Tget_size(typeid))) ERR;
206      if (type_size != strlen(txt) + 1) ERR;
207      free(txt_in);
208
209      if (H5Aclose(attid) < 0 ||
210   H5Sclose(spaceid) < 0 ||
211   H5Tclose(typeid) < 0 ||
212   H5Gclose(grpid) < 0 ||
213   H5Fclose(fileid) < 0) ERR;
214   }
215
216   SUMMARIZE_ERR;
217   printf("*** Checking HDF5 zero length attributes...");
218
219   {
220      hid_t attid1;
221      float val = 99;
222
223      /* Open file and create group. */
224      if ((fileid = H5Fcreate(FILE_NAMEH5F_ACC_TRUNCH5P_DEFAULT,
225       H5P_DEFAULT)) < 0)
226  ERR;
227      if ((grpid = H5Gcreate(fileidGRP_NAME, 0)) < 0)
228  ERR;
229
230      /* Attach a float attribute with no data. The
231       * hell with Hamlet anyway! */
232      if ((spaceid = H5Screate(H5S_NULL)) < 0)
233  ERR;
234      if ((typeid = H5Tcopy(H5T_NATIVE_FLOAT)) < 0)
235  ERR;
236      if ((attid = H5Acreate(grpidATT1_NAME,
237      typeidspaceidH5P_DEFAULT)) < 0)
238  ERR;
239      if (H5Awrite(attidH5T_NATIVE_FLOAT, &val) < 0) ERR;
240      if (H5Sclose(spaceid) < 0) ERR;
241      if (H5Aclose(attid) < 0) ERR;
242      if (H5Tclose(typeid) < 0) ERR;
243      if (H5Gclose(grpid) < 0) ERR;
244      if (H5Fclose(fileid) < 0) ERR;
245
246      /* Now open the file again and read in the attribute. */
247      if ((fileid = H5Fopen(FILE_NAMEH5F_ACC_RDWR,
248     H5P_DEFAULT)) < 0) ERR;
249      if ((grpid = H5Gopen(fileidGRP_NAME)) < 0) ERR;
250      if ((attid = H5Aopen_name(grpidATT1_NAME)) < 0) ERR;
251      if ((spaceid = H5Aget_space(attid)) < 0) ERR;
252      if ((size = H5Sget_simple_extent_npoints(spaceid)) < 0) ERR;
253      if (size != 0) ERR;
254      if ((ndims = H5Sget_simple_extent_ndims(spaceid)) < 0) ERR;
255      if (ndims != 0) ERR;
256
257      /* Attach a text attribute with no data. */
258      if ((spaceid = H5Screate(H5S_NULL)) < 0) ERR;
259      if ((typeid = H5Tcopy(H5T_C_S1)) < 0) ERR;
260      if (H5Tset_size(typeid, 1) < 0) ERR;
261      if ((attid1 = H5Acreate(grpidATT2_NAMEtypeidspaceid,
262      H5P_DEFAULT)) < 0) ERR;
263      if (H5Awrite(attid1H5T_NATIVE_FLOAT, &val) < 0) ERR;
264      if (H5Sclose(spaceid) < 0 ||
265   H5Aclose(attid) < 0 ||
266   H5Aclose(attid1) < 0 ||
267   H5Tclose(typeid) < 0 ||
268   H5Gclose(grpid) < 0 ||
269   H5Fclose(fileid) < 0) ERR;
270
271      /* Now open the file again and read in the attribute. */
272      if ((fileid = H5Fopen(FILE_NAMEH5F_ACC_RDONLY,
273     H5P_DEFAULT)) < 0) ERR;
274      if ((grpid = H5Gopen(fileidGRP_NAME)) < 0) ERR;
275      if ((attid = H5Aopen_name(grpidATT2_NAME)) < 0) ERR;
276      if ((spaceid = H5Aget_space(attid)) < 0) ERR;
277      if ((size = H5Sget_simple_extent_npoints(spaceid)) < 0) ERR;
278      if (size != 0) ERR;
279      if ((ndims = H5Sget_simple_extent_ndims(spaceid)) < 0) ERR;
280      if (ndims != 0) ERR;
281      if (H5Sclose(spaceid) < 0 ||
282   H5Aclose(attid) < 0 ||
283   H5Gclose(grpid) < 0 ||
284   H5Fclose(fileid) < 0) ERR;
285   }
286
287   SUMMARIZE_ERR;
288   printf("*** Checking how HDF5 handles a delete and recreation of dataset with atts...");
289
290#define DIM1_LEN 3
291#define VAR_NAME "Hamlet"
292#define NUM_SPEECHES 3
293#define MAX_SPEECH_LEN 4095
294   {
295      /* Why test this out? Because this happens when the netcdf-4 user
296       * assigns a fill value attribute to a var. Since HDF5 demands that
297       * the fill value be supplied on var creation, I have to delete the
298       * dataset and recreate it, readding the attributes that existed
299       * when I delete it. */
300      hid_t var_spaceid = 0, datasetid = 0;
301      hsize_t dims[1];
302      char speech[NUM_SPEECHES][MAX_SPEECH_LEN + 1] = {
303  "A little more than kin, and less than kind!",
304
305  "Speak the speech, I pray you, as I pronounc'd it to you, trippingly on\n"
306  "the tongue. But if you mouth it, as many of our players do, I had as\n"
307  "live the town crier spoke my lines. Nor do not saw the air too much\n"
308  "with your hand, thus, but use all gently; for in the very torrent,\n"
309  "tempest, and (as I may say) whirlwind of your passion, you must\n"
310  "acquire and beget a temperance that may give it smoothness. O, it\n"
311  "offends me to the soul to hear a robustious periwig-pated fellow tear\n"
312  "a passion to tatters, to very rags, to split the cars of the\n"
313  "groundlings, who (for the most part) are capable of nothing but\n"
314  "inexplicable dumb shows and noise. I would have such a fellow whipp'd\n"
315  "for o'erdoing Termagant. It out-herods Herod.  Pray you avoid it.",
316
317  "O, I die, Horatio!\n"
318  "The potent poison quite o'ercrows my spirit.\n"
319  "I cannot live to hear the news from England,\n"
320  "But I do prophesy th' election lights\n"
321  "On Fortinbras. He has my dying voice.\n"
322  "So tell him, with th' occurrents, more and less,\n"
323  "Which have solicited- the rest is silence."};
324
325      char speech_name[NUM_SPEECHES][MAX_LEN + 1] = {"Act_1_Scene_2",
326      "Act_3_Scene_2",
327      "Act_5_Scene_2"};
328      char obj_name[MAX_LEN + 1];
329      int i;
330
331      /* Create a file and get its root group. */
332      if ((fileid = H5Fcreate(FILE_NAMEH5F_ACC_TRUNCH5P_DEFAULT,
333       H5P_DEFAULT)) < 0) ERR;
334      if ((grpid = H5Gopen(fileid, "/")) < 0) ERR;
335
336      /* Create a dataset. */
337      dims[0] = DIM1_LEN;
338      if ((var_spaceid = H5Screate_simple(1, dimsdims)) < 0) ERR;
339      if ((datasetid = H5Dcreate(grpidVAR_NAMEH5T_NATIVE_HBOOL,
340  var_spaceidH5P_DEFAULT)) < 0) ERR;
341
342      /* Attach three text attributes with some of Hamlet's lines to
343       * the dataset. */
344      if ((spaceid = H5Screate(H5S_SCALAR)) < 0) ERR;
345      if ((typeid = H5Tcopy(H5T_C_S1)) < 0) ERR;
346
347      for (i = 0; i < NUM_SPEECHESi++)
348      {
349  if (H5Tset_size(typeid, strlen(speech[i]) + 1) < 0) ERR;
350  if ((attid = H5Acreate(datasetidspeech_name[i], typeidspaceid,
351 H5P_DEFAULT)) < 0) ERR;
352  if (H5Awrite(attidtypeidspeech[i]) < 0) ERR;
353  if (H5Aclose(attid) < 0) ERR;
354      }
355
356      if (H5Dclose(datasetid) < 0 ||
357   H5Sclose(var_spaceid) < 0 ||
358   H5Sclose(spaceid) < 0 ||
359   H5Tclose(typeid) < 0 ||
360   H5Gclose(grpid) < 0 ||
361   H5Fclose(fileid) < 0) ERR;
362
363      /* Now open the file and delete the dataset (and all its
364       * attributes). */
365
366      /* Open file, group, and dataset. */
367      if ((fileid = H5Fopen(FILE_NAMEH5F_ACC_RDWR,
368     H5P_DEFAULT)) < 0) ERR;
369      if ((grpid = H5Gopen(fileid, "/")) < 0) ERR;
370      if ((datasetid = H5Dopen1(grpidVAR_NAME)) < 0) ERR;
371
372      /* How many attributes are there? */
373      if ((num_obj = H5Aget_num_attrs(datasetid)) != NUM_SPEECHESERR;
374
375      /* Make sure the names are in the correct order. */
376      for (i = 0; i < num_obji++)
377      {
378  if ((attid = H5Aopen_idx(datasetid, (unsigned int)i)) < 0) ERR;
379  if (H5Aget_name(attidMAX_LEN + 1, obj_name) < 0) ERR;
380  if (H5Aclose(attid) < 0) ERR;
381  if (strcmp(obj_namespeech_name[i])) ERR;
382      }
383
384      /* Delete the HDF5 dataset. */
385      if (H5Dclose(datasetid) < 0) ERR;
386      if (H5Gunlink(grpidVAR_NAME) < 0) ERR;
387
388      /* Recreate it and add the attributes again. */
389      if ((var_spaceid = H5Screate_simple(1, dimsdims)) < 0) ERR;
390      if ((datasetid = H5Dcreate(grpidVAR_NAMEH5T_NATIVE_HBOOL,
391  var_spaceidH5P_DEFAULT)) < 0) ERR;
392
393      /* Attach three text attributes with some of Hamlet's lines to
394       * the dataset. */
395      if ((spaceid = H5Screate(H5S_SCALAR)) < 0) ERR;
396      if ((typeid = H5Tcopy(H5T_C_S1)) < 0) ERR;
397
398      for (i = 0; i < NUM_SPEECHESi++)
399      {
400  if (H5Tset_size(typeid, strlen(speech[i]) + 1) < 0) ERR;
401  if ((attid = H5Acreate(datasetidspeech_name[i], typeidspaceid,
402 H5P_DEFAULT)) < 0) ERR;
403  if (H5Awrite(attidtypeidspeech[i]) < 0) ERR;
404  if (H5Aclose(attid) < 0) ERR;
405      }
406
407      /* How many attributes are there? */
408      if ((num_obj = H5Aget_num_attrs(datasetid)) != NUM_SPEECHESERR;
409
410      /* Make sure the names are in the correct order. */
411      for (i = 0; i < num_obji++)
412      {
413  if ((attid = H5Aopen_idx(datasetid, (unsigned int)i)) < 0) ERR;
414  if (H5Aget_name(attidMAX_LEN + 1, obj_name) < 0) ERR;
415  if (H5Aclose(attid) < 0) ERR;
416  if (strcmp(obj_namespeech_name[i])) ERR;
417      }
418
419      if (H5Dclose(datasetid) < 0 ||
420   H5Sclose(var_spaceid) < 0 ||
421   H5Gclose(grpid) < 0 ||
422   H5Fclose(fileid) < 0) ERR;
423
424   }
425
426   SUMMARIZE_ERR;
427   printf("*** Checking some more simple atts...");
428   {
429      hid_t fcpl_idfapl_idhdfidgrpid;
430      hid_t spaceidattidattid1;
431      int one = 1;
432      hsize_t dims[1];
433
434      /* Create a HDF5 file. */
435      if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
436      if (H5Pset_fclose_degree(fapl_idH5F_CLOSE_STRONG)) ERR;
437      if (H5Pset_libver_bounds(fapl_idH5F_LIBVER_LATESTH5F_LIBVER_LATEST) < 0) ERR;
438      if ((fcpl_id = H5Pcreate(H5P_FILE_CREATE)) < 0) ERR;
439      if (H5Pset_link_creation_order(fcpl_id, (H5P_CRT_ORDER_TRACKED |
440        H5P_CRT_ORDER_INDEXED)) < 0) ERR;
441/*      if (H5Pset_attr_creation_order(fcpl_id, (H5P_CRT_ORDER_TRACKED |
442 H5P_CRT_ORDER_INDEXED)) < 0) ERR;*/
443      if ((hdfid = H5Fcreate(FILE_NAMEH5F_ACC_TRUNCfcpl_idfapl_id)) < 0) ERR;
444      if (H5Pclose(fcpl_id) < 0) ERR;
445
446      /* Open the root group. */
447      if ((grpid = H5Gopen2(hdfid, "/", H5P_DEFAULT)) < 0) ERR;
448
449      /* Write an attribute. */
450      if ((spaceid = H5Screate(H5S_SCALAR)) < 0) ERR;
451      if ((attid = H5Acreate2(grpidNC3_STRICT_ATT_NAMEH5T_NATIVE_INT,
452       spaceidH5P_DEFAULTH5P_DEFAULT)) < 0) ERR;
453      if (H5Awrite(attidH5T_NATIVE_INT, &one) < 0) ERR;
454      if (H5Sclose(spaceid) < 0) ERR;
455
456      H5Fflush(hdfidH5F_SCOPE_GLOBAL);
457      dims[0] = 1;
458      if ((spaceid = H5Screate_simple(1, dimsNULL)) < 0) ERR;
459      if ((attid1 = H5Acreate2(grpid, "l", H5T_NATIVE_INTspaceid,
460        H5P_DEFAULTH5P_DEFAULT)) < 0) ERR;
461      if (H5Awrite(attid1H5T_NATIVE_INT, &one) < 0) ERR;
462      if (H5Aclose(attid1) < 0) ERR;
463      if ((attid1 = H5Acreate2(grpid, "y", H5T_NATIVE_INTspaceid,
464        H5P_DEFAULTH5P_DEFAULT)) < 0) ERR;
465      if (H5Awrite(attid1H5T_NATIVE_INT, &one) < 0) ERR;
466      if (H5Aclose(attid1) < 0) ERR;
467      if ((attid1 = H5Acreate2(grpid, "c", H5T_NATIVE_INTspaceid,
468        H5P_DEFAULTH5P_DEFAULT)) < 0) ERR;
469      if (H5Awrite(attid1H5T_NATIVE_INT, &one) < 0) ERR;
470      if (H5Aclose(attid1) < 0) ERR;
471
472      if (H5Sclose(spaceid) < 0) ERR;
473      if (H5Aclose(attid) < 0) ERR;
474      if (H5Gclose(grpid) < 0) ERR;
475      if (H5Fclose(hdfid) < 0) ERR;
476
477      if ((hdfid = H5Fopen(FILE_NAMEH5F_ACC_RDONLYfapl_id)) < 0) ERR;
478      if ((grpid = H5Gopen2(hdfid, "/", H5P_DEFAULT)) < 0)
479      if (H5Pclose(fapl_id) < 0) ERR;
480      if (H5Gclose(grpid) < 0) ERR;
481      if (H5Fclose(hdfid) < 0) ERR;
482   }
483   SUMMARIZE_ERR;
484
485   printf("*** Checking some more simple atts even more...");
486   {
487      hid_t fcpl_idfapl_idhdfidgrpid;
488      hid_t spaceidattidattid1;
489      int one = 1;
490      hsize_t dims[1];
491
492      /* Create a HDF5 file. */
493      if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
494      if (H5Pset_fclose_degree(fapl_idH5F_CLOSE_STRONG)) ERR;
495      if (H5Pset_libver_bounds(fapl_idH5F_LIBVER_LATESTH5F_LIBVER_LATEST) < 0) ERR;
496      if ((fcpl_id = H5Pcreate(H5P_FILE_CREATE)) < 0) ERR;
497      if (H5Pset_link_creation_order(fcpl_id, (H5P_CRT_ORDER_TRACKED |
498        H5P_CRT_ORDER_INDEXED)) < 0) ERR;
499/*      if (H5Pset_attr_creation_order(fcpl_id, (H5P_CRT_ORDER_TRACKED |
500 H5P_CRT_ORDER_INDEXED)) < 0) ERR;*/
501      if ((hdfid = H5Fcreate(FILE_NAMEH5F_ACC_TRUNCfcpl_idfapl_id)) < 0) ERR;
502      if (H5Pclose(fcpl_id) < 0) ERR;
503
504      /* Open the root group. */
505      if ((grpid = H5Gopen2(hdfid, "/", H5P_DEFAULT)) < 0) ERR;
506
507      /* Write an attribute. */
508      if ((spaceid = H5Screate(H5S_SCALAR)) < 0) ERR;
509      if ((attid = H5Acreate(grpidNC3_STRICT_ATT_NAMEH5T_NATIVE_INT,
510       spaceidH5P_DEFAULT)) < 0) ERR;
511      if (H5Awrite(attidH5T_NATIVE_INT, &one) < 0) ERR;
512      if (H5Sclose(spaceid) < 0) ERR;
513
514      H5Fflush(hdfidH5F_SCOPE_GLOBAL);
515      dims[0] = 1;
516      if ((spaceid = H5Screate_simple(1, dimsNULL)) < 0) ERR;
517      if ((attid1 = H5Acreate2(grpid, "z", H5T_NATIVE_INTspaceid,
518        H5P_DEFAULTH5P_DEFAULT)) < 0) ERR;
519      if (H5Awrite(attid1H5T_NATIVE_INT, &one) < 0) ERR;
520      if (H5Aclose(attid1) < 0) ERR;
521      if ((attid1 = H5Acreate2(grpid, "y", H5T_NATIVE_INTspaceid,
522        H5P_DEFAULTH5P_DEFAULT)) < 0) ERR;
523      if (H5Awrite(attid1H5T_NATIVE_INT, &one) < 0) ERR;
524      if (H5Aclose(attid1) < 0) ERR;
525      if ((attid1 = H5Acreate2(grpid, "c", H5T_NATIVE_INTspaceid,
526        H5P_DEFAULTH5P_DEFAULT)) < 0) ERR;
527      if (H5Awrite(attid1H5T_NATIVE_INT, &one) < 0) ERR;
528      if (H5Aclose(attid1) < 0) ERR;
529
530      if (H5Sclose(spaceid) < 0) ERR;
531      if (H5Aclose(attid) < 0) ERR;
532      if (H5Gclose(grpid) < 0) ERR;
533      if (H5Fclose(hdfid) < 0) ERR;
534
535      if ((hdfid = H5Fopen(FILE_NAMEH5F_ACC_RDONLYfapl_id)) < 0) ERR;
536      if ((grpid = H5Gopen2(hdfid, "/", H5P_DEFAULT)) < 0)
537      if (H5Pclose(fapl_id) < 0) ERR;
538      if (H5Gclose(grpid) < 0) ERR;
539      if (H5Fclose(hdfid) < 0) ERR;
540   }
541   SUMMARIZE_ERR;
542   printf("*** Checking HDF5 attribute ordering some more...");
543   {
544#define DIM2_LEN 2
545      hid_t fileidgrpidattidspaceiddimscaleidatt_spaceid;
546      hid_t fcpl_idfapl_id;
547      hsize_t num_objdims[1];
548      char obj_name[MAX_LEN + 1];
549      char att_name[3][20] = {"first", "second", "third"};
550      signed char b[DIM2_LEN] = {-127, 126};
551      int i;
552
553      /* Create a file and get its root group. */
554      if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
555      if (H5Pset_libver_bounds(fapl_idH5F_LIBVER_LATESTH5F_LIBVER_LATEST) < 0) ERR;
556      if ((fcpl_id = H5Pcreate(H5P_FILE_CREATE)) < 0) ERR;
557      if (H5Pset_link_creation_order(fcpl_id, (H5P_CRT_ORDER_TRACKED |
558        H5P_CRT_ORDER_INDEXED)) < 0) ERR;
559
560      if ((fileid = H5Fcreate(FILE_NAMEH5F_ACC_TRUNCfcpl_idfapl_id)) < 0) ERR;
561      if ((grpid = H5Gopen(fileid, "/")) < 0) ERR;
562
563      /* Write two group-level attributes containing byte attays of
564       * length 2, call them "first" and "second". */
565      dims[0] = DIM2_LEN;
566      if ((att_spaceid = H5Screate_simple(1, dimsdims)) < 0) ERR;
567      if ((attid = H5Acreate(grpidatt_name[0], H5T_NATIVE_UCHAR,
568      att_spaceidH5P_DEFAULT)) < 0) ERR;
569      if (H5Awrite(attidH5T_NATIVE_UCHARb) < 0) ERR;
570      if (H5Aclose(attid) < 0) ERR;
571      if ((attid = H5Acreate(grpid , att_name[1], H5T_NATIVE_UCHAR,
572      att_spaceidH5P_DEFAULT)) < 0) ERR;
573      if (H5Awrite(attidH5T_NATIVE_UCHARb) < 0) ERR;
574      if (H5Aclose(attid) < 0) ERR;
575
576      /* Create a dataset which will be a HDF5 dimension scale. */
577      dims[0] = 1;
578      if ((spaceid = H5Screate_simple(1, dimsdims)) < 0) ERR;
579      if ((dimscaleid = H5Dcreate(grpid, "D1", H5T_IEEE_F32BE,
580   spaceidH5P_DEFAULT)) < 0)
581  ERR;
582
583      /* Indicate that this is a scale. */
584      if (H5DSset_scale(dimscaleidNULL) < 0) ERR;
585
586      /* Add another attribute to the group. Call it "third". */
587      if ((attid = H5Acreate(grpid , att_name[2], H5T_NATIVE_UCHAR,
588      att_spaceidH5P_DEFAULT)) < 0) ERR;
589      if (H5Awrite(attidH5T_NATIVE_UCHARb) < 0) ERR;
590      if (H5Aclose(attid) < 0) ERR;
591
592      if (H5Dclose(dimscaleid) < 0 ||
593   H5Sclose(spaceid) < 0 ||
594   H5Sclose(att_spaceid) < 0 ||
595   H5Gclose(grpid) < 0 ||
596   H5Fclose(fileid) < 0) ERR;
597
598      /* Now open the file and check. Magically, the attributes "second"
599       * and "first" will be out of order. This can be checked with
600       * h5dump, or with the following code, which will fail if it does
601       * not find three attributes, in order "first", "second", and
602       * "third". */
603
604      /* Open file, group. */
605      if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
606      if (H5Pset_libver_bounds(fapl_idH5F_LIBVER_LATESTH5F_LIBVER_LATEST) < 0) ERR;
607      if ((fileid = H5Fopen(FILE_NAMEH5F_ACC_RDWR,
608     fapl_id)) < 0) ERR;
609      if ((grpid = H5Gopen(fileid, "/")) < 0) ERR;
610
611      /* How many attributes are there? */
612      if ((num_obj = H5Aget_num_attrs(grpid)) != 3) ERR;
613
614      /* Make sure the names are in the correct order. */
615      for (i = 0; i < num_obji++)
616      {
617  if ((attid = H5Aopen_idx(grpid, (unsigned int)i)) < 0) ERR;
618  if (H5Aget_name(attidMAX_LEN + 1, obj_name) < 0) ERR;
619  if (H5Aclose(attid) < 0) ERR;
620  if (strcmp(obj_nameatt_name[i])) ERR;
621      }
622
623      if (H5Gclose(grpid) < 0 ||
624   H5Fclose(fileid) < 0) ERR;
625   }
626
627   SUMMARIZE_ERR;
628   printf("*** Checking HDF5 attribute ordering with 9 attributes...(skipping for HDF5 1.8.0 beta1)");
629#define NUM_SIMPLE_ATTS 9
630#define ATT_MAX_NAME 2
631   {
632      hid_t fileidgrpidattidatt_spaceid;
633      hsize_t num_obj;
634      char obj_name[MAX_LEN + 1];
635      char name[NUM_SIMPLE_ATTS][ATT_MAX_NAME + 1] = {"Gc", "Gb", "Gs", "Gi", "Gf",
636       "Gd", "G7", "G8", "G9"};
637      hid_t fcpl_idfapl_id;
638      int i;
639
640      /* Set up property lists to turn on creation ordering. */
641      if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
642     if (H5Pset_libver_bounds(fapl_idH5F_LIBVER_LATESTH5F_LIBVER_LATEST) < 0) ERR;
643      if ((fcpl_id = H5Pcreate(H5P_FILE_CREATE)) < 0) ERR;
644      if (H5Pset_link_creation_order(fcpl_id, (H5P_CRT_ORDER_TRACKED |
645        H5P_CRT_ORDER_INDEXED)) < 0) ERR;
646      if (H5Pset_attr_creation_order(fcpl_id, (H5P_CRT_ORDER_TRACKED |
647        H5P_CRT_ORDER_INDEXED)) < 0) ERR;
648
649
650      /* Create a file and get its root group. */
651      if ((fileid = H5Fcreate(FILE_NAMEH5F_ACC_TRUNCfcpl_idfapl_id)) < 0) ERR;
652      if ((grpid = H5Gopen(fileid, "/")) < 0) ERR;
653
654      /* These will all be zero-length atts. */
655      if ((att_spaceid = H5Screate(H5S_NULL)) < 0) ERR;
656
657      for (i = 0; i < NUM_SIMPLE_ATTSi++)
658      {
659  if ((attid = H5Acreate(grpidname[i], H5T_NATIVE_INT,
660 att_spaceidH5P_DEFAULT)) < 0) ERR;
661  if (H5Aclose(attid) < 0) ERR;
662      }
663
664      if (H5Sclose(att_spaceid) < 0 ||
665   H5Gclose(grpid) < 0 ||
666   H5Fclose(fileid) < 0) ERR;
667
668      /* Now open the file and check. */
669
670      /* Open file, group. */
671      if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
672     if (H5Pset_libver_bounds(fapl_idH5F_LIBVER_LATESTH5F_LIBVER_LATEST) < 0) ERR;
673      if ((fileid = H5Fopen(FILE_NAMEH5F_ACC_RDWR,
674     fapl_id)) < 0) ERR;
675      if ((grpid = H5Gopen(fileid, "/")) < 0) ERR;
676
677      /* How many attributes are there? */
678      if ((num_obj = H5Aget_num_attrs(grpid)) != NUM_SIMPLE_ATTSERR;
679
680      /* Make sure the names are in the correct order. */
681      for (i = 0; i < num_obji++)
682      {
683  if ((attid = H5Aopen_idx(grpid, (unsigned int)i)) < 0) ERR;
684  if (H5Aget_name(attidMAX_LEN + 1, obj_name) < 0) ERR;
685  if (H5Aclose(attid) < 0) ERR;
686  if (strcmp(obj_namename[i])) ERR;
687      }
688
689      if (H5Gclose(grpid) < 0 ||
690   H5Fclose(fileid) < 0) ERR;
691   }
692
693   SUMMARIZE_ERR;
694   FINAL_RESULTS;
695}


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