#include <string.h>
#include <errno.h>

#include "netcdf.h"
#include "nfconfig.inc"
#include "ncfortran.h"


/*
 * Write an attribute from a FORTRAN CHARACTER*(*) variable.
 */
FCALLSCFUN5(NF_INT, nc_put_att_text, NF_PUT_ATT_TEXT, nf_put_att_text,
	    NCID, VARID, STRING, COUNT, CBUF)


/*
 * Read an attribute into a FORTRAN CHARACTER*(*) variable.
 */
FCALLSCFUN4(NF_INT, nc_get_att_text, NF_GET_ATT_TEXT, nf_get_att_text,
	    NCID, VARID, STRING, CBUF)


/*
 * Write an attribute from an INTEGER*1 array.
 */
#if NF_INT1_IS_C_SIGNED_CHAR
FCALLSCFUN6(NF_INT, nc_put_att_schar, NF_PUT_ATT_INT1, nf_put_att_int1,
	    NCID, VARID, STRING, TYPE, COUNT, INT1ATT)
#elif NF_INT1_IS_C_SHORT
FCALLSCFUN6(NF_INT, nc_put_att_short, NF_PUT_ATT_INT1, nf_put_att_int1,
	    NCID, VARID, STRING, TYPE, COUNT, INT1ATT)
#elif NF_INT1_IS_C_INT
FCALLSCFUN6(NF_INT, nc_put_att_int, NF_PUT_ATT_INT1, nf_put_att_int1,
	    NCID, VARID, STRING, TYPE, COUNT, INT1ATT)
#elif NF_INT1_IS_C_LONG
FCALLSCFUN6(NF_INT, nc_put_att_long, NF_PUT_ATT_INT1, nf_put_att_int1,
	    NCID, VARID, STRING, TYPE, COUNT, INT1ATT)
#endif


/*
 * Read an attribute into an INTEGER*1 array.
 */
#if NF_INT1_IS_C_SIGNED_CHAR
FCALLSCFUN4(NF_INT, nc_get_att_schar, NF_GET_ATT_INT1, nf_get_att_int1,
	    NCID, VARID, STRING, PINT1ATT)
#elif NF_INT1_IS_C_SHORT
FCALLSCFUN4(NF_INT, nc_get_att_short, NF_GET_ATT_INT1, nf_get_att_int1,
	    NCID, VARID, STRING, PINT1ATT)
#elif NF_INT1_IS_C_INT
FCALLSCFUN4(NF_INT, nc_get_att_int, NF_GET_ATT_INT1, nf_get_att_int1,
	    NCID, VARID, STRING, PINT1ATT)
#elif NF_INT1_IS_C_LONG
FCALLSCFUN4(NF_INT, nc_get_att_long, NF_GET_ATT_INT1, nf_get_att_int1,
	    NCID, VARID, STRING, PINT1ATT)
#endif


/*
 * Write an attribute from an INTEGER*2 array.
 */
#if NF_INT2_IS_C_SHORT
FCALLSCFUN6(NF_INT, nc_put_att_short, NF_PUT_ATT_INT2, nf_put_att_int2,
	    NCID, VARID, STRING, TYPE, COUNT, INT2ATT)
#elif NF_INT2_IS_C_INT
FCALLSCFUN6(NF_INT, nc_put_att_int, NF_PUT_ATT_INT2, nf_put_att_int2,
	    NCID, VARID, STRING, TYPE, COUNT, INT2ATT)
#elif NF_INT2_IS_C_LONG
FCALLSCFUN6(NF_INT, nc_put_att_long, NF_PUT_ATT_INT2, nf_put_att_int2,
	    NCID, VARID, STRING, TYPE, COUNT, INT2ATT)
#endif


/*
 * Read an attribute into an INTEGER*2 array.
 */
#if NF_INT2_IS_C_SHORT
FCALLSCFUN4(NF_INT, nc_get_att_short, NF_GET_ATT_INT2, nf_get_att_int2,
	    NCID, VARID, STRING, PINT2ATT)
#elif NF_INT2_IS_C_INT
FCALLSCFUN4(NF_INT, nc_get_att_int, NF_GET_ATT_INT2, nf_get_att_int2,
	    NCID, VARID, STRING, PINT2ATT)
#elif NF_INT2_IS_C_LONG
FCALLSCFUN4(NF_INT, nc_get_att_long, NF_GET_ATT_INT2, nf_get_att_int2,
	    NCID, VARID, STRING, PINT2ATT)
#endif


/*
 * Write an attribute from an INTEGER array.
 */
#if NF_INT_IS_C_INT
FCALLSCFUN6(NF_INT, nc_put_att_int, NF_PUT_ATT_INT, nf_put_att_int,
	    NCID, VARID, STRING, TYPE, COUNT, INTATT)
#elif NF_INT_IS_C_LONG
FCALLSCFUN6(NF_INT, nc_put_att_long, NF_PUT_ATT_INT, nf_put_att_int,
	    NCID, VARID, STRING, TYPE, COUNT, INTATT)
#endif


/*
 * Read an attribute into an INTEGER array.
 */
#if NF_INT_IS_C_INT
FCALLSCFUN4(NF_INT, nc_get_att_int, NF_GET_ATT_INT, nf_get_att_int,
	    NCID, VARID, STRING, PINTATT)
#elif NF_INT_IS_C_LONG
FCALLSCFUN4(NF_INT, nc_get_att_long, NF_GET_ATT_INT, nf_get_att_int,
	    NCID, VARID, STRING, PINTATT)
#endif


/*
 * Write an attribute from a REAL array.
 */
#if NF_REAL_IS_C_DOUBLE
FCALLSCFUN6(NF_INT, nc_put_att_double, NF_PUT_ATT_REAL, nf_put_att_real,
	    NCID, VARID, STRING, TYPE, COUNT, DOUBLEATT)
#else
FCALLSCFUN6(NF_INT, nc_put_att_float, NF_PUT_ATT_REAL, nf_put_att_real,
	    NCID, VARID, STRING, TYPE, COUNT, REALATT)
#endif


/*
 * Read an attribute into a REAL array.
 */
#if NF_REAL_IS_C_DOUBLE
FCALLSCFUN4(NF_INT, nc_get_att_double, NF_GET_ATT_REAL, nf_get_att_real,
	    NCID, VARID, STRING, PDOUBLEATT)
#else
FCALLSCFUN4(NF_INT, nc_get_att_float, NF_GET_ATT_REAL, nf_get_att_real,
	    NCID, VARID, STRING, PREALATT)
#endif


/*
 * Write an attribute from a DOUBLEPRECISION array.
 */
FCALLSCFUN6(NF_INT, nc_put_att_double, NF_PUT_ATT_DOUBLE, nf_put_att_double,
	    NCID, VARID, STRING, TYPE, COUNT, DOUBLEATT)


/*
 * Read an attribute into a DOUBLEPRECISION array.
 */
FCALLSCFUN4(NF_INT, nc_get_att_double, NF_GET_ATT_DOUBLE, nf_get_att_double,
	    NCID, VARID, STRING, PDOUBLEATT)
