1 /*
2 Copyright 2010 University Corporation for Atmospheric
3 Research/Unidata. See COPYRIGHT file for more info.
4
5 This file defines the attribute functions.
6
7 "$Id: nc4.c,v 1.1 2010/06/01 15:46:50 ed Exp $"
8 */
9
10 #include "ncdispatch.h"
11
12 static nc_type longtype = (sizeof(long) == sizeof(int) ? NC_INT : NC_INT64);
13
14 int
nc_inq_att(int ncid,int varid,const char * name,nc_type * xtypep,size_t * lenp)15 nc_inq_att(int ncid, int varid, const char *name, nc_type *xtypep,
16 size_t *lenp)
17 {
18 NC* ncp;
19 int stat = NC_check_id(ncid, &ncp);
20 if(stat != NC_NOERR) return stat;
21 return ncp->dispatch->inq_att(ncid, varid, name, xtypep, lenp);
22 }
23
24 int
nc_inq_attid(int ncid,int varid,const char * name,int * idp)25 nc_inq_attid(int ncid, int varid, const char *name, int *idp)
26 {
27 NC* ncp;
28 int stat = NC_check_id(ncid, &ncp);
29 if(stat != NC_NOERR) return stat;
30 return ncp->dispatch->inq_attid(ncid, varid, name, idp);
31 }
32
33 int
nc_inq_attname(int ncid,int varid,int attnum,char * name)34 nc_inq_attname(int ncid, int varid, int attnum, char *name)
35 {
36 NC* ncp;
37 int stat = NC_check_id(ncid, &ncp);
38 if(stat != NC_NOERR) return stat;
39 return ncp->dispatch->inq_attname(ncid, varid, attnum, name);
40 }
41
42 int
nc_rename_att(int ncid,int varid,const char * name,const char * newname)43 nc_rename_att(int ncid, int varid, const char *name, const char *newname)
44 {
45 NC* ncp;
46 int stat = NC_check_id(ncid, &ncp);
47 if(stat != NC_NOERR) return stat;
48 return ncp->dispatch->rename_att(ncid, varid, name, newname);
49 }
50
51 int
nc_del_att(int ncid,int varid,const char * name)52 nc_del_att(int ncid, int varid, const char *name)
53 {
54 NC* ncp;
55 int stat = NC_check_id(ncid, &ncp);
56 if(stat != NC_NOERR) return stat;
57 return ncp->dispatch->del_att(ncid, varid, name);
58 }
59
60 int
nc_inq_natts(int ncid,int * nattsp)61 nc_inq_natts(int ncid, int *nattsp)
62 {
63 NC* ncp;
64 int stat = NC_check_id(ncid, &ncp);
65 if(stat != NC_NOERR) return stat;
66 if(nattsp == NULL) return NC_NOERR;
67 return ncp->dispatch->inq(ncid, NULL, NULL, nattsp, NULL);
68 }
69
70 int
nc_inq_atttype(int ncid,int varid,const char * name,nc_type * xtypep)71 nc_inq_atttype(int ncid, int varid, const char *name, nc_type *xtypep)
72 {
73 NC* ncp;
74 int stat = NC_check_id(ncid, &ncp);
75 if(stat != NC_NOERR) return stat;
76 return ncp->dispatch->inq_att(ncid, varid, name, xtypep, NULL);
77 }
78
79 int
nc_inq_attlen(int ncid,int varid,const char * name,size_t * lenp)80 nc_inq_attlen(int ncid, int varid, const char *name, size_t *lenp)
81 {
82 NC* ncp;
83 int stat = NC_check_id(ncid, &ncp);
84 if(stat != NC_NOERR) return stat;
85 return ncp->dispatch->inq_att(ncid, varid, name, NULL, lenp);
86 }
87
88 /* This function is no longer deprecated; it's used to support the 2.x
89 * interface and also the netcdf-4 api. */
90 int
nc_get_att(int ncid,int varid,const char * name,void * value)91 nc_get_att(int ncid, int varid, const char *name, void *value)
92 {
93 NC* ncp;
94 int stat;
95 nc_type xtype;
96
97 if ((stat = NC_check_id(ncid, &ncp)))
98 return stat;
99
100 /* Need to get the type */
101 if ((stat = nc_inq_atttype(ncid, varid, name, &xtype)))
102 return stat;
103
104 return ncp->dispatch->get_att(ncid, varid, name, value, xtype);
105 }
106
107 int
nc_put_att(int ncid,int varid,const char * name,nc_type type,size_t nelems,const void * value)108 nc_put_att(int ncid, int varid, const char *name, nc_type type,
109 size_t nelems, const void *value)
110 {
111 NC* ncp;
112 int stat = NC_check_id(ncid, &ncp);
113 if(stat != NC_NOERR) return stat;
114 return ncp->dispatch->put_att(ncid, varid, name, type, nelems,
115 value, type);
116 }
117
118 int
nc_get_att_text(int ncid,int varid,const char * name,char * value)119 nc_get_att_text(int ncid, int varid, const char *name, char *value)
120 {
121 NC* ncp;
122 int stat = NC_check_id(ncid, &ncp);
123 if(stat != NC_NOERR) return stat;
124 return ncp->dispatch->get_att(ncid, varid, name, (void *)value, NC_CHAR);
125 }
126
127 int
nc_get_att_schar(int ncid,int varid,const char * name,signed char * value)128 nc_get_att_schar(int ncid, int varid, const char *name, signed char *value)
129 {
130 NC* ncp;
131 int stat = NC_check_id(ncid, &ncp);
132 if(stat != NC_NOERR) return stat;
133 return ncp->dispatch->get_att(ncid, varid, name, (void *)value, NC_BYTE);
134 }
135
136 int
nc_get_att_uchar(int ncid,int varid,const char * name,unsigned char * value)137 nc_get_att_uchar(int ncid, int varid, const char *name, unsigned char *value)
138 {
139 NC* ncp;
140 int stat = NC_check_id(ncid, &ncp);
141 if(stat != NC_NOERR) return stat;
142 return ncp->dispatch->get_att(ncid, varid, name, (void *)value, NC_UBYTE);
143 }
144
145 int
nc_get_att_short(int ncid,int varid,const char * name,short * value)146 nc_get_att_short(int ncid, int varid, const char *name, short *value)
147 {
148 NC* ncp;
149 int stat = NC_check_id(ncid, &ncp);
150 if(stat != NC_NOERR) return stat;
151 return ncp->dispatch->get_att(ncid, varid, name, (void *)value, NC_SHORT);
152 }
153
154 int
nc_get_att_int(int ncid,int varid,const char * name,int * value)155 nc_get_att_int(int ncid, int varid, const char *name, int *value)
156 {
157 NC* ncp;
158 int stat = NC_check_id(ncid, &ncp);
159 if(stat != NC_NOERR) return stat;
160 return ncp->dispatch->get_att(ncid, varid, name, (void *)value, NC_INT);
161 }
162
163 int
nc_get_att_long(int ncid,int varid,const char * name,long * value)164 nc_get_att_long(int ncid, int varid, const char *name, long *value)
165 {
166 NC* ncp;
167 int stat = NC_check_id(ncid, &ncp);
168 if(stat != NC_NOERR) return stat;
169 return ncp->dispatch->get_att(ncid, varid, name, (void *)value, longtype);
170 }
171
172 int
nc_get_att_float(int ncid,int varid,const char * name,float * value)173 nc_get_att_float(int ncid, int varid, const char *name, float *value)
174 {
175 NC* ncp;
176 int stat = NC_check_id(ncid, &ncp);
177 if(stat != NC_NOERR) return stat;
178 return ncp->dispatch->get_att(ncid, varid, name, (void *)value, NC_FLOAT);
179 }
180
181 int
nc_get_att_double(int ncid,int varid,const char * name,double * value)182 nc_get_att_double(int ncid, int varid, const char *name, double *value)
183 {
184 NC* ncp;
185 int stat = NC_check_id(ncid, &ncp);
186 if(stat != NC_NOERR) return stat;
187 return ncp->dispatch->get_att(ncid, varid, name, (void *)value, NC_DOUBLE);
188 }
189
190 int
nc_get_att_ubyte(int ncid,int varid,const char * name,unsigned char * value)191 nc_get_att_ubyte(int ncid, int varid, const char *name, unsigned char *value)
192 {
193 NC* ncp;
194 int stat = NC_check_id(ncid, &ncp);
195 if(stat != NC_NOERR) return stat;
196 return ncp->dispatch->get_att(ncid, varid, name, (void *)value, NC_UBYTE);
197 }
198
199 int
nc_get_att_ushort(int ncid,int varid,const char * name,unsigned short * value)200 nc_get_att_ushort(int ncid, int varid, const char *name, unsigned short *value)
201 {
202 NC* ncp;
203 int stat = NC_check_id(ncid, &ncp);
204 if(stat != NC_NOERR) return stat;
205 return ncp->dispatch->get_att(ncid, varid, name, (void *)value, NC_USHORT);
206 }
207
208 int
nc_get_att_uint(int ncid,int varid,const char * name,unsigned int * value)209 nc_get_att_uint(int ncid, int varid, const char *name, unsigned int *value)
210 {
211 NC* ncp;
212 int stat = NC_check_id(ncid, &ncp);
213 if(stat != NC_NOERR) return stat;
214 return ncp->dispatch->get_att(ncid, varid, name, (void *)value, NC_UINT);
215 }
216
217 int
nc_get_att_longlong(int ncid,int varid,const char * name,long long * value)218 nc_get_att_longlong(int ncid, int varid, const char *name, long long *value)
219 {
220 NC* ncp;
221 int stat = NC_check_id(ncid, &ncp);
222 if(stat != NC_NOERR) return stat;
223 return ncp->dispatch->get_att(ncid, varid, name, (void *)value, NC_INT64);
224 }
225
226 int
nc_get_att_ulonglong(int ncid,int varid,const char * name,unsigned long long * value)227 nc_get_att_ulonglong(int ncid, int varid, const char *name, unsigned long long *value)
228 {
229 NC *ncp;
230 int stat = NC_check_id(ncid, &ncp);
231 if(stat != NC_NOERR) return stat;
232 return ncp->dispatch->get_att(ncid, varid, name, (void *)value, NC_UINT64);
233 }
234
235 int
nc_get_att_string(int ncid,int varid,const char * name,char ** value)236 nc_get_att_string(int ncid, int varid, const char *name, char **value)
237 {
238 NC *ncp;
239 int stat = NC_check_id(ncid, &ncp);
240 if(stat != NC_NOERR) return stat;
241 return ncp->dispatch->get_att(ncid,varid,name,(void*)value, NC_STRING);
242 }
243
244 int
nc_put_att_schar(int ncid,int varid,const char * name,nc_type type,size_t nelems,const signed char * value)245 nc_put_att_schar(int ncid, int varid, const char *name,
246 nc_type type, size_t nelems, const signed char *value)
247 {
248 NC *ncp;
249 int stat = NC_check_id(ncid, &ncp);
250 if(stat != NC_NOERR) return stat;
251 return ncp->dispatch->put_att(ncid, varid, name, type, nelems,
252 (void *)value, NC_BYTE);
253 }
254
255 int
nc_put_att_uchar(int ncid,int varid,const char * name,nc_type type,size_t nelems,const unsigned char * value)256 nc_put_att_uchar(int ncid, int varid, const char *name,
257 nc_type type, size_t nelems, const unsigned char *value)
258 {
259 NC* ncp;
260 int stat = NC_check_id(ncid, &ncp);
261 if(stat != NC_NOERR) return stat;
262 return ncp->dispatch->put_att(ncid,varid,name,type,nelems,(void *)value, NC_UBYTE);
263 }
264
265 int
nc_put_att_short(int ncid,int varid,const char * name,nc_type type,size_t nelems,const short * value)266 nc_put_att_short(int ncid, int varid, const char *name,
267 nc_type type, size_t nelems, const short *value)
268 {
269 NC* ncp;
270 int stat = NC_check_id(ncid, &ncp);
271 if(stat != NC_NOERR) return stat;
272 return ncp->dispatch->put_att(ncid, varid, name, type, nelems,
273 (void *)value, NC_SHORT);
274 }
275
276 int
nc_put_att_int(int ncid,int varid,const char * name,nc_type type,size_t nelems,const int * value)277 nc_put_att_int(int ncid, int varid, const char *name,
278 nc_type type, size_t nelems, const int *value)
279 {
280 NC* ncp;
281 int stat = NC_check_id(ncid, &ncp);
282 if(stat != NC_NOERR) return stat;
283 return ncp->dispatch->put_att(ncid, varid, name, type, nelems,
284 (void *)value, NC_INT);
285 }
286
287 int
nc_put_att_long(int ncid,int varid,const char * name,nc_type type,size_t nelems,const long * value)288 nc_put_att_long(int ncid, int varid, const char *name,
289 nc_type type, size_t nelems, const long *value)
290 {
291 NC* ncp;
292 int stat = NC_check_id(ncid, &ncp);
293 if(stat != NC_NOERR) return stat;
294 return ncp->dispatch->put_att(ncid, varid, name, type, nelems,
295 (void *)value, longtype);
296 }
297
298 int
nc_put_att_float(int ncid,int varid,const char * name,nc_type type,size_t nelems,const float * value)299 nc_put_att_float(int ncid, int varid, const char *name,
300 nc_type type, size_t nelems, const float *value)
301 {
302 NC* ncp;
303 int stat = NC_check_id(ncid, &ncp);
304 if(stat != NC_NOERR) return stat;
305 return ncp->dispatch->put_att(ncid, varid, name, type, nelems,
306 (void *)value, NC_FLOAT);
307 }
308
309 int
nc_put_att_double(int ncid,int varid,const char * name,nc_type type,size_t nelems,const double * value)310 nc_put_att_double(int ncid, int varid, const char *name,
311 nc_type type, size_t nelems, const double *value)
312 {
313 NC* ncp;
314 int stat = NC_check_id(ncid, &ncp);
315 if(stat != NC_NOERR) return stat;
316 return ncp->dispatch->put_att(ncid, varid, name, type, nelems,
317 (void *)value, NC_DOUBLE);
318 }
319
320 int
nc_put_att_ubyte(int ncid,int varid,const char * name,nc_type type,size_t nelems,const unsigned char * value)321 nc_put_att_ubyte(int ncid, int varid, const char *name,
322 nc_type type, size_t nelems, const unsigned char *value)
323 {
324 NC* ncp;
325 int stat = NC_check_id(ncid, &ncp);
326 if(stat != NC_NOERR) return stat;
327 return ncp->dispatch->put_att(ncid, varid, name, type, nelems,
328 (void *)value, NC_UBYTE);
329 }
330
331 int
nc_put_att_ushort(int ncid,int varid,const char * name,nc_type type,size_t nelems,const unsigned short * value)332 nc_put_att_ushort(int ncid, int varid, const char *name,
333 nc_type type, size_t nelems, const unsigned short *value)
334 {
335 NC* ncp;
336 int stat = NC_check_id(ncid, &ncp);
337 if(stat != NC_NOERR) return stat;
338 return ncp->dispatch->put_att(ncid, varid, name, type, nelems,
339 (void *)value, NC_USHORT);
340 }
341
342 int
nc_put_att_uint(int ncid,int varid,const char * name,nc_type type,size_t nelems,const unsigned int * value)343 nc_put_att_uint(int ncid, int varid, const char *name,
344 nc_type type, size_t nelems, const unsigned int *value)
345 {
346 NC* ncp;
347 int stat = NC_check_id(ncid, &ncp);
348 if(stat != NC_NOERR) return stat;
349 return ncp->dispatch->put_att(ncid, varid, name, type, nelems,
350 (void *)value, NC_UINT);
351 }
352
353 int
nc_put_att_longlong(int ncid,int varid,const char * name,nc_type type,size_t nelems,const long long * value)354 nc_put_att_longlong(int ncid, int varid, const char *name,
355 nc_type type, size_t nelems,
356 const long long *value)
357 {
358 NC* ncp;
359 int stat = NC_check_id(ncid, &ncp);
360 if(stat != NC_NOERR) return stat;
361 return ncp->dispatch->put_att(ncid, varid, name, type, nelems,
362 (void *)value, NC_INT64);
363 }
364
365 int
nc_put_att_ulonglong(int ncid,int varid,const char * name,nc_type type,size_t nelems,const unsigned long long * value)366 nc_put_att_ulonglong(int ncid, int varid, const char *name,
367 nc_type type, size_t nelems,
368 const unsigned long long *value)
369 {
370 NC* ncp;
371 int stat = NC_check_id(ncid, &ncp);
372 if(stat != NC_NOERR) return stat;
373 return ncp->dispatch->put_att(ncid, varid, name, type, nelems,
374 (void *)value, NC_UINT64);
375 }
376
377 int
nc_put_att_string(int ncid,int varid,const char * name,size_t len,const char ** value)378 nc_put_att_string(int ncid, int varid, const char *name,
379 size_t len, const char** value)
380 {
381 NC* ncp;
382 int stat = NC_check_id(ncid, &ncp);
383 if(stat != NC_NOERR) return stat;
384 return ncp->dispatch->put_att(ncid,varid,name,NC_STRING,len,(void*)value,NC_STRING);
385 }
386
387 int
nc_put_att_text(int ncid,int varid,const char * name,size_t len,const char * value)388 nc_put_att_text(int ncid, int varid, const char *name,
389 size_t len, const char *value)
390 {
391 NC* ncp;
392 int stat = NC_check_id(ncid, &ncp);
393 if(stat != NC_NOERR) return stat;
394 return ncp->dispatch->put_att(ncid, varid, name, NC_CHAR, len,
395 (void *)value, NC_CHAR);
396 }
397
398