#include 
#include 
#include 

#define Clear ((signed char)0)
#define Cumulonimbus ((signed char)1)
#define Stratus ((signed char)2)
#define Stratocumulus ((signed char)3)
#define Cumulus ((signed char)4)
#define Altostratus ((signed char)5)
#define Nimbostratus ((signed char)6)
#define Altocumulus ((signed char)7)
#define Missing ((signed char)127)
typedef signed char cloud_t;

void
check_err(const int stat, const int line, const char *file) {
    if (stat != NC_NOERR) {
        (void)fprintf(stderr,"line %d of %s: %s\n", line, file, nc_strerror(stat));
        fflush(stderr);
        exit(1);
    }
}

int
main() {/* create clouds.nc */

    int  stat;  /* return status */
    int  ncid;  /* netCDF id */

    /* group ids */
    int root_grp;

    /* type ids */
    int cloud_t_typ;

    /* dimension ids */
    int time_dim;

    /* dimension lengths */
    size_t time_len = NC_UNLIMITED;

    /* variable ids */
    int primary_cloud_id;

    /* rank (number of dimensions) for each variable */
#   define RANK_primary_cloud 1

    /* variable shapes */
    int primary_cloud_dims[RANK_primary_cloud];

    /* enter define mode */
    stat = nc_create("clouds.nc", NC_CLOBBER|NC_NETCDF4, &ncid);
    check_err(stat,__LINE__,__FILE__);
    root_grp = ncid;

    {
    signed char econst;

    stat = nc_def_enum(root_grp, NC_BYTE, "cloud_t", &cloud_t_typ);

    check_err(stat,__LINE__,__FILE__);

    econst = 0;
    stat = nc_insert_enum(root_grp, cloud_t_typ, "Clear", &econst);
    econst = 1;
    stat = nc_insert_enum(root_grp, cloud_t_typ, "Cumulonimbus", &econst);
    econst = 2;
    stat = nc_insert_enum(root_grp, cloud_t_typ, "Stratus", &econst);
    econst = 3;
    stat = nc_insert_enum(root_grp, cloud_t_typ, "Stratocumulus", &econst);
    econst = 4;
    stat = nc_insert_enum(root_grp, cloud_t_typ, "Cumulus", &econst);
    econst = 5;
    stat = nc_insert_enum(root_grp, cloud_t_typ, "Altostratus", &econst);
    econst = 6;
    stat = nc_insert_enum(root_grp, cloud_t_typ, "Nimbostratus", &econst);
    econst = 7;
    stat = nc_insert_enum(root_grp, cloud_t_typ, "Altocumulus", &econst);
    econst = 127;
    stat = nc_insert_enum(root_grp, cloud_t_typ, "Missing", &econst);

    }


    /* define dimensions */
    stat = nc_def_dim(root_grp, "time", time_len, &time_dim);
    check_err(stat,__LINE__,__FILE__);

    /* define variables */

    primary_cloud_dims[0] = time_dim;

    stat = nc_def_var(root_grp, "primary_cloud", cloud_t_typ, RANK_primary_cloud, primary_cloud_dims, &primary_cloud_id);

    check_err(stat,__LINE__,__FILE__);

    /* assign per-variable attributes */
    { /* _FillValue */
    static const cloud_t primary_cloud_FillValue_att[1] = {127} ;
    stat = nc_put_att_schar(root_grp, primary_cloud_id, "_FillValue", cloud_t_typ, 1, primary_cloud_FillValue_att);
    check_err(stat,__LINE__,__FILE__);
    }

    /* leave define mode */
    stat = nc_enddef (root_grp);
    check_err(stat,__LINE__,__FILE__);

    /* assign variable data */
    {
    cloud_t primary_cloud_data[5] = {0, 2, 4, 127, 1} ;
    size_t primary_cloud_startset[1] = {0} ;
    size_t primary_cloud_countset[1] = {5} ;
    stat = nc_put_vara(root_grp, primary_cloud_id, primary_cloud_startset, primary_cloud_countset, primary_cloud_data);
    check_err(stat,__LINE__,__FILE__);
    }


    stat = nc_close(root_grp);
    check_err(stat,__LINE__,__FILE__);
    return 0;
}