From a1ee4950fee8163109c2018f0f44a2ec7ad5f4d5 Mon Sep 17 00:00:00 2001
From: Oliver Heidmann <oliver.heidmann@mpimet.mpg.de>
Date: Fri, 19 Apr 2024 11:46:13 +0200
Subject: [PATCH] added nc memory write

---
 src/cdi.h    |  3 ++-
 src/stream.c | 32 +++++++++++++++++++++-----------
 2 files changed, 23 insertions(+), 12 deletions(-)

diff --git a/src/cdi.h b/src/cdi.h
index 97c655857..81d67f853 100644
--- a/src/cdi.h
+++ b/src/cdi.h
@@ -353,7 +353,8 @@ int     cdiEncodeTime(int hour, int minute, int second);
 int     cdiGetFiletype(const char *uri, int *byteorder);
 int     cdiGetProtocol(const char *uri, const char **filename);
 
-int  streamOpenReadNCMem(int ncid);
+int     streamOpenReadNCMem(int ncid);
+int     streamOpenWriteNCMem(int ncid);
 
 //      streamOpenRead: Open a dataset for reading
 int     streamOpenRead(const char *path);
diff --git a/src/stream.c b/src/stream.c
index df3249dcc..cdbc645e4 100644
--- a/src/stream.c
+++ b/src/stream.c
@@ -714,9 +714,9 @@ streamOpenID(const char *filename, char filemode, int filetype, int resH)
 }
 
 int
-streamOpenReadNCMem(int ncidp)
+streamOpenNCMem(int ncidp, char mode)
 {
-
+  cdiInitialize();
   stream_t *streamptr = stream_new_entry(CDI_UNDEFID);
   int streamID = CDI_ESYSTEM;
 
@@ -730,23 +730,34 @@ streamOpenReadNCMem(int ncidp)
   nc_inq_path(ncidp, &actual_length, filename);
 
   streamptr->filename = strdup(filename);
-  streamptr->filemode = 'r';
+  streamptr->filemode = mode;
   streamptr->filetype = CDI_FILETYPE_NC4;
   streamptr->fileID = ncidp;
 
-  int status = stream_create_vlist(streamptr, NULL);
-  if (status < 0)
+  if (mode == 'r')
     {
-      streamID = status;
-      if (streamptr->record) Free(streamptr->record);
-      reshRemove(streamptr->self, &streamOps);
+      int status = stream_create_vlist(streamptr, NULL);
+      if (status < 0)
+        {
+          streamID = status;
+          if (streamptr->record) Free(streamptr->record);
+          reshRemove(streamptr->self, &streamOps);
+        }
     }
 
-  streamPrintP(streamptr, stdout);
-
   return streamID;
 }
 
+int
+streamOpenReadNCMem(int ncidp)
+{
+  return streamOpenNCMem(ncidp, 'r');
+}
+int
+streamOpenWriteNCMem(int ncidp)
+{
+  return streamOpenNCMem(ncidp, 'w');
+}
 static int
 streamOpen(const char *filename, const char *filemode, int filetype)
 {
@@ -931,7 +942,6 @@ streamOpenRead(const char *filename)
           if (streamptr->record) Free(streamptr->record);
           reshRemove(streamptr->self, &streamOps);
         }
-      streamPrintP(streamptr, stdout);
     }
 
   return streamID;
-- 
GitLab