/* Read a NC_dimarray from the header */ static int v1h_get_NC_dimarray(v1hs *gsp, NC_dimarray *ncap) { int status; NCtype type = NC_UNSPECIFIED; assert(gsp != NULL && gsp->pos != NULL); assert(ncap != NULL); assert(ncap->value == NULL); status = v1h_get_NCtype(gsp, &type); if(status != NC_NOERR) return status; status = v1h_get_size_t(gsp, &ncap->nelems); if(status != NC_NOERR) return status; if(ncap->nelems == 0) return NC_NOERR; /* else */ if(type != NC_DIMENSION) return EINVAL; ncap->value = (NC_dim **) malloc(ncap->nelems * sizeof(NC_dim *)); if(ncap->value == NULL) return NC_ENOMEM; ncap->nalloc = ncap->nelems; ncap->hashmap = NC_hashmapCreate(ncap->nelems); { NC_dim **dpp = ncap->value; NC_dim *const *const end = &dpp[ncap->nelems]; for( /*NADA*/; dpp < end; dpp++) { status = v1h_get_NC_dim(gsp, dpp); if(status) { ncap->nelems = (size_t)(dpp - ncap->value); free_NC_dimarrayV(ncap); return status; } { int dimid = (size_t)(dpp - ncap->value); NC_hashmapAddDim(ncap, dimid, (*dpp)->name->cp); } } } return NC_NOERR; }
/* Read a NC_vararray from the header */ static int v1h_get_NC_vararray(v1hs *gsp, NC_vararray *ncap) { int status; NCtype type = NC_UNSPECIFIED; assert(gsp != NULL && gsp->pos != NULL); assert(ncap != NULL); assert(ncap->value == NULL); status = v1h_get_NCtype(gsp, &type); if(status != ENOERR) return status; status = v1h_get_size_t(gsp, &ncap->nelems); if(status != ENOERR) return status; if(ncap->nelems == 0) return ENOERR; /* else */ if(type != NC_VARIABLE) return EINVAL; ncap->value = (NC_var **) malloc(ncap->nelems * sizeof(NC_var *)); if(ncap->value == NULL) return NC_ENOMEM; ncap->nalloc = ncap->nelems; { NC_var **vpp = ncap->value; NC_var *const *const end = &vpp[ncap->nelems]; for( /*NADA*/; vpp < end; vpp++) { status = v1h_get_NC_var(gsp, vpp); if(status) { ncap->nelems = (size_t)(vpp - ncap->value); free_NC_vararrayV(ncap); return status; } } } return ENOERR; }