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$
8*/
9
10#include <nc_tests.h>
11#include "err_macros.h"
12#include "netcdf.h"
13#include <signal.h>
14
15#define FILE_NAME "tst_atts.nc"
16#define FILE_NAME2 "tst_atts_2.nc"
17#define VAR1_NAME "Horace_Rumpole"
18#define VAR2_NAME "Claude_Erskine-Brown"
19#define VAR3_NAME "Phillida_Erskine-Brown_Q.C."
20#define DIM1_NAME "Old_Bailey_case_number"
21#define DIM1_LEN 10
22#define DIM2_NAME "occupancy_in_chambers"
23#define DIM2_LEN 15
24#define ATT_INT_NAME "Old_Bailey_Room_Numbers"
25#define ATT_DOUBLE_NAME "Equity_Court_Canteen_Charges"
26#define ATT_SHORT_NAME "Ecclesiastical_Court_Appearences"
27#define ATT_TEXT_NAME "Speech_to_Jury"
28#define ATT_TEXT_NAME2 "Speech_to_She_Who_Must_be_Obeyed"
29#define ATT_UCHAR_NAME "Number_of_current_briefs"
30#define ATT_SCHAR_NAME "Slate_totals_at_Pomeroys_Wine_Bar"
31#define ATT_USHORT_NAME "brief_no"
32#define ATT_UINT_NAME "Orders_from_SWMBO"
33#define ATT_INT64_NAME "judges_golf_score"
34#define ATT_UINT64_NAME "Number_of_drinks_in_career_to_date"
35
36/*
37#define ATT_USHORT_NAME "Chamber_Gas_Electric_and_Telephone_Bill_Share"
38*/
39#define ATT_FLOAT_NAME "Average_Nanoseconds_for_Lose_Win_or_Appeal"
40#define ATT_LEN 3
41
42char speech[] = "Once more unto the breach, dear friends, once more;\n\
43Or close the wall up with our English dead.\n\
44In peace there's nothing so becomes a man\n\
45As modest stillness and humility:\n\
46But when the blast of war blows in our ears,\n\
47Then imitate the action of the tiger;\n\
48Stiffen the sinews, summon up the blood,\n\
49Disguise fair nature with hard-favour'd rage;\n\
50Then lend the eye a terrible aspect;\n\
51Let pry through the portage of the head\n\
52Like the brass cannon; let the brow o'erwhelm it\n\
53As fearfully as doth a galled rock\n\
54O'erhang and jutty his confounded base,\n\
55Swill'd with the wild and wasteful ocean.\n\
56Now set the teeth and stretch the nostril wide,\n\
57Hold hard the breath and bend up every spirit\n\
58To his full height. On, on, you noblest English.\n\
59Whose blood is fet from fathers of war-proof!\n\
60Fathers that, like so many Alexanders,\n\
61Have in these parts from morn till even fought\n\
62And sheathed their swords for lack of argument:\n\
63Dishonour not your mothers; now attest\n\
64That those whom you call'd fathers did beget you.\n\
65Be copy now to men of grosser blood,\n\
66And teach them how to war. And you, good yeoman,\n\
67Whose limbs were made in England, show us here\n\
68The mettle of your pasture; let us swear\n\
69That you are worth your breeding; which I doubt not;\n\
70For there is none of you so mean and base,\n\
71That hath not noble lustre in your eyes.\n\
72I see you stand like greyhounds in the slips,\n\
73Straining upon the start. The game's afoot:\n\
74Follow your spirit, and upon this charge\n\
75Cry 'God for Harry, England, and Saint George!'";
76
77/* Test the ordering of atts for a cmode. */
78#define NUM_ATTS 8
79#define ATT_MAX_NAME 25
80int
81tst_att_ordering(int cmode)
82{
83   int ncid;
84   char name[NUM_ATTS][ATT_MAX_NAME + 1] = {"Gc", "Gb", "Gs", "Gi", "Gf",
85     "Gd", "Gatt-name-dashes", "Gatt.name.dots"};
86   int len[NUM_ATTS] = {0, 2, 3, 3, 3, 3, 1, 1};
87   signed char b[2] = {-128, 127};
88   short s[3] = {-32768, 0, 32767};
89   int i[3] = {42, 0, -42};
90   float f[3] = {42.0, -42.0, 42.0};
91   double d[3] = {420.0, -420.0, 420.0};
92   int att_name_dashes = -1, att_name_dots = -2;
93   char name_in[NC_MAX_NAME];
94   int j;
95
96   /* Create a file with some global atts. */
97   if (nc_create(FILE_NAMEcmode, &ncid)) ERR;
98   if (nc_put_att_text(ncidNC_GLOBALname[0], len[0], NULL)) ERR;
99   if (nc_put_att_schar(ncidNC_GLOBALname[1], NC_BYTElen[1], b)) ERR;
100   if (nc_put_att_short(ncidNC_GLOBALname[2], NC_SHORTlen[2], s)) ERR;
101   if (nc_put_att_int(ncidNC_GLOBALname[3], NC_INTlen[3], i)) ERR;
102   if (nc_put_att_float(ncidNC_GLOBALname[4], NC_FLOATlen[4], f)) ERR;
103   if (nc_put_att_double(ncidNC_GLOBALname[5], NC_DOUBLElen[5], d)) ERR;
104   if (nc_put_att_int(ncidNC_GLOBALname[6], NC_INTlen[6], &att_name_dashes)) ERR;
105   if (nc_put_att_int(ncidNC_GLOBALname[7], NC_INTlen[7], &att_name_dots)) ERR;
106   if (nc_close(ncid)) ERR;
107
108   /* Reopen the file and check the order. */
109   if (nc_open(FILE_NAME, 0, &ncid)) ERR;
110   for (j = 0; j < NUM_ATTSj++)
111   {
112      if (nc_inq_attname(ncidNC_GLOBALjname_in)) ERR;
113      if (strcmp(name_inname[j])) ERR;
114   }
115
116   /* Close up shop. */
117   if (nc_close(ncid)) ERR;
118   return err;
119}
120
121int
122main(int argc, char **argv)
123{
124
125    signed char schar_in[ATT_LEN], schar_out[ATT_LEN] = {NC_MIN_BYTE, 1, NC_MAX_BYTE};
126    unsigned char uchar_in[ATT_LEN], uchar_out[ATT_LEN] = {0, 128, NC_MAX_UBYTE};
127    short short_in[ATT_LEN], short_out[ATT_LEN] = {NC_MIN_SHORT, -128, NC_MAX_SHORT};
128    unsigned short ushort_in[ATT_LEN], ushort_out[ATT_LEN] = {0, 128, NC_MAX_USHORT};
129    int int_in[ATT_LEN], int_out[ATT_LEN] = {-100000, 128, 100000};
130    long long_in[ATT_LEN];
131    unsigned int uint_in[ATT_LEN], uint_out[ATT_LEN] = {0, 128, NC_MAX_UINT};
132    float float_in[ATT_LEN], float_out[ATT_LEN] = {-0.5, 0.25, 0.125};
133    double double_in[ATT_LEN], double_out[ATT_LEN] = {-0.25, .5, 0.125};
134    long long longlong_in[ATT_LEN], longlong_out[ATT_LEN] = {-3123456789LL, 128LL, 3123456789LL};
135    unsigned long long ulonglong_in[ATT_LEN], ulonglong_out[ATT_LEN] = {0LL, 128LL, 3123456789LL};
136
137   (void) signal(SIGFPESIG_IGN);
138   printf("\n*** Testing netcdf-4 attribute functions.\n");
139   printf("*** testing really simple global atts...");
140#define NUM_SIMPLE_ATTS 9
141   {
142      int ncid;
143      char name[NUM_SIMPLE_ATTS][ATT_MAX_NAME + 1] = {"Gc", "Gb", "Gs", "Gi", "Gf",
144       "Gd", "G7", "G8", "G9"};
145      char name_in[NC_MAX_NAME];
146      int j;
147
148      /* Create a file with some global atts. */
149      if (nc_create(FILE_NAMENC_NETCDF4|NC_CLOBBER, &ncid)) ERR;
150      for (j = 0; j < NUM_SIMPLE_ATTSj++)
151  if (nc_put_att_int(ncidNC_GLOBALname[j], NC_INT, 0, NULL)) ERR;
152      if (nc_close(ncid)) ERR;
153
154      /* Reopen the file and check the order. */
155      if (nc_open(FILE_NAME, 0, &ncid)) ERR;
156      for (j = 0; j < NUM_SIMPLE_ATTSj++)
157      {
158  if (nc_inq_attname(ncidNC_GLOBALjname_in)) ERR;
159  if (strcmp(name_inname[j])) ERR;
160      }
161
162      /* Close up shop. */
163      if (nc_close(ncid)) ERR;
164   }
165   SUMMARIZE_ERR;
166   printf("*** testing simple global atts...");
167   {
168      int ncid;
169      nc_type att_type;
170      size_t att_len;
171      int i;
172
173      char *speech_in;
174
175      /* This won't work, because classic files can't create these types. */
176      if (nc_create(FILE_NAMENC_NETCDF4|NC_CLASSIC_MODEL, &ncid)) ERR;
177      if (nc_put_att_ushort(ncidNC_GLOBALATT_USHORT_NAMENC_USHORTATT_LEN,
178     ushort_out) != NC_ESTRICTNC3ERR;
179      if (nc_put_att_uint(ncidNC_GLOBALATT_UINT_NAMENC_UINTATT_LEN,
180   uint_out) != NC_ESTRICTNC3ERR;
181      if (nc_put_att_longlong(ncidNC_GLOBALATT_INT64_NAMENC_INT64ATT_LEN,
182       longlong_out) != NC_ESTRICTNC3ERR;
183      if (nc_put_att_ulonglong(ncidNC_GLOBALATT_UINT64_NAMENC_UINT64ATT_LEN,
184        ulonglong_out) != NC_ESTRICTNC3ERR;
185      /* But it's OK to put classic types like NC_INT converted from
186       * supported C types, though there may be out-of-range errrors
187       * for some values */
188      if (nc_put_att_uint(ncidNC_GLOBALATT_INT_NAMENC_INTATT_LEN,
189   uint_out) != NC_ERANGEERR;
190      if (nc_put_att_longlong(ncidNC_GLOBALATT_INT_NAMENC_INTATT_LEN,
191       longlong_out) != NC_ERANGEERR;
192      if (nc_put_att_ulonglong(ncidNC_GLOBALATT_INT_NAMENC_INTATT_LEN,
193        ulonglong_out) != NC_ERANGEERR;
194      if (nc_put_att_ushort(ncidNC_GLOBALATT_INT_NAMENC_INTATT_LEN,
195     ushort_out)) ERR;
196      /* restore to intended values for subsequent tests */
197      if (nc_put_att_int(ncidNC_GLOBALATT_INT_NAMENC_INTATT_LEN,
198     int_out)) ERR;
199      /* It should also be OK to read classic types converted into
200       * supported C types. though the conversion may encounter
201       * out-of-range values */
202      if (nc_get_att_uchar(ncidNC_GLOBALATT_INT_NAMEuchar_in) != NC_ERANGEERR;
203      if (nc_get_att_ushort(ncidNC_GLOBALATT_INT_NAMEushort_in) != NC_ERANGEERR;
204      if (nc_get_att_uint(ncidNC_GLOBALATT_INT_NAMEuint_in) != NC_ERANGEERR;
205      if (nc_get_att_longlong(ncidNC_GLOBALATT_INT_NAMElonglong_in)) ERR;
206      if (nc_get_att_ulonglong(ncidNC_GLOBALATT_INT_NAMEulonglong_in) != NC_ERANGEERR;
207
208      if (nc_close(ncid)) ERR;
209
210      /* Create a file with a global attribute of each type. */
211      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
212      if (nc_put_att_text(ncidNC_GLOBALATT_TEXT_NAME, strlen(speech)+1, speech)) ERR;
213      if (nc_put_att_schar(ncidNC_GLOBALATT_SCHAR_NAMENC_BYTEATT_LENschar_out)) ERR;
214      if (nc_put_att_uchar(ncidNC_GLOBALATT_UCHAR_NAMENC_UBYTEATT_LENuchar_out)) ERR;
215      if (nc_put_att_short(ncidNC_GLOBALATT_SHORT_NAMENC_SHORTATT_LENshort_out)) ERR;
216      if (nc_put_att_int(ncidNC_GLOBALATT_INT_NAMENC_INTATT_LENint_out)) ERR;
217      if (nc_put_att_float(ncidNC_GLOBALATT_FLOAT_NAMENC_FLOATATT_LENfloat_out)) ERR;
218      if (nc_put_att_double(ncidNC_GLOBALATT_DOUBLE_NAMENC_DOUBLEATT_LENdouble_out)) ERR;
219      if (nc_put_att_ushort(ncidNC_GLOBALATT_USHORT_NAMENC_USHORTATT_LENushort_out)) ERR;
220      if (nc_put_att_uint(ncidNC_GLOBALATT_UINT_NAMENC_UINTATT_LENuint_out)) ERR;
221      if (nc_put_att_longlong(ncidNC_GLOBALATT_INT64_NAMENC_INT64ATT_LENlonglong_out)) ERR;
222      if (nc_put_att_ulonglong(ncidNC_GLOBALATT_UINT64_NAMENC_UINT64ATT_LENulonglong_out)) ERR;
223      if (nc_close(ncid)) ERR;
224
225      /* Open the file and check attributes. */
226      if (nc_open(FILE_NAME, 0, &ncid)) ERR;
227      /* Check text. */
228      if (nc_inq_att(ncidNC_GLOBALATT_TEXT_NAME, &att_type, &att_len))
229  ERR;
230      if (att_type != NC_CHAR || att_len != strlen(speech) + 1) ERR;
231      if (!(speech_in = malloc(att_len + 1))) ERR;
232      if (nc_get_att_text(ncidNC_GLOBALATT_TEXT_NAMEspeech_in)) ERR;
233      if (strcmp(speechspeech_in)) ERR;
234      free(speech_in);
235      /* Check numeric values. */
236      if (nc_get_att_schar(ncidNC_GLOBALATT_SCHAR_NAMEschar_in)) ERR;
237      for (i = 0; i < ATT_LENi++)
238  if (schar_in[i] != schar_out[i]) ERR;
239      if (nc_get_att_uchar(ncidNC_GLOBALATT_UCHAR_NAMEuchar_in)) ERR;
240      for (i = 0; i < ATT_LENi++)
241  if (uchar_in[i] != uchar_out[i]) ERR;
242      if (nc_get_att_short(ncidNC_GLOBALATT_SHORT_NAMEshort_in)) ERR;
243      for (i = 0; i < ATT_LENi++)
244  if (short_in[i] != short_out[i]) ERR;
245      if (nc_get_att_int(ncidNC_GLOBALATT_INT_NAMEint_in)) ERR;
246      for (i = 0; i < ATT_LENi++)
247  if (int_in[i] != int_out[i]) ERR;
248      if (nc_get_att_float(ncidNC_GLOBALATT_FLOAT_NAMEfloat_in)) ERR;
249      for (i = 0; i < ATT_LENi++)
250  if (float_in[i] != float_out[i]) ERR;
251      if (nc_get_att_double(ncidNC_GLOBALATT_DOUBLE_NAMEdouble_in)) ERR;
252      for (i = 0; i < ATT_LENi++)
253  if (double_in[i] != double_out[i]) ERR;
254      if (nc_get_att_ushort(ncidNC_GLOBALATT_USHORT_NAMEushort_in)) ERR;
255      for (i = 0; i < ATT_LENi++)
256  if (ushort_in[i] != ushort_out[i]) ERR;
257      if (nc_get_att_uint(ncidNC_GLOBALATT_UINT_NAMEuint_in)) ERR;
258      for (i = 0; i < ATT_LENi++)
259  if (uint_in[i] != uint_out[i]) ERR;
260      if (nc_get_att_longlong(ncidNC_GLOBALATT_INT64_NAMElonglong_in)) ERR;
261      for (i = 0; i < ATT_LENi++)
262  if (longlong_in[i] != longlong_out[i]) ERR;
263      if (nc_get_att_ulonglong(ncidNC_GLOBALATT_UINT64_NAMEulonglong_in)) ERR;
264      for (i = 0; i < ATT_LENi++)
265  if (ulonglong_in[i] != ulonglong_out[i]) ERR;
266      if (nc_close(ncid)) ERR;
267   }
268   SUMMARIZE_ERR;
269   printf("*** testing attribute data type conversions...");
270
271   {
272      int ncid;
273      int i;
274
275      /* Reopen the file and try different type conversions. */
276      if (nc_open(FILE_NAME, 0, &ncid)) ERR;
277
278      /* No text conversions are allowed, and people who try them should
279       * be locked up, away from decent folk! */
280      if (nc_get_att_schar(ncidNC_GLOBALATT_TEXT_NAMEschar_in) != NC_ECHARERR;
281      if (nc_get_att_uchar(ncidNC_GLOBALATT_TEXT_NAMEuchar_in) != NC_ECHARERR;
282      if (nc_get_att_short(ncidNC_GLOBALATT_TEXT_NAMEshort_in) != NC_ECHARERR;
283      if (nc_get_att_int(ncidNC_GLOBALATT_TEXT_NAMEint_in) != NC_ECHARERR;
284      if (nc_get_att_float(ncidNC_GLOBALATT_TEXT_NAMEfloat_in) != NC_ECHARERR;
285      if (nc_get_att_double(ncidNC_GLOBALATT_TEXT_NAMEdouble_in) != NC_ECHARERR;
286      if (nc_get_att_ushort(ncidNC_GLOBALATT_TEXT_NAMEushort_in) != NC_ECHARERR;
287      if (nc_get_att_uint(ncidNC_GLOBALATT_TEXT_NAMEuint_in) != NC_ECHARERR;
288      if (nc_get_att_long(ncidNC_GLOBALATT_TEXT_NAMElong_in) != NC_ECHARERR;
289      if (nc_get_att_longlong(ncidNC_GLOBALATT_TEXT_NAMElonglong_in) != NC_ECHARERR;
290      if (nc_get_att_ulonglong(ncidNC_GLOBALATT_TEXT_NAMEulonglong_in) != NC_ECHARERR;
291
292      /* Read all atts (except text) as double. */
293      if (nc_get_att_double(ncidNC_GLOBALATT_SCHAR_NAMEdouble_in)) ERR;
294      for (i = 0; i < ATT_LENi++)
295  if (double_in[i] != schar_out[i]) ERR;
296      if (nc_get_att_double(ncidNC_GLOBALATT_UCHAR_NAMEdouble_in)) ERR;
297      for (i = 0; i < ATT_LENi++)
298  if (double_in[i] != uchar_out[i]) ERR;
299      if (nc_get_att_double(ncidNC_GLOBALATT_SHORT_NAMEdouble_in)) ERR;
300      for (i = 0; i < ATT_LENi++)
301  if (double_in[i] != short_out[i]) ERR;
302      if (nc_get_att_double(ncidNC_GLOBALATT_USHORT_NAMEdouble_in)) ERR;
303      for (i = 0; i < ATT_LENi++)
304  if (double_in[i] != ushort_out[i]) ERR;
305      if (nc_get_att_double(ncidNC_GLOBALATT_INT_NAMEdouble_in)) ERR;
306      for (i = 0; i < ATT_LENi++)
307  if (double_in[i] != int_out[i]) ERR;
308      if (nc_get_att_double(ncidNC_GLOBALATT_UINT_NAMEdouble_in)) ERR;
309      for (i = 0; i < ATT_LENi++)
310  if (double_in[i] != uint_out[i]) ERR;
311      if (nc_get_att_double(ncidNC_GLOBALATT_FLOAT_NAMEdouble_in)) ERR;
312      for (i = 0; i < ATT_LENi++)
313  if (double_in[i] != float_out[i]) ERR;
314      if (nc_get_att_double(ncidNC_GLOBALATT_DOUBLE_NAMEdouble_in)) ERR;
315      for (i = 0; i < ATT_LENi++)
316  if (double_in[i] != double_out[i]) ERR;
317      if (nc_get_att_double(ncidNC_GLOBALATT_INT64_NAMEdouble_in)) ERR;
318      for (i = 0; i < ATT_LENi++)
319   if (double_in[i] != longlong_out[i]) ERR;
320      if (nc_get_att_double(ncidNC_GLOBALATT_UINT64_NAMEdouble_in)) ERR;
321      for (i = 0; i < ATT_LENi++)
322   if (double_in[i] != ulonglong_out[i]) ERR;
323
324      /* Read all atts (except text) as float. */
325      if (nc_get_att_float(ncidNC_GLOBALATT_SCHAR_NAMEfloat_in)) ERR;
326      for (i = 0; i < ATT_LENi++)
327  if (float_in[i] != schar_out[i]) ERR;
328      if (nc_get_att_float(ncidNC_GLOBALATT_UCHAR_NAMEfloat_in)) ERR;
329      for (i = 0; i < ATT_LENi++)
330  if (float_in[i] != uchar_out[i]) ERR;
331      if (nc_get_att_float(ncidNC_GLOBALATT_SHORT_NAMEfloat_in)) ERR;
332      for (i = 0; i < ATT_LENi++)
333  if (float_in[i] != short_out[i]) ERR;
334      if (nc_get_att_float(ncidNC_GLOBALATT_USHORT_NAMEfloat_in)) ERR;
335      for (i = 0; i < ATT_LENi++)
336  if (float_in[i] != ushort_out[i]) ERR;
337      if (nc_get_att_float(ncidNC_GLOBALATT_INT_NAMEfloat_in)) ERR;
338      for (i = 0; i < ATT_LENi++)
339  if (float_in[i] != int_out[i]) ERR;
340      if (nc_get_att_float(ncidNC_GLOBALATT_UINT_NAMEfloat_in)) ERR;
341      /* Why is comparison failing in 32-bit? Looks like a gcc compiler error */
342      /* for (i = 0; i < ATT_LEN; i++) */
343      /*    if (float_in[i] != (float) uint_out[i]) ERR; */
344      if (nc_get_att_float(ncidNC_GLOBALATT_FLOAT_NAMEfloat_in)) ERR;
345      for (i = 0; i < ATT_LENi++)
346  if (float_in[i] != float_out[i]) ERR;
347      if (nc_get_att_float(ncidNC_GLOBALATT_DOUBLE_NAMEfloat_in)) ERR;
348      for (i = 0; i < ATT_LENi++)
349   if (float_in[i] != (float) double_out[i]) ERR;
350      if (nc_get_att_float(ncidNC_GLOBALATT_INT64_NAMEfloat_in)) ERR;
351      /* Why is comparison failing in 32-bit? */
352      /* for (i = 0; i < ATT_LEN; i++) */
353      /*    if (float_in[i] != (float) longlong_out[i]) ERR; */
354      if (nc_get_att_float(ncidNC_GLOBALATT_UINT64_NAMEfloat_in)) ERR;
355#if !defined(_WIN32) && !defined(_WIN64)
356   for (i = 0; i < ATT_LENi++)
357   if (float_in[i] != (float) ulonglong_out[i]) ERR;
358#endif
359      /* Read all atts (except text) as int. */
360      if (nc_get_att_int(ncidNC_GLOBALATT_SCHAR_NAMEint_in)) ERR;
361      for (i = 0; i < ATT_LENi++)
362  if (int_in[i] != schar_out[i]) ERR;
363      if (nc_get_att_int(ncidNC_GLOBALATT_UCHAR_NAMEint_in)) ERR;
364      for (i = 0; i < ATT_LENi++)
365   if (int_in[i] != (int) uchar_out[i]) ERR;
366      if (nc_get_att_int(ncidNC_GLOBALATT_SHORT_NAMEint_in)) ERR;
367      for (i = 0; i < ATT_LENi++)
368  if (int_in[i] != short_out[i]) ERR;
369      if (nc_get_att_int(ncidNC_GLOBALATT_USHORT_NAMEint_in)) ERR;
370      for (i = 0; i < ATT_LENi++)
371  if (int_in[i] != ushort_out[i]) ERR;
372      if (nc_get_att_int(ncidNC_GLOBALATT_INT_NAMEint_in)) ERR;
373      for (i = 0; i < ATT_LENi++)
374  if (int_in[i] != int_out[i]) ERR;
375      if (nc_get_att_int(ncidNC_GLOBALATT_UINT_NAMEint_in) != NC_ERANGEERR;
376      for (i = 0; i < ATT_LENi++)
377   if (int_in[i] != (int) uint_out[i]) ERR;
378      if (nc_get_att_int(ncidNC_GLOBALATT_FLOAT_NAMEint_in)) ERR;
379      for (i = 0; i < ATT_LENi++)
380   if (int_in[i] != (int) float_out[i]) ERR;
381      if (nc_get_att_int(ncidNC_GLOBALATT_DOUBLE_NAMEint_in)) ERR;
382      for (i = 0; i < ATT_LENi++)
383   if (int_in[i] != (int) double_out[i]) ERR;
384      if (nc_get_att_int(ncidNC_GLOBALATT_INT64_NAMEint_in) != NC_ERANGEERR;
385      for (i = 0; i < ATT_LENi++)
386   if (int_in[i] != (int) longlong_out[i]) ERR;
387      if (nc_get_att_int(ncidNC_GLOBALATT_UINT64_NAMEint_in) != NC_ERANGEERR;
388      for (i = 0; i < ATT_LENi++)
389   if (int_in[i] != (int) ulonglong_out[i]) ERR;
390
391      /* Read all atts (except text) as uint. */
392      if (nc_get_att_uint(ncidNC_GLOBALATT_SCHAR_NAMEuint_in) != NC_ERANGEERR;
393      for (i = 0; i < ATT_LENi++)
394  if (uint_in[i] != (unsigned int) schar_out[i]) ERR;
395      if (nc_get_att_uint(ncidNC_GLOBALATT_UCHAR_NAMEuint_in)) ERR;
396      for (i = 0; i < ATT_LENi++)
397  if (uint_in[i] != uchar_out[i]) ERR;
398      if (nc_get_att_uint(ncidNC_GLOBALATT_SHORT_NAMEuint_in) != NC_ERANGEERR;
399      for (i = 0; i < ATT_LENi++)
400  if (uint_in[i] != (unsigned int) short_out[i]) ERR;
401      if (nc_get_att_uint(ncidNC_GLOBALATT_USHORT_NAMEuint_in)) ERR;
402      for (i = 0; i < ATT_LENi++)
403  if (uint_in[i] != ushort_out[i]) ERR;
404      if (nc_get_att_uint(ncidNC_GLOBALATT_INT_NAMEuint_in) != NC_ERANGEERR;
405      for (i = 0; i < ATT_LENi++)
406  if (uint_in[i] != (unsigned int) int_out[i]) ERR;
407      if (nc_get_att_uint(ncidNC_GLOBALATT_UINT_NAMEuint_in)) ERR;
408      for (i = 0; i < ATT_LENi++)
409  if (uint_in[i] != uint_out[i]) ERR;
410      if (nc_get_att_uint(ncidNC_GLOBALATT_FLOAT_NAMEuint_in) != NC_ERANGEERR;
411      for (i = 0; i < ATT_LENi++)
412  if (uint_in[i] != (unsigned int) float_out[i]) ERR;
413      if (nc_get_att_uint(ncidNC_GLOBALATT_DOUBLE_NAMEuint_in) != NC_ERANGEERR;
414      for (i = 0; i < ATT_LENi++)
415  if (uint_in[i] != (unsigned int) double_out[i]) ERR;
416      if (nc_get_att_uint(ncidNC_GLOBALATT_INT64_NAMEuint_in) != NC_ERANGEERR;
417      for (i = 0; i < ATT_LENi++)
418   if (uint_in[i] != (unsigned int) longlong_out[i]) ERR;
419      if (nc_get_att_uint(ncidNC_GLOBALATT_UINT64_NAMEuint_in)) ERR;
420      for (i = 0; i < ATT_LENi++)
421   if (uint_in[i] != (unsigned int) ulonglong_out[i]) ERR;
422
423      /* Read all atts (except text) as short. */
424      if (nc_get_att_short(ncidNC_GLOBALATT_SCHAR_NAMEshort_in)) ERR;
425      for (i = 0; i < ATT_LENi++)
426  if (short_in[i] != schar_out[i]) ERR;
427      if (nc_get_att_short(ncidNC_GLOBALATT_UCHAR_NAMEshort_in)) ERR;
428      for (i = 0; i < ATT_LENi++)
429  if (short_in[i] != uchar_out[i]) ERR;
430      if (nc_get_att_short(ncidNC_GLOBALATT_SHORT_NAMEshort_in)) ERR;
431      for (i = 0; i < ATT_LENi++)
432  if (short_in[i] != short_out[i]) ERR;
433      if (nc_get_att_short(ncidNC_GLOBALATT_USHORT_NAMEshort_in) != NC_ERANGEERR;
434      for (i = 0; i < ATT_LENi++)
435   if (short_in[i] != (short) ushort_out[i]) ERR;
436      if (nc_get_att_short(ncidNC_GLOBALATT_INT_NAMEshort_in) != NC_ERANGEERR;
437      for (i = 0; i < ATT_LENi++)
438   if (short_in[i] != (short) int_out[i]) ERR;
439      if (nc_get_att_short(ncidNC_GLOBALATT_UINT_NAMEshort_in) != NC_ERANGEERR;
440      for (i = 0; i < ATT_LENi++)
441   if (short_in[i] != (short) uint_out[i]) ERR;
442      if (nc_get_att_short(ncidNC_GLOBALATT_FLOAT_NAMEshort_in)) ERR;
443      for (i = 0; i < ATT_LENi++)
444   if (short_in[i] != (short) float_out[i]) ERR;
445      if (nc_get_att_short(ncidNC_GLOBALATT_DOUBLE_NAMEshort_in)) ERR;
446      for (i = 0; i < ATT_LENi++)
447   if (short_in[i] != (short) double_out[i]) ERR;
448      if (nc_get_att_short(ncidNC_GLOBALATT_INT64_NAMEshort_in) != NC_ERANGEERR;
449      for (i = 0; i < ATT_LENi++)
450   if (short_in[i] != (short) longlong_out[i]) ERR;
451      if (nc_get_att_short(ncidNC_GLOBALATT_UINT64_NAMEshort_in) != NC_ERANGEERR;
452      for (i = 0; i < ATT_LENi++)
453   if (short_in[i] != (short) ulonglong_out[i]) ERR;
454
455      /* Read all atts (except text) as ushort. */
456      if (nc_get_att_ushort(ncidNC_GLOBALATT_SCHAR_NAMEushort_in) != NC_ERANGEERR;
457      for (i = 0; i < ATT_LENi++)
458  if (ushort_in[i] != (unsigned short) schar_out[i]) ERR;
459      if (nc_get_att_ushort(ncidNC_GLOBALATT_UCHAR_NAMEushort_in)) ERR;
460      for (i = 0; i < ATT_LENi++)
461  if (ushort_in[i] != uchar_out[i]) ERR;
462      if (nc_get_att_ushort(ncidNC_GLOBALATT_SHORT_NAMEushort_in) != NC_ERANGEERR;
463      for (i = 0; i < ATT_LENi++)
464  if (ushort_in[i] != (unsigned short) short_out[i]) ERR;
465      if (nc_get_att_ushort(ncidNC_GLOBALATT_USHORT_NAMEushort_in)) ERR;
466      for (i = 0; i < ATT_LENi++)
467  if (ushort_in[i] != ushort_out[i]) ERR;
468      if (nc_get_att_ushort(ncidNC_GLOBALATT_INT_NAMEushort_in) != NC_ERANGEERR;
469      for (i = 0; i < ATT_LENi++)
470  if (ushort_in[i] != (unsigned short) int_out[i]) ERR;
471      if (nc_get_att_ushort(ncidNC_GLOBALATT_UINT_NAMEushort_in) != NC_ERANGEERR;
472      for (i = 0; i < ATT_LENi++)
473  if (ushort_in[i] != (unsigned short) uint_out[i]) ERR;
474      if (nc_get_att_ushort(ncidNC_GLOBALATT_FLOAT_NAMEushort_in) != NC_ERANGEERR;
475      for (i = 0; i < ATT_LENi++)
476  if (ushort_in[i] != (unsigned short) float_out[i]) ERR;
477      if (nc_get_att_ushort(ncidNC_GLOBALATT_DOUBLE_NAMEushort_in) != NC_ERANGEERR;
478      for (i = 0; i < ATT_LENi++)
479  if (ushort_in[i] != (unsigned short) double_out[i]) ERR;
480      if (nc_get_att_ushort(ncidNC_GLOBALATT_INT64_NAMEushort_in) != NC_ERANGEERR;
481      for (i = 0; i < ATT_LENi++)
482   if (ushort_in[i] != (unsigned short) longlong_out[i]) ERR;
483      if (nc_get_att_ushort(ncidNC_GLOBALATT_UINT64_NAMEushort_in) != NC_ERANGEERR;
484      for (i = 0; i < ATT_LENi++)
485   if (ushort_in[i] != (unsigned short) ulonglong_out[i]) ERR;
486
487      /* Read all atts (except text) as schar. */
488      if (nc_get_att_schar(ncidNC_GLOBALATT_SCHAR_NAMEschar_in)) ERR;
489      for (i = 0; i < ATT_LENi++)
490  if (schar_in[i] != schar_out[i]) ERR;
491      if (nc_get_att_schar(ncidNC_GLOBALATT_UCHAR_NAMEschar_in) != NC_ERANGEERR;
492      for (i = 0; i < ATT_LENi++)
493   if (schar_in[i] != (signed char) uchar_out[i]) ERR;
494      if (nc_get_att_schar(ncidNC_GLOBALATT_SHORT_NAMEschar_in) != NC_ERANGEERR;
495      for (i = 0; i < ATT_LENi++)
496  if (schar_in[i] != (signed char) short_out[i]) ERR;
497      if (nc_get_att_schar(ncidNC_GLOBALATT_USHORT_NAMEschar_in) != NC_ERANGEERR;
498      for (i = 0; i < ATT_LENi++)
499  if (schar_in[i] != (signed char) ushort_out[i]) ERR;
500      if (nc_get_att_schar(ncidNC_GLOBALATT_INT_NAMEschar_in) != NC_ERANGEERR;
501      for (i = 0; i < ATT_LENi++)
502  if (schar_in[i] != (signed char) int_out[i]) ERR;
503      if (nc_get_att_schar(ncidNC_GLOBALATT_UINT_NAMEschar_in) != NC_ERANGEERR;
504      for (i = 0; i < ATT_LENi++)
505  if (schar_in[i] != (signed char) uint_out[i]) ERR;
506      if (nc_get_att_schar(ncidNC_GLOBALATT_FLOAT_NAMEschar_in)) ERR;
507      for (i = 0; i < ATT_LENi++)
508  if (schar_in[i] != (signed char) float_out[i]) ERR;
509      if (nc_get_att_schar(ncidNC_GLOBALATT_DOUBLE_NAMEschar_in)) ERR;
510      for (i = 0; i < ATT_LENi++)
511  if (schar_in[i] != (signed char) double_out[i]) ERR;
512      if (nc_get_att_schar(ncidNC_GLOBALATT_INT64_NAMEschar_in) != NC_ERANGEERR;
513      for (i = 0; i < ATT_LENi++)
514   if (schar_in[i] != (signed char) longlong_out[i]) ERR;
515      if (nc_get_att_schar(ncidNC_GLOBALATT_UINT64_NAMEschar_in) != NC_ERANGEERR;
516      for (i = 0; i < ATT_LENi++)
517   if (schar_in[i] != (signed char) ulonglong_out[i]) ERR;
518
519      /* Read all atts (except text) as uchar. */
520      if (nc_get_att_uchar(ncidNC_GLOBALATT_SCHAR_NAMEuchar_in) != NC_ERANGEERR;
521      for (i = 0; i < ATT_LENi++)
522  if (uchar_in[i] != (unsigned char) schar_out[i]) ERR;
523      if (nc_get_att_uchar(ncidNC_GLOBALATT_UCHAR_NAMEuchar_in)) ERR;
524      for (i = 0; i < ATT_LENi++)
525  if (uchar_in[i] != uchar_out[i]) ERR;
526      if (nc_get_att_uchar(ncidNC_GLOBALATT_SHORT_NAMEuchar_in) != NC_ERANGEERR;
527      for (i = 0; i < ATT_LENi++)
528  if (uchar_in[i] != (unsigned char) short_out[i]) ERR;
529      if (nc_get_att_uchar(ncidNC_GLOBALATT_USHORT_NAMEuchar_in) != NC_ERANGEERR;
530      for (i = 0; i < ATT_LENi++)
531  if (uchar_in[i] != (unsigned char) ushort_out[i]) ERR;
532      if (nc_get_att_uchar(ncidNC_GLOBALATT_INT_NAMEuchar_in) != NC_ERANGEERR;
533      for (i = 0; i < ATT_LENi++)
534  if (uchar_in[i] != (unsigned char) int_out[i]) ERR;
535      if (nc_get_att_uchar(ncidNC_GLOBALATT_UINT_NAMEuchar_in) != NC_ERANGEERR;
536      for (i = 0; i < ATT_LENi++)
537  if (uchar_in[i] != (unsigned char) uint_out[i]) ERR;
538      if (nc_get_att_uchar(ncidNC_GLOBALATT_FLOAT_NAMEuchar_in) != NC_ERANGEERR;
539      for (i = 0; i < ATT_LENi++)
540  if (uchar_in[i] != (unsigned char) float_out[i]) ERR;
541      if (nc_get_att_uchar(ncidNC_GLOBALATT_DOUBLE_NAMEuchar_in) != NC_ERANGEERR;
542      for (i = 0; i < ATT_LENi++)
543  if (uchar_in[i] != (unsigned char) double_out[i]) ERR;
544      if (nc_get_att_uchar(ncidNC_GLOBALATT_INT64_NAMEuchar_in) != NC_ERANGEERR;
545      for (i = 0; i < ATT_LENi++)
546   if (uchar_in[i] != (unsigned char) longlong_out[i]) ERR;
547      if (nc_get_att_uchar(ncidNC_GLOBALATT_UINT64_NAMEuchar_in) != NC_ERANGEERR;
548      for (i = 0; i < ATT_LENi++)
549   if (uchar_in[i] != (unsigned char) ulonglong_out[i]) ERR;
550
551      /* Read all atts (except text) into long long variable. */
552      if (nc_get_att_longlong(ncidNC_GLOBALATT_SCHAR_NAMElonglong_in)) ERR;
553      for (i = 0; i < ATT_LENi++)
554  if (longlong_in[i] != schar_out[i]) ERR;
555      if (nc_get_att_longlong(ncidNC_GLOBALATT_UCHAR_NAMElonglong_in)) ERR;
556      for (i = 0; i < ATT_LENi++)
557  if (longlong_in[i] != uchar_out[i]) ERR;
558      if (nc_get_att_longlong(ncidNC_GLOBALATT_SHORT_NAMElonglong_in)) ERR;
559      for (i = 0; i < ATT_LENi++)
560  if (longlong_in[i] != short_out[i]) ERR;
561      if (nc_get_att_longlong(ncidNC_GLOBALATT_USHORT_NAMElonglong_in)) ERR;
562      for (i = 0; i < ATT_LENi++)
563  if (longlong_in[i] != ushort_out[i]) ERR;
564      if (nc_get_att_longlong(ncidNC_GLOBALATT_INT_NAMElonglong_in)) ERR;
565      for (i = 0; i < ATT_LENi++)
566  if (longlong_in[i] != int_out[i]) ERR;
567      if (nc_get_att_longlong(ncidNC_GLOBALATT_UINT_NAMElonglong_in)) ERR;
568      for (i = 0; i < ATT_LENi++)
569  if (longlong_in[i] != uint_out[i]) ERR;
570      if (nc_get_att_longlong(ncidNC_GLOBALATT_FLOAT_NAMElonglong_in)) ERR;
571      for (i = 0; i < ATT_LENi++)
572  if (longlong_in[i] != (int)float_out[i]) ERR;
573      if (nc_get_att_longlong(ncidNC_GLOBALATT_DOUBLE_NAMElonglong_in)) ERR;
574      for (i = 0; i < ATT_LENi++)
575  if (longlong_in[i] != (int)double_out[i]) ERR;
576      if (nc_get_att_longlong(ncidNC_GLOBALATT_INT64_NAMElonglong_in)) ERR;
577      for (i = 0; i < ATT_LENi++)
578  if (longlong_in[i] != longlong_out[i]) ERR;
579      if (nc_get_att_longlong(ncidNC_GLOBALATT_UINT64_NAMElonglong_in)) ERR;
580      for (i = 0; i < ATT_LENi++)
581   if (longlong_in[i] != (unsigned long long) ulonglong_out[i]) ERR;
582
583      /* Read all atts (except text) into unsigned long long variable. */
584      if (nc_get_att_ulonglong(ncidNC_GLOBALATT_SCHAR_NAMEulonglong_in) != NC_ERANGEERR;
585      for (i = 0; i < ATT_LENi++)
586   if (ulonglong_in[i] != (unsigned long long) schar_out[i]) ERR;
587      if (nc_get_att_ulonglong(ncidNC_GLOBALATT_UCHAR_NAMEulonglong_in)) ERR;
588      for (i = 0; i < ATT_LENi++)
589  if (ulonglong_in[i] != uchar_out[i]) ERR;
590      if (nc_get_att_ulonglong(ncidNC_GLOBALATT_SHORT_NAMEulonglong_in) != NC_ERANGEERR;
591      for (i = 0; i < ATT_LENi++)
592   if (ulonglong_in[i] != (unsigned long long) short_out[i]) ERR;
593      if (nc_get_att_ulonglong(ncidNC_GLOBALATT_USHORT_NAMEulonglong_in)) ERR;
594      for (i = 0; i < ATT_LENi++)
595  if (ulonglong_in[i] != ushort_out[i]) ERR;
596      if (nc_get_att_ulonglong(ncidNC_GLOBALATT_INT_NAMEulonglong_in) != NC_ERANGEERR;
597      for (i = 0; i < ATT_LENi++)
598   if (ulonglong_in[i] != (unsigned long long) int_out[i]) ERR;
599      if (nc_get_att_ulonglong(ncidNC_GLOBALATT_UINT_NAMEulonglong_in)) ERR;
600      for (i = 0; i < ATT_LENi++)
601  if (ulonglong_in[i] != uint_out[i]) ERR;
602      if (nc_get_att_ulonglong(ncidNC_GLOBALATT_FLOAT_NAMEulonglong_in) != NC_ERANGEERR;
603      for (i = 0; i < ATT_LENi++)
604  if (ulonglong_in[i] != (unsigned long long) float_out[i]) ERR;
605      if (nc_get_att_ulonglong(ncidNC_GLOBALATT_DOUBLE_NAMEulonglong_in) != NC_ERANGEERR;
606      for (i = 0; i < ATT_LENi++)
607  if (ulonglong_in[i] != (unsigned long long) double_out[i]) ERR;
608      if (nc_get_att_ulonglong(ncidNC_GLOBALATT_INT64_NAMEulonglong_in) != NC_ERANGEERR;
609      for (i = 0; i < ATT_LENi++)
610   if (ulonglong_in[i] != (unsigned long long) longlong_out[i]) ERR;
611      if (nc_get_att_ulonglong(ncidNC_GLOBALATT_UINT64_NAMEulonglong_in)) ERR;
612      for (i = 0; i < ATT_LENi++)
613  if (ulonglong_in[i] != ulonglong_out[i]) ERR;
614
615      if (nc_close(ncid)) ERR;
616   }
617   SUMMARIZE_ERR;
618   printf("*** testing simple variable atts...");
619   {
620      int ncidvariddimids[2];
621      nc_type att_type;
622      size_t att_len;
623      int iv;
624
625      char *speech_in;
626      signed char schar_in[ATT_LEN], schar_out[ATT_LEN] = {NC_MIN_BYTE, 1, NC_MAX_BYTE};
627      short short_in[ATT_LEN], short_out[ATT_LEN] = {NC_MIN_SHORT, -128, NC_MAX_SHORT};
628      /*int int_in[ATT_LEN], int_out[ATT_LEN] = {NC_MIN_INT, 128, NC_MAX_INT};*/
629      int int_in[ATT_LEN], int_out[ATT_LEN] = {-100000, 128, 100000};
630      float float_in[ATT_LEN], float_out[ATT_LEN] = {.5, 0.25, 0.125};
631      double double_in[ATT_LEN], double_out[ATT_LEN] = {0.25, .5, 0.125};
632
633      /* Create a file with two vars, attaching to each an attribute of
634       * each type. */
635      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
636      if (nc_def_dim(ncidDIM1_NAMEDIM1_LEN, &dimids[0])) ERR;
637      if (nc_def_dim(ncidDIM2_NAMEDIM2_LEN, &dimids[1])) ERR;
638      if (nc_def_var(ncidVAR1_NAMENC_INT, 2, dimids, &varid)) ERR;
639      if (nc_put_att_text(ncidvaridATT_TEXT_NAME, strlen(speech)+1, speech)) ERR;
640      if (nc_put_att_schar(ncidvaridATT_SCHAR_NAMENC_BYTEATT_LENschar_out)) ERR;
641      if (nc_put_att_short(ncidvaridATT_SHORT_NAMENC_SHORT, 3, short_out)) ERR;
642      if (nc_put_att_int(ncidvaridATT_INT_NAMENC_INT, 3, int_out)) ERR;
643      if (nc_put_att_float(ncidvaridATT_FLOAT_NAMENC_FLOAT, 3, float_out)) ERR;
644      if (nc_put_att_double(ncidvaridATT_DOUBLE_NAMENC_DOUBLE, 3, double_out)) ERR;
645      if (nc_def_var(ncidVAR2_NAMENC_UINT, 2, dimids, &varid)) ERR;
646      if (nc_put_att_text(ncidvaridATT_TEXT_NAME, strlen(speech)+1, speech)) ERR;
647      if (nc_put_att_schar(ncidvaridATT_SCHAR_NAMENC_BYTEATT_LENschar_out)) ERR;
648      if (nc_put_att_short(ncidvaridATT_SHORT_NAMENC_SHORT, 3, short_out)) ERR;
649      if (nc_put_att_int(ncidvaridATT_INT_NAMENC_INT, 3, int_out)) ERR;
650      if (nc_put_att_float(ncidvaridATT_FLOAT_NAMENC_FLOAT, 3, float_out)) ERR;
651      if (nc_put_att_double(ncidvaridATT_DOUBLE_NAMENC_DOUBLE, 3, double_out)) ERR;
652      if (nc_close(ncid)) ERR;
653
654      /* Open the file and check attributes. */
655      if (nc_open(FILE_NAME, 0, &ncid)) ERR;
656      for (v=0; v<2; v++)
657      {
658  if (nc_inq_att(ncidvATT_TEXT_NAME, &att_type, &att_len)) ERR;
659  if (att_type != NC_CHAR || att_len != strlen(speech) + 1) ERR;
660  if (!(speech_in = malloc(att_len + 1))) ERR;
661  if (nc_get_att_text(ncidvATT_TEXT_NAMEspeech_in)) ERR;
662  if (strcmp(speechspeech_in)) ERR;
663  free(speech_in);
664  if (nc_get_att_schar(ncidvATT_SCHAR_NAMEschar_in)) ERR;
665  for (i = 0; i < ATT_LENi++)
666     if (schar_in[i] != schar_out[i]) ERR;
667  if (nc_get_att_short(ncidvATT_SHORT_NAMEshort_in)) ERR;
668  for (i = 0; i < ATT_LENi++)
669     if (short_in[i] != short_out[i]) ERR;
670  if (nc_get_att_int(ncidvATT_INT_NAMEint_in)) ERR;
671  for (i = 0; i < ATT_LENi++)
672     if (int_in[i] != int_out[i]) ERR;
673  if (nc_get_att_float(ncidvATT_FLOAT_NAMEfloat_in)) ERR;
674  for (i = 0; i < ATT_LENi++)
675     if (float_in[i] != float_out[i]) ERR;
676  if (nc_get_att_double(ncidvATT_DOUBLE_NAMEdouble_in)) ERR;
677  for (i = 0; i < ATT_LENi++)
678     if (double_in[i] != double_out[i]) ERR;
679      }
680      if (nc_close(ncid)) ERR;
681   }
682   SUMMARIZE_ERR;
683   printf("*** testing zero-length attributes...");
684   {
685      int ncid;
686
687      /* Create a file with a global attribute of each type of zero length. */
688      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
689      if (nc_put_att_text(ncidNC_GLOBALATT_TEXT_NAME, 0, NULL)) ERR;
690      if (nc_put_att_schar(ncidNC_GLOBALATT_SCHAR_NAMENC_BYTE, 0, NULL)) ERR;
691      if (nc_put_att_uchar(ncidNC_GLOBALATT_UCHAR_NAMENC_UBYTE, 0, uchar_out)) ERR;
692      if (nc_put_att_short(ncidNC_GLOBALATT_SHORT_NAMENC_SHORT, 0, NULL)) ERR;
693      if (nc_put_att_int(ncidNC_GLOBALATT_INT_NAMENC_INT, 0, NULL)) ERR;
694      if (nc_put_att_float(ncidNC_GLOBALATT_FLOAT_NAMENC_FLOAT, 0, NULL)) ERR;
695      if (nc_put_att_double(ncidNC_GLOBALATT_DOUBLE_NAMENC_DOUBLE, 0, NULL)) ERR;
696      if (nc_close(ncid)) ERR;
697   }
698
699   /* Make sure we can read all these zero-length atts. */
700   {
701      int ncid;
702      signed char schar_in[ATT_LEN];
703      unsigned char uchar_in[ATT_LEN];
704      short short_in[ATT_LEN];
705      int int_in[ATT_LEN];
706      float float_in[ATT_LEN];
707      double double_in[ATT_LEN];
708      size_t len;
709      nc_type xtype;
710
711      if (nc_open(FILE_NAME, 0, &ncid)) ERR;
712      if (nc_get_att_text(ncidNC_GLOBALATT_TEXT_NAMENULL)) ERR;
713      if (nc_inq_att(ncidNC_GLOBALATT_TEXT_NAME, &xtype, &len)) ERR;
714      if (len || xtype != NC_CHARERR;
715      if (nc_get_att_schar(ncidNC_GLOBALATT_SCHAR_NAMEschar_in)) ERR;
716      if (nc_inq_att(ncidNC_GLOBALATT_SCHAR_NAME, &xtype, &len)) ERR;
717      if (len || xtype != NC_BYTEERR;
718      if (nc_get_att_uchar(ncidNC_GLOBALATT_UCHAR_NAMEuchar_in)) ERR;
719      if (nc_inq_att(ncidNC_GLOBALATT_UCHAR_NAME, &xtype, &len)) ERR;
720      if (len || xtype != NC_UBYTEERR;
721      if (nc_get_att_short(ncidNC_GLOBALATT_SHORT_NAMEshort_in)) ERR;
722      if (nc_inq_att(ncidNC_GLOBALATT_SHORT_NAME, &xtype, &len)) ERR;
723      if (len || xtype != NC_SHORTERR;
724      if (nc_get_att_int(ncidNC_GLOBALATT_INT_NAMEint_in)) ERR;
725      if (nc_inq_att(ncidNC_GLOBALATT_INT_NAME, &xtype, &len)) ERR;
726      if (len || xtype != NC_INTERR;
727      if (nc_get_att_float(ncidNC_GLOBALATT_FLOAT_NAMEfloat_in)) ERR;
728      if (nc_inq_att(ncidNC_GLOBALATT_FLOAT_NAME, &xtype, &len)) ERR;
729      if (len || xtype != NC_FLOATERR;
730      if (nc_get_att_double(ncidNC_GLOBALATT_DOUBLE_NAMEdouble_in)) ERR;
731      if (nc_inq_att(ncidNC_GLOBALATT_DOUBLE_NAME, &xtype, &len)) ERR;
732      if (len || xtype != NC_DOUBLEERR;
733      /* Conversions no longer result in range errors, since there's no data. */
734      if (nc_get_att_schar(ncidNC_GLOBALATT_DOUBLE_NAMEschar_in)) ERR;
735      if (nc_get_att_schar(ncidNC_GLOBALATT_FLOAT_NAMEschar_in)) ERR;
736      if (nc_get_att_schar(ncidNC_GLOBALATT_INT_NAMEschar_in)) ERR;
737      if (nc_get_att_schar(ncidNC_GLOBALATT_SHORT_NAMEschar_in)) ERR;
738      if (nc_close(ncid)) ERR;
739   }
740
741   SUMMARIZE_ERR;
742   printf("*** testing zero-length attributes and redef...");
743   {
744      int ncid;
745      signed char schar_in[ATT_LEN];
746      unsigned char uchar_in[ATT_LEN];
747      short short_in[ATT_LEN];
748      int int_in[ATT_LEN];
749      float float_in[ATT_LEN];
750      double double_in[ATT_LEN];
751
752
753      /* Create a file with a global attribute of each type of zero length. */
754      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
755      if (nc_enddef(ncid)) ERR;
756      if (nc_redef(ncid)) ERR;
757      if (nc_put_att_text(ncidNC_GLOBALATT_TEXT_NAME, 0, NULL)) ERR;
758      if (nc_put_att_schar(ncidNC_GLOBALATT_SCHAR_NAMENC_BYTE, 0, NULL)) ERR;
759      if (nc_put_att_uchar(ncidNC_GLOBALATT_UCHAR_NAMENC_UBYTE, 0, uchar_out)) ERR;
760      if (nc_put_att_short(ncidNC_GLOBALATT_SHORT_NAMENC_SHORT, 0, NULL)) ERR;
761      if (nc_put_att_int(ncidNC_GLOBALATT_INT_NAMENC_INT, 0, NULL)) ERR;
762      if (nc_put_att_float(ncidNC_GLOBALATT_FLOAT_NAMENC_FLOAT, 0, NULL)) ERR;
763      if (nc_put_att_double(ncidNC_GLOBALATT_DOUBLE_NAMENC_DOUBLE, 0, NULL)) ERR;
764      if (nc_close(ncid)) ERR;
765
766      /* Make sure we can read all these zero-length atts added during a
767       * redef. */
768      if (nc_open(FILE_NAME, 0, &ncid)) ERR;
769      if (nc_get_att_text(ncidNC_GLOBALATT_TEXT_NAMENULL)) ERR;
770      if (nc_get_att_schar(ncidNC_GLOBALATT_SCHAR_NAMEschar_in)) ERR;
771      if (nc_get_att_uchar(ncidNC_GLOBALATT_UCHAR_NAMEuchar_in)) ERR;
772      if (nc_get_att_short(ncidNC_GLOBALATT_SHORT_NAMEshort_in)) ERR;
773      if (nc_get_att_int(ncidNC_GLOBALATT_INT_NAMEint_in)) ERR;
774      if (nc_get_att_float(ncidNC_GLOBALATT_FLOAT_NAMEfloat_in)) ERR;
775      if (nc_get_att_double(ncidNC_GLOBALATT_DOUBLE_NAMEdouble_in)) ERR;
776      /* Conversions no longer result in range errors, since there's no data. */
777      if (nc_get_att_schar(ncidNC_GLOBALATT_DOUBLE_NAMEschar_in)) ERR;
778      if (nc_get_att_schar(ncidNC_GLOBALATT_FLOAT_NAMEschar_in)) ERR;
779      if (nc_get_att_schar(ncidNC_GLOBALATT_INT_NAMEschar_in)) ERR;
780      if (nc_get_att_schar(ncidNC_GLOBALATT_SHORT_NAMEschar_in)) ERR;
781      if (nc_close(ncid)) ERR;
782   }
783   SUMMARIZE_ERR;
784
785   printf("*** testing attribute deletes and renames...");
786   {
787      int ncidvariddimids[2];
788      nc_type att_type;
789      size_t att_len;
790      char *speech_in;
791      char name_in[NC_MAX_NAME + 1];
792      int attid_innatts_in;
793      int int_out[ATT_LEN] = {-100000, 128, 100000};
794
795      /* Create a file with a global attribute. */
796      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
797      if (nc_put_att_text(ncidNC_GLOBALATT_TEXT_NAME, strlen(speech)+1,
798   speech)) ERR;
799      if (nc_close(ncid)) ERR;
800
801      /* Rename it. */
802      if (nc_open(FILE_NAMENC_WRITE, &ncid)) ERR;
803      if (nc_inq_attid(ncidNC_GLOBALATT_TEXT_NAME, &attid_in)) ERR;
804      if (attid_in != 0) ERR;
805      if (nc_inq_attname(ncidNC_GLOBALattid_inname_in)) ERR;
806      if (strcmp(name_inATT_TEXT_NAME)) ERR;
807      if (nc_rename_att(ncidNC_GLOBALATT_TEXT_NAMEATT_TEXT_NAME2)) ERR;
808      if (nc_inq_attname(ncidNC_GLOBALattid_inname_in)) ERR;
809      if (strcmp(name_inATT_TEXT_NAME2)) ERR;
810      if (nc_close(ncid)) ERR;
811
812      if (nc_open(FILE_NAMENC_WRITE, &ncid)) ERR;
813      if (nc_inq_att(ncidNC_GLOBALATT_TEXT_NAME2, &att_type, &att_len)) ERR;
814      if (att_type != NC_CHAR || att_len != strlen(speech) + 1) ERR;
815      if (!(speech_in = malloc(att_len + 1))) ERR;
816      if (nc_get_att_text(ncidNC_GLOBALATT_TEXT_NAME2speech_in)) ERR;
817      if (strcmp(speechspeech_in)) ERR;
818      free(speech_in);
819      if (nc_get_att_text(ncidNC_GLOBALATT_TEXT_NAMEspeech_in) != NC_ENOTATTERR;
820      if (nc_close(ncid)) ERR;
821
822      /* Now delete the att. */
823      if (nc_open(FILE_NAMENC_WRITE, &ncid)) ERR;
824      if (nc_del_att(ncidNC_GLOBALATT_TEXT_NAME2)) ERR;
825      if (nc_close(ncid)) ERR;
826
827      /* Now create a file with a variable, which has an att. */
828      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
829      if (nc_put_att_text(ncidNC_GLOBALATT_TEXT_NAME, strlen(speech)+1, speech)) ERR;
830      if (nc_def_dim(ncidDIM1_NAMEDIM1_LEN, &dimids[0])) ERR;
831      if (nc_def_dim(ncidDIM2_NAMEDIM2_LEN, &dimids[1])) ERR;
832      if (nc_def_var(ncidVAR1_NAMENC_INT, 2, dimids, &varid)) ERR;
833      if (nc_put_att_int(ncidvaridATT_INT_NAMENC_INT, 3, int_out)) ERR;
834      if (nc_close(ncid)) ERR;
835
836      /* Reopen the file and delete it. Make sure it's gone. */
837      if (nc_open(FILE_NAMENC_WRITE, &ncid)) ERR;
838      if (nc_del_att(ncid, 0, ATT_INT_NAME)) ERR;
839      if (nc_close(ncid)) ERR;
840
841      /* Reopen the file and readd the attribute. Enddef and redef,
842       * and delete it, then check to make sure it's gone. */
843      if (nc_open(FILE_NAMENC_WRITE, &ncid)) ERR;
844      if (nc_put_att_int(ncidvaridATT_INT_NAMENC_INT, 3, int_out)) ERR;
845      if (nc_enddef(ncid)) ERR;
846      if (nc_redef(ncid)) ERR;
847      if (nc_del_att(ncid, 0, ATT_INT_NAME)) ERR;
848      if (nc_inq_varnatts(ncid, 0, &natts_in)) ERR;
849      if (natts_in != 0) ERR;
850      if (nc_close(ncid)) ERR;
851   }
852
853   SUMMARIZE_ERR;
854   printf("*** testing attribute create order...");
855
856#define ATT0 "Maturin"
857#define ATT1 "Aubery"
858   {
859      int ncidvariddimids[2];
860      int attid_in;
861      const int number = 42;
862
863      /* Create a file with several global attributes. */
864      if (nc_create(FILE_NAMENC_NETCDF4|NC_CLASSIC_MODEL, &ncid)) ERR;
865      if (nc_put_att_int(ncidNC_GLOBALATT0NC_INT, 1, &number)) ERR;
866      if (nc_put_att_int(ncidNC_GLOBALATT1NC_INT, 1, &number)) ERR;
867      if (nc_close(ncid)) ERR;
868
869      /* Open it and check the order. */
870      if (nc_open(FILE_NAMENC_WRITE, &ncid)) ERR;
871      if (nc_inq_attid(ncidNC_GLOBALATT0, &attid_in)) ERR;
872      if (attid_in != 0) ERR;
873      if (nc_inq_attid(ncidNC_GLOBALATT1, &attid_in)) ERR;
874      if (attid_in != 1) ERR;
875      if (nc_close(ncid)) ERR;
876
877      /* Now create a file with a variable, which has two atts. */
878      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
879      if (nc_def_dim(ncidDIM1_NAMEDIM1_LEN, &dimids[0])) ERR;
880      if (nc_def_dim(ncidDIM2_NAMEDIM2_LEN, &dimids[1])) ERR;
881      if (nc_def_var(ncidVAR1_NAMENC_INT, 2, dimids, &varid)) ERR;
882      if (nc_put_att_int(ncidvaridATT0NC_INT, 1, &number)) ERR;
883      if (nc_put_att_int(ncidvaridATT1NC_INT, 1, &number)) ERR;
884      if (nc_close(ncid)) ERR;
885
886      /* Reopen the file and check the order of the attributes on the var. */
887      if (nc_open(FILE_NAMENC_WRITE, &ncid)) ERR;
888      if (nc_inq_attid(ncid, 0, ATT0, &attid_in)) ERR;
889      if (attid_in != 0) ERR;
890      if (nc_inq_attid(ncid, 0, ATT1, &attid_in)) ERR;
891      if (attid_in != 1) ERR;
892      if (nc_close(ncid)) ERR;
893   }
894
895   SUMMARIZE_ERR;
896   printf("*** testing attribute ordering some more...");
897
898#define VAR_NAME "i"
899#define A1_NAME "i"
900#define A2_NAME "f"
901#define A3_NAME "d"
902#define A1_LEN 3
903#define A2_LEN 4
904#define A3_LEN 5
905   {
906      int ncid;
907      int varidnattsnvars;
908      double dvalue[] = {999.99, 999.99, 999.99, 999.99, 999.99};
909      int varids[1];
910      char name_in[NC_MAX_NAME + 1];
911
912      /* Create a file with one var, and attach three atts to it. */
913      if (nc_create(FILE_NAMENC_NETCDF4|NC_CLASSIC_MODEL, &ncid)) ERR;
914      if (nc_def_var(ncidVAR_NAMENC_INT, 0, NULL, &varid)) ERR;
915      if (nc_put_att_double(ncidvaridA1_NAMENC_INTA1_LENdvalue)) ERR;
916      if (nc_put_att_double(ncidvaridA2_NAMENC_INTA2_LENdvalue)) ERR;
917      if (nc_put_att_double(ncidvaridA3_NAMENC_INTA3_LENdvalue)) ERR;
918      if (nc_close(ncid)) ERR;
919
920      /* Reopen the file and check. */
921      if (nc_open(FILE_NAME, 0, &ncid)) ERR;
922      if (nc_inq_varids(ncid, &nvarsvarids)) ERR;
923      if (nvars != 1 || varids[0] != 0) ERR;
924      if (nc_inq_varnatts(ncid, 0, &natts)) ERR;
925      if (natts != 3) ERR;
926      if (nc_inq_attname(ncid, 0, 0, name_in)) ERR;
927      if (strcmp(name_inA1_NAME)) ERR;
928      if (nc_inq_attname(ncid, 0, 1, name_in)) ERR;
929      if (strcmp(name_inA2_NAME)) ERR;
930      if (nc_inq_attname(ncid, 0, 2, name_in)) ERR;
931      if (strcmp(name_inA3_NAME)) ERR;
932
933      /* Close up shop. */
934      if (nc_close(ncid)) ERR;
935   }
936
937   SUMMARIZE_ERR;
938   printf("*** testing attribute ordering even more...");
939
940   /* Test the ordering of atts for each cmode. */
941   if (tst_att_ordering(NC_CLOBBER)) ERR;
942   if (tst_att_ordering(NC_CLOBBER|NC_64BIT_OFFSET)) ERR;
943   if (tst_att_ordering(NC_CLOBBER|NC_NETCDF4)) ERR;
944   if (tst_att_ordering(NC_CLOBBER|NC_NETCDF4|NC_CLASSIC_MODEL)) ERR;
945
946   SUMMARIZE_ERR;
947   printf("*** testing attributes and enddef/redef...");
948
949#define ATT_1 "a"
950#define ATT_2 "b"
951#define ATT_3 "c"
952   {
953      int ncidatt = 1;
954
955      if (nc_create(FILE_NAMENC_NETCDF4|NC_CLASSIC_MODEL|NC_CLOBBER, &ncid)) ERR;
956      if (nc_enddef(ncid)) ERR;
957      if (nc_redef(ncid)) ERR;
958      if (nc_put_att(ncidNC_GLOBALATT_1NC_INT, 1, &att)) ERR;
959      if (nc_put_att(ncidNC_GLOBALATT_2NC_INT, 1, &att)) ERR;
960      if (nc_put_att(ncidNC_GLOBALATT_3NC_INT, 1, &att)) ERR;
961
962      if (nc_close(ncid)) ERR;
963
964      if (nc_open(FILE_NAME, 0, &ncid)) ERR;
965      if (nc_close(ncid)) ERR;
966   }
967
968   SUMMARIZE_ERR;
969   printf("*** testing copy of simple global atts...");
970   {
971      int ncidncid2;
972      nc_type att_type;
973      size_t att_len;
974      int i;
975
976      char *speech_in;
977      signed char schar_in[ATT_LEN], schar_out[ATT_LEN] = {NC_MIN_BYTE, 1, NC_MAX_BYTE};
978      unsigned char uchar_in[ATT_LEN], uchar_out[ATT_LEN] = {0, 128, NC_MAX_CHAR};
979      short short_in[ATT_LEN], short_out[ATT_LEN] = {NC_MIN_SHORT, -128, NC_MAX_SHORT};
980      int int_in[ATT_LEN], int_out[ATT_LEN] = {-100000, 128, 100000};
981      float float_in[ATT_LEN], float_out[ATT_LEN] = {.5, 0.25, 0.125};
982      double double_in[ATT_LEN], double_out[ATT_LEN] = {0.25, .5, 0.125};
983      unsigned short ushort_in[ATT_LEN], ushort_out[ATT_LEN] = {0, 128, NC_MAX_USHORT};
984      unsigned int uint_in[ATT_LEN], uint_out[ATT_LEN] = {0, 128, NC_MAX_UINT};
985      unsigned long long ulonglong_in[ATT_LEN], ulonglong_out[ATT_LEN] = {0, 128, 18446744073709551612ULL};
986      long long longlong_in[ATT_LEN], longlong_out[ATT_LEN] = {NC_MIN_INT64, 128, NC_MAX_INT64};
987
988      /* Create a file with a global attribute of each type. */
989      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
990      if (nc_put_att_text(ncidNC_GLOBALATT_TEXT_NAME, strlen(speech)+1, speech)) ERR;
991      if (nc_put_att_schar(ncidNC_GLOBALATT_SCHAR_NAMENC_BYTEATT_LENschar_out)) ERR;
992      if (nc_put_att_uchar(ncidNC_GLOBALATT_UCHAR_NAMENC_UBYTEATT_LENuchar_out)) ERR;
993      if (nc_put_att_short(ncidNC_GLOBALATT_SHORT_NAMENC_SHORTATT_LENshort_out)) ERR;
994      if (nc_put_att_int(ncidNC_GLOBALATT_INT_NAMENC_INTATT_LENint_out)) ERR;
995      if (nc_put_att_float(ncidNC_GLOBALATT_FLOAT_NAMENC_FLOATATT_LENfloat_out)) ERR;
996      if (nc_put_att_double(ncidNC_GLOBALATT_DOUBLE_NAMENC_DOUBLEATT_LENdouble_out)) ERR;
997      if (nc_put_att_ushort(ncidNC_GLOBALATT_USHORT_NAMENC_USHORTATT_LENushort_out)) ERR;
998      if (nc_put_att_uint(ncidNC_GLOBALATT_UINT_NAMENC_UINTATT_LENuint_out)) ERR;
999      if (nc_put_att_longlong(ncidNC_GLOBALATT_INT64_NAMENC_INT64ATT_LENlonglong_out)) ERR;
1000      if (nc_put_att_ulonglong(ncidNC_GLOBALATT_UINT64_NAMENC_UINT64ATT_LENulonglong_out)) ERR;
1001
1002      /* Create another file and copy all the attributes. */
1003      if (nc_create(FILE_NAME2NC_NETCDF4, &ncid2)) ERR;
1004      if (nc_copy_att(ncidNC_GLOBALATT_TEXT_NAMEncid2NC_GLOBAL)) ERR;
1005      if (nc_copy_att(ncidNC_GLOBALATT_SCHAR_NAMEncid2NC_GLOBAL)) ERR;
1006      if (nc_copy_att(ncidNC_GLOBALATT_UCHAR_NAMEncid2NC_GLOBAL)) ERR;
1007      if (nc_copy_att(ncidNC_GLOBALATT_SHORT_NAMEncid2NC_GLOBAL)) ERR;
1008      if (nc_copy_att(ncidNC_GLOBALATT_INT_NAMEncid2NC_GLOBAL)) ERR;
1009      if (nc_copy_att(ncidNC_GLOBALATT_FLOAT_NAMEncid2NC_GLOBAL)) ERR;
1010      if (nc_copy_att(ncidNC_GLOBALATT_DOUBLE_NAMEncid2NC_GLOBAL)) ERR;
1011      if (nc_copy_att(ncidNC_GLOBALATT_USHORT_NAMEncid2NC_GLOBAL)) ERR;
1012      if (nc_copy_att(ncidNC_GLOBALATT_UINT_NAMEncid2NC_GLOBAL)) ERR;
1013      if (nc_copy_att(ncidNC_GLOBALATT_INT64_NAMEncid2NC_GLOBAL)) ERR;
1014      if (nc_copy_att(ncidNC_GLOBALATT_UINT64_NAMEncid2NC_GLOBAL)) ERR;
1015
1016      /* Close both files. */
1017      if (nc_close(ncid)) ERR;
1018      if (nc_close(ncid2)) ERR;
1019
1020      /* Open the file and check attributes. */
1021      if (nc_open(FILE_NAME2, 0, &ncid)) ERR;
1022      /* Check text. */
1023      if (nc_inq_att(ncidNC_GLOBALATT_TEXT_NAME, &att_type, &att_len)) ERR;
1024      if (att_type != NC_CHAR || att_len != strlen(speech) + 1) ERR;
1025      if (!(speech_in = malloc(att_len + 1))) ERR;
1026      if (nc_get_att_text(ncidNC_GLOBALATT_TEXT_NAMEspeech_in)) ERR;
1027      if (strcmp(speechspeech_in)) ERR;
1028      free(speech_in);
1029      /* Check numeric values. */
1030      if (nc_get_att_schar(ncidNC_GLOBALATT_SCHAR_NAMEschar_in)) ERR;
1031      for (i = 0; i < ATT_LENi++)
1032  if (schar_in[i] != schar_out[i]) ERR;
1033      if (nc_get_att_uchar(ncidNC_GLOBALATT_UCHAR_NAMEuchar_in)) ERR;
1034      for (i = 0; i < ATT_LENi++)
1035  if (uchar_in[i] != uchar_out[i]) ERR;
1036      if (nc_get_att_short(ncidNC_GLOBALATT_SHORT_NAMEshort_in)) ERR;
1037      for (i = 0; i < ATT_LENi++)
1038  if (short_in[i] != short_out[i]) ERR;
1039      if (nc_get_att_int(ncidNC_GLOBALATT_INT_NAMEint_in)) ERR;
1040      for (i = 0; i < ATT_LENi++)
1041  if (int_in[i] != int_out[i]) ERR;
1042      if (nc_get_att_float(ncidNC_GLOBALATT_FLOAT_NAMEfloat_in)) ERR;
1043      for (i = 0; i < ATT_LENi++)
1044  if (float_in[i] != float_out[i]) ERR;
1045      if (nc_get_att_double(ncidNC_GLOBALATT_DOUBLE_NAMEdouble_in)) ERR;
1046      for (i = 0; i < ATT_LENi++)
1047  if (double_in[i] != double_out[i]) ERR;
1048      if (nc_get_att_ushort(ncidNC_GLOBALATT_USHORT_NAMEushort_in)) ERR;
1049      for (i = 0; i < ATT_LENi++)
1050  if (ushort_in[i] != ushort_out[i]) ERR;
1051      if (nc_get_att_uint(ncidNC_GLOBALATT_UINT_NAMEuint_in)) ERR;
1052      for (i = 0; i < ATT_LENi++)
1053  if (uint_in[i] != uint_out[i]) ERR;
1054      if (nc_get_att_longlong(ncidNC_GLOBALATT_INT64_NAMElonglong_in)) ERR;
1055      for (i = 0; i < ATT_LENi++)
1056  if (longlong_in[i] != longlong_out[i]) ERR;
1057      if (nc_get_att_ulonglong(ncidNC_GLOBALATT_UINT64_NAMEulonglong_in)) ERR;
1058      for (i = 0; i < ATT_LENi++)
1059  if (ulonglong_in[i] != ulonglong_out[i]) ERR;
1060      if (nc_close(ncid)) ERR;
1061   }
1062   SUMMARIZE_ERR;
1063   FINAL_RESULTS;
1064}


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