mirror of
https://github.com/Unidata/netcdf-c.git
synced 2024-11-21 03:13:42 +08:00
582410a407
Add a new function called nc_inq_format_extended that returns more detailed format information (vis-a-vis nc_inq_format) about an open dataset. Note that the netcdf API will present the file as if it had the format specified by nc_inq_format. The true file format, however, may not even be a netcdf file; it might be DAP, HDF4, or PNETCDF, for example. This function returns that true file type. It also returns the effective mode for the file. signature: nc_inq_format_extended(int ncid, int* formatp, int* modep) where * ncid is the NetCDF ID from a previous call to nc_open() or nc_create(). * formatp is a pointer to a location for returned true format. * modep is a pointer to a location for returned mode flags. Refer to the actual list in the file netcdf.h to see the currently defined set. Also added test cases (tst_formatx*).
104 lines
2.4 KiB
C
104 lines
2.4 KiB
C
/*
|
|
* Copyright 1996, University Corporation for Atmospheric Research
|
|
* See netcdf/COPYRIGHT file for copying and redistribution conditions.
|
|
*/
|
|
|
|
#include <config.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <assert.h>
|
|
#if defined(LOCKNUMREC) /* && _CRAYMPP */
|
|
# include <mpp/shmem.h>
|
|
# include <intrinsics.h>
|
|
#endif
|
|
#ifdef HAVE_UNISTD_H
|
|
#include <unistd.h>
|
|
#endif
|
|
|
|
#include "nc.h"
|
|
#include "ncdispatch.h"
|
|
|
|
/* This is the default create format for nc_create and nc__create. */
|
|
static int default_create_format = NC_FORMAT_CLASSIC;
|
|
|
|
/* These have to do with version numbers. */
|
|
#define MAGIC_NUM_LEN 4
|
|
#define VER_CLASSIC 1
|
|
#define VER_64BIT_OFFSET 2
|
|
#define VER_HDF5 3
|
|
|
|
int
|
|
NC_check_id(int ncid, NC** ncpp)
|
|
{
|
|
NC* nc = find_in_NCList(ncid);
|
|
if(nc == NULL) return NC_EBADID;
|
|
if(ncpp) *ncpp = nc;
|
|
return NC_NOERR;
|
|
}
|
|
|
|
void
|
|
free_NC(NC *ncp)
|
|
{
|
|
if(ncp == NULL)
|
|
return;
|
|
if(ncp->path)
|
|
free(ncp->path);
|
|
/* We assume caller has already cleaned up ncp->dispatchdata */
|
|
#if _CRAYMPP && defined(LOCKNUMREC)
|
|
shfree(ncp);
|
|
#else
|
|
free(ncp);
|
|
#endif /* _CRAYMPP && LOCKNUMREC */
|
|
}
|
|
|
|
int
|
|
new_NC(NC_Dispatch* dispatcher, const char* path, int mode, NC** ncpp)
|
|
{
|
|
NC *ncp = (NC*)calloc(1,sizeof(NC));
|
|
if(ncp == NULL) return NC_ENOMEM;
|
|
ncp->dispatch = dispatcher;
|
|
ncp->path = nulldup(path);
|
|
ncp->mode = mode;
|
|
if(ncp->path == NULL) { /* fail */
|
|
free_NC(ncp);
|
|
return NC_ENOMEM;
|
|
}
|
|
if(ncpp) {
|
|
*ncpp = ncp;
|
|
} else {
|
|
free_NC(ncp);
|
|
}
|
|
return NC_NOERR;
|
|
}
|
|
|
|
/* This function sets a default create flag that will be logically
|
|
or'd to whatever flags are passed into nc_create for all future
|
|
calls to nc_create.
|
|
Valid default create flags are NC_64BIT_OFFSET, NC_CLOBBER,
|
|
NC_LOCK, NC_SHARE. */
|
|
int
|
|
nc_set_default_format(int format, int *old_formatp)
|
|
{
|
|
/* Return existing format if desired. */
|
|
if (old_formatp)
|
|
*old_formatp = default_create_format;
|
|
|
|
/* Make sure only valid format is set. */
|
|
#ifdef USE_NETCDF4
|
|
if (format != NC_FORMAT_CLASSIC && format != NC_FORMAT_64BIT &&
|
|
format != NC_FORMAT_NETCDF4 && format != NC_FORMAT_NETCDF4_CLASSIC)
|
|
return NC_EINVAL;
|
|
#else
|
|
if (format != NC_FORMAT_CLASSIC && format != NC_FORMAT_64BIT)
|
|
return NC_EINVAL;
|
|
#endif
|
|
default_create_format = format;
|
|
return NC_NOERR;
|
|
}
|
|
|
|
int
|
|
nc_get_default_format(void)
|
|
{
|
|
return default_create_format;
|
|
}
|