1/* This is part of the netCDF package.  Copyright 2005 University
2   Corporation for Atmospheric Research/Unidata See COPYRIGHT file for
3   conditions of use.
4
5   This program excersizes HDF5 variable length array code.
6
7   $Id: tst_h_enums.c,v 1.14 2010/06/01 15:34:51 ed Exp $
8*/
9#include "h5_err_macros.h"
10#include <hdf5.h>
11
12#define FILE_NAME "tst_h_enums.h5"
13#define DIM1_LEN 12
14#define ATT_NAME "Browings_reverse_enumerations"
15#define SIZE 9
16#define GRP_NAME "Browning"
17#define NUM_VALS 12
18#define STR_LEN 255
19
20/* This seems like a good sonnet for enumation:
21
22How do I love thee? Let me count the ways.
23I love thee to the depth and breadth and height
24My soul can reach, when feeling out of sight
25For the ends of Being and ideal Grace.
26I love thee to the level of everyday's
27Most quiet need, by sun and candle-light.
28I love thee freely, as men strive for Right;
29I love thee purely, as they turn from Praise.
30I love thee with a passion put to use
31In my old griefs, and with my childhood's faith.
32I love thee with a love I seemed to lose
33With my lost saints, --- I love thee with the breath,
34Smiles, tears, of all my life! --- and, if God choose,
35I shall but love thee better after death.
36
37(I gotta say, that's one dorky poem. - Ed)
38*/
39
40int
41main()
42{
43   printf("\n*** Checking HDF5 enum types.\n");
44   printf("*** Checking simple HDF5 enum type...");
45   {
46      hid_t fileidgrpidspaceidtypeidattid;
47      hsize_t dims[1] = {DIM1_LEN};
48      short data[DIM1_LEN];
49      short data_in[DIM1_LEN];
50      int i;
51      short val[NUM_VALS];
52      char love_how[NUM_VALS][STR_LEN + 1] = {"Depth", "Bredth",
53   "Height", "Level",
54   "Freely", "Purely",
55   "Passionately", "Lost",
56   "Breath", "Smiles",
57   "Tears", "After Death"};
58/*      H5T_class_t type_class;*/
59      size_t size;
60      int num_members;
61      short the_value;
62      char *member_name;
63      htri_t types_equal;
64      hid_t base_hdf_typeid;
65
66
67      for (i=0; i < NUM_VALSi++)
68  val[i] = i*2;
69      for (i=0; i < DIM1_LENi++)
70  data[i] = i*2;
71
72      /* Open file. */
73      if ((fileid = H5Fcreate(FILE_NAMEH5F_ACC_TRUNCH5P_DEFAULT,
74       H5P_DEFAULT)) < 0) ERR;
75      if ((grpid = H5Gcreate(fileidGRP_NAME, 0)) < 0) ERR;
76
77      /* Create enum type. */
78      /* Both methods do the same thing, but Quincey says to prefer
79       * H5Tcreate_enum. */
80      /*if ((typeid =  H5Tcreate(H5T_ENUM, sizeof(short))) < 0) ERR;*/
81      if ((typeid =  H5Tenum_create(H5T_NATIVE_SHORT)) < 0) ERR;
82
83      /* Insert some values. */
84      for (i=0; i<NUM_VALSi++)
85  if (H5Tenum_insert(typeidlove_how[i], &val[i]) < 0) ERR;
86
87      /* Write an attribute of this type. */
88      if ((spaceid = H5Screate_simple(1, dimsNULL)) < 0) ERR;
89      if ((attid = H5Acreate(grpidATT_NAMEtypeidspaceid,
90      H5P_DEFAULT)) < 0) ERR;
91      if (H5Awrite(attidtypeiddata) < 0) ERR;
92
93      /* Close everything. */
94      if (H5Aclose(attid) < 0 ||
95   H5Tclose(typeid) < 0 ||
96   H5Gclose(grpid) < 0 ||
97   H5Fclose(fileid) < 0) ERR;
98
99      /* Reopen the file. */
100      if ((fileid = H5Fopen(FILE_NAMEH5F_ACC_RDWR,
101     H5P_DEFAULT)) < 0) ERR;
102      if ((grpid = H5Gopen(fileidGRP_NAME)) < 0) ERR;
103
104      /* Check the attribute's type. */
105      if ((attid = H5Aopen_name(grpidATT_NAME)) < 0) ERR;
106      if ((typeid = H5Aget_type(attid)) < 0) ERR;
107/*      if ((type_class = H5Tget_class(typeid)) != H5T_ENUM) ERR;*/
108      num_members = H5Tget_nmembers(typeid);
109      if (num_members != NUM_VALSERR;
110      size = H5Tget_size(typeid);
111      if (size != 2) ERR;
112      if ((base_hdf_typeid = H5Tget_super(typeid)) < 0) ERR;
113      if ((types_equal = H5Tequal(base_hdf_typeidH5T_NATIVE_SHORT)) < 0) ERR;
114      if (!types_equalERR;
115
116      /* Check each value and number in the enum. */
117      for (i=0; i < NUM_VALSi++)
118      {
119  if (H5Tget_member_value(typeidi, &the_value) < 0) ERR;
120  if (the_value != val[i]) ERR;
121  member_name = H5Tget_member_name(typeidi);
122  if (strcmp(member_namelove_how[i])) ERR;
123  free(member_name);
124      }
125
126      /* Now read the data in the attribute and make sure it's what we
127       * expect it to be. */
128      if (H5Aread(attidtypeiddata_in) < 0) ERR;
129      for (i=0; i < DIM1_LENi++)
130  if (data_in[i] != data[i]) ERR;
131
132      /* Close it all again. */
133      if (H5Aclose(attid) < 0 ||
134   H5Tclose(typeid) < 0 ||
135   H5Gclose(grpid) < 0 ||
136   H5Fclose(fileid) < 0) ERR;
137   }
138   SUMMARIZE_ERR;
139
140   printf("*** Checking HDF5 enum type missing values...");
141   {
142#define NUM_LANG 4
143#define VAR_LANG_NAME "Programming_Language"
144#define FV_NAME "_FillValue"
145#define GRP_NAME2 "NetCDF_Programming"
146
147      hid_t datasetidmem_spaceidfileidgrpidspaceidtypeidplistid;
148      hid_t file_spaceidattidatt_spaceid;
149      hsize_t dims[1] = {DIM1_LEN};
150      short data_in[DIM1_LEN];
151      int i;
152      short val[NUM_LANG];
153      char lang[NUM_LANG][STR_LEN + 1] = {"C", "Fortran", "C++", "MISSING"};
154      enum langs {CLANG=0, Fortran=1, CPP=2, MISSING=255};
155      short the_valuefill_value = MISSINGdata_point = CLANG;
156      hsize_t start[1] = {1}, count[1] = {1};
157      int num_members;
158      size_t size;
159      hid_t base_hdf_typeid;
160/*      H5T_class_t type_class;*/
161      char *member_name;
162      htri_t types_equal;
163
164      val[0] = CLANG;
165      val[1] = Fortran;
166      val[2] = CPP;
167      val[3] = MISSING;
168
169      /* Open file. */
170      if ((fileid = H5Fcreate(FILE_NAMEH5F_ACC_TRUNCH5P_DEFAULT,
171       H5P_DEFAULT)) < 0) ERR;
172      if ((grpid = H5Gcreate(fileidGRP_NAME2, 0)) < 0) ERR;
173
174      /* Create enum type. */
175      if ((typeid =  H5Tenum_create(H5T_NATIVE_SHORT)) < 0) ERR;
176
177      /* Insert some values. */
178      for (i=0; i<NUM_LANGi++)
179  if (H5Tenum_insert(typeidlang[i], &val[i]) < 0) ERR;
180
181      /* Create a dataset of this enum type, with fill value. */
182      if ((spaceid = H5Screate_simple(1, dimsNULL)) < 0) ERR;
183      if ((plistid = H5Pcreate(H5P_DATASET_CREATE)) < 0) ERR;
184      if (H5Pset_fill_value(plistidtypeid, &fill_value) < 0) ERR;
185      if ((datasetid = H5Dcreate(grpidVAR_LANG_NAMEtypeid,
186  spaceidplistid)) < 0) ERR;
187
188      /* Create a netCDFstyle _FillValue attribute, though it will be
189       * ignored by HDF5. */
190      if ((att_spaceid = H5Screate(H5S_SCALAR)) < 0) ERR;
191      if ((attid = H5Acreate(grpidFV_NAMEtypeidatt_spaceid,
192      H5P_DEFAULT)) < 0) ERR;
193      if (H5Awrite(attidtypeid, &fill_value) < 0) ERR;
194
195      /* Write one value, the rest will end up set to MISSING. */
196      if ((mem_spaceid = H5Screate(H5S_SCALAR)) < 0) ERR;
197      if ((file_spaceid = H5Screate_simple(1, dimsNULL)) < 0) ERR;
198      if (H5Sselect_hyperslab(file_spaceidH5S_SELECT_SET,
199       startNULLcountNULL) < 0) ERR;
200      if (H5Dwrite(datasetidtypeidmem_spaceidfile_spaceid,
201    H5P_DEFAULT, &data_point) < 0) ERR;
202
203      /* Close everything. */
204      if (H5Sclose(spaceid) < 0 ||
205   H5Sclose(mem_spaceid) < 0 ||
206   H5Aclose(attid) < 0 ||
207   H5Sclose(file_spaceid) < 0 ||
208   H5Dclose(datasetid) < 0 ||
209   H5Pclose(plistid) < 0 ||
210   H5Tclose(typeid) < 0 ||
211   H5Gclose(grpid) < 0 ||
212   H5Fclose(fileid) < 0) ERR;
213
214      /* Reopen the file. */
215      if ((fileid = H5Fopen(FILE_NAMEH5F_ACC_RDWRH5P_DEFAULT)) < 0) ERR;
216      if ((grpid = H5Gopen(fileidGRP_NAME2)) < 0) ERR;
217
218      /* Check the variable's type. */
219      if ((datasetid = H5Dopen1(grpidVAR_LANG_NAME)) < 0) ERR;
220      if ((typeid = H5Dget_type(datasetid)) < 0) ERR;
221/*      if ((type_class = H5Tget_class(typeid)) != H5T_ENUM) ERR;*/
222      num_members = H5Tget_nmembers(typeid);
223      if (num_members != NUM_LANGERR;
224      size = H5Tget_size(typeid);
225      if (size != sizeof(short)) ERR;
226      if ((base_hdf_typeid = H5Tget_super(typeid)) < 0) ERR;
227      if ((types_equal = H5Tequal(base_hdf_typeidH5T_NATIVE_SHORT)) < 0) ERR;
228      if (!types_equalERR;
229
230      /* Check each value and number in the enum. */
231      for (i=0; i < NUM_LANGi++)
232      {
233  if (H5Tget_member_value(typeidi, &the_value) < 0) ERR;
234  if (the_value != val[i]) ERR;
235  member_name = H5Tget_member_name(typeidi);
236  if (strcmp(member_namelang[i])) ERR;
237  free(member_name);
238      }
239
240      /* Now read the data in the dataset and make sure it's what we
241       * expect it to be. */
242      if (H5Dread(datasetidtypeidH5S_ALLH5S_ALLH5P_DEFAULTdata_in) < 0) ERR;
243      for (i=0; i < DIM1_LENi++)
244  if (i == 1)
245  {
246     if (data_in[i] != data_pointERR;
247  }
248  else
249     if (data_in[i] != MISSINGERR;
250
251      /* Close it all again. */
252      if (H5Dclose(datasetid) < 0 ||
253   H5Tclose(typeid) < 0 ||
254   H5Gclose(grpid) < 0 ||
255   H5Fclose(fileid) < 0) ERR;
256   }
257   SUMMARIZE_ERR;
258/*    printf("*** Checking HDF5 enum interuptus..."); */
259/*    { */
260/* #define GRP_NAME3 "STOP!" */
261
262/*       hid_t fileid, grpid,  typeid; */
263
264/*       /\* Open file. *\/ */
265/*       if ((fileid = H5Fcreate(FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT,  */
266/*        H5P_DEFAULT)) < 0) ERR; */
267/*       if ((grpid = H5Gcreate(fileid, GRP_NAME3, 0)) < 0) ERR; */
268
269/*       /\* Create enum type. *\/ */
270/*       if ((typeid =  H5Tenum_create(H5T_NATIVE_SHORT)) < 0) ERR; */
271
272/*       /\* Commit the type. This doesn't work, because no members were */
273/*        * specified. *\/ */
274/*       if (!H5Tcommit(grpid, "name", typeid) < 0) ERR; */
275
276/*       /\* Close everything. *\/ */
277/*       if (H5Tclose(typeid) < 0 || */
278/*    H5Gclose(grpid) < 0 || */
279/*    H5Fclose(fileid) < 0) ERR;  */
280
281/*    } */
282/*    SUMMARIZE_ERR; */
283
284   FINAL_RESULTS;
285}


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