mirror of
https://github.com/Unidata/netcdf-c.git
synced 2025-01-30 16:10:44 +08:00
Because ncx.c and putget.c are to be released with the package in case users do not have m4, the generation of the two C files cannot depend on the configure option of --enable-erange-fill. This commit fixes this problem by replacing m4 conditional define with C conditional preprocess.
This commit is contained in:
parent
2a68d58433
commit
8b6d131cbe
@ -1027,6 +1027,7 @@ SET(STATUS_ERANGE_FILL "OFF")
|
||||
OPTION(ENABLE_ERANGE_FILL "Enable use of fill value when out-of-range type conversion causes NC_ERANGE error." OF)
|
||||
IF(ENABLE_ERANGE_FILL)
|
||||
SET(STATUS_ERANGE_FILL "ON")
|
||||
ADD_DEFINITIONS(-DERANGE_FILL)
|
||||
ENDIF()
|
||||
|
||||
# Options to use a more relaxed coordinate argument boundary check
|
||||
|
@ -1192,6 +1192,7 @@ if test "x$enable_erange_fill" = xyes ; then
|
||||
else
|
||||
M4FLAGS="$M4FLAGS -DERANGE_FILL"
|
||||
fi
|
||||
AC_DEFINE([ERANGE_FILL], [1], [if true, use _FillValue for NC_ERANGE data elements])
|
||||
fi
|
||||
AC_SUBST(M4FLAGS)
|
||||
|
||||
|
114
libsrc/ncx.m4
114
libsrc/ncx.m4
@ -16,11 +16,14 @@ dnl
|
||||
#endif
|
||||
|
||||
dnl
|
||||
dnl If the m4 macro "ERANGE_FILL" is defined, the I/O to data elements
|
||||
dnl that cause NC_ERANGE will be filled with the NC default fill values.
|
||||
dnl If "ERANGE_FILL" is defined, the data elements that cause NC_ERANGE will
|
||||
dnl be filled with the NC default fill values.
|
||||
dnl
|
||||
|
||||
define(`SKIP_LOOP', `ifdef(`ERANGE_FILL', `$1++; $2++; continue;')')
|
||||
define(`SKIP_LOOP', `
|
||||
#ifdef ERANGE_FILL
|
||||
$1++; $2++; continue;
|
||||
#endif')
|
||||
|
||||
dnl
|
||||
dnl The command-line m4 macro "PNETCDF" is to differentiate PnetCDF and netCDF
|
||||
@ -79,7 +82,9 @@ ifdef(`PNETCDF',,`define(`DEBUG_ASSIGN_ERROR',`$1 = $2;')')
|
||||
dnl
|
||||
dnl *fillp is the fill value in internal representation
|
||||
dnl
|
||||
define(`FillValue', `ifdef(`ERANGE_FILL', `ifelse(
|
||||
define(`FillValue', `
|
||||
#ifdef ERANGE_FILL
|
||||
ifelse(
|
||||
`$1', `schar', `if (fillp != NULL) memcpy($2, fillp, 1);',dnl
|
||||
`$1', `uchar', `if (fillp != NULL) memcpy($2, fillp, 1);',dnl
|
||||
`$1', `short', `if (fillp != NULL) memcpy($2, fillp, 2);',dnl
|
||||
@ -93,7 +98,8 @@ define(`FillValue', `ifdef(`ERANGE_FILL', `ifelse(
|
||||
`$1', `longlong', `if (fillp != NULL) memcpy($2, fillp, 8);',dnl
|
||||
`$1', `int64', `if (fillp != NULL) memcpy($2, fillp, 8);',dnl
|
||||
`$1', `ulonglong', `if (fillp != NULL) memcpy($2, fillp, 8);',dnl
|
||||
`$1', `uint64', `if (fillp != NULL) memcpy($2, fillp, 8);')')')dnl
|
||||
`$1', `uint64', `if (fillp != NULL) memcpy($2, fillp, 8);')
|
||||
#endif')dnl
|
||||
|
||||
dnl
|
||||
dnl
|
||||
@ -623,7 +629,9 @@ dnl For GET APIs boundary check
|
||||
dnl
|
||||
define(`GETF_CheckBND',
|
||||
`if (xx > (double)Upcase($1)_MAX || xx < Dmin($1)) {
|
||||
ifdef(`ERANGE_FILL',`*ip = FillDefaultValue($1);')
|
||||
#ifdef ERANGE_FILL
|
||||
*ip = FillDefaultValue($1);
|
||||
#endif
|
||||
DEBUG_RETURN_ERROR(NC_ERANGE)
|
||||
}
|
||||
*ip = ($1)xx;')dnl
|
||||
@ -637,7 +645,9 @@ define(`GETF_CheckBND2',
|
||||
`if (xx == Upcase($1)_MAX) *ip = Upcase($1)_MAX;
|
||||
else if (xx == Upcase($1)_MIN) *ip = Upcase($1)_MIN;')
|
||||
else if (xx > (double)Upcase($1)_MAX || xx < Dmin($1)) {
|
||||
ifdef(`ERANGE_FILL',`*ip = FillDefaultValue($1);')
|
||||
#ifdef ERANGE_FILL
|
||||
*ip = FillDefaultValue($1);
|
||||
#endif
|
||||
DEBUG_RETURN_ERROR(NC_ERANGE)
|
||||
}
|
||||
else *ip = ($1)xx;')
|
||||
@ -691,19 +701,23 @@ ifelse(`$3', `1',
|
||||
if (xx > Imax($2)'`ifelse(index(`$1',`u'), 0, ,
|
||||
index(`$2',`u'), 0, ,
|
||||
` || xx < Imin($2)')'`) {
|
||||
ifdef(`ERANGE_FILL',`dnl
|
||||
#ifdef ERANGE_FILL
|
||||
*ip = FillDefaultValue($2);
|
||||
DEBUG_RETURN_ERROR(NC_ERANGE)',`
|
||||
DEBUG_ASSIGN_ERROR(err, NC_ERANGE)')
|
||||
DEBUG_RETURN_ERROR(NC_ERANGE)
|
||||
#else
|
||||
DEBUG_ASSIGN_ERROR(err, NC_ERANGE)
|
||||
#endif
|
||||
}'
|
||||
`#'endif
|
||||
|
||||
`ifelse(index(`$1',`u'), 0, , index(`$2',`u'), 0,`dnl
|
||||
if (xx < 0) {
|
||||
ifdef(`ERANGE_FILL',`dnl
|
||||
#ifdef ERANGE_FILL
|
||||
*ip = FillDefaultValue($2);
|
||||
DEBUG_RETURN_ERROR(NC_ERANGE)',`
|
||||
DEBUG_ASSIGN_ERROR(err, NC_ERANGE)') /* because ip is unsigned */
|
||||
DEBUG_RETURN_ERROR(NC_ERANGE)
|
||||
#else
|
||||
DEBUG_ASSIGN_ERROR(err, NC_ERANGE) /* because ip is unsigned */
|
||||
#endif
|
||||
}')'dnl
|
||||
|
||||
*ip = ($2) xx;
|
||||
@ -728,11 +742,17 @@ APIPrefix`x_put_'NC_TYPE($1)_$2(void *xp, const $2 *ip, void *fillp)
|
||||
ifelse(`$2', `double', `if (*ip > Xmax($1) || *ip < DXmin($1)) {
|
||||
FillValue($1, &xx)
|
||||
DEBUG_ASSIGN_ERROR(err, NC_ERANGE)
|
||||
} ifdef(`ERANGE_FILL',`else')',
|
||||
}
|
||||
#ifdef ERANGE_FILL
|
||||
else
|
||||
#endif',
|
||||
`$2', `float', `if (*ip > (double)Xmax($1) || *ip < FXmin($1)) {
|
||||
FillValue($1, &xx)
|
||||
DEBUG_ASSIGN_ERROR(err, NC_ERANGE)
|
||||
} ifdef(`ERANGE_FILL',`else')')
|
||||
}
|
||||
#ifdef ERANGE_FILL
|
||||
else
|
||||
#endif')
|
||||
xx = (ix_$1)*ip;
|
||||
|
||||
put_ix_$1(xp, &xx);
|
||||
@ -763,13 +783,19 @@ ifelse(`$3', `1',
|
||||
` || *ip < Xmin($1)')'`) {
|
||||
FillValue($1, &xx)
|
||||
DEBUG_ASSIGN_ERROR(err, NC_ERANGE)
|
||||
} ifdef(`ERANGE_FILL',`else')
|
||||
}
|
||||
#ifdef ERANGE_FILL
|
||||
else
|
||||
#endif
|
||||
`#'endif
|
||||
ifelse(index(`$1',`u'), 0, `ifelse(index(`$2',`u'), 0, ,`dnl
|
||||
if (*ip < 0) {
|
||||
FillValue($1, &xx)
|
||||
DEBUG_ASSIGN_ERROR(err, NC_ERANGE) /* because xp is unsigned */
|
||||
} ifdef(`ERANGE_FILL',`else')
|
||||
}
|
||||
#ifdef ERANGE_FILL
|
||||
else
|
||||
#endif
|
||||
')')dnl
|
||||
xx = (ix_$1)*ip;
|
||||
|
||||
@ -937,13 +963,15 @@ APIPrefix`x_put_'NC_TYPE(ushort)_schar(void *xp, const schar *ip, void *fillp)
|
||||
int err=NC_NOERR;
|
||||
uchar *cp;
|
||||
if (*ip < 0) {
|
||||
ifdef(`ERANGE_FILL', `dnl
|
||||
#ifdef ERANGE_FILL
|
||||
if (fillp != NULL) memcpy(xp, fillp, 2);
|
||||
#ifndef WORDS_BIGENDIAN
|
||||
swapn2b(xp, xp, 1);
|
||||
#endif
|
||||
DEBUG_RETURN_ERROR(NC_ERANGE)',`dnl
|
||||
DEBUG_ASSIGN_ERROR(err, NC_ERANGE)')
|
||||
DEBUG_RETURN_ERROR(NC_ERANGE)
|
||||
#else
|
||||
DEBUG_ASSIGN_ERROR(err, NC_ERANGE)
|
||||
#endif
|
||||
}
|
||||
|
||||
cp = (uchar *) xp;
|
||||
@ -1146,11 +1174,12 @@ APIPrefix`x_put_'NC_TYPE(uint)_schar(void *xp, const schar *ip, void *fillp)
|
||||
{
|
||||
uchar *cp;
|
||||
if (*ip < 0) {
|
||||
ifdef(`ERANGE_FILL', `dnl
|
||||
#ifdef ERANGE_FILL
|
||||
if (fillp != NULL) memcpy(xp, fillp, 4);
|
||||
#ifndef WORDS_BIGENDIAN
|
||||
swapn4b(xp, xp, 1);
|
||||
#endif')
|
||||
#endif
|
||||
#endif
|
||||
DEBUG_RETURN_ERROR(NC_ERANGE)
|
||||
}
|
||||
|
||||
@ -1628,10 +1657,14 @@ APIPrefix`x_put_'NC_TYPE(float)_float(void *xp, const float *ip, void *fillp)
|
||||
int err=NC_NOERR;
|
||||
float *_ip=ip;
|
||||
#ifdef NO_IEEE_FLOAT
|
||||
ifdef(`ERANGE_FILL',`float tmp;')
|
||||
#ifdef ERANGE_FILL
|
||||
float tmp;
|
||||
#endif
|
||||
if (*ip > X_FLOAT_MAX || *ip < X_FLOAT_MIN) {
|
||||
FillValue(float, &tmp)
|
||||
ifdef(`ERANGE_FILL',`_ip = &tmp;')
|
||||
#ifdef ERANGE_FILL
|
||||
_ip = &tmp;
|
||||
#endif
|
||||
DEBUG_ASSIGN_ERROR(err, NC_ERANGE)
|
||||
}
|
||||
#endif
|
||||
@ -1947,11 +1980,19 @@ APIPrefix`x_get_'NC_TYPE(double)_float(const void *xp, float *ip)
|
||||
double xx;
|
||||
get_ix_double(xp, &xx);
|
||||
if (xx > FLT_MAX) {
|
||||
ifdef(`ERANGE_FILL', `*ip = NC_FILL_FLOAT;', `*ip = FLT_MAX;')
|
||||
#ifdef ERANGE_FILL
|
||||
*ip = NC_FILL_FLOAT;
|
||||
#else
|
||||
*ip = FLT_MAX;
|
||||
#endif
|
||||
DEBUG_RETURN_ERROR(NC_ERANGE)
|
||||
}
|
||||
if (xx < (-FLT_MAX)) {
|
||||
ifdef(`ERANGE_FILL', `*ip = NC_FILL_FLOAT;', `*ip = (-FLT_MAX);')
|
||||
#ifdef ERANGE_FILL
|
||||
*ip = NC_FILL_FLOAT;
|
||||
#else
|
||||
*ip = (-FLT_MAX);
|
||||
#endif
|
||||
DEBUG_RETURN_ERROR(NC_ERANGE)
|
||||
}
|
||||
*ip = (float) xx;
|
||||
@ -1987,7 +2028,10 @@ APIPrefix`x_put_'NC_TYPE(double)_float(void *xp, const float *ip, void *fillp)
|
||||
if ((double)(*ip) > X_DOUBLE_MAX || (double)(*ip) < X_DOUBLE_MIN) {
|
||||
FillValue(double, &xx)
|
||||
DEBUG_ASSIGN_ERROR(err, NC_ERANGE)
|
||||
} ifdef(`ERANGE_FILL',`else')
|
||||
}
|
||||
#ifdef ERANGE_FILL
|
||||
else
|
||||
#endif
|
||||
#endif
|
||||
xx = (double) *ip;
|
||||
|
||||
@ -2002,10 +2046,14 @@ APIPrefix`x_put_'NC_TYPE(double)_double(void *xp, const double *ip, void *fillp)
|
||||
int err=NC_NOERR;
|
||||
double *_ip = ip;
|
||||
#ifdef NO_IEEE_FLOAT
|
||||
ifdef(`ERANGE_FILL',`double tmp=NC_FILL_DOUBLE;')
|
||||
#ifdef ERANGE_FILL
|
||||
double tmp=NC_FILL_DOUBLE;
|
||||
#endif
|
||||
if (*ip > X_DOUBLE_MAX || *ip < X_DOUBLE_MIN) {
|
||||
FillValue(double, &tmp)
|
||||
ifdef(`ERANGE_FILL',`_ip = &tmp;')
|
||||
#ifdef ERANGE_FILL
|
||||
_ip = &tmp;
|
||||
#endif
|
||||
DEBUG_ASSIGN_ERROR(err, NC_ERANGE)
|
||||
}
|
||||
#endif
|
||||
@ -2468,7 +2516,9 @@ APIPrefix`x_getn_'NC_TYPE($1)_$2(const void **xpp, IntType nelems, $2 *tp)
|
||||
ifelse(index(`$1',`u'), 0, ,
|
||||
index(`$2',`u'), 0, `
|
||||
if (*xp < 0) {
|
||||
ifdef(`ERANGE_FILL',`*tp = FillDefaultValue($2);')
|
||||
#ifdef ERANGE_FILL
|
||||
*tp = FillDefaultValue($2);
|
||||
#endif
|
||||
DEBUG_ASSIGN_ERROR(status, NC_ERANGE) /* because tp is unsigned */
|
||||
SKIP_LOOP(xp, tp)
|
||||
}')dnl
|
||||
@ -2500,7 +2550,9 @@ APIPrefix`x_pad_getn_'NC_TYPE($1)_$2(const void **xpp, IntType nelems, $2 *tp)
|
||||
ifelse(index(`$1',`u'), 0, ,
|
||||
index(`$2',`u'), 0, `
|
||||
if (*xp < 0) {
|
||||
ifdef(`ERANGE_FILL', `*tp = FillDefaultValue($2);')
|
||||
#ifdef ERANGE_FILL
|
||||
*tp = FillDefaultValue($2);
|
||||
#endif
|
||||
DEBUG_ASSIGN_ERROR(status, NC_ERANGE) /* because tp is unsigned */
|
||||
SKIP_LOOP(xp, tp)
|
||||
}')dnl
|
||||
|
@ -711,8 +711,10 @@ putNCvx_$1_$2(NC3_INFO* ncp, const NC_var *varp,
|
||||
|
||||
assert(value != NULL);
|
||||
|
||||
ifdef(`ERANGE_FILL',`fillp = malloc(varp->xsz);
|
||||
status = NC3_inq_var_fill(varp, fillp);')
|
||||
#ifdef ERANGE_FILL
|
||||
fillp = malloc(varp->xsz);
|
||||
status = NC3_inq_var_fill(varp, fillp);
|
||||
#endif
|
||||
|
||||
for(;;)
|
||||
{
|
||||
@ -741,7 +743,9 @@ putNCvx_$1_$2(NC3_INFO* ncp, const NC_var *varp,
|
||||
value += nput;
|
||||
|
||||
}
|
||||
ifdef(`ERANGE_FILL',`free(fillp);')
|
||||
#ifdef ERANGE_FILL
|
||||
free(fillp);
|
||||
#endif
|
||||
|
||||
return status;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user