1/* This is part of the netCDF package. Copyright 2005 University
2   Corporation for Atmospheric Research/Unidata See COPYRIGHT file for
3   conditions of use. See www.unidata.ucar.edu for more info.
4
5   Test netcdf-4 variable length code.
6
7   $Id: tst_vl.c,v 1.30 2009/10/26 22:07:16 ed Exp $
8*/
9
10#include <nc_tests.h>
11#include "err_macros.h"
12#include "netcdf.h"
13
14#define FILE_NAME "tst_vl.nc"
15#define FILE_NAME2 "tst_vl_2.nc"
16#define DIM_LEN 3
17#define VLEN_NAME "vlen_name"
18#define ATT_NAME "att_name"
19#define DIM_NAME "dim"
20#define VAR_NAME "var"
21#define PHONY_VAL -99
22
23/* Use this struct to hold vlen data: */
24/* typedef struct  { */
25/* size_t len;  Length of VL data (in base type units)        */
26/* void *p;     Pointer to VL data          */
27/* } hvl_t; */
28int
29main(int argc, char **argv)
30{
31   printf("\n*** Testing netcdf-4 variable length type functions.\n");
32   printf("*** testing vlen (of ints) attribute...");
33   {
34      int ncidtypeid;
35      nc_vlen_t data[DIM_LEN], data_in[DIM_LEN];
36      size_t size_in;
37      nc_type base_nc_type_in;
38      char name_in[NC_MAX_NAME + 1];
39      int *phonyclass_in;
40      size_t len_in;
41      int ij;
42
43      /* Create phony data. */
44      for (i=0; i<DIM_LENi++)
45      {
46  if (!(phony = malloc(sizeof(int) * (i+1))))
47     return NC_ENOMEM;
48  for (j = 0; j < i + 1; j++)
49     phony[j] = PHONY_VAL;
50  data[i].p = phony;
51  data[i].len = i+1;
52      }
53
54      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
55      if (nc_def_vlen(ncidVLEN_NAMENC_INT, &typeid)) ERR;
56      if (nc_inq_vlen(ncidtypeidname_in, &size_in, &base_nc_type_in)) ERR;
57      if (base_nc_type_in != NC_INT || (size_in != sizeof(nc_vlen_t) || strcmp(name_inVLEN_NAME))) ERR;
58      if (nc_inq_user_type(ncidtypeidname_in, &size_in, &base_nc_type_inNULL, &class_in)) ERR;
59      if (base_nc_type_in != NC_INT || (size_in != sizeof(nc_vlen_t) || strcmp(name_inVLEN_NAME))) ERR;
60      if (nc_inq_type(ncidtypeidname_in, &size_in)) ERR;
61      if ((size_in != sizeof(nc_vlen_t) || strcmp(name_inVLEN_NAME))) ERR;
62      if (nc_inq_compound(ncidtypeidname_in, &size_inNULL) != NC_EBADTYPEERR;
63      if (nc_put_att(ncidNC_GLOBALATT_NAMEtypeidDIM_LENdata)) ERR;
64      if (nc_close(ncid)) ERR;
65
66      /* Reset data to make sure it was really copied. */
67      for (i=0; i<DIM_LENi++)
68  for (j = 0; j < i + 1; j++)
69     ((int *)(data[i].p))[j] = 0;
70
71      /* Check it out. */
72      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
73      if (nc_get_att(ncidNC_GLOBALATT_NAMEdata_in)) ERR;
74      for (i = 0; i < DIM_LENi++)
75      {
76  if (data_in[i].len != i + 1) ERR;
77  for (j = 0; j < data_in[i].lenj++)
78     if (*((int *)data_in[i].p) != PHONY_VAL)
79     {
80        printf("*((int *)data_in[%d].p = %d (0x%x)\n", i, *((int *)data_in[i].p),
81       *((int *)data_in[i].p));
82        ERR;
83        return 2;
84     }
85      }
86      if (nc_inq_att(ncidNC_GLOBALATT_NAME, &typeid, &len_in)) ERR;
87      if (len_in != DIM_LENERR;
88      if (nc_inq_vlen(ncidtypeidname_in, &size_in, &base_nc_type_in)) ERR;
89      if (base_nc_type_in != NC_INT || (size_in != 4 && strcmp(name_inVLEN_NAME)))
90      {
91  printf("base_nc_type_in = %d size_in = %d name_in = %s\n", base_nc_type_in,
92 (int)size_inname_in);
93  ERR;
94      }
95      if (nc_inq_user_type(ncidtypeidname_in, &size_in, &base_nc_type_inNULL, &class_in)) ERR;
96      if (base_nc_type_in != NC_INT || (size_in != sizeof(nc_vlen_t) || strcmp(name_inVLEN_NAME))) ERR;
97      if (nc_close(ncid)) ERR;
98
99      /* Free the memory used in our phony data. */
100      for (i=0; i<DIM_LENi++)
101  if (nc_free_vlen(&data[i]) || nc_free_vlen(&data_in[i])) ERR;
102   }
103   SUMMARIZE_ERR;
104   printf("*** testing vlen (of ints) variable...");
105   {
106      int dimidvariddimids[] = {0};
107      char var_name[NC_MAX_NAME+1];
108      int nvarsnattsndimsunlimdimiddimids_var[1];
109      nc_type var_type;
110      int ncidtypeid;
111      nc_vlen_t data[DIM_LEN], data_in[DIM_LEN];
112      int *phony;
113      int ij;
114
115      /* Create phony data. */
116      for (i=0; i<DIM_LENi++)
117      {
118  if (!(phony = malloc(sizeof(int) * (i+1))))
119     return NC_ENOMEM;
120  for (j=0; j<i+1; j++)
121     phony[j] = PHONY_VAL;
122  data[i].p = phony;
123  data[i].len = i+1;
124      }
125
126      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
127      if (nc_def_vlen(ncid, "name1", NC_INT, &typeid)) ERR;
128      if (nc_def_dim(ncidDIM_NAMEDIM_LEN, &dimid)) ERR;
129      if (nc_def_var(ncidVAR_NAMEtypeid, 1, dimids, &varid)) ERR;
130      if (nc_put_var(ncidvariddata)) ERR;
131      if (nc_close(ncid)) ERR;
132
133      /* Check it out. */
134      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
135      if (nc_inq(ncid, &ndims, &nvars, &natts, &unlimdimid)) ERR;
136      if (ndims != 1 || nvars != 1 || natts != 0 || unlimdimid != -1) ERR;
137      if (nc_inq_var(ncid, 0, var_name, &var_type, &ndimsdimids_var, &natts)) ERR;
138      if (ndims != 1 || strcmp(var_nameVAR_NAME) ||
139   dimids_var[0] != dimids[0] || natts != 0) ERR;
140      if (nc_get_var(ncid, 0, data_in)) ERR;
141      for (i=0; i<DIM_LENi++)
142  for (j=0; j<data_in[i].lenj++)
143     if (*((int *)data_in[i].p) != *((int *)data[i].p))
144     {
145        printf("*((int *)data_in[%d].p = %d (0x%x)\n", i, *((int *)data_in[i].p),
146       *((int *)data_in[i].p));
147        ERR;
148        return 2;
149     }
150      if (nc_close(ncid)) ERR;
151
152      /* Free the memory used in our phony data. */
153      for (i=0; i<DIM_LENi++)
154  if (nc_free_vlen(&data[i]) || nc_free_vlen(&data_in[i])) ERR;
155   }
156
157   SUMMARIZE_ERR;
158   printf("*** testing vlen (of ints) attribute copy...");
159   {
160      int ncid1ncid2typeid1typeid2;
161      nc_vlen_t data[DIM_LEN], data_in[DIM_LEN];
162      size_t size_in;
163      nc_type base_nc_type_in;
164      char name_in[NC_MAX_NAME + 1];
165      int *phonyclass_in;
166      size_t len_in;
167      int ij;
168
169      /* Create phony data. */
170      for (i=0; i<DIM_LENi++)
171      {
172  if (!(phony = malloc(sizeof(int) * (i+1))))
173     return NC_ENOMEM;
174  for (j = 0; j < i + 1; j++)
175     phony[j] = PHONY_VAL;
176  data[i].p = phony;
177  data[i].len = i+1;
178      }
179
180      /* Create two files with the same vlen type. */
181      if (nc_create(FILE_NAMENC_NETCDF4, &ncid1)) ERR;
182      if (nc_create(FILE_NAME2NC_NETCDF4, &ncid2)) ERR;
183      if (nc_def_vlen(ncid1VLEN_NAMENC_INT, &typeid1)) ERR;
184      if (nc_def_vlen(ncid2VLEN_NAMENC_INT, &typeid2)) ERR;
185      if (nc_put_att(ncid1NC_GLOBALATT_NAMEtypeid1DIM_LENdata)) ERR;
186      if (nc_copy_att(ncid1NC_GLOBALATT_NAMEncid2NC_GLOBAL)) ERR;
187      if (nc_close(ncid1)) ERR;
188      if (nc_close(ncid2)) ERR;
189
190      /* Reset data to make sure it was really copied. */
191      for (i=0; i<DIM_LENi++)
192  for (j = 0; j < i + 1; j++)
193     ((int *)(data[i].p))[j] = 0;
194
195      /* Check it out. */
196      if (nc_open(FILE_NAME2NC_NOWRITE, &ncid2)) ERR;
197      if (nc_get_att(ncid2NC_GLOBALATT_NAMEdata_in)) ERR;
198      for (i = 0; i < DIM_LENi++)
199      {
200  if (data_in[i].len != i + 1) ERR;
201  for (j = 0; j < data_in[i].lenj++)
202     if (*((int *)data_in[i].p) != PHONY_VAL)
203     {
204        printf("*((int *)data_in[%d].p = %d (0x%x)\n", i, *((int *)data_in[i].p),
205       *((int *)data_in[i].p));
206        ERR;
207        return 2;
208     }
209      }
210      if (nc_inq_att(ncid2NC_GLOBALATT_NAME, &typeid2, &len_in)) ERR;
211      if (len_in != DIM_LENERR;
212      if (nc_inq_vlen(ncid2typeid2name_in, &size_in, &base_nc_type_in)) ERR;
213      if (base_nc_type_in != NC_INT || (size_in != 4 && strcmp(name_inVLEN_NAME)))
214      {
215  printf("base_nc_type_in = %d size_in = %d name_in = %s\n", base_nc_type_in,
216 (int)size_inname_in);
217  ERR;
218      }
219      if (nc_inq_user_type(ncid2typeid2name_in, &size_in, &base_nc_type_inNULL, &class_in)) ERR;
220      if (base_nc_type_in != NC_INT || (size_in != sizeof(nc_vlen_t) || strcmp(name_inVLEN_NAME))) ERR;
221      if (nc_close(ncid2)) ERR;
222
223      /* Free the memory used in our phony data. */
224      for (i=0; i<DIM_LENi++)
225  if (nc_free_vlen(&data[i]) || nc_free_vlen(&data_in[i])) ERR;
226   }
227   SUMMARIZE_ERR;
228   FINAL_RESULTS;
229}


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