1/* This is part of the netCDF package.
2   Copyright 2005 University Corporation for Atmospheric Research/Unidata
3   See COPYRIGHT file for conditions of use.
4
5   Test netcdf-4 compound type feature, even more.
6
7   $Id: tst_compounds3.c,v 1.8 2010/05/25 13:53:04 ed Exp $
8*/
9
10#include <config.h>
11#include <stdlib.h>
12#include <nc_tests.h>
13#include "err_macros.h"
14
15#define FILE_NAME "tst_compounds3.nc"
16#define S1_PACKED_NAME "s1_packed_compound_type_with_boring_name"
17#define S1_NAME "s1_compound_type_unwhimsiclaly_named"
18#define I_NAME "i_of_little_quirkiness"
19#define J_NAME "j_with_no_originality"
20#define DIM_NAME "intentionally_unimaginatevely_named_dimension"
21#define DIM_LEN 1
22#define VAR_NAME "deliberately_boring_variable"
23
24typedef struct g1_c_t {
25   float x;
26   double y;
27g1_c_t;
28typedef struct g2_d_t {
29   g1_c_t s1;
30g2_d_t;
31
32int
33main(int argc, char **argv)
34{
35   printf("\n*** Testing netcdf-4 compound types even more.\n");
36   printf("*** testing compound variable create from packed struct...");
37   {
38      int ncidtypeidvarid;
39      size_t nfields;
40      int dimid;
41      int ndimsnvarsnattsunlimdimid;
42      char name_in[NC_MAX_NAME + 1];
43      size_t size;
44      nc_type xtypefield_xtype;
45      int dimids[] = {0};
46      int field_ndimsfield_sizes[NC_TESTS_MAX_DIMS];
47      size_t offset;
48      int i;
49
50      struct s1_packed
51      {
52  short i;
53  long long j;
54      };
55      /* This packing extension works with GNU compilers... */
56      /* } __attribute__ ((__packed__));*/
57      struct s1
58      {
59  short i;
60  long long j;
61      };
62      struct s1_packed *data;
63      struct s1 *data_in;
64
65      if (!(data = calloc(sizeof(struct s1_packed), DIM_LEN))) ERR;
66      if (!(data_in = calloc(sizeof(struct s1), DIM_LEN))) ERR;
67
68      /* Create some phony data. */
69      for (i = 0; i < DIM_LENi++)
70      {
71  data[i].i = 100;
72  data[i].j = 1000000000000LL;
73      }
74
75      /* Create a file with a compound type. Write a little data. */
76      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
77      if (nc_def_compound(ncid, sizeof(struct s1_packed), S1_PACKED_NAME, &typeid)) ERR;
78      if (nc_inq_compound(ncidtypeidname_in, &size, &nfields)) ERR;
79      if (size != sizeof(struct s1_packed) || strcmp(name_inS1_PACKED_NAME) || nfieldsERR;
80      if (nc_insert_compound(ncidtypeidI_NAMENC_COMPOUND_OFFSET(struct s1_packedi),
81      NC_SHORT)) ERR;
82      if (nc_insert_compound(ncidtypeidJ_NAMENC_COMPOUND_OFFSET(struct s1_packedj),
83      NC_INT64)) ERR;
84      if (nc_def_dim(ncidDIM_NAMEDIM_LEN, &dimid)) ERR;
85      if (nc_def_var(ncidVAR_NAMEtypeid, 1, dimids, &varid)) ERR;
86      if (nc_put_var(ncidvariddata)) ERR;
87      if (nc_close(ncid)) ERR;
88
89      /* Open the file and take a peek. */
90      if (nc_open(FILE_NAMENC_WRITE, &ncid)) ERR;
91      if (nc_inq(ncid, &ndims, &nvars, &natts, &unlimdimid)) ERR;
92      if (ndims != 1 || nvars != 1 || natts != 0 || unlimdimid != -1) ERR;
93
94      /* Check the var and its type. */
95      if (nc_inq_var(ncid, 0, name_in, &xtype, &ndimsdimids, &natts)) ERR;
96      if (strcmp(name_inVAR_NAME) || ndims != 1 || natts != 0 || dimids[0] != 0) ERR;
97      if (nc_inq_compound(ncidxtypename_in, &size, &nfields)) ERR;
98      if (nfields != 2 || size != sizeof(struct s1) || strcmp(name_inS1_PACKED_NAME)) ERR;
99      if (nc_inq_compound_field(ncidxtype, 0, name_in, &offset, &field_xtype, &field_ndimsfield_sizes)) ERR;
100      if (field_ndimsERR;
101      if (strcmp(name_inI_NAME) || offset != NC_COMPOUND_OFFSET(struct s1i) ||
102   (field_xtype != NC_SHORT || field_ndims != 0)) ERR;
103      if (nc_inq_compound_field(ncidxtype, 1, name_in, &offset, &field_xtype, &field_ndims,
104 field_sizes)) ERR;
105      if (strcmp(name_inJ_NAME) || offset != NC_COMPOUND_OFFSET(struct s1j) ||
106   field_xtype != NC_INT64ERR;
107
108      /* Now check the data. */
109      if (nc_get_var(ncidvariddata_in)) ERR;
110      for (i = 0; i < DIM_LENi++)
111  if (data[i].i != data_in[i].i || data[i].j != data_in[i].jERR;
112      if (nc_close(ncid)) ERR;
113
114      free(data);
115      free(data_in);
116   }
117   SUMMARIZE_ERR;
118   printf("*** testing compound attribute with Dennis...");
119   {
120#define GROUP1_NAME "g1"
121#define GROUP2_NAME "g2"
122#define TYPE1_NAME "t1"
123#define TYPE2_NAME "t2"
124#define ATT_NAME "a1"
125#define ATT_LEN 1
126
127      int root_grpg1_grpg2_grp;
128      int g1_c_t_typg2_d_t_typtype1idtype2id;
129      char name_in[NC_MAX_NAME + 1], full_name[NC_MAX_NAME + 1];
130      size_t size_in;
131      g2_d_t *a1_att, *a1_att_in;
132      int i;
133
134      if (!(a1_att = calloc(sizeof(g2_d_t), ATT_LEN))) ERR;
135      if (!(a1_att_in = calloc(sizeof(g2_d_t), ATT_LEN))) ERR;
136
137      for (i = 0; i < ATT_LENi++)
138      {
139  a1_att[i].s1.x = 13.3;
140  a1_att[i].s1.y = 13.3;
141      }
142      /* Create a file with two groups, define a type in each group,
143       * and write an att of that type in the root group. */
144      if (nc_create(FILE_NAMENC_NETCDF4, &root_grp)) ERR;
145      if (nc_def_grp(root_grpGROUP1_NAME, &g1_grp)) ERR;
146      if (nc_def_grp(root_grpGROUP2_NAME, &g2_grp)) ERR;
147      if (nc_def_compound(g1_grp, sizeof(g1_c_t), TYPE1_NAME, &g1_c_t_typ)) ERR;
148      if (nc_insert_compound(g1_grpg1_c_t_typ, "x", NC_COMPOUND_OFFSET(g1_c_t,x), NC_FLOAT)) ERR;
149      if (nc_insert_compound(g1_grpg1_c_t_typ, "y", NC_COMPOUND_OFFSET(g1_c_t,y), NC_DOUBLE)) ERR;
150      if (nc_def_compound(g2_grp, sizeof(g2_d_t), TYPE2_NAME, &g2_d_t_typ)) ERR;
151      if (nc_insert_compound(g2_grpg2_d_t_typ, "s1", NC_COMPOUND_OFFSET(g2_d_t,s1), g1_c_t_typ)) ERR;
152      if (nc_put_att(root_grpNC_GLOBALATT_NAMEg2_d_t_typATT_LENa1_att)) ERR;
153      if (nc_close(root_grp)) ERR;
154
155      /* Check the file. */
156      if (nc_open(FILE_NAMENC_WRITE, &root_grp)) ERR;
157
158      /* Check the attribute. */
159      if (nc_get_att(root_grpNC_GLOBALATT_NAMEa1_att_in)) ERR;
160      if (a1_att_in[0].s1.x != a1_att[0].s1.x ||
161   a1_att_in[0].s1.y != a1_att[0].s1.yERR;
162
163      /* Check the type in grp1. */
164      if (nc_inq_grp_ncid(root_grpGROUP1_NAME, &g1_grp)) ERR;
165      if (nc_inq_typeid(g1_grpTYPE1_NAME, &type1id)) ERR;
166      if (nc_inq_type(g1_grptype1idname_in, &size_in)) ERR;
167      if (strcmp(name_inTYPE1_NAME) || size_in != sizeof(g1_c_t)) ERR;
168
169      /* Check the type in grp2. */
170      if (nc_inq_grp_ncid(root_grpGROUP2_NAME, &g2_grp)) ERR;
171      if (nc_inq_typeid(g2_grpTYPE2_NAME, &type2id)) ERR;
172      if (nc_inq_type(g2_grptype2idname_in, &size_in)) ERR;
173      if (strcmp(name_inTYPE2_NAME) || size_in != sizeof(g2_d_t)) ERR;
174
175      /* This fails because it's not a fully-qualified name. */
176      sprintf(full_name, "%s/%s", GROUP2_NAMETYPE2_NAME);
177      if (nc_inq_typeid(root_grpfull_name, &type2id) != NC_EINVALERR;
178
179      /* Check the type using it's full name. */
180      sprintf(full_name, "/%s/%s", GROUP2_NAMETYPE2_NAME);
181/*      if (nc_inq_typeid(root_grp, full_name, &type2id)) ERR;       */
182/*       if (nc_inq_type(g2_grp, type2id, name_in, &size_in)) ERR; */
183/*       if (strcmp(name_in, TYPE2_NAME) || size_in != sizeof(g2_d_t)) ERR; */
184
185      /* Check that a type in grp1 can be identified in grp2 */
186      type1id = -1;
187      if (nc_inq_typeid(g2_grpTYPE1_NAME, &type1id)) ERR;
188      if (nc_inq_type(g2_grptype1idname_in, &size_in)) ERR;
189      if (strcmp(name_inTYPE1_NAME) || size_in != sizeof(g1_c_t)) ERR;
190
191      /* We are done! */
192      if (nc_close(root_grp)) ERR;
193      free(a1_att);
194      free(a1_att_in);
195   }
196   SUMMARIZE_ERR;
197   FINAL_RESULTS;
198}


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