Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package libmseed for openSUSE:Factory 
checked in at 2026-01-03 17:26:35
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/libmseed (Old)
 and      /work/SRC/openSUSE:Factory/.libmseed.new.1928 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "libmseed"

Sat Jan  3 17:26:35 2026 rev:11 rq:1325096 version:3.2.3

Changes:
--------
--- /work/SRC/openSUSE:Factory/libmseed/libmseed.changes        2025-12-27 
13:22:21.835716450 +0100
+++ /work/SRC/openSUSE:Factory/.libmseed.new.1928/libmseed.changes      
2026-01-03 17:27:02.430806967 +0100
@@ -1,0 +2,8 @@
+Fri Jan  2 10:38:34 UTC 2026 - Andreas Stieger <[email protected]>
+
+- update to 3.2.3:
+  * Add mseh_get_ptr_type() to determine type of an extra header
+  * Add unsigned integer (uint64_t) support to mseh_set_ptr_r() and
+    mseh_get_ptr_r()
+
+-------------------------------------------------------------------

Old:
----
  libmseed-3.2.2.tar.gz

New:
----
  libmseed-3.2.3.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ libmseed.spec ++++++
--- /var/tmp/diff_new_pack.PW7Q7G/_old  2026-01-03 17:27:03.254840757 +0100
+++ /var/tmp/diff_new_pack.PW7Q7G/_new  2026-01-03 17:27:03.258840921 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package libmseed
 #
-# Copyright (c) 2025 Andreas Stieger <[email protected]>
+# Copyright (c) 2026 Andreas Stieger <[email protected]>
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -18,7 +18,7 @@
 
 %define sover 3
 Name:           libmseed
-Version:        3.2.2
+Version:        3.2.3
 Release:        0
 Summary:        MiniSEED data format library
 License:        Apache-2.0

++++++ libmseed-3.2.2.tar.gz -> libmseed-3.2.3.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libmseed-3.2.2/ChangeLog new/libmseed-3.2.3/ChangeLog
--- old/libmseed-3.2.2/ChangeLog        2025-12-26 20:21:02.000000000 +0100
+++ new/libmseed-3.2.3/ChangeLog        2026-01-01 23:33:34.000000000 +0100
@@ -1,3 +1,7 @@
+2026.001: v3.2.3
+  - Add mseh_get_ptr_type() to determine type of an extra header.
+  - Add unsigned integer (uint64_t) support to `mseh_set_ptr_r()` and 
`mseh_get_ptr_r()`.
+
 2025.369: v3.2.2
   - Allow mseh_set_ptr_r() to create extra headers when none exist for a merge 
patch
   using the root pointer ("").  Pointers to non-root locations still must 
exist.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libmseed-3.2.2/extraheaders.c 
new/libmseed-3.2.3/extraheaders.c
--- old/libmseed-3.2.2/extraheaders.c   2025-12-26 20:21:02.000000000 +0100
+++ new/libmseed-3.2.3/extraheaders.c   2026-01-01 23:33:34.000000000 +0100
@@ -112,18 +112,11 @@
 }
 
 /** ************************************************************************
- * @brief Search for and return an extra header value.
+ * @brief Search for and return the type of an extra header value.
  *
  * The extra header value is specified as a JSON Pointer (RFC 6901), e.g.
  * \c '/objectA/objectB/header'.
  *
- * This routine can get used to test for the existence of a value
- * without returning the value by setting @p value to NULL.
- *
- * If the target item is found (and @p value parameter is set) the
- * value will be copied into the memory specified by @p value.  The
- * @p type value specifies the data type expected.
- *
  * If a @p parsestate pointer is supplied, the parsed (deserialized) JSON
  * data are stored here.  This value may be used in subsequent calls to
  * avoid re-parsing the JSON.  The data must be freed with
@@ -132,20 +125,16 @@
  *
  * @param[in] msr Parsed miniSEED record to search
  * @param[in] ptr Header value desired, as JSON Pointer
- * @param[out] value Buffer for value, of type @p type
- * @param[in] type Type of value expected, one of:
- * @parblock
- * - @c 'n' - @p value is type @c double
- * - @c 'i' - @p value is type @c int64_t
- * - @c 's' - @p value is type @c char* (maximum length is: @c maxlength - 1)
- * - @c 'b' - @p value of type @c int (boolean value of 0 or 1)
- * @endparblock
- * @param[in] maxlength Maximum length of string value
  * @param[in] parsestate Parsed state for multiple operations, can be NULL
  *
- * @retval 0 on success
- * @retval 1 when the value was not found
- * @retval 2 when the value is of a different type
+ * @retval 'u' (decimal 117) - value is an unsigned integer number, @c uint64_t
+ * @retval 'i' (decimal 105) - value is an integer number, @c int64_t
+ * @retval 'n' (decimal 110) - value is a real number, @c double
+ * @retval 's' (decimal 115) - value is a string, @c char*
+ * @retval 'b' (decimal 98) - value is a boolean, @c int
+ * @retval 'o' (decimal 111) - value is an object
+ * @retval 'a' (decimal 97) - value is an array
+ * @retval 0 - when the value is not found
  * @returns A (negative) libmseed error code on error
  *
  * @ref MessageOnError - this function logs a message on error
@@ -153,16 +142,12 @@
  * @see mseh_free_parsestate()
  ***************************************************************************/
 int
-mseh_get_ptr_r (const MS3Record *msr, const char *ptr, void *value, char type, 
uint32_t maxlength,
-                LM_PARSED_JSON **parsestate)
+mseh_get_ptr_type (const MS3Record *msr, const char *ptr, LM_PARSED_JSON 
**parsestate)
 {
   LM_PARSED_JSON *parsed = (parsestate) ? *parsestate : NULL;
-
-  yyjson_alc alc = {_priv_malloc, _priv_realloc, _priv_free, NULL};
   yyjson_val *extravalue = NULL;
-  const char *stringvalue = NULL;
-
-  int retval = 0;
+  yyjson_alc alc = {_priv_malloc, _priv_realloc, _priv_free, NULL};
+  char rettype = 0;
 
   if (!msr || !ptr)
   {
@@ -173,7 +158,7 @@
   /* Nothing can be found in no headers */
   if (!msr->extralength)
   {
-    return 1;
+    return 0;
   }
 
   if (!msr->extra)
@@ -182,10 +167,10 @@
     return MS_GENERROR;
   }
 
-  /* Detect invalid JSON Pointer, i.e. with no root '/' designation */
-  if (ptr[0] != '/')
+  /* Detect invalid JSON Pointer, i.e. with no root '/' designation and not "" 
(root object) */
+  if (ptr[0] != '/' && ptr[0] != '\0')
   {
-    ms_log (2, "%s() Unsupported ptr notation: %s\n", __func__, ptr);
+    ms_log (2, "%s() Unsupported JSON Pointer notation: %s\n", __func__, ptr);
     return MS_GENERROR;
   }
 
@@ -228,18 +213,157 @@
 
   if (extravalue == NULL)
   {
-    retval = 1;
+    rettype = 0;
   }
-  else if (type == 'n' && yyjson_is_num (extravalue))
+  /* Integer type detections before the generic number check */
+  else if (yyjson_is_uint (extravalue))
+  {
+    rettype = 'u';
+  }
+  else if (yyjson_is_int (extravalue))
+  {
+    rettype = 'i';
+  }
+  else if (yyjson_is_num (extravalue))
+  {
+    rettype = 'n';
+  }
+  else if (yyjson_is_str (extravalue))
+  {
+    rettype = 's';
+  }
+  else if (yyjson_is_bool (extravalue))
+  {
+    rettype = 'b';
+  }
+  else if (yyjson_is_obj (extravalue))
+  {
+    rettype = 'o';
+  }
+  else if (yyjson_is_arr (extravalue))
+  {
+    rettype = 'a';
+  }
+
+  /* Free parse state if not being retained */
+  if (parsestate == NULL)
+  {
+    mseh_free_parsestate (&parsed);
+  }
+
+  return rettype;
+}
+
+/** ************************************************************************
+ * @brief Search for and return an extra header value.
+ *
+ * The extra header value is specified as a JSON Pointer (RFC 6901), e.g.
+ * \c '/objectA/objectB/header'.
+ *
+ * This routine can get used to test for the existence of a value
+ * without returning the value by setting @p value to NULL.
+ *
+ * If the target item is found (and @p value parameter is set) the
+ * value will be copied into the memory specified by @p value.  The
+ * @p type value specifies the data type expected.
+ *
+ * If a @p parsestate pointer is supplied, the parsed (deserialized) JSON
+ * data are stored here.  This value may be used in subsequent calls to
+ * avoid re-parsing the JSON.  The data must be freed with
+ * mseh_free_parsestate() when done reading the JSON.  If this value
+ * is NULL the parse state will be created and destroyed on each call.
+ *
+ * @param[in] msr Parsed miniSEED record to search
+ * @param[in] ptr Header value desired, as JSON Pointer
+ * @param[out] value Buffer for value, of type @p type
+ * @param[in] type Type of value expected, one of:
+ * @parblock
+ * - @c 'u' - @p value is type @c uint64_t
+ * - @c 'i' - @p value is type @c int64_t
+ * - @c 'n' - @p value is type @c double
+ * - @c 's' - @p value is type @c char* (maximum length is: @c maxlength - 1)
+ * - @c 'b' - @p value of type @c int (boolean value of 0 or 1)
+ * @endparblock
+ * @param[in] maxlength Maximum length of string value
+ * @param[in] parsestate Parsed state for multiple operations, can be NULL
+ *
+ * @retval 0 on success
+ * @retval 1 when the value was not found
+ * @retval 2 when the value is of a different type
+ * @returns A (negative) libmseed error code on error
+ *
+ * @ref MessageOnError - this function logs a message on error
+ *
+ * @see mseh_free_parsestate()
+ ***************************************************************************/
+int
+mseh_get_ptr_r (const MS3Record *msr, const char *ptr, void *value, char type, 
uint32_t maxlength,
+                LM_PARSED_JSON **parsestate)
+{
+  LM_PARSED_JSON *parsed = NULL;
+  yyjson_val *extravalue = NULL;
+  const char *stringvalue = NULL;
+
+  int retval = 0;
+  int detected_type;
+
+  if (!msr || !ptr)
+  {
+    ms_log (2, "%s() Required input not defined: 'msr' or 'ptr'\n", __func__);
+    return MS_GENERROR;
+  }
+
+  /* Nothing can be found in no headers */
+  if (!msr->extralength)
+  {
+    return 1;
+  }
+
+  if (!msr->extra)
+  {
+    ms_log (2, "%s() Expected extra headers (msr->extra) are not present\n", 
__func__);
+    return MS_GENERROR;
+  }
+
+  /* Check for existing value at JSON Pointer */
+  detected_type = mseh_get_ptr_type (msr, ptr, (parsestate) ? parsestate : 
&parsed);
+
+  /* Set parsed state pointer if supplied and populated by mseh_get_ptr_type() 
*/
+  if (parsestate != NULL)
+  {
+    parsed = *parsestate;
+  }
+
+  /* Return error or not found indicator if type is not detected */
+  if (detected_type <= 0)
+  {
+    /* Free parse state if not being retained */
+    if (parsestate == NULL)
+    {
+      mseh_free_parsestate (&parsed);
+    }
+
+    return (detected_type == 0) ? 1 : detected_type;
+  }
+
+  /* Get target value */
+  extravalue = yyjson_doc_ptr_get (parsed->doc, ptr);
+
+  if (type == 'u' && yyjson_is_uint (extravalue))
   {
     if (value)
-      *((double *)value) = unsafe_yyjson_get_num (extravalue);
+      *((uint64_t *)value) = unsafe_yyjson_get_uint (extravalue);
   }
   else if (type == 'i' && yyjson_is_int (extravalue))
   {
     if (value)
       *((int64_t *)value) = unsafe_yyjson_get_int (extravalue);
   }
+  else if (type == 'n' && yyjson_is_num (extravalue))
+  {
+    if (value)
+      *((double *)value) = unsafe_yyjson_get_num (extravalue);
+  }
   else if (type == 's' && yyjson_is_str (extravalue))
   {
     if (value)
@@ -298,8 +422,9 @@
  * @param[in] value Buffer for value, of type @p type
  * @param[in] type Type of value expected, one of:
  * @parblock
- * - @c 'n' - @p value is type @c double
+ * - @c 'u' - @p value is type @c uint64_t
  * - @c 'i' - @p value is type @c int64_t
+ * - @c 'n' - @p value is type @c double
  * - @c 's' - @p value is type @c char*
  * - @c 'b' - @p value is type @c int (boolean value of 0 or 1)
  * - @c 'M' - @p value is type @c char* and a Merge Patch to apply at @p ptr
@@ -337,7 +462,7 @@
   }
 
   /* Detect invalid JSON Pointer, i.e. with no root '/' designation */
-  if (ptr[0] != '/' && type != 'M')
+  if (ptr[0] != '/' && ptr[0] != '\0' && type != 'M')
   {
     ms_log (2, "%s() Unsupported JSON Pointer notation: %s\n", __func__, ptr);
     return MS_GENERROR;
@@ -396,14 +521,18 @@
   /* Set (or replace) header value at ptr */
   switch (type)
   {
-  case 'n':
+  case 'u':
     rv = yyjson_mut_doc_ptr_set (parsed->mut_doc, ptr,
-                                 yyjson_mut_real (parsed->mut_doc, *((double 
*)value)));
+                                 yyjson_mut_uint (parsed->mut_doc, *((uint64_t 
*)value)));
     break;
   case 'i':
     rv = yyjson_mut_doc_ptr_set (parsed->mut_doc, ptr,
                                  yyjson_mut_sint (parsed->mut_doc, *((int64_t 
*)value)));
     break;
+  case 'n':
+    rv = yyjson_mut_doc_ptr_set (parsed->mut_doc, ptr,
+                                 yyjson_mut_real (parsed->mut_doc, *((double 
*)value)));
+    break;
   case 's':
     rv = yyjson_mut_doc_ptr_set (parsed->mut_doc, ptr,
                                  yyjson_mut_strcpy (parsed->mut_doc, (const 
char *)value));
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libmseed-3.2.2/libmseed.def 
new/libmseed-3.2.3/libmseed.def
--- old/libmseed-3.2.2/libmseed.def     2025-12-26 20:21:02.000000000 +0100
+++ new/libmseed-3.2.3/libmseed.def     2026-01-01 23:33:34.000000000 +0100
@@ -82,6 +82,7 @@
    ms_strncpclean
    ms_strncpcleantail
    ms_strncpopen
+   mseh_get_ptr_type
    mseh_get_ptr_r
    mseh_set_ptr_r
    mseh_add_event_detection_r
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libmseed-3.2.2/libmseed.h 
new/libmseed-3.2.3/libmseed.h
--- old/libmseed-3.2.2/libmseed.h       2025-12-26 20:21:02.000000000 +0100
+++ new/libmseed-3.2.3/libmseed.h       2026-01-01 23:33:34.000000000 +0100
@@ -29,8 +29,8 @@
 {
 #endif
 
-#define LIBMSEED_VERSION "3.2.2"    //!< Library version
-#define LIBMSEED_RELEASE "2025.360" //!< Library release date
+#define LIBMSEED_VERSION "3.2.3"    //!< Library version
+#define LIBMSEED_RELEASE "2026.001" //!< Library release date
 
 /** @defgroup io-functions File and URL I/O */
 /** @defgroup miniseed-record Record Handling */
@@ -1001,19 +1001,25 @@
  */
 typedef struct LM_PARSED_JSON_s LM_PARSED_JSON;
 
+extern int mseh_get_ptr_type (const MS3Record *msr, const char *ptr, 
LM_PARSED_JSON **parsestate);
+
 /** @def mseh_get
     @brief A simple wrapper to access any type of extra header */
 #define mseh_get(msr, ptr, valueptr, type, maxlength)                          
                    \
   mseh_get_ptr_r (msr, ptr, valueptr, type, maxlength, NULL)
 
-/** @def mseh_get_number
-    @brief A simple wrapper to access a number type extra header */
-#define mseh_get_number(msr, ptr, valueptr) mseh_get_ptr_r (msr, ptr, 
valueptr, 'n', 0, NULL)
+/** @def mseh_get_uint64
+    @brief A simple wrapper to access an unsigned integer type extra header */
+#define mseh_get_uint64(msr, ptr, valueptr) mseh_get_ptr_r (msr, ptr, 
valueptr, 'u', 0, NULL)
 
 /** @def mseh_get_int64
-    @brief A simple wrapper to access a number type extra header */
+        @brief A simple wrapper to access an integer type extra header */
 #define mseh_get_int64(msr, ptr, valueptr) mseh_get_ptr_r (msr, ptr, valueptr, 
'i', 0, NULL)
 
+/** @def mseh_get_number
+    @brief A simple wrapper to access a number type extra header */
+#define mseh_get_number(msr, ptr, valueptr) mseh_get_ptr_r (msr, ptr, 
valueptr, 'n', 0, NULL)
+
 /** @def mseh_get_string
     @brief A simple wrapper to access a string type extra header */
 #define mseh_get_string(msr, ptr, buffer, maxlength)                           
                    \
@@ -1034,14 +1040,18 @@
     @brief A simple wrapper to set any type of extra header */
 #define mseh_set(msr, ptr, valueptr, type) mseh_set_ptr_r (msr, ptr, valueptr, 
type, NULL)
 
-/** @def mseh_set_number
-    @brief A simple wrapper to set a number type extra header */
-#define mseh_set_number(msr, ptr, valueptr) mseh_set_ptr_r (msr, ptr, 
valueptr, 'n', NULL)
+/** @def mseh_set_uint64
+    @brief A simple wrapper to set an unsigned integer type extra header */
+#define mseh_set_uint64(msr, ptr, valueptr) mseh_set_ptr_r (msr, ptr, 
valueptr, 'u', NULL)
 
 /** @def mseh_set_int64
     @brief A simple wrapper to set a number type extra header */
 #define mseh_set_int64(msr, ptr, valueptr) mseh_set_ptr_r (msr, ptr, valueptr, 
'i', NULL)
 
+/** @def mseh_set_number
+    @brief A simple wrapper to set a number type extra header */
+#define mseh_set_number(msr, ptr, valueptr) mseh_set_ptr_r (msr, ptr, 
valueptr, 'n', NULL)
+
 /** @def mseh_set_string
     @brief A simple wrapper to set a string type extra header */
 #define mseh_set_string(msr, ptr, valueptr) mseh_set_ptr_r (msr, ptr, 
valueptr, 's', NULL)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libmseed-3.2.2/test/test-extraheaders.c 
new/libmseed-3.2.3/test/test-extraheaders.c
--- old/libmseed-3.2.2/test/test-extraheaders.c 2025-12-26 20:21:02.000000000 
+0100
+++ new/libmseed-3.2.3/test/test-extraheaders.c 2026-01-01 23:33:34.000000000 
+0100
@@ -8,7 +8,8 @@
   \"FDSN\": {\
     \"Time\": {\
       \"Quality\": 100,\
-      \"Correction\": 1.234\
+      \"Correction\": 1.234,\
+      \"LeapSecond\": -1\
     },\
     \"Event\": { \
       \"Begin\": true,\
@@ -33,20 +34,25 @@
   }\
 }";
 
-TEST (extraheaders, get_set)
+TEST (extraheaders, get_set_ptr_r)
 {
   MS3Record *msr = NULL;
+  uint64_t getuint;
   int64_t getint;
   double getnum;
   char getstr[100];
   int getbool;
   int rv;
 
+  uint64_t setuint;
   int64_t setint;
   double setnum;
   char *setstr;
   int setbool;
 
+  /* Suppress error and warning messages by accumulating them */
+  ms_rloginit (NULL, NULL, NULL, NULL, 10);
+
   msr = msr3_init (msr);
   REQUIRE (msr != NULL, "msr3_init() returned unexpected NULL");
 
@@ -62,14 +68,18 @@
   rv = mseh_exists (msr, "/FDSN/Event/Detection/0");
   CHECK (rv, "mseh_exists() returned unexpected false for array element");
 
-  rv = mseh_get_number (msr, "/FDSN/Time/Correction", &getnum);
-  CHECK (rv == 0, "mseh_get_number() returned unexpected non-match");
-  CHECK (getnum == 1.234, "/FDSN/Time/Correction is not expected 1.234");
+  rv = mseh_get_uint64 (msr, "/FDSN/Time/Quality", &getuint);
+  CHECK (rv == 0, "mseh_get_uint64() returned unexpected non-match");
+  CHECK (getuint == 100, "/FDSN/Time/Quality is not expected 100");
 
   rv = mseh_get_int64 (msr, "/FDSN/Time/Quality", &getint);
   CHECK (rv == 0, "mseh_get_int64() returned unexpected non-match");
   CHECK (getint == 100, "/FDSN/Time/Quality is not expected 100");
 
+  rv = mseh_get_number (msr, "/FDSN/Time/Correction", &getnum);
+  CHECK (rv == 0, "mseh_get_number() returned unexpected non-match");
+  CHECK (getnum == 1.234, "/FDSN/Time/Correction is not expected 1.234");
+
   /* Key in first (0th) object of /FDSN/Event/Detection array */
   rv = mseh_get_string (msr, "/FDSN/Event/Detection/0/Type", getstr, 
sizeof(getstr));
   CHECK (rv == 0, "mseh_get_string() returned unexpected non-match");
@@ -87,15 +97,15 @@
   CHECK (rv != 0, "mseh_get_int64() returned unexpected match");
 
   /* Set and get */
-  setnum = 3.14159;
-  rv = mseh_set_number (msr, "/New/Number", &setnum);
-  CHECK (rv == 0, "mseh_set_num() returned unexpected error");
+  setuint = 18446744073709551615ULL;
+  rv = mseh_set_uint64 (msr, "/New/UnsignedInteger", &setuint);
+  CHECK (rv == 0, "mseh_set_uint64() returned unexpected error");
+
+  rv = mseh_get_uint64 (msr, "/New/UnsignedInteger", &getuint);
+  CHECK (rv == 0, "mseh_get_uint64() returned unexpected non-match");
+  CHECK (getuint == setuint);
 
-  rv = mseh_get_number (msr, "/New/Number", &getnum);
-  CHECK (rv == 0, "mseh_get_num() returned unexpected non-match");
-  CHECK (getnum == setnum);
-
-  setint = 51204;
+  setint = -51204;
   rv = mseh_set_int64 (msr, "/New/Integer", &setint);
   CHECK (rv == 0, "mseh_set_int64() returned unexpected error");
 
@@ -103,6 +113,14 @@
   CHECK (rv == 0, "mseh_get_int64() returned unexpected non-match");
   CHECK (getint == setint);
 
+  setnum = 3.14159;
+  rv = mseh_set_number (msr, "/New/Number", &setnum);
+  CHECK (rv == 0, "mseh_set_num() returned unexpected error");
+
+  rv = mseh_get_number (msr, "/New/Number", &getnum);
+  CHECK (rv == 0, "mseh_get_num() returned unexpected non-match");
+  CHECK (getnum == setnum);
+
   setstr = "Value";
   rv = mseh_set_string (msr, "/New/String", setstr);
   CHECK (rv == 0, "mseh_set_string() returned unexpected error");
@@ -119,6 +137,73 @@
   CHECK (rv == 0, "mseh_get_boolean() returned unexpected non-match");
   CHECK (getbool == setbool);
 
+  /* Invalid JSON Pointer */
+  rv = mseh_get_ptr_r (msr, "invalid", NULL, 0, 0, NULL);
+  CHECK (rv < 0, "mseh_get_ptr_type() returned unexpected match");
+
+  rv = mseh_set_ptr_r (msr, "invalid", &setuint, 'u', NULL);
+  CHECK (rv < 0, "mseh_set_uint64() returned unexpected match");
+
+  msr3_free (&msr);
+}
+
+TEST (extraheaders, get_ptr_type)
+{
+  MS3Record *msr = NULL;
+  int rv;
+
+  /* Suppress error and warning messages by accumulating them */
+  ms_rloginit (NULL, NULL, NULL, NULL, 10);
+
+  msr = msr3_init (msr);
+  REQUIRE (msr != NULL, "msr3_init() returned unexpected NULL");
+
+  msr->extralength = strlen (testheaders);
+  msr->extra = malloc (msr->extralength);
+  REQUIRE (msr->extra != NULL, "Error allocating memory for msr->extra");
+  memcpy (msr->extra, testheaders, msr->extralength);
+
+  /* Existing headers */
+
+  /* Unsigned integer */
+  rv = mseh_get_ptr_type (msr, "/FDSN/Time/Quality", NULL);
+  CHECK (rv == 'u', "mseh_get_ptr_type() returned unexpected type");
+
+  /* Integer */
+  rv = mseh_get_ptr_type (msr, "/FDSN/Time/LeapSecond", NULL);
+  CHECK (rv == 'i', "mseh_get_ptr_type() returned unexpected type");
+
+  /* Number */
+  rv = mseh_get_ptr_type (msr, "/FDSN/Time/Correction", NULL);
+  CHECK (rv == 'n', "mseh_get_ptr_type() returned unexpected type");
+
+  /* String, key in first (0th) object of /FDSN/Event/Detection array */
+  rv = mseh_get_ptr_type (msr, "/FDSN/Event/Detection/0/Type", NULL);
+  CHECK (rv == 's', "mseh_get_ptr_type() returned unexpected type");
+
+  rv = mseh_get_ptr_type (msr, "/FDSN/Event/Begin", NULL);
+  CHECK (rv == 'b', "mseh_get_ptr_type() returned unexpected type");
+
+  /* Array */
+  rv = mseh_get_ptr_type (msr, "/FDSN/Event/Detection", NULL);
+  CHECK (rv == 'a', "mseh_get_ptr_type() returned unexpected type");
+
+  /* Object */
+  rv = mseh_get_ptr_type (msr, "/FDSN/Event", NULL);
+  CHECK (rv == 'o', "mseh_get_ptr_type() returned unexpected type");
+
+  /* Root object */
+  rv = mseh_get_ptr_type (msr, "", NULL);
+  CHECK (rv == 'o', "mseh_get_ptr_type() returned unexpected type");
+
+  /* Non-existent header */
+  rv = mseh_get_ptr_type (msr, "/FDSN/Non/Existant/Header", NULL);
+  CHECK (rv == 0, "mseh_get_ptr_type() returned unexpected type");
+
+  /* Invalid JSON Pointer */
+  rv = mseh_get_ptr_type (msr, "invalid", NULL);
+  CHECK (rv < 0, "mseh_get_ptr_type() returned unexpected match");
+
   msr3_free (&msr);
 }
 

Reply via email to