/** * @internal * Write an attribute to a netCDF-4/HDF5 file, converting * data type if necessary. * Wrapper around nc4_put_att * * @param ncid File and group ID. * @param varid Variable ID. * @param name Name of attribute. * @param file_type Type of the attribute data in file. * @param len Number of elements in attribute array. * @param data Attribute data. * @param mem_type Type of data in memory. * * @return ::NC_NOERR No error. * @return ::NC_EINVAL Invalid parameters. * @return ::NC_EBADID Bad ncid. * @return ::NC_ENOTVAR Variable not found. * @return ::NC_EBADNAME Name contains illegal characters. * @return ::NC_ENAMEINUSE Name already in use. * @author Ed Hartnett, Dennis Heimbigner */ int NC4_put_att(int ncid, int varid, const char *name, nc_type file_type, size_t len, const void *data, nc_type mem_type) { int ret = NC_NOERR; NC *nc; NC_FILE_INFO_T *h5; NC_GRP_INFO_T *grp; /* Find info for this file, group, and h5 info. */ if ((ret = nc4_find_nc_grp_h5(ncid, &nc, &grp, &h5))) return ret; assert(nc && grp && h5); return nc4_put_att(grp,varid,name,file_type,len,data,mem_type,0); }
/* Write an attribute with type conversion. */ static int nc4_put_att_tc(int ncid, int varid, const char *name, nc_type file_type, nc_type mem_type, int mem_type_is_long, size_t len, const void *op) { NC *nc; NC_HDF5_FILE_INFO_T *h5; if (!name || strlen(name) > NC_MAX_NAME) return NC_EBADNAME; LOG((3, "nc4_put_att_tc: ncid 0x%x varid %d name %s file_type %d " "mem_type %d len %d", ncid, varid, name, file_type, mem_type, len)); /* The length needs to be positive (cast needed for braindead systems with signed size_t). */ if((unsigned long) len > X_INT_MAX) return NC_EINVAL; /* Find metadata. */ if (!(nc = nc4_find_nc_file(ncid,NULL))) return NC_EBADID; /* get netcdf-4 metadata */ h5 = NC4_DATA(nc); assert(h5); #if 0 /*def USE_PNETCDF*/ /* Take care of files created/opened with parallel-netcdf library. */ if (h5->pnetcdf_file) { if (mem_type == NC_UBYTE) mem_type = NC_BYTE; switch(mem_type) { case NC_BYTE: return ncmpi_put_att_schar(nc->int_ncid, varid, name, file_type, len, op); case NC_CHAR: return ncmpi_put_att_text(nc->int_ncid, varid, name, len, op); case NC_SHORT: return ncmpi_put_att_short(nc->int_ncid, varid, name, file_type, len, op); case NC_INT: if (mem_type_is_long) return ncmpi_put_att_long(nc->int_ncid, varid, name, file_type, len, op); else return ncmpi_put_att_int(nc->int_ncid, varid, name, file_type, len, op); case NC_FLOAT: return ncmpi_put_att_float(nc->int_ncid, varid, name, file_type, len, op); case NC_DOUBLE: return ncmpi_put_att_double(nc->int_ncid, varid, name, file_type, len, op); case NC_NAT: default: return NC_EBADTYPE; } } #endif /* USE_PNETCDF */ /* Otherwise, handle things the netcdf-4 way. */ return nc4_put_att(ncid, nc, varid, name, file_type, mem_type, len, mem_type_is_long, op); }