Commit 46166de0 authored by Florian Prill's avatar Florian Prill
Browse files

[cdi-tiles] some defensive code.

parent a77b3f1b
......@@ -2659,24 +2659,22 @@ size_t gribapiEncode(int varID, int levelID, int vlistID, int gridID, int zaxisI
if (vlistptr->vars[varID].opt_grib_kvpair[i].data_type == t_double)
{
my_grib_set_double(gh, vlistptr->vars[varID].opt_grib_kvpair[i].keyword,
vlistptr->vars[varID].opt_grib_kvpair[i].dbl_val);
if (ret != 0) {
fprintf(stderr, "key \"%s\" : value = %g\n",
if ( CDI_Debug )
Message("key \"%s\" : double value = %g\n",
vlistptr->vars[varID].opt_grib_kvpair[i].keyword,
vlistptr->vars[varID].opt_grib_kvpair[i].dbl_val);
}
GRIB_CHECK(ret, 0);
my_grib_set_double(gh, vlistptr->vars[varID].opt_grib_kvpair[i].keyword,
vlistptr->vars[varID].opt_grib_kvpair[i].dbl_val);
GRIB_CHECK(ret, 0);
}
if (vlistptr->vars[varID].opt_grib_kvpair[i].data_type == t_int)
{
my_grib_set_long(gh, vlistptr->vars[varID].opt_grib_kvpair[i].keyword,
(long) vlistptr->vars[varID].opt_grib_kvpair[i].int_val);
if (ret != 0) {
fprintf(stderr, "key \"%s\" : value = %g\n",
if ( CDI_Debug )
Message("key \"%s\" : integer value = %d\n",
vlistptr->vars[varID].opt_grib_kvpair[i].keyword,
vlistptr->vars[varID].opt_grib_kvpair[i].int_val);
}
my_grib_set_long(gh, vlistptr->vars[varID].opt_grib_kvpair[i].keyword,
(long) vlistptr->vars[varID].opt_grib_kvpair[i].int_val);
GRIB_CHECK(ret, 0);
}
}
......
......@@ -191,12 +191,14 @@ void varFree(void)
if ( vartable[varID].ensdata ) free(vartable[varID].ensdata);
if ( vartable[varID].tiles ) subtypeDestroyPtr(vartable[varID].tiles);
for (int i=0; i<vartable[varID].opt_grib_nentries; i++) {
if ( vartable[varID].opt_grib_kvpair[i].keyword )
free(vartable[varID].opt_grib_kvpair[i].keyword);
}
if ( vartable[varID].opt_grib_kvpair )
free(vartable[varID].opt_grib_kvpair);
if ( vartable[varID].opt_grib_kvpair )
{
for (int i=0; i<vartable[varID].opt_grib_nentries; i++) {
if ( vartable[varID].opt_grib_kvpair[i].keyword )
free(vartable[varID].opt_grib_kvpair[i].keyword);
}
free(vartable[varID].opt_grib_kvpair);
}
vartable[varID].opt_grib_nentries = 0;
vartable[varID].opt_grib_kvpair_size = 0;
vartable[varID].opt_grib_kvpair = NULL;
......@@ -1167,17 +1169,19 @@ void resize_vartable_opt_grib_entries(vartable_t *var, int nentries)
{
int i, new_size;
new_size = (2*var->opt_grib_kvpair_size) > nentries ? (2*var->opt_grib_kvpair_size) : nentries;
if (CDI_Debug)
Message("resize vartable opt_grib_entries array to size %d\n", new_size);
opt_key_val_pair_t *tmp = (opt_key_val_pair_t *)xmalloc((size_t)new_size * sizeof (opt_key_val_pair_t));
for (i=0; i<var->opt_grib_kvpair_size; i++) {
tmp[i] = var->opt_grib_kvpair[i];
}
var->opt_grib_kvpair_size = new_size;
for (i=(nentries-1); i<var->opt_grib_kvpair_size; i++) {
for (i=var->opt_grib_kvpair_size; i<new_size; i++) {
tmp[i].int_val = 0;
tmp[i].dbl_val = 0;
tmp[i].update = FALSE;
tmp[i].keyword = NULL;
} // for
var->opt_grib_kvpair_size = new_size;
free(var->opt_grib_kvpair);
var->opt_grib_kvpair = tmp;
}
......
......@@ -240,17 +240,17 @@ vlist_delete(vlist_t *vlistptr)
if ( vars[varID].units ) free(vars[varID].units);
if ( vars[varID].ensdata ) free(vars[varID].ensdata);
#if defined (HAVE_LIBGRIB_API)
for (int i=0; i<vlistptr->vars[varID].opt_grib_nentries; i++) {
if ( vlistptr->vars[varID].opt_grib_kvpair[i].keyword )
free(vlistptr->vars[varID].opt_grib_kvpair[i].keyword);
}
if ( vlistptr->vars[varID].opt_grib_kvpair )
free(vlistptr->vars[varID].opt_grib_kvpair);
{
for (int i=0; i<vlistptr->vars[varID].opt_grib_nentries; i++) {
if ( vlistptr->vars[varID].opt_grib_kvpair[i].keyword )
free(vlistptr->vars[varID].opt_grib_kvpair[i].keyword);
}
free(vlistptr->vars[varID].opt_grib_kvpair);
}
vlistptr->vars[varID].opt_grib_nentries = 0;
vlistptr->vars[varID].opt_grib_kvpair_size = 0;
vlistptr->vars[varID].opt_grib_kvpair = NULL;
#endif
vlistDelAtts(vlistID, varID);
}
......@@ -1566,13 +1566,13 @@ void resize_opt_grib_entries(var_t *var, int nentries)
for (i=0; i<var->opt_grib_kvpair_size; i++) {
tmp[i] = var->opt_grib_kvpair[i];
}
var->opt_grib_kvpair_size = new_size;
for (i=(nentries-1); i<var->opt_grib_kvpair_size; i++) {
for (i=var->opt_grib_kvpair_size; i<new_size; i++) {
tmp[i].int_val = 0;
tmp[i].dbl_val = 0;
tmp[i].update = FALSE;
tmp[i].keyword = NULL;
} // for
var->opt_grib_kvpair_size = new_size;
free(var->opt_grib_kvpair);
var->opt_grib_kvpair = tmp;
}
......
......@@ -66,6 +66,7 @@ void vlistvarInitEntry(int vlistID, int varID)
vlistptr->vars[varID].iorank = CDI_UNDEFID;
vlistptr->vars[varID].opt_grib_kvpair_size = 0;
vlistptr->vars[varID].opt_grib_kvpair = NULL;
vlistptr->vars[varID].opt_grib_nentries = 0;
}
......@@ -145,14 +146,11 @@ int vlistDefVarTiles(int vlistID, int gridID, int zaxisID, int tsteptype, int ti
int varID = vlistvarNewEntry(vlistID);
vlistptr->nvars++;
vlistptr->vars[varID].gridID = gridID;
vlistptr->vars[varID].zaxisID = zaxisID;
vlistptr->vars[varID].gridID = gridID;
vlistptr->vars[varID].zaxisID = zaxisID;
vlistptr->vars[varID].tsteptype = tsteptype;
vlistptr->vars[varID].subtypeID = tilesetID;
vlistptr->vars[varID].opt_grib_nentries = 0;
vlistptr->vars[varID].opt_grib_kvpair_size = 0;
if ( tsteptype < 0 )
{
Message("Unexpected tstep type %d, set to TSTEP_INSTANT!", tsteptype);
......@@ -1792,6 +1790,24 @@ void vlistDefVarIntKey(int vlistID, int varID, const char *name, int value)
Error("Internal error, name undefined!");
}
if ( CDI_Debug )
{
Message("define additional GRIB2 key \"%s\" (integer): %d", name, value);
Message("total list of registered, additional GRIB2 keys (total: %d):",
vlistptr->vars[varID].opt_grib_nentries);
for ( idx=0; idx<vlistptr->vars[varID].opt_grib_nentries; idx++)
if (vlistptr->vars[varID].opt_grib_kvpair[idx].data_type == t_int)
Message("%s -> integer %d",
vlistptr->vars[varID].opt_grib_kvpair[idx].keyword,
vlistptr->vars[varID].opt_grib_kvpair[idx].int_val);
else if (vlistptr->vars[varID].opt_grib_kvpair[idx].data_type == t_double)
Message("%s -> double %d",
vlistptr->vars[varID].opt_grib_kvpair[idx].keyword,
vlistptr->vars[varID].opt_grib_kvpair[idx].dbl_val);
else
Message("%s -> unknown", vlistptr->vars[varID].opt_grib_kvpair[idx].keyword);
}
reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE);
#else
(void)vlistID;
......@@ -1836,6 +1852,24 @@ void vlistDefVarDblKey(int vlistID, int varID, const char *name, double value)
Error("Internal error, name undefined!");
}
if ( CDI_Debug )
{
Message("define additional GRIB2 key \"%s\" (double): %d", name, value);
Message("total list of registered, additional GRIB2 keys (total: %d):",
vlistptr->vars[varID].opt_grib_nentries);
for ( idx=0; idx<vlistptr->vars[varID].opt_grib_nentries; idx++)
if (vlistptr->vars[varID].opt_grib_kvpair[idx].data_type == t_int)
Message("%s -> integer %d",
vlistptr->vars[varID].opt_grib_kvpair[idx].keyword,
vlistptr->vars[varID].opt_grib_kvpair[idx].int_val);
else if (vlistptr->vars[varID].opt_grib_kvpair[idx].data_type == t_double)
Message("%s -> double %d",
vlistptr->vars[varID].opt_grib_kvpair[idx].keyword,
vlistptr->vars[varID].opt_grib_kvpair[idx].dbl_val);
else
Message("%s -> unknown", vlistptr->vars[varID].opt_grib_kvpair[idx].keyword);
}
reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE);
#else
(void)vlistID;
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment