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
8#include "h5_err_macros.h"
9#include <hdf5.h>
10
11#define FILE_NAME "tst_h_vl.h5"
12#define DIM1_LEN 3
13#define ATT_NAME "att_name"
14#define GROUP_NAME "grp1"
15
16int
17main()
18{
19   printf("\n*** Checking HDF5 VLEN types.\n");
20   printf("*** Checking simple HDF5 variable length types...");
21   {
22      hid_t fileidgrpidspaceidtypeidattid;
23      hsize_t dims[1] = {DIM1_LEN};
24      hvl_t data[DIM1_LEN], data_in[DIM1_LEN];
25      int *phoney;
26      int ij;
27      size_t size;
28
29      /* Create some phoney data, an array of struct s1, which holds a
30       * pointer to a variable length array of int. */
31      for (i=0; i<DIM1_LENi++)
32      {
33  if (!(phoney = malloc(sizeof(int) * (i+1)))) ERR;
34  for (j=0; j<i+1; j++)
35     phoney[j] = -99;
36  data[i].p = phoney;
37  data[i].len = i+1;
38      }
39
40      /* Open file. */
41      if ((fileid = H5Fcreate(FILE_NAMEH5F_ACC_TRUNCH5P_DEFAULT,
42       H5P_DEFAULT)) < 0) ERR;
43      if ((grpid = H5Gcreate(fileidGROUP_NAME, 0)) < 0) ERR;
44
45      /* Create VLEN type. */
46      if ((typeid =  H5Tvlen_create(H5T_NATIVE_INT)) < 0) ERR;
47
48      /* Although it's a vlen of ints, the size is rouned up to 8. */
49      if (!(size = H5Tget_size(typeid))) ERR;
50      if (size < 8) ERR;
51
52      /* Write an attribute of this vlen type. */
53      if ((spaceid = H5Screate_simple(1, dimsNULL)) < 0) ERR;
54      if ((attid = H5Acreate(grpidATT_NAMEtypeidspaceid,
55      H5P_DEFAULT)) < 0) ERR;
56      if (H5Awrite(attidtypeiddata) < 0) ERR;
57      if (H5Aclose(attid) < 0) ERR;
58      if (H5Tclose(typeid) < 0) ERR;
59      if (H5Gclose(grpid) < 0) ERR;
60      if (H5Fclose(fileid) < 0) ERR;
61
62      /* Reopen the file and read the vlen data. */
63      if ((fileid = H5Fopen(FILE_NAMEH5F_ACC_RDONLYH5P_DEFAULT)) < 0) ERR;
64      if ((grpid = H5Gopen(fileidGROUP_NAME)) < 0) ERR;
65      if ((attid = H5Aopen_name(grpidATT_NAME)) < 0) ERR;
66      if ((spaceid = H5Aget_space(attid)) < 0) ERR;
67      if ((typeid = H5Aget_type(attid)) < 0) ERR;
68      if (H5Aread(attidtypeiddata_in) < 0) ERR;
69
70      /* Check the data */
71      for (i=0; i<DIM1_LENi++)
72      {
73  if (data[i].len != i+1) ERR;
74  for (j = 0; j < i+1; j++)
75     if (((int *)(data[i].p))[j] != -99) ERR;
76      }
77
78      /* Free the memory allocated above. */
79      for (i=0; i<DIM1_LENi++)
80  free(data[i].p);
81
82      /* HDF5 allocated memory to store the data. Free that memory. */
83      if (H5Dvlen_reclaim(typeidspaceidH5P_DEFAULTdata_in) < 0) ERR;
84
85      /* Close everything. */
86      if (H5Aclose(attid) < 0 ||
87   H5Sclose(spaceid) < 0 ||
88   H5Tclose(typeid) < 0 ||
89   H5Gclose(grpid) < 0 ||
90   H5Fclose(fileid) < 0) ERR;
91   }
92
93   SUMMARIZE_ERR;
94/*    printf("*** Checking array of compound holding a vlen..."); */
95
96/*    { */
97/*       hid_t vlen_typeid, compound_typeid, spaceid, datasetid; */
98/*       struct sea_sounding */
99/*       { */
100/*      int sounding_no; */
101/*      hvl_t temp_vl; */
102/*       } data[DIM1_LEN]; */
103/*       float *phoney; */
104/*       int i, j; */
105
106/*       /\* Create phoney data. *\/ */
107/*       for (i=0; i<DIM1_LEN; i++) */
108/*       { */
109/*    if (!(phoney = malloc(sizeof(float) * (i+1)))) ERR; */
110/*   for (j=0; j<i+1; j++) */
111/*      phoney[j] = 23.5 - j; */
112/*   data[i].temp_vl.p = phoney; */
113/*   data[i].temp_vl.len = i+1; */
114/*       } */
115
116/*       /\* Create file. *\/ */
117/*       if ((fileid = H5Fcreate(FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT,  */
118/*        H5P_DEFAULT)) < 0) ERR; */
119/*       if ((grpid = H5Gcreate(fileid, "grp1", 0)) < 0) ERR; */
120
121/*       /\* Create VLEN type. *\/ */
122/*       if ((vlen_typeid =  H5Tvlen_create(H5T_NATIVE_FLOAT)) < 0) ERR; */
123
124/*       /\* Create a compound type that holds the vlen type. *\/ */
125/*       if ((compound_typeid = H5Tcreate(H5T_COMPOUND,  */
126/*         sizeof(struct sea_sounding))) < 0) ERR; */
127/*       if (H5Tinsert(compound_typeid, "sounding_no", HOFFSET(struct sea_sounding, sounding_no),  */
128/*      H5T_NATIVE_INT) < 0) ERR; */
129/*       if (H5Tinsert(compound_typeid, "temp_vl", HOFFSET(struct sea_sounding, temp_vl),  */
130/*      vlen_typeid) < 0) ERR; */
131/*       if (H5Tcommit(grpid, "sea_sounding_type", compound_typeid) < 0) ERR; */
132
133/*       if ((spaceid = H5Screate_simple(1, dims, NULL)) < 0) ERR; */
134/*       if ((datasetid = H5Dcreate(grpid, "sea_sounding_dataset", compound_typeid,  */
135/*   spaceid, H5P_DEFAULT)) < 0) ERR; */
136/*       if (H5Dwrite(datasetid, compound_typeid, H5S_ALL, H5S_ALL, H5P_DEFAULT,  */
137/*     data) < 0) ERR; */
138
139/*       if (H5Dclose(datasetid) < 0) ERR; */
140/*       if (H5Tclose(compound_typeid) < 0) ERR; */
141/*       if (H5Tclose(vlen_typeid) < 0) ERR; */
142/*       if (H5Sclose(spaceid) < 0) ERR; */
143/*       if (H5Gclose(grpid) < 0) ERR; */
144/*       if (H5Fclose(fileid) < 0) ERR; */
145/*    } */
146
147/*    SUMMARIZE_ERR; */
148
149   FINAL_RESULTS;
150}


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