20 #include "nc4internal.h" 21 #include "hdf5internal.h" 22 #include "nc4dispatch.h" 23 #include "ncdispatch.h" 43 nc4_get_att_special(NC_FILE_INFO_T* h5,
const char* name,
45 int* attnump,
void* data)
51 if(strcmp(name,NCPROPS)==0) {
52 char* propdata = NULL;
55 if(h5->provenance->propattr.version == 0)
60 if(filetypep) *filetypep =
NC_CHAR;
61 stat = NC4_buildpropinfo(&h5->provenance->propattr, &propdata);
63 len = strlen(propdata);
65 if(data) strncpy((
char*)data,propdata,len+1);
67 }
else if(strcmp(name,ISNETCDF4ATT)==0
68 || strcmp(name,SUPERBLOCKATT)==0) {
69 unsigned long long iv = 0;
70 if(filetypep) *filetypep =
NC_INT;
72 if(strcmp(name,SUPERBLOCKATT)==0)
73 iv = (
unsigned long long)h5->provenance->superblockversion;
75 iv = NC4_isnetcdf4(h5);
79 case NC_BYTE: *((
char*)data) = (char)iv;
break;
80 case NC_SHORT: *((
short*)data) = (short)iv;
break;
81 case NC_INT: *((
int*)data) = (int)iv;
break;
82 case NC_UBYTE: *((
unsigned char*)data) = (
unsigned char)iv;
break;
83 case NC_USHORT: *((
unsigned short*)data) = (
unsigned short)iv;
break;
84 case NC_UINT: *((
unsigned int*)data) = (
unsigned int)iv;
break;
85 case NC_INT64: *((
long long*)data) = (
long long)iv;
break;
86 case NC_UINT64: *((
unsigned long long*)data) = (
unsigned long long)iv;
break;
113 nc4_get_att(
int ncid,
int varid,
const char *name,
nc_type *xtype,
114 nc_type mem_type,
size_t *lenp,
int *attnum,
void *data)
119 NC_ATT_INFO_T *att = NULL;
122 int need_to_convert = 0;
133 LOG((3,
"%s: ncid 0x%x varid %d name %s attnum %d mem_type %d",
134 __func__, ncid, varid, name, my_attnum, mem_type));
137 if ((retval = nc4_find_nc_grp_h5(ncid, &nc, &grp, &h5)))
143 if (!(var = (NC_VAR_INFO_T*)ncindexith(grp->vars,varid)))
145 assert(var->hdr.id == varid);
152 if ((retval = nc4_normalize_name(name, norm_name)))
158 if (grp->atts_not_read)
159 if ((retval = nc4_read_atts(grp, NULL)))
164 if (var->atts_not_read)
165 if ((retval = nc4_read_atts(grp, var)))
170 if (nc->ext_ncid == ncid && varid ==
NC_GLOBAL) {
171 const NC_reservedatt* ra = NC_findreserved(norm_name);
172 if(ra != NULL && (ra->flags & NAMEONLYFLAG))
173 return nc4_get_att_special(h5, norm_name, xtype, mem_type, lenp, attnum, data);
177 if ((retval = nc4_find_grp_att(grp, varid, norm_name, my_attnum, &att)))
183 mem_type = att->nc_typeid;
189 if (data && att->len)
198 *xtype = att->nc_typeid;
200 *attnum = att->hdr.id;
208 if ((retval = nc4_get_typelen_mem(h5, mem_type, &type_size)))
214 if (data && att->len && mem_type != att->nc_typeid &&
219 if (!(bufr = malloc((
size_t)(att->len * type_size))))
222 if ((retval = nc4_convert_type(att->data, bufr, att->nc_typeid,
223 mem_type, (
size_t)att->len, &range_error,
249 hvl_t *vldest = data;
250 NC_TYPE_INFO_T *type;
253 if ((retval = nc4_find_type(h5, att->nc_typeid, &type)))
257 if ((retval = nc4_get_typelen_mem(h5, type->u.v.base_nc_typeid, &base_typelen)))
260 for (i = 0; i < att->len; i++)
262 vldest[i].len = att->vldata[i].len;
263 if (!(vldest[i].p = malloc(vldest[i].len * base_typelen)))
265 memcpy(vldest[i].p, att->vldata[i].p, vldest[i].len * base_typelen);
268 else if (att->stdata)
270 for (i = 0; i < att->len; i++)
275 if (!(((
char **)data)[i] = strdup(att->stdata[i])))
279 ((
char **)data)[i] = att->stdata[i];
284 memcpy(data, bufr, (
size_t)(att->len * type_size));
311 NC4_inq_att(
int ncid,
int varid,
const char *name,
nc_type *xtypep,
314 LOG((2,
"%s: ncid 0x%x varid %d name %s", __func__, ncid, varid, name));
315 return nc4_get_att(ncid, varid, name, xtypep,
NC_NAT, lenp, NULL, NULL);
330 NC4_inq_attid(
int ncid,
int varid,
const char *name,
int *attnump)
332 LOG((2,
"%s: ncid 0x%x varid %d name %s", __func__, ncid, varid, name));
333 return nc4_get_att(ncid, varid, name, NULL,
NC_NAT, NULL, attnump, NULL);
350 NC4_inq_attname(
int ncid,
int varid,
int attnum,
char *name)
355 LOG((2,
"nc_inq_attname: ncid 0x%x varid %d attnum %d", ncid, varid,
359 if ((retval = nc4_find_nc_att(ncid, varid, NULL, attnum, &att)))
364 strcpy(name, att->hdr.name);
383 NC4_get_att(
int ncid,
int varid,
const char *name,
void *value,
nc_type memtype)
385 return nc4_get_att(ncid, varid, name, NULL, memtype, NULL, NULL, value);
#define NC_ENOMEM
Memory allocation (malloc) failure.
#define NC_CHAR
ISO/ASCII character.
#define NC_UBYTE
unsigned 1 byte int
#define NC_CLASSIC_MODEL
Enforce classic model on netCDF-4.
#define NC_ERANGE
Math result not representable.
#define NC_UINT
unsigned 4-byte int
#define NC_INT64
signed 8-byte int
int nc_type
The nc_type type is just an int.
#define NC_BYTE
signed 1 byte integer
#define NC_EATTMETA
Problem with attribute metadata.
#define NC_EBADNAME
Attribute or variable name contains illegal characters.
#define NC_INT
signed 4 byte integer
#define NC_MAX_NAME
Maximum for classic library.
#define NC_NAT
Not A Type.
#define NC_USHORT
unsigned 2-byte int
#define NC_SHORT
signed 2 byte integer
#define NC_ENOTVAR
Variable not found.
#define NC_NOERR
No Error.
#define NC_ECHAR
Attempt to convert between text & numbers.
#define NC_GLOBAL
Attribute id to put/get a global attribute.
#define NC_ENOTATT
Attribute not found.
#define NC_UINT64
unsigned 8-byte int