From e80bc5ba2e363f1f96f41173d7f580929342d151 Mon Sep 17 00:00:00 2001
From: Uwe Schulzweida <uwe.schulzweida@mpimet.mpg.de>
Date: Sun, 9 Jun 2024 14:50:59 +0200
Subject: [PATCH] EXSE library update

---
 src/cdf_read.c   |  24 +++----
 src/exse.h       |   8 +--
 src/extra.h      |  25 ++++---
 src/extralib.c   | 180 ++++++++++++++++++++++++++++++-----------------
 src/ieg.h        |   8 +--
 src/ieglib.c     |  40 +++++------
 src/service.h    |   8 +--
 src/servicelib.c |  46 ++++++------
 src/stream_ext.c |  18 ++---
 src/stream_ieg.c |  16 ++---
 src/stream_srv.c |  16 ++---
 11 files changed, 224 insertions(+), 165 deletions(-)

diff --git a/src/cdf_read.c b/src/cdf_read.c
index 654f761f0..549b240cb 100644
--- a/src/cdf_read.c
+++ b/src/cdf_read.c
@@ -561,7 +561,7 @@ cdfReadDataSliceDP2SP(int fileID, int ncvarid, size_t length, size_t start[MAX_D
 }
 
 static void
-cdfCheckDataDP_UINT8(int fileID, int ncvarid, int vlistID, int varID, size_t length, double *data)
+cdfCheckDataFP64_UINT8(int fileID, int ncvarid, int vlistID, int varID, size_t length, double *data)
 {
   if (vlistInqVarDatatype(vlistID, varID) == CDI_DATATYPE_UINT8)
     {
@@ -576,7 +576,7 @@ cdfCheckDataDP_UINT8(int fileID, int ncvarid, int vlistID, int varID, size_t len
 }
 
 static void
-cdfCheckDataSP_UINT8(int fileID, int ncvarid, int vlistID, int varID, size_t length, float *data)
+cdfCheckDataFP32_UINT8(int fileID, int ncvarid, int vlistID, int varID, size_t length, float *data)
 {
   if (vlistInqVarDatatype(vlistID, varID) == CDI_DATATYPE_UINT8)
     {
@@ -591,7 +591,7 @@ cdfCheckDataSP_UINT8(int fileID, int ncvarid, int vlistID, int varID, size_t len
 }
 
 static void
-cdfReadDataDP(stream_t *streamptr, int varID, size_t length, size_t start[MAX_DIMENSIONS], size_t count[MAX_DIMENSIONS],
+cdfReadDataFP64(stream_t *streamptr, int varID, size_t length, size_t start[MAX_DIMENSIONS], size_t count[MAX_DIMENSIONS],
               double *data)
 {
   int vlistID = streamptr->vlistID;
@@ -621,13 +621,13 @@ cdfReadDataDP(stream_t *streamptr, int varID, size_t length, size_t start[MAX_DI
         {
           cdf_get_vara_double(fileID, ncvarid, start, count, data);
 
-          cdfCheckDataDP_UINT8(fileID, ncvarid, vlistID, varID, length, data);
+          cdfCheckDataFP64_UINT8(fileID, ncvarid, vlistID, varID, length, data);
         }
     }
 }
 
 static void
-cdfReadDataSP(stream_t *streamptr, int varID, size_t length, size_t start[MAX_DIMENSIONS], size_t count[MAX_DIMENSIONS],
+cdfReadDataFP32(stream_t *streamptr, int varID, size_t length, size_t start[MAX_DIMENSIONS], size_t count[MAX_DIMENSIONS],
               float *data)
 {
   int vlistID = streamptr->vlistID;
@@ -663,7 +663,7 @@ cdfReadDataSP(stream_t *streamptr, int varID, size_t length, size_t start[MAX_DI
         {
           cdf_get_vara_float(fileID, ncvarid, start, count, data);
 
-          cdfCheckDataSP_UINT8(fileID, ncvarid, vlistID, varID, length, data);
+          cdfCheckDataFP32_UINT8(fileID, ncvarid, vlistID, varID, length, data);
         }
     }
 }
@@ -679,7 +679,7 @@ cdfReadVarDP(stream_t *streamptr, int varID, double *data, size_t *numMissVals)
   cdfGetSlapDescription(streamptr, varID, &start, &count);
 
   size_t length = getSizeVar3D(vlistID, varID);
-  cdfReadDataDP(streamptr, varID, length, start, count, data);
+  cdfReadDataFP64(streamptr, varID, length, start, count, data);
 
   *numMissVals = cdfDoInputDataTransformationDP(vlistID, varID, length, data);
 }
@@ -695,7 +695,7 @@ cdfReadVarSP(stream_t *streamptr, int varID, float *data, size_t *numMissVals)
   cdfGetSlapDescription(streamptr, varID, &start, &count);
 
   size_t length = getSizeVar3D(vlistID, varID);
-  cdfReadDataSP(streamptr, varID, length, start, count, data);
+  cdfReadDataFP32(streamptr, varID, length, start, count, data);
 
   *numMissVals = cdfDoInputDataTransformationSP(vlistID, varID, length, data);
 }
@@ -721,7 +721,7 @@ cdf_read_var_slice_DP(stream_t *streamptr, int tsID, int varID, int levelID, dou
   int vlistID = streamptr->vlistID;
   int gridId = vlistInqVarGrid(vlistID, varID);
   size_t length = gridInqSize(gridId);
-  cdfReadDataDP(streamptr, varID, length, start, count, data);
+  cdfReadDataFP64(streamptr, varID, length, start, count, data);
 
   if (swapxy) transpose2dArrayDP(gridId, data);
 
@@ -746,7 +746,7 @@ cdf_read_var_slice_SP(stream_t *streamptr, int tsID, int varID, int levelID, flo
   int vlistID = streamptr->vlistID;
   int gridId = vlistInqVarGrid(vlistID, varID);
   size_t length = gridInqSize(gridId);
-  cdfReadDataSP(streamptr, varID, length, start, count, data);
+  cdfReadDataFP32(streamptr, varID, length, start, count, data);
 
   if (swapxy) transpose2dArraySP(gridId, data);
 
@@ -982,7 +982,7 @@ cdfReadVarSliceDPPart(stream_t *streamptr, int varID, int levelID, int varType,
   start[position] = start[position] + startpoint;
   count[position] = length;
 
-  cdfReadDataDP(streamptr, varID, length, start, count, data);
+  cdfReadDataFP64(streamptr, varID, length, start, count, data);
 
   if (swapxy) transpose2dArrayDP(gridId, data);
 
@@ -1013,7 +1013,7 @@ cdfReadVarSliceSPPart(stream_t *streamptr, int varID, int levelID, int varType,
   start[position] = start[position] + startpoint;
   count[position] = length;
 
-  cdfReadDataSP(streamptr, varID, length, start, count, data);
+  cdfReadDataFP32(streamptr, varID, length, start, count, data);
 
   if (swapxy) transpose2dArraySP(gridId, data);
 
diff --git a/src/exse.h b/src/exse.h
index 09f469104..ef0ed8206 100644
--- a/src/exse.h
+++ b/src/exse.h
@@ -1,10 +1,10 @@
 #ifndef EXSE_H
 #define EXSE_H
 
-enum
-{
-  EXSE_SINGLE_PRECISION = 4,
-  EXSE_DOUBLE_PRECISION = 8,
+enum {
+  EXSE_PREC_FP16 = 2,
+  EXSE_PREC_FP32 = 4,
+  EXSE_PREC_FP64 = 8,
 };
 
 #endif
diff --git a/src/extra.h b/src/extra.h
index 299a148dd..2d85f48c4 100644
--- a/src/extra.h
+++ b/src/extra.h
@@ -1,16 +1,19 @@
 #ifndef _EXTRA_H
 #define _EXTRA_H
 
-#define EXT_REAL 1
-#define EXT_COMP 2
+enum
+{
+  EXT_REAL = 1,
+  EXT_COMP = 2,
+};
 
 typedef struct
 {
   int checked;
   int byteswap;
   int header[4];
-  int prec;   /* single or double precison */
-  int number; /* real or complex */
+  int prec;   // single or double precison
+  int number; // real or complex
   size_t datasize;
   size_t buffersize;
   void *buffer;
@@ -29,12 +32,18 @@ int extRead(int fileID, void *ext);
 int extWrite(int fileID, void *ext);
 
 int extInqHeader(void *ext, int *header);
-int extInqDataSP(void *ext, float *data);
-int extInqDataDP(void *ext, double *data);
+int extInqDataFP32(void *ext, float *data);
+int extInqDataFP64(void *ext, double *data);
 
 int extDefHeader(void *ext, const int *header);
-int extDefDataSP(void *ext, const float *data);
-int extDefDataDP(void *ext, const double *data);
+int extDefDataFP32(void *ext, const float *data);
+int extDefDataFP64(void *ext, const double *data);
+
+#include "float16.h"
+#ifdef HAVE_FLOAT16
+int extInqDataFP16(void *ext, _Float16 *data);
+int extDefDataFP16(void *ext, const _Float16 *data);
+#endif
 
 #endif /* _EXTRA_H */
 /*
diff --git a/src/extralib.c b/src/extralib.c
index 5cee8bb92..4f45eccb0 100644
--- a/src/extralib.c
+++ b/src/extralib.c
@@ -10,6 +10,7 @@
 #include "binary.h"
 #include "exse.h"
 #include "swap.h"
+#include "float16.h"
 
 enum
 {
@@ -65,8 +66,9 @@ extLibInit(void)
                 extDefaultNumber = EXT_REAL;
                 switch ((int) envString[1])
                   {
-                  case '4': extDefaultPrec = EXSE_SINGLE_PRECISION; break;
-                  case '8': extDefaultPrec = EXSE_DOUBLE_PRECISION; break;
+                  case '2': extDefaultPrec = EXSE_PREC_FP16; break;
+                  case '4': extDefaultPrec = EXSE_PREC_FP32; break;
+                  case '8': extDefaultPrec = EXSE_PREC_FP64; break;
                   default: Warning("Invalid digit in %s: %s", envName, envString);
                   }
                 break;
@@ -76,8 +78,8 @@ extLibInit(void)
                 extDefaultNumber = EXT_COMP;
                 switch ((int) envString[1])
                   {
-                  case '4': extDefaultPrec = EXSE_SINGLE_PRECISION; break;
-                  case '8': extDefaultPrec = EXSE_DOUBLE_PRECISION; break;
+                  case '4': extDefaultPrec = EXSE_PREC_FP32; break;
+                  case '8': extDefaultPrec = EXSE_PREC_FP64; break;
                   default: Warning("Invalid digit in %s: %s", envName, envString);
                   }
                 break;
@@ -149,7 +151,7 @@ extCheckFiletype(int fileID, int *swap)
   if (blocklen == 16)
     {
      *swap = 0;
-      fact = blocklen/4;
+      fact = blocklen / 4;
       if (fileRead(fileID, buffer, blocklen+8) != blocklen+8) return 0;
       pbuf = buffer+3*fact;      dimxy = (size_t) get_uint32(pbuf);
       pbuf = buffer+blocklen+4;  data  = (size_t) get_uint32(pbuf);
@@ -157,7 +159,7 @@ extCheckFiletype(int fileID, int *swap)
   else if (blocklen == 32)
     {
      *swap = 0;
-      fact = blocklen/4;
+      fact = blocklen / 4;
       if (fileRead(fileID, buffer, blocklen+8) != blocklen+8) return 0;
       pbuf = buffer+3*fact;      dimxy = (size_t) get_uint64(pbuf);
       pbuf = buffer+blocklen+4;  data  = (size_t) get_uint32(pbuf);
@@ -165,7 +167,7 @@ extCheckFiletype(int fileID, int *swap)
   else if (sblocklen == 16)
     {
      *swap = 1;
-      fact = sblocklen/4;
+      fact = sblocklen / 4;
       if (fileRead(fileID, buffer, sblocklen+8) != sblocklen+8) return 0;
       pbuf = buffer+3*fact;       dimxy = (size_t) get_swap_uint32(pbuf);
       pbuf = buffer+sblocklen+4;  data  = (size_t) get_swap_uint32(pbuf);
@@ -173,7 +175,7 @@ extCheckFiletype(int fileID, int *swap)
   else if (sblocklen == 32)
     {
      *swap = 1;
-      fact = sblocklen/4;
+      fact = sblocklen / 4;
       if (fileRead(fileID, buffer, sblocklen+8) != sblocklen+8) return 0;
       pbuf = buffer+3*fact;       dimxy = (size_t) get_swap_uint64(pbuf);
       pbuf = buffer+sblocklen+4;  data  = (size_t) get_swap_uint32(pbuf);
@@ -185,7 +187,7 @@ extCheckFiletype(int fileID, int *swap)
   if (EXT_Debug) Message("swap = %d fact = %d", *swap, fact);
   if (EXT_Debug) Message("dimxy = %lu data = %lu", dimxy, data);
 
-  int found = data && (dimxy * fact == data || dimxy * fact * 2 == data);
+  int found = data && (dimxy * fact == data || dimxy * fact * 2 == data || dimxy * fact / 2 == data);
   return found;
 }
 
@@ -227,38 +229,44 @@ extInqData(extrec_t *extp, int prec, void *data)
 
   switch (rprec)
     {
-    case EXSE_SINGLE_PRECISION:
+    case EXSE_PREC_FP32:
       {
-        if (sizeof(float) == 4)
-          {
-            if (byteswap) swap4byte(buffer, datasize);
-
-            if (rprec == prec)
-              memcpy(data, buffer, datasize * sizeof(float));
-            else
-              for (size_t i = 0; i < datasize; ++i) ((double *) data)[i] = (double) ((float *) buffer)[i];
-          }
-        else
-          {
-            Error("not implemented for %d byte float", sizeof(float));
-          }
+        if (byteswap) swap4byte(buffer, datasize);
+
+        if (EXSE_PREC_FP32 == prec)
+          memcpy(data, buffer, datasize * prec);
+        else if (EXSE_PREC_FP64 == prec)
+          for (size_t i = 0; i < datasize; ++i) ((double *) data)[i] = (double) ((float *) buffer)[i];
+#ifdef HAVE_FLOAT16
+        else if (EXSE_PREC_FP16 == prec)
+          for (size_t i = 0; i < datasize; ++i) ((_Float16 *) data)[i] = (_Float16) ((float *) buffer)[i];
+#endif
         break;
       }
-    case EXSE_DOUBLE_PRECISION:
-      if (sizeof(double) == 8)
-        {
-          if (byteswap) swap8byte(buffer, datasize);
+    case EXSE_PREC_FP64:
+      if (byteswap) swap8byte(buffer, datasize);
+
+      if (EXSE_PREC_FP64 == prec)
+        memcpy(data, buffer, datasize * prec);
+      else if (EXSE_PREC_FP32 == prec)
+        for (size_t i = 0; i < datasize; ++i) ((float *) data)[i] = (float) ((double *) buffer)[i];
+#ifdef HAVE_FLOAT16
+      else if (EXSE_PREC_FP16 == prec)
+        for (size_t i = 0; i < datasize; ++i) ((_Float16 *) data)[i] = (_Float16) ((double *) buffer)[i];
+#endif
+
+      break;
+#ifdef HAVE_FLOAT16
+    case EXSE_PREC_FP16:
+      if (EXSE_PREC_FP16 == prec)
+        memcpy(data, buffer, datasize * prec);
+      else if (EXSE_PREC_FP64 == prec)
+        for (size_t i = 0; i < datasize; ++i) ((double *) data)[i] = (double) ((_Float16 *) buffer)[i];
+      else if (EXSE_PREC_FP32 == prec)
+        for (size_t i = 0; i < datasize; ++i) ((float *) data)[i] = (float) ((_Float16 *) buffer)[i];
 
-          if (rprec == prec)
-            memcpy(data, buffer, datasize * sizeof(double));
-          else
-            for (size_t i = 0; i < datasize; ++i) ((float *) data)[i] = (float) ((double *) buffer)[i];
-        }
-      else
-        {
-          Error("not implemented for %d byte float", sizeof(double));
-        }
       break;
+#endif
     default:
       {
         Error("unexpected data precision %d", rprec);
@@ -270,16 +278,23 @@ extInqData(extrec_t *extp, int prec, void *data)
 }
 
 int
-extInqDataSP(void *ext, float *data)
+extInqDataFP32(void *ext, float *data)
 {
-  return extInqData((extrec_t *) ext, EXSE_SINGLE_PRECISION, (void *) data);
+  return extInqData((extrec_t *) ext, EXSE_PREC_FP32, (void *) data);
 }
 
 int
-extInqDataDP(void *ext, double *data)
+extInqDataFP64(void *ext, double *data)
 {
-  return extInqData((extrec_t *) ext, EXSE_DOUBLE_PRECISION, (void *) data);
+  return extInqData((extrec_t *) ext, EXSE_PREC_FP64, (void *) data);
 }
+#ifdef HAVE_FLOAT16
+int
+extInqDataFP16(void *ext, _Float16 *data)
+{
+  return extInqData((extrec_t *) ext, EXSE_PREC_FP16, (void *) data);
+}
+#endif
 
 static int
 extDefData(void *ext, int prec, const void *data)
@@ -305,24 +320,43 @@ extDefData(void *ext, int prec, const void *data)
 
   switch (rprec)
     {
-    case EXSE_SINGLE_PRECISION:
+    case EXSE_PREC_FP32:
       {
-        if (rprec == prec)
-          memcpy(extp->buffer, data, datasize * sizeof(float));
-        else
+        if (EXSE_PREC_FP32 == prec)
+          memcpy(extp->buffer, data, datasize * prec);
+        else if (EXSE_PREC_FP64 == prec)
           for (size_t i = 0; i < datasize; i++) ((float *) extp->buffer)[i] = (float) ((double *) data)[i];
-
+#ifdef HAVE_FLOAT16
+        else if (EXSE_PREC_FP16 == prec)
+          for (size_t i = 0; i < datasize; i++) ((float *) extp->buffer)[i] = (float) ((_Float16 *) data)[i];
+#endif
         break;
       }
-    case EXSE_DOUBLE_PRECISION:
+    case EXSE_PREC_FP64:
       {
-        if (rprec == prec)
-          memcpy(extp->buffer, data, datasize * sizeof(double));
-        else
+        if (EXSE_PREC_FP64 == prec)
+          memcpy(extp->buffer, data, datasize * prec);
+        else if (EXSE_PREC_FP32 == prec)
           for (size_t i = 0; i < datasize; i++) ((double *) extp->buffer)[i] = (double) ((float *) data)[i];
+#ifdef HAVE_FLOAT16
+        else if (EXSE_PREC_FP16 == prec)
+          for (size_t i = 0; i < datasize; i++) ((double *) extp->buffer)[i] = (double) ((_Float16 *) data)[i];
+#endif
+        break;
+      }
+#ifdef HAVE_FLOAT16
+    case EXSE_PREC_FP16:
+      {
+        if (EXSE_PREC_FP16 == prec)
+          memcpy(extp->buffer, data, datasize * prec);
+        else if (EXSE_PREC_FP32 == prec)
+          for (size_t i = 0; i < datasize; i++) ((_Float16 *) extp->buffer)[i] = (_Float16) ((float *) data)[i];
+        else if (EXSE_PREC_FP64 == prec)
+          for (size_t i = 0; i < datasize; i++) ((_Float16 *) extp->buffer)[i] = (_Float16) ((double *) data)[i];
 
         break;
       }
+#endif
     default:
       {
         Error("unexpected data precision %d", rprec);
@@ -334,16 +368,23 @@ extDefData(void *ext, int prec, const void *data)
 }
 
 int
-extDefDataSP(void *ext, const float *data)
+extDefDataFP32(void *ext, const float *data)
 {
-  return extDefData(ext, EXSE_SINGLE_PRECISION, (void *) data);
+  return extDefData(ext, EXSE_PREC_FP32, (void *) data);
 }
 
 int
-extDefDataDP(void *ext, const double *data)
+extDefDataFP64(void *ext, const double *data)
+{
+  return extDefData(ext, EXSE_PREC_FP64, (void *) data);
+}
+#ifdef HAVE_FLOAT16
+int
+extDefDataFP16(void *ext, const _Float16 *data)
 {
-  return extDefData(ext, EXSE_DOUBLE_PRECISION, (void *) data);
+  return extDefData(ext, EXSE_PREC_FP16, (void *) data);
 }
+#endif
 
 int
 extRead(int fileID, void *ext)
@@ -367,19 +408,19 @@ extRead(int fileID, void *ext)
   if (EXT_Debug) Message("blocklen = %lu", blocklen);
 
   size_t hprec = blocklen / EXT_HEADER_LEN;
-
-  extp->prec = (int) hprec;
+  // extp->prec = (int) hprec;
 
   union EXT_HEADER tempheader;
   switch (hprec)
     {
-    case EXSE_SINGLE_PRECISION:
+    case EXSE_PREC_FP32:
+    case EXSE_PREC_FP16:
       {
         binReadInt32(fileID, byteswap, EXT_HEADER_LEN, tempheader.i32);
         for (int i = 0; i < EXT_HEADER_LEN; i++) extp->header[i] = (int) tempheader.i32[i];
         break;
       }
-    case EXSE_DOUBLE_PRECISION:
+    case EXSE_PREC_FP64:
       {
         binReadInt64(fileID, byteswap, EXT_HEADER_LEN, tempheader.i64);
         for (int i = 0; i < EXT_HEADER_LEN; i++) extp->header[i] = (int) tempheader.i64[i];
@@ -413,19 +454,20 @@ extRead(int fileID, void *ext)
     }
 
   size_t dprec = blocklen / extp->datasize;
+  extp->prec = (int) dprec;
 
-  if (dprec == hprec)
+  if (dprec == hprec || dprec == hprec / 2)
     {
       extp->number = EXT_REAL;
     }
-  else if (dprec == 2 * hprec)
+  else if (dprec == hprec * 2)
     {
       dprec /= 2;
       extp->datasize *= 2;
       extp->number = EXT_COMP;
     }
 
-  if (dprec != EXSE_SINGLE_PRECISION && dprec != EXSE_DOUBLE_PRECISION)
+  if (dprec != EXSE_PREC_FP32 && dprec != EXSE_PREC_FP64 && dprec != EXSE_PREC_FP16)
     {
       Warning("Unexpected data precision %d", dprec);
       return -1;
@@ -455,19 +497,20 @@ extWrite(int fileID, void *ext)
   int *header = extp->header;
 
   // write header record
-  size_t blocklen = EXT_HEADER_LEN * (size_t) rprec;
+  size_t blocklen = EXT_HEADER_LEN * (size_t) ((rprec == EXSE_PREC_FP16) ? EXSE_PREC_FP32 : rprec);
 
   binWriteF77Block(fileID, byteswap, blocklen);
 
   switch (rprec)
     {
-    case EXSE_SINGLE_PRECISION:
+    case EXSE_PREC_FP16:
+    case EXSE_PREC_FP32:
       {
         for (int i = 0; i < EXT_HEADER_LEN; i++) tempheader.i32[i] = (int32_t) header[i];
         binWriteInt32(fileID, byteswap, EXT_HEADER_LEN, tempheader.i32);
         break;
       }
-    case EXSE_DOUBLE_PRECISION:
+    case EXSE_PREC_FP64:
       {
         for (int i = 0; i < EXT_HEADER_LEN; i++) tempheader.i64[i] = (int64_t) header[i];
         binWriteInt64(fileID, byteswap, EXT_HEADER_LEN, tempheader.i64);
@@ -490,12 +533,19 @@ extWrite(int fileID, void *ext)
 
   switch (rprec)
     {
-    case EXSE_SINGLE_PRECISION:
+#ifdef HAVE_FLOAT16
+    case EXSE_PREC_FP16:
+      {
+        binWriteFlt16(fileID, byteswap, extp->datasize, (_Float16 *) extp->buffer);
+        break;
+      }
+#endif
+    case EXSE_PREC_FP32:
       {
         binWriteFlt32(fileID, byteswap, extp->datasize, (float *) extp->buffer);
         break;
       }
-    case EXSE_DOUBLE_PRECISION:
+    case EXSE_PREC_FP64:
       {
         binWriteFlt64(fileID, byteswap, extp->datasize, (double *) extp->buffer);
         break;
diff --git a/src/ieg.h b/src/ieg.h
index 7876aadd0..df110c2d5 100644
--- a/src/ieg.h
+++ b/src/ieg.h
@@ -84,12 +84,12 @@ int iegWrite(int fileID, void *ieg);
 
 void iegCopyMeta(void *dieg, void *sieg);
 int iegInqHeader(void *ieg, int *header);
-int iegInqDataSP(void *ieg, float *data);
-int iegInqDataDP(void *ieg, double *data);
+int iegInqDataFP32(void *ieg, float *data);
+int iegInqDataFP64(void *ieg, double *data);
 
 int iegDefHeader(void *ieg, const int *header);
-int iegDefDataSP(void *ieg, const float *data);
-int iegDefDataDP(void *ieg, const double *data);
+int iegDefDataFP32(void *ieg, const float *data);
+int iegDefDataFP64(void *ieg, const double *data);
 
 #endif /* _IEG_H */
 /*
diff --git a/src/ieglib.c b/src/ieglib.c
index e7c6cdcd2..58550504f 100644
--- a/src/ieglib.c
+++ b/src/ieglib.c
@@ -47,8 +47,8 @@ iegLibInit(void)
               {
                 switch ((int) envString[pos + 1])
                   {
-                  case '4': iegDefaultDprec = EXSE_SINGLE_PRECISION; break;
-                  case '8': iegDefaultDprec = EXSE_DOUBLE_PRECISION; break;
+                  case '4': iegDefaultDprec = EXSE_PREC_FP32; break;
+                  case '8': iegDefaultDprec = EXSE_PREC_FP64; break;
                   default: Warning("Invalid digit in %s: %s", envName, envString);
                   }
                 break;
@@ -208,7 +208,7 @@ iegInqData(void *ieg, int prec, void *data)
 
   switch (dprec)
     {
-    case EXSE_SINGLE_PRECISION:
+    case EXSE_PREC_FP32:
       {
         if (sizeof(float) == 4)
           {
@@ -229,7 +229,7 @@ iegInqData(void *ieg, int prec, void *data)
           }
         break;
       }
-    case EXSE_DOUBLE_PRECISION:
+    case EXSE_PREC_FP64:
       {
         if (sizeof(double) == 8)
           {
@@ -261,15 +261,15 @@ iegInqData(void *ieg, int prec, void *data)
 }
 
 int
-iegInqDataSP(void *ieg, float *data)
+iegInqDataFP32(void *ieg, float *data)
 {
-  return iegInqData(ieg, EXSE_SINGLE_PRECISION, (void *) data);
+  return iegInqData(ieg, EXSE_PREC_FP32, (void *) data);
 }
 
 int
-iegInqDataDP(void *ieg, double *data)
+iegInqDataFP64(void *ieg, double *data)
 {
-  return iegInqData(ieg, EXSE_DOUBLE_PRECISION, (void *) data);
+  return iegInqData(ieg, EXSE_PREC_FP64, (void *) data);
 }
 
 static int
@@ -291,7 +291,7 @@ iegDefData(iegrec_t *iegp, int prec, const void *data)
 
   switch (dprec)
     {
-    case EXSE_SINGLE_PRECISION:
+    case EXSE_PREC_FP32:
       {
         if (dprec == prec)
           memcpy(iegp->buffer, data, datasize * sizeof(float));
@@ -303,7 +303,7 @@ iegDefData(iegrec_t *iegp, int prec, const void *data)
           }
         break;
       }
-    case EXSE_DOUBLE_PRECISION:
+    case EXSE_PREC_FP64:
       {
         if (dprec == prec)
           memcpy(iegp->buffer, data, datasize * sizeof(double));
@@ -326,15 +326,15 @@ iegDefData(iegrec_t *iegp, int prec, const void *data)
 }
 
 int
-iegDefDataSP(void *ieg, const float *data)
+iegDefDataFP32(void *ieg, const float *data)
 {
-  return iegDefData((iegrec_t *) ieg, EXSE_SINGLE_PRECISION, (void *) data);
+  return iegDefData((iegrec_t *) ieg, EXSE_PREC_FP32, (void *) data);
 }
 
 int
-iegDefDataDP(void *ieg, const double *data)
+iegDefDataFP64(void *ieg, const double *data)
 {
-  return iegDefData((iegrec_t *) ieg, EXSE_DOUBLE_PRECISION, (void *) data);
+  return iegDefData((iegrec_t *) ieg, EXSE_PREC_FP64, (void *) data);
 }
 
 int
@@ -399,7 +399,7 @@ iegRead(int fileID, void *ieg)
   binReadInt32(fileID, byteswap, 3, buf.i32);
   for (int i = 0; i < 3; i++) iegp->igdb[18 + i] = (int) buf.i32[i];
 
-  if (dprec == EXSE_SINGLE_PRECISION)
+  if (dprec == EXSE_PREC_FP32)
     {
       fileRead(fileID, buf.f, 400);
       if (byteswap) swap4byte(buf.f, 100);
@@ -464,7 +464,7 @@ iegWrite(int fileID, void *ieg)
   int byteswap = iegp->byteswap;
 
   // write header record
-  size_t blocklen = (dprec == EXSE_SINGLE_PRECISION) ? 636 : 1040;
+  size_t blocklen = (dprec == EXSE_PREC_FP32) ? 636 : 1040;
 
   binWriteF77Block(fileID, byteswap, blocklen);
 
@@ -476,7 +476,7 @@ iegWrite(int fileID, void *ieg)
 
   double refval = (double) iegp->refval;
   float refvalf = (float) iegp->refval;
-  if (dprec == EXSE_SINGLE_PRECISION)
+  if (dprec == EXSE_PREC_FP32)
     binWriteFlt32(fileID, byteswap, 1, &refvalf);
   else
     binWriteFlt64(fileID, byteswap, 1, &refval);
@@ -484,7 +484,7 @@ iegWrite(int fileID, void *ieg)
   for (int i = 0; i < 3; i++) buf.i32[i] = (int32_t) iegp->igdb[18 + i];
   binWriteInt32(fileID, byteswap, 3, buf.i32);
 
-  if (dprec == EXSE_SINGLE_PRECISION)
+  if (dprec == EXSE_PREC_FP32)
     {
       for (int i = 0; i < 100; i++) buf.fvct[i] = (float) iegp->vct[i];
       binWriteFlt32(fileID, byteswap, 100, buf.fvct);
@@ -503,12 +503,12 @@ iegWrite(int fileID, void *ieg)
 
   switch (dprec)
     {
-    case EXSE_SINGLE_PRECISION:
+    case EXSE_PREC_FP32:
       {
         binWriteFlt32(fileID, byteswap, iegp->datasize, (float *) iegp->buffer);
         break;
       }
-    case EXSE_DOUBLE_PRECISION:
+    case EXSE_PREC_FP64:
       {
         binWriteFlt64(fileID, byteswap, iegp->datasize, (double *) iegp->buffer);
         break;
diff --git a/src/service.h b/src/service.h
index 7eed0950c..9c9a5d14b 100644
--- a/src/service.h
+++ b/src/service.h
@@ -26,12 +26,12 @@ int srvRead(int fileID, void *srv);
 void srvWrite(int fileID, void *srv);
 
 int srvInqHeader(void *srv, int *header);
-int srvInqDataSP(void *srv, float *data);
-int srvInqDataDP(void *srv, double *data);
+int srvInqDataFP32(void *srv, float *data);
+int srvInqDataFP64(void *srv, double *data);
 
 int srvDefHeader(void *srv, const int *header);
-int srvDefDataSP(void *srv, const float *data);
-int srvDefDataDP(void *srv, const double *data);
+int srvDefDataFP32(void *srv, const float *data);
+int srvDefDataFP64(void *srv, const double *data);
 
 #endif /* _SERVICE_H */
 /*
diff --git a/src/servicelib.c b/src/servicelib.c
index 2a15e1719..dc673f970 100644
--- a/src/servicelib.c
+++ b/src/servicelib.c
@@ -67,8 +67,8 @@ srvLibInit(void)
               {
                 switch ((int) envString[pos + 1])
                   {
-                  case '4': srvDefaultHprec = EXSE_SINGLE_PRECISION; break;
-                  case '8': srvDefaultHprec = EXSE_DOUBLE_PRECISION; break;
+                  case '4': srvDefaultHprec = EXSE_PREC_FP32; break;
+                  case '8': srvDefaultHprec = EXSE_PREC_FP64; break;
                   default: Warning("Invalid digit in %s: %s", envName, envString);
                   }
                 break;
@@ -77,8 +77,8 @@ srvLibInit(void)
               {
                 switch ((int) envString[pos + 1])
                   {
-                  case '4': srvDefaultDprec = EXSE_SINGLE_PRECISION; break;
-                  case '8': srvDefaultDprec = EXSE_DOUBLE_PRECISION; break;
+                  case '4': srvDefaultDprec = EXSE_PREC_FP32; break;
+                  case '8': srvDefaultDprec = EXSE_PREC_FP64; break;
                   default: Warning("Invalid digit in %s: %s", envName, envString);
                   }
                 break;
@@ -231,7 +231,7 @@ srvInqData(srvrec_t *srvp, int prec, void *data)
 
   switch (dprec)
     {
-    case EXSE_SINGLE_PRECISION:
+    case EXSE_PREC_FP32:
       {
         if (sizeof(float) == 4)
           {
@@ -248,7 +248,7 @@ srvInqData(srvrec_t *srvp, int prec, void *data)
           }
         break;
       }
-    case EXSE_DOUBLE_PRECISION:
+    case EXSE_PREC_FP64:
       if (sizeof(double) == 8)
         {
           if (byteswap) swap8byte(buffer, datasize);
@@ -274,15 +274,15 @@ srvInqData(srvrec_t *srvp, int prec, void *data)
 }
 
 int
-srvInqDataSP(void *srv, float *data)
+srvInqDataFP32(void *srv, float *data)
 {
-  return srvInqData((srvrec_t *) srv, EXSE_SINGLE_PRECISION, (void *) data);
+  return srvInqData((srvrec_t *) srv, EXSE_PREC_FP32, (void *) data);
 }
 
 int
-srvInqDataDP(void *srv, double *data)
+srvInqDataFP64(void *srv, double *data)
 {
-  return srvInqData((srvrec_t *) srv, EXSE_DOUBLE_PRECISION, (void *) data);
+  return srvInqData((srvrec_t *) srv, EXSE_PREC_FP64, (void *) data);
 }
 
 static int
@@ -311,7 +311,7 @@ srvDefData(void *srv, int prec, const void *data)
 
   switch (dprec)
     {
-    case EXSE_SINGLE_PRECISION:
+    case EXSE_PREC_FP32:
       {
         if (dprec == prec)
           memcpy(srvp->buffer, data, datasize * sizeof(float));
@@ -320,7 +320,7 @@ srvDefData(void *srv, int prec, const void *data)
 
         break;
       }
-    case EXSE_DOUBLE_PRECISION:
+    case EXSE_PREC_FP64:
       {
         if (dprec == prec)
           memcpy(srvp->buffer, data, datasize * sizeof(double));
@@ -340,15 +340,15 @@ srvDefData(void *srv, int prec, const void *data)
 }
 
 int
-srvDefDataSP(void *srv, const float *data)
+srvDefDataFP32(void *srv, const float *data)
 {
-  return srvDefData(srv, EXSE_SINGLE_PRECISION, (void *) data);
+  return srvDefData(srv, EXSE_PREC_FP32, (void *) data);
 }
 
 int
-srvDefDataDP(void *srv, const double *data)
+srvDefDataFP64(void *srv, const double *data)
 {
-  return srvDefData(srv, EXSE_DOUBLE_PRECISION, (void *) data);
+  return srvDefData(srv, EXSE_PREC_FP64, (void *) data);
 }
 
 int
@@ -379,13 +379,13 @@ srvRead(int fileID, void *srv)
 
   switch (hprec)
     {
-    case EXSE_SINGLE_PRECISION:
+    case EXSE_PREC_FP32:
       {
         binReadInt32(fileID, byteswap, SRV_HEADER_LEN, tempheader.i32);
         for (int i = 0; i < SRV_HEADER_LEN; i++) srvp->header[i] = (int) tempheader.i32[i];
         break;
       }
-    case EXSE_DOUBLE_PRECISION:
+    case EXSE_PREC_FP64:
       {
         binReadInt64(fileID, byteswap, SRV_HEADER_LEN, tempheader.i64);
         for (int i = 0; i < SRV_HEADER_LEN; i++) srvp->header[i] = (int) tempheader.i64[i];
@@ -422,7 +422,7 @@ srvRead(int fileID, void *srv)
 
   srvp->dprec = (int) dprec;
 
-  if (dprec != EXSE_SINGLE_PRECISION && dprec != EXSE_DOUBLE_PRECISION)
+  if (dprec != EXSE_PREC_FP32 && dprec != EXSE_PREC_FP64)
     {
       Warning("Unexpected data precision %d", dprec);
       return -1;
@@ -458,13 +458,13 @@ srvWrite(int fileID, void *srv)
 
   switch (hprec)
     {
-    case EXSE_SINGLE_PRECISION:
+    case EXSE_PREC_FP32:
       {
         for (int i = 0; i < SRV_HEADER_LEN; i++) tempheader.i32[i] = (int32_t) header[i];
         binWriteInt32(fileID, byteswap, SRV_HEADER_LEN, tempheader.i32);
         break;
       }
-    case EXSE_DOUBLE_PRECISION:
+    case EXSE_PREC_FP64:
       {
         for (int i = 0; i < SRV_HEADER_LEN; i++) tempheader.i64[i] = (int64_t) header[i];
         binWriteInt64(fileID, byteswap, SRV_HEADER_LEN, tempheader.i64);
@@ -486,12 +486,12 @@ srvWrite(int fileID, void *srv)
 
   switch (dprec)
     {
-    case EXSE_SINGLE_PRECISION:
+    case EXSE_PREC_FP32:
       {
         binWriteFlt32(fileID, byteswap, srvp->datasize, (float *) srvp->buffer);
         break;
       }
-    case EXSE_DOUBLE_PRECISION:
+    case EXSE_PREC_FP64:
       {
         binWriteFlt64(fileID, byteswap, srvp->datasize, (double *) srvp->buffer);
         break;
diff --git a/src/stream_ext.c b/src/stream_ext.c
index f55f2c0d4..7fbcd25ce 100644
--- a/src/stream_ext.c
+++ b/src/stream_ext.c
@@ -21,9 +21,9 @@ static int
 extInqDatatype(int prec, int number)
 {
   if (number == 2)
-    return (prec == EXSE_DOUBLE_PRECISION) ? CDI_DATATYPE_CPX64 : CDI_DATATYPE_CPX32;
+    return (prec == EXSE_PREC_FP64) ? CDI_DATATYPE_CPX64 : CDI_DATATYPE_CPX32;
   else
-    return (prec == EXSE_DOUBLE_PRECISION) ? CDI_DATATYPE_FLT64 : CDI_DATATYPE_FLT32;
+    return (prec == EXSE_PREC_FP64) ? CDI_DATATYPE_FLT64 : CDI_DATATYPE_FLT32;
 }
 
 static void
@@ -35,7 +35,7 @@ extDefDatatype(int datatype, int *prec, int *number)
 
   *number = (datatype == CDI_DATATYPE_CPX32 || datatype == CDI_DATATYPE_CPX64) ? 2 : 1;
 
-  *prec = (datatype == CDI_DATATYPE_FLT64 || datatype == CDI_DATATYPE_CPX64) ? EXSE_DOUBLE_PRECISION : EXSE_SINGLE_PRECISION;
+  *prec = (datatype == CDI_DATATYPE_FLT64 || datatype == CDI_DATATYPE_CPX64) ? EXSE_PREC_FP64 : EXSE_PREC_FP32;
 }
 
 /* not used
@@ -94,7 +94,7 @@ ext_read_recordSP(stream_t *streamptr, float *data, size_t *numMissVals)
 
   int header[4];
   extInqHeader(extp, header);
-  extInqDataSP(extp, data);
+  extInqDataFP32(extp, data);
 
   double missval = vlistInqVarMissval(vlistID, varID);
   size_t size = gridInqSize(vlistInqVarGrid(vlistID, varID));
@@ -126,7 +126,7 @@ ext_read_recordDP(stream_t *streamptr, double *data, size_t *numMissVals)
 
   int header[4];
   extInqHeader(extp, header);
-  extInqDataDP(extp, data);
+  extInqDataFP64(extp, data);
 
   double missval = vlistInqVarMissval(vlistID, varID);
   size_t size = gridInqSize(vlistInqVarGrid(vlistID, varID));
@@ -179,7 +179,7 @@ static void
 ext_write_recordSP(stream_t *streamptr, const float *data)
 {
   void *extp = streamptr->record->objectp;
-  extDefDataSP(extp, data);
+  extDefDataFP32(extp, data);
   extWrite(streamptr->fileID, extp);
 }
 
@@ -187,7 +187,7 @@ static void
 ext_write_recordDP(stream_t *streamptr, const double *data)
 {
   void *extp = streamptr->record->objectp;
-  extDefDataDP(extp, data);
+  extDefDataFP64(extp, data);
   extWrite(streamptr->fileID, extp);
 }
 
@@ -571,7 +571,7 @@ extReadVarSliceDP(stream_t *streamptr, int varID, int levID, double *data, size_
   extRead(fileID, extp);
   int header[4];
   extInqHeader(extp, header);
-  extInqDataDP(extp, data);
+  extInqDataFP64(extp, data);
 
   fileSetPos(fileID, currentfilepos, SEEK_SET);
 
@@ -619,7 +619,7 @@ extWriteVarSliceDP(stream_t *streamptr, int varID, int levID, const double *data
   extDefDatatype(vlistInqVarDatatype(vlistID, varID), &extp->prec, &extp->number);
   extDefHeader(extp, header);
 
-  extDefDataDP(extp, data);
+  extDefDataFP64(extp, data);
   extWrite(fileID, extp);
 }
 
diff --git a/src/stream_ieg.c b/src/stream_ieg.c
index 33abc8c41..e83d0c1ac 100644
--- a/src/stream_ieg.c
+++ b/src/stream_ieg.c
@@ -22,7 +22,7 @@
 static int
 iegInqDatatype(int prec)
 {
-  return (prec == EXSE_DOUBLE_PRECISION) ? CDI_DATATYPE_FLT64 : CDI_DATATYPE_FLT32;
+  return (prec == EXSE_PREC_FP64) ? CDI_DATATYPE_FLT64 : CDI_DATATYPE_FLT32;
 }
 
 static int
@@ -32,7 +32,7 @@ iegDefDatatype(int datatype)
 
   if (datatype != CDI_DATATYPE_FLT32 && datatype != CDI_DATATYPE_FLT64) datatype = CDI_DATATYPE_FLT32;
 
-  return (datatype == CDI_DATATYPE_FLT64) ? EXSE_DOUBLE_PRECISION : EXSE_SINGLE_PRECISION;
+  return (datatype == CDI_DATATYPE_FLT64) ? EXSE_PREC_FP64 : EXSE_PREC_FP32;
 }
 
 static void
@@ -52,7 +52,7 @@ ieg_read_recordSP(stream_t *streamptr, float *data, size_t *numMissVals)
   void *iegp = streamptr->record->objectp;
   if (iegRead(fileID, iegp) < 0) Error("Could not read IEG record!");
 
-  iegInqDataSP(iegp, data);
+  iegInqDataFP32(iegp, data);
 
   double missval = vlistInqVarMissval(vlistID, varID);
   size_t size = gridInqSize(vlistInqVarGrid(vlistID, varID));
@@ -79,7 +79,7 @@ ieg_read_recordDP(stream_t *streamptr, double *data, size_t *numMissVals)
   void *iegp = streamptr->record->objectp;
   if (iegRead(fileID, iegp) < 0) Error("Could not read IEG record!");
 
-  iegInqDataDP(iegp, data);
+  iegInqDataFP64(iegp, data);
 
   double missval = vlistInqVarMissval(vlistID, varID);
   size_t size = gridInqSize(vlistInqVarGrid(vlistID, varID));
@@ -487,7 +487,7 @@ ieg_write_recordSP(stream_t *streamptr, const float *data)
 
   iegp->refval = calc_refvalSP(gridsize, data);
 
-  iegDefDataSP(iegp, data);
+  iegDefDataFP32(iegp, data);
   iegWrite(fileID, iegp);
 }
 
@@ -502,7 +502,7 @@ ieg_write_recordDP(stream_t *streamptr, const double *data)
 
   iegp->refval = calc_refvalDP(gridsize, data);
 
-  iegDefDataDP(iegp, data);
+  iegDefDataFP64(iegp, data);
   iegWrite(fileID, iegp);
 }
 
@@ -1025,7 +1025,7 @@ iegReadVarSliceDP(stream_t *streamptr, int varID, int levID, double *data, size_
   off_t recpos = streamptr->tsteps[tsid].records[recID].position;
   fileSetPos(fileID, recpos, SEEK_SET);
   iegRead(fileID, iegp);
-  iegInqDataDP(iegp, data);
+  iegInqDataFP64(iegp, data);
 
   fileSetPos(fileID, currentfilepos, SEEK_SET);
 
@@ -1076,7 +1076,7 @@ iegWriteVarSliceDP(stream_t *streamptr, int varID, int levID, const double *data
   size_t gridsize = gridInqSize(gridID);
   iegp->refval = calc_refvalDP(gridsize, data);
 
-  iegDefDataDP(iegp, data);
+  iegDefDataFP64(iegp, data);
   iegWrite(fileID, iegp);
 }
 
diff --git a/src/stream_srv.c b/src/stream_srv.c
index 888959dab..67c3795ba 100644
--- a/src/stream_srv.c
+++ b/src/stream_srv.c
@@ -20,7 +20,7 @@
 static int
 srvInqDatatype(int prec)
 {
-  return (prec == EXSE_DOUBLE_PRECISION) ? CDI_DATATYPE_FLT64 : CDI_DATATYPE_FLT32;
+  return (prec == EXSE_PREC_FP64) ? CDI_DATATYPE_FLT64 : CDI_DATATYPE_FLT32;
 }
 
 static int
@@ -31,7 +31,7 @@ srvDefDatatype(int datatype)
 
   if (datatype != CDI_DATATYPE_FLT32 && datatype != CDI_DATATYPE_FLT64) datatype = CDI_DATATYPE_FLT32;
 
-  return (datatype == CDI_DATATYPE_FLT64) ? EXSE_DOUBLE_PRECISION : EXSE_SINGLE_PRECISION;
+  return (datatype == CDI_DATATYPE_FLT64) ? EXSE_PREC_FP64 : EXSE_PREC_FP32;
 }
 
 /* not used
@@ -90,7 +90,7 @@ srv_read_recordSP(stream_t *streamptr, float *data, size_t *numMissVals)
 
   int header[8];
   srvInqHeader(srvp, header);
-  srvInqDataSP(srvp, data);
+  srvInqDataFP32(srvp, data);
 
   double missval = vlistInqVarMissval(vlistID, varID);
   size_t size = gridInqSize(vlistInqVarGrid(vlistID, varID));
@@ -119,7 +119,7 @@ srv_read_recordDP(stream_t *streamptr, double *data, size_t *numMissVals)
 
   int header[8];
   srvInqHeader(srvp, header);
-  srvInqDataDP(srvp, data);
+  srvInqDataFP64(srvp, data);
 
   double missval = vlistInqVarMissval(vlistID, varID);
   size_t size = gridInqSize(vlistInqVarGrid(vlistID, varID));
@@ -185,7 +185,7 @@ static void
 srv_write_recordSP(stream_t *streamptr, const float *data)
 {
   void *srvp = streamptr->record->objectp;
-  srvDefDataSP(srvp, data);
+  srvDefDataFP32(srvp, data);
   srvWrite(streamptr->fileID, srvp);
 }
 
@@ -193,7 +193,7 @@ static void
 srv_write_recordDP(stream_t *streamptr, const double *data)
 {
   void *srvp = streamptr->record->objectp;
-  srvDefDataDP(srvp, data);
+  srvDefDataFP64(srvp, data);
   srvWrite(streamptr->fileID, srvp);
 }
 
@@ -579,7 +579,7 @@ srvReadVarSliceDP(stream_t *streamptr, int varID, int levID, double *data, size_
 
   int header[8];
   srvInqHeader(srvp, header);
-  srvInqDataDP(srvp, data);
+  srvInqDataFP64(srvp, data);
 
   fileSetPos(fileID, currentfilepos, SEEK_SET);
 
@@ -645,7 +645,7 @@ srvWriteVarSliceDP(stream_t *streamptr, int varID, int levID, const double *data
   srvp->dprec = srvDefDatatype(datatype);
 
   srvDefHeader(srvp, header);
-  srvDefDataDP(srvp, data);
+  srvDefDataFP64(srvp, data);
   srvWrite(fileID, srvp);
 }
 
-- 
GitLab