mirror of
https://github.com/Unidata/netcdf-c.git
synced 2024-11-27 07:30:33 +08:00
Merge branch 'master' of https://github.com/gdsjaar/netcdf-c
This commit is contained in:
commit
b2eb493da3
@ -7,6 +7,8 @@ This file contains a high-level description of this package's evolution. Release
|
||||
|
||||
## 4.4.0 Released TBD
|
||||
|
||||
* Incorporated pull request https://github.com/Unidata/netcdf-c/pull/150 from Greg Sjaardema to remove the internal hard-wired use of `NC_MAX_DIMS`, instead using a dynamic memory allocation.
|
||||
|
||||
### 4.4.0-RC5 Released - November 11, 2015
|
||||
|
||||
* Added a fix for https://github.com/Unidata/netcdf-c/issues/149, which was reported several times in quick succession within an hour of the RC4 release.
|
||||
|
@ -346,13 +346,24 @@ NC_inq_recvar(int ncid, int varid, int* nrecdimsp, int *is_recdim)
|
||||
#ifdef USE_NETCDF4
|
||||
{
|
||||
int nunlimdims;
|
||||
int unlimids[NC_MAX_DIMS];
|
||||
int *unlimids;
|
||||
int recdim;
|
||||
status = nc_inq_unlimdims(ncid, &nunlimdims, unlimids); /* for group or file, not variable */
|
||||
status = nc_inq_unlimdims(ncid, &nunlimdims, NULL); /* for group or file, not variable */
|
||||
if(status != NC_NOERR) return status;
|
||||
if(nunlimdims == 0) return status;
|
||||
|
||||
if (!(unlimids = malloc(nunlimdims * sizeof(int))))
|
||||
return NC_ENOMEM;
|
||||
status = nc_inq_unlimdims(ncid, &nunlimdims, unlimids); /* for group or file, not variable */
|
||||
if(status != NC_NOERR) {
|
||||
free(unlimids);
|
||||
return status;
|
||||
}
|
||||
status = nc_inq_vardimid(ncid, varid, dimset);
|
||||
if(status != NC_NOERR) return status;
|
||||
if(status != NC_NOERR) {
|
||||
free(unlimids);
|
||||
return status;
|
||||
}
|
||||
for (dim = 0; dim < nvardims; dim++) { /* netCDF-4 rec dims need not be first dim for a rec var */
|
||||
for(recdim = 0; recdim < nunlimdims; recdim++) {
|
||||
if(dimset[dim] == unlimids[recdim]) {
|
||||
@ -361,6 +372,7 @@ NC_inq_recvar(int ncid, int varid, int* nrecdimsp, int *is_recdim)
|
||||
}
|
||||
}
|
||||
}
|
||||
free(unlimids);
|
||||
}
|
||||
#else
|
||||
status = nc_inq_vardimid(ncid, varid, dimset);
|
||||
|
59
ncgen/genc.c
59
ncgen/genc.c
@ -131,7 +131,7 @@ gen_ncc(const char *filename)
|
||||
bbprintf0(stmt,"%s() {/* create %s */\n", mainname, filename);
|
||||
codedump(stmt);
|
||||
/* create necessary declarations */
|
||||
codeline("");
|
||||
codeline("");
|
||||
codelined(1,"int stat; /* return status */");
|
||||
codelined(1,"int ncid; /* netCDF id */");
|
||||
codeflush();
|
||||
@ -142,7 +142,7 @@ gen_ncc(const char *filename)
|
||||
codeline("");
|
||||
codelined(1,"/* group ids */");
|
||||
}
|
||||
if(!usingclassic && ngrps > 0) {
|
||||
if(!usingclassic && ngrps > 0) {
|
||||
for(igrp = 0; igrp < ngrps; igrp++) {
|
||||
Symbol* gsym = (Symbol*)listget(grpdefs,igrp);
|
||||
bbprintf0(stmt,"%sint %s;\n",indented(1),groupncid(gsym));
|
||||
@ -241,7 +241,7 @@ gen_ncc(const char *filename)
|
||||
} else if (cmode_modifier & NC_CLASSIC_MODEL) {
|
||||
cmode_string = "NC_CLOBBER|NC_NETCDF4|NC_CLASSIC_MODEL";
|
||||
} else if (cmode_modifier & NC_NETCDF4) {
|
||||
cmode_string = "NC_CLOBBER|NC_NETCDF4";
|
||||
cmode_string = "NC_CLOBBER|NC_NETCDF4";
|
||||
#endif
|
||||
} else {
|
||||
derror("unknown cmode modifier");
|
||||
@ -252,7 +252,7 @@ gen_ncc(const char *filename)
|
||||
codedump(stmt);
|
||||
codelined(1,"check_err(stat,__LINE__,__FILE__);");
|
||||
codeflush();
|
||||
|
||||
|
||||
#ifdef USE_NETCDF4
|
||||
genc_defineglobalspecials();
|
||||
#endif /*USE_NETCDF4*/
|
||||
@ -351,19 +351,19 @@ gen_ncc(const char *filename)
|
||||
}
|
||||
}
|
||||
codeflush();
|
||||
|
||||
|
||||
/* Define the global attributes*/
|
||||
if(ngatts > 0) {
|
||||
codeline("");
|
||||
codelined(1,"/* assign global attributes */");
|
||||
for(iatt = 0; iatt < ngatts; iatt++) {
|
||||
Symbol* gasym = (Symbol*)listget(gattdefs,iatt);
|
||||
genc_defineattr(gasym);
|
||||
genc_defineattr(gasym);
|
||||
}
|
||||
codeline("");
|
||||
}
|
||||
codeflush();
|
||||
|
||||
|
||||
/* Define the variable specific attributes*/
|
||||
if(natts > 0) {
|
||||
codeline("");
|
||||
@ -440,11 +440,11 @@ genc_definespecialattributes(Symbol* vsym)
|
||||
codepartial("NULL");
|
||||
else {
|
||||
bbprintf0(stmt,"%s_chunksizes",cname(vsym));
|
||||
codedump(stmt);
|
||||
codedump(stmt);
|
||||
}
|
||||
codeline(");");
|
||||
codelined(1,"check_err(stat,__LINE__,__FILE__);");
|
||||
}
|
||||
}
|
||||
if(special->flags & _FLETCHER32_FLAG) {
|
||||
bbprintf0(stmt,
|
||||
" stat = nc_def_var_fletcher32(%s, %s, %d);\n",
|
||||
@ -464,7 +464,7 @@ genc_definespecialattributes(Symbol* vsym)
|
||||
(special->_DeflateLevel >= 0?special->_DeflateLevel:0));
|
||||
codedump(stmt);
|
||||
codelined(1,"check_err(stat,__LINE__,__FILE__);");
|
||||
}
|
||||
}
|
||||
if(special->flags & _ENDIAN_FLAG) {
|
||||
bbprintf0(stmt,
|
||||
" stat = nc_def_var_endian(%s, %s, %s);\n",
|
||||
@ -475,7 +475,7 @@ genc_definespecialattributes(Symbol* vsym)
|
||||
);
|
||||
codedump(stmt);
|
||||
codelined(1,"check_err(stat,__LINE__,__FILE__);");
|
||||
}
|
||||
}
|
||||
if(special->flags & _NOFILL_FLAG) {
|
||||
bbprintf0(stmt,
|
||||
" stat = nc_def_var_fill(%s, %s, %s, NULL);\n",
|
||||
@ -485,7 +485,7 @@ genc_definespecialattributes(Symbol* vsym)
|
||||
);
|
||||
codedump(stmt);
|
||||
codelined(1,"check_err(stat,__LINE__,__FILE__);");
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /*USE_NETCDF4*/
|
||||
|
||||
@ -537,7 +537,7 @@ nctype(nc_type type)
|
||||
/*
|
||||
* Return C type name for netCDF type, given type code.
|
||||
*/
|
||||
const char*
|
||||
const char*
|
||||
ncctype(nc_type type)
|
||||
{
|
||||
switch (type) {
|
||||
@ -574,7 +574,7 @@ ncctype(nc_type type)
|
||||
/*
|
||||
* Return C type name for netCDF type suffix, given type code.
|
||||
*/
|
||||
const char*
|
||||
const char*
|
||||
ncstype(nc_type nctype)
|
||||
{
|
||||
switch (nctype) {
|
||||
@ -845,7 +845,7 @@ genc_deftype(Symbol* tsym)
|
||||
int j;
|
||||
Symbol* efield = (Symbol*)listget(tsym->subnodes,i);
|
||||
ASSERT(efield->subclass == NC_FIELD);
|
||||
if(efield->typ.dimset.ndims == 0) continue;
|
||||
if(efield->typ.dimset.ndims == 0) continue;
|
||||
bbprintf0(stmt,"%sstatic int %s_dims[%d] = {\n",
|
||||
indented(1),
|
||||
cname(efield),efield->typ.dimset.ndims);
|
||||
@ -870,7 +870,7 @@ genc_deftype(Symbol* tsym)
|
||||
snprintf(tmp,sizeof(tmp),"NC_COMPOUND_OFFSET(%s,%s)",
|
||||
ctypename(tsym), cname(efield));
|
||||
#endif
|
||||
if(efield->typ.dimset.ndims > 0){
|
||||
if(efield->typ.dimset.ndims > 0){
|
||||
bbprintf0(stmt,"%sstat = nc_insert_array_compound(%s, %s, \"%s\", %s, %s, %d, %s_dims);",
|
||||
indented(1),
|
||||
groupncid(tsym->container),
|
||||
@ -968,7 +968,7 @@ genc_writevar(Generator* generator, Symbol* vsym, Bytebuffer* code,
|
||||
}
|
||||
listfree(vlendecls);
|
||||
generator_reset(generator,NULL);
|
||||
}
|
||||
}
|
||||
|
||||
if(rank == 0) {
|
||||
codelined(1,"size_t count = 0;");
|
||||
@ -1005,7 +1005,7 @@ genc_writevar(Generator* generator, Symbol* vsym, Bytebuffer* code,
|
||||
codedump(code);
|
||||
codeline(" ;");
|
||||
} else {
|
||||
/* Compute total size */
|
||||
/* Compute total size */
|
||||
length = 1;
|
||||
for(i=0;i<rank;i++) length *= count[i];
|
||||
/* generate data constant */
|
||||
@ -1021,9 +1021,9 @@ genc_writevar(Generator* generator, Symbol* vsym, Bytebuffer* code,
|
||||
codedump(code);
|
||||
codeline("} ;");
|
||||
}
|
||||
|
||||
|
||||
/* generate constants for startset, countset*/
|
||||
bbprintf0(stmt,"%ssize_t %s_startset[%lu] = {",
|
||||
bbprintf0(stmt,"%ssize_t %s_startset[%u] = {",
|
||||
indented(1),
|
||||
cname(vsym),
|
||||
rank);
|
||||
@ -1032,8 +1032,8 @@ genc_writevar(Generator* generator, Symbol* vsym, Bytebuffer* code,
|
||||
}
|
||||
codedump(stmt);
|
||||
codeline("} ;");
|
||||
|
||||
bbprintf0(stmt,"%ssize_t %s_countset[%lu] = {",
|
||||
|
||||
bbprintf0(stmt,"%ssize_t %s_countset[%u] = {",
|
||||
indented(1),
|
||||
cname(vsym),
|
||||
rank);
|
||||
@ -1042,7 +1042,7 @@ genc_writevar(Generator* generator, Symbol* vsym, Bytebuffer* code,
|
||||
}
|
||||
codedump(stmt);
|
||||
codeline("};");
|
||||
|
||||
|
||||
bbprintf0(stmt,"%sstat = nc_put_vara(%s, %s, %s_startset, %s_countset, %s_data);\n",
|
||||
indented(1),
|
||||
groupncid(vsym->container), varncid(vsym),
|
||||
@ -1051,13 +1051,13 @@ genc_writevar(Generator* generator, Symbol* vsym, Bytebuffer* code,
|
||||
cname(vsym));
|
||||
codedump(stmt);
|
||||
codelined(1,"check_err(stat,__LINE__,__FILE__);");
|
||||
|
||||
|
||||
}
|
||||
/* end defined block*/
|
||||
codelined(1,"}\n");
|
||||
codeflush();
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
genc_writeattr(Generator* generator, Symbol* asym, Bytebuffer* code,
|
||||
int rank, size_t* start, size_t* count)
|
||||
@ -1090,7 +1090,7 @@ genc_writeattr(Generator* generator, Symbol* asym, Bytebuffer* code,
|
||||
}
|
||||
listfree(vlendecls);
|
||||
generator_reset(generator,NULL);
|
||||
}
|
||||
}
|
||||
commify(code);
|
||||
bbprintf0(stmt,"%sstatic const %s %s_att[%ld] = ",
|
||||
indented(1),
|
||||
@ -1120,7 +1120,7 @@ genc_writeattr(Generator* generator, Symbol* asym, Bytebuffer* code,
|
||||
(asym->att.var == NULL?"NC_GLOBAL"
|
||||
:varncid(asym->att.var)),
|
||||
escapifyname(asym->name),
|
||||
typencid(basetype),
|
||||
typencid(basetype),
|
||||
len,
|
||||
cname(asym));
|
||||
codedump(stmt);
|
||||
@ -1157,7 +1157,7 @@ genc_writeattr(Generator* generator, Symbol* asym, Bytebuffer* code,
|
||||
(asym->att.var == NULL?"NC_GLOBAL"
|
||||
:varncid(asym->att.var)),
|
||||
escapifyname(asym->name),
|
||||
typencid(basetype),
|
||||
typencid(basetype),
|
||||
len,
|
||||
cname(asym));
|
||||
codedump(stmt);
|
||||
@ -1221,9 +1221,8 @@ cname(Symbol* sym)
|
||||
if(sym->grp.is_root)
|
||||
name = codify(sym->name);
|
||||
else
|
||||
name = codify(sym->fqn);
|
||||
name = codify(sym->fqn);
|
||||
return name;
|
||||
}
|
||||
|
||||
#endif /*ENABLE_C*/
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user