1/* This is part of the netCDF package. Copyright 2005-2007 University
2   Corporation for Atmospheric Research/Unidata. See COPYRIGHT file
3   for conditions of use.
4
5   Test attributes.
6
7   $Id: tst_atts3.c 2796 2014-10-28 03:40:29Z wkliao $
8*/
9
10#include "config.h"
11#include <nc_tests.h>
12#include "err_macros.h"
13#include <signal.h>
14#include "netcdf.h"
15#ifdef USE_PARALLEL
16#include "netcdf_par.h"
17#endif
18
19#define FILE_NAME "tst_atts_3.nc"
20#define FILE_NAME2 "tst_atts_2.nc"
21#define VAR1_NAME "Horace_Rumpole"
22#define VAR2_NAME "Claude_Erskine-Brown"
23#define VAR3_NAME "Phillida_Erskine-Brown_Q.C."
24#define DIM1_NAME "Old_Bailey_case_number"
25#define DIM1_LEN 10
26#define DIM2_NAME "occupancy_in_chambers"
27#define DIM2_LEN 15
28#define ATT_INT_NAME "Old_Bailey_Room_Numbers"
29#define ATT_DOUBLE_NAME "Equity_Court_Canteen_Charges"
30#define ATT_SHORT_NAME "Ecclesiastical_Court_Appearences"
31#define ATT_TEXT_NAME "Speech_to_Jury"
32#define ATT_TEXT_NAME2 "Speech_to_She_Who_Must_be_Obeyed"
33#define ATT_UCHAR_NAME "Number_of_current_briefs"
34#define ATT_SCHAR_NAME "Slate_totals_at_Pomeroys_Wine_Bar"
35#define ATT_USHORT_NAME "brief_no"
36#define ATT_UINT_NAME "Orders_from_SWMBO"
37#define ATT_INT64_NAME "judges_golf_score"
38#define ATT_UINT64_NAME "Number_of_drinks_in_career_to_date"
39
40/*
41#define ATT_USHORT_NAME "Chamber_Gas_Electric_and_Telephone_Bill_Share"
42*/
43#define ATT_FLOAT_NAME "Average_Nanoseconds_for_Lose_Win_or_Appeal"
44#define ATT_LEN 3
45
46char speech[] = "Once more unto the breach, dear friends, once more;\n\
47Or close the wall up with our English dead.\n\
48In peace there's nothing so becomes a man\n\
49As modest stillness and humility:\n\
50But when the blast of war blows in our ears,\n\
51Then imitate the action of the tiger;\n\
52Stiffen the sinews, summon up the blood,\n\
53Disguise fair nature with hard-favour'd rage;\n\
54Then lend the eye a terrible aspect;\n\
55Let pry through the portage of the head\n\
56Like the brass cannon; let the brow o'erwhelm it\n\
57As fearfully as doth a galled rock\n\
58O'erhang and jutty his confounded base,\n\
59Swill'd with the wild and wasteful ocean.\n\
60Now set the teeth and stretch the nostril wide,\n\
61Hold hard the breath and bend up every spirit\n\
62To his full height. On, on, you noblest English.\n\
63Whose blood is fet from fathers of war-proof!\n\
64Fathers that, like so many Alexanders,\n\
65Have in these parts from morn till even fought\n\
66And sheathed their swords for lack of argument:\n\
67Dishonour not your mothers; now attest\n\
68That those whom you call'd fathers did beget you.\n\
69Be copy now to men of grosser blood,\n\
70And teach them how to war. And you, good yeoman,\n\
71Whose limbs were made in England, show us here\n\
72The mettle of your pasture; let us swear\n\
73That you are worth your breeding; which I doubt not;\n\
74For there is none of you so mean and base,\n\
75That hath not noble lustre in your eyes.\n\
76I see you stand like greyhounds in the slips,\n\
77Straining upon the start. The game's afoot:\n\
78Follow your spirit, and upon this charge\n\
79Cry 'God for Harry, England, and Saint George!'";
80
81/* Test the ordering of atts for a cmode. */
82#define NUM_ATTS 8
83#define ATT_MAX_NAME 25
84int
85tst_att_ordering(int cmode)
86{
87   int ncid;
88   char name[NUM_ATTS][ATT_MAX_NAME + 1] = {"Gc", "Gb", "Gs", "Gi", "Gf",
89     "Gd", "Gatt-name-dashes", "Gatt.name.dots"};
90   int len[NUM_ATTS] = {0, 2, 3, 3, 3, 3, 1, 1};
91   signed char b[2] = {-128, 127};
92   short s[3] = {-32768, 0, 32767};
93   int i[3] = {42, 0, -42};
94   float f[3] = {42.0, -42.0, 42.0};
95   double d[3] = {420.0, -420.0, 420.0};
96   int att_name_dashes = -1, att_name_dots = -2;
97   char name_in[NC_MAX_NAME];
98   int j;
99
100   /* Create a file with some global atts. */
101#ifdef TEST_PNETCDF
102   if (nc_create_par(FILE_NAMEcmode|NC_PNETCDFMPI_COMM_WORLDMPI_INFO_NULL,&ncid)) ERR;
103#else
104   if (nc_create(FILE_NAMEcmode, &ncid)) ERR;
105#endif
106   if (nc_put_att_text(ncidNC_GLOBALname[0], len[0], NULL)) ERR;
107   if (nc_put_att_schar(ncidNC_GLOBALname[1], NC_BYTElen[1], b)) ERR;
108   if (nc_put_att_short(ncidNC_GLOBALname[2], NC_SHORTlen[2], s)) ERR;
109   if (nc_put_att_int(ncidNC_GLOBALname[3], NC_INTlen[3], i)) ERR;
110   if (nc_put_att_float(ncidNC_GLOBALname[4], NC_FLOATlen[4], f)) ERR;
111   if (nc_put_att_double(ncidNC_GLOBALname[5], NC_DOUBLElen[5], d)) ERR;
112   if (nc_put_att_int(ncidNC_GLOBALname[6], NC_INTlen[6], &att_name_dashes)) ERR;
113   if (nc_put_att_int(ncidNC_GLOBALname[7], NC_INTlen[7], &att_name_dots)) ERR;
114   if (nc_close(ncid)) ERR;
115
116   /* Reopen the file and check the order. */
117#ifdef TEST_PNETCDF
118   if (nc_open_par(FILE_NAMENC_PNETCDFMPI_COMM_WORLDMPI_INFO_NULL, &ncid)) ERR;
119#else
120   if (nc_open(FILE_NAME, 0, &ncid)) ERR;
121#endif
122   for (j = 0; j < NUM_ATTSj++)
123   {
124      if (nc_inq_attname(ncidNC_GLOBALjname_in)) ERR;
125      if (strcmp(name_inname[j])) ERR;
126   }
127
128   /* Close up shop. */
129   if (nc_close(ncid)) ERR;
130   return err;
131}
132
133int
134main(int argc, char **argv)
135{
136    signed char schar_in[ATT_LEN], schar_out[ATT_LEN] = {NC_MIN_BYTE, 1, NC_MAX_BYTE};
137    unsigned char uchar_in[ATT_LEN];
138    short short_in[ATT_LEN], short_out[ATT_LEN] = {NC_MIN_SHORT, -128, NC_MAX_SHORT};
139    int int_in[ATT_LEN], int_out[ATT_LEN] = {-100000, 128, 100000};
140    float float_in[ATT_LEN], float_out[ATT_LEN] = {-0.5, 0.25, 0.125};
141    double double_in[ATT_LEN], double_out[ATT_LEN] = {-0.25, .5, 0.125};
142    long long longlong_in[ATT_LEN] = {-1LL, -1LL, -1LL};
143#ifdef USE_NETCDF4
144    long long_in[ATT_LEN];
145    unsigned short ushort_in[ATT_LEN], ushort_out[ATT_LEN] = {0, 128, NC_MAX_USHORT};
146    unsigned int uint_in[ATT_LEN], uint_out[ATT_LEN] = {0, 128, NC_MAX_UINT};
147    long long longlong_out[ATT_LEN] = {-3123456789LL, 128LL, 3123456789LL};
148    unsigned long long ulonglong_in[ATT_LEN] = {NC_MAX_UINT64NC_MAX_UINT64NC_MAX_UINT64};
149    unsigned long long ulonglong_out[ATT_LEN] = {0LL, 128LL, 3123456789LL};
150#endif
151
152#ifdef TEST_PNETCDF
153   MPI_Init(&argc, &argv);
154#endif
155    (void) signal(SIGFPESIG_IGN);
156
157   printf("\n*** Testing netcdf-3 attribute functions.\n");
158   printf("*** testing really simple global atts...");
159#define NUM_SIMPLE_ATTS 9
160   {
161      int ncid;
162      char name[NUM_SIMPLE_ATTS][ATT_MAX_NAME + 1] = {"Gc", "Gb", "Gs", "Gi", "Gf",
163       "Gd", "G7", "G8", "G9"};
164      char name_in[NC_MAX_NAME];
165      int j;
166
167      /* Create a file with some global atts. */
168#ifdef TEST_PNETCDF
169      if (nc_create_par(FILE_NAMENC_CLOBBER|NC_PNETCDFMPI_COMM_WORLDMPI_INFO_NULL,&ncid)) ERR;
170#else
171      if (nc_create(FILE_NAMENC_CLOBBER, &ncid)) ERR;
172#endif
173      for (j = 0; j < NUM_SIMPLE_ATTSj++)
174  if (nc_put_att_int(ncidNC_GLOBALname[j], NC_INT, 0, NULL)) ERR;
175      if (nc_close(ncid)) ERR;
176
177      /* Reopen the file and check the order. */
178#ifdef TEST_PNETCDF
179      if (nc_open_par(FILE_NAMENC_PNETCDFMPI_COMM_WORLDMPI_INFO_NULL, &ncid)) ERR;
180#else
181      if (nc_open(FILE_NAME, 0, &ncid)) ERR;
182#endif
183      for (j = 0; j < NUM_SIMPLE_ATTSj++)
184      {
185  if (nc_inq_attname(ncidNC_GLOBALjname_in)) ERR;
186  if (strcmp(name_inname[j])) ERR;
187      }
188
189      /* Close up shop. */
190      if (nc_close(ncid)) ERR;
191   }
192   SUMMARIZE_ERR;
193   printf("*** testing simple global atts...");
194   {
195      int ncid;
196      nc_type att_type;
197      size_t att_len;
198      int i;
199
200      char *speech_in;
201
202      /* This won't work, because classic files can't create these types. */
203#ifdef TEST_PNETCDF
204      if (nc_create_par(FILE_NAMENC_CLOBBER|NC_PNETCDFMPI_COMM_WORLDMPI_INFO_NULL,&ncid)) ERR;
205#else
206      if (nc_create(FILE_NAMENC_CLOBBER, &ncid)) ERR;
207#endif
208      if (nc_put_att_int(ncidNC_GLOBALATT_INT_NAMENC_INTATT_LEN,
209     int_out)) ERR;
210      /* It is also OK to read classic types converted into
211       * supported C types. though the conversion may encounter
212       * out-of-range values */
213      if (nc_get_att_uchar(ncidNC_GLOBALATT_INT_NAMEuchar_in) != NC_ERANGEERR;
214      for (i = 0; i < ATT_LENi++)
215 if (uchar_in[i] != (unsigned char) int_out[i]) ERR;
216
217      /* This was bug NCF-171: on 32-bit platforms, bad values returned */
218      if (nc_get_att_longlong(ncidNC_GLOBALATT_INT_NAMElonglong_in)) ERR;
219      for (i = 0; i < ATT_LENi++)
220       if (longlong_in[i] != (long long) int_out[i]) ERR;
221      if (nc_close(ncid)) ERR;
222
223      /* Create a file with a global attribute of each type. */
224#ifdef TEST_PNETCDF
225      if (nc_create_par(FILE_NAMENC_CLOBBER|NC_PNETCDFMPI_COMM_WORLDMPI_INFO_NULL,&ncid)) ERR;
226#else
227      if (nc_create(FILE_NAMENC_CLOBBER, &ncid)) ERR;
228#endif
229      if (nc_put_att_text(ncidNC_GLOBALATT_TEXT_NAME, strlen(speech)+1, speech)) ERR;
230      if (nc_put_att_schar(ncidNC_GLOBALATT_SCHAR_NAMENC_BYTEATT_LENschar_out)) ERR;
231      if (nc_put_att_short(ncidNC_GLOBALATT_SHORT_NAMENC_SHORTATT_LENshort_out)) ERR;
232      if (nc_put_att_int(ncidNC_GLOBALATT_INT_NAMENC_INTATT_LENint_out)) ERR;
233      if (nc_put_att_float(ncidNC_GLOBALATT_FLOAT_NAMENC_FLOATATT_LENfloat_out)) ERR;
234      if (nc_put_att_double(ncidNC_GLOBALATT_DOUBLE_NAMENC_DOUBLEATT_LENdouble_out)) ERR;
235      if (nc_close(ncid)) ERR;
236
237      /* Open the file and check attributes. */
238#ifdef TEST_PNETCDF
239      if (nc_open_par(FILE_NAMENC_PNETCDFMPI_COMM_WORLDMPI_INFO_NULL, &ncid)) ERR;
240#else
241      if (nc_open(FILE_NAME, 0, &ncid)) ERR;
242#endif
243      /* Check text. */
244      if (nc_inq_att(ncidNC_GLOBALATT_TEXT_NAME, &att_type, &att_len))
245  ERR;
246      if (att_type != NC_CHAR || att_len != strlen(speech) + 1) ERR;
247      if (!(speech_in = malloc(att_len + 1))) ERR;
248      if (nc_get_att_text(ncidNC_GLOBALATT_TEXT_NAMEspeech_in)) ERR;
249      if (strcmp(speechspeech_in)) ERR;
250      free(speech_in);
251      /* Check numeric values. */
252      if (nc_get_att_schar(ncidNC_GLOBALATT_SCHAR_NAMEschar_in)) ERR;
253      for (i = 0; i < ATT_LENi++)
254  if (schar_in[i] != schar_out[i]) ERR;
255      if (nc_get_att_short(ncidNC_GLOBALATT_SHORT_NAMEshort_in)) ERR;
256      for (i = 0; i < ATT_LENi++)
257  if (short_in[i] != short_out[i]) ERR;
258      if (nc_get_att_int(ncidNC_GLOBALATT_INT_NAMEint_in)) ERR;
259      for (i = 0; i < ATT_LENi++)
260  if (int_in[i] != int_out[i]) ERR;
261      if (nc_get_att_float(ncidNC_GLOBALATT_FLOAT_NAMEfloat_in)) ERR;
262      for (i = 0; i < ATT_LENi++)
263  if (float_in[i] != float_out[i]) ERR;
264      if (nc_get_att_double(ncidNC_GLOBALATT_DOUBLE_NAMEdouble_in)) ERR;
265      for (i = 0; i < ATT_LENi++)
266  if (double_in[i] != double_out[i]) ERR;
267      if (nc_close(ncid)) ERR;
268   }
269   SUMMARIZE_ERR;
270   printf("*** testing attribute data type conversions...");
271
272   {
273      int ncid;
274      int i;
275
276      /* Reopen the file and try different type conversions. */
277#ifdef TEST_PNETCDF
278      if (nc_open_par(FILE_NAMENC_PNETCDFMPI_COMM_WORLDMPI_INFO_NULL, &ncid)) ERR;
279#else
280      if (nc_open(FILE_NAME, 0, &ncid)) ERR;
281#endif
282
283      /* No text conversions are allowed, and people who try them should
284       * be locked up, away from decent folk! */
285      if (nc_get_att_short(ncidNC_GLOBALATT_TEXT_NAMEshort_in) != NC_ECHARERR;
286      if (nc_get_att_int(ncidNC_GLOBALATT_TEXT_NAMEint_in) != NC_ECHARERR;
287      if (nc_get_att_float(ncidNC_GLOBALATT_TEXT_NAMEfloat_in) != NC_ECHARERR;
288      if (nc_get_att_double(ncidNC_GLOBALATT_TEXT_NAMEdouble_in) != NC_ECHARERR;
289
290      /* Read all atts (except text) as double. */
291      if (nc_get_att_double(ncidNC_GLOBALATT_SCHAR_NAMEdouble_in)) ERR;
292      for (i = 0; i < ATT_LENi++)
293  if (double_in[i] != schar_out[i]) ERR;
294      if (nc_get_att_double(ncidNC_GLOBALATT_SHORT_NAMEdouble_in)) ERR;
295      for (i = 0; i < ATT_LENi++)
296  if (double_in[i] != short_out[i]) ERR;
297      if (nc_get_att_double(ncidNC_GLOBALATT_INT_NAMEdouble_in)) ERR;
298      for (i = 0; i < ATT_LENi++)
299  if (double_in[i] != int_out[i]) ERR;
300      if (nc_get_att_double(ncidNC_GLOBALATT_FLOAT_NAMEdouble_in)) ERR;
301      for (i = 0; i < ATT_LENi++)
302  if (double_in[i] != float_out[i]) ERR;
303      if (nc_get_att_double(ncidNC_GLOBALATT_DOUBLE_NAMEdouble_in)) ERR;
304      for (i = 0; i < ATT_LENi++)
305  if (double_in[i] != double_out[i]) ERR;
306
307      /* Read all atts (except text) as float. */
308      if (nc_get_att_float(ncidNC_GLOBALATT_SCHAR_NAMEfloat_in)) ERR;
309      for (i = 0; i < ATT_LENi++)
310  if (float_in[i] != schar_out[i]) ERR;
311      if (nc_get_att_float(ncidNC_GLOBALATT_SHORT_NAMEfloat_in)) ERR;
312      for (i = 0; i < ATT_LENi++)
313  if (float_in[i] != short_out[i]) ERR;
314      if (nc_get_att_float(ncidNC_GLOBALATT_INT_NAMEfloat_in)) ERR;
315      for (i = 0; i < ATT_LENi++)
316  if (float_in[i] != int_out[i]) ERR;
317      if (nc_get_att_float(ncidNC_GLOBALATT_FLOAT_NAMEfloat_in)) ERR;
318      for (i = 0; i < ATT_LENi++)
319  if (float_in[i] != float_out[i]) ERR;
320      if (nc_get_att_float(ncidNC_GLOBALATT_DOUBLE_NAMEfloat_in)) ERR;
321      for (i = 0; i < ATT_LENi++)
322   if (float_in[i] != (float) double_out[i]) ERR;
323
324      /* Read all atts (except text) as int. */
325      if (nc_get_att_int(ncidNC_GLOBALATT_SCHAR_NAMEint_in)) ERR;
326      for (i = 0; i < ATT_LENi++)
327  if (int_in[i] != schar_out[i]) ERR;
328      if (nc_get_att_int(ncidNC_GLOBALATT_SHORT_NAMEint_in)) ERR;
329      for (i = 0; i < ATT_LENi++)
330  if (int_in[i] != short_out[i]) ERR;
331      if (nc_get_att_int(ncidNC_GLOBALATT_INT_NAMEint_in)) ERR;
332      for (i = 0; i < ATT_LENi++)
333  if (int_in[i] != int_out[i]) ERR;
334      if (nc_get_att_int(ncidNC_GLOBALATT_FLOAT_NAMEint_in)) ERR;
335      for (i = 0; i < ATT_LENi++)
336   if (int_in[i] != (int) float_out[i]) ERR;
337      if (nc_get_att_int(ncidNC_GLOBALATT_DOUBLE_NAMEint_in)) ERR;
338      for (i = 0; i < ATT_LENi++)
339   if (int_in[i] != (int) double_out[i]) ERR;
340
341      /* Read all atts (except text) as short. */
342      if (nc_get_att_short(ncidNC_GLOBALATT_SCHAR_NAMEshort_in)) ERR;
343      for (i = 0; i < ATT_LENi++)
344  if (short_in[i] != schar_out[i]) ERR;
345      if (nc_get_att_short(ncidNC_GLOBALATT_SHORT_NAMEshort_in)) ERR;
346      for (i = 0; i < ATT_LENi++)
347  if (short_in[i] != short_out[i]) ERR;
348      if (nc_get_att_short(ncidNC_GLOBALATT_INT_NAMEshort_in) != NC_ERANGEERR;
349      for (i = 0; i < ATT_LENi++)
350   if (short_in[i] != (short) int_out[i]) ERR;
351      if (nc_get_att_short(ncidNC_GLOBALATT_FLOAT_NAMEshort_in)) ERR;
352      for (i = 0; i < ATT_LENi++)
353   if (short_in[i] != (short) float_out[i]) ERR;
354      if (nc_get_att_short(ncidNC_GLOBALATT_DOUBLE_NAMEshort_in)) ERR;
355      for (i = 0; i < ATT_LENi++)
356   if (short_in[i] != (short) double_out[i]) ERR;
357
358      /* Read all atts (except text) as schar. */
359      if (nc_get_att_schar(ncidNC_GLOBALATT_SCHAR_NAMEschar_in)) ERR;
360      for (i = 0; i < ATT_LENi++)
361  if (schar_in[i] != schar_out[i]) ERR;
362      if (nc_get_att_schar(ncidNC_GLOBALATT_SHORT_NAMEschar_in) != NC_ERANGEERR;
363      for (i = 0; i < ATT_LENi++)
364  if (schar_in[i] != (signed char) short_out[i]) ERR;
365      if (nc_get_att_schar(ncidNC_GLOBALATT_INT_NAMEschar_in) != NC_ERANGEERR;
366      for (i = 0; i < ATT_LENi++)
367  if (schar_in[i] != (signed char) int_out[i]) ERR;
368      if (nc_get_att_schar(ncidNC_GLOBALATT_FLOAT_NAMEschar_in)) ERR;
369      for (i = 0; i < ATT_LENi++)
370  if (schar_in[i] != (signed char) float_out[i]) ERR;
371      if (nc_get_att_schar(ncidNC_GLOBALATT_DOUBLE_NAMEschar_in)) ERR;
372      for (i = 0; i < ATT_LENi++)
373  if (schar_in[i] != (signed char) double_out[i]) ERR;
374
375      /* Read all atts (except text) as uchar. */
376      /* Shouldn't this get an NC_ERANGE error for storing -128 into an unsigned char?  Possible bug ... */
377      if (nc_get_att_uchar(ncidNC_GLOBALATT_SCHAR_NAMEuchar_in)) ERR;
378      for (i = 0; i < ATT_LENi++)
379  if (uchar_in[i] != (unsigned char) schar_out[i]) ERR;
380      if (nc_get_att_uchar(ncidNC_GLOBALATT_SHORT_NAMEuchar_in) != NC_ERANGEERR;
381      for (i = 0; i < ATT_LENi++)
382  if (uchar_in[i] != (unsigned char) short_out[i]) ERR;
383      if (nc_get_att_uchar(ncidNC_GLOBALATT_INT_NAMEuchar_in) != NC_ERANGEERR;
384      for (i = 0; i < ATT_LENi++)
385  if (uchar_in[i] != (unsigned char) int_out[i]) ERR;
386      if (nc_get_att_uchar(ncidNC_GLOBALATT_FLOAT_NAMEuchar_in) != NC_ERANGEERR;
387      for (i = 0; i < ATT_LENi++)
388  if (uchar_in[i] != (unsigned char) float_out[i]) ERR;
389      if (nc_get_att_uchar(ncidNC_GLOBALATT_DOUBLE_NAMEuchar_in) != NC_ERANGEERR;
390      for (i = 0; i < ATT_LENi++)
391  if (uchar_in[i] != (unsigned char) double_out[i]) ERR;
392
393      /* Read all atts (except text) into long long variable. */
394      if (nc_get_att_longlong(ncidNC_GLOBALATT_SCHAR_NAMElonglong_in)) ERR;
395      for (i = 0; i < ATT_LENi++)
396  if (longlong_in[i] != schar_out[i]) ERR;
397      if (nc_get_att_longlong(ncidNC_GLOBALATT_SHORT_NAMElonglong_in)) ERR;
398      for (i = 0; i < ATT_LENi++)
399  if (longlong_in[i] != short_out[i]) ERR;
400      if (nc_get_att_longlong(ncidNC_GLOBALATT_INT_NAMElonglong_in)) ERR;
401      /* This was bug NCF-171: on 32-bit platforms, bad values returned */
402      if (nc_get_att_longlong(ncidNC_GLOBALATT_INT_NAMElonglong_in)) ERR;
403      for (i = 0; i < ATT_LENi++)
404       if (longlong_in[i] != (long long) int_out[i]) ERR;
405      if (nc_get_att_longlong(ncidNC_GLOBALATT_FLOAT_NAMElonglong_in)) ERR;
406      for (i = 0; i < ATT_LENi++)
407  if (longlong_in[i] != (long long)float_out[i]) ERR;
408      if (nc_get_att_longlong(ncidNC_GLOBALATT_DOUBLE_NAMElonglong_in)) ERR;
409      for (i = 0; i < ATT_LENi++)
410  if (longlong_in[i] != (long long)double_out[i]) ERR;
411
412      if (nc_close(ncid)) ERR;
413   }
414   SUMMARIZE_ERR;
415   printf("*** testing zero-length attributes...");
416   {
417      int ncid;
418
419      /*int int_in[ATT_LEN], int_out[ATT_LEN] = {NC_MIN_INT, 128, NC_MAX_INT};*/
420
421      /* Create a file with a global attribute of each type of zero length. */
422#ifdef TEST_PNETCDF
423      if (nc_create_par(FILE_NAMENC_CLOBBER|NC_PNETCDFMPI_COMM_WORLDMPI_INFO_NULL,&ncid)) ERR;
424#else
425      if (nc_create(FILE_NAMENC_CLOBBER, &ncid)) ERR;
426#endif
427      if (nc_put_att_text(ncidNC_GLOBALATT_TEXT_NAME, 0, NULL)) ERR;
428      if (nc_put_att_schar(ncidNC_GLOBALATT_SCHAR_NAMENC_BYTE, 0, NULL)) ERR;
429      if (nc_put_att_short(ncidNC_GLOBALATT_SHORT_NAMENC_SHORT, 0, NULL)) ERR;
430      if (nc_put_att_int(ncidNC_GLOBALATT_INT_NAMENC_INT, 0, NULL)) ERR;
431      if (nc_put_att_float(ncidNC_GLOBALATT_FLOAT_NAMENC_FLOAT, 0, NULL)) ERR;
432      if (nc_put_att_double(ncidNC_GLOBALATT_DOUBLE_NAMENC_DOUBLE, 0, NULL)) ERR;
433      if (nc_close(ncid)) ERR;
434   }
435
436   /* Make sure we can read all these zero-length atts. */
437   {
438      int ncid;
439      signed char schar_in[ATT_LEN];
440      short short_in[ATT_LEN];
441      /*int int_in[ATT_LEN], int_out[ATT_LEN] = {NC_MIN_INT, 128, NC_MAX_INT};*/
442      int int_in[ATT_LEN];
443      float float_in[ATT_LEN];
444      double double_in[ATT_LEN];
445      size_t len;
446      nc_type xtype;
447
448#ifdef TEST_PNETCDF
449      if (nc_open_par(FILE_NAMENC_PNETCDFMPI_COMM_WORLDMPI_INFO_NULL, &ncid)) ERR;
450#else
451      if (nc_open(FILE_NAME, 0, &ncid)) ERR;
452#endif
453      if (nc_get_att_text(ncidNC_GLOBALATT_TEXT_NAMENULL)) ERR;
454      if (nc_inq_att(ncidNC_GLOBALATT_TEXT_NAME, &xtype, &len)) ERR;
455      if (len || xtype != NC_CHARERR;
456      if (nc_get_att_schar(ncidNC_GLOBALATT_SCHAR_NAMEschar_in)) ERR;
457      if (nc_inq_att(ncidNC_GLOBALATT_SCHAR_NAME, &xtype, &len)) ERR;
458      if (len || xtype != NC_BYTEERR;
459      if (nc_get_att_short(ncidNC_GLOBALATT_SHORT_NAMEshort_in)) ERR;
460      if (nc_inq_att(ncidNC_GLOBALATT_SHORT_NAME, &xtype, &len)) ERR;
461      if (len || xtype != NC_SHORTERR;
462      if (nc_get_att_int(ncidNC_GLOBALATT_INT_NAMEint_in)) ERR;
463      if (nc_inq_att(ncidNC_GLOBALATT_INT_NAME, &xtype, &len)) ERR;
464      if (len || xtype != NC_INTERR;
465      if (nc_get_att_float(ncidNC_GLOBALATT_FLOAT_NAMEfloat_in)) ERR;
466      if (nc_inq_att(ncidNC_GLOBALATT_FLOAT_NAME, &xtype, &len)) ERR;
467      if (len || xtype != NC_FLOATERR;
468      if (nc_get_att_double(ncidNC_GLOBALATT_DOUBLE_NAMEdouble_in)) ERR;
469      if (nc_inq_att(ncidNC_GLOBALATT_DOUBLE_NAME, &xtype, &len)) ERR;
470      if (len || xtype != NC_DOUBLEERR;
471      /* Conversions no longer result in range errors, since there's no data. */
472      if (nc_get_att_schar(ncidNC_GLOBALATT_DOUBLE_NAMEschar_in)) ERR;
473      if (nc_get_att_schar(ncidNC_GLOBALATT_FLOAT_NAMEschar_in)) ERR;
474      if (nc_get_att_schar(ncidNC_GLOBALATT_INT_NAMEschar_in)) ERR;
475      if (nc_get_att_schar(ncidNC_GLOBALATT_SHORT_NAMEschar_in)) ERR;
476      if (nc_close(ncid)) ERR;
477   }
478
479   SUMMARIZE_ERR;
480   printf("*** testing zero-length attributes and redef...(this test skipped for HDF5-1.8.0 beta1");
481   {
482      int ncid;
483      signed char schar_in[ATT_LEN];
484      short short_in[ATT_LEN];
485      int int_in[ATT_LEN];
486      float float_in[ATT_LEN];
487      double double_in[ATT_LEN];
488
489
490      /* Create a file with a global attribute of each type of zero length. */
491#ifdef TEST_PNETCDF
492      if (nc_create_par(FILE_NAMENC_CLOBBER|NC_PNETCDFMPI_COMM_WORLDMPI_INFO_NULL,&ncid)) ERR;
493#else
494      if (nc_create(FILE_NAMENC_CLOBBER, &ncid)) ERR;
495#endif
496      if (nc_enddef(ncid)) ERR;
497      if (nc_redef(ncid)) ERR;
498      if (nc_put_att_text(ncidNC_GLOBALATT_TEXT_NAME, 0, NULL)) ERR;
499      if (nc_put_att_schar(ncidNC_GLOBALATT_SCHAR_NAMENC_BYTE, 0, NULL)) ERR;
500      if (nc_put_att_short(ncidNC_GLOBALATT_SHORT_NAMENC_SHORT, 0, NULL)) ERR;
501      if (nc_put_att_int(ncidNC_GLOBALATT_INT_NAMENC_INT, 0, NULL)) ERR;
502      if (nc_put_att_float(ncidNC_GLOBALATT_FLOAT_NAMENC_FLOAT, 0, NULL)) ERR;
503      if (nc_put_att_double(ncidNC_GLOBALATT_DOUBLE_NAMENC_DOUBLE, 0, NULL)) ERR;
504      if (nc_close(ncid)) ERR;
505
506      /* Make sure we can read all these zero-length atts added during a
507       * redef. */
508#ifdef TEST_PNETCDF
509      if (nc_open_par(FILE_NAMENC_PNETCDFMPI_COMM_WORLDMPI_INFO_NULL, &ncid)) ERR;
510#else
511      if (nc_open(FILE_NAME, 0, &ncid)) ERR;
512#endif
513      if (nc_get_att_text(ncidNC_GLOBALATT_TEXT_NAMENULL)) ERR;
514      if (nc_get_att_schar(ncidNC_GLOBALATT_SCHAR_NAMEschar_in)) ERR;
515      if (nc_get_att_short(ncidNC_GLOBALATT_SHORT_NAMEshort_in)) ERR;
516      if (nc_get_att_int(ncidNC_GLOBALATT_INT_NAMEint_in)) ERR;
517      if (nc_get_att_float(ncidNC_GLOBALATT_FLOAT_NAMEfloat_in)) ERR;
518      if (nc_get_att_double(ncidNC_GLOBALATT_DOUBLE_NAMEdouble_in)) ERR;
519      /* Conversions no longer result in range errors, since there's no data. */
520      if (nc_get_att_schar(ncidNC_GLOBALATT_DOUBLE_NAMEschar_in)) ERR;
521      if (nc_get_att_schar(ncidNC_GLOBALATT_FLOAT_NAMEschar_in)) ERR;
522      if (nc_get_att_schar(ncidNC_GLOBALATT_INT_NAMEschar_in)) ERR;
523      if (nc_get_att_schar(ncidNC_GLOBALATT_SHORT_NAMEschar_in)) ERR;
524      if (nc_close(ncid)) ERR;
525   }
526   SUMMARIZE_ERR;
527
528   printf("*** testing attribute deletes and renames...");
529   {
530      int ncidvariddimids[2];
531      nc_type att_type;
532      size_t att_len;
533      char *speech_in;
534      char name_in[NC_MAX_NAME + 1];
535      int attid_innatts_in;
536      int int_out[ATT_LEN] = {-100000, 128, 100000};
537
538      /* Create a file with a global attribute. */
539#ifdef TEST_PNETCDF
540      if (nc_create_par(FILE_NAMENC_CLOBBER|NC_PNETCDFMPI_COMM_WORLDMPI_INFO_NULL,&ncid)) ERR;
541#else
542      if (nc_create(FILE_NAMENC_CLOBBER, &ncid)) ERR;
543#endif
544      if (nc_put_att_text(ncidNC_GLOBALATT_TEXT_NAME, strlen(speech)+1,
545   speech)) ERR;
546      if (nc_close(ncid)) ERR;
547
548      /* Rename it. */
549#ifdef TEST_PNETCDF
550      if (nc_open_par(FILE_NAMENC_WRITE|NC_PNETCDFMPI_COMM_WORLDMPI_INFO_NULL, &ncid)) ERR;
551#else
552      if (nc_open(FILE_NAMENC_WRITE, &ncid)) ERR;
553#endif
554      if (nc_inq_attid(ncidNC_GLOBALATT_TEXT_NAME, &attid_in)) ERR;
555      if (attid_in != 0) ERR;
556      if (nc_inq_attname(ncidNC_GLOBALattid_inname_in)) ERR;
557      if (strcmp(name_inATT_TEXT_NAME)) ERR;
558      if (nc_redef(ncid)) ERR;
559      if (nc_rename_att(ncidNC_GLOBALATT_TEXT_NAMEATT_TEXT_NAME2)) ERR;
560      if (nc_inq_attname(ncidNC_GLOBALattid_inname_in)) ERR;
561      if (strcmp(name_inATT_TEXT_NAME2)) ERR;
562      if (nc_close(ncid)) ERR;
563
564#ifdef TEST_PNETCDF
565      if (nc_open_par(FILE_NAMENC_WRITE|NC_PNETCDFMPI_COMM_WORLDMPI_INFO_NULL, &ncid)) ERR;
566#else
567      if (nc_open(FILE_NAMENC_WRITE, &ncid)) ERR;
568#endif
569      if (nc_inq_att(ncidNC_GLOBALATT_TEXT_NAME2, &att_type, &att_len)) ERR;
570      if (att_type != NC_CHAR || att_len != strlen(speech) + 1) ERR;
571      if (!(speech_in = malloc(att_len + 1))) ERR;
572      if (nc_get_att_text(ncidNC_GLOBALATT_TEXT_NAME2speech_in)) ERR;
573      if (strcmp(speechspeech_in)) ERR;
574      free(speech_in);
575      if (nc_get_att_text(ncidNC_GLOBALATT_TEXT_NAMEspeech_in) != NC_ENOTATTERR;
576      if (nc_close(ncid)) ERR;
577
578      /* Now delete the att. */
579#ifdef TEST_PNETCDF
580      if (nc_open_par(FILE_NAMENC_WRITE|NC_PNETCDFMPI_COMM_WORLDMPI_INFO_NULL, &ncid)) ERR;
581#else
582      if (nc_open(FILE_NAMENC_WRITE, &ncid)) ERR;
583#endif
584      if (nc_redef(ncid)) ERR;
585      if (nc_del_att(ncidNC_GLOBALATT_TEXT_NAME2)) ERR;
586      if (nc_close(ncid)) ERR;
587
588      /* Now create a file with a variable, which has an att. */
589#ifdef TEST_PNETCDF
590      if (nc_create_par(FILE_NAMENC_CLOBBER|NC_PNETCDFMPI_COMM_WORLDMPI_INFO_NULL,&ncid)) ERR;
591#else
592      if (nc_create(FILE_NAMENC_CLOBBER, &ncid)) ERR;
593#endif
594      if (nc_put_att_text(ncidNC_GLOBALATT_TEXT_NAME, strlen(speech)+1, speech)) ERR;
595      if (nc_def_dim(ncidDIM1_NAMEDIM1_LEN, &dimids[0])) ERR;
596      if (nc_def_dim(ncidDIM2_NAMEDIM2_LEN, &dimids[1])) ERR;
597      if (nc_def_var(ncidVAR1_NAMENC_INT, 2, dimids, &varid)) ERR;
598      if (nc_put_att_int(ncidvaridATT_INT_NAMENC_INT, 3, int_out)) ERR;
599      if (nc_close(ncid)) ERR;
600
601      /* Reopen the file and delete it. Make sure it's gone. */
602#ifdef TEST_PNETCDF
603      if (nc_open_par(FILE_NAMENC_WRITE|NC_PNETCDFMPI_COMM_WORLDMPI_INFO_NULL, &ncid)) ERR;
604#else
605      if (nc_open(FILE_NAMENC_WRITE, &ncid)) ERR;
606#endif
607      if (nc_redef(ncid)) ERR;
608      if (nc_del_att(ncid, 0, ATT_INT_NAME)) ERR;
609      if (nc_close(ncid)) ERR;
610
611      /* Reopen the file and readd the attribute. Enddef and redef,
612       * and delete it, then check to make sure it's gone. */
613#ifdef TEST_PNETCDF
614      if (nc_open_par(FILE_NAMENC_WRITE|NC_PNETCDFMPI_COMM_WORLDMPI_INFO_NULL, &ncid)) ERR;
615#else
616      if (nc_open(FILE_NAMENC_WRITE, &ncid)) ERR;
617#endif
618      if (nc_redef(ncid)) ERR;
619      if (nc_put_att_int(ncidvaridATT_INT_NAMENC_INT, 3, int_out)) ERR;
620      if (nc_enddef(ncid)) ERR;
621      if (nc_redef(ncid)) ERR;
622      if (nc_del_att(ncid, 0, ATT_INT_NAME)) ERR;
623      if (nc_inq_varnatts(ncid, 0, &natts_in)) ERR;
624      if (natts_in != 0) ERR;
625      if (nc_close(ncid)) ERR;
626   }
627
628   SUMMARIZE_ERR;
629   printf("*** testing attribute create order...");
630
631#define ATT0 "Maturin"
632#define ATT1 "Aubery"
633   {
634      int ncidvariddimids[2];
635      int attid_in;
636      const int number = 42;
637
638      /* Create a file with several global attributes. */
639#ifdef TEST_PNETCDF
640      if (nc_create_par(FILE_NAMENC_CLOBBER|NC_PNETCDFMPI_COMM_WORLDMPI_INFO_NULL,&ncid)) ERR;
641#else
642      if (nc_create(FILE_NAMENC_CLOBBER, &ncid)) ERR;
643#endif
644      if (nc_put_att_int(ncidNC_GLOBALATT0NC_INT, 1, &number)) ERR;
645      if (nc_put_att_int(ncidNC_GLOBALATT1NC_INT, 1, &number)) ERR;
646      if (nc_close(ncid)) ERR;
647
648      /* Open it and check the order. */
649#ifdef TEST_PNETCDF
650      if (nc_open_par(FILE_NAMENC_WRITE|NC_PNETCDFMPI_COMM_WORLDMPI_INFO_NULL, &ncid)) ERR;
651#else
652      if (nc_open(FILE_NAMENC_WRITE, &ncid)) ERR;
653#endif
654      if (nc_inq_attid(ncidNC_GLOBALATT0, &attid_in)) ERR;
655      if (attid_in != 0) ERR;
656      if (nc_inq_attid(ncidNC_GLOBALATT1, &attid_in)) ERR;
657      if (attid_in != 1) ERR;
658      if (nc_close(ncid)) ERR;
659
660      /* Now create a file with a variable, which has two atts. */
661#ifdef TEST_PNETCDF
662      if (nc_create_par(FILE_NAMENC_CLOBBER|NC_PNETCDFMPI_COMM_WORLDMPI_INFO_NULL,&ncid)) ERR;
663#else
664      if (nc_create(FILE_NAMENC_CLOBBER, &ncid)) ERR;
665#endif
666      if (nc_def_dim(ncidDIM1_NAMEDIM1_LEN, &dimids[0])) ERR;
667      if (nc_def_dim(ncidDIM2_NAMEDIM2_LEN, &dimids[1])) ERR;
668      if (nc_def_var(ncidVAR1_NAMENC_INT, 2, dimids, &varid)) ERR;
669      if (nc_put_att_int(ncidvaridATT0NC_INT, 1, &number)) ERR;
670      if (nc_put_att_int(ncidvaridATT1NC_INT, 1, &number)) ERR;
671      if (nc_close(ncid)) ERR;
672
673      /* Reopen the file and check the order of the attributes on the var. */
674#ifdef TEST_PNETCDF
675      if (nc_open_par(FILE_NAMENC_WRITE|NC_PNETCDFMPI_COMM_WORLDMPI_INFO_NULL, &ncid)) ERR;
676#else
677      if (nc_open(FILE_NAMENC_WRITE, &ncid)) ERR;
678#endif
679      if (nc_inq_attid(ncid, 0, ATT0, &attid_in)) ERR;
680      if (attid_in != 0) ERR;
681      if (nc_inq_attid(ncid, 0, ATT1, &attid_in)) ERR;
682      if (attid_in != 1) ERR;
683      if (nc_close(ncid)) ERR;
684   }
685
686   SUMMARIZE_ERR;
687   printf("*** testing attribute ordering some more...");
688
689#define VAR_NAME "i"
690#define A1_NAME "i"
691#define A2_NAME "f"
692#define A3_NAME "d"
693#define A1_LEN 3
694#define A2_LEN 4
695#define A3_LEN 5
696   {
697      int ncid;
698      int varidnattsnvars;
699      double dvalue[] = {999.99, 999.99, 999.99, 999.99, 999.99};
700      char name_in[NC_MAX_NAME + 1];
701
702      /* Create a file with one var, and attach three atts to it. */
703#ifdef TEST_PNETCDF
704      if (nc_create_par(FILE_NAMENC_CLOBBER|NC_PNETCDFMPI_COMM_WORLDMPI_INFO_NULL,&ncid)) ERR;
705#else
706      if (nc_create(FILE_NAMENC_CLOBBER, &ncid)) ERR;
707#endif
708      if (nc_def_var(ncidVAR_NAMENC_INT, 0, NULL, &varid)) ERR;
709      if (nc_put_att_double(ncidvaridA1_NAMENC_INTA1_LENdvalue)) ERR;
710      if (nc_put_att_double(ncidvaridA2_NAMENC_INTA2_LENdvalue)) ERR;
711      if (nc_put_att_double(ncidvaridA3_NAMENC_INTA3_LENdvalue)) ERR;
712      if (nc_close(ncid)) ERR;
713
714      /* Reopen the file and check. */
715#ifdef TEST_PNETCDF
716      if (nc_open_par(FILE_NAMENC_PNETCDFMPI_COMM_WORLDMPI_INFO_NULL, &ncid)) ERR;
717#else
718      if (nc_open(FILE_NAME, 0, &ncid)) ERR;
719#endif
720      if (nc_inq_nvars(ncid, &nvars)) ERR;
721      if (nvars != 1) ERR;
722      if (nc_inq_varnatts(ncid, 0, &natts)) ERR;
723      if (natts != 3) ERR;
724      if (nc_inq_attname(ncid, 0, 0, name_in)) ERR;
725      if (strcmp(name_inA1_NAME)) ERR;
726      if (nc_inq_attname(ncid, 0, 1, name_in)) ERR;
727      if (strcmp(name_inA2_NAME)) ERR;
728      if (nc_inq_attname(ncid, 0, 2, name_in)) ERR;
729      if (strcmp(name_inA3_NAME)) ERR;
730
731      /* Close up shop. */
732      if (nc_close(ncid)) ERR;
733   }
734
735   SUMMARIZE_ERR;
736   printf("*** testing attribute ordering even more...");
737
738   /* Test the ordering of atts for each cmode. */
739   if (tst_att_ordering(NC_CLOBBER)) ERR;
740   if (tst_att_ordering(NC_CLOBBER|NC_64BIT_OFFSET)) ERR;
741
742   SUMMARIZE_ERR;
743   printf("*** testing attributes and enddef/redef...");
744
745#define ATT_1 "a"
746#define ATT_2 "b"
747#define ATT_3 "c"
748   {
749      int ncidatt = 1;
750
751#ifdef TEST_PNETCDF
752      if (nc_create_par(FILE_NAMENC_CLOBBER|NC_PNETCDFMPI_COMM_WORLDMPI_INFO_NULL,&ncid)) ERR;
753#else
754      if (nc_create(FILE_NAMENC_CLOBBER, &ncid)) ERR;
755#endif
756      if (nc_enddef(ncid)) ERR;
757      if (nc_redef(ncid)) ERR;
758      if (nc_put_att(ncidNC_GLOBALATT_1NC_INT, 1, &att)) ERR;
759      if (nc_put_att(ncidNC_GLOBALATT_2NC_INT, 1, &att)) ERR;
760      if (nc_put_att(ncidNC_GLOBALATT_3NC_INT, 1, &att)) ERR;
761
762      if (nc_close(ncid)) ERR;
763
764#ifdef TEST_PNETCDF
765      if (nc_open_par(FILE_NAMENC_PNETCDFMPI_COMM_WORLDMPI_INFO_NULL, &ncid)) ERR;
766#else
767      if (nc_open(FILE_NAME, 0, &ncid)) ERR;
768#endif
769      if (nc_close(ncid)) ERR;
770   }
771
772   SUMMARIZE_ERR;
773   printf("*** testing copy of simple global atts...");
774   {
775      int ncidncid2;
776      nc_type att_type;
777      size_t att_len;
778      int i;
779
780      char *speech_in;
781      signed char schar_in[ATT_LEN], schar_out[ATT_LEN] = {NC_MIN_BYTE, 1, NC_MAX_BYTE};
782      short short_in[ATT_LEN], short_out[ATT_LEN] = {NC_MIN_SHORT, -128, NC_MAX_SHORT};
783      int int_in[ATT_LEN], int_out[ATT_LEN] = {-100000, 128, 100000};
784      float float_in[ATT_LEN], float_out[ATT_LEN] = {.5, 0.25, 0.125};
785      double double_in[ATT_LEN], double_out[ATT_LEN] = {0.25, .5, 0.125};
786
787      /* Create a file with a global attribute of each type. */
788#ifdef TEST_PNETCDF
789      if (nc_create_par(FILE_NAMENC_CLOBBER|NC_PNETCDFMPI_COMM_WORLDMPI_INFO_NULL,&ncid)) ERR;
790#else
791      if (nc_create(FILE_NAMENC_CLOBBER, &ncid)) ERR;
792#endif
793      if (nc_put_att_text(ncidNC_GLOBALATT_TEXT_NAME, strlen(speech)+1, speech)) ERR;
794      if (nc_put_att_schar(ncidNC_GLOBALATT_SCHAR_NAMENC_BYTEATT_LENschar_out)) ERR;
795      if (nc_put_att_short(ncidNC_GLOBALATT_SHORT_NAMENC_SHORTATT_LENshort_out)) ERR;
796      if (nc_put_att_int(ncidNC_GLOBALATT_INT_NAMENC_INTATT_LENint_out)) ERR;
797      if (nc_put_att_float(ncidNC_GLOBALATT_FLOAT_NAMENC_FLOATATT_LENfloat_out)) ERR;
798      if (nc_put_att_double(ncidNC_GLOBALATT_DOUBLE_NAMENC_DOUBLEATT_LENdouble_out)) ERR;
799
800      /* Create another file and copy all the attributes. */
801#ifdef TEST_PNETCDF
802      if (nc_create_par(FILE_NAME2NC_CLOBBER|NC_PNETCDFMPI_COMM_WORLDMPI_INFO_NULL,&ncid2)) ERR;
803#else
804      if (nc_create(FILE_NAME2NC_CLOBBER, &ncid2)) ERR;
805#endif
806      if (nc_copy_att(ncidNC_GLOBALATT_TEXT_NAMEncid2NC_GLOBAL)) ERR;
807      if (nc_copy_att(ncidNC_GLOBALATT_SCHAR_NAMEncid2NC_GLOBAL)) ERR;
808      if (nc_copy_att(ncidNC_GLOBALATT_SHORT_NAMEncid2NC_GLOBAL)) ERR;
809      if (nc_copy_att(ncidNC_GLOBALATT_INT_NAMEncid2NC_GLOBAL)) ERR;
810      if (nc_copy_att(ncidNC_GLOBALATT_FLOAT_NAMEncid2NC_GLOBAL)) ERR;
811      if (nc_copy_att(ncidNC_GLOBALATT_DOUBLE_NAMEncid2NC_GLOBAL)) ERR;
812
813      /* Close both files. */
814      if (nc_close(ncid)) ERR;
815      if (nc_close(ncid2)) ERR;
816
817      /* Open the file and check attributes. */
818#ifdef TEST_PNETCDF
819      if (nc_open_par(FILE_NAME2NC_PNETCDFMPI_COMM_WORLDMPI_INFO_NULL, &ncid)) ERR;
820#else
821      if (nc_open(FILE_NAME2, 0, &ncid)) ERR;
822#endif
823      /* Check text. */
824      if (nc_inq_att(ncidNC_GLOBALATT_TEXT_NAME, &att_type, &att_len)) ERR;
825      if (att_type != NC_CHAR || att_len != strlen(speech) + 1) ERR;
826      if (!(speech_in = malloc(att_len + 1))) ERR;
827      if (nc_get_att_text(ncidNC_GLOBALATT_TEXT_NAMEspeech_in)) ERR;
828      if (strcmp(speechspeech_in)) ERR;
829      free(speech_in);
830      /* Check numeric values. */
831      if (nc_get_att_schar(ncidNC_GLOBALATT_SCHAR_NAMEschar_in)) ERR;
832      for (i = 0; i < ATT_LENi++)
833  if (schar_in[i] != schar_out[i]) ERR;
834      if (nc_get_att_short(ncidNC_GLOBALATT_SHORT_NAMEshort_in)) ERR;
835      for (i = 0; i < ATT_LENi++)
836  if (short_in[i] != short_out[i]) ERR;
837      if (nc_get_att_int(ncidNC_GLOBALATT_INT_NAMEint_in)) ERR;
838      for (i = 0; i < ATT_LENi++)
839  if (int_in[i] != int_out[i]) ERR;
840      if (nc_get_att_float(ncidNC_GLOBALATT_FLOAT_NAMEfloat_in)) ERR;
841      for (i = 0; i < ATT_LENi++)
842  if (float_in[i] != float_out[i]) ERR;
843      if (nc_get_att_double(ncidNC_GLOBALATT_DOUBLE_NAMEdouble_in)) ERR;
844      for (i = 0; i < ATT_LENi++)
845  if (double_in[i] != double_out[i]) ERR;
846      if (nc_close(ncid)) ERR;
847   }
848   SUMMARIZE_ERR;
849#ifdef TEST_PNETCDF
850   MPI_Finalize();
851#endif
852   FINAL_RESULTS;
853}


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