14 #include "nc4internal.h"
15 #include "nc4dispatch.h"
18 char* nc4_atomic_name[NUM_ATOMIC_TYPES] = {
"none",
"byte",
"char",
19 "short",
"int",
"float",
22 "int64",
"uint64",
"string"};
26 #define NC_CHAR_LEN sizeof(char)
27 #define NC_STRING_LEN sizeof(char *)
29 #define NC_SHORT_LEN 2
31 #define NC_FLOAT_LEN 4
32 #define NC_DOUBLE_LEN 8
33 #define NC_INT64_LEN 8
49 NC4_inq_typeids(
int ncid,
int *ntypes,
int *typeids)
57 LOG((2,
"nc_inq_typeids: ncid 0x%x", ncid));
60 if ((retval = nc4_find_grp_h5(ncid, &grp, &h5)))
67 for(i=0;i<ncindexsize(grp->type);i++)
69 if((type = (NC_TYPE_INFO_T*)ncindexith(grp->type,i)) == NULL)
continue;
71 typeids[num] = type->hdr.id;
98 NC4_inq_type(
int ncid,
nc_type typeid1,
char *name,
size_t *size)
101 NC_TYPE_INFO_T *type;
102 static const int atomic_size[NUM_ATOMIC_TYPES] = {0, NC_BYTE_LEN, NC_CHAR_LEN, NC_SHORT_LEN,
103 NC_INT_LEN, NC_FLOAT_LEN, NC_DOUBLE_LEN,
104 NC_BYTE_LEN, NC_SHORT_LEN, NC_INT_LEN, NC_INT64_LEN,
105 NC_INT64_LEN, NC_STRING_LEN};
109 LOG((2,
"nc_inq_type: ncid 0x%x typeid %d", ncid, typeid1));
112 if (typeid1 < NUM_ATOMIC_TYPES)
115 strcpy(name, nc4_atomic_name[typeid1]);
117 *size = atomic_size[typeid1];
122 if ((retval = nc4_find_nc4_grp(ncid, &grp)))
126 if (!(type = nclistget(grp->nc4_info->alltypes, typeid1)))
130 strcpy(name, type->hdr.name);
134 if (type->nc_type_class ==
NC_VLEN)
136 else if (type->nc_type_class ==
NC_STRING)
162 NC4_inq_user_type(
int ncid,
nc_type typeid1,
char *name,
size_t *size,
163 nc_type *base_nc_typep,
size_t *nfieldsp,
int *classp)
166 NC_TYPE_INFO_T *type;
169 LOG((2,
"nc_inq_user_type: ncid 0x%x typeid %d", ncid, typeid1));
172 if ((retval = nc4_find_nc4_grp(ncid, &grp)))
176 if (!(type = nclistget(grp->nc4_info->alltypes, typeid1)))
183 *nfieldsp = nclistlength(type->u.c.field);
184 else if (type->nc_type_class ==
NC_ENUM)
185 *nfieldsp = nclistlength(type->u.e.enum_member);
193 if (type->nc_type_class ==
NC_VLEN)
195 else if (type->nc_type_class ==
NC_STRING)
201 strcpy(name, type->hdr.name);
207 if (type->nc_type_class ==
NC_ENUM)
208 *base_nc_typep = type->u.e.base_nc_typeid;
209 else if (type->nc_type_class ==
NC_VLEN)
210 *base_nc_typep = type->u.v.base_nc_typeid;
218 *classp = type->nc_type_class;
241 NC4_inq_compound_field(
int ncid,
nc_type typeid1,
int fieldid,
char *name,
242 size_t *offsetp,
nc_type *field_typeidp,
int *ndimsp,
246 NC_TYPE_INFO_T *type;
247 NC_FIELD_INFO_T *field;
251 if ((retval = nc4_find_nc4_grp(ncid, &grp)))
255 if (!(type = nclistget(grp->nc4_info->alltypes, typeid1)))
259 if (!(field = nclistget(type->u.c.field,fieldid)))
263 strcpy(name, field->hdr.name);
265 *offsetp = field->offset;
267 *field_typeidp = field->nc_typeid;
269 *ndimsp = field->ndims;
271 for (d = 0; d < field->ndims; d++)
272 dim_sizesp[d] = field->dim_size[d];
292 NC4_inq_compound_fieldindex(
int ncid,
nc_type typeid1,
const char *name,
int *fieldidp)
295 NC_TYPE_INFO_T *type;
296 NC_FIELD_INFO_T *field;
301 LOG((2,
"nc_inq_compound_fieldindex: ncid 0x%x typeid %d name %s",
302 ncid, typeid1, name));
305 if ((retval = nc4_find_grp_h5(ncid, NULL, &h5)))
309 if ((retval = nc4_find_type(h5, typeid1, &type)))
317 if ((retval = nc4_normalize_name(name, norm_name)))
321 for (i = 0; i < nclistlength(type->u.c.field); i++)
323 field = nclistget(type->u.c.field, i);
325 if (!strcmp(field->hdr.name, norm_name))
334 *fieldidp = field->hdr.id;
354 NC4_inq_enum_ident(
int ncid,
nc_type xtype,
long long value,
char *identifier)
357 NC_TYPE_INFO_T *type;
358 NC_ENUM_MEMBER_INFO_T *enum_member;
364 LOG((3,
"nc_inq_enum_ident: xtype %d value %d\n", xtype, value));
367 if ((retval = nc4_find_nc4_grp(ncid, &grp)))
371 if (!(type = nclistget(grp->nc4_info->alltypes, xtype)))
375 if (type->nc_type_class !=
NC_ENUM)
379 for (found = 0, i = 0; i < nclistlength(type->u.e.enum_member); i++)
381 enum_member = nclistget(type->u.e.enum_member, i);
383 switch (type->u.e.base_nc_typeid)
386 ll_val = *(
char *)enum_member->value;
389 ll_val = *(
unsigned char *)enum_member->value;
392 ll_val = *(
short *)enum_member->value;
395 ll_val = *(
unsigned short *)enum_member->value;
398 ll_val = *(
int *)enum_member->value;
401 ll_val = *(
unsigned int *)enum_member->value;
405 ll_val = *(
long long *)enum_member->value;
410 LOG((4,
"ll_val=%d", ll_val));
414 strcpy(identifier, enum_member->name);
444 NC4_inq_enum_member(
int ncid,
nc_type typeid1,
int idx,
char *identifier,
448 NC_TYPE_INFO_T *type;
449 NC_ENUM_MEMBER_INFO_T *enum_member;
452 LOG((2,
"nc_inq_enum_member: ncid 0x%x typeid %d", ncid, typeid1));
455 if ((retval = nc4_find_nc4_grp(ncid, &grp)))
459 if (!(type = nclistget(grp->nc4_info->alltypes, typeid1)))
463 if (type->nc_type_class !=
NC_ENUM)
467 if (!(enum_member = nclistget(type->u.e.enum_member, idx)))
472 strcpy(identifier, enum_member->name);
474 memcpy(value, enum_member->value, type->size);
#define NC_UBYTE
unsigned 1 byte int
#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_EBADFIELD
Bad field ID.
#define NC_VLEN
vlen (variable-length) types
#define NC_EBADTYPE
Not a netcdf data type.
#define NC_EINVAL
Invalid Argument.
#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
This is the type of arrays of vlens.
#define NC_SHORT
signed 2 byte integer
#define NC_NOERR
No Error.
#define NC_ENUM
enum types
#define NC_COMPOUND
compound types
#define NC_UINT64
unsigned 8-byte int