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 tests fixes for bugs reported with accessing
6   fixed-length scalar string variables and variable-length scalar
7   string attributes from HDF5 files through the netCDF-4 API.
8
9   Here's a HDF5 sample programs:
10   http://hdf.ncsa.uiuc.edu/training/other-ex5/sample-programs/strings.c
11*/
12
13#include <config.h>
14#include <nc_tests.h>
15#include <err_macros.h>
16#include <hdf5.h>
17
18#define FILE_NAME "tst_h_strbug.h5"
19#define VS_ATT_NAME "vsatt"
20#define FS_ATT_NAME "fsatt"
21#define VS_VAR_NAME "vsvar"
22#define FS_VAR_NAME "fsvar"
23#define V1D_VAR_NAME "v1dvar"
24#define FSTR_LEN 20
25#define DIM1      4
26#define RANK      1
27
28int
29main()
30{
31    char *vs    = "variable-length string";
32    char fsdata[]   = "fixed-length string";
33    char *v1ddata[DIM1] = {"strings","of","variable","length"};
34    int i;
35    char ch;
36
37    printf("\n*** Creating file for checking fix to bugs in accessing strings from HDF5 non-netcdf-4 file.\n");
38    {
39 hid_t fileidscalar_spaceidvstypeidfstypeidvsattidfsattidvsdsetidfsdsetid;
40 hid_t class;
41 size_t type_size = FSTR_LEN;
42 hid_t v1dattidv1ddsetid;
43 hid_t v1dspaceid;
44 hsize_t dims[1] = {DIM1};
45
46 if ((scalar_spaceid = H5Screate(H5S_SCALAR)) < 0) ERR;
47 if ((v1dspaceid = H5Screate_simple(RANKdimsNULL)) < 0) ERR;
48
49 /* Create variable-length and fixed-length string types. */
50 if ((vstypeid =  H5Tcopy(H5T_C_S1)) < 0) ERR;
51 if (H5Tset_size(vstypeidH5T_VARIABLE) < 0) ERR;
52
53 if ((fstypeid =  H5Tcopy(H5T_C_S1)) < 0) ERR;
54 if (H5Tset_size(fstypeidtype_size) < 0) ERR;
55
56 /* Create new file, using default properties. */
57 if ((fileid = H5Fcreate(FILE_NAMEH5F_ACC_TRUNCH5P_DEFAULTH5P_DEFAULT)) < 0) ERR;
58
59 /* Create scalar datasets of variable- and fixed-length strings. */
60 if ((vsdsetid = H5Dcreate (fileidVS_VAR_NAMEvstypeidscalar_spaceid,
61    H5P_DEFAULT)) < 0) ERR;
62 if (H5Dwrite (vsdsetidvstypeidH5S_ALLH5S_ALLH5P_DEFAULT, &vs)) ERR;
63 if ((fsdsetid = H5Dcreate (fileidFS_VAR_NAMEfstypeidscalar_spaceid,
64    H5P_DEFAULT)) < 0) ERR;
65 if (H5Dwrite (fsdsetidfstypeidH5S_ALLH5S_ALLH5P_DEFAULT, &fsdata)) ERR;
66
67 /* Create 1D dataset of variable-length strings. */
68 if ((v1ddsetid = H5Dcreate (fileidV1D_VAR_NAMEvstypeidv1dspaceid,
69    H5P_DEFAULT)) < 0) ERR;
70 if (H5Dwrite (v1ddsetidvstypeidH5S_ALLH5S_ALLH5P_DEFAULT, &v1ddata)) ERR;
71
72 /* Write scalar global attributes of these types. */
73 if ((vsattid = H5Acreate(fileidVS_ATT_NAMEvstypeidscalar_spaceid,
74  H5P_DEFAULT)) < 0) ERR;
75 if (H5Awrite(vsattidvstypeid, &vs) < 0) ERR;
76 if ((fsattid = H5Acreate(fileidFS_ATT_NAMEfstypeidscalar_spaceid,
77  H5P_DEFAULT)) < 0) ERR;
78 if (H5Awrite(fsattidfstypeid, &fsdata) < 0) ERR;
79
80 /* Close up. */
81 if (H5Aclose(vsattid) < 0) ERR;
82 if (H5Aclose(fsattid) < 0) ERR;
83 if (H5Sclose(scalar_spaceid) < 0) ERR;
84 if (H5Sclose(v1dspaceid) < 0) ERR;
85 if (H5Tclose(vstypeid) < 0) ERR;
86 if (H5Tclose(fstypeid) < 0) ERR;
87 if (H5Dclose(vsdsetid) < 0) ERR;
88 if (H5Dclose(fsdsetid) < 0) ERR;
89 if (H5Dclose(v1ddsetid) < 0) ERR;
90 if (H5Fclose(fileid) < 0) ERR;
91    }
92
93    printf("*** Checking reading variable-length HDF5 string var through netCDF-4 API...");
94    {
95 int ncidvaridndims;
96 nc_type type;
97 char *data_in;
98 if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
99 if (nc_inq_varid(ncidVS_VAR_NAME, &varid)) ERR;
100 if (nc_inq_vartype(ncidvarid, &type)) ERR;
101 if (type != NC_STRINGERR;
102 if (nc_inq_varndims(ncidvarid, &ndims )) ERR;
103 if (ndims != 0) ERR;
104 if (nc_get_var_string(ncidvarid, &data_in)) ERR;
105 if (strcmp(vsdata_in)) ERR;
106 if (nc_free_string(1, &data_in)) ERR;
107 if (nc_close(ncid)) ERR;
108    }
109    SUMMARIZE_ERR;
110
111    printf("*** Checking reading fixed-length HDF5 string var through netCDF-4 API...");
112    {
113     int ncidvaridndims;
114     nc_type type;
115     char *data_in;
116     if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
117     if (nc_inq_varid(ncidFS_VAR_NAME, &varid)) ERR;
118     if (nc_inq_vartype(ncidvarid, &type)) ERR;
119     if (type != NC_STRINGERR;
120     if (nc_inq_varndims(ncidvarid, &ndims )) ERR;
121     if (ndims != 0) ERR;
122     if (nc_get_var_string(ncidvarid, &data_in)) ERR;
123     if (strcmp(fsdatadata_in)) ERR;
124 if (nc_free_string(1, &data_in)) ERR;
125     if (nc_close(ncid)) ERR;
126    }
127    SUMMARIZE_ERR;
128
129    printf("*** Checking reading variable-length HDF5 string att through netCDF-4 API...");
130    {
131 int ncidvaridndims;
132 nc_type type;
133 size_t len;
134 char *data_in;
135 if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
136 if (nc_inq_att(ncidNC_GLOBALVS_ATT_NAME, &type, &len)) ERR;
137 if (type != NC_STRINGERR;
138 if (len != 1) ERR;
139        if (nc_get_att_string(ncidNC_GLOBALVS_ATT_NAME, &data_in)) ERR;
140 if (strcmp(vsdata_in)) ERR;
141 if (nc_free_string(1, &data_in)) ERR;
142 if (nc_close(ncid)) ERR;
143    }
144    SUMMARIZE_ERR;
145
146    printf("*** Checking reading fixed-length HDF5 string att through netCDF-4 API...");
147    {
148 int ncidvaridndims;
149 nc_type type;
150 size_t len;
151 char *data_in;
152 if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
153 if (nc_inq_att(ncidNC_GLOBALFS_ATT_NAME, &type, &len)) ERR;
154 if (type != NC_CHARERR;
155 if (len != FSTR_LENERR;
156 if (!(data_in = malloc(len))) ERR;
157        /* if (nc_get_att_string(ncid, NC_GLOBAL, FS_ATT_NAME, &data_in)) ERR; */
158        if (nc_get_att_text(ncidNC_GLOBALFS_ATT_NAMEdata_in)) ERR;
159 if (strcmp(fsdatadata_in)) ERR;
160 free(data_in);
161 if (nc_close(ncid)) ERR;
162    }
163    SUMMARIZE_ERR;
164
165    printf("*** Checking reading variable-length HDF5 strings var through netCDF-4 API...");
166    {
167     int ncidvaridndims;
168     nc_type type;
169 int *dimids;
170 size_t nstrings;
171     char **data_in;
172     if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
173     if (nc_inq_varid(ncidV1D_VAR_NAME, &varid)) ERR;
174     if (nc_inq_vartype(ncidvarid, &type)) ERR;
175     if (type != NC_STRINGERR;
176     if (nc_inq_varndims(ncidvarid, &ndims )) ERR;
177     if (ndims != RANKERR;
178 if (!(dimids = malloc(ndims * sizeof(int)))) ERR;
179     if (nc_inq_vardimid(ncidvariddimids)) ERR;
180 if (nc_inq_dimlen(nciddimids[0], &nstrings)) ERR;
181 if (!(data_in = (char **)malloc(nstrings * sizeof(char *)))) ERR;
182     if (nc_get_var_string(ncidvariddata_in)) ERR;
183 for (i = 0; i < nstringsi++) {
184     if(strcmp(v1ddata[i], data_in[i])) ERR;
185 }
186     if (nc_free_string(nstringsdata_in)) ERR;
187 free(data_in);
188 free(dimids);
189     if (nc_close(ncid)) ERR;
190    }
191    SUMMARIZE_ERR;
192    FINAL_RESULTS;
193}


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