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


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