1/* This is part of the netCDF package.
2   Copyright 2005 University Corporation for Atmospheric Research/Unidata
3   See COPYRIGHT file for conditions of use.
4
5   Test internal netcdf-4 file code.
6   $Id: tst_files.c,v 1.42 2010/05/18 12:30:05 ed Exp $
7*/
8
9#include <config.h>
10#include "netcdf.h"
11#include <nc_tests.h>
12#include "err_macros.h"
13
14#ifdef IGNORE
15extern NC_FILE_INFO_T *nc_file;
16#endif
17int test_redef(int format);
18
19#define FILE_NAME "tst_files.nc"
20#define ATT1_NAME "MoneyOwned"
21#define ATT2_NAME "Number_of_Shoes"
22#define ATT3_NAME "att3"
23#define DIM1_NAME "Character_Growth"
24#define DIM1_LEN 10
25#define DIM2_NAME "TimeInMonths"
26#define DIM2_LEN 15
27#define VAR1_NAME "HuckFinn"
28#define VAR2_NAME "TomSawyer"
29#define VAR3_NAME "Jim"
30
31int
32main(int argc, char **argv)
33{
34   printf("\n*** Testing netcdf-4 file functions.\n");
35   {
36      char str[NC_MAX_NAME+1];
37
38      /* Actually we never make any promises about the length of the
39       * version string, but it is always smaller than NC_MAX_NAME. */
40      if (strlen(nc_inq_libvers()) > NC_MAX_NAMEERR;
41      strcpy(strnc_inq_libvers());
42      printf("*** testing version %s...", str);
43   }
44   SUMMARIZE_ERR;
45   printf("*** testing with bad inputs...");
46   {
47      int ncid;
48
49      /* Make sure bad create mode causes failure. */
50      /*if (nc_create(FILE_NAME, NC_NETCDF4, &ncid)) ERR;*/
51
52      /* Create an empty file. */
53      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
54      if (nc_close(ncid)) ERR;
55
56      if (nc_open(FILE_NAMENC_MPIIO|NC_MPIPOSIX, &ncid) != NC_EINVALERR;
57
58      if (nc_create(FILE_NAMENC_64BIT_OFFSET|NC_NETCDF4, &ncid) != NC_EINVALERR;
59      if (nc_create(FILE_NAMENC_CLASSIC_MODEL|NC_MPIIO|NC_MPIPOSIX, &ncid) != NC_EINVALERR;
60      if (nc_create(FILE_NAMENC_MPIIO|NC_MPIPOSIX, &ncid) != NC_EINVALERR;
61   }
62   SUMMARIZE_ERR;
63   printf("*** testing simple opens and creates...");
64   {
65      int ncidncid2ncid3variddimids[2];
66      int ndimsnvarsnattsunlimdimid;
67      int dimids_var[1], var_type;
68      size_t dim_len;
69      char dim_name[NC_MAX_NAME+1], var_name[NC_MAX_NAME+1];
70      unsigned char uchar_out[DIM1_LEN] = {0, 128, 255};
71
72      /* Open and close empty file. */
73      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
74      if (nc_close(ncid)) ERR;
75
76      /* Recreate it again. */
77      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
78      if (nc_def_dim(ncidDIM1_NAMEDIM1_LEN, &dimids[0])) ERR;
79      if (nc_def_dim(ncidDIM2_NAMEDIM2_LEN, &dimids[1])) ERR;
80      if (nc_def_var(ncidVAR1_NAMENC_INT, 1, dimids, &varid)) ERR;
81      if (nc_enddef(ncid)) ERR;
82      if (nc_def_var(ncidVAR2_NAMENC_UINT, 2, dimids, &varid)) ERR;
83      if (nc_close(ncid)) ERR;
84
85      /* Check the contents. Then define a new variable. Since it's
86       * netcdf-4, nc_enddef isn't required - it's called
87       * automatically. */
88      if (nc_open(FILE_NAMENC_WRITE, &ncid)) ERR;
89      if (nc_inq(ncid, &ndims, &nvars, &natts, &unlimdimid)) ERR;
90      if (ndims != 2 || nvars != 2 || natts != 0 || unlimdimid != -1) ERR;
91      if (nc_redef(ncid)) ERR;
92      if (nc_enddef(ncid)) ERR;
93      if (nc_def_var(ncidVAR3_NAMENC_INT, 2, dimids, &varid)) ERR;
94      if (nc_close(ncid)) ERR;
95
96      /* Open three copies of the same file. */
97      if (nc_open(FILE_NAMENC_WRITE, &ncid)) ERR;
98      if (nc_open(FILE_NAMENC_WRITE, &ncid2)) ERR;
99      if (nc_open(FILE_NAMENC_WRITE, &ncid3)) ERR;
100      if (nc_inq(ncid, &ndims, &nvars, &natts, &unlimdimid)) ERR;
101      if (ndims != 2 || nvars != 3 || natts != 0 || unlimdimid != -1) ERR;
102      if (nc_inq(ncid2, &ndims, &nvars, &natts, &unlimdimid)) ERR;
103      if (ndims != 2 || nvars != 3 || natts != 0 || unlimdimid != -1) ERR;
104      if (nc_inq(ncid3, &ndims, &nvars, &natts, &unlimdimid)) ERR;
105      if (ndims != 2 || nvars != 3 || natts != 0 || unlimdimid != -1) ERR;
106      if (nc_close(ncid)) ERR;
107      if (nc_close(ncid2)) ERR;
108      if (nc_close(ncid3)) ERR;
109
110      /* Open and close empty file. */
111      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
112      if (nc_close(ncid)) ERR;
113
114      /* Check the contents. */
115      if (nc_open(FILE_NAMENC_WRITE, &ncid)) ERR;
116      if (nc_inq(ncid, &ndims, &nvars, &natts, &unlimdimid)) ERR;
117      if (ndims != 0 || nvars != 0 || natts != 0 || unlimdimid != -1) ERR;
118      if (nc_close(ncid)) ERR;
119
120      /* Create a file with one dimension and nothing else. */
121      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
122      if (nc_def_dim(ncidDIM1_NAMEDIM1_LEN, &dimids[0])) ERR;
123      if (nc_enddef(ncid)) ERR;
124      if (nc_close(ncid)) ERR;
125
126      /* Check the contents. */
127      if (nc_open(FILE_NAMENC_WRITE, &ncid)) ERR;
128      if (nc_inq(ncid, &ndims, &nvars, &natts, &unlimdimid)) ERR;
129      if (ndims != 1 || nvars != 0 || natts != 0 || unlimdimid != -1) ERR;
130      if (nc_inq_dim(ncid, 0, dim_name, &dim_len)) ERR;
131      if (dim_len != DIM1_LEN || strcmp(dim_nameDIM1_NAME)) ERR;
132      if (nc_close(ncid)) ERR;
133
134      /* Create a simple file, and write some data to it. */
135      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
136      if (nc_def_dim(ncidDIM1_NAMEDIM1_LEN, &dimids[0])) ERR;
137      if (nc_def_var(ncidVAR1_NAMENC_BYTE, 1, dimids, &varid)) ERR;
138      if (nc_enddef(ncid)) ERR;
139      if (nc_put_var_uchar(ncidvariduchar_out) != NC_ERANGEERR;
140      if (nc_close(ncid)) ERR;
141
142      /* Check the contents. */
143      if (nc_open(FILE_NAMENC_WRITE, &ncid)) ERR;
144      if (nc_inq(ncid, &ndims, &nvars, &natts, &unlimdimid)) ERR;
145      if (ndims != 1 || nvars != 1 || natts != 0 || unlimdimid != -1) ERR;
146      if (nc_inq_dim(ncid, 0, dim_name, &dim_len)) ERR;
147      if (dim_len != DIM1_LEN || strcmp(dim_nameDIM1_NAME)) ERR;
148      if (nc_inq_var(ncid, 0, var_name, &var_type, &ndimsdimids_var, &natts)) ERR;
149      if (ndims != 1 || strcmp(var_nameVAR1_NAME) || var_type != NC_BYTE ||
150   dimids_var[0] != dimids[0] || natts != 0) ERR;
151      if (nc_close(ncid)) ERR;
152
153      /* Recreate the file. */
154      if (nc_create(FILE_NAMENC_NETCDF4|NC_CLASSIC_MODEL, &ncid)) ERR;
155      if (nc_def_dim(ncidDIM1_NAMEDIM1_LEN, &dimids[0])) ERR;
156      if (nc_def_var(ncidVAR1_NAMENC_BYTE, 1, dimids, &varid)) ERR;
157      if (nc_enddef(ncid)) ERR;
158      if (nc_put_var_uchar(ncidvariduchar_out)) ERR;
159      if (nc_close(ncid)) ERR;
160
161      /* Recreate it, then make sure NOCLOBBER works. */
162      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
163      if (nc_close(ncid)) ERR;
164      if (nc_create(FILE_NAMENC_NETCDF4|NC_NOCLOBBER, &ncid) != NC_EEXISTERR;
165
166      /* Recreate it again. */
167      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
168      if (nc_def_dim(ncidDIM1_NAMEDIM1_LEN, &dimids[0])) ERR;
169      if (nc_def_dim(ncidDIM2_NAMEDIM2_LEN, &dimids[1])) ERR;
170      if (nc_def_var(ncidVAR1_NAMENC_INT, 1, dimids, &varid)) ERR;
171      if (nc_enddef(ncid)) ERR;
172      if (nc_def_var(ncidVAR2_NAMENC_UINT, 2, dimids, &varid)) ERR;
173      if (nc_close(ncid)) ERR;
174
175      /* Check the contents. Then define a new variable. Since it's
176       * netcdf-4, nc_enddef isn't required - it's called
177       * automatically. */
178      if (nc_open(FILE_NAMENC_WRITE, &ncid)) ERR;
179      if (nc_inq(ncid, &ndims, &nvars, &natts, &unlimdimid)) ERR;
180      if (ndims != 2 || nvars != 2 || natts != 0 || unlimdimid != -1) ERR;
181      if (nc_redef(ncid)) ERR;
182      if (nc_enddef(ncid)) ERR;
183      if (nc_def_var(ncidVAR3_NAMENC_INT, 2, dimids, &varid)) ERR;
184      if (nc_close(ncid)) ERR;
185
186      /* Recreate it again with netcdf-3 rules turned on. */
187      if (nc_create(FILE_NAMENC_NETCDF4|NC_CLASSIC_MODEL, &ncid)) ERR;
188      if (nc_def_dim(ncidDIM1_NAMEDIM1_LEN, &dimids[0])) ERR;
189      if (nc_def_var(ncidVAR1_NAMENC_INT, 1, dimids, &varid)) ERR;
190      if (nc_enddef(ncid)) ERR;
191      if (nc_close(ncid)) ERR;
192
193      /* Check the contents. Check that netcdf-3 rules are in effect. */
194      if (nc_open(FILE_NAME, 0, &ncid)) ERR;
195      if (nc_inq(ncid, &ndims, &nvars, &natts, &unlimdimid)) ERR;
196      if (ndims != 1 || nvars != 1 || natts != 0 || unlimdimid != -1) ERR;
197      if (nc_def_var(ncidVAR2_NAMENC_UINT, 2, dimids, &varid) != NC_ENOTINDEFINEERR;
198      if (nc_close(ncid)) ERR;
199
200      /* Check some other stuff about it. Closing and reopening the
201       * file forces HDF5 to tell us if we forgot to free some HDF5
202       * resource associated with the file. */
203      if (nc_open(FILE_NAME, 0, &ncid)) ERR;
204      if (nc_inq(ncid, &ndims, &nvars, &natts, &unlimdimid)) ERR;
205      if (nc_inq_dim(ncid, 0, dim_name, &dim_len)) ERR;
206      if (dim_len != DIM1_LEN || strcmp(dim_nameDIM1_NAME)) ERR;
207      if (nc_inq_var(ncid, 0, var_name, &var_type, &ndimsdimids_var, &natts)) ERR;
208      if (ndims != 1 || strcmp(var_nameVAR1_NAME) || var_type != NC_INT ||
209   dimids_var[0] != dimids[0] || natts != 0) ERR;
210      if (nc_close(ncid)) ERR;
211   }
212   SUMMARIZE_ERR;
213   printf("*** testing more complex opens and creates...");
214   {
215      int ncidvariddimids[2];
216      int ndimsnvarsnattsunlimdimid;
217      int dimids_var[2], var_type;
218      size_t dim_len;
219      char dim_name[NC_MAX_NAME+1], var_name[NC_MAX_NAME+1];
220      float float_infloat_out = 99.99;
221      int int_inint_out = -9999;
222
223      /* Create a file, this time with attributes. */
224      if (nc_create(FILE_NAMENC_NETCDF4|NC_CLOBBER, &ncid)) ERR;
225      if (nc_def_dim(ncidDIM1_NAMEDIM1_LEN, &dimids[0])) ERR;
226      if (nc_def_dim(ncidDIM2_NAMEDIM2_LEN, &dimids[1])) ERR;
227      if (nc_def_var(ncidVAR1_NAMENC_INT, 2, dimids, &varid)) ERR;
228      if (nc_def_var(ncidVAR2_NAMENC_UINT, 2, dimids, &varid)) ERR;
229      if (nc_put_att_float(ncidNC_GLOBALATT1_NAMENC_FLOAT, 1, &float_out)) ERR;
230      if (nc_put_att_int(ncidNC_GLOBALATT2_NAMENC_INT, 1, &int_out)) ERR;
231      if (nc_close(ncid)) ERR;
232
233      /* Reopen the file and check it. */
234      if (nc_open(FILE_NAME, 0, &ncid)) ERR;
235      if (nc_inq(ncid, &ndims, &nvars, &natts, &unlimdimid)) ERR;
236      if (ndims != 2 || nvars != 2 || natts != 2 || unlimdimid != -1) ERR;
237      if (nc_close(ncid)) ERR;
238
239      /* Reopen it and check each dim, var, and att. */
240      if (nc_open(FILE_NAME, 0, &ncid)) ERR;
241      if (nc_inq_dim(ncid, 0, dim_name, &dim_len)) ERR;
242      if (dim_len != DIM1_LEN || strcmp(dim_nameDIM1_NAME)) ERR;
243      if (nc_inq_dim(ncid, 1, dim_name, &dim_len)) ERR;
244      if (dim_len != DIM2_LEN || strcmp(dim_nameDIM2_NAME)) ERR;
245      if (nc_inq_var(ncid, 0, var_name, &var_type, &ndimsdimids_var, &natts)) ERR;
246      if (ndims != 2 || strcmp(var_nameVAR1_NAME) || var_type != NC_INT ||
247   dimids_var[0] != dimids[0] || natts != 0) ERR;
248      if (nc_inq_var(ncid, 1, var_name, &var_type, &ndimsdimids_var, &natts)) ERR;
249      if (ndims != 2 || strcmp(var_nameVAR2_NAME) || var_type != NC_UINT ||
250   dimids_var[1] != dimids[1] || natts != 0) ERR;
251      if (nc_get_att_float(ncidNC_GLOBALATT1_NAME, &float_in)) ERR;
252      if (float_in != float_outERR;
253      if (nc_get_att_int(ncidNC_GLOBALATT2_NAME, &int_in)) ERR;
254      if (int_in != int_outERR;
255      if (nc_close(ncid)) ERR;
256   }
257   SUMMARIZE_ERR;
258
259   printf("*** testing redef for netCDF classic...");
260   test_redef(NC_FORMAT_CLASSIC);
261   SUMMARIZE_ERR;
262   printf("*** testing redef for netCDF 64-bit offset...");
263   test_redef(NC_FORMAT_64BIT_OFFSET);
264   SUMMARIZE_ERR;
265   printf("*** testing redef for netCDF-4 ...");
266   test_redef(NC_FORMAT_NETCDF4);
267   SUMMARIZE_ERR;
268   printf("*** testing redef for netCDF-4, with strict netCDF-3 rules...");
269   test_redef(NC_FORMAT_NETCDF4_CLASSIC);
270   SUMMARIZE_ERR;
271   printf("*** testing different formats...");
272   {
273      int ncid;
274      int format;
275
276      /* Create a netcdf-3 file. */
277      if (nc_create(FILE_NAMENC_CLOBBER, &ncid)) ERR;
278      if (nc_inq_format(ncid, &format)) ERR;
279      if (format != NC_FORMAT_CLASSICERR;
280      if (nc_close(ncid)) ERR;
281
282      /* Create a netcdf-3 64-bit offset file. */
283      if (nc_create(FILE_NAMENC_64BIT_OFFSET|NC_CLOBBER, &ncid)) ERR;
284      if (nc_inq_format(ncid, &format)) ERR;
285      if (format != NC_FORMAT_64BIT_OFFSETERR;
286      if (nc_close(ncid)) ERR;
287
288      /* Create a netcdf-4 file. */
289      if (nc_create(FILE_NAMENC_NETCDF4|NC_CLOBBER, &ncid)) ERR;
290      if (nc_inq_format(ncid, &format)) ERR;
291      if (format != NC_FORMAT_NETCDF4ERR;
292      if (nc_close(ncid)) ERR;
293   }
294   SUMMARIZE_ERR;
295   printf("*** testing CLASSIC_MODEL flag with classic formats...");
296   {
297      int ncid;
298      int format;
299
300      /* Create a netcdf-3 file. */
301      if (nc_create(FILE_NAMENC_CLOBBER|NC_CLASSIC_MODEL, &ncid)) ERR;
302      if (nc_inq_format(ncid, &format)) ERR;
303      if (format != NC_FORMAT_CLASSICERR;
304      if (nc_close(ncid)) ERR;
305
306      /* Create a netcdf-3 64-bit offset file. */
307      if (nc_create(FILE_NAMENC_64BIT_OFFSET|NC_CLOBBER|NC_CLASSIC_MODEL, &ncid)) ERR;
308      if (nc_inq_format(ncid, &format)) ERR;
309      if (format != NC_FORMAT_64BIT_OFFSETERR;
310      if (nc_close(ncid)) ERR;
311   }
312   SUMMARIZE_ERR;
313   printf("*** testing multiple open files...");
314   {
315#define VAR_NAME "Captain_Kirk"
316#define NDIMS 1
317#define NUM_FILES 30
318#define TEXT_LEN 15
319#define D1_NAME "tl"
320      int ncid[NUM_FILES], varid;
321      int dimid;
322      size_t count[NDIMS], index[NDIMS] = {0};
323      const char ttext[TEXT_LEN + 1] = "20051224.150000";
324      char ttext_in[TEXT_LEN + 1];
325      char file_name[NC_MAX_NAME + 1];
326      size_t chunks[NDIMS] = {TEXT_LEN + 1};
327      int f;
328
329      /* Create a bunch of files. */
330      for (f = 0; f < NUM_FILESf++)
331      {
332  sprintf(file_name, "tst_files2_%d.nc", f);
333  if (nc_create(file_nameNC_NETCDF4, &ncid[f])) ERR;
334  if (nc_def_dim(ncid[f], D1_NAMETEXT_LEN + 1, &dimid)) ERR;
335  if (nc_def_var(ncid[f], VAR_NAMENC_CHARNDIMS, &dimid, &varid)) ERR;
336  if (f % 2 == 0)
337     if (nc_def_var_chunking(ncid[f], varid, 0, chunks)) ERR;
338
339  /* Write one time to the coordinate variable. */
340  count[0] = TEXT_LEN + 1;
341  if (nc_put_vara_text(ncid[f], varidindexcountttext)) ERR;
342      }
343
344      /* Read something from each file. */
345      for (f = 0; f < NUM_FILESf++)
346      {
347  if (nc_get_vara_text(ncid[f], varidindexcount, (char *)ttext_in)) ERR;
348  if (strcmp(ttext_inttext)) ERR;
349      }
350
351      /* Close all open files. */
352      for (f = 0; f < NUM_FILESf++)
353  if (nc_close(ncid[f])) ERR;
354   }
355   SUMMARIZE_ERR;
356   FINAL_RESULTS;
357}
358#define REDEF_ATT1_NAME "CANTERBURY"
359#define REDEF_ATT2_NAME "ELY"
360#define REDEF_ATT3_NAME "KING_HENRY_V"
361#define REDEF_DIM1_NAME "performance_length"
362#define REDEF_DIM1_LEN 101
363/* Change illegal name from '?' to '/'; the latter will
364   more likely be illegal even when the switch is made to
365   escaped characters in identifiers.
366*/
367#define REDEF_NAME_ILLEGAL "/"
368#define REDEF_DIM2_NAME "ZZ_number_of_performers_or_perhaps_actors_or_maybe_I_should_say_players_or_one_could_call_them_artists_but_one_doesnt_like_to_get"
369
370#define REDEF_DIM2_LEN 999
371#define REDEF_VAR1_NAME "Royal_Shakespeare_Company_season_of_2004"
372#define REDEF_VAR2_NAME "Ms_Beths_Kindergardern_class_of_2003"
373#define REDEF_VAR3_NAME "Costumed_Mice_in_my_Garage_in_the_Winter_of_my_Discontent"
374#define REDEF_NDIMS 2
375
376#define NEW_CACHE_SIZE 32000000
377#define NEW_CACHE_NELEMS 2000
378#define NEW_CACHE_PREEMPTION .75
379
380int
381test_redef(int format)
382{
383   int ncidvariddimids[REDEF_NDIMS], dimids_in[REDEF_NDIMS];
384   int ndimsnvarsnattsunlimdimid;
385   int dimids_var[REDEF_NDIMS], var_type;
386   int cflags = 0;
387   size_t dim_len;
388   char dim_name[NC_MAX_NAME+1], var_name[NC_MAX_NAME+1];
389   float float_in;
390   double double_out = 99E99;
391   int int_in;
392   unsigned char uchar_inuchar_out = 255;
393   short short_out = -999;
394   nc_type xtype_in;
395   size_t cache_size_incache_nelems_in;
396   float cache_preemption_in;
397   int ret;
398
399   if (format == NC_FORMAT_64BIT_OFFSET)
400      cflags |= NC_64BIT_OFFSET;
401   else if (format == NC_FORMAT_CDF5)
402      cflags |= NC_CDF5;
403   else if (format == NC_FORMAT_NETCDF4_CLASSIC)
404      cflags |= (NC_NETCDF4|NC_CLASSIC_MODEL);
405   else if (format == NC_FORMAT_NETCDF4)
406      cflags |= NC_NETCDF4;
407
408   /* Change chunk cache. */
409   if (nc_set_chunk_cache(NEW_CACHE_SIZENEW_CACHE_NELEMS,
410   NEW_CACHE_PREEMPTION)) ERR;
411
412   /* Create a file with two dims, two vars, and two atts. */
413   if (nc_create(FILE_NAMEcflags|NC_CLOBBER, &ncid)) ERR;
414
415   /* Retrieve the chunk cache settings, just for fun. */
416   if (nc_get_chunk_cache(&cache_size_in, &cache_nelems_in,
417   &cache_preemption_in)) ERR;
418   if (cache_size_in != NEW_CACHE_SIZE || cache_nelems_in != NEW_CACHE_NELEMS ||
419       cache_preemption_in != NEW_CACHE_PREEMPTIONERR;
420
421   /* This will fail, except for netcdf-4/hdf5, which permits any
422    * name. */
423   if (format != NC_FORMAT_NETCDF4)
424      if (nc_def_dim(ncidREDEF_NAME_ILLEGALREDEF_DIM2_LEN,
425     &dimids[1]) != NC_EBADNAMEERR;
426
427   if (nc_def_dim(ncidREDEF_DIM1_NAMEREDEF_DIM1_LEN, &dimids[0])) ERR;
428   if (nc_def_dim(ncidREDEF_DIM2_NAMEREDEF_DIM2_LEN, &dimids[1])) ERR;
429   if (nc_def_var(ncidREDEF_VAR1_NAMENC_INTREDEF_NDIMSdimids, &varid)) ERR;
430   if (nc_def_var(ncidREDEF_VAR2_NAMENC_BYTEREDEF_NDIMSdimids, &varid)) ERR;
431   if (nc_put_att_double(ncidNC_GLOBALREDEF_ATT1_NAMENC_DOUBLE, 1, &double_out)) ERR;
432   if (nc_put_att_short(ncidNC_GLOBALREDEF_ATT2_NAMENC_SHORT, 1, &short_out)) ERR;
433
434   /* Check it out. */
435   if (nc_inq(ncid, &ndims, &nvars, &natts, &unlimdimid)) ERR;
436   if (ndims != REDEF_NDIMS || nvars != 2 || natts != 2 || unlimdimid != -1) ERR;
437   if (nc_inq_var(ncid, 0, var_name, &xtype_in, &ndimsdimids_in, &natts)) ERR;
438   if (strcmp(var_nameREDEF_VAR1_NAME) || xtype_in != NC_INT || ndims != REDEF_NDIMS ||
439       dimids_in[0] != dimids[0] || dimids_in[1] != dimids[1]) ERR;
440   if (nc_inq_var(ncid, 1, var_name, &xtype_in, &ndimsdimids_in, &natts)) ERR;
441   if (strcmp(var_nameREDEF_VAR2_NAME) || xtype_in != NC_BYTE || ndims != REDEF_NDIMS ||
442       dimids_in[0] != dimids[0] || dimids_in[1] != dimids[1]) ERR;
443
444   /* Close it up. */
445   if (format != NC_FORMAT_NETCDF4)
446      if (nc_enddef(ncid)) ERR;
447   if (nc_close(ncid)) ERR;
448
449   /* Reopen as read only - make sure it doesn't let us change file. */
450   if (nc_open(FILE_NAME, 0, &ncid)) ERR;
451   if (nc_inq(ncid, &ndims, &nvars, &natts, &unlimdimid)) ERR;
452   if (ndims != REDEF_NDIMS || nvars != 2 || natts != 2 || unlimdimid != -1) ERR;
453   if (nc_inq_var(ncid, 0, var_name, &xtype_in, &ndimsdimids_in, &natts)) ERR;
454   if (strcmp(var_nameREDEF_VAR1_NAME) || xtype_in != NC_INT || ndims != REDEF_NDIMS ||
455       dimids_in[0] != dimids[0] || dimids_in[1] != dimids[1]) ERR;
456   if (nc_inq_var(ncid, 1, var_name, &xtype_in, &ndimsdimids_in, &natts)) ERR;
457   if (strcmp(var_nameREDEF_VAR2_NAME) || xtype_in != NC_BYTE || ndims != REDEF_NDIMS ||
458       dimids_in[0] != dimids[0] || dimids_in[1] != dimids[1]) ERR;
459
460   /* This will fail. */
461   ret = nc_def_var(ncidREDEF_VAR3_NAMENC_UBYTEREDEF_NDIMS,
462   dimids, &varid);
463   if(format == NC_FORMAT_NETCDF4) {
464 if(ret != NC_EPERM) {
465     ERR;
466 }
467   } else {
468 if(ret != NC_ENOTINDEFINE) {
469     ERR;
470 }
471   }
472   /* This will fail. */
473   if (!nc_put_att_uchar(ncidNC_GLOBALREDEF_ATT3_NAMENC_CHAR, 1, &uchar_out)) ERR;
474   if (nc_close(ncid)) ERR;
475
476   /* Make sure we can't redef a file opened for NOWRITE. */
477   if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
478   if (nc_redef(ncid) != NC_EPERMERR;
479
480   /* Check it out again. */
481   if (nc_inq(ncid, &ndims, &nvars, &natts, &unlimdimid)) ERR;
482   if (ndims != REDEF_NDIMS || nvars != 2 || natts != 2 || unlimdimid != -1) ERR;
483   if (nc_inq_var(ncid, 0, var_name, &xtype_in, &ndimsdimids_in, &natts)) ERR;
484   if (strcmp(var_nameREDEF_VAR1_NAME) || xtype_in != NC_INT || ndims != REDEF_NDIMS ||
485       dimids_in[0] != dimids[0] || dimids_in[1] != dimids[1]) ERR;
486   if (nc_inq_var(ncid, 1, var_name, &xtype_in, &ndimsdimids_in, &natts)) ERR;
487   if (strcmp(var_nameREDEF_VAR2_NAME) || xtype_in != NC_BYTE || ndims != REDEF_NDIMS ||
488       dimids_in[0] != dimids[0] || dimids_in[1] != dimids[1]) ERR;
489
490   if (nc_close(ncid)) ERR;
491
492   /* Reopen the file and check it, add a variable and attribute. */
493   if (nc_open(FILE_NAMENC_WRITE, &ncid)) ERR;
494
495   /* Check it out. */
496   if (nc_inq(ncid, &ndims, &nvars, &natts, &unlimdimid)) ERR;
497   if (ndims != REDEF_NDIMS || nvars != 2 || natts != 2 || unlimdimid != -1) ERR;
498
499   /* Add var. */
500   if ((format != NC_FORMAT_NETCDF4) && nc_redef(ncid)) ERR;
501   if (nc_def_var(ncidREDEF_VAR3_NAMENC_BYTEREDEF_NDIMSdimids, &varid)) ERR;
502
503   /* Add att. */
504   ret = nc_put_att_uchar(ncidNC_GLOBALREDEF_ATT3_NAMENC_BYTE, 1, &uchar_out);
505   if (format != NC_FORMAT_NETCDF4 && retERR;
506   else if (format == NC_FORMAT_NETCDF4 && ret != NC_ERANGEERR;
507
508   /* Check it out. */
509   if (nc_inq(ncid, &ndims, &nvars, &natts, &unlimdimid)) ERR;
510   if (ndims != REDEF_NDIMS || nvars != 3 || natts != 3 || unlimdimid != -1) ERR;
511   if (nc_inq_var(ncid, 0, var_name, &xtype_in, &ndimsdimids_in, &natts)) ERR;
512   if (strcmp(var_nameREDEF_VAR1_NAME) || xtype_in != NC_INT || ndims != REDEF_NDIMS ||
513       dimids_in[0] != dimids[0] || dimids_in[1] != dimids[1]) ERR;
514   if (nc_inq_var(ncid, 1, var_name, &xtype_in, &ndimsdimids_in, &natts)) ERR;
515   if (strcmp(var_nameREDEF_VAR2_NAME) || xtype_in != NC_BYTE || ndims != REDEF_NDIMS ||
516       dimids_in[0] != dimids[0] || dimids_in[1] != dimids[1]) ERR;
517   if (nc_inq_var(ncid, 2, var_name, &var_type, &ndimsdimids_var, &natts)) ERR;
518   if (ndims != REDEF_NDIMS || strcmp(var_nameREDEF_VAR3_NAME) || var_type != NC_BYTE ||
519       natts != 0) ERR;
520
521   if (nc_close(ncid)) ERR;
522
523   /* Reopen it and check each dim, var, and att. */
524   if (nc_open(FILE_NAME, 0, &ncid)) ERR;
525   if (nc_inq_dim(ncid, 0, dim_name, &dim_len)) ERR;
526   if (dim_len != REDEF_DIM1_LEN || strcmp(dim_nameREDEF_DIM1_NAME)) ERR;
527   if (nc_inq_dim(ncid, 1, dim_name, &dim_len)) ERR;
528   if (dim_len != REDEF_DIM2_LEN || strcmp(dim_nameREDEF_DIM2_NAME)) ERR;
529   if (nc_inq_var(ncid, 0, var_name, &var_type, &ndimsdimids_var, &natts)) ERR;
530   if (ndims != REDEF_NDIMS || strcmp(var_nameREDEF_VAR1_NAME) || var_type != NC_INT ||
531       natts != 0) ERR;
532   if (nc_inq_var(ncid, 1, var_name, &var_type, &ndimsdimids_var, &natts)) ERR;
533   if (ndims != REDEF_NDIMS || strcmp(var_nameREDEF_VAR2_NAME) || var_type != NC_BYTE ||
534       natts != 0) ERR;
535   if (nc_inq_var(ncid, 2, var_name, &var_type, &ndimsdimids_var, &natts)) ERR;
536   if (ndims != REDEF_NDIMS || strcmp(var_nameREDEF_VAR3_NAME) || var_type != NC_BYTE ||
537       natts != 0) ERR;
538   if (nc_get_att_float(ncidNC_GLOBALREDEF_ATT1_NAME, &float_in) != NC_ERANGEERR;
539   if (nc_get_att_int(ncidNC_GLOBALREDEF_ATT2_NAME, &int_in)) ERR;
540   if (int_in != short_outERR;
541   ret = nc_get_att_uchar(ncidNC_GLOBALREDEF_ATT3_NAME, &uchar_in);
542   if (format == NC_FORMAT_NETCDF4)
543   {
544      if (ret != NC_ERANGEERR;
545   }
546   else if (retERR;
547
548   if (uchar_in != uchar_outERR;
549   if (nc_close(ncid)) ERR;
550   return NC_NOERR;
551}


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