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-2011, 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;
}
|