From 766185c54b16930b3feb18a00690490d6607979e Mon Sep 17 00:00:00 2001
From: Uwe Schulzweida <uwe.schulzweida@mpimet.mpg.de>
Date: Thu, 10 Nov 2022 13:48:51 +0100
Subject: [PATCH] Added initial version of cdi_query.c.

---
 app/cdi.c       | 66 -------------------------------------------------
 src/Makefile.am |  1 +
 src/cdi.h       | 16 ++++++++++++
 src/cdi_query.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++
 src/make_cdilib |  1 +
 5 files changed, 81 insertions(+), 66 deletions(-)
 create mode 100644 src/cdi_query.c

diff --git a/app/cdi.c b/app/cdi.c
index cb1a95417..e79a88937 100644
--- a/app/cdi.c
+++ b/app/cdi.c
@@ -729,72 +729,6 @@ defineCompress(const char *arg)
     fprintf(stderr, "%s compression unsupported!\n", arg);
 }
 
-typedef struct CdiQuery
-{
-  int numNames;
-  char **names;
-} CdiQuery;
-
-void
-cdiQueryInit(CdiQuery *query)
-{
-  query->numNames = 0;
-  query->names = NULL;
-}
-
-CdiQuery *
-cdiQueryCreate()
-{
-  CdiQuery *query = (CdiQuery*) malloc(sizeof(CdiQuery));
-  cdiQueryInit(query);
-  return query;
-}
-
-void
-cdiQueryDelete(CdiQuery *query)
-{
-  if (query->numNames && query)
-    {
-      for (int i = 0; i < query->numNames; ++i) free(query->names[i]);
-      free(query);
-    }
-}
-
-void
-cdiQuerySetNames(CdiQuery *query, int numNames, char **names)
-{
-  if (numNames)
-    {
-      query->numNames = numNames;
-      query->names = (char**)malloc(numNames * sizeof(char*));
-      for (int i = 0; i < numNames; ++i) query->names[i] = strdup(names[i]);
-    }
-}
-
-CdiQuery *
-cdiQueryClone(CdiQuery *query)
-{
-  CdiQuery *queryOut = cdiQueryCreate();
-
-  if (query)
-    {
-      cdiQuerySetNames(queryOut, query->numNames, query->names);
-    }
-
-  return queryOut;
-}
-
-void
-cdiQueryPrint(CdiQuery *query)
-{
-  if (query->numNames)
-    {
-      printf("Names:");
-      for (int i = 0; i < query->numNames; ++i) printf(" %s", query->names[i]);
-      printf("\n");
-    }
-}
-
 int
 main(int argc, char *argv[])
 {
diff --git a/src/Makefile.am b/src/Makefile.am
index 77e1c06cb..eca0bb02a 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -47,6 +47,7 @@ libcdi_la_SOURCES = 	 \
 	cdi_datetime.h   \
 	cdi_error.c      \
 	cdi_limits.h	 \
+	cdi_query.c	 \
 	cdi_util.c       \
 	cgribex.h	 \
 	cgribexlib.c  	 \
diff --git a/src/cdi.h b/src/cdi.h
index 7fffa8c24..44f1b97ae 100644
--- a/src/cdi.h
+++ b/src/cdi.h
@@ -1315,6 +1315,21 @@ void vlistDefVarProductDefinitionTemplate(int vlistID, int varID, int productDef
 extern "C" {
 #endif
 
+// CDI query interface
+
+typedef struct CdiQuery
+{
+  int numNames;
+  char **names;
+} CdiQuery;
+
+CdiQuery *cdiQueryCreate();
+void cdiQueryDelete(CdiQuery *query);
+void cdiQuerySetNames(CdiQuery *query, int numNames, char **names);
+void cdiQueryPrint(CdiQuery *query);
+
+// CDI interface for  paraview vtkCDIReader.cxx
+
 #include "cdi_datetime.h"
 
 void taxisDefRdatetime(int taxisID, CdiDateTime rdatetime);
@@ -1333,6 +1348,7 @@ int64_t julday_to_date(int calendar, int64_t julday);
 int time_to_sec(int time);                           // Used in paraview vtkCDIReader.cxx
 int sec_to_time(int secofday);
 
+// CDI projection parameter interface
 
 struct CDI_GridProjParams
 {
diff --git a/src/cdi_query.c b/src/cdi_query.c
new file mode 100644
index 000000000..b97724e49
--- /dev/null
+++ b/src/cdi_query.c
@@ -0,0 +1,63 @@
+#include <string.h>
+#include <stdlib.h>
+#include "cdi.h"
+
+void
+cdiQueryInit(CdiQuery *query)
+{
+  query->numNames = 0;
+  query->names = NULL;
+}
+
+CdiQuery *
+cdiQueryCreate()
+{
+  CdiQuery *query = (CdiQuery*) malloc(sizeof(CdiQuery));
+  cdiQueryInit(query);
+  return query;
+}
+
+void
+cdiQueryDelete(CdiQuery *query)
+{
+  if (query->numNames && query)
+    {
+      for (int i = 0; i < query->numNames; ++i) free(query->names[i]);
+      free(query);
+    }
+}
+
+void
+cdiQuerySetNames(CdiQuery *query, int numNames, char **names)
+{
+  if (numNames)
+    {
+      query->numNames = numNames;
+      query->names = (char**)malloc(numNames * sizeof(char*));
+      for (int i = 0; i < numNames; ++i) query->names[i] = strdup(names[i]);
+    }
+}
+
+CdiQuery *
+cdiQueryClone(CdiQuery *query)
+{
+  CdiQuery *queryOut = cdiQueryCreate();
+
+  if (query)
+    {
+      cdiQuerySetNames(queryOut, query->numNames, query->names);
+    }
+
+  return queryOut;
+}
+
+void
+cdiQueryPrint(CdiQuery *query)
+{
+  if (query->numNames)
+    {
+      printf("Names:");
+      for (int i = 0; i < query->numNames; ++i) printf(" %s", query->names[i]);
+      printf("\n");
+    }
+}
diff --git a/src/make_cdilib b/src/make_cdilib
index d39c11ebf..6e2920177 100755
--- a/src/make_cdilib
+++ b/src/make_cdilib
@@ -109,6 +109,7 @@ files="async_worker.c \
    cdi_error.c \
    cdi_datetime.c \
    cdi_int.c \
+   cdi_query.c \
    cdi_util.c \
    cgribexlib.c \
    cksum.c \
-- 
GitLab