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 program deals with HDF5 compound types.
10
11   $Id: tst_h_compounds2.c,v 1.17 2010/06/01 15:34:51 ed Exp $
12*/
13
14#include "h5_err_macros.h"
15#include <hdf5.h>
16
17#define FILE_NAME "tst_h_compounds2.h5"
18#define REF_FILE_IN "ref_tst_h_compounds2.h5"
19#define STR_LEN 255
20
21int
22main()
23{
24   printf("\n*** Checking HDF5 compound types some more.\n");
25   printf("*** Checking HDF5 compound attribute which contains a simple compound type...");
26   {
27#define DIM_CMP_LEN 1
28#define ATT_NAME1 "The_Nutmeg_of_Consolation"
29#define NUM_TYPES 2
30#define INNER_TYPE_NAME "s1"
31#define OUTER_TYPE_NAME "d"
32
33      /* This struct will be embeddeded in another. */
34      struct s1
35      {
36            float x;
37            double y;
38      };
39      struct s2
40      {
41            struct s1 s1;
42      };
43      struct s2 data_out[DIM_CMP_LEN], data_in[DIM_CMP_LEN];
44      hid_t fileidgrpidtypeid_innertypeid_outerspaceidattid;
45      hid_t obj_hdf_typeid[NUM_TYPES], obj_native_typeid[NUM_TYPES];
46      hid_t inner_type_native_typeid;
47      hid_t att_typeidatt_native_typeid;
48      hsize_t dims[1];
49      hsize_t num_obji_obj;
50      char obj_name[STR_LEN + 1];
51      H5O_info_t obj_info;
52      hid_t fapl_idfcpl_id;
53      htri_t equal;
54      char file_in[STR_LEN * 2];
55      char *dummy;
56      int i;
57
58      /* REALLY initialize the data (even the gaps in the structs). This
59       * is only needed to pass valgrind. */
60      if (!(dummy = calloc(sizeof(struct s2), DIM_CMP_LEN))) ERR;
61      memcpy((void *)data_out, (void *)dummy, sizeof(struct s2) * DIM_CMP_LEN);
62      free(dummy);
63
64      /* Create some phony data. */
65      for (i = 0; i < DIM_CMP_LENi++)
66      {
67         data_out[i].s1.x = 1.0;
68         data_out[i].s1.y = -2.0;
69      }
70
71      /* Create file access and create property lists. */
72      if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
73      if ((fcpl_id = H5Pcreate(H5P_FILE_CREATE)) < 0) ERR;
74      if (H5Pset_libver_bounds(fapl_idH5F_LIBVER_LATESTH5F_LIBVER_LATEST) < 0) ERR;
75      if (H5Pset_link_creation_order(fcpl_id, (H5P_CRT_ORDER_TRACKED |
76        H5P_CRT_ORDER_INDEXED)) < 0) ERR;
77      if (H5Pset_attr_creation_order(fcpl_id, (H5P_CRT_ORDER_TRACKED |
78        H5P_CRT_ORDER_INDEXED)) < 0) ERR;
79
80      /* Create file and get root group. */
81      if ((fileid = H5Fcreate(FILE_NAMEH5F_ACC_TRUNCfcpl_idfapl_id)) < 0) ERR;
82      if ((grpid = H5Gopen(fileid, "/")) < 0) ERR;
83
84      /* Create the inner compound type. */
85      if ((typeid_inner = H5Tcreate(H5T_COMPOUND, sizeof(struct s1))) < 0) ERR;
86      if (H5Tinsert(typeid_inner, "x", HOFFSET(struct s1x), H5T_NATIVE_FLOAT) < 0) ERR;
87      if (H5Tinsert(typeid_inner, "y", HOFFSET(struct s1y), H5T_NATIVE_DOUBLE) < 0) ERR;
88      if (H5Tcommit(grpidINNER_TYPE_NAMEtypeid_inner) < 0) ERR;
89
90      /* Create a compound type containing a compound type. */
91      if ((typeid_outer = H5Tcreate(H5T_COMPOUND, sizeof(struct s2))) < 0) ERR;
92      if (H5Tinsert(typeid_outerINNER_TYPE_NAMEHOFFSET(struct s2s1), typeid_inner) < 0) ERR;
93      if (H5Tcommit(grpidOUTER_TYPE_NAMEtypeid_outer) < 0) ERR;
94
95      /* Create a space. */
96      dims[0] = DIM_CMP_LEN;
97      if ((spaceid = H5Screate_simple(1, dimsdims)) < 0) ERR;
98
99      /* Create an attribute of this compound type. */
100      if ((attid = H5Acreate2(grpidATT_NAME1typeid_outerspaceidH5P_DEFAULTH5P_DEFAULT)) < 0) ERR;
101
102      /* Write some data to the attribute. */
103      if (H5Awrite(attidtypeid_outerdata_out) < 0) ERR;
104
105      /* Release all resources. */
106      if (H5Aclose(attid) < 0 ||
107          H5Tclose(typeid_outer) < 0 ||
108          H5Tclose(typeid_inner) < 0 ||
109          H5Sclose(spaceid) < 0 ||
110          H5Gclose(grpid) < 0 ||
111          H5Fclose(fileid) < 0) ERR;
112
113      /* Now open the file and get the type of the attribute. */
114      if ((fileid = H5Fopen(FILE_NAMEH5F_ACC_RDONLYH5P_DEFAULT)) < 0) ERR;
115      if ((grpid = H5Gopen(fileid, "/")) < 0) ERR;
116      if ((attid = H5Aopen_by_name(grpid, ".", ATT_NAME1H5P_DEFAULTH5P_DEFAULT)) < 0) ERR;
117      if ((att_typeid = H5Aget_type(attid)) < 0) ERR;
118      if ((att_native_typeid = H5Tget_native_type(att_typeidH5T_DIR_DEFAULT)) < 0) ERR;
119
120      /* Find the HDF ID of the inner type. */
121      if ((inner_type_native_typeid = H5Tget_member_type(att_native_typeid, 0)) < 0) ERR;
122
123      /* Check the data. */
124      if (H5Aread(attidatt_native_typeiddata_in) < 0) ERR;
125      for (i = 0; i < DIM_CMP_LENi++)
126         if (data_out[i].s1.x != data_in[i].s1.x ||
127             data_out[i].s1.y != data_in[i].s1.yERR;
128
129      /* Now iterate through the objects in the file, finding the two
130       * defined compound types. */
131      if (H5Gget_num_objs(grpid, &num_obj) < 0) ERR;
132      for (i_obj = 0; i_obj < num_obji_obj++)
133      {
134  if (H5Oget_info_by_idx(grpid, ".", H5_INDEX_CRT_ORDERH5_ITER_INC,
135 i_obj, &obj_infoH5P_DEFAULT) < 0) ERR;
136  if (H5Lget_name_by_idx(grpid, ".", H5_INDEX_CRT_ORDERH5_ITER_INC,
137 i_objobj_nameSTR_LEN + 1, H5P_DEFAULT) < 0) ERR;
138
139  /* Deal with groups and datasets. */
140  if (obj_info.type == H5O_TYPE_NAMED_DATATYPE)
141  {
142     /* Learn about the user-defined type. */
143     if ((obj_hdf_typeid[i_obj] = H5Topen2(grpidobj_name,
144   H5P_DEFAULT)) < 0) ERR;
145     if ((obj_native_typeid[i_obj] = H5Tget_native_type(obj_hdf_typeid[i_obj],
146        H5T_DIR_DEFAULT)) < 0) ERR;
147
148     /* If this is the inner type, the obj_native_typeid
149      * should be equal to the inner_type_native_typeid. */
150     if (!strcmp(obj_nameINNER_TYPE_NAME))
151     {
152        if ((equal = H5Tequal(obj_native_typeid[i_obj],
153      inner_type_native_typeid)) < 0) ERR;
154        if (!equalERR;
155     }
156  }
157      }
158
159      /* Release all resources. */
160      if (H5Aclose(attid) < 0 ||
161          H5Tclose(att_typeid) < 0 ||
162          H5Tclose(att_native_typeid) < 0 ||
163          H5Gclose(grpid) < 0 ||
164          H5Fclose(fileid) < 0) ERR;
165
166      /* Now open the reference file, created on buddy, and check it
167       * all again. This is the cross-platform part! */
168      if (getenv("srcdir"))
169      {
170         strcpy(file_in, getenv("srcdir"));
171         strcat(file_in, "/");
172         strcat(file_inREF_FILE_IN);
173      }
174      else
175         strcpy(file_inREF_FILE_IN);
176
177      if ((fileid = H5Fopen(file_inH5F_ACC_RDONLYH5P_DEFAULT)) < 0) ERR;
178      if ((grpid = H5Gopen(fileid, "/")) < 0) ERR;
179      if ((attid = H5Aopen_by_name(grpid, ".", ATT_NAME1H5P_DEFAULTH5P_DEFAULT)) < 0) ERR;
180      if ((att_typeid = H5Aget_type(attid)) < 0) ERR;
181      if ((att_native_typeid = H5Tget_native_type(att_typeidH5T_DIR_DEFAULT)) < 0) ERR;
182
183      /* Check the data. */
184      if (H5Aread(attidatt_native_typeiddata_in) < 0) ERR;
185      for (i = 0; i < DIM_CMP_LENi++)
186         if (data_out[i].s1.x != data_in[i].s1.x ||
187             data_out[i].s1.y != data_in[i].s1.yERR;
188
189      /* Find the HDF ID of the inner type. */
190      if ((inner_type_native_typeid = H5Tget_member_type(att_native_typeid, 0)) < 0) ERR;
191
192      /* Now iterate through the objects in the file, finding the two
193       * defined compound types. */
194      if (H5Gget_num_objs(grpid, &num_obj) < 0) ERR;
195      for (i_obj = 0; i_obj < num_obji_obj++)
196      {
197  if (H5Oget_info_by_idx(grpid, ".", H5_INDEX_CRT_ORDERH5_ITER_INCi_obj, &obj_info,
198 H5P_DEFAULT) < 0) ERR;
199  if (H5Lget_name_by_idx(grpid, ".", H5_INDEX_CRT_ORDERH5_ITER_INCi_objobj_name,
200 STR_LEN + 1, H5P_DEFAULT) < 0) ERR;
201
202  /* Deal with groups and datasets. */
203  if (obj_info.type == H5O_TYPE_NAMED_DATATYPE)
204  {
205     /* Learn about the user-defined type. */
206     if ((obj_hdf_typeid[i_obj] = H5Topen2(grpidobj_nameH5P_DEFAULT)) < 0) ERR;
207     if ((obj_native_typeid[i_obj] = H5Tget_native_type(obj_hdf_typeid[i_obj],
208        H5T_DIR_DEFAULT)) < 0) ERR;
209
210     /* If this is the inner type, the obj_native_typeid
211      * should be equal to the inner_type_native_typeid. */
212     if (!strcmp(obj_nameINNER_TYPE_NAME))
213     {
214        if ((equal = H5Tequal(obj_native_typeid[i_obj], inner_type_native_typeid)) < 0) ERR;
215        if (!equalERR;
216     }
217  }
218      }
219
220      /* Release all resources. */
221      if (H5Aclose(attid) < 0 ||
222          H5Tclose(att_typeid) < 0 ||
223          H5Tclose(att_native_typeid) < 0 ||
224          H5Gclose(grpid) < 0 ||
225          H5Fclose(fileid) < 0) ERR;
226
227   }
228   SUMMARIZE_ERR;
229   FINAL_RESULTS;
230}


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