From 477a07b45a890adf920c2f2cef9792f49b75911b Mon Sep 17 00:00:00 2001
From: Uwe Schulzweida <uwe.schulzweida@mpimet.mpg.de>
Date: Mon, 29 Apr 2019 10:31:09 +0200
Subject: [PATCH] Refactor cdf_sort_varname().

---
 src/stream_cdf_i.c | 43 +++++++++++++++++++++++--------------------
 1 file changed, 23 insertions(+), 20 deletions(-)

diff --git a/src/stream_cdf_i.c b/src/stream_cdf_i.c
index ffcfbd8bd..958062e65 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++ )
     {
-- 
GitLab