mirror of
https://github.com/Unidata/netcdf-c.git
synced 2024-12-27 08:49:16 +08:00
6934aa2e8b
re: https://github.com/Unidata/netcdf-c/issues/1373 (partial) * Mark some global constants be const to indicate to make them easier to track. * Hide direct access to the ncrc_globalstate behind a function call. * Convert dispatch tables to constants (except the user defined ones) This has some consequences in terms of function arguments needing to be marked as const also. * Remove some no longer needed global fields * Aggregate all the globals in nclog.c * Uniformly replace nc_sizevector{0,1} with NC_coord_{zero,one} * Uniformly replace nc_ptrdffvector1 with NC_stride_one * Remove some obsolete code
116 lines
2.8 KiB
C
116 lines
2.8 KiB
C
/*
|
|
* Copyright 2018, 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 "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);
|
|
if(ncp->model)
|
|
free(ncp->model);
|
|
/* We assume caller has already cleaned up ncp->dispatchdata */
|
|
#if _CRAYMPP && defined(LOCKNUMREC)
|
|
shfree(ncp);
|
|
#else
|
|
free(ncp);
|
|
#endif /* _CRAYMPP && LOCKNUMREC */
|
|
}
|
|
|
|
int
|
|
new_NC(const NC_Dispatch* dispatcher, const char* path, int mode, NCmodel* model, 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->model = malloc(sizeof(NCmodel)))==NULL)
|
|
return NC_ENOMEM;
|
|
*ncp->model = *model; /* Make a copy */
|
|
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. */
|
|
#ifndef ENABLE_CDF5
|
|
if (format == NC_FORMAT_CDF5)
|
|
return NC_ENOTBUILT;
|
|
#endif
|
|
#ifdef USE_HDF5
|
|
if (format != NC_FORMAT_CLASSIC && format != NC_FORMAT_64BIT_OFFSET &&
|
|
format != NC_FORMAT_NETCDF4 && format != NC_FORMAT_NETCDF4_CLASSIC &&
|
|
format != NC_FORMAT_CDF5)
|
|
return NC_EINVAL;
|
|
#else
|
|
if (format == NC_FORMAT_NETCDF4 || format == NC_FORMAT_NETCDF4_CLASSIC)
|
|
return NC_ENOTBUILT;
|
|
if (format != NC_FORMAT_CLASSIC && format != NC_FORMAT_64BIT_OFFSET &&
|
|
format != NC_FORMAT_CDF5)
|
|
return NC_EINVAL;
|
|
#endif
|
|
default_create_format = format;
|
|
return NC_NOERR;
|
|
}
|
|
|
|
int
|
|
nc_get_default_format(void)
|
|
{
|
|
return default_create_format;
|
|
}
|