1/*! Testing for proper read of little-endian variables in an hdf4 file.
2 *
3 * Added to debug issue NCF-332. Based on code submitted by
4 * https://github.com/Unidata/netcdf-c/issues/113.
5 */
6
7#include <stdio.h>
8#include <config.h>
9#include <unistd.h>
10#include <nc_tests.h>
11#include "err_macros.h"
12#include <hdf5.h>
13#include <H5DSpublic.h>
14#include "mfhdf.h"
15
16#define DIM1 5
17#define DIM0 5
18#define RANK 2
19#define FILENAME "tst_h4_lendian.h4"
20#define SDSNAME "data"
21
22int read_hdf_file(int dtype) {
23
24  int ncid = 0;
25  int le_int16_varid = 0;
26  int retval = 0;
27  int ed = 0;
28
29  printf("\to Reading hdf4 file with a little-endian datatype %d\n",dtype);
30
31  printf("\t\to Opening file....\t\t\t\t\t");
32  retval = nc_open(FILENAMENC_NETCDF4 | NC_NOWRITE, &ncid);
33  if(retval) {printf("Failure [%d]\n",retval); return retval;}
34  else {printf("Success\n");}
35
36  printf("\t\to Getting varid....\t\t\t\t\t");
37  retval = nc_inq_varid(ncid,SDSNAME,&le_int16_varid);
38  if(retval) {printf("Failure [%d]\n",retval); return retval;}
39  else {printf("Success\n");}
40
41  printf("\t\to Querying endianness of the variable....\t\t");
42  retval = nc_inq_var_endian(ncid,le_int16_varid,&ed);
43  if(retval) {printf("Failure [%d]\n",retval); return retval;}
44  else {printf("Success\n");}
45
46  printf("\t\to Checking that endianness is NC_ENDIAN_LITTLE....\t");
47  if (ed == NC_ENDIAN_LITTLE) printf("Success\n");
48  else {printf("Failure [%d]\n\n",ed); nc_close(ncid); return -1;}
49
50  printf("\t\to Closing file....\t\t\t\t\t");
51  retval = nc_close(ncid);
52  if(retval) {printf("Failure [%d]\n\n",retval); return retval;}
53  else {printf("Success\n\n");}
54
55  return 0;
56}
57
58int create_hdf_file(int dtype) {
59
60    int32 sd_idsds_idistatsd_index;
61    int32 dims[2], start[2], edges[2], rank;
62    int16 array_data[DIM0][DIM1];
63    intn ijcount;
64
65    start[0] = 0;
66    start[1] = 0;
67    edges[0] = DIM1;
68    edges[1] = DIM0;
69
70    /* populate data array */
71    count = 0;
72    for (j = 0; j < DIM0j++)
73      {
74        for (i = 0; i < DIM1i++)
75          array_data[j][i] = count++;
76      }
77
78    printf("\to Creating hdf4 file with little-endian datatype %d....\t",dtype);
79
80    sd_id = SDstart(FILENAMEDFACC_CREATE);
81    /* sds_id = SDcreate(sd_id, SDSNAME, DFNT_LITEND|dtype, RANK, edges); */
82    sds_id = SDcreate(sd_idSDSNAMEdtypeRANKedges);
83
84    istat = SDendaccess(sds_id);
85    if(istat) {printf("Failure %d\n", istat); SDend(sd_id); return istat;}
86
87    istat = SDend(sd_id);
88    if(istat) {printf("Failure %d\n", istat); SDend(sd_id); return istat;}
89
90    sd_id = SDstart(FILENAMEDFACC_WRITE);
91
92    sd_index = 0;
93    sds_id = SDselect(sd_idsd_index);
94
95    istat = SDwritedata(sds_idstartNULLedges, (VOIDP)array_data);
96    if(istat) {printf("Failure %d\n", istat); SDend(sd_id); return istat;}
97
98    istat = SDendaccess(sds_id);
99    if(istat) {printf("Failure %d\n", istat); SDend(sd_id); return istat;}
100
101    istat = SDend(sd_id);
102    if(istat) {printf("Failure %d\n", istat); return istat;}
103
104    printf("Success\n");
105    return 0;
106}
107
108
109int test_read_write(int dtype) {
110
111  int res = 0;
112
113  res = create_hdf_file(dtype);
114  if(res) {unlink(FILENAME); return res;}
115
116  res = read_hdf_file(dtype);
117
118  unlink(FILENAME);
119  return res;
120}
121
122/*! Standard main function.
123 *
124 */
125int main() {
126
127  int res = 0;
128
129  printf("Test reading from an hdf4 file with a little-endian datatype.\n");
130
131  /* True Positives. */
132  res = test_read_write(DFNT_LINT8);
133  res = test_read_write(DFNT_LUINT8);
134  res = test_read_write(DFNT_LINT16);
135  res = test_read_write(DFNT_LUINT16);
136  res = test_read_write(DFNT_LINT32);
137  res = test_read_write(DFNT_LUINT32);
138  res = test_read_write(DFNT_LFLOAT32);
139  res = test_read_write(DFNT_LFLOAT64);
140
141  /* True Negatives. */
142  printf("\t**** Testing for True Negatives. THESE SHOULD FAIL.****\n\n");
143  res = test_read_write(DFNT_INT8);
144  if(!res) {printf("Should have failed. Error!\n"); return -1;}
145
146  res = test_read_write(DFNT_UINT8);
147  if(!res) {printf("Should have failed. Error!\n"); return -1;}
148
149  res = test_read_write(DFNT_INT16);
150  if(!res) {printf("Should have failed. Error!\n"); return -1;}
151
152  res = test_read_write(DFNT_UINT16);
153  if(!res) {printf("Should have failed. Error!\n"); return -1;}
154
155  res = test_read_write(DFNT_INT32);
156  if(!res) {printf("Should have failed. Error!\n"); return -1;}
157
158  res = test_read_write(DFNT_UINT32);
159  if(!res) {printf("Should have failed. Error!\n"); return -1;}
160
161  res = test_read_write(DFNT_FLOAT32);
162  if(!res) {printf("Should have failed. Error!\n"); return -1;}
163
164  res = test_read_write(DFNT_FLOAT64);
165  if(!res) {printf("Should have failed. Error!\n"); return -1;}
166
167  printf("Finished.\n");
168  return 0;
169}


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