diff --git a/src/stream_cdf_i.c b/src/stream_cdf_i.c index ffcfbd8bd872345f776c9152a533fc2c7b30a44f..958062e65c2a906bef9d8f1146f6768b88a390eb 100644 --- a/src/stream_cdf_i.c +++ b/src/stream_cdf_i.c @@ -3020,6 +3020,28 @@ int cdf_cmp_varname(const void *s1, const void *s2) return strcmp(x->name, y->name); } +static +void cdf_sort_varname(int *varids, const int nvars, const ncvar_t *ncvars) +{ + struct cdf_varinfo *varInfo + = (struct cdf_varinfo *) Malloc((size_t)nvars * sizeof(struct cdf_varinfo)); + + for ( int varID = 0; varID < nvars; varID++ ) + { + const int ncvarid = varids[varID]; + varInfo[varID].varid = ncvarid; + varInfo[varID].name = ncvars[ncvarid].name; + } + qsort(varInfo, (size_t)nvars, sizeof(varInfo[0]), cdf_cmp_varname); + for ( int varID = 0; varID < nvars; varID++ ) + { + varids[varID] = varInfo[varID].varid; + } + Free(varInfo); + if ( CDI_Debug ) + for ( int i = 0; i < nvars; i++ ) Message("sorted varids[%d] = %d", i, varids[i]); +} + // define all input data variables static void cdf_define_all_vars(stream_t *streamptr, int vlistID, int instID, int modelID, int *varids, int nvars, int num_ncvars, ncvar_t *ncvars, ncdim_t *ncdims) @@ -3027,26 +3049,7 @@ void cdf_define_all_vars(stream_t *streamptr, int vlistID, int instID, int model if ( CDI_Debug ) for ( int i = 0; i < nvars; i++ ) Message("varids[%d] = %d", i, varids[i]); - if ( streamptr->sortname ) - { - struct cdf_varinfo *varInfo - = (struct cdf_varinfo *) Malloc((size_t)nvars * sizeof(struct cdf_varinfo)); - - for ( int varID = 0; varID < nvars; varID++ ) - { - const int ncvarid = varids[varID]; - varInfo[varID].varid = ncvarid; - varInfo[varID].name = ncvars[ncvarid].name; - } - qsort(varInfo, (size_t)nvars, sizeof(varInfo[0]), cdf_cmp_varname); - for ( int varID = 0; varID < nvars; varID++ ) - { - varids[varID] = varInfo[varID].varid; - } - Free(varInfo); - if ( CDI_Debug ) - for ( int i = 0; i < nvars; i++ ) Message("sorted varids[%d] = %d", i, varids[i]); - } + if ( streamptr->sortname ) cdf_sort_varname(varids, nvars, ncvars); for ( int varID1 = 0; varID1 < nvars; varID1++ ) {