From bf80cda5dd36439aedbdc4d91cfdf81d15b00352 Mon Sep 17 00:00:00 2001 From: Uwe Schulzweida <uwe.schulzweida@mpimet.mpg.de> Date: Mon, 15 Apr 2024 14:52:12 +0200 Subject: [PATCH] gribapi: added support for sortname option --- ChangeLog | 4 ++++ src/stream_gribapi.c | 17 +++++++++++++++++ src/varscan.c | 12 ++++++------ 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5595a022a..e36044247 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2024-04-15 Uwe Schulzweida + + * gribapi: added support for sortname option + 2024-03-22 Uwe Schulzweida * gribapi_get_timeunits: check unitsOfTime (bug fix) [report: Chris Barnard] diff --git a/src/stream_gribapi.c b/src/stream_gribapi.c index e13553a32..d7b18f3fe 100644 --- a/src/stream_gribapi.c +++ b/src/stream_gribapi.c @@ -1212,6 +1212,21 @@ fdbScanTimesteps(stream_t *streamptr) return 0; } +static int +records_cmp_varname(const void *s1, const void *s2) +{ + const record_t *x = (const record_t *) s1, *y = (const record_t *) s2; + return strcmp(x->varname, y->varname); +} + +void +sort_records(stream_t *streamptr) +{ + record_t *records = streamptr->tsteps[0].records; + int numRecords = streamptr->tsteps[0].recordSize; + qsort(records, numRecords, sizeof(records[0]), records_cmp_varname); +} + int gribapiScanTimestep1(stream_t *streamptr) { @@ -1360,6 +1375,8 @@ gribapiScanTimestep1(stream_t *streamptr) streamScanTsFixNtsteps(streamptr, recpos); streamScanTimeConstAdjust(streamptr, taxis); + if (streamptr->sortname) sort_records(streamptr); + return 0; } diff --git a/src/varscan.c b/src/varscan.c index 1facb46d3..04c9320f7 100644 --- a/src/varscan.c +++ b/src/varscan.c @@ -481,13 +481,13 @@ varCopyKeys(int vlistID, int varID) cdiInitKeys(&vlistptr->vars[varID].keys); cdiCopyVarKeys(&vartable[varID].keys, &vlistptr->vars[varID].keys); } - +/* struct cdi_generate_varinfo { int varid; const char *name; }; -/* + static int cdi_generate_cmp_varname(const void *s1, const void *s2) { @@ -505,11 +505,11 @@ cdi_generate_vars(stream_t *streamptr) /* if (streamptr->sortname) { - int varID; - for (varID = 0; varID < varTableUsed; varID++) - if (!vartable[varID].name) break; + bool hasName = true; + for (int varID = 0; varID < varTableUsed; varID++) + if (!vartable[varID].name) hasName = false; - if (varID == varTableUsed) + if (hasName) { struct cdi_generate_varinfo *varInfo = (struct cdi_generate_varinfo *) Malloc((size_t) varTableUsed * sizeof(struct cdi_generate_varinfo)); -- GitLab