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 copy of attributes.
6
7   $Id: tst_atts2.c,v 1.7 2010/05/05 22:15:32 dmh Exp $
8*/
9
10#include <nc_tests.h>
11#include "err_macros.h"
12#include "netcdf.h"
13
14#define FILE_NAME1 "tst_atts2.nc"
15#define FILE_NAME2 "tst_atts2_2.nc"
16
17int
18main(int argc, char **argv)
19{
20   printf("\n*** Testing netcdf-4 attribute copies.\n");
21   printf("*** testing compound attribute copy to different type of same name...");
22   {
23#define CMP_NAME1 "Ireland"
24#define I1_NAME "Cork"
25#define I2_NAME "Dublin"
26#define DIM_LEN 3
27#define ATT_NAME3 "Rain"
28#define NUM_FILES 2
29
30      int ncid[NUM_FILES], typeid;
31      char file_name[NUM_FILES][NC_MAX_NAME + 1] = {FILE_NAME1FILE_NAME2};
32      int i;
33      struct s1
34      {
35     int i1;
36     int i2;
37      };
38      struct s1 data[DIM_LEN];
39      struct s2
40      {
41     short i1;
42     int i2;
43      };
44
45      /* Create some phony data. */
46      for (i = 0; i < DIM_LENi++)
47      {
48  data[i].i1 = 32768;
49  data[i].i2 = 32767;
50      }
51
52      /* Create two files with different compound types of the same name. */
53      for (i = 0; i < NUM_FILESi++)
54  if (nc_create(file_name[i], NC_NETCDF4, &ncid[i])) ERR;
55
56      /* Define s1 in file 1. */
57      if (nc_def_compound(ncid[0], sizeof(struct s1), CMP_NAME1, &typeid)) ERR;
58      if (nc_insert_compound(ncid[0], typeidI1_NAME,
59      NC_COMPOUND_OFFSET(struct s1i1), NC_INT)) ERR;
60      if (nc_insert_compound(ncid[0], typeidI2_NAME,
61      NC_COMPOUND_OFFSET(struct s1i2), NC_INT)) ERR;
62
63      /* Define s2 in file 2, but named the same as s1. */
64      if (nc_def_compound(ncid[1], sizeof(struct s2), CMP_NAME1, &typeid)) ERR;
65      if (nc_insert_compound(ncid[1], typeidI1_NAME,
66      NC_COMPOUND_OFFSET(struct s2i1), NC_SHORT)) ERR;
67      if (nc_insert_compound(ncid[1], typeidI2_NAME,
68      NC_COMPOUND_OFFSET(struct s2i2), NC_INT)) ERR;
69
70
71      /* Write an att in one file. */
72      if (nc_put_att(ncid[0], NC_GLOBALATT_NAME3typeidDIM_LEN,
73      data)) ERR;
74
75      /* Try to copy. It must fail, because the two types are not the
76       * same. */
77      if (nc_copy_att(ncid[0], NC_GLOBALATT_NAME3ncid[1],
78       NC_GLOBAL) != NC_EBADTYPEERR;
79
80      /* Close the files. */
81      for (i = 0; i < NUM_FILESi++)
82  if (nc_close(ncid[i])) ERR;
83   }
84   SUMMARIZE_ERR;
85   printf("*** testing string attribute copy...");
86   {
87#define ATT_NAME "Irish_Leader"
88#define ATT_LEN 1
89      int ncid1ncid2;
90      const char *mc[ATT_LEN] = {"Michael Collins"};
91      char *mc_in;
92
93      /* Create a file with a string att. */
94      if (nc_create(FILE_NAME1NC_NETCDF4, &ncid1)) ERR;
95      if (nc_put_att_string(ncid1NC_GLOBALATT_NAMEATT_LENmc)) ERR;
96
97      /* Create another file, and copy the att. */
98      if (nc_create(FILE_NAME2NC_NETCDF4, &ncid2)) ERR;
99      if (nc_copy_att(ncid1NC_GLOBALATT_NAMEncid2NC_GLOBAL)) ERR;
100
101      /* Close up. */
102      if (nc_close(ncid1)) ERR;
103      if (nc_close(ncid2)) ERR;
104
105      /* Reopen file 2 and see that attribute is correct. */
106      if (nc_open(FILE_NAME2, 0, &ncid2)) ERR;
107      if (nc_get_att_string(ncid2NC_GLOBALATT_NAME, &mc_in)) ERR;
108      if (strcmp(mc[0], mc_in)) ERR;
109      if (nc_close(ncid2)) ERR;
110      if (nc_free_string(ATT_LEN, &mc_in)) ERR;
111
112  }
113   SUMMARIZE_ERR;
114   printf("*** testing non-string atomic attribute copy...");
115   {
116#define ATT_LEN 1
117#define NUM_ATT 5
118      int ncid1ncid2;
119      char name[NUM_ATT][NC_MAX_NAME + 1];
120      long long data = 0, data_in[NUM_ATT];
121      int a;
122
123      /* Create a file with non-string atomic atts. */
124      if (nc_create(FILE_NAME1NC_NETCDF4, &ncid1)) ERR;
125      for (a = 0; a < NUM_ATTa++)
126      {
127  sprintf(name[a], "atomic_att_type_%d", a + 1);
128  nc_put_att(ncid1NC_GLOBALname[a], a + 1, ATT_LEN,
129     (void *)&data);
130      }
131
132      /* Create another file, and copy the att. */
133      if (nc_create(FILE_NAME2NC_NETCDF4, &ncid2)) ERR;
134      for (a = 0; a < NUM_ATTa++)
135  if (nc_copy_att(ncid1NC_GLOBALname[a], ncid2NC_GLOBAL)) ERR;
136
137      /* Close up. */
138      if (nc_close(ncid1)) ERR;
139      if (nc_close(ncid2)) ERR;
140
141      /* Reopen file 2 and see that attributes are present. */
142      if (nc_open(FILE_NAME2, 0, &ncid2)) ERR;
143      for (a = 0; a < NUM_ATTa++)
144  nc_get_att(ncid1NC_GLOBALname[a], (void *)&data_in[a]);
145      if (nc_close(ncid2)) ERR;
146  }
147   SUMMARIZE_ERR;
148   printf("*** testing simple compound attribute copy...");
149   {
150#define CMP_NAME "cmp"
151#define I1 "i1"
152#define I2 "i2"
153#define DIM_LEN 3
154#define ATT_NAME2 "att"
155#define NUM_FILES 2
156
157      int ncid[NUM_FILES], typeid;
158      char file_name[NUM_FILES][NC_MAX_NAME + 1] = {FILE_NAME1FILE_NAME2};
159      int i;
160      struct s1
161      {
162     int i1;
163     int i2;
164      };
165      struct s1 data[DIM_LEN], data_in[DIM_LEN];
166
167      /* Create some phony data. */
168      for (i = 0; i < DIM_LENi++)
169      {
170  data[i].i1 = 5;
171  data[i].i2 = 10;
172      }
173
174      /* Create two files with the same compound type. */
175      for (i = 0; i < NUM_FILESi++)
176      {
177  if (nc_create(file_name[i], NC_NETCDF4, &ncid[i])) ERR;
178  if (nc_def_compound(ncid[i], sizeof(struct s1), CMP_NAME, &typeid)) ERR;
179  if (nc_insert_compound(ncid[i], typeidI1,
180 NC_COMPOUND_OFFSET(struct s1i1), NC_INT)) ERR;
181  if (nc_insert_compound(ncid[i], typeidI2,
182 NC_COMPOUND_OFFSET(struct s1i2), NC_INT)) ERR;
183      }
184
185      /* Write an att in one file and copy it. */
186      if (nc_put_att(ncid[0], NC_GLOBALATT_NAME2typeidDIM_LEN,
187      data)) ERR;
188
189      if (nc_copy_att(ncid[0], NC_GLOBALATT_NAME2ncid[1],
190       NC_GLOBAL)) ERR;
191
192      /* Close the files. */
193      for (i = 0; i < NUM_FILESi++)
194  if (nc_close(ncid[i])) ERR;
195
196      /* Open the second file and take a peek. */
197      if (nc_open(FILE_NAME1NC_WRITE, &ncid[1])) ERR;
198      if (nc_get_att(ncid[1], NC_GLOBALATT_NAME2data_in)) ERR;
199
200      for (i=0; i<DIM_LENi++)
201  if (data[i].i1 != data_in[i].i1 || data[i].i2 != data_in[i].i2ERR;
202      if (nc_close(ncid[1])) ERR;
203   }
204   SUMMARIZE_ERR;
205   printf("*** testing simple enum attribute copy...");
206   {
207#define DIM_LEN_10 10
208#define ATT_NAME2 "att"
209#define TYPE_NAME "Irish_Province_Type"
210#define NUM_FILES 2
211#define NUM_MEMBERS 4
212
213      int ncid[NUM_FILES], typeid;
214      char file_name[NUM_FILES][NC_MAX_NAME + 1] = {FILE_NAME1FILE_NAME2};
215      char member_name[NUM_MEMBERS][NC_MAX_NAME + 1] = {"Munster", "Connacht",
216 "Leinster", "Ulster"};
217      int member_value[NUM_MEMBERS] = {0, 1, 2, 3};
218      int data_in[DIM_LEN_10], data[DIM_LEN_10] = {0, 1, 2, 3, 0, 1, 2, 3, 0, 1};
219      int ij;
220
221      /* Create two files with the same enum type. */
222      for (i = 0; i < NUM_FILESi++)
223      {
224  if (nc_create(file_name[i], NC_NETCDF4, &ncid[i])) ERR;
225  if (nc_def_enum(ncid[i], NC_INTTYPE_NAME, &typeid)) ERR;
226  for (j = 0; j < NUM_MEMBERSj++)
227     if (nc_insert_enum(ncid[i], typeidmember_name[j],
228        &member_value[j])) ERR;
229      }
230
231      /* Write an att in one file and copy it. */
232      if (nc_put_att(ncid[0], NC_GLOBALATT_NAME2typeidDIM_LEN_10,
233      data)) ERR;
234
235      if (nc_copy_att(ncid[0], NC_GLOBALATT_NAME2ncid[1],
236       NC_GLOBAL)) ERR;
237
238      /* Close the files. */
239      for (i = 0; i < NUM_FILESi++)
240  if (nc_close(ncid[i])) ERR;
241
242      /* Open the second file and take a peek. */
243      if (nc_open(FILE_NAME1NC_WRITE, &ncid[1])) ERR;
244      if (nc_get_att(ncid[1], NC_GLOBALATT_NAME2data_in)) ERR;
245
246      /* Check the data. */
247      for (i = 0; i < DIM_LEN_10i++)
248  if (data[i] != data_in[i]) ERR;
249      if (nc_close(ncid[1])) ERR;
250   }
251   SUMMARIZE_ERR;
252   FINAL_RESULTS;
253}


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