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