#ifdef MINC2 /* Ignore if not MINC2 */
/* minc_compat.c
*
* this code exists to provide a dispatch layer between the MI2* low-level
* calls and their respective HDF5 and NetCDF implementations.
*
* Since each of these calls uses exactly one file descriptor, the logic is
* simple: we just apply the correct operation based on a quick determination
* of whether this is an HDF5 handle or a NetCDF file descriptor.
*/
#define _MI2_FORCE_NETCDF_
#include "minc_private.h"
#include "hdf_convenience.h"
/* */
MNCAPI int
MI2varname(int fd, int varid, char *varnm)
{
if (MI2_ISH5OBJ(fd)) {
return (hdf_varname(fd, varid, varnm));
}
else {
return (nc_inq_varname(fd, varid, varnm));
}
}
/* */
MNCAPI int
MI2varid(int fd, const char *varnm)
{
if (MI2_ISH5OBJ(fd)) {
return (hdf_varid(fd, varnm));
}
else {
return (ncvarid(fd, varnm));
}
}
/* */
MNCAPI int
MI2attinq(int fd, int varid, const char *attnm, nc_type *type_ptr,
int *length_ptr)
{
if (MI2_ISH5OBJ(fd)) {
return (hdf_attinq(fd, varid, attnm, type_ptr, length_ptr));
}
else {
int status;
int oldncopts = ncopts;
ncopts = 0;
status = ncattinq(fd, varid, attnm, type_ptr, length_ptr);
ncopts = oldncopts;
if (status != 1 && oldncopts != 0) {
fprintf(stderr,
_("ncattinq: ncid %d: varid: %d: Attribute '%s' not found"),
fd, varid, attnm);
}
return (status);
}
}
MNCAPI int
MI2attname(int fd, int varid, int attid, char *name)
{
if (MI2_ISH5OBJ(fd)) {
return (hdf_attname(fd, varid, attid, name));
}
else {
return (ncattname(fd, varid, attid, name));
}
}
/* */
MNCAPI int
MI2inquire(int fd, int *ndims_ptr, int *nvars_ptr, int *natts_ptr,
int *unlimdim_ptr)
{
if (MI2_ISH5OBJ(fd)) {
return (hdf_inquire(fd, ndims_ptr, nvars_ptr, natts_ptr, unlimdim_ptr));
}
else {
return (ncinquire(fd, ndims_ptr, nvars_ptr, natts_ptr, unlimdim_ptr));
}
}
/* */
MNCAPI int
MI2varinq(int fd, int varid, char *varnm_ptr, nc_type *type_ptr,
int *ndims_ptr, int *dims_ptr, int *natts_ptr)
{
if (MI2_ISH5OBJ(fd)) {
return (hdf_varinq(fd, varid, varnm_ptr, type_ptr, ndims_ptr,
dims_ptr, natts_ptr));
}
else {
return (ncvarinq(fd, varid, varnm_ptr, type_ptr, ndims_ptr,
dims_ptr, natts_ptr));
}
}
/* */
MNCAPI int
MI2dimid(int fd, const char *dimnm)
{
if (MI2_ISH5OBJ(fd)) {
return (hdf_dimid(fd, dimnm));
}
else {
return (ncdimid(fd, dimnm));
}
}
/* */
MNCAPI int
MI2diminq(int fd, int dimid, char *dimnm_ptr, long *len_ptr)
{
if (MI2_ISH5OBJ(fd)) {
return (hdf_diminq(fd, dimid, dimnm_ptr, len_ptr));
}
else {
return (ncdiminq(fd, dimid, dimnm_ptr, len_ptr));
}
}
/* */
MNCAPI int
MI2dimdef(int fd, const char *dimnm, long length)
{
if (MI2_ISH5OBJ(fd)) {
return (hdf_dimdef(fd, dimnm, length));
}
else {
return (ncdimdef(fd, dimnm, length));
}
}
/* */
MNCAPI int
MI2attget(int fd, int varid, const char *attnm, void *value)
{
if (MI2_ISH5OBJ(fd)) {
return (hdf_attget(fd, varid, attnm, value));
}
else {
return (ncattget(fd, varid, attnm, value));
}
}
/* */
MNCAPI int
MI2attput(int fd, int varid, const char *attnm, nc_type val_typ,
int val_len, void *val_ptr)
{
if (MI2_ISH5OBJ(fd)) {
return (hdf_attput(fd, varid, attnm, val_typ, val_len, val_ptr));
}
else {
int old_ncopts = ncopts;
int result;
ncopts = 0;
result = ncattput(fd, varid, attnm, val_typ, val_len, val_ptr);
ncopts = old_ncopts;
return (result);
}
}
/* */
MNCAPI int
MI2endef(int fd)
{
if (MI2_ISH5OBJ(fd)) {
return (MI_NOERROR); /* Just a stub, HDF5 doesn't do this! */
}
else {
return (ncendef(fd));
}
}
/* */
MNCAPI int
MI2vardef(int fd, const char *varnm, nc_type vartype, int ndims,
const int *dimids)
{
if (MI2_ISH5OBJ(fd)) {
return (hdf_vardef(fd, varnm, vartype, ndims, dimids));
}
else {
return (ncvardef(fd, varnm, vartype, ndims, dimids));
}
}
/* */
MNCAPI int
MI2varget(int fd, int varid, const long *start_ptr,
const long *count_ptr, void *val_ptr)
{
if (MI2_ISH5OBJ(fd)) {
return (hdf_varget(fd, varid, start_ptr, count_ptr, val_ptr));
}
else {
return (ncvarget(fd, varid, start_ptr, count_ptr, val_ptr));
}
}
/* */
MNCAPI int
MI2varput(int fd, int varid, const long *start_ptr,
const long *count_ptr, const void *val_ptr)
{
if (MI2_ISH5OBJ(fd)) {
return (hdf_varput(fd, varid, start_ptr, count_ptr, val_ptr));
}
else {
return (ncvarput(fd, varid, start_ptr, count_ptr, val_ptr));
}
}
/* */
MNCAPI int
MI2varput1(int fd, int varid, const long *mindex_ptr,
const void *val_ptr)
{
if (MI2_ISH5OBJ(fd)) {
return (hdf_varput1(fd, varid, mindex_ptr, val_ptr));
}
else {
return (ncvarput1(fd, varid, mindex_ptr, val_ptr));
}
}
MNCAPI int
MI2attdel(int fd, int varid, const char *attnm)
{
if (MI2_ISH5OBJ(fd)) {
return (hdf_attdel(fd, varid, attnm));
}
else {
return (ncattdel(fd, varid, attnm));
}
}
/* */
MNCAPI int
MI2dimrename(int fd, int dimid, const char *new_name)
{
if (MI2_ISH5OBJ(fd)) {
return (hdf_dimrename(fd, dimid, new_name));
}
else {
return (ncdimrename(fd, dimid, new_name));
}
}
MNCAPI int
MI2varputg(int fd, int varid, const long *startp, const long *countp,
const long *stridep, const long *imapp, const void *valp)
{
if (MI2_ISH5OBJ(fd)) {
return (hdf_varputg(fd, varid, startp, countp, stridep, imapp, valp));
}
else {
return (ncvarputg(fd, varid, startp, countp, stridep, imapp, valp));
}
}
MNCAPI int
MI2attcopy(int infd, int invarid, const char *name, int outfd,
int outvarid)
{
if (!MI2_ISH5OBJ(infd) && !MI2_ISH5OBJ(outfd)) {
/* Trivial case. */
return (ncattcopy(infd, invarid, name, outfd, outvarid));
}
else {
/* Complex case. Using our own compatibility layer functions lets us
* handle all three other possible combinations of infd & outfd types.
*/
nc_type att_type;
int att_length;
void *val_ptr;
int status;
status = MI2attinq(infd, invarid, name, &att_type, &att_length);
if (status == MI_ERROR) {
return (MI_ERROR);
}
/* Special case for att_type == NC_CHAR && att_length == 0
*/
if (att_type == NC_CHAR && att_length == 0) {
val_ptr = malloc(1);
if (val_ptr == NULL) {
return (MI_ERROR);
}
*(char *)val_ptr = '\0';
att_length = 1;
status = MI_NOERROR;
}
else {
val_ptr = malloc(MI2typelen(att_type) * att_length);
if (val_ptr == NULL) {
return (MI_ERROR);
}
status = MI2attget(infd, invarid, name, val_ptr);
}
if (status != MI_ERROR) {
status = MI2attput(outfd, outvarid, name, att_type, att_length,
val_ptr);
}
free(val_ptr);
return (status);
}
}
MNCAPI int
MI2typelen(int type_id)
{
switch (type_id) {
case NC_BYTE:
case NC_CHAR:
return (1);
case NC_SHORT:
return (2);
case NC_INT:
case NC_FLOAT:
return (4);
case NC_DOUBLE:
return (8);
default:
break;
}
fprintf(stderr, _("Unknown type %d"), type_id);
return (-1);
}
MNCAPI int
MI2redef(int fd)
{
if (MI2_ISH5OBJ(fd)) {
/* Do nothing, since there is no equivalent in HDF5. */
return (MI_NOERROR);
}
else {
return (ncredef(fd));
}
}
MNCAPI int
MI2sync(int fd)
{
if (MI2_ISH5OBJ(fd)) {
/* Commit the (entire) file to disk. */
if (H5Fflush(fd, H5F_SCOPE_GLOBAL) < 0) {
return (MI_ERROR);
}
else {
return (MI_NOERROR);
}
}
else {
return (ncsync(fd));
}
}
MNCAPI int
MI2setfill(int fd, int fillmode)
{
if (MI2_ISH5OBJ(fd)) {
/* TODO: ??? */
return (MI_NOERROR);
}
else {
return (ncsetfill(fd, fillmode));
}
}
#endif /* MINC2 defined */
syntax highlighted by Code2HTML, v. 0.9.1