2018-12-07 06:27:32 +08:00
|
|
|
/* This is part of the netCDF package. Copyright 2005-2018 University
|
2018-05-14 05:58:30 +08:00
|
|
|
Corporation for Atmospheric Research/Unidata. See COPYRIGHT file
|
|
|
|
for conditions of use.
|
|
|
|
|
|
|
|
Test user-defined formats.
|
|
|
|
|
|
|
|
Ed Hartnett
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "config.h"
|
|
|
|
#include <nc_tests.h>
|
|
|
|
#include "err_macros.h"
|
|
|
|
#include "netcdf.h"
|
|
|
|
#include "nc4dispatch.h"
|
2020-08-18 09:15:47 +08:00
|
|
|
#include "hdf5dispatch.h"
|
2019-07-05 19:24:29 +08:00
|
|
|
#include "netcdf_dispatch.h"
|
2018-05-14 05:58:30 +08:00
|
|
|
|
|
|
|
#define FILE_NAME "tst_udf.nc"
|
|
|
|
|
2021-12-24 13:18:56 +08:00
|
|
|
#ifdef _MSC_VER
|
|
|
|
static int
|
|
|
|
NC4_no_show_metadata(int ncid)
|
2018-06-01 22:10:16 +08:00
|
|
|
{
|
2021-12-24 13:18:56 +08:00
|
|
|
return NC_NOERR;
|
2018-06-01 22:10:16 +08:00
|
|
|
}
|
2021-12-24 13:18:56 +08:00
|
|
|
|
|
|
|
#define NC4_show_metadata NC4_no_show_metadata
|
2018-06-01 22:10:16 +08:00
|
|
|
#endif
|
2018-05-30 18:31:15 +08:00
|
|
|
|
2018-05-14 05:58:30 +08:00
|
|
|
int
|
|
|
|
tst_open(const char *path, int mode, int basepe, size_t *chunksizehintp,
|
2020-02-10 04:19:10 +08:00
|
|
|
void *parameters, const NC_Dispatch *dispatch, int ncid)
|
2018-05-14 05:58:30 +08:00
|
|
|
{
|
2020-02-10 04:19:10 +08:00
|
|
|
return NC_NOERR;
|
2018-05-14 05:58:30 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
tst_abort(int ncid)
|
|
|
|
{
|
2020-02-10 04:19:10 +08:00
|
|
|
return TEST_VAL_42;
|
2018-05-14 05:58:30 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
tst_close(int ncid, void *v)
|
|
|
|
{
|
2020-02-10 04:19:10 +08:00
|
|
|
return NC_NOERR;
|
2018-05-14 05:58:30 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
tst_inq_format(int ncid, int *formatp)
|
|
|
|
{
|
2020-02-10 04:19:10 +08:00
|
|
|
return TEST_VAL_42;
|
2018-05-14 05:58:30 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
tst_inq_format_extended(int ncid, int *formatp, int *modep)
|
|
|
|
{
|
2020-02-10 04:19:10 +08:00
|
|
|
return TEST_VAL_42;
|
2018-05-14 05:58:30 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
tst_get_vara(int ncid, int varid, const size_t *start, const size_t *count,
|
|
|
|
void *value, nc_type t)
|
|
|
|
{
|
2020-02-10 04:19:10 +08:00
|
|
|
return TEST_VAL_42;
|
2018-05-14 05:58:30 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/* This is the dispatch object that holds pointers to all the
|
2020-02-10 04:22:35 +08:00
|
|
|
* functions that make up the test dispatch interface. */
|
2018-05-14 05:58:30 +08:00
|
|
|
static NC_Dispatch tst_dispatcher = {
|
|
|
|
|
2020-02-10 04:19:10 +08:00
|
|
|
NC_FORMATX_UDF0,
|
|
|
|
NC_DISPATCH_VERSION,
|
|
|
|
|
|
|
|
NC_RO_create,
|
|
|
|
tst_open,
|
|
|
|
|
|
|
|
NC_RO_redef,
|
|
|
|
NC_RO__enddef,
|
|
|
|
NC_RO_sync,
|
|
|
|
tst_abort,
|
|
|
|
tst_close,
|
|
|
|
NC_RO_set_fill,
|
|
|
|
tst_inq_format,
|
|
|
|
tst_inq_format_extended,
|
|
|
|
|
|
|
|
NC4_inq,
|
|
|
|
NC4_inq_type,
|
|
|
|
|
|
|
|
NC_RO_def_dim,
|
|
|
|
NC4_inq_dimid,
|
2020-08-18 09:15:47 +08:00
|
|
|
HDF5_inq_dim,
|
2020-02-10 04:19:10 +08:00
|
|
|
NC4_inq_unlimdim,
|
|
|
|
NC_RO_rename_dim,
|
|
|
|
|
|
|
|
NC4_inq_att,
|
|
|
|
NC4_inq_attid,
|
|
|
|
NC4_inq_attname,
|
|
|
|
NC_RO_rename_att,
|
|
|
|
NC_RO_del_att,
|
|
|
|
NC4_get_att,
|
|
|
|
NC_RO_put_att,
|
|
|
|
|
|
|
|
NC_RO_def_var,
|
|
|
|
NC4_inq_varid,
|
|
|
|
NC_RO_rename_var,
|
|
|
|
tst_get_vara,
|
|
|
|
NC_RO_put_vara,
|
|
|
|
NCDEFAULT_get_vars,
|
|
|
|
NCDEFAULT_put_vars,
|
|
|
|
NCDEFAULT_get_varm,
|
|
|
|
NCDEFAULT_put_varm,
|
|
|
|
|
|
|
|
NC4_inq_var_all,
|
|
|
|
|
|
|
|
NC_NOTNC4_var_par_access,
|
|
|
|
NC_RO_def_var_fill,
|
|
|
|
|
|
|
|
NC4_show_metadata,
|
|
|
|
NC4_inq_unlimdims,
|
|
|
|
|
|
|
|
NC4_inq_ncid,
|
|
|
|
NC4_inq_grps,
|
|
|
|
NC4_inq_grpname,
|
|
|
|
NC4_inq_grpname_full,
|
|
|
|
NC4_inq_grp_parent,
|
|
|
|
NC4_inq_grp_full_ncid,
|
|
|
|
NC4_inq_varids,
|
|
|
|
NC4_inq_dimids,
|
|
|
|
NC4_inq_typeids,
|
|
|
|
NC4_inq_type_equal,
|
|
|
|
NC_NOTNC4_def_grp,
|
|
|
|
NC_NOTNC4_rename_grp,
|
|
|
|
NC4_inq_user_type,
|
|
|
|
NC4_inq_typeid,
|
|
|
|
|
|
|
|
NC_NOTNC4_def_compound,
|
|
|
|
NC_NOTNC4_insert_compound,
|
|
|
|
NC_NOTNC4_insert_array_compound,
|
|
|
|
NC_NOTNC4_inq_compound_field,
|
|
|
|
NC_NOTNC4_inq_compound_fieldindex,
|
|
|
|
NC_NOTNC4_def_vlen,
|
|
|
|
NC_NOTNC4_put_vlen_element,
|
|
|
|
NC_NOTNC4_get_vlen_element,
|
|
|
|
NC_NOTNC4_def_enum,
|
|
|
|
NC_NOTNC4_insert_enum,
|
|
|
|
NC_NOTNC4_inq_enum_member,
|
|
|
|
NC_NOTNC4_inq_enum_ident,
|
|
|
|
NC_NOTNC4_def_opaque,
|
|
|
|
NC_NOTNC4_def_var_deflate,
|
|
|
|
NC_NOTNC4_def_var_fletcher32,
|
|
|
|
NC_NOTNC4_def_var_chunking,
|
|
|
|
NC_NOTNC4_def_var_endian,
|
|
|
|
NC_NOTNC4_def_var_filter,
|
|
|
|
NC_NOTNC4_set_var_chunk_cache,
|
2020-04-16 04:44:58 +08:00
|
|
|
NC_NOTNC4_get_var_chunk_cache,
|
2020-09-28 02:43:46 +08:00
|
|
|
#if NC_DISPATCH_VERSION >= 3
|
|
|
|
NC_NOOP_inq_var_filter_ids,
|
|
|
|
NC_NOOP_inq_var_filter_info,
|
2020-04-16 04:44:58 +08:00
|
|
|
#endif
|
Enhance/Fix filter support
re: Discussion https://github.com/Unidata/netcdf-c/discussions/2214
The primary change is to support so-called "standard filters".
A standard filter is one that is defined by the following
netcdf-c API:
````
int nc_def_var_XXX(int ncid, int varid, size_t nparams, unsigned* params);
int nc_inq_var_XXXX(int ncid, int varid, int* usefilterp, unsigned* params);
````
So for example, zstandard would be a standard filter by defining
the functions *nc_def_var_zstandard* and *nc_inq_var_zstandard*.
In order to define these functions, we need a new dispatch function:
````
int nc_inq_filter_avail(int ncid, unsigned filterid);
````
This function, combined with the existing filter API can be used
to implement arbitrary standard filters using a simple code pattern.
Note that I would have preferred that this function return a list
of all available filters, but HDF5 does not support that functionality.
So this PR implements the dispatch function and implements
the following standard functions:
+ bzip2
+ zstandard
+ blosc
Specific test cases are also provided for HDF5 and NCZarr.
Over time, other specific standard filters will be defined.
## Primary Changes
* Add nc_inq_filter_avail() to netcdf-c API.
* Add standard filter implementations to test use of *nc_inq_filter_avail*.
* Bump the dispatch table version number and add to all the relevant
dispatch tables (libsrc, libsrcp, etc).
* Create a program to invoke nc_inq_filter_avail so that it is accessible
to shell scripts.
* Cleanup szip support to properly support szip
when HDF5 is disabled. This involves detecting
libsz separately from testing if HDF5 supports szip.
* Integrate shuffle and fletcher32 into the existing
filter API. This means that, for example, nc_def_var_fletcher32
is now a wrapper around nc_def_var_filter.
* Extend the Codec defaulting to allow multiple default shared libraries.
## Misc. Changes
* Modify configure.ac/CMakeLists.txt to look for the relevant
libraries implementing standard filters.
* Modify libnetcdf.settings to list available standard filters
(including deflate and szip).
* Add CMake test modules to locate libbz2 and libzstd.
* Cleanup the HDF5 memory manager function use in the plugins.
* remove unused file include//ncfilter.h
* remove tests for the HDF5 memory operations e.g. H5allocate_memory.
* Add flag to ncdump to force use of _Filter instead of _Deflate
or _Shuffle or _Fletcher32. Used for testing.
2022-03-15 02:39:37 +08:00
|
|
|
#if NC_DISPATCH_VERSION >= 4
|
|
|
|
NC_NOTNC4_def_var_quantize,
|
|
|
|
NC_NOTNC4_inq_var_quantize,
|
|
|
|
#endif
|
|
|
|
#if NC_DISPATCH_VERSION >= 5
|
|
|
|
NC_NOOP_inq_filter_avail,
|
|
|
|
#endif
|
2018-05-14 05:58:30 +08:00
|
|
|
};
|
|
|
|
|
2020-02-10 04:22:35 +08:00
|
|
|
/* This is the dispatch object that holds pointers to all the
|
|
|
|
* functions that make up the test dispatch interface with a bad
|
|
|
|
* version number. */
|
|
|
|
static NC_Dispatch tst_dispatcher_bad_version = {
|
|
|
|
|
|
|
|
NC_FORMATX_UDF0,
|
|
|
|
NC_DISPATCH_VERSION - 1,
|
|
|
|
|
|
|
|
NC_RO_create,
|
|
|
|
tst_open,
|
|
|
|
|
|
|
|
NC_RO_redef,
|
|
|
|
NC_RO__enddef,
|
|
|
|
NC_RO_sync,
|
|
|
|
tst_abort,
|
|
|
|
tst_close,
|
|
|
|
NC_RO_set_fill,
|
|
|
|
tst_inq_format,
|
|
|
|
tst_inq_format_extended,
|
|
|
|
|
|
|
|
NC4_inq,
|
|
|
|
NC4_inq_type,
|
|
|
|
|
|
|
|
NC_RO_def_dim,
|
|
|
|
NC4_inq_dimid,
|
2020-08-18 09:15:47 +08:00
|
|
|
HDF5_inq_dim,
|
2020-02-10 04:22:35 +08:00
|
|
|
NC4_inq_unlimdim,
|
|
|
|
NC_RO_rename_dim,
|
|
|
|
|
|
|
|
NC4_inq_att,
|
|
|
|
NC4_inq_attid,
|
|
|
|
NC4_inq_attname,
|
|
|
|
NC_RO_rename_att,
|
|
|
|
NC_RO_del_att,
|
|
|
|
NC4_get_att,
|
|
|
|
NC_RO_put_att,
|
|
|
|
|
|
|
|
NC_RO_def_var,
|
|
|
|
NC4_inq_varid,
|
|
|
|
NC_RO_rename_var,
|
|
|
|
tst_get_vara,
|
|
|
|
NC_RO_put_vara,
|
|
|
|
NCDEFAULT_get_vars,
|
|
|
|
NCDEFAULT_put_vars,
|
|
|
|
NCDEFAULT_get_varm,
|
|
|
|
NCDEFAULT_put_varm,
|
|
|
|
|
|
|
|
NC4_inq_var_all,
|
|
|
|
|
|
|
|
NC_NOTNC4_var_par_access,
|
|
|
|
NC_RO_def_var_fill,
|
|
|
|
|
|
|
|
NC4_show_metadata,
|
|
|
|
NC4_inq_unlimdims,
|
|
|
|
|
|
|
|
NC4_inq_ncid,
|
|
|
|
NC4_inq_grps,
|
|
|
|
NC4_inq_grpname,
|
|
|
|
NC4_inq_grpname_full,
|
|
|
|
NC4_inq_grp_parent,
|
|
|
|
NC4_inq_grp_full_ncid,
|
|
|
|
NC4_inq_varids,
|
|
|
|
NC4_inq_dimids,
|
|
|
|
NC4_inq_typeids,
|
|
|
|
NC4_inq_type_equal,
|
|
|
|
NC_NOTNC4_def_grp,
|
|
|
|
NC_NOTNC4_rename_grp,
|
|
|
|
NC4_inq_user_type,
|
|
|
|
NC4_inq_typeid,
|
|
|
|
|
|
|
|
NC_NOTNC4_def_compound,
|
|
|
|
NC_NOTNC4_insert_compound,
|
|
|
|
NC_NOTNC4_insert_array_compound,
|
|
|
|
NC_NOTNC4_inq_compound_field,
|
|
|
|
NC_NOTNC4_inq_compound_fieldindex,
|
|
|
|
NC_NOTNC4_def_vlen,
|
|
|
|
NC_NOTNC4_put_vlen_element,
|
|
|
|
NC_NOTNC4_get_vlen_element,
|
|
|
|
NC_NOTNC4_def_enum,
|
|
|
|
NC_NOTNC4_insert_enum,
|
|
|
|
NC_NOTNC4_inq_enum_member,
|
|
|
|
NC_NOTNC4_inq_enum_ident,
|
|
|
|
NC_NOTNC4_def_opaque,
|
|
|
|
NC_NOTNC4_def_var_deflate,
|
|
|
|
NC_NOTNC4_def_var_fletcher32,
|
|
|
|
NC_NOTNC4_def_var_chunking,
|
|
|
|
NC_NOTNC4_def_var_endian,
|
|
|
|
NC_NOTNC4_def_var_filter,
|
|
|
|
NC_NOTNC4_set_var_chunk_cache,
|
2020-04-16 04:44:58 +08:00
|
|
|
NC_NOTNC4_get_var_chunk_cache,
|
Enhance/Fix filter support
re: Discussion https://github.com/Unidata/netcdf-c/discussions/2214
The primary change is to support so-called "standard filters".
A standard filter is one that is defined by the following
netcdf-c API:
````
int nc_def_var_XXX(int ncid, int varid, size_t nparams, unsigned* params);
int nc_inq_var_XXXX(int ncid, int varid, int* usefilterp, unsigned* params);
````
So for example, zstandard would be a standard filter by defining
the functions *nc_def_var_zstandard* and *nc_inq_var_zstandard*.
In order to define these functions, we need a new dispatch function:
````
int nc_inq_filter_avail(int ncid, unsigned filterid);
````
This function, combined with the existing filter API can be used
to implement arbitrary standard filters using a simple code pattern.
Note that I would have preferred that this function return a list
of all available filters, but HDF5 does not support that functionality.
So this PR implements the dispatch function and implements
the following standard functions:
+ bzip2
+ zstandard
+ blosc
Specific test cases are also provided for HDF5 and NCZarr.
Over time, other specific standard filters will be defined.
## Primary Changes
* Add nc_inq_filter_avail() to netcdf-c API.
* Add standard filter implementations to test use of *nc_inq_filter_avail*.
* Bump the dispatch table version number and add to all the relevant
dispatch tables (libsrc, libsrcp, etc).
* Create a program to invoke nc_inq_filter_avail so that it is accessible
to shell scripts.
* Cleanup szip support to properly support szip
when HDF5 is disabled. This involves detecting
libsz separately from testing if HDF5 supports szip.
* Integrate shuffle and fletcher32 into the existing
filter API. This means that, for example, nc_def_var_fletcher32
is now a wrapper around nc_def_var_filter.
* Extend the Codec defaulting to allow multiple default shared libraries.
## Misc. Changes
* Modify configure.ac/CMakeLists.txt to look for the relevant
libraries implementing standard filters.
* Modify libnetcdf.settings to list available standard filters
(including deflate and szip).
* Add CMake test modules to locate libbz2 and libzstd.
* Cleanup the HDF5 memory manager function use in the plugins.
* remove unused file include//ncfilter.h
* remove tests for the HDF5 memory operations e.g. H5allocate_memory.
* Add flag to ncdump to force use of _Filter instead of _Deflate
or _Shuffle or _Fletcher32. Used for testing.
2022-03-15 02:39:37 +08:00
|
|
|
#if NC_DISPATCH_VERSION >= 3
|
2020-09-28 02:43:46 +08:00
|
|
|
NC_NOOP_inq_var_filter_ids,
|
|
|
|
NC_NOOP_inq_var_filter_info,
|
2020-04-16 04:44:58 +08:00
|
|
|
#endif
|
Enhance/Fix filter support
re: Discussion https://github.com/Unidata/netcdf-c/discussions/2214
The primary change is to support so-called "standard filters".
A standard filter is one that is defined by the following
netcdf-c API:
````
int nc_def_var_XXX(int ncid, int varid, size_t nparams, unsigned* params);
int nc_inq_var_XXXX(int ncid, int varid, int* usefilterp, unsigned* params);
````
So for example, zstandard would be a standard filter by defining
the functions *nc_def_var_zstandard* and *nc_inq_var_zstandard*.
In order to define these functions, we need a new dispatch function:
````
int nc_inq_filter_avail(int ncid, unsigned filterid);
````
This function, combined with the existing filter API can be used
to implement arbitrary standard filters using a simple code pattern.
Note that I would have preferred that this function return a list
of all available filters, but HDF5 does not support that functionality.
So this PR implements the dispatch function and implements
the following standard functions:
+ bzip2
+ zstandard
+ blosc
Specific test cases are also provided for HDF5 and NCZarr.
Over time, other specific standard filters will be defined.
## Primary Changes
* Add nc_inq_filter_avail() to netcdf-c API.
* Add standard filter implementations to test use of *nc_inq_filter_avail*.
* Bump the dispatch table version number and add to all the relevant
dispatch tables (libsrc, libsrcp, etc).
* Create a program to invoke nc_inq_filter_avail so that it is accessible
to shell scripts.
* Cleanup szip support to properly support szip
when HDF5 is disabled. This involves detecting
libsz separately from testing if HDF5 supports szip.
* Integrate shuffle and fletcher32 into the existing
filter API. This means that, for example, nc_def_var_fletcher32
is now a wrapper around nc_def_var_filter.
* Extend the Codec defaulting to allow multiple default shared libraries.
## Misc. Changes
* Modify configure.ac/CMakeLists.txt to look for the relevant
libraries implementing standard filters.
* Modify libnetcdf.settings to list available standard filters
(including deflate and szip).
* Add CMake test modules to locate libbz2 and libzstd.
* Cleanup the HDF5 memory manager function use in the plugins.
* remove unused file include//ncfilter.h
* remove tests for the HDF5 memory operations e.g. H5allocate_memory.
* Add flag to ncdump to force use of _Filter instead of _Deflate
or _Shuffle or _Fletcher32. Used for testing.
2022-03-15 02:39:37 +08:00
|
|
|
#if NC_DISPATCH_VERSION >= 4
|
|
|
|
NC_NOTNC4_def_var_quantize,
|
|
|
|
NC_NOTNC4_inq_var_quantize,
|
|
|
|
#endif
|
|
|
|
#if NC_DISPATCH_VERSION >= 5
|
|
|
|
NC_NOOP_inq_filter_avail,
|
|
|
|
#endif
|
2020-02-10 04:22:35 +08:00
|
|
|
};
|
|
|
|
|
2018-06-06 01:53:59 +08:00
|
|
|
#define NUM_UDFS 2
|
|
|
|
|
2018-06-07 20:49:16 +08:00
|
|
|
int mode[NUM_UDFS] = {NC_UDF0, NC_UDF1};
|
|
|
|
|
2018-05-14 05:58:30 +08:00
|
|
|
int
|
|
|
|
main(int argc, char **argv)
|
|
|
|
{
|
2020-02-10 04:19:10 +08:00
|
|
|
printf("\n*** Testing user-defined formats.\n");
|
|
|
|
printf("*** testing simple user-defined format...");
|
|
|
|
{
|
|
|
|
int ncid;
|
|
|
|
NC_Dispatch *disp_in;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
/* Create an empty file to play with. */
|
|
|
|
if (nc_create(FILE_NAME, 0, &ncid)) ERR;
|
|
|
|
if (nc_close(ncid)) ERR;
|
|
|
|
|
|
|
|
/* Test all available user-defined format slots. */
|
|
|
|
for (i = 0; i < NUM_UDFS; i++)
|
|
|
|
{
|
|
|
|
/* Add our user defined format. */
|
|
|
|
if (nc_def_user_format(mode[i], &tst_dispatcher, NULL)) ERR;
|
|
|
|
|
|
|
|
/* Check that our user-defined format has been added. */
|
|
|
|
if (nc_inq_user_format(mode[i], &disp_in, NULL)) ERR;
|
|
|
|
if (disp_in != &tst_dispatcher) ERR;
|
|
|
|
|
|
|
|
/* Open file with our defined functions. */
|
|
|
|
if (nc_open(FILE_NAME, mode[i], &ncid)) ERR;
|
|
|
|
if (nc_close(ncid)) ERR;
|
|
|
|
|
|
|
|
/* Open file again and abort, which is the same as closing
|
|
|
|
* it. This also tests that the UDF flags are given
|
|
|
|
* priority. If NC_NETCDF4 flag were given priority, then
|
|
|
|
* nc_abort() will not return TEST_VAL_42, but instead will
|
|
|
|
* return 0. */
|
2023-01-21 08:36:02 +08:00
|
|
|
if (nc_open(FILE_NAME, mode[i], &ncid)) ERR;
|
2020-02-10 04:19:10 +08:00
|
|
|
if (nc_inq_format(ncid, NULL) != TEST_VAL_42) ERR;
|
|
|
|
if (nc_inq_format_extended(ncid, NULL, NULL) != TEST_VAL_42) ERR;
|
|
|
|
if (nc_abort(ncid) != TEST_VAL_42) ERR;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
SUMMARIZE_ERR;
|
|
|
|
printf("*** testing user-defined format with magic number...");
|
|
|
|
{
|
|
|
|
int ncid;
|
|
|
|
NC_Dispatch *disp_in;
|
|
|
|
char magic_number[5] = "1111";
|
|
|
|
char dummy_data[11] = "0123456789";
|
|
|
|
char magic_number_in[NC_MAX_MAGIC_NUMBER_LEN];
|
|
|
|
FILE *FP;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
/* Create a file with magic number at start. */
|
2022-02-09 11:53:30 +08:00
|
|
|
if (!(FP = NCfopen(FILE_NAME, "w"))) ERR;
|
2020-02-10 04:19:10 +08:00
|
|
|
if (fwrite(magic_number, sizeof(char), strlen(magic_number), FP)
|
|
|
|
!= strlen(magic_number)) ERR;
|
|
|
|
if (fwrite(dummy_data, sizeof(char), strlen(dummy_data), FP)
|
|
|
|
!= strlen(dummy_data)) ERR;
|
|
|
|
if (fclose(FP)) ERR;
|
|
|
|
|
|
|
|
/* Test all available user-defined format slots. */
|
|
|
|
for (i = 0; i < NUM_UDFS; i++)
|
|
|
|
{
|
|
|
|
/* Add our test user defined format. */
|
2023-01-21 08:36:02 +08:00
|
|
|
mode[i] = mode[i]|NC_NETCDF4;
|
2020-02-10 04:19:10 +08:00
|
|
|
if (nc_def_user_format(mode[i], &tst_dispatcher, magic_number)) ERR;
|
|
|
|
|
|
|
|
/* Check that our user-defined format has been added. */
|
|
|
|
if (nc_inq_user_format(mode[i], &disp_in, magic_number_in)) ERR;
|
|
|
|
if (disp_in != &tst_dispatcher) ERR;
|
|
|
|
if (strncmp(magic_number, magic_number_in, strlen(magic_number))) ERR;
|
|
|
|
|
|
|
|
/* Open file with our defined functions. */
|
|
|
|
if (nc_open(FILE_NAME, mode[i], &ncid)) ERR;
|
|
|
|
if (nc_close(ncid)) ERR;
|
|
|
|
|
|
|
|
/* Open file again and abort, which is the same as closing
|
|
|
|
* it. This time we don't specify a mode, because the magic
|
|
|
|
* number is used to identify the file. */
|
|
|
|
if (nc_open(FILE_NAME, 0, &ncid)) ERR;
|
|
|
|
if (nc_inq_format(ncid, NULL) != TEST_VAL_42) ERR;
|
|
|
|
if (nc_inq_format_extended(ncid, NULL, NULL) != TEST_VAL_42) ERR;
|
|
|
|
if (nc_abort(ncid) != TEST_VAL_42) ERR;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
SUMMARIZE_ERR;
|
2020-02-10 04:22:35 +08:00
|
|
|
printf("*** testing bad version causes dispatch table to be rejected...");
|
|
|
|
{
|
|
|
|
int i;
|
2023-01-21 08:36:02 +08:00
|
|
|
char magic_number[5] = "1111";
|
2020-02-10 04:22:35 +08:00
|
|
|
|
|
|
|
/* Test all available user-defined format slots. */
|
|
|
|
for (i = 0; i < NUM_UDFS; i++)
|
|
|
|
{
|
|
|
|
/* Make sure our bad version format is rejected. */
|
2020-02-10 04:23:22 +08:00
|
|
|
if (nc_def_user_format(mode[i], &tst_dispatcher_bad_version,
|
|
|
|
NULL) != NC_EINVAL) ERR;
|
2023-01-21 08:36:02 +08:00
|
|
|
/* Make sure defining a magic number with netcdf3 is rejected. */
|
|
|
|
if (nc_def_user_format(NC_CLASSIC_MODEL, &tst_dispatcher,
|
|
|
|
magic_number) != NC_EINVAL) ERR;
|
2020-02-10 04:22:35 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
SUMMARIZE_ERR;
|
2020-02-10 04:19:10 +08:00
|
|
|
FINAL_RESULTS;
|
2018-05-14 05:58:30 +08:00
|
|
|
}
|