1/* This is part of the netCDF package.  Copyright 2013 University
2   Corporation for Atmospheric Research/Unidata See COPYRIGHT file for
3   conditions of use.
4
5   This program sets up HDF5 files that contain scalar attributes and
6   variables, of both string and numeric datatypes.  ncdump should handle
7   all of these.
8*/
9
10#include <nc_tests.h>
11#include "err_macros.h"
12#include <hdf5.h>
13
14#define FILE_NAME "tst_h_scalar.nc"
15#define VSTR_ATT1_NAME  "vstratt1"
16#define VSTR_ATT2_NAME  "vstratt2"
17#define VSTR_ATT3_NAME  "vstratt3"
18#define VSTR_ATT4_NAME  "vstratt4"
19#define VSTR_VAR1_NAME  "vstrvar1"
20#define VSTR_VAR2_NAME  "vstrvar2"
21#define VSTR_VAR3_NAME  "vstrvar3"
22#define VSTR_VAR4_NAME  "vstrvar4"
23#define FSTR_ATT_NAME   "fstratt"
24#define FSTR_VAR_NAME   "fstrvar"
25#define INT_ATT_NAME    "intatt"
26#define INT_VAR_NAME    "intvar"
27
28int
29add_attrs(hid_t objid)
30{
31    hid_t scalar_spaceid = -1;
32    hid_t vlstr_typeid = -1, fixstr_typeid = -1;
33    char *vlstr;
34    hid_t attid = -1;
35
36    /* Create scalar dataspace */
37    if ((scalar_spaceid = H5Screate(H5S_SCALAR)) < 0) ERR_GOTO;
38
39    /* Create string datatypes */
40    if ((vlstr_typeid = H5Tcreate(H5T_STRING, (size_t)H5T_VARIABLE)) < 0) ERR_GOTO;
41    if ((fixstr_typeid = H5Tcreate(H5T_STRING, (size_t)10)) < 0) ERR_GOTO;
42
43
44    /* Create attribute with VL string datatype on object */
45    if ((attid = H5Acreate2(objidVSTR_ATT1_NAMEvlstr_typeidscalar_spaceidH5P_DEFAULTH5P_DEFAULT)) < 0) ERR_GOTO;
46    /* No write, use fill value */
47    if (H5Aclose(attid) < 0) ERR_GOTO;
48
49    /* Create attribute with VL string datatype on object */
50    if ((attid = H5Acreate2(objidVSTR_ATT2_NAMEvlstr_typeidscalar_spaceidH5P_DEFAULTH5P_DEFAULT)) < 0) ERR_GOTO;
51    vlstr = NULL;
52    if (H5Awrite(attidvlstr_typeid, &vlstr) < 0) ERR_GOTO;
53    if (H5Aclose(attid) < 0) ERR_GOTO;
54
55    /* Create attribute with VL string datatype on object */
56    if ((attid = H5Acreate2(objidVSTR_ATT3_NAMEvlstr_typeidscalar_spaceidH5P_DEFAULTH5P_DEFAULT)) < 0) ERR_GOTO;
57    vlstr = malloc(10);
58    *vlstr = '\0';
59    if (H5Awrite(attidvlstr_typeid, &vlstr) < 0) ERR_GOTO;
60    if (H5Aclose(attid) < 0) ERR_GOTO;
61
62    /* Create attribute with VL string datatype on object */
63    if ((attid = H5Acreate2(objidVSTR_ATT4_NAMEvlstr_typeidscalar_spaceidH5P_DEFAULTH5P_DEFAULT)) < 0) ERR_GOTO;
64    strcpy(vlstr, "foo");
65    if (H5Awrite(attidvlstr_typeid, &vlstr) < 0) ERR_GOTO;
66    free(vlstr);
67    if (H5Aclose(attid) < 0) ERR_GOTO;
68
69    /* Create attribute with fixed-length string datatype on object */
70    if ((attid = H5Acreate2(objidFSTR_ATT_NAMEfixstr_typeidscalar_spaceidH5P_DEFAULTH5P_DEFAULT)) < 0) ERR_GOTO;
71    if (H5Aclose(attid) < 0) ERR_GOTO;
72
73    /* Create attribute with native integer datatype on object */
74    if ((attid = H5Acreate2(objidINT_ATT_NAMEH5T_NATIVE_INTscalar_spaceidH5P_DEFAULTH5P_DEFAULT)) < 0) ERR_GOTO;
75    if (H5Aclose(attid) < 0) ERR_GOTO;
76
77
78    /* Clean up objects created */
79    if (H5Sclose(scalar_spaceid) < 0) ERR_GOTO;
80    if (H5Tclose(vlstr_typeid) < 0) ERR_GOTO;
81    if (H5Tclose(fixstr_typeid) < 0) ERR_GOTO;
82
83    return(0);
84
85error:
86    H5E_BEGIN_TRY {
87        H5Aclose(attid);
88        H5Sclose(scalar_spaceid);
89        H5Tclose(vlstr_typeid);
90        H5Tclose(fixstr_typeid);
91    } H5E_END_TRY;
92    return(-1);
93}
94
95int
96main()
97{
98    printf("\n*** Create file with datasets & attributes that have scalar dataspaces...");
99    {
100 hid_t fileid;
101        hid_t fcplid;
102 hid_t dsetid;
103        hid_t dcplid;
104 hid_t scalar_spaceid;
105        hid_t vlstr_typeidfixstr_typeid;
106 hid_t attid;
107
108        /* Create scalar dataspace */
109 if ((scalar_spaceid = H5Screate(H5S_SCALAR)) < 0) ERR;
110
111        /* Set creation ordering for file, so we can revise its contents later */
112        if ((fcplid = H5Pcreate(H5P_FILE_CREATE)) < 0) ERR;
113        if (H5Pset_link_creation_order(fcplidH5P_CRT_ORDER_TRACKED) < 0) ERR;
114        if (H5Pset_attr_creation_order(fcplidH5P_CRT_ORDER_TRACKED) < 0) ERR;
115
116 /* Create new file, using default properties */
117 if ((fileid = H5Fcreate(FILE_NAMEH5F_ACC_TRUNCfcplidH5P_DEFAULT)) < 0) ERR;
118
119        /* Close file creation property list */
120        if (H5Pclose(fcplid) < 0) ERR;
121
122
123        /* Create variable-length string datatype */
124        if ((vlstr_typeid = H5Tcreate(H5T_STRING, (size_t)H5T_VARIABLE)) < 0) ERR;
125
126        /* Create fixed-length string datatype */
127        if ((fixstr_typeid = H5Tcreate(H5T_STRING, (size_t)10)) < 0) ERR;
128
129
130        /* Set creation ordering for dataset, so we can revise its contents later */
131        if ((dcplid = H5Pcreate(H5P_DATASET_CREATE)) < 0) ERR;
132        if (H5Pset_attr_creation_order(dcplidH5P_CRT_ORDER_TRACKED) < 0) ERR;
133
134
135        /* Create scalar dataset with VL string datatype */
136        if ((dsetid = H5Dcreate2(fileidVSTR_VAR1_NAMEvlstr_typeidscalar_spaceidH5P_DEFAULTdcplidH5P_DEFAULT)) < 0) ERR;
137
138        /* Add attributes to dataset */
139        if (add_attrs(dsetid) < 0) ERR;
140
141        /* Close VL string dataset */
142        if (H5Dclose(dsetid) < 0) ERR;
143
144
145        /* Create scalar dataset with fixed-length string datatype */
146        if ((dsetid = H5Dcreate2(fileidFSTR_VAR_NAMEfixstr_typeidscalar_spaceidH5P_DEFAULTdcplidH5P_DEFAULT)) < 0) ERR;
147
148        /* Add attributes to dataset */
149        if (add_attrs(dsetid) < 0) ERR;
150
151        /* Close fixed-length string dataset */
152        if (H5Dclose(dsetid) < 0) ERR;
153
154
155        /* Create scalar dataset with native integer datatype */
156        if ((dsetid = H5Dcreate2(fileidINT_VAR_NAMEH5T_NATIVE_INTscalar_spaceidH5P_DEFAULTdcplidH5P_DEFAULT)) < 0) ERR;
157
158        /* Add attributes to dataset */
159        if (add_attrs(dsetid) < 0) ERR;
160
161        /* Close native integer dataset */
162        if (H5Dclose(dsetid) < 0) ERR;
163
164
165        /* Add attributes to root group */
166        if (add_attrs(fileid) < 0) ERR;
167
168
169        /* Close dataset creation property list */
170        if (H5Pclose(dcplid) < 0) ERR;
171
172        /* Close string datatypes */
173        if (H5Tclose(vlstr_typeid) < 0) ERR;
174        if (H5Tclose(fixstr_typeid) < 0) ERR;
175
176
177        /* Close rest */
178 if (H5Sclose(scalar_spaceid) < 0) ERR;
179 if (H5Fclose(fileid) < 0) ERR;
180    }
181    SUMMARIZE_ERR;
182
183    printf("*** Revise file through netCDF-4 API...");
184    {
185 int ncidvarid;
186        int ret;
187        char *vlstr;
188
189 if (nc_open(FILE_NAMENC_WRITE, &ncid)) ERR;
190
191
192        /* Define new VL string variable */
193        if (nc_def_var(ncidVSTR_VAR2_NAME , NC_STRING, 0, NULL, &varid)) ERR;
194
195        /* Write to the variable */
196        vlstr = NULL;
197        if (nc_put_var(ncidvarid, &vlstr)) ERR;
198
199
200        /* Define new VL string variable */
201        if (nc_def_var(ncidVSTR_VAR3_NAME , NC_STRING, 0, NULL, &varid)) ERR;
202
203        /* Write to the variable */
204        vlstr = malloc(10);
205        *vlstr = '\0';
206        if (nc_put_var(ncidvarid, &vlstr)) ERR;
207
208
209        /* Define new VL string variable */
210        if (nc_def_var(ncidVSTR_VAR4_NAME , NC_STRING, 0, NULL, &varid)) ERR;
211
212        /* Write to the variable */
213        strcpy(vlstr, "foo");
214        if (nc_put_var(ncidvarid, &vlstr)) ERR;
215        free(vlstr);
216
217
218 if (nc_close(ncid)) ERR;
219    }
220    SUMMARIZE_ERR;
221
222    FINAL_RESULTS;
223}


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