forked from Unidata/netcdf-c
/
tst_interops4.c
164 lines (144 loc) · 4.21 KB
/
tst_interops4.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
/*! This is part of the netCDF package. Copyright 2005-2018, University
Corporation for Atmospheric Research/Unidata. See COPYRIGHT file
for conditions of use.
Test NetCDF-4 files with lots of attributes on big vs. little
endian platforms.
*/
#include <config.h>
#include <nc_tests.h>
#include "err_macros.h"
#define FILE_NAME "tst_interops4.nc"
#define REF_FILE_NAME "ref_tst_interops4.nc"
#define DIM_NAME "dim_0"
#define NUM_DIMS 1
#define NUM_ATTS 20
#define NUM_VARS 20
#define ATT_LEN 30
#define VAR_LEN 4
int att_data[ATT_LEN];
int var_data[VAR_LEN];
int
write_atts(int ncid, int varid)
{
int a;
char att_name[NC_MAX_NAME + 1];
for (a = 0; a < NUM_ATTS; a++)
{
sprintf(att_name, "att_%d", a);
if (nc_put_att_int(ncid, varid, att_name, NC_INT,
ATT_LEN, att_data)) ERR_RET;
}
return NC_NOERR;
}
int
read_atts(int ncid, int varid)
{
int a, i;
char att_name[NC_MAX_NAME + 1];
int att_data_in[ATT_LEN];
for (a = 0; a < NUM_ATTS; a++)
{
sprintf(att_name, "att_%d", a);
if (nc_get_att_int(ncid, varid, att_name,
att_data_in)) ERR_RET;
for (i = 0; i < ATT_LEN; i++)
if (att_data_in[i] != att_data[i]) ERR_RET;
}
return NC_NOERR;
}
int
write_vars(int ncid)
{
int v;
char var_name[NC_MAX_NAME + 1];
/* NOT GOOD to assume the dimid, but I want to test passing a NULL
* into last argument of nc_def_dim. */
int dimid[NUM_DIMS] = {0};
if (nc_def_dim(ncid, DIM_NAME, VAR_LEN, NULL)) ERR;
for (v = 0; v < NUM_VARS; v++)
{
sprintf(var_name, "var_%d", v);
if (nc_def_var(ncid, var_name, NC_INT, NUM_DIMS,
dimid, NULL)) ERR_RET;
write_atts(ncid, v);
if (nc_put_var_int(ncid, v, var_data)) ERR;
}
return NC_NOERR;
}
int
read_vars(int ncid)
{
int v, i;
char var_name[NC_MAX_NAME + 1], var_name_in[NC_MAX_NAME + 1];
int var_data_in[VAR_LEN];
nc_type xtype_in;
int natts_in, ndims_in;
for (v = 0; v < NUM_VARS; v++)
{
if (nc_inq_var(ncid, v, var_name_in, &xtype_in, &ndims_in,
NULL, &natts_in)) ERR_RET;
sprintf(var_name, "var_%d", v);
if (strcmp(var_name, var_name_in) || xtype_in != NC_INT ||
ndims_in != NUM_DIMS || natts_in != NUM_ATTS) ERR_RET;
read_atts(ncid, v);
if (nc_get_var_int(ncid, v, var_data_in)) ERR;
for (i = 0; i < VAR_LEN; i++)
if (var_data_in[i] != var_data[i]) ERR_RET;
}
return NC_NOERR;
}
int
main(int argc, char **argv)
{
printf("\n*** Testing interoperability between big vs. little endian platforms.\n");
printf("*** testing with file with lots of atts...");
{
int ncid;
int nvars_in, ndims_in, natts_in, unlimdim_in;
int i;
/* Initialize data. */
for (i = 0; i < ATT_LEN; i++)
att_data[i] = i;
for (i = 0; i < VAR_LEN; i++)
var_data[i] = i;
/* Create a file that will activate the bug in HDF5 1.8.4. */
if (nc_create(FILE_NAME, NC_CLOBBER|NC_NETCDF4, &ncid)) ERR;
if (write_atts(ncid, NC_GLOBAL)) ERR;
if (write_vars(ncid)) ERR;
if (nc_close(ncid)) ERR;
/* Open the file and check it. */
if (nc_open(FILE_NAME, 0, &ncid)) ERR;
if (nc_inq(ncid, &ndims_in, &nvars_in, &natts_in, &unlimdim_in)) ERR;
if (ndims_in != NUM_DIMS || nvars_in != NUM_VARS ||
natts_in != NUM_ATTS || unlimdim_in != -1) ERR;
if (read_atts(ncid, NC_GLOBAL)) ERR;
if (read_vars(ncid)) ERR;
if (nc_close(ncid)) ERR;
}
SUMMARIZE_ERR;
{
char file_in[NC_MAX_NAME + 1];
int ncid;
int nvars_in, ndims_in, natts_in, unlimdim_in;
/* Open the reference version of this file, generated on a
* big-endian platform. */
if (getenv("srcdir"))
{
strcpy(file_in, getenv("srcdir"));
strcat(file_in, "/");
strcat(file_in, REF_FILE_NAME);
}
else
strcpy(file_in, REF_FILE_NAME);
printf("*** testing with file %s...", file_in);
if (nc_open(file_in, 0, &ncid)) ERR;
if (nc_inq(ncid, &ndims_in, &nvars_in, &natts_in, &unlimdim_in)) ERR;
if (ndims_in != NUM_DIMS || nvars_in != NUM_VARS ||
natts_in != NUM_ATTS || unlimdim_in != -1) ERR;
if (read_atts(ncid, NC_GLOBAL)) ERR;
if (read_vars(ncid)) ERR;
if (nc_close(ncid)) ERR;
}
SUMMARIZE_ERR;
FINAL_RESULTS;
}