mirror of
https://github.com/Unidata/netcdf-c.git
synced 2024-11-21 03:13:42 +08:00
1338 lines
45 KiB
Plaintext
1338 lines
45 KiB
Plaintext
dnl This is m4 source.
|
|
dnl Process using m4 to produce 'C' language file.
|
|
dnl
|
|
dnl This file is supposed to be the same as PnetCDF's test_put.m4
|
|
dnl
|
|
dnl If you see this line, you can ignore the next one.
|
|
/* Do not edit this file. It is produced from the corresponding .m4 source */
|
|
dnl
|
|
/*
|
|
* Copyright (C) 2003, Northwestern University and Argonne National Laboratory
|
|
* See COPYRIGHT notice in top-level directory.
|
|
*/
|
|
/* $Id: test_put.m4 2542 2016-10-12 21:14:00Z wkliao $ */
|
|
|
|
dnl
|
|
dnl The command-line m4 macro "PNETCDF" is to differentiate PnetCDF and netCDF
|
|
dnl in terms of function prefix names (ncmpi_ vs. nc_), integer data types
|
|
dnl (MPI_Offset vs. size_t), and function name substrings for external data
|
|
dnl types.
|
|
dnl
|
|
|
|
#include "tests.h"
|
|
|
|
define(`IntType', `ifdef(`PNETCDF',`MPI_Offset',`size_t')')dnl
|
|
define(`PTRDType',`ifdef(`PNETCDF',`MPI_Offset',`ptrdiff_t')')dnl
|
|
define(`TestFunc',`ifdef(`PNETCDF',`test_ncmpi_put_$1',`test_nc_put_$1')')dnl
|
|
define(`APIFunc',` ifdef(`PNETCDF',`ncmpi_$1',`nc_$1')')dnl
|
|
|
|
define(`FileOpen', `ifdef(`PNETCDF',`ncmpi_open(comm, $1, $2, info, &ncid)', `file_open($1, $2, &ncid)')')dnl
|
|
define(`FileCreate',`ifdef(`PNETCDF',`ncmpi_create(comm, $1, $2, info, &ncid)', `file_create($1, $2, &ncid)')')dnl
|
|
define(`FileDelete',`ifdef(`PNETCDF',`ncmpi_delete($1,$2)',`nc_delete($1)')')dnl
|
|
|
|
define(`VarArgs', `ifdef(`PNETCDF',`int numVars',`void')')dnl
|
|
define(`AttVarArgs',`ifdef(`PNETCDF',`int numGatts,int numVars',`void')')dnl
|
|
|
|
define(`PutVar1',`ifdef(`PNETCDF',`ncmpi_put_var1_$1_all',`nc_put_var1_$1')')dnl
|
|
define(`PutVar', `ifdef(`PNETCDF',`ncmpi_put_var_$1_all', `nc_put_var_$1')')dnl
|
|
define(`PutVara',`ifdef(`PNETCDF',`ncmpi_put_vara_$1_all',`nc_put_vara_$1')')dnl
|
|
define(`PutVars',`ifdef(`PNETCDF',`ncmpi_put_vars_$1_all',`nc_put_vars_$1')')dnl
|
|
define(`PutVarm',`ifdef(`PNETCDF',`ncmpi_put_varm_$1_all',`nc_put_varm_$1')')dnl
|
|
define(`PutAtt', `ifdef(`PNETCDF',`ncmpi_put_att_$1',`nc_put_att_$1')')dnl
|
|
define(`GetVar1',`ifdef(`PNETCDF',`ncmpi_get_var1_$1_all',`nc_get_var1_$1')')dnl
|
|
define(`DefVars',`ifdef(`PNETCDF',`def_vars($1,$2)',`def_vars($1)')')dnl
|
|
|
|
undefine(`index')dnl
|
|
dnl dnl dnl
|
|
dnl
|
|
dnl Macros
|
|
dnl
|
|
dnl dnl dnl
|
|
dnl
|
|
dnl Upcase(str)
|
|
dnl
|
|
define(`Upcase',dnl
|
|
`dnl
|
|
translit($1, abcdefghijklmnopqrstuvwxyz, ABCDEFGHIJKLMNOPQRSTUVWXYZ)')dnl
|
|
dnl dnl dnl
|
|
dnl
|
|
dnl NCT_ITYPE(type)
|
|
dnl
|
|
define(`NCT_ITYPE', ``NCT_'Upcase($1)')dnl
|
|
define(`NC_TYPE', ``NC_'Upcase($1)')dnl
|
|
define(`X_MIN', ``X_'Upcase($1)_MIN')dnl
|
|
define(`X_MAX', ``X_'Upcase($1)_MAX')dnl
|
|
dnl
|
|
|
|
define(`CheckText', `ifelse(`$1',`text', , `== (NCT_ITYPE($1) == NCT_TEXT)')')dnl
|
|
define(`IfCheckTextChar', `ifelse(`$1',`text', `if ($2 != NC_CHAR)')')dnl
|
|
define(`CheckNumRange',
|
|
`ifelse(`$1',`text', `1',
|
|
`inRange3(cdf_format, $2,$3,NCT_ITYPE($1)) && ($2 >= $1_min && $2 <= $1_max)')')dnl
|
|
define(`CheckRange',
|
|
`ifelse(`$1',`text', `0', `($2 >= $1_min && $2 <= $1_max)')')dnl
|
|
define(`CheckRange3',
|
|
`ifelse(`$1',`text', `1',
|
|
`inRange3(cdf_format, $2,$3,NCT_ITYPE($1))')')dnl
|
|
|
|
dnl HASH(TYPE)
|
|
dnl
|
|
define(`HASH',dnl
|
|
`dnl
|
|
/*
|
|
* ensure hash value within range for internal TYPE
|
|
*/
|
|
static
|
|
double
|
|
hash_$1(
|
|
const int cdf_format,
|
|
const nc_type type,
|
|
const int rank,
|
|
const IntType *index,
|
|
const nct_itype itype)
|
|
{
|
|
const double min = $1_min;
|
|
const double max = $1_max;
|
|
|
|
return MAX(min, MIN(max, hash4(cdf_format, type, rank, index, itype)));
|
|
}
|
|
')dnl
|
|
|
|
dnl HASH(text)
|
|
#define hash_text hash4
|
|
|
|
HASH(uchar)
|
|
HASH(schar)
|
|
HASH(short)
|
|
HASH(int)
|
|
HASH(long)
|
|
HASH(float)
|
|
HASH(double)
|
|
HASH(ushort)
|
|
HASH(uint)
|
|
HASH(longlong)
|
|
HASH(ulonglong)
|
|
|
|
|
|
dnl CHECK_VARS(TYPE)
|
|
dnl
|
|
define(`CHECK_VARS',dnl
|
|
`dnl
|
|
/*
|
|
* check all vars in file which are (text/numeric) compatible with TYPE
|
|
*/
|
|
static
|
|
int
|
|
check_vars_$1(const char *filename, int numVars)
|
|
{
|
|
int i, j, d, err, ncid, cdf_format, ndims;
|
|
int canConvert; /* Both text or both numeric */
|
|
int nok = 0; /* count of valid comparisons */
|
|
int dimids[MAX_RANK];
|
|
nc_type datatype;
|
|
char name[NC_MAX_NAME];
|
|
IntType index[MAX_RANK];
|
|
IntType length;
|
|
double expect;
|
|
$1 value;
|
|
|
|
err = FileOpen(testfile, NC_NOWRITE);
|
|
IF (err != NC_NOERR) error("open: %s", APIFunc(strerror)(err));
|
|
|
|
err = APIFunc(inq_format)(ncid, &cdf_format);
|
|
IF (err != NC_NOERR) error("inq_format: %s", APIFunc(strerror)(err));
|
|
|
|
for (i = 0; i < numVars; i++) {
|
|
canConvert = (var_type[i] == NC_CHAR) CheckText($1);
|
|
if (!canConvert) continue;
|
|
|
|
err = APIFunc(inq_var)(ncid, i, name, &datatype, &ndims, dimids, NULL);
|
|
IF (err != NC_NOERR)
|
|
error("inq_var: %s", APIFunc(strerror)(err));
|
|
IF (strcmp(name, var_name[i]) != 0)
|
|
error("Unexpected var_name");
|
|
IF (datatype != var_type[i])
|
|
error("Unexpected type");
|
|
IF (ndims != var_rank[i])
|
|
error("Unexpected rank");
|
|
for (j = 0; j < ndims; j++) {
|
|
err = APIFunc(inq_dim)(ncid, dimids[j], 0, &length);
|
|
IF (err != NC_NOERR)
|
|
error("inq_dim: %s", APIFunc(strerror)(err));
|
|
IF (length != var_shape[i][j])
|
|
error("Unexpected shape");
|
|
}
|
|
for (j = 0; j < var_nels[i]; j++) {
|
|
err = toMixedBase(j, var_rank[i], var_shape[i], index);
|
|
IF (err != NC_NOERR)
|
|
error("error in toMixedBase 2");
|
|
expect = hash4(cdf_format, var_type[i], var_rank[i], index, NCT_ITYPE($1));
|
|
err = GetVar1($1)(ncid, i, index, &value);
|
|
if (CheckNumRange($1, expect, datatype)) {
|
|
IF (err != NC_NOERR) {
|
|
error("get_var1_$1_all: %s", APIFunc(strerror)(err));
|
|
} else {
|
|
ifelse(`$1', `uchar', `
|
|
/* in put_vars(), API _put_vara_double() is used to
|
|
* write the NC_BYTE variables to files. In this
|
|
* case, NC_BYTE variables are treated as signed
|
|
* for CDF-1 and 2 formats. Thus, we must skip the
|
|
* equal test below for uchar.
|
|
*/
|
|
if (cdf_format < NC_FORMAT_CDF5 && var_type[i] == NC_BYTE && expect > schar_max) continue;')
|
|
IF (!equal(value,expect,var_type[i],NCT_ITYPE($1))) {
|
|
error("Var value read not that expected");
|
|
if (verbose) {
|
|
error("\n");
|
|
error("varid: %d, ", i);
|
|
error("var_name: %s, ", var_name[i]);
|
|
error("var_type: %s, ", s_nc_type(var_type[i]));
|
|
error("index:");
|
|
for (d = 0; d < var_rank[i]; d++)
|
|
error(" %d", index[d]);
|
|
error(", expect: %g, ", expect);
|
|
error("got: %g", (double) value);
|
|
}
|
|
} else {
|
|
++nok;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
err = APIFunc(close)(ncid);
|
|
IF (err != NC_NOERR)
|
|
error("close: %s", APIFunc(strerror)(err));
|
|
return nok;
|
|
}
|
|
')dnl
|
|
|
|
CHECK_VARS(text)
|
|
CHECK_VARS(uchar)
|
|
CHECK_VARS(schar)
|
|
CHECK_VARS(short)
|
|
CHECK_VARS(int)
|
|
CHECK_VARS(long)
|
|
CHECK_VARS(float)
|
|
CHECK_VARS(double)
|
|
CHECK_VARS(ushort)
|
|
CHECK_VARS(uint)
|
|
CHECK_VARS(longlong)
|
|
CHECK_VARS(ulonglong)
|
|
|
|
|
|
dnl CHECK_ATTS(TYPE)
|
|
dnl
|
|
define(`CHECK_ATTS',dnl
|
|
`dnl
|
|
/*
|
|
* for _text tests, check all attributes in file which are of text type
|
|
* Note no NC_ERANGE check for text attributes as text is not convertible to
|
|
* any other numerical data types (i.e. NC_ECHAR)
|
|
*
|
|
* for other tests, check all numerical attributes in file against values
|
|
* outside range of type $1
|
|
*/
|
|
static
|
|
int
|
|
check_atts_$1(int ncid, int numGatts, int numVars)
|
|
{
|
|
int i, j, cdf_format, err;
|
|
int canConvert; /* Both text or both numeric */
|
|
int nok = 0; /* count of valid comparisons */
|
|
IntType k, length;
|
|
nc_type datatype;
|
|
size_t nInExtRange; /* number values within external range */
|
|
size_t nInIntRange; /* number values within internal range */
|
|
double expect[MAX_NELS];
|
|
$1 value[MAX_NELS];
|
|
|
|
err = APIFunc(inq_format)(ncid, &cdf_format);
|
|
IF (err != NC_NOERR)
|
|
error("inq_format: %s", APIFunc(strerror)(err));
|
|
|
|
for (i = -1; i < numVars; i++) {
|
|
for (j = 0; j < NATTS(i); j++) {
|
|
canConvert = (ATT_TYPE(i,j) == NC_CHAR) CheckText($1);
|
|
if (!canConvert) continue;
|
|
|
|
err = APIFunc(inq_att)(ncid, i, ATT_NAME(i,j), &datatype, &length);
|
|
IF (err != NC_NOERR)
|
|
error("inq_att: %s", APIFunc(strerror)(err));
|
|
IF (datatype != ATT_TYPE(i,j))
|
|
error("inq_att: unexpected type");
|
|
IF (length != ATT_LEN(i,j))
|
|
error("inq_att: unexpected length");
|
|
assert(length <= MAX_NELS);
|
|
nInIntRange = nInExtRange = 0;
|
|
for (k = 0; k < length; k++) {
|
|
expect[k] = hash4(cdf_format, datatype, -1, &k, NCT_ITYPE($1));
|
|
if (inRange3(cdf_format, expect[k], datatype, NCT_ITYPE($1))) {
|
|
++nInExtRange;
|
|
if (CheckRange($1, expect[k]))
|
|
++nInIntRange;
|
|
}
|
|
}
|
|
err = APIFunc(get_att_$1)(ncid, i, ATT_NAME(i,j), value);
|
|
if (nInExtRange == length && nInIntRange == length) {
|
|
IF (err != NC_NOERR)
|
|
error("%s", APIFunc(strerror)(err));
|
|
} else {
|
|
IF (err != NC_NOERR && err != NC_ERANGE)
|
|
error("expecting NC_NOERR or NC_ERANGE but got %s", nc_err_code_name(err));
|
|
}
|
|
for (k = 0; k < length; k++) {
|
|
if (CheckNumRange($1, expect[k], datatype)) {
|
|
ifelse(`$1', `uchar', `
|
|
/* in put_vars(), API _put_vara_double() is used to
|
|
* write the NC_BYTE variables to files. In this
|
|
* case, NC_BYTE variables are treated as signed
|
|
* for CDF-1 and 2 formats. Thus, we must skip the
|
|
* equal test below for uchar.
|
|
*/
|
|
if (cdf_format < NC_FORMAT_CDF5 && ATT_TYPE(i,j) == NC_BYTE && expect[k] > schar_max) continue;')
|
|
IF (!equal(value[k],expect[k],datatype,NCT_ITYPE($1))) {
|
|
error("att. value read not that expected");
|
|
if (verbose) {
|
|
error("\n");
|
|
error("varid: %d, ", i);
|
|
error("att_name: %s, ", ATT_NAME(i,j));
|
|
error("att_type: %s, ", s_nc_type(ATT_TYPE(i,j)));
|
|
error("element number: %d ", k);
|
|
error("expect: %g, ", expect[k]);
|
|
error("got: %g", (double) value[k]);
|
|
}
|
|
} else {
|
|
nok++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return nok;
|
|
}
|
|
')dnl
|
|
|
|
CHECK_ATTS(text)
|
|
CHECK_ATTS(uchar)
|
|
CHECK_ATTS(schar)
|
|
CHECK_ATTS(short)
|
|
CHECK_ATTS(int)
|
|
CHECK_ATTS(long)
|
|
CHECK_ATTS(float)
|
|
CHECK_ATTS(double)
|
|
CHECK_ATTS(ushort)
|
|
CHECK_ATTS(uint)
|
|
CHECK_ATTS(longlong)
|
|
CHECK_ATTS(ulonglong)
|
|
|
|
|
|
dnl TEST_NC_PUT_VAR1(TYPE)
|
|
dnl
|
|
define(`TEST_NC_PUT_VAR1',dnl
|
|
`dnl
|
|
int
|
|
TestFunc(var1)_$1(VarArgs)
|
|
{
|
|
int i, j, err, ncid, cdf_format, nok=0;
|
|
IntType index[MAX_RANK];
|
|
int canConvert; /* Both text or both numeric */
|
|
$1 value = 5; /* any value would do - only for error cases */
|
|
|
|
err = FileCreate(scratch, NC_CLOBBER);
|
|
IF (err != NC_NOERR) {
|
|
error("create: %s", APIFunc(strerror)(err));
|
|
return nok;
|
|
}
|
|
|
|
err = APIFunc(inq_format)(ncid, &cdf_format);
|
|
IF (err != NC_NOERR)
|
|
error("inq_format: %s", APIFunc(strerror)(err));
|
|
|
|
def_dims(ncid);
|
|
DefVars(ncid, numVars);
|
|
|
|
err = APIFunc(enddef)(ncid);
|
|
IF (err != NC_NOERR)
|
|
error("enddef: %s", APIFunc(strerror)(err));
|
|
|
|
/* check if can detect a bad file ID */
|
|
err = PutVar1($1)(BAD_ID, 0, NULL, &value);
|
|
IF (err != NC_EBADID)
|
|
error("expecting NC_EBADID but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
|
|
/* check if can detect a bad variable ID */
|
|
err = PutVar1($1)(ncid, BAD_VARID, NULL, &value);
|
|
IF (err != NC_ENOTVAR)
|
|
error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
|
|
for (i = 0; i < numVars; i++) {
|
|
canConvert = (var_type[i] == NC_CHAR) CheckText($1);
|
|
for (j = 0; j < var_rank[i]; j++)
|
|
index[j] = 0;
|
|
if (canConvert) {
|
|
for (j = 0; j < var_rank[i]; j++) {
|
|
if (var_dimid[i][j] > 0) { /* skip record dim */
|
|
index[j] = var_shape[i][j]; /* out of boundary check */
|
|
err = PutVar1($1)(ncid, i, index, &value);
|
|
IF (err != NC_EINVALCOORDS)
|
|
error("expecting NC_EINVALCOORDS, but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
index[j] = 0;
|
|
}
|
|
}
|
|
}
|
|
for (j = 0; j < var_nels[i]; j++) {
|
|
err = toMixedBase(j, var_rank[i], var_shape[i], index);
|
|
IF (err != NC_NOERR)
|
|
error("error in toMixedBase 1");
|
|
value = hash_$1(cdf_format, var_type[i], var_rank[i], index, NCT_ITYPE($1));
|
|
if (var_rank[i] == 0 && i%2 == 0)
|
|
err = PutVar1($1)(ncid, i, NULL, &value);
|
|
else
|
|
err = PutVar1($1)(ncid, i, index, &value);
|
|
if (canConvert) {
|
|
if (CheckRange3($1, value, var_type[i])) {
|
|
IF (err != NC_NOERR)
|
|
error("%s", APIFunc(strerror)(err));
|
|
ELSE_NOK
|
|
} else {
|
|
IF (err != NC_ERANGE) {
|
|
error("expecting NC_ERANGE but got %s", nc_err_code_name(err));
|
|
error("\n\t\tfor type %s value %.17e %ld",
|
|
s_nc_type(var_type[i]),
|
|
(double)value, (long)value);
|
|
}
|
|
ELSE_NOK
|
|
}
|
|
} else {
|
|
IF (err != NC_ECHAR)
|
|
error("wrong type: expecting NC_ECHAR but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
}
|
|
}
|
|
}
|
|
|
|
err = APIFunc(close)(ncid);
|
|
IF (err != NC_NOERR)
|
|
error("close: %s", APIFunc(strerror)(err));
|
|
|
|
nok += check_vars_$1(scratch, numVars);
|
|
|
|
err = FileDelete(scratch, info);
|
|
IF (err != NC_NOERR)
|
|
error("delete file %s failed", scratch);
|
|
return nok;
|
|
}
|
|
')dnl
|
|
|
|
TEST_NC_PUT_VAR1(text)
|
|
TEST_NC_PUT_VAR1(uchar)
|
|
TEST_NC_PUT_VAR1(schar)
|
|
TEST_NC_PUT_VAR1(short)
|
|
TEST_NC_PUT_VAR1(int)
|
|
TEST_NC_PUT_VAR1(long)
|
|
TEST_NC_PUT_VAR1(float)
|
|
TEST_NC_PUT_VAR1(double)
|
|
TEST_NC_PUT_VAR1(ushort)
|
|
TEST_NC_PUT_VAR1(uint)
|
|
TEST_NC_PUT_VAR1(longlong)
|
|
TEST_NC_PUT_VAR1(ulonglong)
|
|
|
|
|
|
dnl TEST_NC_PUT_VAR(TYPE)
|
|
dnl
|
|
define(`TEST_NC_PUT_VAR',dnl
|
|
`dnl
|
|
int
|
|
TestFunc(var)_$1(VarArgs)
|
|
{
|
|
int i, j, err, nels, ncid, varid, cdf_format, nok=0;
|
|
int canConvert; /* Both text or both numeric */
|
|
int allInExtRange; /* all values within external range? */
|
|
IntType index[MAX_RANK];
|
|
$1 value[MAX_NELS];
|
|
|
|
err = FileCreate(scratch, NC_CLOBBER);
|
|
IF (err != NC_NOERR) {
|
|
error("create: %s", APIFunc(strerror)(err));
|
|
return nok;
|
|
}
|
|
|
|
err = APIFunc(inq_format)(ncid, &cdf_format);
|
|
IF (err != NC_NOERR)
|
|
error("inq_format: %s", APIFunc(strerror)(err));
|
|
|
|
def_dims(ncid);
|
|
DefVars(ncid, numVars);
|
|
|
|
err = APIFunc(enddef)(ncid);
|
|
IF (err != NC_NOERR)
|
|
error("enddef: %s", APIFunc(strerror)(err));
|
|
|
|
/* check if can detect a bad file ID */
|
|
err = PutVar($1)(BAD_ID, 0, NULL);
|
|
IF (err != NC_EBADID)
|
|
error("expecting NC_EBADID but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
|
|
/* check if can detect a bad variable ID */
|
|
err = PutVar($1)(ncid, BAD_VARID, NULL);
|
|
IF (err != NC_ENOTVAR)
|
|
error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
|
|
for (i = 0; i < numVars; i++) {
|
|
canConvert = (var_type[i] == NC_CHAR) CheckText($1);
|
|
assert(var_rank[i] <= MAX_RANK);
|
|
assert(var_nels[i] <= MAX_NELS);
|
|
|
|
nels = 1;
|
|
for (j = 0; j < var_rank[i]; j++) {
|
|
nels *= var_shape[i][j];
|
|
}
|
|
for (allInExtRange = 1, j = 0; j < nels; j++) {
|
|
err = toMixedBase(j, var_rank[i], var_shape[i], index);
|
|
IF (err != NC_NOERR)
|
|
error("error in toMixedBase 1");
|
|
value[j]= hash_$1(cdf_format,var_type[i], var_rank[i], index, NCT_ITYPE($1));
|
|
IfCheckTextChar($1, var_type[i])
|
|
allInExtRange &= inRange3(cdf_format, value[j], var_type[i], NCT_ITYPE($1));
|
|
}
|
|
err = PutVar($1)(ncid, i, value);
|
|
if (canConvert) {
|
|
if (allInExtRange) {
|
|
IF (err != NC_NOERR)
|
|
error("%s", APIFunc(strerror)(err));
|
|
ELSE_NOK
|
|
} else {
|
|
IF (err != NC_ERANGE && var_dimid[i][0] != RECDIM)
|
|
error("expecting NC_ERANGE but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
}
|
|
} else { /* should flag wrong type even if nothing to write */
|
|
IF (nels > 0 && err != NC_ECHAR)
|
|
error("wrong type: expecting NC_ECHAR but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
}
|
|
}
|
|
|
|
/* Preceeding has written nothing for record variables, now try */
|
|
/* again with more than 0 records */
|
|
|
|
/* Write record number NRECS to force writing of preceding records */
|
|
/* Assumes variable cr is char vector with UNLIMITED dimension */
|
|
err = APIFunc(inq_varid)(ncid, "cr", &varid);
|
|
IF (err != NC_NOERR)
|
|
error("inq_varid: %s", APIFunc(strerror)(err));
|
|
index[0] = NRECS-1;
|
|
err = PutVar1(text)(ncid, varid, index, "x");
|
|
IF (err != NC_NOERR)
|
|
error("put_var1_text_all: %s", APIFunc(strerror)(err));
|
|
|
|
for (i = 0; i < numVars; i++) {
|
|
if (var_dimid[i][0] == RECDIM) { /* only test record variables here */
|
|
canConvert = (var_type[i] == NC_CHAR) CheckText($1);
|
|
assert(var_rank[i] <= MAX_RANK);
|
|
assert(var_nels[i] <= MAX_NELS);
|
|
err = PutVar($1)(BAD_ID, i, value);
|
|
IF (err != NC_EBADID)
|
|
error("expecting NC_EBADID but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
|
|
nels = 1;
|
|
for (j = 0; j < var_rank[i]; j++) {
|
|
nels *= var_shape[i][j];
|
|
}
|
|
for (allInExtRange = 1, j = 0; j < nels; j++) {
|
|
err = toMixedBase(j, var_rank[i], var_shape[i], index);
|
|
IF (err != NC_NOERR)
|
|
error("error in toMixedBase 1");
|
|
ELSE_NOK
|
|
value[j]= hash_$1(cdf_format,var_type[i], var_rank[i], index, NCT_ITYPE($1));
|
|
IfCheckTextChar($1, var_type[i])
|
|
allInExtRange &= inRange3(cdf_format, value[j], var_type[i], NCT_ITYPE($1));
|
|
}
|
|
err = PutVar($1)(ncid, i, value);
|
|
if (canConvert) {
|
|
if (allInExtRange) {
|
|
IF (err != NC_NOERR)
|
|
error("%s", APIFunc(strerror)(err));
|
|
ELSE_NOK
|
|
} else {
|
|
IF (err != NC_ERANGE)
|
|
error("expecting NC_ERANGE but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
}
|
|
} else {
|
|
IF (nels > 0 && err != NC_ECHAR)
|
|
error("wrong type: expecting NC_ECHAR but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
}
|
|
}
|
|
}
|
|
|
|
err = APIFunc(close)(ncid);
|
|
IF (err != NC_NOERR)
|
|
error("close: %s", APIFunc(strerror)(err));
|
|
|
|
nok += check_vars_$1(scratch, numVars);
|
|
|
|
err = FileDelete(scratch, info);
|
|
IF (err != NC_NOERR)
|
|
error("delete file %s failed", scratch);
|
|
return nok;
|
|
}
|
|
')dnl
|
|
|
|
TEST_NC_PUT_VAR(text)
|
|
TEST_NC_PUT_VAR(uchar)
|
|
TEST_NC_PUT_VAR(schar)
|
|
TEST_NC_PUT_VAR(short)
|
|
TEST_NC_PUT_VAR(int)
|
|
TEST_NC_PUT_VAR(long)
|
|
TEST_NC_PUT_VAR(float)
|
|
TEST_NC_PUT_VAR(double)
|
|
TEST_NC_PUT_VAR(ushort)
|
|
TEST_NC_PUT_VAR(uint)
|
|
TEST_NC_PUT_VAR(longlong)
|
|
TEST_NC_PUT_VAR(ulonglong)
|
|
|
|
|
|
dnl TEST_NC_PUT_VARA(TYPE)
|
|
dnl
|
|
define(`TEST_NC_PUT_VARA',dnl
|
|
`dnl
|
|
int
|
|
TestFunc(vara)_$1(VarArgs)
|
|
{
|
|
int i, j, k, d, err, nels, nslabs, ncid, cdf_format, nok=0;
|
|
int canConvert; /* Both text or both numeric */
|
|
int allInExtRange; /* all values within external range? */
|
|
IntType start[MAX_RANK], edge[MAX_RANK];
|
|
IntType mid[MAX_RANK], index[MAX_RANK];
|
|
$1 value[MAX_NELS];
|
|
|
|
err = FileCreate(scratch, NC_CLOBBER);
|
|
IF (err != NC_NOERR) {
|
|
error("create: %s", APIFunc(strerror)(err));
|
|
return nok;
|
|
}
|
|
|
|
err = APIFunc(inq_format)(ncid, &cdf_format);
|
|
IF (err != NC_NOERR)
|
|
error("inq_format: %s", APIFunc(strerror)(err));
|
|
|
|
def_dims(ncid);
|
|
DefVars(ncid, numVars);
|
|
|
|
err = APIFunc(enddef)(ncid);
|
|
IF (err != NC_NOERR)
|
|
error("enddef: %s", APIFunc(strerror)(err));
|
|
|
|
/* check if can detect a bad file ID */
|
|
err = PutVara($1)(BAD_ID, 0, NULL, NULL, NULL);
|
|
IF (err != NC_EBADID)
|
|
error("expecting NC_EBADID but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
|
|
/* check if can detect a bad variable ID */
|
|
err = PutVara($1)(ncid, BAD_VARID, NULL, NULL, NULL);
|
|
IF (err != NC_ENOTVAR)
|
|
error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
|
|
value[0] = 0;
|
|
for (i = 0; i < numVars; i++) {
|
|
canConvert = (var_type[i] == NC_CHAR) CheckText($1);
|
|
assert(var_rank[i] <= MAX_RANK);
|
|
assert(var_nels[i] <= MAX_NELS);
|
|
for (j = 0; j < var_rank[i]; j++) {
|
|
start[j] = 0;
|
|
edge[j] = 1;
|
|
}
|
|
|
|
for (j = 0; j < var_rank[i]; j++) {
|
|
if (var_dimid[i][j] > 0) { /* skip record dim */
|
|
start[j] = var_shape[i][j]; /* out of boundary check */
|
|
err = PutVara($1)(ncid, i, start, edge, value);
|
|
IF (canConvert && err != NC_EINVALCOORDS)
|
|
error("expecting NC_EINVALCOORDS, but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
start[j] = 0;
|
|
edge[j] = var_shape[i][j] + 1;
|
|
err = PutVara($1)(ncid, i, start, edge, value);
|
|
IF (canConvert && err != NC_EEDGE)
|
|
error("expecting NC_EEDGE but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
edge[j] = 1;
|
|
}
|
|
}
|
|
|
|
/* Check correct error returned even when nothing to put */
|
|
for (j = 0; j < var_rank[i]; j++) {
|
|
edge[j] = 0;
|
|
}
|
|
for (j = 0; j < var_rank[i]; j++) {
|
|
if (var_dimid[i][j] > 0) { /* skip record dim */
|
|
start[j] = var_shape[i][j]; /* out of boundary check */
|
|
err = PutVara($1)(ncid, i, start, edge, value);
|
|
IF (canConvert && err != NC_EINVALCOORDS)
|
|
error("expecting NC_EINVALCOORDS, but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
start[j] = 0;
|
|
}
|
|
}
|
|
|
|
/* wkliao: this test below of put_vara is redundant and incorrectly uses the
|
|
value[] set from the previously iteration. There is no such test
|
|
in put_vars and put_varm.
|
|
|
|
err = PutVara($1)(ncid, i, start, edge, value);
|
|
if (canConvert) {
|
|
IF (err != NC_NOERR)
|
|
error("%s", APIFunc(strerror)(err));
|
|
ELSE_NOK
|
|
} else {
|
|
IF (err != NC_ECHAR)
|
|
error("wrong type: expecting NC_ECHAR but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
}
|
|
*/
|
|
for (j = 0; j < var_rank[i]; j++) {
|
|
edge[j] = 1;
|
|
}
|
|
|
|
/* Choose a random point dividing each dim into 2 parts */
|
|
/* Put 2^rank (nslabs) slabs so defined */
|
|
nslabs = 1;
|
|
for (j = 0; j < var_rank[i]; j++) {
|
|
mid[j] = roll( var_shape[i][j] );
|
|
nslabs *= 2;
|
|
}
|
|
/* bits of k determine whether to put lower or upper part of dim */
|
|
for (k = 0; k < nslabs; k++) {
|
|
nels = 1;
|
|
for (j = 0; j < var_rank[i]; j++) {
|
|
if ((k >> j) & 1) {
|
|
start[j] = 0;
|
|
edge[j] = mid[j];
|
|
} else {
|
|
start[j] = mid[j];
|
|
edge[j] = var_shape[i][j] - mid[j];
|
|
}
|
|
nels *= edge[j];
|
|
}
|
|
for (allInExtRange = 1, j = 0; j < nels; j++) {
|
|
err = toMixedBase(j, var_rank[i], edge, index);
|
|
IF (err != NC_NOERR)
|
|
error("error in toMixedBase 1");
|
|
for (d = 0; d < var_rank[i]; d++)
|
|
index[d] += start[d];
|
|
value[j]= hash_$1(cdf_format,var_type[i], var_rank[i], index, NCT_ITYPE($1));
|
|
IfCheckTextChar($1, var_type[i])
|
|
allInExtRange &= inRange3(cdf_format, value[j], var_type[i], NCT_ITYPE($1));
|
|
}
|
|
if (var_rank[i] == 0 && i%2 == 0)
|
|
err = PutVara($1)(ncid, i, NULL, NULL, value);
|
|
else
|
|
err = PutVara($1)(ncid, i, start, edge, value);
|
|
if (canConvert) {
|
|
if (allInExtRange) {
|
|
IF (err != NC_NOERR)
|
|
error("%s", APIFunc(strerror)(err));
|
|
ELSE_NOK
|
|
} else {
|
|
IF (err != NC_ERANGE)
|
|
error("expecting NC_ERANGE but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
}
|
|
} else {
|
|
IF (nels > 0 && err != NC_ECHAR)
|
|
error("wrong type: expecting NC_ECHAR but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
}
|
|
}
|
|
}
|
|
|
|
err = APIFunc(close)(ncid);
|
|
IF (err != NC_NOERR)
|
|
error("close: %s", APIFunc(strerror)(err));
|
|
|
|
nok += check_vars_$1(scratch, numVars);
|
|
|
|
err = FileDelete(scratch, info);
|
|
IF (err != NC_NOERR)
|
|
error("delete file %s failed", scratch);
|
|
return nok;
|
|
}
|
|
')dnl
|
|
|
|
TEST_NC_PUT_VARA(text)
|
|
TEST_NC_PUT_VARA(uchar)
|
|
TEST_NC_PUT_VARA(schar)
|
|
TEST_NC_PUT_VARA(short)
|
|
TEST_NC_PUT_VARA(int)
|
|
TEST_NC_PUT_VARA(long)
|
|
TEST_NC_PUT_VARA(float)
|
|
TEST_NC_PUT_VARA(double)
|
|
TEST_NC_PUT_VARA(ushort)
|
|
TEST_NC_PUT_VARA(uint)
|
|
TEST_NC_PUT_VARA(longlong)
|
|
TEST_NC_PUT_VARA(ulonglong)
|
|
|
|
|
|
dnl TEST_NC_PUT_VARS(TYPE)
|
|
dnl
|
|
define(`TEST_NC_PUT_VARS',dnl
|
|
`dnl
|
|
int
|
|
TestFunc(vars)_$1(VarArgs)
|
|
{
|
|
int i, j, k, m, d, err, nels, nslabs, ncid, cdf_format, nok=0;
|
|
int nstarts; /* number of different starts */
|
|
int canConvert; /* Both text or both numeric */
|
|
int allInExtRange; /* all values within external range? */
|
|
IntType start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
|
|
IntType index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
|
|
IntType sstride[MAX_RANK];
|
|
PTRDType stride[MAX_RANK];
|
|
$1 value[MAX_NELS];
|
|
|
|
err = FileCreate(scratch, NC_CLOBBER);
|
|
IF (err != NC_NOERR) {
|
|
error("create: %s", APIFunc(strerror)(err));
|
|
return nok;
|
|
}
|
|
|
|
err = APIFunc(inq_format)(ncid, &cdf_format);
|
|
IF (err != NC_NOERR)
|
|
error("inq_format: %s", APIFunc(strerror)(err));
|
|
|
|
def_dims(ncid);
|
|
DefVars(ncid, numVars);
|
|
|
|
err = APIFunc(enddef)(ncid);
|
|
IF (err != NC_NOERR)
|
|
error("enddef: %s", APIFunc(strerror)(err));
|
|
|
|
/* check if can detect a bad file ID */
|
|
err = PutVars($1)(BAD_ID, 0, NULL, NULL, NULL, NULL);
|
|
IF (err != NC_EBADID)
|
|
error("expecting NC_EBADID but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
|
|
/* check if can detect a bad variable ID */
|
|
err = PutVars($1)(ncid, BAD_VARID, NULL, NULL, NULL, NULL);
|
|
IF (err != NC_ENOTVAR)
|
|
error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
|
|
for (i = 0; i < numVars; i++) {
|
|
canConvert = (var_type[i] == NC_CHAR) CheckText($1);
|
|
assert(var_rank[i] <= MAX_RANK);
|
|
assert(var_nels[i] <= MAX_NELS);
|
|
for (j = 0; j < var_rank[i]; j++) {
|
|
start[j] = 0;
|
|
edge[j] = 1;
|
|
stride[j] = 1;
|
|
}
|
|
|
|
for (j = 0; j < var_rank[i]; j++) {
|
|
if (var_dimid[i][j] > 0) { /* skip record dim */
|
|
start[j] = var_shape[i][j]; /* out of boundary check */
|
|
err = PutVars($1)(ncid, i, start, edge, stride, value);
|
|
if (!canConvert) {
|
|
IF (err != NC_ECHAR)
|
|
error("expecting NC_ECHAR but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
} else {
|
|
IF (err != NC_EINVALCOORDS)
|
|
error("expecting NC_EINVALCOORDS, but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
start[j] = 0;
|
|
edge[j] = var_shape[i][j] + 1;
|
|
err = PutVars($1)(ncid, i, start, edge, stride, value);
|
|
IF (err != NC_EEDGE)
|
|
error("expecting NC_EEDGE but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
edge[j] = 1;
|
|
stride[j] = 0;
|
|
err = PutVars($1)(ncid, i, start, edge, stride, value);
|
|
IF (err != NC_ESTRIDE)
|
|
error("expecting NC_ESTRIDE but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
stride[j] = 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Choose a random point dividing each dim into 2 parts */
|
|
/* Put 2^rank (nslabs) slabs so defined */
|
|
nslabs = 1;
|
|
for (j = 0; j < var_rank[i]; j++) {
|
|
mid[j] = roll( var_shape[i][j] );
|
|
nslabs *= 2;
|
|
}
|
|
/* bits of k determine whether to put lower or upper part of dim */
|
|
/* choose random stride from 1 to edge */
|
|
for (k = 0; k < nslabs; k++) {
|
|
nstarts = 1;
|
|
for (j = 0; j < var_rank[i]; j++) {
|
|
if ((k >> j) & 1) {
|
|
start[j] = 0;
|
|
edge[j] = mid[j];
|
|
} else {
|
|
start[j] = mid[j];
|
|
edge[j] = var_shape[i][j] - mid[j];
|
|
}
|
|
sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
|
|
nstarts *= stride[j];
|
|
}
|
|
for (m = 0; m < nstarts; m++) {
|
|
err = toMixedBase(m, var_rank[i], sstride, index);
|
|
IF (err != NC_NOERR)
|
|
error("error in toMixedBase");
|
|
nels = 1;
|
|
for (j = 0; j < var_rank[i]; j++) {
|
|
count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
|
|
nels *= count[j];
|
|
index[j] += start[j];
|
|
}
|
|
/* Random choice of forward or backward */
|
|
/* TODO
|
|
if ( roll(2) ) {
|
|
for (j = 0; j < var_rank[i]; j++) {
|
|
index[j] += (count[j] - 1) * stride[j];
|
|
stride[j] = -stride[j];
|
|
}
|
|
}
|
|
*/
|
|
for (allInExtRange = 1, j = 0; j < nels; j++) {
|
|
err = toMixedBase(j, var_rank[i], count, index2);
|
|
IF (err != NC_NOERR)
|
|
error("error in toMixedBase");
|
|
for (d = 0; d < var_rank[i]; d++)
|
|
index2[d] = index[d] + index2[d] * stride[d];
|
|
value[j] = hash_$1(cdf_format,var_type[i], var_rank[i], index2,
|
|
NCT_ITYPE($1));
|
|
IfCheckTextChar($1, var_type[i])
|
|
allInExtRange &= inRange3(cdf_format, value[j], var_type[i], NCT_ITYPE($1));
|
|
}
|
|
if (var_rank[i] == 0 && i%2 == 0)
|
|
err = PutVars($1)(ncid, i, NULL, NULL, stride, value);
|
|
else
|
|
err = PutVars($1)(ncid, i, index, count, stride, value);
|
|
if (canConvert) {
|
|
if (allInExtRange) {
|
|
IF (err != NC_NOERR)
|
|
error("%s", APIFunc(strerror)(err));
|
|
ELSE_NOK
|
|
} else {
|
|
IF (err != NC_ERANGE)
|
|
error("expecting NC_ERANGE but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
}
|
|
} else {
|
|
IF (nels > 0 && err != NC_ECHAR)
|
|
error("wrong type: expecting NC_ECHAR but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
err = APIFunc(close)(ncid);
|
|
IF (err != NC_NOERR)
|
|
error("close: %s", APIFunc(strerror)(err));
|
|
|
|
nok += check_vars_$1(scratch, numVars);
|
|
|
|
err = FileDelete(scratch, info);
|
|
IF (err != NC_NOERR)
|
|
error("delete file %s failed", scratch);
|
|
return nok;
|
|
}
|
|
')dnl
|
|
|
|
TEST_NC_PUT_VARS(text)
|
|
TEST_NC_PUT_VARS(uchar)
|
|
TEST_NC_PUT_VARS(schar)
|
|
TEST_NC_PUT_VARS(short)
|
|
TEST_NC_PUT_VARS(int)
|
|
TEST_NC_PUT_VARS(long)
|
|
TEST_NC_PUT_VARS(float)
|
|
TEST_NC_PUT_VARS(double)
|
|
TEST_NC_PUT_VARS(ushort)
|
|
TEST_NC_PUT_VARS(uint)
|
|
TEST_NC_PUT_VARS(longlong)
|
|
TEST_NC_PUT_VARS(ulonglong)
|
|
|
|
|
|
dnl TEST_NC_PUT_VARM(TYPE)
|
|
dnl
|
|
define(`TEST_NC_PUT_VARM',dnl
|
|
`dnl
|
|
int
|
|
TestFunc(varm)_$1(VarArgs)
|
|
{
|
|
int i, j, k, m, d, err, nels, nslabs, ncid, cdf_format, nok=0;
|
|
int nstarts; /* number of different starts */
|
|
int canConvert; /* Both text or both numeric */
|
|
int allInExtRange; /* all values within external range? */
|
|
IntType start[MAX_RANK], edge[MAX_RANK], index[MAX_RANK];
|
|
IntType index2[MAX_RANK], mid[MAX_RANK], count[MAX_RANK];
|
|
IntType sstride[MAX_RANK];
|
|
PTRDType stride[MAX_RANK], imap[MAX_RANK];
|
|
$1 value[MAX_NELS];
|
|
|
|
err = FileCreate(scratch, NC_CLOBBER);
|
|
IF (err != NC_NOERR) {
|
|
error("create: %s", APIFunc(strerror)(err));
|
|
return nok;
|
|
}
|
|
|
|
err = APIFunc(inq_format)(ncid, &cdf_format);
|
|
IF (err != NC_NOERR)
|
|
error("inq_format: %s", APIFunc(strerror)(err));
|
|
|
|
def_dims(ncid);
|
|
DefVars(ncid, numVars);
|
|
|
|
err = APIFunc(enddef)(ncid);
|
|
IF (err != NC_NOERR)
|
|
error("enddef: %s", APIFunc(strerror)(err));
|
|
|
|
/* check if can detect a bad file ID */
|
|
err = PutVarm($1)(BAD_ID, 0, NULL, NULL, NULL, NULL, NULL);
|
|
IF (err != NC_EBADID)
|
|
error("expecting NC_EBADID but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
|
|
/* check if can detect a bad variable ID */
|
|
err = PutVarm($1)(ncid, BAD_VARID, NULL, NULL, NULL, NULL, NULL);
|
|
IF (err != NC_ENOTVAR)
|
|
error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
|
|
for (i = 0; i < numVars; i++) {
|
|
canConvert = (var_type[i] == NC_CHAR) CheckText($1);
|
|
assert(var_rank[i] <= MAX_RANK);
|
|
assert(var_nels[i] <= MAX_NELS);
|
|
for (j = 0; j < var_rank[i]; j++) {
|
|
start[j] = 0;
|
|
edge[j] = 1;
|
|
stride[j] = 1;
|
|
imap[j] = 1;
|
|
}
|
|
|
|
for (j = 0; j < var_rank[i]; j++) {
|
|
if (var_dimid[i][j] > 0) { /* skip record dim */
|
|
start[j] = var_shape[i][j]; /* out of boundary check */
|
|
err = PutVarm($1)(ncid, i, start, edge, stride, imap, value);
|
|
if (!canConvert) {
|
|
IF (err != NC_ECHAR)
|
|
error("expecting NC_ECHAR but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
} else {
|
|
IF (err != NC_EINVALCOORDS)
|
|
error("expecting NC_EINVALCOORDS, but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
start[j] = 0;
|
|
edge[j] = var_shape[i][j] + 1;
|
|
err = PutVarm($1)(ncid, i, start, edge, stride, imap, value);
|
|
IF (err != NC_EEDGE)
|
|
error("expecting NC_EEDGE but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
edge[j] = 1;
|
|
stride[j] = 0;
|
|
err = PutVarm($1)(ncid, i, start, edge, stride, imap, value);
|
|
IF (err != NC_ESTRIDE)
|
|
error("expecting NC_ESTRIDE but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
stride[j] = 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Choose a random point dividing each dim into 2 parts */
|
|
/* Put 2^rank (nslabs) slabs so defined */
|
|
nslabs = 1;
|
|
for (j = 0; j < var_rank[i]; j++) {
|
|
mid[j] = roll( var_shape[i][j] );
|
|
nslabs *= 2;
|
|
}
|
|
/* bits of k determine whether to put lower or upper part of dim */
|
|
/* choose random stride from 1 to edge */
|
|
for (k = 0; k < nslabs; k++) {
|
|
nstarts = 1;
|
|
for (j = 0; j < var_rank[i]; j++) {
|
|
if ((k >> j) & 1) {
|
|
start[j] = 0;
|
|
edge[j] = mid[j];
|
|
} else {
|
|
start[j] = mid[j];
|
|
edge[j] = var_shape[i][j] - mid[j];
|
|
}
|
|
sstride[j] = stride[j] = edge[j] > 0 ? 1+roll(edge[j]) : 1;
|
|
nstarts *= stride[j];
|
|
}
|
|
for (m = 0; m < nstarts; m++) {
|
|
err = toMixedBase(m, var_rank[i], sstride, index);
|
|
IF (err != NC_NOERR)
|
|
error("error in toMixedBase");
|
|
nels = 1;
|
|
for (j = 0; j < var_rank[i]; j++) {
|
|
count[j] = 1 + (edge[j] - index[j] - 1) / stride[j];
|
|
nels *= count[j];
|
|
index[j] += start[j];
|
|
}
|
|
/* Random choice of forward or backward */
|
|
/* TODO
|
|
if ( roll(2) ) {
|
|
for (j = 0; j < var_rank[i]; j++) {
|
|
index[j] += (count[j] - 1) * stride[j];
|
|
stride[j] = -stride[j];
|
|
}
|
|
}
|
|
*/
|
|
if (var_rank[i] > 0) {
|
|
j = var_rank[i] - 1;
|
|
imap[j] = 1;
|
|
for (; j > 0; j--)
|
|
imap[j-1] = imap[j] * count[j];
|
|
}
|
|
for (allInExtRange = 1, j = 0; j < nels; j++) {
|
|
err = toMixedBase(j, var_rank[i], count, index2);
|
|
IF (err != NC_NOERR)
|
|
error("error in toMixedBase");
|
|
for (d = 0; d < var_rank[i]; d++)
|
|
index2[d] = index[d] + index2[d] * stride[d];
|
|
value[j] = hash_$1(cdf_format,var_type[i], var_rank[i], index2,
|
|
NCT_ITYPE($1));
|
|
IfCheckTextChar($1, var_type[i])
|
|
allInExtRange &= inRange3(cdf_format, value[j], var_type[i], NCT_ITYPE($1));
|
|
}
|
|
if (var_rank[i] == 0 && i%2 == 0)
|
|
err = PutVarm($1)(ncid,i,NULL,NULL,NULL,NULL,value);
|
|
else
|
|
err = PutVarm($1)(ncid,i,index,count,stride,imap,value);
|
|
if (canConvert) {
|
|
if (allInExtRange) {
|
|
IF (err != NC_NOERR)
|
|
error("%s", APIFunc(strerror)(err));
|
|
ELSE_NOK
|
|
} else {
|
|
IF (err != NC_ERANGE)
|
|
error("expecting NC_ERANGE but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
}
|
|
} else {
|
|
IF (nels > 0 && err != NC_ECHAR)
|
|
error("wrong type: expecting NC_ECHAR but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
err = APIFunc(close)(ncid);
|
|
IF (err != NC_NOERR)
|
|
error("close: %s", APIFunc(strerror)(err));
|
|
|
|
nok += check_vars_$1(scratch, numVars);
|
|
|
|
err = FileDelete(scratch, info);
|
|
IF (err != NC_NOERR)
|
|
error("delete file %s failed", scratch);
|
|
return nok;
|
|
}
|
|
')dnl
|
|
|
|
TEST_NC_PUT_VARM(text)
|
|
TEST_NC_PUT_VARM(uchar)
|
|
TEST_NC_PUT_VARM(schar)
|
|
TEST_NC_PUT_VARM(short)
|
|
TEST_NC_PUT_VARM(int)
|
|
TEST_NC_PUT_VARM(long)
|
|
TEST_NC_PUT_VARM(float)
|
|
TEST_NC_PUT_VARM(double)
|
|
TEST_NC_PUT_VARM(ushort)
|
|
TEST_NC_PUT_VARM(uint)
|
|
TEST_NC_PUT_VARM(longlong)
|
|
TEST_NC_PUT_VARM(ulonglong)
|
|
|
|
|
|
int
|
|
TestFunc(att)_text(AttVarArgs)
|
|
{
|
|
int i, j, err, ncid, nok=0;
|
|
IntType k;
|
|
text value[MAX_NELS];
|
|
|
|
err = FileCreate(scratch, NC_NOCLOBBER);
|
|
IF (err != NC_NOERR) {
|
|
error("create: %s", APIFunc(strerror)(err));
|
|
return nok;
|
|
}
|
|
def_dims(ncid);
|
|
DefVars(ncid, numVars);
|
|
|
|
/* check if can detect a bad file ID */
|
|
err = PutAtt(text)(BAD_ID, 0, NULL, 0, NULL);
|
|
IF (err != NC_EBADID)
|
|
error("expecting NC_EBADID but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
|
|
/* check if can detect a bad variable ID */
|
|
err = PutAtt(text)(ncid, BAD_VARID, NULL, 0, NULL);
|
|
IF (err != NC_ENOTVAR)
|
|
error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
|
|
{
|
|
const char *const tval = "value for bad name";
|
|
const size_t tval_len = strlen(tval);
|
|
|
|
err = PutAtt(text)(ncid, 0, "", tval_len, tval);
|
|
IF (err != NC_EBADNAME)
|
|
error("expecting NC_EBADNAME but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
}
|
|
for (i = -1; i < numVars; i++) {
|
|
for (j = 0; j < NATTS(i); j++) {
|
|
if (ATT_TYPE(i,j) == NC_CHAR) {
|
|
assert(ATT_LEN(i,j) <= MAX_NELS);
|
|
|
|
err = PutAtt(text)(ncid, BAD_VARID, ATT_NAME(i,j), ATT_LEN(i,j), value);
|
|
IF (err != NC_ENOTVAR)
|
|
error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
|
|
for (k = 0; k < ATT_LEN(i,j); k++) {
|
|
value[k] = hash(ATT_TYPE(i,j), -1, &k);
|
|
}
|
|
err = PutAtt(text)(ncid, i, ATT_NAME(i,j), ATT_LEN(i,j), value);
|
|
IF (err != NC_NOERR)
|
|
error("%s", APIFunc(strerror)(err));
|
|
ELSE_NOK
|
|
}
|
|
}
|
|
}
|
|
|
|
nok += check_atts_text(ncid, numGatts, numVars);
|
|
err = APIFunc(close)(ncid);
|
|
IF (err != NC_NOERR)
|
|
error("close: %s", APIFunc(strerror)(err));
|
|
|
|
err = FileDelete(scratch, info);
|
|
IF (err != NC_NOERR)
|
|
error("delete file %s failed", scratch);
|
|
return nok;
|
|
}
|
|
|
|
|
|
dnl TEST_NC_PUT_ATT(TYPE) numeric only
|
|
dnl
|
|
define(`TEST_NC_PUT_ATT',dnl
|
|
`dnl
|
|
int
|
|
TestFunc(att)_$1(AttVarArgs)
|
|
{
|
|
int i, j, err, ncid, cdf_format, nok=0;
|
|
int allInExtRange; /* all values within external range? */
|
|
IntType k;
|
|
$1 value[MAX_NELS];
|
|
|
|
err = FileCreate(scratch, NC_NOCLOBBER);
|
|
IF (err != NC_NOERR) {
|
|
error("create: %s", APIFunc(strerror)(err));
|
|
return nok;
|
|
}
|
|
|
|
err = APIFunc(inq_format)(ncid, &cdf_format);
|
|
IF (err != NC_NOERR)
|
|
error("inq_format: %s", APIFunc(strerror)(err));
|
|
|
|
def_dims(ncid);
|
|
DefVars(ncid, numVars);
|
|
|
|
/* check if can detect a bad file ID */
|
|
err = PutAtt($1)(BAD_ID, 0, NULL, 0, 0, NULL);
|
|
IF (err != NC_EBADID)
|
|
error("expecting NC_EBADID but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
|
|
/* check if can detect a bad variable ID */
|
|
err = PutAtt($1)(ncid, BAD_VARID, NULL, 0, 0, NULL);
|
|
IF (err != NC_ENOTVAR)
|
|
error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
|
|
for (i = -1; i < numVars; i++) {
|
|
for (j = 0; j < NATTS(i); j++) {
|
|
if (!(ATT_TYPE(i,j) == NC_CHAR)) {
|
|
assert(ATT_LEN(i,j) <= MAX_NELS);
|
|
|
|
err = PutAtt($1)(ncid, BAD_VARID, ATT_NAME(i,j), ATT_TYPE(i,j), ATT_LEN(i,j), value);
|
|
IF (err != NC_ENOTVAR)
|
|
error("expecting NC_ENOTVAR but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
|
|
/* check if can detect a bad name */
|
|
err = PutAtt($1)(ncid, i, NULL, 0, 0, NULL);
|
|
IF (err != NC_EBADNAME)
|
|
error("expecting NC_EBADNAME but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
|
|
err = PutAtt($1)(ncid, i, ATT_NAME(i,j), BAD_TYPE, ATT_LEN(i,j), value);
|
|
IF (err != NC_EBADTYPE)
|
|
error("expecting NC_EBADTYPE but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
|
|
for (allInExtRange = 1, k = 0; k < ATT_LEN(i,j); k++) {
|
|
value[k] = hash_$1(cdf_format,ATT_TYPE(i,j), -1, &k, NCT_ITYPE($1));
|
|
IfCheckTextChar($1, ATT_TYPE(i,j))
|
|
allInExtRange &= inRange3(cdf_format, value[k], ATT_TYPE(i,j), NCT_ITYPE($1));
|
|
}
|
|
err = PutAtt($1)(ncid, i, ATT_NAME(i,j), ATT_TYPE(i,j), ATT_LEN(i,j), value);
|
|
if (allInExtRange) {
|
|
IF (err != NC_NOERR)
|
|
error("%s", APIFunc(strerror)(err));
|
|
ELSE_NOK
|
|
} else {
|
|
IF (err != NC_ERANGE)
|
|
error("expecting NC_ERANGE but got %s", nc_err_code_name(err));
|
|
ELSE_NOK
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
nok += check_atts_$1(ncid, numGatts, numVars);
|
|
err = APIFunc(close)(ncid);
|
|
IF (err != NC_NOERR)
|
|
error("close: %s", APIFunc(strerror)(err));
|
|
|
|
err = FileDelete(scratch, info);
|
|
IF (err != NC_NOERR)
|
|
error("delete file %s failed", scratch);
|
|
return nok;
|
|
}
|
|
')dnl
|
|
|
|
TEST_NC_PUT_ATT(uchar)
|
|
TEST_NC_PUT_ATT(schar)
|
|
TEST_NC_PUT_ATT(short)
|
|
TEST_NC_PUT_ATT(int)
|
|
TEST_NC_PUT_ATT(long)
|
|
TEST_NC_PUT_ATT(float)
|
|
TEST_NC_PUT_ATT(double)
|
|
TEST_NC_PUT_ATT(ushort)
|
|
TEST_NC_PUT_ATT(uint)
|
|
TEST_NC_PUT_ATT(longlong)
|
|
TEST_NC_PUT_ATT(ulonglong)
|
|
|