1/*********************************************************************
2 *   Copyright 1993, UCAR/Unidata
3 *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
4 *   $Header: /upc/share/CVS/netcdf-3/nctest/add.c,v 1.18 2008/06/10 19:38:03 russ Exp $
5 *********************************************************************/
6
7/*
8 * utility functions to update in-memory netcdf by adding new
9 * dimensions, variables, and attributes.
10 */
11#include <config.h>
12#include <stdio.h>
13#include <string.h>
14#include <stdlib.h> /* for free() */
15#include "netcdf.h"
16#include "testcdf.h"
17#include "add.h"
18#include "emalloc.h"
19
20struct netcdf test; /*
21  * in-memory netcdf structure, kept in sync
22  * with disk netcdf
23  */
24
25void
26add_dim (testidim) /* add the dimension idim to the netcdf test */
27     struct netcdf *test;
28     struct cdfdim *idim;
29{
30    static char pname[] = "add_dim";
31
32    if (test->ndims >= MAX_NC_DIMS) {
33 (void)fprintf(stderr,
34       "%s: too many dimensions (%d)", pnametest->ndims);
35 return;
36    }
37    test->dims[test->ndims].size = idim->size;
38    test->dims[test->ndims].name = (char *) emalloc(strlen(idim->name) + 1);
39    (void) strcpy(test->dims[test->ndims].nameidim->name);
40    if (idim->size == NC_UNLIMITED)
41      test->xdimid = test->ndims;
42    test->ndims++;
43}
44
45void
46add_var (testivar) /* add the variable ivar to the netcdf test */
47     struct netcdf *test;
48     struct cdfvar *ivar;
49{
50    static char pname[] = "add_var";
51    int i;
52
53    if (test->nvars >= MAX_NC_VARS) {
54 (void)fprintf(stderr,
55       "%s: too many variables (%d)", pnametest->nvars);
56 return;
57    }
58
59    test->vars[test->nvars].name = (char *) emalloc(strlen(ivar->name) + 1);
60    (void) strcpy(test->vars[test->nvars].nameivar->name);
61    test->vars[test->nvars].type = ivar->type;
62    test->vars[test->nvars].ndims = ivar->ndims;
63    test->vars[test->nvars].dims = (int *) emalloc(sizeof(int)*ivar->ndims);
64    for (i = 0; i < ivar->ndimsi++)
65      test->vars[test->nvars].dims[i] = ivar->dims[i];
66    test->vars[test->nvars].natts = 0;
67    test->nvars++;
68}
69
70void
71add_att (testvaridiatt) /* add attribute iatt to the netcdf test */
72     struct netcdf *test;
73     int varid; /* variable id */
74     struct cdfatt *iatt;
75{
76    static char pname[] = "add_att";
77    int ia; /* attribute number */
78
79    if (test->natts >= MAX_TEST_ATTS) {
80 (void)fprintf(stderr,
81       "%s: too many attributes (%d)", pnametest->natts);
82 return;
83    }
84
85    /* if already defined, change existing attribute and return */
86    for (ia = 0; ia < test->natts ; ia++) {
87 if (test->atts[ia].var == varid &&
88     strcmp(test->atts[ia].nameiatt->name) == 0) {
89     test->atts[ia].type = iatt->type;
90     test->atts[ia].len = iatt->len;
91     test->atts[ia].val = iatt->val;
92     return;
93 }
94    }
95    /* otherwise, add new attribute to list */
96    test->atts[test->natts].var = varid;
97    test->atts[test->natts].name = (char *) emalloc(strlen(iatt->name) + 1);
98    (void) strcpy(test->atts[test->natts].nameiatt->name);
99    test->atts[test->natts].type = iatt->type;
100    test->atts[test->natts].len = iatt->len;
101    test->atts[test->natts].val = iatt->val;
102    test->natts++;
103    if (varid == NC_GLOBAL)
104      test->ngatts++;
105    else
106      test->vars[varid].natts++;
107}
108
109
110void
111add_reset(test) /* reset in-memory netcdf test to empty */
112     struct netcdf *test;
113{
114    test->ndims = 0;
115    test->nvars = 0;
116    test->natts = 0;
117    test->ngatts = 0;
118    test->xdimid = -1; /* no unlimited dimension */
119}
120
121
122void
123del_att (testvaridiatt) /* delete attribute iatt in the netcdf test */
124     struct netcdf *test;
125     int varid; /* variable id */
126     struct cdfatt *iatt;
127{
128    static char pname[] = "del_att";
129    int iaib; /* attribute number */
130
131    for (ia = 0; ia < test->natts ; ia++) { /* find attribute to delete */
132 if (test->atts[ia].var == varid &&
133     strcmp(test->atts[ia].nameiatt->name) == 0) {
134     free(test->atts[ia].name);
135     for (ib = ia+1; ib < test->nattsib++) { /* move down */
136 test->atts[ib-1].var =   test->atts[ib].var;
137 test->atts[ib-1].name =  test->atts[ib].name;
138 test->atts[ib-1].type =  test->atts[ib].type;
139 test->atts[ib-1].len =   test->atts[ib].len;
140 test->atts[ib-1].val =   test->atts[ib].val;
141     }
142     test->natts--;
143     if (varid == NC_GLOBAL)
144       test->ngatts--;
145     else
146       test->vars[varid].natts--;
147     return;
148 }
149    }
150    /* not found */
151    (void) fprintf(stderr, "%s: no such attribute as (%s, %s)", pname,
152    test->vars[varid].nameiatt->name);
153}
154
155void
156add_data(testvaridstartedges) /* keep max record written updated */
157     struct netcdf *test;
158     int varid;
159     long start[];
160     long edges[];
161{
162    if (varid != test->xdimid) /* not a record variable */
163      return;
164    if (start[0] + edges[0] > test->dims[test->xdimid].size)
165      test->dims[test->xdimid].size = start[0] + edges[0];
166}
167
168
169void
170errvar(cdfpvarp)
171     struct netcdf *cdfp;
172     struct cdfvar *varp;
173{
174    const char *types;
175    int id;
176
177    switch (varp->type) {
178      case NC_BYTE:
179 types = "NC_BYTE";
180 break;
181      case NC_CHAR:
182 types = "NC_CHAR";
183 break;
184      case NC_SHORT:
185 types = "NC_SHORT";
186 break;
187      case NC_LONG:
188 types = "NC_LONG";
189 break;
190      case NC_FLOAT:
191 types = "NC_FLOAT";
192 break;
193      case NC_DOUBLE:
194 types = "NC_DOUBLE ";
195 break;
196      default:
197 types = "UNKNOWN";
198 break;
199    }
200
201    (void) fprintf(stderr,"  name=%s  type=%s  dims=(",
202    varp->nametypes);
203    for (id = 0; id < varp->ndimsid++)
204      (void) fprintf(stderr, "%ld%s",
205      (long)cdfp->dims[varp->dims[id]].size,
206      id < varp->ndims - 1 ? ", " : "");
207    (void) fprintf(stderr, ")\n");
208}


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