<p>pespin <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-pcu/+/25827">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  laforge: Looks good to me, but someone else must approve
  fixeria: Looks good to me, but someone else must approve
  pespin: Looks good to me, approved; Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Split csn1.c into common, enc and dec files<br><br>The CSN1 encoder/decoder code is already lengthy and complex enough,<br>there's no need to keep it in the same file, specially because when<br>debugging, only is interested in one of the 2 functions, and they both<br>look really similar (long spaghetti switches).<br><br>Change-Id: I7d1b1f7e6d7f89b052b3fd73a960419bb2673020<br>---<br>M debian/copyright<br>M src/Makefile.am<br>M src/csn1.c<br>M src/csn1.h<br>A src/csn1_dec.c<br>A src/csn1_enc.c<br>6 files changed, 2,718 insertions(+), 2,627 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/debian/copyright b/debian/copyright</span><br><span>index 99ea408..4e9347e 100644</span><br><span>--- a/debian/copyright</span><br><span>+++ b/debian/copyright</span><br><span>@@ -81,7 +81,9 @@</span><br><span> License:   GPL-2.0+</span><br><span> </span><br><span> Files:     src/csn1.h</span><br><span style="color: hsl(0, 100%, 40%);">-           src/csn1.cpp</span><br><span style="color: hsl(120, 100%, 40%);">+           src/csn1.c</span><br><span style="color: hsl(120, 100%, 40%);">+           src/csn1_dec.c</span><br><span style="color: hsl(120, 100%, 40%);">+           src/csn1_enc.c</span><br><span>            src/gsm_rlcmac.cpp</span><br><span>            src/gsm_rlcmac.h</span><br><span> Copyright: 2011 Vincent Helfre</span><br><span>diff --git a/src/Makefile.am b/src/Makefile.am</span><br><span>index 08b3309..25fdab2 100644</span><br><span>--- a/src/Makefile.am</span><br><span>+++ b/src/Makefile.am</span><br><span>@@ -41,6 +41,8 @@</span><br><span> libgprs_la_SOURCES = \</span><br><span>        gprs_debug.cpp \</span><br><span>     csn1.c \</span><br><span style="color: hsl(120, 100%, 40%);">+      csn1_dec.c \</span><br><span style="color: hsl(120, 100%, 40%);">+  csn1_enc.c \</span><br><span>         gsm_rlcmac.c \</span><br><span>       gprs_bssgp_pcu.c \</span><br><span>   gprs_bssgp_rim.c \</span><br><span>diff --git a/src/csn1.c b/src/csn1.c</span><br><span>index 2be0392..e165e92 100644</span><br><span>--- a/src/csn1.c</span><br><span>+++ b/src/csn1.c</span><br><span>@@ -1,4 +1,4 @@</span><br><span style="color: hsl(0, 100%, 40%);">-/* csn1.cpp</span><br><span style="color: hsl(120, 100%, 40%);">+/* csn1_enc.c</span><br><span>  * Routines for CSN1 dissection in wireshark.</span><br><span>  *</span><br><span>  * Copyright (C) 2011 Ivan Klyuchnikov</span><br><span>@@ -38,20 +38,10 @@</span><br><span> #include <osmocom/core/logging.h></span><br><span> #include <osmocom/core/utils.h></span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define pvDATA(_pv, _offset) ((void*) ((unsigned char*)_pv + _offset))</span><br><span style="color: hsl(0, 100%, 40%);">-#define pui8DATA(_pv, _offset) ((guint8*) pvDATA(_pv, _offset))</span><br><span style="color: hsl(0, 100%, 40%);">-#define pui16DATA(_pv, _offset) ((guint16*) pvDATA(_pv, _offset))</span><br><span style="color: hsl(0, 100%, 40%);">-#define pui32DATA(_pv, _offset) ((guint32*) pvDATA(_pv, _offset))</span><br><span style="color: hsl(0, 100%, 40%);">-#define pui64DATA(_pv, _offset) ((guint64*) pvDATA(_pv, _offset))</span><br><span style="color: hsl(0, 100%, 40%);">-/* used to tag existence of next element in variable length lists */</span><br><span style="color: hsl(0, 100%, 40%);">-#define STANDARD_TAG 1</span><br><span style="color: hsl(0, 100%, 40%);">-#define REVERSED_TAG 0</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static const unsigned char ixBitsTab[] = {0, 1, 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+const unsigned char ixBitsTab[] = {0, 1, 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5};</span><br><span> </span><br><span> /* Returns no_of_bits (up to 8) masked with 0x2B */</span><br><span style="color: hsl(0, 100%, 40%);">-static guint8</span><br><span style="color: hsl(120, 100%, 40%);">+guint8</span><br><span> get_masked_bits8(struct bitvec *vector, unsigned *readIndex, gint bit_offset,  const gint no_of_bits)</span><br><span> {</span><br><span>   static const guint8 maskBits[] = {0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF};</span><br><span>@@ -105,7 +95,7 @@</span><br><span> };</span><br><span> </span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static gint16 ProcessError_impl(const char *file, int line, unsigned *readIndex,</span><br><span style="color: hsl(120, 100%, 40%);">+gint16 ProcessError_impl(const char *file, int line, unsigned *readIndex,</span><br><span>                                 const char* sz, gint16 err, const CSN_DESCR* pDescr)</span><br><span> {</span><br><span>   /* Don't add trailing newline, top caller is responsible for appending it */</span><br><span>@@ -115,2615 +105,3 @@</span><br><span>             pDescr ? pDescr->sz : "-", *readIndex);</span><br><span>   return err;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#define ProcessError(readIndex, sz, err, pDescr) \</span><br><span style="color: hsl(0, 100%, 40%);">-        ProcessError_impl(__FILE__, __LINE__, readIndex, sz, err, pDescr)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/**</span><br><span style="color: hsl(0, 100%, 40%);">- * ================================================================================================</span><br><span style="color: hsl(0, 100%, 40%);">- * Return TRUE if tag in bit stream indicates existence of next list element,</span><br><span style="color: hsl(0, 100%, 40%);">- * otherwise return FALSE.</span><br><span style="color: hsl(0, 100%, 40%);">- * Will work for tag values equal to both 0 and 1.</span><br><span style="color: hsl(0, 100%, 40%);">- * ================================================================================================</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static gboolean</span><br><span style="color: hsl(0, 100%, 40%);">-existNextElement(struct bitvec *vector, unsigned *readIndex, guint8 Tag)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  int res = bitvec_get_bit_pos(vector, (*readIndex)++);</span><br><span style="color: hsl(0, 100%, 40%);">-  if (Tag == STANDARD_TAG)</span><br><span style="color: hsl(0, 100%, 40%);">-  {</span><br><span style="color: hsl(0, 100%, 40%);">-    return (res > 0);</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-  return (res == 0);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-gint16</span><br><span style="color: hsl(0, 100%, 40%);">-csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, struct bitvec *vector, unsigned *readIndex, void* data)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  gint  remaining_bits_len = ar->remaining_bits_len;</span><br><span style="color: hsl(0, 100%, 40%);">-  gint  bit_offset         = ar->bit_offset;</span><br><span style="color: hsl(0, 100%, 40%);">-  guint8*  pui8 = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-  guint16* pui16;</span><br><span style="color: hsl(0, 100%, 40%);">-  guint32* pui32;</span><br><span style="color: hsl(0, 100%, 40%);">-  guint64* pui64;</span><br><span style="color: hsl(0, 100%, 40%);">-  guint8 Tag = STANDARD_TAG;</span><br><span style="color: hsl(0, 100%, 40%);">-  unsigned ib;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  if (remaining_bits_len < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-  {</span><br><span style="color: hsl(0, 100%, 40%);">-    return ProcessError(readIndex, __func__, CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  do</span><br><span style="color: hsl(0, 100%, 40%);">-  {</span><br><span style="color: hsl(0, 100%, 40%);">-    switch (pDescr->type)</span><br><span style="color: hsl(0, 100%, 40%);">-    {</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_BIT:</span><br><span style="color: hsl(0, 100%, 40%);">-      {</span><br><span style="color: hsl(0, 100%, 40%);">-        if (remaining_bits_len > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          pui8  = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-        *pui8 = bitvec_read_field(vector, readIndex, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-          LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-          /* end add the bit value to protocol tree */</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-        else if (pDescr->may_be_null)</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-           pui8  = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-           *pui8 = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-           LOGPC(DCSN1, LOGL_DEBUG, "%s = NULL | ", pDescr->sz);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-        else</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        remaining_bits_len--;</span><br><span style="color: hsl(0, 100%, 40%);">-        bit_offset++;</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_NULL:</span><br><span style="color: hsl(0, 100%, 40%);">-      { /* Empty member! */</span><br><span style="color: hsl(0, 100%, 40%);">-        bit_offset += pDescr->i;</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_UINT:</span><br><span style="color: hsl(0, 100%, 40%);">-      {</span><br><span style="color: hsl(0, 100%, 40%);">-        guint8 no_of_bits = (guint8) pDescr->i;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (remaining_bits_len >= no_of_bits)</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          if (no_of_bits <= 8)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            guint8 ui8 = bitvec_read_field(vector, readIndex, no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-            pui8      = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-            *pui8     = ui8;</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-          else if (no_of_bits <= 16)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-         guint16 ui16 = bitvec_read_field(vector, readIndex, no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-            pui16       = pui16DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-            *pui16      = ui16;</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , *pui16);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-          else if (no_of_bits <= 32)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-          guint32 ui32 = bitvec_read_field(vector, readIndex, no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-            pui32       = pui32DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-            *pui32      = ui32;</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGPC(DCSN1, LOGL_DEBUG, "%s = 0x%08x | ", pDescr->sz , *pui32);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-          else</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_GENERAL, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-          remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-          bit_offset += no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-        else if (pDescr->may_be_null)</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          if (no_of_bits <= 8)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            pui8      = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-            *pui8     = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-          else if (no_of_bits <= 16)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            pui16      = pui16DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-            *pui16     = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-          else if (no_of_bits <= 32)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            pui32      = pui32DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-            *pui32     = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-          LOGPC(DCSN1, LOGL_DEBUG, "%s = NULL | ", pDescr->sz);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-        else</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_UINT_OFFSET:</span><br><span style="color: hsl(0, 100%, 40%);">-      {</span><br><span style="color: hsl(0, 100%, 40%);">-        guint8 no_of_bits = (guint8) pDescr->i;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (remaining_bits_len >= no_of_bits)</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          if (no_of_bits <= 8)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-          guint8 ui8 = bitvec_read_field(vector, readIndex, no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-            pui8      = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-            *pui8     = ui8 + (guint8)pDescr->descr.value;</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-          else if (no_of_bits <= 16)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-        guint16 ui16 = bitvec_read_field(vector, readIndex, no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-            pui16       = pui16DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-            *pui16      = ui16 + (guint16)pDescr->descr.value;</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , *pui16);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-          else if (no_of_bits <= 32)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-        guint32 ui32 = bitvec_read_field(vector, readIndex, no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-            pui32       = pui32DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-            *pui32      = ui32 + (guint16)pDescr->descr.value;</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , *pui32);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-          else</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_GENERAL, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-        else</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-        bit_offset += no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_UINT_LH:</span><br><span style="color: hsl(0, 100%, 40%);">-      {</span><br><span style="color: hsl(0, 100%, 40%);">-        guint8 no_of_bits = (guint8) pDescr->i;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (remaining_bits_len >= no_of_bits)</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          if (no_of_bits <= 8)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-     guint8 ui8 = get_masked_bits8(vector, readIndex, bit_offset, no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-            pui8      = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-            *pui8     = ui8;</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-          else</span><br><span style="color: hsl(0, 100%, 40%);">-          {/* Maybe we should support more than 8 bits ? */</span><br><span style="color: hsl(0, 100%, 40%);">-            return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_GENERAL, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-        else</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-        bit_offset += no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_UINT_ARRAY:</span><br><span style="color: hsl(0, 100%, 40%);">-      {</span><br><span style="color: hsl(0, 100%, 40%);">-        guint8  no_of_bits  = (guint8) pDescr->i;</span><br><span style="color: hsl(0, 100%, 40%);">-        guint16 nCount = (guint16)pDescr->descr.value; /* nCount supplied by value i.e. M_UINT_ARRAY(...) */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (pDescr->value != 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        { /* nCount specified by a reference to field holding value i.e. M_VAR_UINT_ARRAY(...) */</span><br><span style="color: hsl(0, 100%, 40%);">-          nCount = *pui16DATA(data, nCount);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (remaining_bits_len >= (no_of_bits * nCount))</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          remaining_bits_len -= (no_of_bits*nCount);</span><br><span style="color: hsl(0, 100%, 40%);">-          if (no_of_bits <= 8)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            pui8 = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-            do</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-          *pui8 = bitvec_read_field(vector, readIndex, no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-              LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-              pui8++;</span><br><span style="color: hsl(0, 100%, 40%);">-              bit_offset += no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-            } while (--nCount > 0);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-          else if (no_of_bits <= 16)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            return ProcessError(readIndex,"csnStreamDecoder NOTIMPLEMENTED", 999, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-          else if (no_of_bits <= 32)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            return ProcessError(readIndex,"csnStreamDecoder NOTIMPLEMENTED", 999, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-          else</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_GENERAL, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-        else</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_VARIABLE_TARRAY_OFFSET:</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_VARIABLE_TARRAY:</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_TYPE_ARRAY:</span><br><span style="color: hsl(0, 100%, 40%);">-      {</span><br><span style="color: hsl(0, 100%, 40%);">-        gint16      Status;</span><br><span style="color: hsl(0, 100%, 40%);">-        csnStream_t arT    = *ar;</span><br><span style="color: hsl(0, 100%, 40%);">-        gint16      nCount = pDescr->i;</span><br><span style="color: hsl(0, 100%, 40%);">-        guint16      nSize  = (guint16)(gint32)pDescr->value;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        pui8 = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-        if (pDescr->type == CSN_VARIABLE_TARRAY)</span><br><span style="color: hsl(0, 100%, 40%);">-        { /* Count specified in field */</span><br><span style="color: hsl(0, 100%, 40%);">-          nCount = *pui8DATA(data, pDescr->i);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-        else if (pDescr->type == CSN_VARIABLE_TARRAY_OFFSET)</span><br><span style="color: hsl(0, 100%, 40%);">-        { /* Count specified in field */</span><br><span style="color: hsl(0, 100%, 40%);">-          nCount = *pui8DATA(data, pDescr->i);</span><br><span style="color: hsl(0, 100%, 40%);">-    /*  nCount--; the 1 offset is already taken into account in CSN_UINT_OFFSET */</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        while (nCount > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        { /* resulting array of length 0 is possible</span><br><span style="color: hsl(0, 100%, 40%);">-           * but no bits shall be read from bitstream</span><br><span style="color: hsl(0, 100%, 40%);">-           */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          LOGPC(DCSN1, LOGL_DEBUG, "%s | ", pDescr->sz);</span><br><span style="color: hsl(0, 100%, 40%);">-          csnStreamInit(&arT, bit_offset, remaining_bits_len);</span><br><span style="color: hsl(0, 100%, 40%);">-       Status = csnStreamDecoder(&arT, (const CSN_DESCR*)pDescr->descr.ptr, vector, readIndex, pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-          if (Status >= 0)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            pui8    += nSize;</span><br><span style="color: hsl(0, 100%, 40%);">-            remaining_bits_len = arT.remaining_bits_len;</span><br><span style="color: hsl(0, 100%, 40%);">-            bit_offset         = arT.bit_offset;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-          else</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            return Status;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-          nCount--;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_BITMAP:</span><br><span style="color: hsl(0, 100%, 40%);">-      { /* bitmap with given length. The result is left aligned! */</span><br><span style="color: hsl(0, 100%, 40%);">-        guint8 no_of_bits = (guint8) pDescr->i; /* length of bitmap */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (no_of_bits > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          if (no_of_bits > remaining_bits_len)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            return ProcessError(readIndex, "csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          if (no_of_bits <= 32)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            for(ib = 0; ib < 4; ib++)</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-        guint8 ui8 = bitvec_read_field(vector, readIndex, 8);</span><br><span style="color: hsl(0, 100%, 40%);">-              pui8      = pui8DATA(data, pDescr->offset+ib);</span><br><span style="color: hsl(0, 100%, 40%);">-              *pui8      = ui8;</span><br><span style="color: hsl(0, 100%, 40%);">-               LOGPC(DCSN1, LOGL_DEBUG, "%s[%u] = %u | ", pDescr->sz , ib, (unsigned)*pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-          else if (no_of_bits <= 64)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            for(ib = 0; ib < 8; ib++)</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-             guint8 ui8 = bitvec_read_field(vector, readIndex, 8);</span><br><span style="color: hsl(0, 100%, 40%);">-              pui8      = pui8DATA(data, pDescr->offset+ib);</span><br><span style="color: hsl(0, 100%, 40%);">-              *pui8      = ui8;</span><br><span style="color: hsl(0, 100%, 40%);">-               LOGPC(DCSN1, LOGL_DEBUG, "%s[%u] = %u | ", pDescr->sz , ib, (unsigned)*pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-          else</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-             return ProcessError(readIndex,"csnStreamDecoder NOT IMPLEMENTED", 999, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-          bit_offset += no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-        /* bitmap was successfully extracted or it was empty */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_TYPE:</span><br><span style="color: hsl(0, 100%, 40%);">-      {</span><br><span style="color: hsl(0, 100%, 40%);">-        gint16      Status;</span><br><span style="color: hsl(0, 100%, 40%);">-        csnStream_t arT = *ar;</span><br><span style="color: hsl(0, 100%, 40%);">-        LOGPC(DCSN1, LOGL_DEBUG, " : %s | ", pDescr->sz);</span><br><span style="color: hsl(0, 100%, 40%);">-        csnStreamInit(&arT, bit_offset, remaining_bits_len);</span><br><span style="color: hsl(0, 100%, 40%);">-      Status = csnStreamDecoder(&arT, (const CSN_DESCR*)pDescr->descr.ptr, vector, readIndex, pvDATA(data, pDescr->offset));</span><br><span style="color: hsl(0, 100%, 40%);">-        LOGPC(DCSN1, LOGL_DEBUG, ": End %s | ", pDescr->sz);</span><br><span style="color: hsl(0, 100%, 40%);">-        if (Status >= 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          remaining_bits_len  = arT.remaining_bits_len;</span><br><span style="color: hsl(0, 100%, 40%);">-          bit_offset          = arT.bit_offset;</span><br><span style="color: hsl(0, 100%, 40%);">-          pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-        else</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          /* Has already been processed: ProcessError("csnStreamDecoder", Status, pDescr);  */</span><br><span style="color: hsl(0, 100%, 40%);">-          return Status;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_CHOICE:</span><br><span style="color: hsl(0, 100%, 40%);">-      {</span><br><span style="color: hsl(0, 100%, 40%);">-        gint16 count = pDescr->i;</span><br><span style="color: hsl(0, 100%, 40%);">-        guint8 i     = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-        CSN_ChoiceElement_t* pChoice = (CSN_ChoiceElement_t*) pDescr->descr.ptr;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* Make sure that the list of choice items is not empty */</span><br><span style="color: hsl(0, 100%, 40%);">-        if (!count)</span><br><span style="color: hsl(0, 100%, 40%);">-          return ProcessError(readIndex, "csnStreamDecoder", CSN_ERROR_IN_SCRIPT, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-        else if (count > 255) /* We can handle up to 256 (UCHAR_MAX) selectors */</span><br><span style="color: hsl(0, 100%, 40%);">-          return ProcessError(readIndex, "csnStreamDecoder", CSN_ERROR_IN_SCRIPT, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        while (count > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          guint8 no_of_bits = pChoice->bits;</span><br><span style="color: hsl(0, 100%, 40%);">-      guint8 value = bitvec_read_field(vector, readIndex, no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-          if (value == pChoice->value)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            CSN_DESCR   descr[2];</span><br><span style="color: hsl(0, 100%, 40%);">-            gint16      Status;</span><br><span style="color: hsl(0, 100%, 40%);">-            csnStream_t arT = *ar;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            descr[0]      = pChoice->descr;</span><br><span style="color: hsl(0, 100%, 40%);">-            memset(&descr[1], 0x00, sizeof(CSN_DESCR));</span><br><span style="color: hsl(0, 100%, 40%);">-            descr[1].type = CSN_END;</span><br><span style="color: hsl(0, 100%, 40%);">-            pui8          = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-            *pui8         = i;</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGPC(DCSN1, LOGL_DEBUG, "Choice %s = %u | ", pDescr->sz , (unsigned)value);</span><br><span style="color: hsl(0, 100%, 40%);">-            if (!pChoice->keep_bits) {</span><br><span style="color: hsl(0, 100%, 40%);">-              bit_offset += no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-              remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            csnStreamInit(&arT, bit_offset, remaining_bits_len);</span><br><span style="color: hsl(0, 100%, 40%);">-      Status = csnStreamDecoder(&arT, descr, vector, readIndex, data);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            if (Status >= 0)</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-              remaining_bits_len = arT.remaining_bits_len;</span><br><span style="color: hsl(0, 100%, 40%);">-              bit_offset         = arT.bit_offset;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-            else</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-              return Status;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-            break;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          *readIndex -= no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-          count--;</span><br><span style="color: hsl(0, 100%, 40%);">-          pChoice++;</span><br><span style="color: hsl(0, 100%, 40%);">-          i++;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* Neither of the choice items matched => unknown value */</span><br><span style="color: hsl(0, 100%, 40%);">-        if (!count)</span><br><span style="color: hsl(0, 100%, 40%);">-          return ProcessError(readIndex, "csnStreamDecoder", CSN_ERROR_STREAM_NOT_SUPPORTED, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_SERIALIZE:</span><br><span style="color: hsl(0, 100%, 40%);">-      {</span><br><span style="color: hsl(0, 100%, 40%);">-        StreamSerializeFcn_t serialize = (StreamSerializeFcn_t)pDescr->aux_fn;</span><br><span style="color: hsl(0, 100%, 40%);">-        csnStream_t          arT       = *ar;</span><br><span style="color: hsl(0, 100%, 40%);">-        guint8 length_len              = pDescr->i;</span><br><span style="color: hsl(0, 100%, 40%);">-        gint16               Status    = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   guint8 length = bitvec_read_field(vector, readIndex, length_len);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        LOGPC(DCSN1, LOGL_DEBUG, "%s length = %u | ", pDescr->sz , length);</span><br><span style="color: hsl(0, 100%, 40%);">-        bit_offset += length_len;</span><br><span style="color: hsl(0, 100%, 40%);">-        remaining_bits_len -= length_len;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        csnStreamInit(&arT, bit_offset, length > 0 ? length : remaining_bits_len);</span><br><span style="color: hsl(0, 100%, 40%);">-        arT.direction = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-        LOGPC(DCSN1, LOGL_DEBUG, "offset = %u | ", pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-  Status = serialize(&arT, vector, readIndex, pvDATA(data, pDescr->offset));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (Status >= 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          if (length > 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-            remaining_bits_len -= length;</span><br><span style="color: hsl(0, 100%, 40%);">-            bit_offset         += length;</span><br><span style="color: hsl(0, 100%, 40%);">-          } else {</span><br><span style="color: hsl(0, 100%, 40%);">-            remaining_bits_len = arT.remaining_bits_len;</span><br><span style="color: hsl(0, 100%, 40%);">-            bit_offset         = arT.bit_offset;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          /* Skip bits not handled by serialize(), if any */</span><br><span style="color: hsl(0, 100%, 40%);">-          if (Status > 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGPC(DCSN1, LOGL_DEBUG, "skipped = %d | ", Status);</span><br><span style="color: hsl(0, 100%, 40%);">-            *readIndex += Status;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-        else</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          /* Has already been processed: */</span><br><span style="color: hsl(0, 100%, 40%);">-          return Status;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_UNION_LH:</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_UNION:</span><br><span style="color: hsl(0, 100%, 40%);">-      {</span><br><span style="color: hsl(0, 100%, 40%);">-        gint16           Bits;</span><br><span style="color: hsl(0, 100%, 40%);">-        guint8           index;</span><br><span style="color: hsl(0, 100%, 40%);">-        gint16           count      = pDescr->i;</span><br><span style="color: hsl(0, 100%, 40%);">-        const CSN_DESCR* pDescrNext = pDescr;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescrNext += count + 1; /* now this is next after the union */</span><br><span style="color: hsl(0, 100%, 40%);">-        if ((count <= 0) || (count > 16))</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_INVALID_UNION_INDEX, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* Now get the bits to extract the index */</span><br><span style="color: hsl(0, 100%, 40%);">-        Bits = ixBitsTab[count];</span><br><span style="color: hsl(0, 100%, 40%);">-        index = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        while (Bits > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          index <<= 1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          if (CSN_UNION_LH == pDescr->type)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            index |= get_masked_bits8(vector, readIndex, bit_offset, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-          else</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-        index |= bitvec_read_field(vector, readIndex, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-          remaining_bits_len--;</span><br><span style="color: hsl(0, 100%, 40%);">-          bit_offset++;</span><br><span style="color: hsl(0, 100%, 40%);">-          Bits--;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* Assign UnionType */</span><br><span style="color: hsl(0, 100%, 40%);">-        pui8  = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-        *pui8 = index;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* script index to continue on, limited in case we do not have a power of 2 */</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr += (MIN(index + 1, count));</span><br><span style="color: hsl(0, 100%, 40%);">-        LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        switch (pDescr->type)</span><br><span style="color: hsl(0, 100%, 40%);">-        { /* get the right element of the union based on computed index */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          case CSN_BIT:</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            pui8  = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-            *pui8 = 0x00;</span><br><span style="color: hsl(0, 100%, 40%);">-         if (bitvec_read_field(vector, readIndex, 1) > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-              *pui8 = 0x01;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-            remaining_bits_len -= 1;</span><br><span style="color: hsl(0, 100%, 40%);">-            bit_offset++;</span><br><span style="color: hsl(0, 100%, 40%);">-            pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-            break;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          case CSN_NULL:</span><br><span style="color: hsl(0, 100%, 40%);">-          { /* Empty member! */</span><br><span style="color: hsl(0, 100%, 40%);">-            bit_offset += pDescr->i;</span><br><span style="color: hsl(0, 100%, 40%);">-            pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-            break;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          case CSN_UINT:</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            guint8 no_of_bits = (guint8) pDescr->i;</span><br><span style="color: hsl(0, 100%, 40%);">-            if (remaining_bits_len >= no_of_bits)</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-              if (no_of_bits <= 8)</span><br><span style="color: hsl(0, 100%, 40%);">-              {</span><br><span style="color: hsl(0, 100%, 40%);">-         guint8 ui8 = bitvec_read_field(vector, readIndex,  no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-                pui8       = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-                *pui8      = ui8;</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-              else if (no_of_bits <= 16)</span><br><span style="color: hsl(0, 100%, 40%);">-              {</span><br><span style="color: hsl(0, 100%, 40%);">-              guint16 ui16 = bitvec_read_field(vector, readIndex,  no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-                pui16        = pui16DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-                *pui16       = ui16;</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , *pui16);</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-              else if (no_of_bits <= 32)</span><br><span style="color: hsl(0, 100%, 40%);">-              {</span><br><span style="color: hsl(0, 100%, 40%);">-               guint32 ui32 = bitvec_read_field(vector, readIndex,  no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-                pui32       = pui32DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-                *pui32      = ui32;</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , *pui32);</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-              else</span><br><span style="color: hsl(0, 100%, 40%);">-              {</span><br><span style="color: hsl(0, 100%, 40%);">-                return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_GENERAL, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-            else</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-              return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_GENERAL, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-            bit_offset += no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-            pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-            break;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          case CSN_UINT_OFFSET:</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            guint8 no_of_bits = (guint8) pDescr->i;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            if (remaining_bits_len >= no_of_bits)</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-              if (no_of_bits <= 8)</span><br><span style="color: hsl(0, 100%, 40%);">-              {</span><br><span style="color: hsl(0, 100%, 40%);">-               guint8 ui8 = bitvec_read_field(vector, readIndex,  no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-                pui8      = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-                *pui8     = ui8 + (guint8)pDescr->descr.value;</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-              else if (no_of_bits <= 16)</span><br><span style="color: hsl(0, 100%, 40%);">-              {</span><br><span style="color: hsl(0, 100%, 40%);">-               guint16 ui16 = bitvec_read_field(vector, readIndex,  no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-                pui16       = pui16DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-                *pui16      = ui16 + (guint16)pDescr->descr.value;</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , *pui16);</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-              else if (no_of_bits <= 32)</span><br><span style="color: hsl(0, 100%, 40%);">-              {</span><br><span style="color: hsl(0, 100%, 40%);">-               guint32 ui32 = bitvec_read_field(vector, readIndex,  no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-                pui32       = pui32DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-                *pui32      = ui32 + (guint16)pDescr->descr.value;</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , *pui32);</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-              else</span><br><span style="color: hsl(0, 100%, 40%);">-              {</span><br><span style="color: hsl(0, 100%, 40%);">-                return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_GENERAL, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-            else</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-              return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-            bit_offset += no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-            pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-            break;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          case CSN_UINT_LH:</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            guint8 no_of_bits = (guint8) pDescr->i;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            if (remaining_bits_len >= no_of_bits)</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-              if (no_of_bits <= 8)</span><br><span style="color: hsl(0, 100%, 40%);">-              {</span><br><span style="color: hsl(0, 100%, 40%);">-                guint8 ui8 = get_masked_bits8(vector, readIndex, bit_offset, no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-                pui8      = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-                *pui8     = ui8;</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-              else</span><br><span style="color: hsl(0, 100%, 40%);">-              { /* Maybe we should support more than 8 bits ? */</span><br><span style="color: hsl(0, 100%, 40%);">-                return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_GENERAL, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-            else</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-              return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-            bit_offset += no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-            pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-            break;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          case CSN_UINT_ARRAY:</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            guint8  no_of_bits  = (guint8) pDescr->i;</span><br><span style="color: hsl(0, 100%, 40%);">-            guint16 nCount = (guint16)pDescr->descr.value; /* nCount supplied by value i.e. M_UINT_ARRAY(...) */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            if (pDescr->value != 0)</span><br><span style="color: hsl(0, 100%, 40%);">-            { /* nCount specified by a reference to field holding value i.e. M_VAR_UINT_ARRAY(...) */</span><br><span style="color: hsl(0, 100%, 40%);">-              nCount = *pui16DATA(data, nCount);</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            if (remaining_bits_len >= (no_of_bits * nCount))</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-              remaining_bits_len -= (no_of_bits * nCount);</span><br><span style="color: hsl(0, 100%, 40%);">-              if (no_of_bits <= 8)</span><br><span style="color: hsl(0, 100%, 40%);">-              {</span><br><span style="color: hsl(0, 100%, 40%);">-                pui8 = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                while (nCount > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                {</span><br><span style="color: hsl(0, 100%, 40%);">-            *pui8 = bitvec_read_field(vector, readIndex,  no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-                  LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-                  pui8++;</span><br><span style="color: hsl(0, 100%, 40%);">-                  bit_offset += no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-                  nCount--;</span><br><span style="color: hsl(0, 100%, 40%);">-                }</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-              else if (no_of_bits <= 16)</span><br><span style="color: hsl(0, 100%, 40%);">-              {</span><br><span style="color: hsl(0, 100%, 40%);">-                pui16 = pui16DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                while (nCount > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                {</span><br><span style="color: hsl(0, 100%, 40%);">-               *pui16 = bitvec_read_field(vector, readIndex,  no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-                  LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , *pui16);</span><br><span style="color: hsl(0, 100%, 40%);">-                  pui16++;</span><br><span style="color: hsl(0, 100%, 40%);">-                  bit_offset += no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-                  nCount--;</span><br><span style="color: hsl(0, 100%, 40%);">-                }</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-              else if (no_of_bits <= 32)</span><br><span style="color: hsl(0, 100%, 40%);">-              { /* not supported */</span><br><span style="color: hsl(0, 100%, 40%);">-                return ProcessError(readIndex,"csnStreamDecoder NOT IMPLEMENTED", 999, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-              else</span><br><span style="color: hsl(0, 100%, 40%);">-              {</span><br><span style="color: hsl(0, 100%, 40%);">-                return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_GENERAL, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-            else</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-              return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-            break;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          case CSN_VARIABLE_TARRAY_OFFSET:</span><br><span style="color: hsl(0, 100%, 40%);">-          case CSN_VARIABLE_TARRAY:</span><br><span style="color: hsl(0, 100%, 40%);">-          case CSN_TYPE_ARRAY:</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            gint16      Status;</span><br><span style="color: hsl(0, 100%, 40%);">-            csnStream_t arT    = *ar;</span><br><span style="color: hsl(0, 100%, 40%);">-            guint16      nCount = (guint16) pDescr->i;</span><br><span style="color: hsl(0, 100%, 40%);">-            guint16      nSize  = (guint16)(guint32)pDescr->value;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            pui8  = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            if (CSN_VARIABLE_TARRAY == pDescr->type)</span><br><span style="color: hsl(0, 100%, 40%);">-            { /* Count specified in field */</span><br><span style="color: hsl(0, 100%, 40%);">-              nCount = *pui8DATA(data, pDescr->i);</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-            else if (CSN_VARIABLE_TARRAY_OFFSET == pDescr->type)</span><br><span style="color: hsl(0, 100%, 40%);">-            { /* Count specified in field */</span><br><span style="color: hsl(0, 100%, 40%);">-              nCount = *pui8DATA(data, pDescr->i);</span><br><span style="color: hsl(0, 100%, 40%);">-              nCount--; /* Offset 1 */</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            while (nCount--)    /* Changed to handle length = 0.  */</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-              LOGPC(DCSN1, LOGL_DEBUG, "%s | ", pDescr->sz);</span><br><span style="color: hsl(0, 100%, 40%);">-              csnStreamInit(&arT, bit_offset, remaining_bits_len);</span><br><span style="color: hsl(0, 100%, 40%);">-         Status = csnStreamDecoder(&arT, (const CSN_DESCR*)pDescr->descr.ptr, vector, readIndex, pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-              if (Status >= 0)</span><br><span style="color: hsl(0, 100%, 40%);">-              {</span><br><span style="color: hsl(0, 100%, 40%);">-                pui8    += nSize;</span><br><span style="color: hsl(0, 100%, 40%);">-                remaining_bits_len = arT.remaining_bits_len;</span><br><span style="color: hsl(0, 100%, 40%);">-                bit_offset         = arT.bit_offset;</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-              else</span><br><span style="color: hsl(0, 100%, 40%);">-              {</span><br><span style="color: hsl(0, 100%, 40%);">-                return Status;</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-            break;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          case CSN_BITMAP:</span><br><span style="color: hsl(0, 100%, 40%);">-          { /* bitmap with given length. The result is left aligned! */</span><br><span style="color: hsl(0, 100%, 40%);">-            guint8 no_of_bits = (guint8) pDescr->i; /* length of bitmap */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            if (no_of_bits > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-              if (no_of_bits > remaining_bits_len)</span><br><span style="color: hsl(0, 100%, 40%);">-              {</span><br><span style="color: hsl(0, 100%, 40%);">-                return ProcessError(readIndex, "csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-              if (no_of_bits <= 32)</span><br><span style="color: hsl(0, 100%, 40%);">-              {</span><br><span style="color: hsl(0, 100%, 40%);">-          guint32 ui32 = bitvec_read_field(vector, readIndex, no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-                pui32       = pui32DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-                *pui32      = ui32;</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-              else if (no_of_bits <= 64)</span><br><span style="color: hsl(0, 100%, 40%);">-              {</span><br><span style="color: hsl(0, 100%, 40%);">-           guint64 ui64 = bitvec_read_field(vector, readIndex, no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-                pui64       = pui64DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-                *pui64      = ui64;</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGPC(DCSN1, LOGL_DEBUG, "%s = %lu | ", pDescr->sz , *pui64);</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-              else</span><br><span style="color: hsl(0, 100%, 40%);">-              {</span><br><span style="color: hsl(0, 100%, 40%);">-                  return ProcessError(readIndex,"csnStreamDecoder NOT IMPLEMENTED", 999, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-              remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-              bit_offset += no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-            /* bitmap was successfully extracted or it was empty */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-            break;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          case CSN_TYPE:</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            gint16      Status;</span><br><span style="color: hsl(0, 100%, 40%);">-            csnStream_t arT = *ar;</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGPC(DCSN1, LOGL_DEBUG, " : %s | ", pDescr->sz);</span><br><span style="color: hsl(0, 100%, 40%);">-            csnStreamInit(&arT, bit_offset, remaining_bits_len);</span><br><span style="color: hsl(0, 100%, 40%);">-          Status = csnStreamDecoder(&arT, (const CSN_DESCR*)pDescr->descr.ptr, vector, readIndex, pvDATA(data, pDescr->offset));</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGPC(DCSN1, LOGL_DEBUG, " : End %s | ", pDescr->sz);</span><br><span style="color: hsl(0, 100%, 40%);">-            if (Status >= 0)</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-              remaining_bits_len = arT.remaining_bits_len;</span><br><span style="color: hsl(0, 100%, 40%);">-              bit_offset         = arT.bit_offset;</span><br><span style="color: hsl(0, 100%, 40%);">-              pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-            else</span><br><span style="color: hsl(0, 100%, 40%);">-            { /* return error code Has already been processed:  */</span><br><span style="color: hsl(0, 100%, 40%);">-              return Status;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            break;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          default:</span><br><span style="color: hsl(0, 100%, 40%);">-          { /* descriptions of union elements other than above are illegal */</span><br><span style="color: hsl(0, 100%, 40%);">-            return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_IN_SCRIPT, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr = pDescrNext;</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_EXIST:</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_EXIST_LH:</span><br><span style="color: hsl(0, 100%, 40%);">-      {</span><br><span style="color: hsl(0, 100%, 40%);">-        guint8 fExist;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        pui8  = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (CSN_EXIST_LH == pDescr->type)</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          fExist = get_masked_bits8(vector, readIndex, bit_offset, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-        else</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-      fExist = bitvec_read_field(vector, readIndex, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        *pui8 = fExist;</span><br><span style="color: hsl(0, 100%, 40%);">-        LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        bit_offset++;</span><br><span style="color: hsl(0, 100%, 40%);">-        remaining_bits_len -= 1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (!fExist)</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          ar->remaining_bits_len  = remaining_bits_len;</span><br><span style="color: hsl(0, 100%, 40%);">-          ar->bit_offset          = bit_offset;</span><br><span style="color: hsl(0, 100%, 40%);">-          return remaining_bits_len;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_NEXT_EXIST:</span><br><span style="color: hsl(0, 100%, 40%);">-      {</span><br><span style="color: hsl(0, 100%, 40%);">-        guint8 fExist;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        pui8  = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* this if-statement represents the M_NEXT_EXIST_OR_NULL description element */</span><br><span style="color: hsl(0, 100%, 40%);">-        if ((pDescr->may_be_null) && (remaining_bits_len == 0))</span><br><span style="color: hsl(0, 100%, 40%);">-        { /* no more bits to decode is fine here - end of message detected and allowed */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          /* Skip i entries + this entry */</span><br><span style="color: hsl(0, 100%, 40%);">-          pDescr += pDescr->i + 1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          /* Set the data member to "not exist" */</span><br><span style="color: hsl(0, 100%, 40%);">-          *pui8 = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-          break;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* the "regular" M_NEXT_EXIST description element */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        fExist = 0x00;</span><br><span style="color: hsl(0, 100%, 40%);">-  if (bitvec_read_field(vector, readIndex, 1))</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          fExist = 0x01;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        *pui8     = fExist;</span><br><span style="color: hsl(0, 100%, 40%);">-        remaining_bits_len -= 1;</span><br><span style="color: hsl(0, 100%, 40%);">-        LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-        ++bit_offset;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (fExist == 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        { /* Skip 'i' entries */</span><br><span style="color: hsl(0, 100%, 40%);">-          pDescr += pDescr->i;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_NEXT_EXIST_LH:</span><br><span style="color: hsl(0, 100%, 40%);">-      {</span><br><span style="color: hsl(0, 100%, 40%);">-        guint8 fExist;</span><br><span style="color: hsl(0, 100%, 40%);">-        pui8  = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* this if-statement represents the M_NEXT_EXIST_OR_NULL_LH description element */</span><br><span style="color: hsl(0, 100%, 40%);">-        if ((pDescr->descr.ptr != NULL) && (remaining_bits_len == 0))</span><br><span style="color: hsl(0, 100%, 40%);">-        { /* no more bits to decode is fine here - end of message detected and allowed */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          /* skip 'i' entries + this entry */</span><br><span style="color: hsl(0, 100%, 40%);">-          pDescr += pDescr->i + 1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          /* set the data member to "not exist" */</span><br><span style="color: hsl(0, 100%, 40%);">-          *pui8 = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-          break;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* the "regular" M_NEXT_EXIST_LH description element */</span><br><span style="color: hsl(0, 100%, 40%);">-        fExist = get_masked_bits8(vector, readIndex, bit_offset, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-        LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)fExist);</span><br><span style="color: hsl(0, 100%, 40%);">-        *pui8++   = fExist;</span><br><span style="color: hsl(0, 100%, 40%);">-        remaining_bits_len -= 1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        bit_offset++;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (fExist == 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        { /* Skip 'i' entries */</span><br><span style="color: hsl(0, 100%, 40%);">-          pDescr += pDescr->i;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_VARIABLE_BITMAP_1:</span><br><span style="color: hsl(0, 100%, 40%);">-      { /* Bitmap from here and to the end of message */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        *pui8DATA(data, (gint16)pDescr->descr.value) = (guint8) remaining_bits_len; /* length of bitmap == remaining bits */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /*no break -</span><br><span style="color: hsl(0, 100%, 40%);">-         * with a length set we have a regular variable length bitmap so we continue */</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-      /* FALL THROUGH */</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_VARIABLE_BITMAP:</span><br><span style="color: hsl(0, 100%, 40%);">-      { /* {CSN_VARIABLE_BITMAP, 0, offsetof(_STRUCT, _ElementCountField), offsetof(_STRUCT, _MEMBER), #_MEMBER}</span><br><span style="color: hsl(0, 100%, 40%);">-         * <N: bit (5)> <bitmap: bit(N + offset)></span><br><span style="color: hsl(0, 100%, 40%);">-         * Bit array with length (in bits) specified in parameter (pDescr->descr)</span><br><span style="color: hsl(0, 100%, 40%);">-         * The result is right aligned!</span><br><span style="color: hsl(0, 100%, 40%);">-         */</span><br><span style="color: hsl(0, 100%, 40%);">-        gint16 no_of_bits = *pui8DATA(data, (gint16)pDescr->descr.value);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        no_of_bits += pDescr->i; /* adjusted by offset */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (no_of_bits > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          if (remaining_bits_len < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          { /* extract bits */</span><br><span style="color: hsl(0, 100%, 40%);">-            guint8* pui8 = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-            gint16 nB1  = no_of_bits & 0x07;/* no_of_bits Mod 8 */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            if (nB1 > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-            { /* take care of the first byte - it will be right aligned */</span><br><span style="color: hsl(0, 100%, 40%);">-              *pui8 = bitvec_read_field(vector, readIndex, nB1);</span><br><span style="color: hsl(0, 100%, 40%);">-              LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-              pui8++;</span><br><span style="color: hsl(0, 100%, 40%);">-              no_of_bits  -= nB1;</span><br><span style="color: hsl(0, 100%, 40%);">-              bit_offset += nB1; /* (nB1 is no_of_bits Mod 8) */</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            /* remaining no_of_bits is a multiple of 8 or 0 */</span><br><span style="color: hsl(0, 100%, 40%);">-            while (no_of_bits > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-           *pui8 = bitvec_read_field(vector, readIndex, 8);</span><br><span style="color: hsl(0, 100%, 40%);">-              LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-              pui8++;</span><br><span style="color: hsl(0, 100%, 40%);">-              no_of_bits -= 8;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_LEFT_ALIGNED_VAR_BMP_1:</span><br><span style="color: hsl(0, 100%, 40%);">-      { /* Bitmap from here and to the end of message */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        *pui8DATA(data, (gint16)pDescr->descr.value) = (guint8) remaining_bits_len; /* length of bitmap == remaining bits */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* no break -</span><br><span style="color: hsl(0, 100%, 40%);">-         * with a length set we have a regular left aligned variable length bitmap so we continue</span><br><span style="color: hsl(0, 100%, 40%);">-         */</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-      /* FALL THROUGH */</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_LEFT_ALIGNED_VAR_BMP:</span><br><span style="color: hsl(0, 100%, 40%);">-      { /* {CSN_LEFT_ALIGNED_VAR_BMP, _OFFSET, (void*)offsetof(_STRUCT, _ElementCountField), offsetof(_STRUCT, _MEMBER), #_MEMBER}</span><br><span style="color: hsl(0, 100%, 40%);">-         * <N: bit (5)> <bitmap: bit(N + offset)></span><br><span style="color: hsl(0, 100%, 40%);">-         * bit array with length (in bits) specified in parameter (pDescr->descr)</span><br><span style="color: hsl(0, 100%, 40%);">-         */</span><br><span style="color: hsl(0, 100%, 40%);">-        gint16 no_of_bits = *pui8DATA(data, (gint16)pDescr->descr.value);/* Size of bitmap */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        no_of_bits += pDescr->i;/* size adjusted by offset */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (no_of_bits > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          if (remaining_bits_len < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          { /* extract bits */</span><br><span style="color: hsl(0, 100%, 40%);">-            guint8* pui8 = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            while (no_of_bits >= 8)</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-             *pui8 = bitvec_read_field(vector, readIndex, 8);</span><br><span style="color: hsl(0, 100%, 40%);">-              LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-              pui8++;</span><br><span style="color: hsl(0, 100%, 40%);">-              no_of_bits -= 8;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-            if (no_of_bits > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-         *pui8 = bitvec_read_field(vector, readIndex, no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-              LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-              pui8++;</span><br><span style="color: hsl(0, 100%, 40%);">-              bit_offset += no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-              no_of_bits = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* bitmap was successfully extracted or it was empty */</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_PADDING_BITS:</span><br><span style="color: hsl(0, 100%, 40%);">-      { /* Padding from here and to the end of message */</span><br><span style="color: hsl(0, 100%, 40%);">-        LOGPC(DCSN1, LOGL_DEBUG, "%s = ", pDescr->sz);</span><br><span style="color: hsl(0, 100%, 40%);">-        if (remaining_bits_len > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          while (remaining_bits_len > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            guint bits_to_handle = remaining_bits_len%8;</span><br><span style="color: hsl(0, 100%, 40%);">-            if (bits_to_handle > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-              LOGPC(DCSN1, LOGL_DEBUG, "%d|", bitvec_get_uint(vector, bits_to_handle));</span><br><span style="color: hsl(0, 100%, 40%);">-              remaining_bits_len -= bits_to_handle;</span><br><span style="color: hsl(0, 100%, 40%);">-              bit_offset += bits_to_handle;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-            else if (bits_to_handle == 0)</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-              LOGPC(DCSN1, LOGL_DEBUG, "%d|", bitvec_get_uint(vector, 8));</span><br><span style="color: hsl(0, 100%, 40%);">-              remaining_bits_len -= 8;</span><br><span style="color: hsl(0, 100%, 40%);">-              bit_offset += 8;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-        if (remaining_bits_len < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* Padding was successfully extracted or it was empty */</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_VARIABLE_ARRAY:</span><br><span style="color: hsl(0, 100%, 40%);">-      { /* {int type; int i; void* descr; int offset; const char* sz; } CSN_DESCR;</span><br><span style="color: hsl(0, 100%, 40%);">-         * {CSN_VARIABLE_ARRAY, _OFFSET, (void*)offsetof(_STRUCT, _ElementCountField), offsetof(_STRUCT, _MEMBER), #_MEMBER}</span><br><span style="color: hsl(0, 100%, 40%);">-         * Array with length specified in parameter:</span><br><span style="color: hsl(0, 100%, 40%);">-         *  <count: bit (x)></span><br><span style="color: hsl(0, 100%, 40%);">-         *  <list: octet(count + offset)></span><br><span style="color: hsl(0, 100%, 40%);">-         */</span><br><span style="color: hsl(0, 100%, 40%);">-        gint16 count = *pui8DATA(data, (gint16)pDescr->descr.value);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        count += pDescr->i; /* Adjusted by offset */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (count > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          remaining_bits_len -= count * 8;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          if (remaining_bits_len < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          pui8 = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          while (count > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-       *pui8 = bitvec_read_field(vector, readIndex, 8);</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGPC(DCSN1, LOGL_DEBUG, "%s = 0x%x | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-            pui8++;</span><br><span style="color: hsl(0, 100%, 40%);">-            bit_offset += 8;</span><br><span style="color: hsl(0, 100%, 40%);">-            count--;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_RECURSIVE_ARRAY:</span><br><span style="color: hsl(0, 100%, 40%);">-      { /* Recursive way to specify an array: <list> ::= {1 <number: bit (4)> <list> | 0}</span><br><span style="color: hsl(0, 100%, 40%);">-         *  or more generally:                <list> ::= { <tag> <element> <list> | <EndTag> }</span><br><span style="color: hsl(0, 100%, 40%);">-         *  where <element> ::= bit(value)</span><br><span style="color: hsl(0, 100%, 40%);">-         *        <tag>     ::= 0 | 1</span><br><span style="color: hsl(0, 100%, 40%);">-         *        <EndTag>  ::= reversed tag i.e. tag == 1 -> EndTag == 0 and vice versa</span><br><span style="color: hsl(0, 100%, 40%);">-         * {CSN_RECURSIVE_ARRAY, _BITS, (void*)offsetof(_STRUCT, _ElementCountField), offsetof(_STRUCT, _MEMBER), #_MEMBER}</span><br><span style="color: hsl(0, 100%, 40%);">-         * REMARK: recursive way to specify an array but an iterative implementation!</span><br><span style="color: hsl(0, 100%, 40%);">-         */</span><br><span style="color: hsl(0, 100%, 40%);">-        gint16 no_of_bits        = pDescr->i;</span><br><span style="color: hsl(0, 100%, 40%);">-        guint8  ElementCount = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        pui8  = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       while (existNextElement(vector, readIndex, Tag))</span><br><span style="color: hsl(0, 100%, 40%);">-        { /* tag control shows existence of next list elements */</span><br><span style="color: hsl(0, 100%, 40%);">-          LOGPC(DCSN1, LOGL_DEBUG, "%s = Exist | ", pDescr->sz);</span><br><span style="color: hsl(0, 100%, 40%);">-          bit_offset++;</span><br><span style="color: hsl(0, 100%, 40%);">-          remaining_bits_len--;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          /* extract and store no_of_bits long element from bitstream */</span><br><span style="color: hsl(0, 100%, 40%);">-      *pui8 = bitvec_read_field(vector, readIndex, no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-          LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-          pui8++;</span><br><span style="color: hsl(0, 100%, 40%);">-          remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-          ElementCount++;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          if (remaining_bits_len < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          bit_offset += no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        LOGPC(DCSN1, LOGL_DEBUG, "%s = %d | ", pDescr->sz , bitvec_get_uint(vector, 1));</span><br><span style="color: hsl(0, 100%, 40%);">-        /* existNextElement() returned FALSE, 1 bit consumed */</span><br><span style="color: hsl(0, 100%, 40%);">-        bit_offset++;</span><br><span style="color: hsl(0, 100%, 40%);">-        remaining_bits_len--;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* Store the counted number of elements of the array */</span><br><span style="color: hsl(0, 100%, 40%);">-        *pui8DATA(data, (gint16)pDescr->descr.value) = ElementCount;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_RECURSIVE_TARRAY:</span><br><span style="color: hsl(0, 100%, 40%);">-      { /* Recursive way to specify an array of type: <lists> ::= { 1 <type> } ** 0 ;</span><br><span style="color: hsl(0, 100%, 40%);">-         *  M_REC_TARRAY(_STRUCT, _MEMBER, _MEMBER_TYPE, _ElementCountField)</span><br><span style="color: hsl(0, 100%, 40%);">-         * {t, offsetof(_STRUCT, _ElementCountField), (void*)CSNDESCR_##_MEMBER_TYPE, offsetof(_STRUCT, _MEMBER), #_MEMBER, (StreamSerializeFcn_t)sizeof(_MEMBER_TYPE), (void_fn_t)ElementsOf(((_STRUCT*)0)->_MEMBER)}</span><br><span style="color: hsl(0, 100%, 40%);">-         */</span><br><span style="color: hsl(0, 100%, 40%);">-        gint16 nSizeElement = (gint16)(gint32)pDescr->value;</span><br><span style="color: hsl(0, 100%, 40%);">-        guint32 nSizeArray = (guint32)((uintptr_t)pDescr->aux_fn);</span><br><span style="color: hsl(0, 100%, 40%);">-        guint8  ElementCount = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-        pui8  = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    while (existNextElement(vector, readIndex, Tag))</span><br><span style="color: hsl(0, 100%, 40%);">-        { /* tag control shows existence of next list elements */</span><br><span style="color: hsl(0, 100%, 40%);">-          LOGPC(DCSN1, LOGL_DEBUG, "%s = Exist | ", pDescr->sz);</span><br><span style="color: hsl(0, 100%, 40%);">-          /* existNextElement() returned TRUE, 1 bit consumed */</span><br><span style="color: hsl(0, 100%, 40%);">-          bit_offset++;</span><br><span style="color: hsl(0, 100%, 40%);">-          remaining_bits_len--;</span><br><span style="color: hsl(0, 100%, 40%);">-          ElementCount++;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          if (ElementCount > nSizeArray)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGPC(DCSN1, LOGL_ERROR, "error: %s: too many elements (>%u) in recursive array. Increase its size! } |", pDescr->sz, nSizeArray);</span><br><span style="color: hsl(0, 100%, 40%);">-            return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_STREAM_NOT_SUPPORTED, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          { /* unpack the following data structure */</span><br><span style="color: hsl(0, 100%, 40%);">-            csnStream_t arT = *ar;</span><br><span style="color: hsl(0, 100%, 40%);">-            gint16      Status;</span><br><span style="color: hsl(0, 100%, 40%);">-            csnStreamInit(&arT, bit_offset, remaining_bits_len);</span><br><span style="color: hsl(0, 100%, 40%);">-      Status = csnStreamDecoder(&arT, (const CSN_DESCR*)pDescr->descr.ptr, vector, readIndex, pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            if (Status >= 0)</span><br><span style="color: hsl(0, 100%, 40%);">-            { /* successful completion */</span><br><span style="color: hsl(0, 100%, 40%);">-              pui8    += nSizeElement;  /* -> to next data element */</span><br><span style="color: hsl(0, 100%, 40%);">-              remaining_bits_len = arT.remaining_bits_len;</span><br><span style="color: hsl(0, 100%, 40%);">-              bit_offset         = arT.bit_offset;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-            else</span><br><span style="color: hsl(0, 100%, 40%);">-            { /* something went awry */</span><br><span style="color: hsl(0, 100%, 40%);">-              return Status;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          if (remaining_bits_len < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        LOGPC(DCSN1, LOGL_DEBUG, "%s = %d | ", pDescr->sz , bitvec_get_uint(vector, 1));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* existNextElement() returned FALSE, 1 bit consumed */</span><br><span style="color: hsl(0, 100%, 40%);">-        remaining_bits_len--;</span><br><span style="color: hsl(0, 100%, 40%);">-        bit_offset++;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* Store the counted number of elements of the array */</span><br><span style="color: hsl(0, 100%, 40%);">-        *pui8DATA(data, (gint16)(gint32)pDescr->i) = ElementCount;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_RECURSIVE_TARRAY_2:</span><br><span style="color: hsl(0, 100%, 40%);">-      { /* Recursive way to specify an array of type: <list> ::= <type> { 0 <type> } ** 1 ; */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        Tag = REVERSED_TAG;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* NO break -</span><br><span style="color: hsl(0, 100%, 40%);">-         * handling is exactly the same as for CSN_RECURSIVE_TARRAY_1 so we continue</span><br><span style="color: hsl(0, 100%, 40%);">-         */</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-      /* FALL THROUGH */</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_RECURSIVE_TARRAY_1:</span><br><span style="color: hsl(0, 100%, 40%);">-      { /* Recursive way to specify an array of type: <lists> ::= <type> { 1 <type> } ** 0 ;</span><br><span style="color: hsl(0, 100%, 40%);">-         * M_REC_TARRAY(_STRUCT, _MEMBER, _MEMBER_TYPE, _ElementCountField)</span><br><span style="color: hsl(0, 100%, 40%);">-         * {t, offsetof(_STRUCT, _ElementCountField), (void*)CSNDESCR_##_MEMBER_TYPE, offsetof(_STRUCT, _MEMBER), #_MEMBER, (StreamSerializeFcn_t)sizeof(_MEMBER_TYPE), (void_fn_t)ElementsOf(((_STRUCT*)0)->_MEMBER)}</span><br><span style="color: hsl(0, 100%, 40%);">-         */</span><br><span style="color: hsl(0, 100%, 40%);">-        gint16      nSizeElement = (gint16)(gint32)pDescr->value;</span><br><span style="color: hsl(0, 100%, 40%);">-        guint32     nSizeArray = (guint32)((uintptr_t)pDescr->aux_fn);</span><br><span style="color: hsl(0, 100%, 40%);">-        guint8       ElementCount = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-        csnStream_t arT          = *ar;</span><br><span style="color: hsl(0, 100%, 40%);">-        gboolean     EndOfList    = FALSE;</span><br><span style="color: hsl(0, 100%, 40%);">-        gint16      Status;</span><br><span style="color: hsl(0, 100%, 40%);">-        pui8  = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        do</span><br><span style="color: hsl(0, 100%, 40%);">-        { /* get data element */</span><br><span style="color: hsl(0, 100%, 40%);">-          ElementCount++;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          if (ElementCount > nSizeArray)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGPC(DCSN1, LOGL_ERROR, "error: %s: too many elements (>%u) in recursive array. Increase its size! } |", pDescr->sz, nSizeArray);</span><br><span style="color: hsl(0, 100%, 40%);">-            return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_STREAM_NOT_SUPPORTED, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          LOGPC(DCSN1, LOGL_DEBUG, "%s { | ", pDescr->sz);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          csnStreamInit(&arT, bit_offset, remaining_bits_len);</span><br><span style="color: hsl(0, 100%, 40%);">-       Status = csnStreamDecoder(&arT, (const CSN_DESCR*)pDescr->descr.ptr, vector, readIndex, pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          if (Status >= 0)</span><br><span style="color: hsl(0, 100%, 40%);">-          { /* successful completion */</span><br><span style="color: hsl(0, 100%, 40%);">-            pui8    += nSizeElement;  /* -> to next */</span><br><span style="color: hsl(0, 100%, 40%);">-            remaining_bits_len = arT.remaining_bits_len;</span><br><span style="color: hsl(0, 100%, 40%);">-            bit_offset         = arT.bit_offset;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-          else</span><br><span style="color: hsl(0, 100%, 40%);">-          { /* something went awry */</span><br><span style="color: hsl(0, 100%, 40%);">-            return Status;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          if (remaining_bits_len < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          /* control of next element's tag */</span><br><span style="color: hsl(0, 100%, 40%);">-          LOGPC(DCSN1, LOGL_DEBUG, "%s } | ", pDescr->sz);</span><br><span style="color: hsl(0, 100%, 40%);">-         EndOfList         = !(existNextElement(vector, readIndex, Tag));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          bit_offset++;</span><br><span style="color: hsl(0, 100%, 40%);">-          remaining_bits_len--; /* 1 bit consumed (tag) */</span><br><span style="color: hsl(0, 100%, 40%);">-        } while (!EndOfList);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* Store the count of the array */</span><br><span style="color: hsl(0, 100%, 40%);">-        *pui8DATA(data, pDescr->i) = ElementCount;</span><br><span style="color: hsl(0, 100%, 40%);">-        Tag = STANDARD_TAG; /* in case it was set to "reversed" */</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_FIXED:</span><br><span style="color: hsl(0, 100%, 40%);">-      { /* Verify the fixed bits */</span><br><span style="color: hsl(0, 100%, 40%);">-        guint8  no_of_bits = (guint8) pDescr->i;</span><br><span style="color: hsl(0, 100%, 40%);">-        guint32 ui32;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (no_of_bits <= 32)</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-        ui32 = bitvec_read_field(vector, readIndex, no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-        else</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          return ProcessError(readIndex,"no_of_bits > 32", -1, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-        if (ui32 != (unsigned)(gint32)pDescr->offset)</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          return ProcessError(readIndex,"csnStreamDecoder FIXED value does not match", -1, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned int)ui32);</span><br><span style="color: hsl(0, 100%, 40%);">-        remaining_bits_len   -= no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-        bit_offset += no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_CALLBACK:</span><br><span style="color: hsl(0, 100%, 40%);">-      {</span><br><span style="color: hsl(0, 100%, 40%);">-        guint16  no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-        DissectorCallbackFcn_t callback = (DissectorCallbackFcn_t)pDescr->aux_fn;</span><br><span style="color: hsl(0, 100%, 40%);">-        LOGPC(DCSN1, LOGL_DEBUG, "CSN_CALLBACK(%s) | ", pDescr->sz);</span><br><span style="color: hsl(0, 100%, 40%);">-        no_of_bits = callback(vector, readIndex, pvDATA(data, pDescr->i), pvDATA(data, pDescr->offset));</span><br><span style="color: hsl(0, 100%, 40%);">-        remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-        bit_offset += no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_TRAP_ERROR:</span><br><span style="color: hsl(0, 100%, 40%);">-      {</span><br><span style="color: hsl(0, 100%, 40%);">-        return ProcessError(readIndex,"csnStreamDecoder", pDescr->i, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_END:</span><br><span style="color: hsl(0, 100%, 40%);">-      {</span><br><span style="color: hsl(0, 100%, 40%);">-        ar->remaining_bits_len  = remaining_bits_len;</span><br><span style="color: hsl(0, 100%, 40%);">-        ar->bit_offset = bit_offset;</span><br><span style="color: hsl(0, 100%, 40%);">-        return remaining_bits_len;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      default:</span><br><span style="color: hsl(0, 100%, 40%);">-      {</span><br><span style="color: hsl(0, 100%, 40%);">-        assert(0);</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  } while (remaining_bits_len >= 0);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, struct bitvec *vector, unsigned *writeIndex, void* data)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  gint  remaining_bits_len = ar->remaining_bits_len;</span><br><span style="color: hsl(0, 100%, 40%);">-  gint  bit_offset         = ar->bit_offset;</span><br><span style="color: hsl(0, 100%, 40%);">-  guint8*  pui8;</span><br><span style="color: hsl(0, 100%, 40%);">-  guint16* pui16;</span><br><span style="color: hsl(0, 100%, 40%);">-  guint32* pui32;</span><br><span style="color: hsl(0, 100%, 40%);">-  guint64* pui64;</span><br><span style="color: hsl(0, 100%, 40%);">-  unsigned ib;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  guint8 Tag = STANDARD_TAG;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  if (remaining_bits_len < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-  {</span><br><span style="color: hsl(0, 100%, 40%);">-    return ProcessError(writeIndex, __func__, CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  do</span><br><span style="color: hsl(0, 100%, 40%);">-  {</span><br><span style="color: hsl(0, 100%, 40%);">-    switch (pDescr->type)</span><br><span style="color: hsl(0, 100%, 40%);">-    {</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_BIT:</span><br><span style="color: hsl(0, 100%, 40%);">-      {</span><br><span style="color: hsl(0, 100%, 40%);">-        if (remaining_bits_len > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          pui8  = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-     bitvec_write_field(vector, writeIndex, *pui8, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-          LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-          /* end add the bit value to protocol tree */</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-        else if (pDescr->may_be_null)</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-           LOGPC(DCSN1, LOGL_DEBUG, "%s = NULL | ", pDescr->sz);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-        else</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        remaining_bits_len--;</span><br><span style="color: hsl(0, 100%, 40%);">-        bit_offset++;</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_NULL:</span><br><span style="color: hsl(0, 100%, 40%);">-      { /* Empty member! */</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_UINT:</span><br><span style="color: hsl(0, 100%, 40%);">-      {</span><br><span style="color: hsl(0, 100%, 40%);">-        guint8 no_of_bits = (guint8) pDescr->i;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (remaining_bits_len >= no_of_bits)</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          if (no_of_bits <= 8)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            pui8      = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-     bitvec_write_field(vector, writeIndex, *pui8, no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-          else if (no_of_bits <= 16)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            pui16       = pui16DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-      bitvec_write_field(vector, writeIndex, *pui16, no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , *pui16);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-          else if (no_of_bits <= 32)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            pui32       = pui32DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-      bitvec_write_field(vector, writeIndex, *pui32, no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , *pui32);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-          else</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_GENERAL, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-          bit_offset += no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-        else if (pDescr->may_be_null)</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          LOGPC(DCSN1, LOGL_DEBUG, "%s = NULL | ", pDescr->sz);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-        else</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_UINT_OFFSET:</span><br><span style="color: hsl(0, 100%, 40%);">-      {</span><br><span style="color: hsl(0, 100%, 40%);">-        guint8 no_of_bits = (guint8) pDescr->i;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (remaining_bits_len >= no_of_bits)</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          if (no_of_bits <= 8)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            pui8      = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-      bitvec_write_field(vector, writeIndex, *pui8 - (guint8)pDescr->descr.value, no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)(*pui8 - (guint8)pDescr->descr.value));</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-          else if (no_of_bits <= 16)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            pui16       = pui16DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-          bitvec_write_field(vector, writeIndex, *pui16 - (guint16)pDescr->descr.value, no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned short)(*pui16 - (guint16)pDescr->descr.value));</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-          else if (no_of_bits <= 32)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            pui32       = pui32DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-        bitvec_write_field(vector, writeIndex, *pui32 - (guint16)pDescr->descr.value, no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned int)(*pui32 - (guint16)pDescr->descr.value));</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-          else</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_GENERAL, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-        else</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-        bit_offset += no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_UINT_LH:</span><br><span style="color: hsl(0, 100%, 40%);">-      {</span><br><span style="color: hsl(0, 100%, 40%);">-        guint8 no_of_bits = (guint8) pDescr->i;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (remaining_bits_len >= no_of_bits)</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          if (no_of_bits <= 8)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            pui8      = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-        bitvec_write_field(vector, writeIndex, *pui8, no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-            // TODO : Change get_masked_bits8()</span><br><span style="color: hsl(0, 100%, 40%);">-            *writeIndex -= no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-            guint8 ui8 = get_masked_bits8(vector, writeIndex, bit_offset, no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-            *writeIndex -= no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-     bitvec_write_field(vector, writeIndex, ui8, no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-          else</span><br><span style="color: hsl(0, 100%, 40%);">-          {/* Maybe we should support more than 8 bits ? */</span><br><span style="color: hsl(0, 100%, 40%);">-            return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_GENERAL, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-        else</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-        bit_offset += no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_UINT_ARRAY:</span><br><span style="color: hsl(0, 100%, 40%);">-      {</span><br><span style="color: hsl(0, 100%, 40%);">-        guint8  no_of_bits  = (guint8) pDescr->i;</span><br><span style="color: hsl(0, 100%, 40%);">-        guint16 nCount = (guint16)pDescr->descr.value; /* nCount supplied by value i.e. M_UINT_ARRAY(...) */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (pDescr->value != 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        { /* nCount specified by a reference to field holding value i.e. M_VAR_UINT_ARRAY(...) */</span><br><span style="color: hsl(0, 100%, 40%);">-          nCount = *pui16DATA(data, nCount);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (remaining_bits_len >= (no_of_bits * nCount))</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          if (no_of_bits <= 8)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            pui8 = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-            do</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-           bitvec_write_field(vector, writeIndex, *pui8, no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-              LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-              pui8++;</span><br><span style="color: hsl(0, 100%, 40%);">-              remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-              bit_offset += no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-            } while (--nCount > 0);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-          else if (no_of_bits <= 16)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            return ProcessError(writeIndex,"csnStreamEncoder NOTIMPLEMENTED", 999, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-          else if (no_of_bits <= 32)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            return ProcessError(writeIndex,"csnStreamEncoder NOTIMPLEMENTED", 999, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-          else</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_GENERAL, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-        else</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_VARIABLE_TARRAY_OFFSET:</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_VARIABLE_TARRAY:</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_TYPE_ARRAY:</span><br><span style="color: hsl(0, 100%, 40%);">-      {</span><br><span style="color: hsl(0, 100%, 40%);">-        gint16      Status;</span><br><span style="color: hsl(0, 100%, 40%);">-        csnStream_t arT    = *ar;</span><br><span style="color: hsl(0, 100%, 40%);">-        gint16      nCount = pDescr->i;</span><br><span style="color: hsl(0, 100%, 40%);">-        guint16     nSize  = (guint16)(gint32)pDescr->value;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        pui8 = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-        if (pDescr->type == CSN_VARIABLE_TARRAY)</span><br><span style="color: hsl(0, 100%, 40%);">-        { /* Count specified in field */</span><br><span style="color: hsl(0, 100%, 40%);">-          nCount = *pui8DATA(data, pDescr->i);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-        else if (pDescr->type == CSN_VARIABLE_TARRAY_OFFSET)</span><br><span style="color: hsl(0, 100%, 40%);">-        { /* Count specified in field */</span><br><span style="color: hsl(0, 100%, 40%);">-          nCount = *pui8DATA(data, pDescr->i);</span><br><span style="color: hsl(0, 100%, 40%);">-         /*  nCount--; the 1 offset is already taken into account in CSN_UINT_OFFSET */</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        while (nCount > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        { /* resulting array of length 0 is possible</span><br><span style="color: hsl(0, 100%, 40%);">-           * but no bits shall be read from bitstream</span><br><span style="color: hsl(0, 100%, 40%);">-           */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          LOGPC(DCSN1, LOGL_DEBUG, "%s : | ", pDescr->sz);</span><br><span style="color: hsl(0, 100%, 40%);">-          csnStreamInit(&arT, bit_offset, remaining_bits_len);</span><br><span style="color: hsl(0, 100%, 40%);">-          Status = csnStreamEncoder(&arT, (const CSN_DESCR*)pDescr->descr.ptr, vector, writeIndex, pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-          if (Status >= 0)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            pui8    += nSize;</span><br><span style="color: hsl(0, 100%, 40%);">-            remaining_bits_len = arT.remaining_bits_len;</span><br><span style="color: hsl(0, 100%, 40%);">-            bit_offset         = arT.bit_offset;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-          else</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            return Status;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-          nCount--;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_BITMAP:</span><br><span style="color: hsl(0, 100%, 40%);">-      { /* bitmap with given length. The result is left aligned! */</span><br><span style="color: hsl(0, 100%, 40%);">-        guint8 no_of_bits = (guint8) pDescr->i; /* length of bitmap */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (no_of_bits > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          if (no_of_bits > remaining_bits_len)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            return ProcessError(writeIndex, "csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          if (no_of_bits <= 32)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            for(ib = 0; ib < 4; ib++)</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-              pui8      = pui8DATA(data, pDescr->offset+ib);</span><br><span style="color: hsl(0, 100%, 40%);">-          bitvec_write_field(vector, writeIndex, *pui8, 8);</span><br><span style="color: hsl(0, 100%, 40%);">-              LOGPC(DCSN1, LOGL_DEBUG, "%s[%u] = %u | ", pDescr->sz , ib, (unsigned)*pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-          else if (no_of_bits <= 64)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            for(ib = 0; ib < 8; ib++)</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-              pui8      = pui8DATA(data, pDescr->offset+ib);</span><br><span style="color: hsl(0, 100%, 40%);">-         bitvec_write_field(vector, writeIndex, *pui8, 8);</span><br><span style="color: hsl(0, 100%, 40%);">-              LOGPC(DCSN1, LOGL_DEBUG, "%s[%u] = %u | ", pDescr->sz , ib, (unsigned)*pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-          else</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-                return ProcessError(writeIndex,"csnStreamEncoder NOT IMPLEMENTED", 999, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-          bit_offset += no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-        /* bitmap was successfully extracted or it was empty */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_TYPE:</span><br><span style="color: hsl(0, 100%, 40%);">-      {</span><br><span style="color: hsl(0, 100%, 40%);">-        gint16      Status;</span><br><span style="color: hsl(0, 100%, 40%);">-        csnStream_t arT = *ar;</span><br><span style="color: hsl(0, 100%, 40%);">-        LOGPC(DCSN1, LOGL_DEBUG, " : %s | ", pDescr->sz);</span><br><span style="color: hsl(0, 100%, 40%);">-        csnStreamInit(&arT, bit_offset, remaining_bits_len);</span><br><span style="color: hsl(0, 100%, 40%);">-        Status = csnStreamEncoder(&arT, (const CSN_DESCR*)pDescr->descr.ptr, vector, writeIndex, pvDATA(data, pDescr->offset));</span><br><span style="color: hsl(0, 100%, 40%);">-        LOGPC(DCSN1, LOGL_DEBUG, " : End %s | ", pDescr->sz);</span><br><span style="color: hsl(0, 100%, 40%);">-        if (Status >= 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          remaining_bits_len  = arT.remaining_bits_len;</span><br><span style="color: hsl(0, 100%, 40%);">-          bit_offset          = arT.bit_offset;</span><br><span style="color: hsl(0, 100%, 40%);">-          pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-        else</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          /* Has already been processed: ProcessError("csnStreamEncoder", Status, pDescr);  */</span><br><span style="color: hsl(0, 100%, 40%);">-          return Status;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_CHOICE:</span><br><span style="color: hsl(0, 100%, 40%);">-      {</span><br><span style="color: hsl(0, 100%, 40%);">-        gint16 count = pDescr->i;</span><br><span style="color: hsl(0, 100%, 40%);">-        const CSN_ChoiceElement_t* pChoice = (const CSN_ChoiceElement_t*) pDescr->descr.ptr;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* Make sure that the list of choice items is not empty */</span><br><span style="color: hsl(0, 100%, 40%);">-        if (!count)</span><br><span style="color: hsl(0, 100%, 40%);">-          return ProcessError(writeIndex, "csnStreamEncoder", CSN_ERROR_IN_SCRIPT, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-        else if (count > 255) /* We can handle up to 256 (UCHAR_MAX) selectors */</span><br><span style="color: hsl(0, 100%, 40%);">-          return ProcessError(writeIndex, "csnStreamEncoder", CSN_ERROR_IN_SCRIPT, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* Make sure that choice index is not out of range */</span><br><span style="color: hsl(0, 100%, 40%);">-        pui8 = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-        if (*pui8 >= count)</span><br><span style="color: hsl(0, 100%, 40%);">-          return ProcessError(writeIndex, "csnStreamEncoder", CSN_ERROR_INVALID_UNION_INDEX, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        pChoice += *pui8;</span><br><span style="color: hsl(0, 100%, 40%);">-        guint8 no_of_bits = pChoice->bits;</span><br><span style="color: hsl(0, 100%, 40%);">-        guint8 value = pChoice->value;</span><br><span style="color: hsl(0, 100%, 40%);">-        LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pChoice->descr.sz , (unsigned)value);</span><br><span style="color: hsl(0, 100%, 40%);">-   bitvec_write_field(vector, writeIndex, value, no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        CSN_DESCR   descr[2];</span><br><span style="color: hsl(0, 100%, 40%);">-        gint16      Status;</span><br><span style="color: hsl(0, 100%, 40%);">-        csnStream_t arT = *ar;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        descr[0]      = pChoice->descr;</span><br><span style="color: hsl(0, 100%, 40%);">-        memset(&descr[1], 0x00, sizeof(CSN_DESCR));</span><br><span style="color: hsl(0, 100%, 40%);">-        descr[1].type = CSN_END;</span><br><span style="color: hsl(0, 100%, 40%);">-        bit_offset += no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-        remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        csnStreamInit(&arT, bit_offset, remaining_bits_len);</span><br><span style="color: hsl(0, 100%, 40%);">-        Status = csnStreamEncoder(&arT, descr, vector, writeIndex, data);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (Status >= 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          remaining_bits_len = arT.remaining_bits_len;</span><br><span style="color: hsl(0, 100%, 40%);">-          bit_offset         = arT.bit_offset;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-        else</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          return Status;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   case CSN_SERIALIZE:</span><br><span style="color: hsl(0, 100%, 40%);">-      {</span><br><span style="color: hsl(0, 100%, 40%);">-        StreamSerializeFcn_t serialize = (StreamSerializeFcn_t)pDescr->aux_fn;</span><br><span style="color: hsl(0, 100%, 40%);">-        csnStream_t          arT       = *ar;</span><br><span style="color: hsl(0, 100%, 40%);">-        guint8 length_len              = pDescr->i;</span><br><span style="color: hsl(0, 100%, 40%);">-        gint16               Status = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-        unsigned lengthIndex;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        // store writeIndex for length value (7 bit)</span><br><span style="color: hsl(0, 100%, 40%);">-        lengthIndex = *writeIndex;</span><br><span style="color: hsl(0, 100%, 40%);">-        *writeIndex += length_len;</span><br><span style="color: hsl(0, 100%, 40%);">-        bit_offset += length_len;</span><br><span style="color: hsl(0, 100%, 40%);">-        remaining_bits_len -= length_len;</span><br><span style="color: hsl(0, 100%, 40%);">-        arT.direction = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-        csnStreamInit(&arT, bit_offset, remaining_bits_len);</span><br><span style="color: hsl(0, 100%, 40%);">-        Status = serialize(&arT, vector, writeIndex, pvDATA(data, pDescr->offset));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      bitvec_write_field(vector, &lengthIndex, *writeIndex - lengthIndex - length_len, length_len);</span><br><span style="color: hsl(0, 100%, 40%);">-        LOGPC(DCSN1, LOGL_DEBUG, "%s length = %u | ", pDescr->sz , (unsigned)(*writeIndex - lengthIndex));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (Status >= 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          remaining_bits_len = arT.remaining_bits_len;</span><br><span style="color: hsl(0, 100%, 40%);">-          bit_offset         = arT.bit_offset;</span><br><span style="color: hsl(0, 100%, 40%);">-          pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-        else</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          // Has already been processed:</span><br><span style="color: hsl(0, 100%, 40%);">-          return Status;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_UNION_LH:</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_UNION:</span><br><span style="color: hsl(0, 100%, 40%);">-      {</span><br><span style="color: hsl(0, 100%, 40%);">-        gint16           Bits;</span><br><span style="color: hsl(0, 100%, 40%);">-        guint8           index;</span><br><span style="color: hsl(0, 100%, 40%);">-        gint16           count      = pDescr->i;</span><br><span style="color: hsl(0, 100%, 40%);">-        const CSN_DESCR* pDescrNext = pDescr;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescrNext += count + 1; /* now this is next after the union */</span><br><span style="color: hsl(0, 100%, 40%);">-        if ((count <= 0) || (count > 16))</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_INVALID_UNION_INDEX, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* Now get the bits to extract the index */</span><br><span style="color: hsl(0, 100%, 40%);">-        Bits = ixBitsTab[count];</span><br><span style="color: hsl(0, 100%, 40%);">-        index = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* Assign UnionType */</span><br><span style="color: hsl(0, 100%, 40%);">-        pui8  = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-     //read index from data and write to vector</span><br><span style="color: hsl(0, 100%, 40%);">-      bitvec_write_field(vector, writeIndex, *pui8, Bits);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    //decode index</span><br><span style="color: hsl(0, 100%, 40%);">-        *writeIndex -= Bits;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        while (Bits > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          index <<= 1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          if (CSN_UNION_LH == pDescr->type)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            index |= get_masked_bits8(vector, writeIndex, bit_offset, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-          else</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            index |= bitvec_read_field(vector, writeIndex, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          remaining_bits_len--;</span><br><span style="color: hsl(0, 100%, 40%);">-          bit_offset++;</span><br><span style="color: hsl(0, 100%, 40%);">-          Bits--;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        *writeIndex -= Bits;</span><br><span style="color: hsl(0, 100%, 40%);">-   bitvec_write_field(vector, writeIndex, index, Bits);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* script index to continue on, limited in case we do not have a power of 2 */</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr += (MIN(index + 1, count));</span><br><span style="color: hsl(0, 100%, 40%);">-        LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)index);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        switch (pDescr->type)</span><br><span style="color: hsl(0, 100%, 40%);">-        { /* get the right element of the union based on computed index */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          case CSN_BIT:</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            pui8  = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-            bitvec_write_field(vector, writeIndex, *pui8, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-            remaining_bits_len--;</span><br><span style="color: hsl(0, 100%, 40%);">-            bit_offset++;</span><br><span style="color: hsl(0, 100%, 40%);">-            pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-            break;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          case CSN_NULL:</span><br><span style="color: hsl(0, 100%, 40%);">-          { /* Empty member! */</span><br><span style="color: hsl(0, 100%, 40%);">-            pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-            break;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          case CSN_UINT:</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            guint8 no_of_bits = (guint8) pDescr->i;</span><br><span style="color: hsl(0, 100%, 40%);">-            if (remaining_bits_len >= no_of_bits)</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-              if (no_of_bits <= 8)</span><br><span style="color: hsl(0, 100%, 40%);">-              {</span><br><span style="color: hsl(0, 100%, 40%);">-                pui8      = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-            bitvec_write_field(vector, writeIndex, *pui8, no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-              else if (no_of_bits <= 16)</span><br><span style="color: hsl(0, 100%, 40%);">-              {</span><br><span style="color: hsl(0, 100%, 40%);">-                pui16       = pui16DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-          bitvec_write_field(vector, writeIndex, *pui16, no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , *pui16);</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-              else if (no_of_bits <= 32)</span><br><span style="color: hsl(0, 100%, 40%);">-              {</span><br><span style="color: hsl(0, 100%, 40%);">-                pui32       = pui32DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-          bitvec_write_field(vector, writeIndex, *pui32, no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , *pui32);</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-              else</span><br><span style="color: hsl(0, 100%, 40%);">-              {</span><br><span style="color: hsl(0, 100%, 40%);">-                return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_GENERAL, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-            else</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-              return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_GENERAL, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-            bit_offset += no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-            pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-            break;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          case CSN_UINT_OFFSET:</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            guint8 no_of_bits = (guint8) pDescr->i;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            if (remaining_bits_len >= no_of_bits)</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-              if (no_of_bits <= 8)</span><br><span style="color: hsl(0, 100%, 40%);">-              {</span><br><span style="color: hsl(0, 100%, 40%);">-                pui8      = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-         bitvec_write_field(vector, writeIndex, *pui8 - (guint8)pDescr->descr.value, no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)(*pui8 - (guint8)pDescr->descr.value));</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-              else if (no_of_bits <= 16)</span><br><span style="color: hsl(0, 100%, 40%);">-              {</span><br><span style="color: hsl(0, 100%, 40%);">-                pui16       = pui16DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-              bitvec_write_field(vector, writeIndex, *pui16 - (guint16)pDescr->descr.value, no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned short)(*pui16 - (guint16)pDescr->descr.value));</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-              else if (no_of_bits <= 32)</span><br><span style="color: hsl(0, 100%, 40%);">-              {</span><br><span style="color: hsl(0, 100%, 40%);">-                pui32       = pui32DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-            bitvec_write_field(vector, writeIndex, *pui32 - (guint16)pDescr->descr.value, no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned int)(*pui32 - (guint16)pDescr->descr.value));</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-              else</span><br><span style="color: hsl(0, 100%, 40%);">-              {</span><br><span style="color: hsl(0, 100%, 40%);">-                return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_GENERAL, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-            else</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-              return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-            bit_offset += no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-            pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-            break;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          case CSN_UINT_LH:</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            guint8 no_of_bits = (guint8) pDescr->i;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            if (remaining_bits_len >= no_of_bits)</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-              remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-              if (no_of_bits <= 8)</span><br><span style="color: hsl(0, 100%, 40%);">-              {</span><br><span style="color: hsl(0, 100%, 40%);">-                pui8      = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-         bitvec_write_field(vector, writeIndex, *pui8, no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-                // TODO : Change get_masked_bits8()</span><br><span style="color: hsl(0, 100%, 40%);">-                *writeIndex -= no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-                guint8 ui8 = get_masked_bits8(vector, writeIndex, bit_offset, no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-                *writeIndex -= no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-             bitvec_write_field(vector, writeIndex, ui8, no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-              else</span><br><span style="color: hsl(0, 100%, 40%);">-              {/* Maybe we should support more than 8 bits ? */</span><br><span style="color: hsl(0, 100%, 40%);">-                return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_GENERAL, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-            else</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-              return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-            bit_offset += no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-            pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-            break;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          case CSN_UINT_ARRAY:</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            guint8  no_of_bits  = (guint8) pDescr->i;</span><br><span style="color: hsl(0, 100%, 40%);">-            guint16 nCount = (guint16)pDescr->descr.value; /* nCount supplied by value i.e. M_UINT_ARRAY(...) */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            if (pDescr->value != 0)</span><br><span style="color: hsl(0, 100%, 40%);">-            { /* nCount specified by a reference to field holding value i.e. M_VAR_UINT_ARRAY(...) */</span><br><span style="color: hsl(0, 100%, 40%);">-              nCount = *pui16DATA(data, nCount);</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            if (remaining_bits_len >= (no_of_bits * nCount))</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-              if (no_of_bits <= 8)</span><br><span style="color: hsl(0, 100%, 40%);">-              {</span><br><span style="color: hsl(0, 100%, 40%);">-                pui8 = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-                do</span><br><span style="color: hsl(0, 100%, 40%);">-                {</span><br><span style="color: hsl(0, 100%, 40%);">-               bitvec_write_field(vector, writeIndex, *pui8, no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-                  LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-                  pui8++;</span><br><span style="color: hsl(0, 100%, 40%);">-                  remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-                  bit_offset += no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-                } while (--nCount > 0);</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-              else if (no_of_bits <= 16)</span><br><span style="color: hsl(0, 100%, 40%);">-              {</span><br><span style="color: hsl(0, 100%, 40%);">-                return ProcessError(writeIndex,"csnStreamEncoder NOTIMPLEMENTED", 999, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-              else if (no_of_bits <= 32)</span><br><span style="color: hsl(0, 100%, 40%);">-              {</span><br><span style="color: hsl(0, 100%, 40%);">-                return ProcessError(writeIndex,"csnStreamEncoder NOTIMPLEMENTED", 999, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-              else</span><br><span style="color: hsl(0, 100%, 40%);">-              {</span><br><span style="color: hsl(0, 100%, 40%);">-                return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_GENERAL, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-            else</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-              return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-            pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-            break;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          case CSN_VARIABLE_TARRAY_OFFSET:</span><br><span style="color: hsl(0, 100%, 40%);">-          case CSN_VARIABLE_TARRAY:</span><br><span style="color: hsl(0, 100%, 40%);">-          case CSN_TYPE_ARRAY:</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            gint16      Status;</span><br><span style="color: hsl(0, 100%, 40%);">-            csnStream_t arT    = *ar;</span><br><span style="color: hsl(0, 100%, 40%);">-            gint16      nCount = pDescr->i;</span><br><span style="color: hsl(0, 100%, 40%);">-            guint16     nSize  = (guint16)(gint32)pDescr->value;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            pui8 = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-            if (pDescr->type == CSN_VARIABLE_TARRAY)</span><br><span style="color: hsl(0, 100%, 40%);">-            { /* Count specified in field */</span><br><span style="color: hsl(0, 100%, 40%);">-              nCount = *pui8DATA(data, pDescr->i);</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-            else if (pDescr->type == CSN_VARIABLE_TARRAY_OFFSET)</span><br><span style="color: hsl(0, 100%, 40%);">-            { /* Count specified in field */</span><br><span style="color: hsl(0, 100%, 40%);">-              nCount = *pui8DATA(data, pDescr->i);</span><br><span style="color: hsl(0, 100%, 40%);">-              /*  nCount--; the 1 offset is already taken into account in CSN_UINT_OFFSET */</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            while (nCount > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-            { /* resulting array of length 0 is possible</span><br><span style="color: hsl(0, 100%, 40%);">-               * but no bits shall be read from bitstream</span><br><span style="color: hsl(0, 100%, 40%);">-               */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-              LOGPC(DCSN1, LOGL_DEBUG, "%s : | ", pDescr->sz);</span><br><span style="color: hsl(0, 100%, 40%);">-              csnStreamInit(&arT, bit_offset, remaining_bits_len);</span><br><span style="color: hsl(0, 100%, 40%);">-              Status = csnStreamEncoder(&arT, (const CSN_DESCR*)pDescr->descr.ptr, vector, writeIndex, pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-              if (Status >= 0)</span><br><span style="color: hsl(0, 100%, 40%);">-              {</span><br><span style="color: hsl(0, 100%, 40%);">-                pui8    += nSize;</span><br><span style="color: hsl(0, 100%, 40%);">-                remaining_bits_len = arT.remaining_bits_len;</span><br><span style="color: hsl(0, 100%, 40%);">-                bit_offset         = arT.bit_offset;</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-              else</span><br><span style="color: hsl(0, 100%, 40%);">-              {</span><br><span style="color: hsl(0, 100%, 40%);">-                return Status;</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-              nCount--;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-            break;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          case CSN_BITMAP:</span><br><span style="color: hsl(0, 100%, 40%);">-          { /* bitmap with given length. The result is left aligned! */</span><br><span style="color: hsl(0, 100%, 40%);">-            guint8 no_of_bits = (guint8) pDescr->i; /* length of bitmap */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            if (no_of_bits > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-              if (no_of_bits > remaining_bits_len)</span><br><span style="color: hsl(0, 100%, 40%);">-              {</span><br><span style="color: hsl(0, 100%, 40%);">-                return ProcessError(writeIndex, "csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-              if (no_of_bits <= 32)</span><br><span style="color: hsl(0, 100%, 40%);">-              {</span><br><span style="color: hsl(0, 100%, 40%);">-                pui32 = pui32DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-            bitvec_write_field(vector, writeIndex, *pui32, no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , *pui32);</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-              else if (no_of_bits <= 64)</span><br><span style="color: hsl(0, 100%, 40%);">-              {</span><br><span style="color: hsl(0, 100%, 40%);">-                pui64 = pui64DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-                bitvec_write_field(vector, writeIndex, *pui64, no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGPC(DCSN1, LOGL_DEBUG, "%s = %lu | ", pDescr->sz , *pui64);</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-              else</span><br><span style="color: hsl(0, 100%, 40%);">-              {</span><br><span style="color: hsl(0, 100%, 40%);">-                   return ProcessError(writeIndex,"csnStreamEncoder NOT IMPLEMENTED", 999, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-              remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-              bit_offset += no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-            /* bitmap was successfully extracted or it was empty */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-            break;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          case CSN_TYPE:</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            gint16      Status;</span><br><span style="color: hsl(0, 100%, 40%);">-            csnStream_t arT = *ar;</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGPC(DCSN1, LOGL_DEBUG, " : %s | ", pDescr->sz);</span><br><span style="color: hsl(0, 100%, 40%);">-            csnStreamInit(&arT, bit_offset, remaining_bits_len);</span><br><span style="color: hsl(0, 100%, 40%);">-            Status = csnStreamEncoder(&arT, (const CSN_DESCR*)pDescr->descr.ptr, vector, writeIndex, pvDATA(data, pDescr->offset));</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGPC(DCSN1, LOGL_DEBUG, " : End %s | ", pDescr->sz);</span><br><span style="color: hsl(0, 100%, 40%);">-            if (Status >= 0)</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-              remaining_bits_len  = arT.remaining_bits_len;</span><br><span style="color: hsl(0, 100%, 40%);">-              bit_offset          = arT.bit_offset;</span><br><span style="color: hsl(0, 100%, 40%);">-              pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-            else</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-              /* Has already been processed: ProcessError("csnStreamEncoder", Status, pDescr);  */</span><br><span style="color: hsl(0, 100%, 40%);">-              return Status;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            break;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          default:</span><br><span style="color: hsl(0, 100%, 40%);">-          { /* descriptions of union elements other than above are illegal */</span><br><span style="color: hsl(0, 100%, 40%);">-            return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_IN_SCRIPT, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr = pDescrNext;</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_EXIST:</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_EXIST_LH:</span><br><span style="color: hsl(0, 100%, 40%);">-      {</span><br><span style="color: hsl(0, 100%, 40%);">-        guint8 fExist;</span><br><span style="color: hsl(0, 100%, 40%);">-        unsigned exist = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-        pui8  = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-        exist = *pui8;</span><br><span style="color: hsl(0, 100%, 40%);">-      bitvec_write_field(vector, writeIndex, *pui8, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-        writeIndex--;</span><br><span style="color: hsl(0, 100%, 40%);">-        if (CSN_EXIST_LH == pDescr->type)</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          fExist = get_masked_bits8(vector, writeIndex, bit_offset, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-        else</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          fExist = bitvec_read_field(vector, writeIndex, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-        writeIndex--;</span><br><span style="color: hsl(0, 100%, 40%);">-      bitvec_write_field(vector, writeIndex, fExist, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-        LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz, (unsigned)fExist);</span><br><span style="color: hsl(0, 100%, 40%);">-        remaining_bits_len--;</span><br><span style="color: hsl(0, 100%, 40%);">-        bit_offset++;</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (!exist)</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          ar->remaining_bits_len  = remaining_bits_len;</span><br><span style="color: hsl(0, 100%, 40%);">-          ar->bit_offset          = bit_offset;</span><br><span style="color: hsl(0, 100%, 40%);">-          return remaining_bits_len;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_NEXT_EXIST:</span><br><span style="color: hsl(0, 100%, 40%);">-      {</span><br><span style="color: hsl(0, 100%, 40%);">-        guint8 fExist;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        pui8  = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* this if-statement represents the M_NEXT_EXIST_OR_NULL description element */</span><br><span style="color: hsl(0, 100%, 40%);">-        if ((pDescr->may_be_null) && (remaining_bits_len == 0))</span><br><span style="color: hsl(0, 100%, 40%);">-        { /* no more bits to decode is fine here - end of message detected and allowed */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          /* Skip i entries + this entry */</span><br><span style="color: hsl(0, 100%, 40%);">-          pDescr += pDescr->i + 1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          break;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   bitvec_write_field(vector, writeIndex, *pui8, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-        fExist = *pui8;</span><br><span style="color: hsl(0, 100%, 40%);">-        LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        remaining_bits_len--;</span><br><span style="color: hsl(0, 100%, 40%);">-        bit_offset++;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (fExist == 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        { /* Skip 'i' entries */</span><br><span style="color: hsl(0, 100%, 40%);">-          pDescr += pDescr->i;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_NEXT_EXIST_LH:</span><br><span style="color: hsl(0, 100%, 40%);">-      {</span><br><span style="color: hsl(0, 100%, 40%);">-        guint8 fExist;</span><br><span style="color: hsl(0, 100%, 40%);">-        pui8  = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* this if-statement represents the M_NEXT_EXIST_OR_NULL_LH description element */</span><br><span style="color: hsl(0, 100%, 40%);">-        if ((pDescr->descr.ptr != NULL) && (remaining_bits_len == 0))</span><br><span style="color: hsl(0, 100%, 40%);">-        { /* no more bits to decode is fine here - end of message detected and allowed */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          /* skip 'i' entries + this entry */</span><br><span style="color: hsl(0, 100%, 40%);">-          pDescr += pDescr->i + 1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          /* set the data member to "not exist" */</span><br><span style="color: hsl(0, 100%, 40%);">-          //*pui8 = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-          break;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* the "regular" M_NEXT_EXIST_LH description element */</span><br><span style="color: hsl(0, 100%, 40%);">-       bitvec_write_field(vector, writeIndex, *pui8, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-        writeIndex--;</span><br><span style="color: hsl(0, 100%, 40%);">-        fExist = get_masked_bits8(vector, writeIndex, bit_offset, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-        writeIndex--;</span><br><span style="color: hsl(0, 100%, 40%);">-        bitvec_write_field(vector, writeIndex, fExist, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-        pui8++;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        remaining_bits_len--;</span><br><span style="color: hsl(0, 100%, 40%);">-        bit_offset++;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (fExist == 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        { /* Skip 'i' entries */</span><br><span style="color: hsl(0, 100%, 40%);">-          pDescr += pDescr->i;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_VARIABLE_BITMAP_1:</span><br><span style="color: hsl(0, 100%, 40%);">-      { /* Bitmap from here and to the end of message */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        //*pui8DATA(data, (gint16)pDescr->descr.value) = (guint8) remaining_bits_len; /* length of bitmap == remaining bits */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /*no break -</span><br><span style="color: hsl(0, 100%, 40%);">-         * with a length set we have a regular variable length bitmap so we continue */</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-      /* FALL THROUGH */</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_VARIABLE_BITMAP:</span><br><span style="color: hsl(0, 100%, 40%);">-      { /* {CSN_VARIABLE_BITMAP, 0, offsetof(_STRUCT, _ElementCountField), offsetof(_STRUCT, _MEMBER), #_MEMBER}</span><br><span style="color: hsl(0, 100%, 40%);">-         * <N: bit (5)> <bitmap: bit(N + offset)></span><br><span style="color: hsl(0, 100%, 40%);">-         * Bit array with length (in bits) specified in parameter (pDescr->descr)</span><br><span style="color: hsl(0, 100%, 40%);">-         * The result is right aligned!</span><br><span style="color: hsl(0, 100%, 40%);">-         */</span><br><span style="color: hsl(0, 100%, 40%);">-        gint16 no_of_bits = *pui8DATA(data, (gint16)pDescr->descr.value);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        no_of_bits += pDescr->i; /* adjusted by offset */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (no_of_bits > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          if (remaining_bits_len < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          { /* extract bits */</span><br><span style="color: hsl(0, 100%, 40%);">-            guint8* pui8 = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-            gint16 nB1  = no_of_bits & 0x07;/* no_of_bits Mod 8 */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            if (nB1 > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-            { /* take care of the first byte - it will be right aligned */</span><br><span style="color: hsl(0, 100%, 40%);">-             bitvec_write_field(vector, writeIndex, *pui8, nB1);</span><br><span style="color: hsl(0, 100%, 40%);">-              LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-              pui8++;</span><br><span style="color: hsl(0, 100%, 40%);">-              no_of_bits  -= nB1;</span><br><span style="color: hsl(0, 100%, 40%);">-              bit_offset += nB1; /* (nB1 is no_of_bits Mod 8) */</span><br><span style="color: hsl(0, 100%, 40%);">-              remaining_bits_len -= nB1;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            /* remaining no_of_bits is a multiple of 8 or 0 */</span><br><span style="color: hsl(0, 100%, 40%);">-            while (no_of_bits > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-          bitvec_write_field(vector, writeIndex, *pui8, 8);</span><br><span style="color: hsl(0, 100%, 40%);">-              LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-              pui8++;</span><br><span style="color: hsl(0, 100%, 40%);">-              no_of_bits -= 8;</span><br><span style="color: hsl(0, 100%, 40%);">-              remaining_bits_len -= 8;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_LEFT_ALIGNED_VAR_BMP_1:</span><br><span style="color: hsl(0, 100%, 40%);">-      { /* Bitmap from here and to the end of message */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        //*pui8DATA(data, (gint16)pDescr->descr.value) = (guint8) remaining_bits_len; /* length of bitmap == remaining bits */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* no break -</span><br><span style="color: hsl(0, 100%, 40%);">-         * with a length set we have a regular left aligned variable length bitmap so we continue</span><br><span style="color: hsl(0, 100%, 40%);">-         */</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-      /* FALL THROUGH */</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_LEFT_ALIGNED_VAR_BMP:</span><br><span style="color: hsl(0, 100%, 40%);">-      { /* {CSN_LEFT_ALIGNED_VAR_BMP, _OFFSET, (void*)offsetof(_STRUCT, _ElementCountField), offsetof(_STRUCT, _MEMBER), #_MEMBER}</span><br><span style="color: hsl(0, 100%, 40%);">-         * <N: bit (5)> <bitmap: bit(N + offset)></span><br><span style="color: hsl(0, 100%, 40%);">-         * bit array with length (in bits) specified in parameter (pDescr->descr)</span><br><span style="color: hsl(0, 100%, 40%);">-         */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        gint16 no_of_bits = *pui8DATA(data, (gint16)pDescr->descr.value);/* Size of bitmap */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        no_of_bits += pDescr->i;/* size adjusted by offset */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (no_of_bits > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          if (remaining_bits_len < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          { /* extract bits */</span><br><span style="color: hsl(0, 100%, 40%);">-            guint8* pui8 = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-            gint16 nB1  = no_of_bits & 0x07;/* no_of_bits Mod 8 */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            while (no_of_bits > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-              bitvec_write_field(vector, writeIndex, *pui8, 8);</span><br><span style="color: hsl(0, 100%, 40%);">-              LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-              pui8++;</span><br><span style="color: hsl(0, 100%, 40%);">-              no_of_bits -= 8;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-            if (nB1 > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-       bitvec_write_field(vector, writeIndex, *pui8, nB1);</span><br><span style="color: hsl(0, 100%, 40%);">-              LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-              pui8++;</span><br><span style="color: hsl(0, 100%, 40%);">-              no_of_bits  -= nB1;</span><br><span style="color: hsl(0, 100%, 40%);">-              bit_offset += nB1; /* (nB1 is no_of_bits Mod 8) */</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* bitmap was successfully extracted or it was empty */</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_PADDING_BITS:</span><br><span style="color: hsl(0, 100%, 40%);">-      { /* Padding from here and to the end of message */</span><br><span style="color: hsl(0, 100%, 40%);">-        LOGPC(DCSN1, LOGL_DEBUG, "%s = ", pDescr->sz);</span><br><span style="color: hsl(0, 100%, 40%);">-        guint8 filler = 0x2b;</span><br><span style="color: hsl(0, 100%, 40%);">-        if (remaining_bits_len > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          while (remaining_bits_len > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            guint8 bits_to_handle = remaining_bits_len%8;</span><br><span style="color: hsl(0, 100%, 40%);">-            if (bits_to_handle > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-              /* section 11 of 44.060</span><br><span style="color: hsl(0, 100%, 40%);">-               * The padding bits may be the 'null' string. Otherwise, the</span><br><span style="color: hsl(0, 100%, 40%);">-               * padding bits starts with bit '0', followed by 'spare padding'</span><br><span style="color: hsl(0, 100%, 40%);">-               * < padding bits > ::= { null | 0 < spare padding > ! < Ignore : 1 bit** = < no string > > } ;</span><br><span style="color: hsl(0, 100%, 40%);">-              */</span><br><span style="color: hsl(0, 100%, 40%);">-              guint8 fl = filler&(0xff>>(8-bits_to_handle + 1));</span><br><span style="color: hsl(0, 100%, 40%);">-       bitvec_write_field(vector, writeIndex, fl, bits_to_handle);</span><br><span style="color: hsl(0, 100%, 40%);">-              LOGPC(DCSN1, LOGL_DEBUG, "%u|", fl);</span><br><span style="color: hsl(0, 100%, 40%);">-              remaining_bits_len -= bits_to_handle;</span><br><span style="color: hsl(0, 100%, 40%);">-              bit_offset += bits_to_handle;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-            else if (bits_to_handle == 0)</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-        bitvec_write_field(vector, writeIndex, filler, 8);</span><br><span style="color: hsl(0, 100%, 40%);">-              LOGPC(DCSN1, LOGL_DEBUG, "%u|", filler);</span><br><span style="color: hsl(0, 100%, 40%);">-              remaining_bits_len -= 8;</span><br><span style="color: hsl(0, 100%, 40%);">-              bit_offset += 8;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-        if (remaining_bits_len < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* Padding was successfully extracted or it was empty */</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_VARIABLE_ARRAY:</span><br><span style="color: hsl(0, 100%, 40%);">-      { /* {int type; int i; void* descr; int offset; const char* sz; } CSN_DESCR;</span><br><span style="color: hsl(0, 100%, 40%);">-         * {CSN_VARIABLE_ARRAY, _OFFSET, (void*)offsetof(_STRUCT, _ElementCountField), offsetof(_STRUCT, _MEMBER), #_MEMBER}</span><br><span style="color: hsl(0, 100%, 40%);">-         * Array with length specified in parameter:</span><br><span style="color: hsl(0, 100%, 40%);">-         *  <count: bit (x)></span><br><span style="color: hsl(0, 100%, 40%);">-         *  <list: octet(count + offset)></span><br><span style="color: hsl(0, 100%, 40%);">-         */</span><br><span style="color: hsl(0, 100%, 40%);">-        gint16 count = *pui8DATA(data, (gint16)pDescr->descr.value);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        count += pDescr->i; /* Adjusted by offset */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (count > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        {</span><br><span style="color: hsl(0, 100%, 40%);">-          if (remaining_bits_len < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          pui8 = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          while (count > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-           bitvec_write_field(vector, writeIndex, *pui8, 8);</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGPC(DCSN1, LOGL_DEBUG, "%s = 0x%x | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-            pui8++;</span><br><span style="color: hsl(0, 100%, 40%);">-            bit_offset += 8;</span><br><span style="color: hsl(0, 100%, 40%);">-            remaining_bits_len -= 8;</span><br><span style="color: hsl(0, 100%, 40%);">-            count--;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_RECURSIVE_ARRAY:</span><br><span style="color: hsl(0, 100%, 40%);">-      { /* Recursive way to specify an array: <list> ::= {1 <number: bit (4)> <list> | 0}</span><br><span style="color: hsl(0, 100%, 40%);">-         *  or more generally:                <list> ::= { <tag> <element> <list> | <EndTag> }</span><br><span style="color: hsl(0, 100%, 40%);">-         *  where <element> ::= bit(value)</span><br><span style="color: hsl(0, 100%, 40%);">-         *        <tag>     ::= 0 | 1</span><br><span style="color: hsl(0, 100%, 40%);">-         *        <EndTag>  ::= reversed tag i.e. tag == 1 -> EndTag == 0 and vice versa</span><br><span style="color: hsl(0, 100%, 40%);">-         * {CSN_RECURSIVE_ARRAY, _BITS, (void*)offsetof(_STRUCT, _ElementCountField), offsetof(_STRUCT, _MEMBER), #_MEMBER}</span><br><span style="color: hsl(0, 100%, 40%);">-         * REMARK: recursive way to specify an array but an iterative implementation!</span><br><span style="color: hsl(0, 100%, 40%);">-         */</span><br><span style="color: hsl(0, 100%, 40%);">-        gint16 no_of_bits        = pDescr->i;</span><br><span style="color: hsl(0, 100%, 40%);">-        guint8  ElementCount = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-        pui8  = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-        ElementCount = *pui8DATA(data, (gint16)pDescr->descr.value);</span><br><span style="color: hsl(0, 100%, 40%);">-        while (ElementCount > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        { /* tag control shows existence of next list elements */</span><br><span style="color: hsl(0, 100%, 40%);">-         bitvec_write_field(vector, writeIndex, Tag, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-          LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)Tag);</span><br><span style="color: hsl(0, 100%, 40%);">-          bit_offset++;</span><br><span style="color: hsl(0, 100%, 40%);">-          remaining_bits_len--;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          /* extract and store no_of_bits long element from bitstream */</span><br><span style="color: hsl(0, 100%, 40%);">-         bitvec_write_field(vector, writeIndex, *pui8, no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-          LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-          pui8++;</span><br><span style="color: hsl(0, 100%, 40%);">-          ElementCount--;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          if (remaining_bits_len < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          bit_offset += no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-          remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    bitvec_write_field(vector, writeIndex, !Tag, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-        LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)(!Tag));</span><br><span style="color: hsl(0, 100%, 40%);">-        bit_offset++;</span><br><span style="color: hsl(0, 100%, 40%);">-        remaining_bits_len--;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_RECURSIVE_TARRAY:</span><br><span style="color: hsl(0, 100%, 40%);">-      { /* Recursive way to specify an array of type: <lists> ::= { 1 <type> } ** 0 ;</span><br><span style="color: hsl(0, 100%, 40%);">-         *  M_REC_TARRAY(_STRUCT, _MEMBER, _MEMBER_TYPE, _ElementCountField)</span><br><span style="color: hsl(0, 100%, 40%);">-         * {t, offsetof(_STRUCT, _ElementCountField), (void*)CSNDESCR_##_MEMBER_TYPE, offsetof(_STRUCT, _MEMBER), #_MEMBER, (StreamSerializeFcn_t)sizeof(_MEMBER_TYPE)}</span><br><span style="color: hsl(0, 100%, 40%);">-         */</span><br><span style="color: hsl(0, 100%, 40%);">-        gint16 nSizeElement = (gint16)(gint32)pDescr->value;</span><br><span style="color: hsl(0, 100%, 40%);">-        guint8  ElementCount = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-        pui8  = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-        /* Store the counted number of elements of the array */</span><br><span style="color: hsl(0, 100%, 40%);">-        ElementCount = *pui8DATA(data, (gint16)(gint32)pDescr->i);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        while (ElementCount > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        { /* tag control shows existence of next list elements */</span><br><span style="color: hsl(0, 100%, 40%);">-      bitvec_write_field(vector, writeIndex, Tag, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-          LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)Tag);</span><br><span style="color: hsl(0, 100%, 40%);">-          bit_offset++;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          remaining_bits_len--;</span><br><span style="color: hsl(0, 100%, 40%);">-          ElementCount--;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          { /* unpack the following data structure */</span><br><span style="color: hsl(0, 100%, 40%);">-            csnStream_t arT = *ar;</span><br><span style="color: hsl(0, 100%, 40%);">-            gint16      Status;</span><br><span style="color: hsl(0, 100%, 40%);">-            csnStreamInit(&arT, bit_offset, remaining_bits_len);</span><br><span style="color: hsl(0, 100%, 40%);">-            Status = csnStreamEncoder(&arT, (const CSN_DESCR*)pDescr->descr.ptr, vector, writeIndex, pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            if (Status >= 0)</span><br><span style="color: hsl(0, 100%, 40%);">-            { /* successful completion */</span><br><span style="color: hsl(0, 100%, 40%);">-              pui8    += nSizeElement;  /* -> to next data element */</span><br><span style="color: hsl(0, 100%, 40%);">-              remaining_bits_len = arT.remaining_bits_len;</span><br><span style="color: hsl(0, 100%, 40%);">-              bit_offset         = arT.bit_offset;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-            else</span><br><span style="color: hsl(0, 100%, 40%);">-            { /* something went awry */</span><br><span style="color: hsl(0, 100%, 40%);">-              return Status;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          if (remaining_bits_len < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  bitvec_write_field(vector, writeIndex, !Tag, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-        LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)(!Tag));</span><br><span style="color: hsl(0, 100%, 40%);">-        bit_offset++;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_RECURSIVE_TARRAY_2:</span><br><span style="color: hsl(0, 100%, 40%);">-      { /* Recursive way to specify an array of type: <list> ::= <type> { 0 <type> } ** 1 ; */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        Tag = REVERSED_TAG;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* NO break -</span><br><span style="color: hsl(0, 100%, 40%);">-         * handling is exactly the same as for CSN_RECURSIVE_TARRAY_1 so we continue</span><br><span style="color: hsl(0, 100%, 40%);">-         */</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-      /* FALL THROUGH */</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_RECURSIVE_TARRAY_1:</span><br><span style="color: hsl(0, 100%, 40%);">-      { /* Recursive way to specify an array of type: <lists> ::= <type> { 1 <type> } ** 0 ;</span><br><span style="color: hsl(0, 100%, 40%);">-         * M_REC_TARRAY(_STRUCT, _MEMBER, _MEMBER_TYPE, _ElementCountField)</span><br><span style="color: hsl(0, 100%, 40%);">-         * {t, offsetof(_STRUCT, _ElementCountField), (void*)CSNDESCR_##_MEMBER_TYPE, offsetof(_STRUCT, _MEMBER), #_MEMBER, (StreamSerializeFcn_t)sizeof(_MEMBER_TYPE)}</span><br><span style="color: hsl(0, 100%, 40%);">-         */</span><br><span style="color: hsl(0, 100%, 40%);">-        gint16      nSizeElement = (gint16)(gint32)pDescr->value;</span><br><span style="color: hsl(0, 100%, 40%);">-        guint8      ElementCount = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-        guint8      ElementNum   = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-        csnStream_t arT          = *ar;</span><br><span style="color: hsl(0, 100%, 40%);">-        gint16      Status;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        pui8  = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-        /* Store the count of the array */</span><br><span style="color: hsl(0, 100%, 40%);">-        ElementCount = *pui8DATA(data, pDescr->i);</span><br><span style="color: hsl(0, 100%, 40%);">-        ElementNum = ElementCount;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        while (ElementCount > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        { /* get data element */</span><br><span style="color: hsl(0, 100%, 40%);">-          if (ElementCount != ElementNum)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-       bitvec_write_field(vector, writeIndex, Tag, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)Tag);</span><br><span style="color: hsl(0, 100%, 40%);">-            bit_offset++;</span><br><span style="color: hsl(0, 100%, 40%);">-            remaining_bits_len--;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-          ElementCount--;</span><br><span style="color: hsl(0, 100%, 40%);">-          LOGPC(DCSN1, LOGL_DEBUG, "%s { | ", pDescr->sz);</span><br><span style="color: hsl(0, 100%, 40%);">-          csnStreamInit(&arT, bit_offset, remaining_bits_len);</span><br><span style="color: hsl(0, 100%, 40%);">-          Status = csnStreamEncoder(&arT, (const CSN_DESCR*)pDescr->descr.ptr, vector, writeIndex, pui8);</span><br><span style="color: hsl(0, 100%, 40%);">-          LOGPC(DCSN1, LOGL_DEBUG, "%s } | ", pDescr->sz);</span><br><span style="color: hsl(0, 100%, 40%);">-          if (Status >= 0)</span><br><span style="color: hsl(0, 100%, 40%);">-          { /* successful completion */</span><br><span style="color: hsl(0, 100%, 40%);">-            pui8    += nSizeElement;  /* -> to next */</span><br><span style="color: hsl(0, 100%, 40%);">-            remaining_bits_len = arT.remaining_bits_len;</span><br><span style="color: hsl(0, 100%, 40%);">-            bit_offset         = arT.bit_offset;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-          else</span><br><span style="color: hsl(0, 100%, 40%);">-          { /* something went awry */</span><br><span style="color: hsl(0, 100%, 40%);">-            return Status;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          if (remaining_bits_len < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-            return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-       bitvec_write_field(vector, writeIndex, !Tag, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-        bit_offset++;</span><br><span style="color: hsl(0, 100%, 40%);">-        remaining_bits_len--;</span><br><span style="color: hsl(0, 100%, 40%);">-        Tag = STANDARD_TAG; /* in case it was set to "reversed" */</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_FIXED:</span><br><span style="color: hsl(0, 100%, 40%);">-      { /* Verify the fixed bits */</span><br><span style="color: hsl(0, 100%, 40%);">-        guint8  no_of_bits = (guint8) pDescr->i;</span><br><span style="color: hsl(0, 100%, 40%);">- bitvec_write_field(vector, writeIndex, pDescr->offset, no_of_bits);</span><br><span style="color: hsl(0, 100%, 40%);">-        LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)pDescr->offset);</span><br><span style="color: hsl(0, 100%, 40%);">-        remaining_bits_len   -= no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-        bit_offset += no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_CALLBACK:</span><br><span style="color: hsl(0, 100%, 40%);">-      {</span><br><span style="color: hsl(0, 100%, 40%);">-        guint16  no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-        DissectorCallbackFcn_t callback = (DissectorCallbackFcn_t)pDescr->aux_fn;</span><br><span style="color: hsl(0, 100%, 40%);">-        LOGPC(DCSN1, LOGL_DEBUG, "CSN_CALLBACK(%s) | ", pDescr->sz);</span><br><span style="color: hsl(0, 100%, 40%);">-        no_of_bits = callback(vector, writeIndex, pvDATA(data, pDescr->i), pvDATA(data, pDescr->offset));</span><br><span style="color: hsl(0, 100%, 40%);">-        remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-        bit_offset += no_of_bits;</span><br><span style="color: hsl(0, 100%, 40%);">-        pDescr++;</span><br><span style="color: hsl(0, 100%, 40%);">-        break;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_TRAP_ERROR:</span><br><span style="color: hsl(0, 100%, 40%);">-      {</span><br><span style="color: hsl(0, 100%, 40%);">-        return ProcessError(writeIndex,"csnStreamEncoder", pDescr->i, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      case CSN_END:</span><br><span style="color: hsl(0, 100%, 40%);">-      {</span><br><span style="color: hsl(0, 100%, 40%);">-        ar->remaining_bits_len  = remaining_bits_len;</span><br><span style="color: hsl(0, 100%, 40%);">-        ar->bit_offset = bit_offset;</span><br><span style="color: hsl(0, 100%, 40%);">-        return remaining_bits_len;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      default:</span><br><span style="color: hsl(0, 100%, 40%);">-      {</span><br><span style="color: hsl(0, 100%, 40%);">-        assert(0);</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  } while (remaining_bits_len >= 0);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span>diff --git a/src/csn1.h b/src/csn1.h</span><br><span>index 761293d..d470228 100644</span><br><span>--- a/src/csn1.h</span><br><span>+++ b/src/csn1.h</span><br><span>@@ -592,4 +592,18 @@</span><br><span> </span><br><span> #define CSNDESCR(_FuncType) CSNDESCR_##_FuncType</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define pvDATA(_pv, _offset) ((void*) ((unsigned char*)_pv + _offset))</span><br><span style="color: hsl(120, 100%, 40%);">+#define pui8DATA(_pv, _offset) ((guint8*) pvDATA(_pv, _offset))</span><br><span style="color: hsl(120, 100%, 40%);">+#define pui16DATA(_pv, _offset) ((guint16*) pvDATA(_pv, _offset))</span><br><span style="color: hsl(120, 100%, 40%);">+#define pui32DATA(_pv, _offset) ((guint32*) pvDATA(_pv, _offset))</span><br><span style="color: hsl(120, 100%, 40%);">+#define pui64DATA(_pv, _offset) ((guint64*) pvDATA(_pv, _offset))</span><br><span style="color: hsl(120, 100%, 40%);">+/* used to tag existence of next element in variable length lists */</span><br><span style="color: hsl(120, 100%, 40%);">+#define STANDARD_TAG 1</span><br><span style="color: hsl(120, 100%, 40%);">+#define REVERSED_TAG 0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+gint16 ProcessError_impl(const char *file, int line, unsigned *readIndex,</span><br><span style="color: hsl(120, 100%, 40%);">+                                const char* sz, gint16 err, const CSN_DESCR* pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+#define ProcessError(readIndex, sz, err, pDescr) \</span><br><span style="color: hsl(120, 100%, 40%);">+        ProcessError_impl(__FILE__, __LINE__, readIndex, sz, err, pDescr)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #endif /*_PACKET_CSN1_H_*/</span><br><span>diff --git a/src/csn1_dec.c b/src/csn1_dec.c</span><br><span>new file mode 100644</span><br><span>index 0000000..2d3f242</span><br><span>--- /dev/null</span><br><span>+++ b/src/csn1_dec.c</span><br><span>@@ -0,0 +1,1390 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* csn1_dec.c</span><br><span style="color: hsl(120, 100%, 40%);">+ * Routines for CSN1 dissection in wireshark.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright (C) 2011 Ivan Klyuchnikov</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * By Vincent Helfre, based on original code by Jari Sassi</span><br><span style="color: hsl(120, 100%, 40%);">+ * with the gracious authorization of STE</span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright (c) 2011 ST-Ericsson</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * $Id: packet-csn1.c 39140 2011-09-25 22:01:50Z wmeier $</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Wireshark - Network traffic analyzer</span><br><span style="color: hsl(120, 100%, 40%);">+ * By Gerald Combs <gerald@wireshark.org></span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright 1998 Gerald Combs</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or</span><br><span style="color: hsl(120, 100%, 40%);">+ * modify it under the terms of the GNU General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * as published by the Free Software Foundation; either version 2</span><br><span style="color: hsl(120, 100%, 40%);">+ * of the License, or (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * along with this program; if not, write to the Free Software</span><br><span style="color: hsl(120, 100%, 40%);">+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <assert.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <string.h></span><br><span style="color: hsl(120, 100%, 40%);">+#define __STDC_FORMAT_MACROS</span><br><span style="color: hsl(120, 100%, 40%);">+#include <inttypes.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include "csn1.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include <gprs_debug.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/logging.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+extern const unsigned char ixBitsTab[];</span><br><span style="color: hsl(120, 100%, 40%);">+guint8 get_masked_bits8(struct bitvec *vector, unsigned *readIndex, gint bit_offset, const gint no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * ================================================================================================</span><br><span style="color: hsl(120, 100%, 40%);">+ * Return TRUE if tag in bit stream indicates existence of next list element,</span><br><span style="color: hsl(120, 100%, 40%);">+ * otherwise return FALSE.</span><br><span style="color: hsl(120, 100%, 40%);">+ * Will work for tag values equal to both 0 and 1.</span><br><span style="color: hsl(120, 100%, 40%);">+ * ================================================================================================</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static gboolean</span><br><span style="color: hsl(120, 100%, 40%);">+existNextElement(struct bitvec *vector, unsigned *readIndex, guint8 Tag)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  int res = bitvec_get_bit_pos(vector, (*readIndex)++);</span><br><span style="color: hsl(120, 100%, 40%);">+  if (Tag == STANDARD_TAG)</span><br><span style="color: hsl(120, 100%, 40%);">+  {</span><br><span style="color: hsl(120, 100%, 40%);">+    return (res > 0);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+  return (res == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+gint16</span><br><span style="color: hsl(120, 100%, 40%);">+csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, struct bitvec *vector, unsigned *readIndex, void* data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  gint  remaining_bits_len = ar->remaining_bits_len;</span><br><span style="color: hsl(120, 100%, 40%);">+  gint  bit_offset         = ar->bit_offset;</span><br><span style="color: hsl(120, 100%, 40%);">+  guint8*  pui8 = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  guint16* pui16;</span><br><span style="color: hsl(120, 100%, 40%);">+  guint32* pui32;</span><br><span style="color: hsl(120, 100%, 40%);">+  guint64* pui64;</span><br><span style="color: hsl(120, 100%, 40%);">+  guint8 Tag = STANDARD_TAG;</span><br><span style="color: hsl(120, 100%, 40%);">+  unsigned ib;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (remaining_bits_len < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+  {</span><br><span style="color: hsl(120, 100%, 40%);">+    return ProcessError(readIndex, __func__, CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  do</span><br><span style="color: hsl(120, 100%, 40%);">+  {</span><br><span style="color: hsl(120, 100%, 40%);">+    switch (pDescr->type)</span><br><span style="color: hsl(120, 100%, 40%);">+    {</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_BIT:</span><br><span style="color: hsl(120, 100%, 40%);">+      {</span><br><span style="color: hsl(120, 100%, 40%);">+        if (remaining_bits_len > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          pui8  = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+    *pui8 = bitvec_read_field(vector, readIndex, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+          /* end add the bit value to protocol tree */</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+        else if (pDescr->may_be_null)</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+           pui8  = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+           *pui8 = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGPC(DCSN1, LOGL_DEBUG, "%s = NULL | ", pDescr->sz);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+        else</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        remaining_bits_len--;</span><br><span style="color: hsl(120, 100%, 40%);">+        bit_offset++;</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_NULL:</span><br><span style="color: hsl(120, 100%, 40%);">+      { /* Empty member! */</span><br><span style="color: hsl(120, 100%, 40%);">+        bit_offset += pDescr->i;</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_UINT:</span><br><span style="color: hsl(120, 100%, 40%);">+      {</span><br><span style="color: hsl(120, 100%, 40%);">+        guint8 no_of_bits = (guint8) pDescr->i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (remaining_bits_len >= no_of_bits)</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (no_of_bits <= 8)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            guint8 ui8 = bitvec_read_field(vector, readIndex, no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+            pui8      = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+            *pui8     = ui8;</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+          else if (no_of_bits <= 16)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+           guint16 ui16 = bitvec_read_field(vector, readIndex, no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+            pui16       = pui16DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+            *pui16      = ui16;</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , *pui16);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+          else if (no_of_bits <= 32)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            guint32 ui32 = bitvec_read_field(vector, readIndex, no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+            pui32       = pui32DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+            *pui32      = ui32;</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGPC(DCSN1, LOGL_DEBUG, "%s = 0x%08x | ", pDescr->sz , *pui32);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+          else</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_GENERAL, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+          remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+          bit_offset += no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+        else if (pDescr->may_be_null)</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (no_of_bits <= 8)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            pui8      = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+            *pui8     = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+          else if (no_of_bits <= 16)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            pui16      = pui16DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+            *pui16     = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+          else if (no_of_bits <= 32)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            pui32      = pui32DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+            *pui32     = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGPC(DCSN1, LOGL_DEBUG, "%s = NULL | ", pDescr->sz);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+        else</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_UINT_OFFSET:</span><br><span style="color: hsl(120, 100%, 40%);">+      {</span><br><span style="color: hsl(120, 100%, 40%);">+        guint8 no_of_bits = (guint8) pDescr->i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (remaining_bits_len >= no_of_bits)</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (no_of_bits <= 8)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+          guint8 ui8 = bitvec_read_field(vector, readIndex, no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+            pui8      = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+            *pui8     = ui8 + (guint8)pDescr->descr.value;</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+          else if (no_of_bits <= 16)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+          guint16 ui16 = bitvec_read_field(vector, readIndex, no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+            pui16       = pui16DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+            *pui16      = ui16 + (guint16)pDescr->descr.value;</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , *pui16);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+          else if (no_of_bits <= 32)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+          guint32 ui32 = bitvec_read_field(vector, readIndex, no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+            pui32       = pui32DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+            *pui32      = ui32 + (guint16)pDescr->descr.value;</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , *pui32);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+          else</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_GENERAL, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+        else</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+        bit_offset += no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_UINT_LH:</span><br><span style="color: hsl(120, 100%, 40%);">+      {</span><br><span style="color: hsl(120, 100%, 40%);">+        guint8 no_of_bits = (guint8) pDescr->i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (remaining_bits_len >= no_of_bits)</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (no_of_bits <= 8)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+           guint8 ui8 = get_masked_bits8(vector, readIndex, bit_offset, no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+            pui8      = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+            *pui8     = ui8;</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+          else</span><br><span style="color: hsl(120, 100%, 40%);">+          {/* Maybe we should support more than 8 bits ? */</span><br><span style="color: hsl(120, 100%, 40%);">+            return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_GENERAL, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+        else</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+        bit_offset += no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_UINT_ARRAY:</span><br><span style="color: hsl(120, 100%, 40%);">+      {</span><br><span style="color: hsl(120, 100%, 40%);">+        guint8  no_of_bits  = (guint8) pDescr->i;</span><br><span style="color: hsl(120, 100%, 40%);">+        guint16 nCount = (guint16)pDescr->descr.value; /* nCount supplied by value i.e. M_UINT_ARRAY(...) */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (pDescr->value != 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        { /* nCount specified by a reference to field holding value i.e. M_VAR_UINT_ARRAY(...) */</span><br><span style="color: hsl(120, 100%, 40%);">+          nCount = *pui16DATA(data, nCount);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (remaining_bits_len >= (no_of_bits * nCount))</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          remaining_bits_len -= (no_of_bits*nCount);</span><br><span style="color: hsl(120, 100%, 40%);">+          if (no_of_bits <= 8)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            pui8 = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+            do</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+            *pui8 = bitvec_read_field(vector, readIndex, no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+              pui8++;</span><br><span style="color: hsl(120, 100%, 40%);">+              bit_offset += no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+            } while (--nCount > 0);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+          else if (no_of_bits <= 16)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            return ProcessError(readIndex,"csnStreamDecoder NOTIMPLEMENTED", 999, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+          else if (no_of_bits <= 32)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            return ProcessError(readIndex,"csnStreamDecoder NOTIMPLEMENTED", 999, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+          else</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_GENERAL, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+        else</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_VARIABLE_TARRAY_OFFSET:</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_VARIABLE_TARRAY:</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_TYPE_ARRAY:</span><br><span style="color: hsl(120, 100%, 40%);">+      {</span><br><span style="color: hsl(120, 100%, 40%);">+        gint16      Status;</span><br><span style="color: hsl(120, 100%, 40%);">+        csnStream_t arT    = *ar;</span><br><span style="color: hsl(120, 100%, 40%);">+        gint16      nCount = pDescr->i;</span><br><span style="color: hsl(120, 100%, 40%);">+        guint16      nSize  = (guint16)(gint32)pDescr->value;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        pui8 = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (pDescr->type == CSN_VARIABLE_TARRAY)</span><br><span style="color: hsl(120, 100%, 40%);">+        { /* Count specified in field */</span><br><span style="color: hsl(120, 100%, 40%);">+          nCount = *pui8DATA(data, pDescr->i);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+        else if (pDescr->type == CSN_VARIABLE_TARRAY_OFFSET)</span><br><span style="color: hsl(120, 100%, 40%);">+        { /* Count specified in field */</span><br><span style="color: hsl(120, 100%, 40%);">+          nCount = *pui8DATA(data, pDescr->i);</span><br><span style="color: hsl(120, 100%, 40%);">+    /*  nCount--; the 1 offset is already taken into account in CSN_UINT_OFFSET */</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        while (nCount > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        { /* resulting array of length 0 is possible</span><br><span style="color: hsl(120, 100%, 40%);">+           * but no bits shall be read from bitstream</span><br><span style="color: hsl(120, 100%, 40%);">+           */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGPC(DCSN1, LOGL_DEBUG, "%s | ", pDescr->sz);</span><br><span style="color: hsl(120, 100%, 40%);">+          csnStreamInit(&arT, bit_offset, remaining_bits_len);</span><br><span style="color: hsl(120, 100%, 40%);">+   Status = csnStreamDecoder(&arT, (const CSN_DESCR*)pDescr->descr.ptr, vector, readIndex, pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+          if (Status >= 0)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            pui8    += nSize;</span><br><span style="color: hsl(120, 100%, 40%);">+            remaining_bits_len = arT.remaining_bits_len;</span><br><span style="color: hsl(120, 100%, 40%);">+            bit_offset         = arT.bit_offset;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+          else</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            return Status;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+          nCount--;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_BITMAP:</span><br><span style="color: hsl(120, 100%, 40%);">+      { /* bitmap with given length. The result is left aligned! */</span><br><span style="color: hsl(120, 100%, 40%);">+        guint8 no_of_bits = (guint8) pDescr->i; /* length of bitmap */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (no_of_bits > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (no_of_bits > remaining_bits_len)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            return ProcessError(readIndex, "csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          if (no_of_bits <= 32)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            for(ib = 0; ib < 4; ib++)</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+              guint8 ui8 = bitvec_read_field(vector, readIndex, 8);</span><br><span style="color: hsl(120, 100%, 40%);">+              pui8      = pui8DATA(data, pDescr->offset+ib);</span><br><span style="color: hsl(120, 100%, 40%);">+              *pui8      = ui8;</span><br><span style="color: hsl(120, 100%, 40%);">+               LOGPC(DCSN1, LOGL_DEBUG, "%s[%u] = %u | ", pDescr->sz , ib, (unsigned)*pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+          else if (no_of_bits <= 64)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            for(ib = 0; ib < 8; ib++)</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+         guint8 ui8 = bitvec_read_field(vector, readIndex, 8);</span><br><span style="color: hsl(120, 100%, 40%);">+              pui8      = pui8DATA(data, pDescr->offset+ib);</span><br><span style="color: hsl(120, 100%, 40%);">+              *pui8      = ui8;</span><br><span style="color: hsl(120, 100%, 40%);">+               LOGPC(DCSN1, LOGL_DEBUG, "%s[%u] = %u | ", pDescr->sz , ib, (unsigned)*pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+          else</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+             return ProcessError(readIndex,"csnStreamDecoder NOT IMPLEMENTED", 999, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+          bit_offset += no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+        /* bitmap was successfully extracted or it was empty */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_TYPE:</span><br><span style="color: hsl(120, 100%, 40%);">+      {</span><br><span style="color: hsl(120, 100%, 40%);">+        gint16      Status;</span><br><span style="color: hsl(120, 100%, 40%);">+        csnStream_t arT = *ar;</span><br><span style="color: hsl(120, 100%, 40%);">+        LOGPC(DCSN1, LOGL_DEBUG, " : %s | ", pDescr->sz);</span><br><span style="color: hsl(120, 100%, 40%);">+        csnStreamInit(&arT, bit_offset, remaining_bits_len);</span><br><span style="color: hsl(120, 100%, 40%);">+  Status = csnStreamDecoder(&arT, (const CSN_DESCR*)pDescr->descr.ptr, vector, readIndex, pvDATA(data, pDescr->offset));</span><br><span style="color: hsl(120, 100%, 40%);">+        LOGPC(DCSN1, LOGL_DEBUG, ": End %s | ", pDescr->sz);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (Status >= 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          remaining_bits_len  = arT.remaining_bits_len;</span><br><span style="color: hsl(120, 100%, 40%);">+          bit_offset          = arT.bit_offset;</span><br><span style="color: hsl(120, 100%, 40%);">+          pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+        else</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          /* Has already been processed: ProcessError("csnStreamDecoder", Status, pDescr);  */</span><br><span style="color: hsl(120, 100%, 40%);">+          return Status;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_CHOICE:</span><br><span style="color: hsl(120, 100%, 40%);">+      {</span><br><span style="color: hsl(120, 100%, 40%);">+        gint16 count = pDescr->i;</span><br><span style="color: hsl(120, 100%, 40%);">+        guint8 i     = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+        CSN_ChoiceElement_t* pChoice = (CSN_ChoiceElement_t*) pDescr->descr.ptr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Make sure that the list of choice items is not empty */</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!count)</span><br><span style="color: hsl(120, 100%, 40%);">+          return ProcessError(readIndex, "csnStreamDecoder", CSN_ERROR_IN_SCRIPT, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+        else if (count > 255) /* We can handle up to 256 (UCHAR_MAX) selectors */</span><br><span style="color: hsl(120, 100%, 40%);">+          return ProcessError(readIndex, "csnStreamDecoder", CSN_ERROR_IN_SCRIPT, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        while (count > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          guint8 no_of_bits = pChoice->bits;</span><br><span style="color: hsl(120, 100%, 40%);">+      guint8 value = bitvec_read_field(vector, readIndex, no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+          if (value == pChoice->value)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            CSN_DESCR   descr[2];</span><br><span style="color: hsl(120, 100%, 40%);">+            gint16      Status;</span><br><span style="color: hsl(120, 100%, 40%);">+            csnStream_t arT = *ar;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            descr[0]      = pChoice->descr;</span><br><span style="color: hsl(120, 100%, 40%);">+            memset(&descr[1], 0x00, sizeof(CSN_DESCR));</span><br><span style="color: hsl(120, 100%, 40%);">+            descr[1].type = CSN_END;</span><br><span style="color: hsl(120, 100%, 40%);">+            pui8          = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+            *pui8         = i;</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGPC(DCSN1, LOGL_DEBUG, "Choice %s = %u | ", pDescr->sz , (unsigned)value);</span><br><span style="color: hsl(120, 100%, 40%);">+            if (!pChoice->keep_bits) {</span><br><span style="color: hsl(120, 100%, 40%);">+              bit_offset += no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+              remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            csnStreamInit(&arT, bit_offset, remaining_bits_len);</span><br><span style="color: hsl(120, 100%, 40%);">+        Status = csnStreamDecoder(&arT, descr, vector, readIndex, data);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            if (Status >= 0)</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+              remaining_bits_len = arT.remaining_bits_len;</span><br><span style="color: hsl(120, 100%, 40%);">+              bit_offset         = arT.bit_offset;</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+            else</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+              return Status;</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          *readIndex -= no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+          count--;</span><br><span style="color: hsl(120, 100%, 40%);">+          pChoice++;</span><br><span style="color: hsl(120, 100%, 40%);">+          i++;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Neither of the choice items matched => unknown value */</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!count)</span><br><span style="color: hsl(120, 100%, 40%);">+          return ProcessError(readIndex, "csnStreamDecoder", CSN_ERROR_STREAM_NOT_SUPPORTED, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_SERIALIZE:</span><br><span style="color: hsl(120, 100%, 40%);">+      {</span><br><span style="color: hsl(120, 100%, 40%);">+        StreamSerializeFcn_t serialize = (StreamSerializeFcn_t)pDescr->aux_fn;</span><br><span style="color: hsl(120, 100%, 40%);">+        csnStream_t          arT       = *ar;</span><br><span style="color: hsl(120, 100%, 40%);">+        guint8 length_len              = pDescr->i;</span><br><span style="color: hsl(120, 100%, 40%);">+        gint16               Status    = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     guint8 length = bitvec_read_field(vector, readIndex, length_len);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        LOGPC(DCSN1, LOGL_DEBUG, "%s length = %u | ", pDescr->sz , length);</span><br><span style="color: hsl(120, 100%, 40%);">+        bit_offset += length_len;</span><br><span style="color: hsl(120, 100%, 40%);">+        remaining_bits_len -= length_len;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        csnStreamInit(&arT, bit_offset, length > 0 ? length : remaining_bits_len);</span><br><span style="color: hsl(120, 100%, 40%);">+        arT.direction = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+        LOGPC(DCSN1, LOGL_DEBUG, "offset = %u | ", pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+        Status = serialize(&arT, vector, readIndex, pvDATA(data, pDescr->offset));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (Status >= 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (length > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+            remaining_bits_len -= length;</span><br><span style="color: hsl(120, 100%, 40%);">+            bit_offset         += length;</span><br><span style="color: hsl(120, 100%, 40%);">+          } else {</span><br><span style="color: hsl(120, 100%, 40%);">+            remaining_bits_len = arT.remaining_bits_len;</span><br><span style="color: hsl(120, 100%, 40%);">+            bit_offset         = arT.bit_offset;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          /* Skip bits not handled by serialize(), if any */</span><br><span style="color: hsl(120, 100%, 40%);">+          if (Status > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGPC(DCSN1, LOGL_DEBUG, "skipped = %d | ", Status);</span><br><span style="color: hsl(120, 100%, 40%);">+            *readIndex += Status;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+        else</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          /* Has already been processed: */</span><br><span style="color: hsl(120, 100%, 40%);">+          return Status;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_UNION_LH:</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_UNION:</span><br><span style="color: hsl(120, 100%, 40%);">+      {</span><br><span style="color: hsl(120, 100%, 40%);">+        gint16           Bits;</span><br><span style="color: hsl(120, 100%, 40%);">+        guint8           index;</span><br><span style="color: hsl(120, 100%, 40%);">+        gint16           count      = pDescr->i;</span><br><span style="color: hsl(120, 100%, 40%);">+        const CSN_DESCR* pDescrNext = pDescr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescrNext += count + 1; /* now this is next after the union */</span><br><span style="color: hsl(120, 100%, 40%);">+        if ((count <= 0) || (count > 16))</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_INVALID_UNION_INDEX, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Now get the bits to extract the index */</span><br><span style="color: hsl(120, 100%, 40%);">+        Bits = ixBitsTab[count];</span><br><span style="color: hsl(120, 100%, 40%);">+        index = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        while (Bits > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          index <<= 1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          if (CSN_UNION_LH == pDescr->type)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            index |= get_masked_bits8(vector, readIndex, bit_offset, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+          else</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+      index |= bitvec_read_field(vector, readIndex, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+          remaining_bits_len--;</span><br><span style="color: hsl(120, 100%, 40%);">+          bit_offset++;</span><br><span style="color: hsl(120, 100%, 40%);">+          Bits--;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Assign UnionType */</span><br><span style="color: hsl(120, 100%, 40%);">+        pui8  = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+        *pui8 = index;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* script index to continue on, limited in case we do not have a power of 2 */</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr += (MIN(index + 1, count));</span><br><span style="color: hsl(120, 100%, 40%);">+        LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        switch (pDescr->type)</span><br><span style="color: hsl(120, 100%, 40%);">+        { /* get the right element of the union based on computed index */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          case CSN_BIT:</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            pui8  = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+            *pui8 = 0x00;</span><br><span style="color: hsl(120, 100%, 40%);">+           if (bitvec_read_field(vector, readIndex, 1) > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+              *pui8 = 0x01;</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+            remaining_bits_len -= 1;</span><br><span style="color: hsl(120, 100%, 40%);">+            bit_offset++;</span><br><span style="color: hsl(120, 100%, 40%);">+            pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          case CSN_NULL:</span><br><span style="color: hsl(120, 100%, 40%);">+          { /* Empty member! */</span><br><span style="color: hsl(120, 100%, 40%);">+            bit_offset += pDescr->i;</span><br><span style="color: hsl(120, 100%, 40%);">+            pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          case CSN_UINT:</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            guint8 no_of_bits = (guint8) pDescr->i;</span><br><span style="color: hsl(120, 100%, 40%);">+            if (remaining_bits_len >= no_of_bits)</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+              if (no_of_bits <= 8)</span><br><span style="color: hsl(120, 100%, 40%);">+              {</span><br><span style="color: hsl(120, 100%, 40%);">+               guint8 ui8 = bitvec_read_field(vector, readIndex,  no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+                pui8       = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+                *pui8      = ui8;</span><br><span style="color: hsl(120, 100%, 40%);">+                LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+              else if (no_of_bits <= 16)</span><br><span style="color: hsl(120, 100%, 40%);">+              {</span><br><span style="color: hsl(120, 100%, 40%);">+                guint16 ui16 = bitvec_read_field(vector, readIndex,  no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+                pui16        = pui16DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+                *pui16       = ui16;</span><br><span style="color: hsl(120, 100%, 40%);">+                LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , *pui16);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+              else if (no_of_bits <= 32)</span><br><span style="color: hsl(120, 100%, 40%);">+              {</span><br><span style="color: hsl(120, 100%, 40%);">+         guint32 ui32 = bitvec_read_field(vector, readIndex,  no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+                pui32       = pui32DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+                *pui32      = ui32;</span><br><span style="color: hsl(120, 100%, 40%);">+                LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , *pui32);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+              else</span><br><span style="color: hsl(120, 100%, 40%);">+              {</span><br><span style="color: hsl(120, 100%, 40%);">+                return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_GENERAL, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+            else</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+              return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_GENERAL, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+            bit_offset += no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+            pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          case CSN_UINT_OFFSET:</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            guint8 no_of_bits = (guint8) pDescr->i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            if (remaining_bits_len >= no_of_bits)</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+              if (no_of_bits <= 8)</span><br><span style="color: hsl(120, 100%, 40%);">+              {</span><br><span style="color: hsl(120, 100%, 40%);">+             guint8 ui8 = bitvec_read_field(vector, readIndex,  no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+                pui8      = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+                *pui8     = ui8 + (guint8)pDescr->descr.value;</span><br><span style="color: hsl(120, 100%, 40%);">+                LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+              else if (no_of_bits <= 16)</span><br><span style="color: hsl(120, 100%, 40%);">+              {</span><br><span style="color: hsl(120, 100%, 40%);">+         guint16 ui16 = bitvec_read_field(vector, readIndex,  no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+                pui16       = pui16DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+                *pui16      = ui16 + (guint16)pDescr->descr.value;</span><br><span style="color: hsl(120, 100%, 40%);">+                LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , *pui16);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+              else if (no_of_bits <= 32)</span><br><span style="color: hsl(120, 100%, 40%);">+              {</span><br><span style="color: hsl(120, 100%, 40%);">+         guint32 ui32 = bitvec_read_field(vector, readIndex,  no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+                pui32       = pui32DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+                *pui32      = ui32 + (guint16)pDescr->descr.value;</span><br><span style="color: hsl(120, 100%, 40%);">+                LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , *pui32);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+              else</span><br><span style="color: hsl(120, 100%, 40%);">+              {</span><br><span style="color: hsl(120, 100%, 40%);">+                return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_GENERAL, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+            else</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+              return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+            bit_offset += no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+            pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          case CSN_UINT_LH:</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            guint8 no_of_bits = (guint8) pDescr->i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            if (remaining_bits_len >= no_of_bits)</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+              if (no_of_bits <= 8)</span><br><span style="color: hsl(120, 100%, 40%);">+              {</span><br><span style="color: hsl(120, 100%, 40%);">+              guint8 ui8 = get_masked_bits8(vector, readIndex, bit_offset, no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+                pui8      = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+                *pui8     = ui8;</span><br><span style="color: hsl(120, 100%, 40%);">+                LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+              else</span><br><span style="color: hsl(120, 100%, 40%);">+              { /* Maybe we should support more than 8 bits ? */</span><br><span style="color: hsl(120, 100%, 40%);">+                return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_GENERAL, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+            else</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+              return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+            bit_offset += no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+            pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          case CSN_UINT_ARRAY:</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            guint8  no_of_bits  = (guint8) pDescr->i;</span><br><span style="color: hsl(120, 100%, 40%);">+            guint16 nCount = (guint16)pDescr->descr.value; /* nCount supplied by value i.e. M_UINT_ARRAY(...) */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            if (pDescr->value != 0)</span><br><span style="color: hsl(120, 100%, 40%);">+            { /* nCount specified by a reference to field holding value i.e. M_VAR_UINT_ARRAY(...) */</span><br><span style="color: hsl(120, 100%, 40%);">+              nCount = *pui16DATA(data, nCount);</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            if (remaining_bits_len >= (no_of_bits * nCount))</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+              remaining_bits_len -= (no_of_bits * nCount);</span><br><span style="color: hsl(120, 100%, 40%);">+              if (no_of_bits <= 8)</span><br><span style="color: hsl(120, 100%, 40%);">+              {</span><br><span style="color: hsl(120, 100%, 40%);">+                pui8 = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                while (nCount > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                {</span><br><span style="color: hsl(120, 100%, 40%);">+            *pui8 = bitvec_read_field(vector, readIndex,  no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+                  LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+                  pui8++;</span><br><span style="color: hsl(120, 100%, 40%);">+                  bit_offset += no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+                  nCount--;</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+              else if (no_of_bits <= 16)</span><br><span style="color: hsl(120, 100%, 40%);">+              {</span><br><span style="color: hsl(120, 100%, 40%);">+                pui16 = pui16DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                while (nCount > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                {</span><br><span style="color: hsl(120, 100%, 40%);">+             *pui16 = bitvec_read_field(vector, readIndex,  no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+                  LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , *pui16);</span><br><span style="color: hsl(120, 100%, 40%);">+                  pui16++;</span><br><span style="color: hsl(120, 100%, 40%);">+                  bit_offset += no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+                  nCount--;</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+              else if (no_of_bits <= 32)</span><br><span style="color: hsl(120, 100%, 40%);">+              { /* not supported */</span><br><span style="color: hsl(120, 100%, 40%);">+                return ProcessError(readIndex,"csnStreamDecoder NOT IMPLEMENTED", 999, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+              else</span><br><span style="color: hsl(120, 100%, 40%);">+              {</span><br><span style="color: hsl(120, 100%, 40%);">+                return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_GENERAL, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+            else</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+              return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          case CSN_VARIABLE_TARRAY_OFFSET:</span><br><span style="color: hsl(120, 100%, 40%);">+          case CSN_VARIABLE_TARRAY:</span><br><span style="color: hsl(120, 100%, 40%);">+          case CSN_TYPE_ARRAY:</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            gint16      Status;</span><br><span style="color: hsl(120, 100%, 40%);">+            csnStream_t arT    = *ar;</span><br><span style="color: hsl(120, 100%, 40%);">+            guint16      nCount = (guint16) pDescr->i;</span><br><span style="color: hsl(120, 100%, 40%);">+            guint16      nSize  = (guint16)(guint32)pDescr->value;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            pui8  = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            if (CSN_VARIABLE_TARRAY == pDescr->type)</span><br><span style="color: hsl(120, 100%, 40%);">+            { /* Count specified in field */</span><br><span style="color: hsl(120, 100%, 40%);">+              nCount = *pui8DATA(data, pDescr->i);</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+            else if (CSN_VARIABLE_TARRAY_OFFSET == pDescr->type)</span><br><span style="color: hsl(120, 100%, 40%);">+            { /* Count specified in field */</span><br><span style="color: hsl(120, 100%, 40%);">+              nCount = *pui8DATA(data, pDescr->i);</span><br><span style="color: hsl(120, 100%, 40%);">+              nCount--; /* Offset 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            while (nCount--)    /* Changed to handle length = 0.  */</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPC(DCSN1, LOGL_DEBUG, "%s | ", pDescr->sz);</span><br><span style="color: hsl(120, 100%, 40%);">+              csnStreamInit(&arT, bit_offset, remaining_bits_len);</span><br><span style="color: hsl(120, 100%, 40%);">+             Status = csnStreamDecoder(&arT, (const CSN_DESCR*)pDescr->descr.ptr, vector, readIndex, pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+              if (Status >= 0)</span><br><span style="color: hsl(120, 100%, 40%);">+              {</span><br><span style="color: hsl(120, 100%, 40%);">+                pui8    += nSize;</span><br><span style="color: hsl(120, 100%, 40%);">+                remaining_bits_len = arT.remaining_bits_len;</span><br><span style="color: hsl(120, 100%, 40%);">+                bit_offset         = arT.bit_offset;</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+              else</span><br><span style="color: hsl(120, 100%, 40%);">+              {</span><br><span style="color: hsl(120, 100%, 40%);">+                return Status;</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          case CSN_BITMAP:</span><br><span style="color: hsl(120, 100%, 40%);">+          { /* bitmap with given length. The result is left aligned! */</span><br><span style="color: hsl(120, 100%, 40%);">+            guint8 no_of_bits = (guint8) pDescr->i; /* length of bitmap */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            if (no_of_bits > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+              if (no_of_bits > remaining_bits_len)</span><br><span style="color: hsl(120, 100%, 40%);">+              {</span><br><span style="color: hsl(120, 100%, 40%);">+                return ProcessError(readIndex, "csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              if (no_of_bits <= 32)</span><br><span style="color: hsl(120, 100%, 40%);">+              {</span><br><span style="color: hsl(120, 100%, 40%);">+              guint32 ui32 = bitvec_read_field(vector, readIndex, no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+                pui32       = pui32DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+                *pui32      = ui32;</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+              else if (no_of_bits <= 64)</span><br><span style="color: hsl(120, 100%, 40%);">+              {</span><br><span style="color: hsl(120, 100%, 40%);">+               guint64 ui64 = bitvec_read_field(vector, readIndex, no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+                pui64       = pui64DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+                *pui64      = ui64;</span><br><span style="color: hsl(120, 100%, 40%);">+                LOGPC(DCSN1, LOGL_DEBUG, "%s = %lu | ", pDescr->sz , *pui64);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+              else</span><br><span style="color: hsl(120, 100%, 40%);">+              {</span><br><span style="color: hsl(120, 100%, 40%);">+                    return ProcessError(readIndex,"csnStreamDecoder NOT IMPLEMENTED", 999, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+              bit_offset += no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+            /* bitmap was successfully extracted or it was empty */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          case CSN_TYPE:</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            gint16      Status;</span><br><span style="color: hsl(120, 100%, 40%);">+            csnStream_t arT = *ar;</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGPC(DCSN1, LOGL_DEBUG, " : %s | ", pDescr->sz);</span><br><span style="color: hsl(120, 100%, 40%);">+            csnStreamInit(&arT, bit_offset, remaining_bits_len);</span><br><span style="color: hsl(120, 100%, 40%);">+      Status = csnStreamDecoder(&arT, (const CSN_DESCR*)pDescr->descr.ptr, vector, readIndex, pvDATA(data, pDescr->offset));</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGPC(DCSN1, LOGL_DEBUG, " : End %s | ", pDescr->sz);</span><br><span style="color: hsl(120, 100%, 40%);">+            if (Status >= 0)</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+              remaining_bits_len = arT.remaining_bits_len;</span><br><span style="color: hsl(120, 100%, 40%);">+              bit_offset         = arT.bit_offset;</span><br><span style="color: hsl(120, 100%, 40%);">+              pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+            else</span><br><span style="color: hsl(120, 100%, 40%);">+            { /* return error code Has already been processed:  */</span><br><span style="color: hsl(120, 100%, 40%);">+              return Status;</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          default:</span><br><span style="color: hsl(120, 100%, 40%);">+          { /* descriptions of union elements other than above are illegal */</span><br><span style="color: hsl(120, 100%, 40%);">+            return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_IN_SCRIPT, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr = pDescrNext;</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_EXIST:</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_EXIST_LH:</span><br><span style="color: hsl(120, 100%, 40%);">+      {</span><br><span style="color: hsl(120, 100%, 40%);">+        guint8 fExist;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        pui8  = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (CSN_EXIST_LH == pDescr->type)</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+    fExist = get_masked_bits8(vector, readIndex, bit_offset, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+        else</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+      fExist = bitvec_read_field(vector, readIndex, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        *pui8 = fExist;</span><br><span style="color: hsl(120, 100%, 40%);">+        LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        bit_offset++;</span><br><span style="color: hsl(120, 100%, 40%);">+        remaining_bits_len -= 1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!fExist)</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          ar->remaining_bits_len  = remaining_bits_len;</span><br><span style="color: hsl(120, 100%, 40%);">+          ar->bit_offset          = bit_offset;</span><br><span style="color: hsl(120, 100%, 40%);">+          return remaining_bits_len;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_NEXT_EXIST:</span><br><span style="color: hsl(120, 100%, 40%);">+      {</span><br><span style="color: hsl(120, 100%, 40%);">+        guint8 fExist;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        pui8  = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* this if-statement represents the M_NEXT_EXIST_OR_NULL description element */</span><br><span style="color: hsl(120, 100%, 40%);">+        if ((pDescr->may_be_null) && (remaining_bits_len == 0))</span><br><span style="color: hsl(120, 100%, 40%);">+        { /* no more bits to decode is fine here - end of message detected and allowed */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          /* Skip i entries + this entry */</span><br><span style="color: hsl(120, 100%, 40%);">+          pDescr += pDescr->i + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          /* Set the data member to "not exist" */</span><br><span style="color: hsl(120, 100%, 40%);">+          *pui8 = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+          break;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* the "regular" M_NEXT_EXIST description element */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        fExist = 0x00;</span><br><span style="color: hsl(120, 100%, 40%);">+  if (bitvec_read_field(vector, readIndex, 1))</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          fExist = 0x01;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        *pui8     = fExist;</span><br><span style="color: hsl(120, 100%, 40%);">+        remaining_bits_len -= 1;</span><br><span style="color: hsl(120, 100%, 40%);">+        LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+        ++bit_offset;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (fExist == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        { /* Skip 'i' entries */</span><br><span style="color: hsl(120, 100%, 40%);">+          pDescr += pDescr->i;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_NEXT_EXIST_LH:</span><br><span style="color: hsl(120, 100%, 40%);">+      {</span><br><span style="color: hsl(120, 100%, 40%);">+        guint8 fExist;</span><br><span style="color: hsl(120, 100%, 40%);">+        pui8  = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* this if-statement represents the M_NEXT_EXIST_OR_NULL_LH description element */</span><br><span style="color: hsl(120, 100%, 40%);">+        if ((pDescr->descr.ptr != NULL) && (remaining_bits_len == 0))</span><br><span style="color: hsl(120, 100%, 40%);">+        { /* no more bits to decode is fine here - end of message detected and allowed */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          /* skip 'i' entries + this entry */</span><br><span style="color: hsl(120, 100%, 40%);">+          pDescr += pDescr->i + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          /* set the data member to "not exist" */</span><br><span style="color: hsl(120, 100%, 40%);">+          *pui8 = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+          break;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* the "regular" M_NEXT_EXIST_LH description element */</span><br><span style="color: hsl(120, 100%, 40%);">+        fExist = get_masked_bits8(vector, readIndex, bit_offset, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+        LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)fExist);</span><br><span style="color: hsl(120, 100%, 40%);">+        *pui8++   = fExist;</span><br><span style="color: hsl(120, 100%, 40%);">+        remaining_bits_len -= 1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        bit_offset++;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (fExist == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        { /* Skip 'i' entries */</span><br><span style="color: hsl(120, 100%, 40%);">+          pDescr += pDescr->i;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_VARIABLE_BITMAP_1:</span><br><span style="color: hsl(120, 100%, 40%);">+      { /* Bitmap from here and to the end of message */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        *pui8DATA(data, (gint16)pDescr->descr.value) = (guint8) remaining_bits_len; /* length of bitmap == remaining bits */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /*no break -</span><br><span style="color: hsl(120, 100%, 40%);">+         * with a length set we have a regular variable length bitmap so we continue */</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+      /* FALL THROUGH */</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_VARIABLE_BITMAP:</span><br><span style="color: hsl(120, 100%, 40%);">+      { /* {CSN_VARIABLE_BITMAP, 0, offsetof(_STRUCT, _ElementCountField), offsetof(_STRUCT, _MEMBER), #_MEMBER}</span><br><span style="color: hsl(120, 100%, 40%);">+         * <N: bit (5)> <bitmap: bit(N + offset)></span><br><span style="color: hsl(120, 100%, 40%);">+         * Bit array with length (in bits) specified in parameter (pDescr->descr)</span><br><span style="color: hsl(120, 100%, 40%);">+         * The result is right aligned!</span><br><span style="color: hsl(120, 100%, 40%);">+         */</span><br><span style="color: hsl(120, 100%, 40%);">+        gint16 no_of_bits = *pui8DATA(data, (gint16)pDescr->descr.value);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        no_of_bits += pDescr->i; /* adjusted by offset */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (no_of_bits > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          if (remaining_bits_len < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          { /* extract bits */</span><br><span style="color: hsl(120, 100%, 40%);">+            guint8* pui8 = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+            gint16 nB1  = no_of_bits & 0x07;/* no_of_bits Mod 8 */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            if (nB1 > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+            { /* take care of the first byte - it will be right aligned */</span><br><span style="color: hsl(120, 100%, 40%);">+        *pui8 = bitvec_read_field(vector, readIndex, nB1);</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+              pui8++;</span><br><span style="color: hsl(120, 100%, 40%);">+              no_of_bits  -= nB1;</span><br><span style="color: hsl(120, 100%, 40%);">+              bit_offset += nB1; /* (nB1 is no_of_bits Mod 8) */</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            /* remaining no_of_bits is a multiple of 8 or 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+            while (no_of_bits > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+       *pui8 = bitvec_read_field(vector, readIndex, 8);</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+              pui8++;</span><br><span style="color: hsl(120, 100%, 40%);">+              no_of_bits -= 8;</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_LEFT_ALIGNED_VAR_BMP_1:</span><br><span style="color: hsl(120, 100%, 40%);">+      { /* Bitmap from here and to the end of message */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        *pui8DATA(data, (gint16)pDescr->descr.value) = (guint8) remaining_bits_len; /* length of bitmap == remaining bits */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* no break -</span><br><span style="color: hsl(120, 100%, 40%);">+         * with a length set we have a regular left aligned variable length bitmap so we continue</span><br><span style="color: hsl(120, 100%, 40%);">+         */</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+      /* FALL THROUGH */</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_LEFT_ALIGNED_VAR_BMP:</span><br><span style="color: hsl(120, 100%, 40%);">+      { /* {CSN_LEFT_ALIGNED_VAR_BMP, _OFFSET, (void*)offsetof(_STRUCT, _ElementCountField), offsetof(_STRUCT, _MEMBER), #_MEMBER}</span><br><span style="color: hsl(120, 100%, 40%);">+         * <N: bit (5)> <bitmap: bit(N + offset)></span><br><span style="color: hsl(120, 100%, 40%);">+         * bit array with length (in bits) specified in parameter (pDescr->descr)</span><br><span style="color: hsl(120, 100%, 40%);">+         */</span><br><span style="color: hsl(120, 100%, 40%);">+        gint16 no_of_bits = *pui8DATA(data, (gint16)pDescr->descr.value);/* Size of bitmap */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        no_of_bits += pDescr->i;/* size adjusted by offset */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (no_of_bits > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          if (remaining_bits_len < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          { /* extract bits */</span><br><span style="color: hsl(120, 100%, 40%);">+            guint8* pui8 = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            while (no_of_bits >= 8)</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+             *pui8 = bitvec_read_field(vector, readIndex, 8);</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+              pui8++;</span><br><span style="color: hsl(120, 100%, 40%);">+              no_of_bits -= 8;</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+            if (no_of_bits > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+           *pui8 = bitvec_read_field(vector, readIndex, no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+              pui8++;</span><br><span style="color: hsl(120, 100%, 40%);">+              bit_offset += no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+              no_of_bits = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* bitmap was successfully extracted or it was empty */</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_PADDING_BITS:</span><br><span style="color: hsl(120, 100%, 40%);">+      { /* Padding from here and to the end of message */</span><br><span style="color: hsl(120, 100%, 40%);">+        LOGPC(DCSN1, LOGL_DEBUG, "%s = ", pDescr->sz);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (remaining_bits_len > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          while (remaining_bits_len > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            guint bits_to_handle = remaining_bits_len%8;</span><br><span style="color: hsl(120, 100%, 40%);">+            if (bits_to_handle > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPC(DCSN1, LOGL_DEBUG, "%d|", bitvec_get_uint(vector, bits_to_handle));</span><br><span style="color: hsl(120, 100%, 40%);">+              remaining_bits_len -= bits_to_handle;</span><br><span style="color: hsl(120, 100%, 40%);">+              bit_offset += bits_to_handle;</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+            else if (bits_to_handle == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPC(DCSN1, LOGL_DEBUG, "%d|", bitvec_get_uint(vector, 8));</span><br><span style="color: hsl(120, 100%, 40%);">+              remaining_bits_len -= 8;</span><br><span style="color: hsl(120, 100%, 40%);">+              bit_offset += 8;</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+        if (remaining_bits_len < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Padding was successfully extracted or it was empty */</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_VARIABLE_ARRAY:</span><br><span style="color: hsl(120, 100%, 40%);">+      { /* {int type; int i; void* descr; int offset; const char* sz; } CSN_DESCR;</span><br><span style="color: hsl(120, 100%, 40%);">+         * {CSN_VARIABLE_ARRAY, _OFFSET, (void*)offsetof(_STRUCT, _ElementCountField), offsetof(_STRUCT, _MEMBER), #_MEMBER}</span><br><span style="color: hsl(120, 100%, 40%);">+         * Array with length specified in parameter:</span><br><span style="color: hsl(120, 100%, 40%);">+         *  <count: bit (x)></span><br><span style="color: hsl(120, 100%, 40%);">+         *  <list: octet(count + offset)></span><br><span style="color: hsl(120, 100%, 40%);">+         */</span><br><span style="color: hsl(120, 100%, 40%);">+        gint16 count = *pui8DATA(data, (gint16)pDescr->descr.value);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        count += pDescr->i; /* Adjusted by offset */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (count > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          remaining_bits_len -= count * 8;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          if (remaining_bits_len < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          pui8 = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          while (count > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+           *pui8 = bitvec_read_field(vector, readIndex, 8);</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGPC(DCSN1, LOGL_DEBUG, "%s = 0x%x | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+            pui8++;</span><br><span style="color: hsl(120, 100%, 40%);">+            bit_offset += 8;</span><br><span style="color: hsl(120, 100%, 40%);">+            count--;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_RECURSIVE_ARRAY:</span><br><span style="color: hsl(120, 100%, 40%);">+      { /* Recursive way to specify an array: <list> ::= {1 <number: bit (4)> <list> | 0}</span><br><span style="color: hsl(120, 100%, 40%);">+         *  or more generally:                <list> ::= { <tag> <element> <list> | <EndTag> }</span><br><span style="color: hsl(120, 100%, 40%);">+         *  where <element> ::= bit(value)</span><br><span style="color: hsl(120, 100%, 40%);">+         *        <tag>     ::= 0 | 1</span><br><span style="color: hsl(120, 100%, 40%);">+         *        <EndTag>  ::= reversed tag i.e. tag == 1 -> EndTag == 0 and vice versa</span><br><span style="color: hsl(120, 100%, 40%);">+         * {CSN_RECURSIVE_ARRAY, _BITS, (void*)offsetof(_STRUCT, _ElementCountField), offsetof(_STRUCT, _MEMBER), #_MEMBER}</span><br><span style="color: hsl(120, 100%, 40%);">+         * REMARK: recursive way to specify an array but an iterative implementation!</span><br><span style="color: hsl(120, 100%, 40%);">+         */</span><br><span style="color: hsl(120, 100%, 40%);">+        gint16 no_of_bits        = pDescr->i;</span><br><span style="color: hsl(120, 100%, 40%);">+        guint8  ElementCount = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        pui8  = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   while (existNextElement(vector, readIndex, Tag))</span><br><span style="color: hsl(120, 100%, 40%);">+        { /* tag control shows existence of next list elements */</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGPC(DCSN1, LOGL_DEBUG, "%s = Exist | ", pDescr->sz);</span><br><span style="color: hsl(120, 100%, 40%);">+          bit_offset++;</span><br><span style="color: hsl(120, 100%, 40%);">+          remaining_bits_len--;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          /* extract and store no_of_bits long element from bitstream */</span><br><span style="color: hsl(120, 100%, 40%);">+        *pui8 = bitvec_read_field(vector, readIndex, no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+          pui8++;</span><br><span style="color: hsl(120, 100%, 40%);">+          remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+          ElementCount++;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          if (remaining_bits_len < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          bit_offset += no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        LOGPC(DCSN1, LOGL_DEBUG, "%s = %d | ", pDescr->sz , bitvec_get_uint(vector, 1));</span><br><span style="color: hsl(120, 100%, 40%);">+        /* existNextElement() returned FALSE, 1 bit consumed */</span><br><span style="color: hsl(120, 100%, 40%);">+        bit_offset++;</span><br><span style="color: hsl(120, 100%, 40%);">+        remaining_bits_len--;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Store the counted number of elements of the array */</span><br><span style="color: hsl(120, 100%, 40%);">+        *pui8DATA(data, (gint16)pDescr->descr.value) = ElementCount;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_RECURSIVE_TARRAY:</span><br><span style="color: hsl(120, 100%, 40%);">+      { /* Recursive way to specify an array of type: <lists> ::= { 1 <type> } ** 0 ;</span><br><span style="color: hsl(120, 100%, 40%);">+         *  M_REC_TARRAY(_STRUCT, _MEMBER, _MEMBER_TYPE, _ElementCountField)</span><br><span style="color: hsl(120, 100%, 40%);">+         * {t, offsetof(_STRUCT, _ElementCountField), (void*)CSNDESCR_##_MEMBER_TYPE, offsetof(_STRUCT, _MEMBER), #_MEMBER, (StreamSerializeFcn_t)sizeof(_MEMBER_TYPE), (void_fn_t)ElementsOf(((_STRUCT*)0)->_MEMBER)}</span><br><span style="color: hsl(120, 100%, 40%);">+         */</span><br><span style="color: hsl(120, 100%, 40%);">+        gint16 nSizeElement = (gint16)(gint32)pDescr->value;</span><br><span style="color: hsl(120, 100%, 40%);">+        guint32 nSizeArray = (guint32)((uintptr_t)pDescr->aux_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+        guint8  ElementCount = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+        pui8  = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    while (existNextElement(vector, readIndex, Tag))</span><br><span style="color: hsl(120, 100%, 40%);">+        { /* tag control shows existence of next list elements */</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGPC(DCSN1, LOGL_DEBUG, "%s = Exist | ", pDescr->sz);</span><br><span style="color: hsl(120, 100%, 40%);">+          /* existNextElement() returned TRUE, 1 bit consumed */</span><br><span style="color: hsl(120, 100%, 40%);">+          bit_offset++;</span><br><span style="color: hsl(120, 100%, 40%);">+          remaining_bits_len--;</span><br><span style="color: hsl(120, 100%, 40%);">+          ElementCount++;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          if (ElementCount > nSizeArray)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGPC(DCSN1, LOGL_ERROR, "error: %s: too many elements (>%u) in recursive array. Increase its size! } |", pDescr->sz, nSizeArray);</span><br><span style="color: hsl(120, 100%, 40%);">+            return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_STREAM_NOT_SUPPORTED, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          { /* unpack the following data structure */</span><br><span style="color: hsl(120, 100%, 40%);">+            csnStream_t arT = *ar;</span><br><span style="color: hsl(120, 100%, 40%);">+            gint16      Status;</span><br><span style="color: hsl(120, 100%, 40%);">+            csnStreamInit(&arT, bit_offset, remaining_bits_len);</span><br><span style="color: hsl(120, 100%, 40%);">+          Status = csnStreamDecoder(&arT, (const CSN_DESCR*)pDescr->descr.ptr, vector, readIndex, pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            if (Status >= 0)</span><br><span style="color: hsl(120, 100%, 40%);">+            { /* successful completion */</span><br><span style="color: hsl(120, 100%, 40%);">+              pui8    += nSizeElement;  /* -> to next data element */</span><br><span style="color: hsl(120, 100%, 40%);">+              remaining_bits_len = arT.remaining_bits_len;</span><br><span style="color: hsl(120, 100%, 40%);">+              bit_offset         = arT.bit_offset;</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+            else</span><br><span style="color: hsl(120, 100%, 40%);">+            { /* something went awry */</span><br><span style="color: hsl(120, 100%, 40%);">+              return Status;</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          if (remaining_bits_len < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        LOGPC(DCSN1, LOGL_DEBUG, "%s = %d | ", pDescr->sz , bitvec_get_uint(vector, 1));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* existNextElement() returned FALSE, 1 bit consumed */</span><br><span style="color: hsl(120, 100%, 40%);">+        remaining_bits_len--;</span><br><span style="color: hsl(120, 100%, 40%);">+        bit_offset++;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Store the counted number of elements of the array */</span><br><span style="color: hsl(120, 100%, 40%);">+        *pui8DATA(data, (gint16)(gint32)pDescr->i) = ElementCount;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_RECURSIVE_TARRAY_2:</span><br><span style="color: hsl(120, 100%, 40%);">+      { /* Recursive way to specify an array of type: <list> ::= <type> { 0 <type> } ** 1 ; */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        Tag = REVERSED_TAG;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* NO break -</span><br><span style="color: hsl(120, 100%, 40%);">+         * handling is exactly the same as for CSN_RECURSIVE_TARRAY_1 so we continue</span><br><span style="color: hsl(120, 100%, 40%);">+         */</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+      /* FALL THROUGH */</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_RECURSIVE_TARRAY_1:</span><br><span style="color: hsl(120, 100%, 40%);">+      { /* Recursive way to specify an array of type: <lists> ::= <type> { 1 <type> } ** 0 ;</span><br><span style="color: hsl(120, 100%, 40%);">+         * M_REC_TARRAY(_STRUCT, _MEMBER, _MEMBER_TYPE, _ElementCountField)</span><br><span style="color: hsl(120, 100%, 40%);">+         * {t, offsetof(_STRUCT, _ElementCountField), (void*)CSNDESCR_##_MEMBER_TYPE, offsetof(_STRUCT, _MEMBER), #_MEMBER, (StreamSerializeFcn_t)sizeof(_MEMBER_TYPE), (void_fn_t)ElementsOf(((_STRUCT*)0)->_MEMBER)}</span><br><span style="color: hsl(120, 100%, 40%);">+         */</span><br><span style="color: hsl(120, 100%, 40%);">+        gint16      nSizeElement = (gint16)(gint32)pDescr->value;</span><br><span style="color: hsl(120, 100%, 40%);">+        guint32     nSizeArray = (guint32)((uintptr_t)pDescr->aux_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+        guint8       ElementCount = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+        csnStream_t arT          = *ar;</span><br><span style="color: hsl(120, 100%, 40%);">+        gboolean     EndOfList    = FALSE;</span><br><span style="color: hsl(120, 100%, 40%);">+        gint16      Status;</span><br><span style="color: hsl(120, 100%, 40%);">+        pui8  = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        do</span><br><span style="color: hsl(120, 100%, 40%);">+        { /* get data element */</span><br><span style="color: hsl(120, 100%, 40%);">+          ElementCount++;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          if (ElementCount > nSizeArray)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGPC(DCSN1, LOGL_ERROR, "error: %s: too many elements (>%u) in recursive array. Increase its size! } |", pDescr->sz, nSizeArray);</span><br><span style="color: hsl(120, 100%, 40%);">+            return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_STREAM_NOT_SUPPORTED, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGPC(DCSN1, LOGL_DEBUG, "%s { | ", pDescr->sz);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          csnStreamInit(&arT, bit_offset, remaining_bits_len);</span><br><span style="color: hsl(120, 100%, 40%);">+     Status = csnStreamDecoder(&arT, (const CSN_DESCR*)pDescr->descr.ptr, vector, readIndex, pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          if (Status >= 0)</span><br><span style="color: hsl(120, 100%, 40%);">+          { /* successful completion */</span><br><span style="color: hsl(120, 100%, 40%);">+            pui8    += nSizeElement;  /* -> to next */</span><br><span style="color: hsl(120, 100%, 40%);">+            remaining_bits_len = arT.remaining_bits_len;</span><br><span style="color: hsl(120, 100%, 40%);">+            bit_offset         = arT.bit_offset;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+          else</span><br><span style="color: hsl(120, 100%, 40%);">+          { /* something went awry */</span><br><span style="color: hsl(120, 100%, 40%);">+            return Status;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          if (remaining_bits_len < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          /* control of next element's tag */</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGPC(DCSN1, LOGL_DEBUG, "%s } | ", pDescr->sz);</span><br><span style="color: hsl(120, 100%, 40%);">+         EndOfList         = !(existNextElement(vector, readIndex, Tag));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          bit_offset++;</span><br><span style="color: hsl(120, 100%, 40%);">+          remaining_bits_len--; /* 1 bit consumed (tag) */</span><br><span style="color: hsl(120, 100%, 40%);">+        } while (!EndOfList);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Store the count of the array */</span><br><span style="color: hsl(120, 100%, 40%);">+        *pui8DATA(data, pDescr->i) = ElementCount;</span><br><span style="color: hsl(120, 100%, 40%);">+        Tag = STANDARD_TAG; /* in case it was set to "reversed" */</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_FIXED:</span><br><span style="color: hsl(120, 100%, 40%);">+      { /* Verify the fixed bits */</span><br><span style="color: hsl(120, 100%, 40%);">+        guint8  no_of_bits = (guint8) pDescr->i;</span><br><span style="color: hsl(120, 100%, 40%);">+        guint32 ui32;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (no_of_bits <= 32)</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+      ui32 = bitvec_read_field(vector, readIndex, no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+        else</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          return ProcessError(readIndex,"no_of_bits > 32", -1, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+        if (ui32 != (unsigned)(gint32)pDescr->offset)</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          return ProcessError(readIndex,"csnStreamDecoder FIXED value does not match", -1, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned int)ui32);</span><br><span style="color: hsl(120, 100%, 40%);">+        remaining_bits_len   -= no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+        bit_offset += no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_CALLBACK:</span><br><span style="color: hsl(120, 100%, 40%);">+      {</span><br><span style="color: hsl(120, 100%, 40%);">+        guint16  no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+        DissectorCallbackFcn_t callback = (DissectorCallbackFcn_t)pDescr->aux_fn;</span><br><span style="color: hsl(120, 100%, 40%);">+        LOGPC(DCSN1, LOGL_DEBUG, "CSN_CALLBACK(%s) | ", pDescr->sz);</span><br><span style="color: hsl(120, 100%, 40%);">+        no_of_bits = callback(vector, readIndex, pvDATA(data, pDescr->i), pvDATA(data, pDescr->offset));</span><br><span style="color: hsl(120, 100%, 40%);">+        remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+        bit_offset += no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_TRAP_ERROR:</span><br><span style="color: hsl(120, 100%, 40%);">+      {</span><br><span style="color: hsl(120, 100%, 40%);">+        return ProcessError(readIndex,"csnStreamDecoder", pDescr->i, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_END:</span><br><span style="color: hsl(120, 100%, 40%);">+      {</span><br><span style="color: hsl(120, 100%, 40%);">+        ar->remaining_bits_len  = remaining_bits_len;</span><br><span style="color: hsl(120, 100%, 40%);">+        ar->bit_offset = bit_offset;</span><br><span style="color: hsl(120, 100%, 40%);">+        return remaining_bits_len;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      default:</span><br><span style="color: hsl(120, 100%, 40%);">+      {</span><br><span style="color: hsl(120, 100%, 40%);">+        assert(0);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  } while (remaining_bits_len >= 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/csn1_enc.c b/src/csn1_enc.c</span><br><span>new file mode 100644</span><br><span>index 0000000..5518d06</span><br><span>--- /dev/null</span><br><span>+++ b/src/csn1_enc.c</span><br><span>@@ -0,0 +1,1305 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* csn1_enc.c</span><br><span style="color: hsl(120, 100%, 40%);">+ * Routines for CSN1 dissection in wireshark.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright (C) 2011 Ivan Klyuchnikov</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * By Vincent Helfre, based on original code by Jari Sassi</span><br><span style="color: hsl(120, 100%, 40%);">+ * with the gracious authorization of STE</span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright (c) 2011 ST-Ericsson</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * $Id: packet-csn1.c 39140 2011-09-25 22:01:50Z wmeier $</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Wireshark - Network traffic analyzer</span><br><span style="color: hsl(120, 100%, 40%);">+ * By Gerald Combs <gerald@wireshark.org></span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright 1998 Gerald Combs</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or</span><br><span style="color: hsl(120, 100%, 40%);">+ * modify it under the terms of the GNU General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * as published by the Free Software Foundation; either version 2</span><br><span style="color: hsl(120, 100%, 40%);">+ * of the License, or (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * along with this program; if not, write to the Free Software</span><br><span style="color: hsl(120, 100%, 40%);">+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <assert.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <string.h></span><br><span style="color: hsl(120, 100%, 40%);">+#define __STDC_FORMAT_MACROS</span><br><span style="color: hsl(120, 100%, 40%);">+#include <inttypes.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include "csn1.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include <gprs_debug.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/logging.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+extern const unsigned char ixBitsTab[];</span><br><span style="color: hsl(120, 100%, 40%);">+guint8 get_masked_bits8(struct bitvec *vector, unsigned *readIndex, gint bit_offset, const gint no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * ================================================================================================</span><br><span style="color: hsl(120, 100%, 40%);">+ * set initial/start values in help data structure used for packing/unpacking operation</span><br><span style="color: hsl(120, 100%, 40%);">+ * ================================================================================================</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, struct bitvec *vector, unsigned *writeIndex, void* data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  gint  remaining_bits_len = ar->remaining_bits_len;</span><br><span style="color: hsl(120, 100%, 40%);">+  gint  bit_offset         = ar->bit_offset;</span><br><span style="color: hsl(120, 100%, 40%);">+  guint8*  pui8;</span><br><span style="color: hsl(120, 100%, 40%);">+  guint16* pui16;</span><br><span style="color: hsl(120, 100%, 40%);">+  guint32* pui32;</span><br><span style="color: hsl(120, 100%, 40%);">+  guint64* pui64;</span><br><span style="color: hsl(120, 100%, 40%);">+  unsigned ib;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  guint8 Tag = STANDARD_TAG;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (remaining_bits_len < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+  {</span><br><span style="color: hsl(120, 100%, 40%);">+    return ProcessError(writeIndex, __func__, CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  do</span><br><span style="color: hsl(120, 100%, 40%);">+  {</span><br><span style="color: hsl(120, 100%, 40%);">+    switch (pDescr->type)</span><br><span style="color: hsl(120, 100%, 40%);">+    {</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_BIT:</span><br><span style="color: hsl(120, 100%, 40%);">+      {</span><br><span style="color: hsl(120, 100%, 40%);">+        if (remaining_bits_len > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          pui8  = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+         bitvec_write_field(vector, writeIndex, *pui8, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+          /* end add the bit value to protocol tree */</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+        else if (pDescr->may_be_null)</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGPC(DCSN1, LOGL_DEBUG, "%s = NULL | ", pDescr->sz);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+        else</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        remaining_bits_len--;</span><br><span style="color: hsl(120, 100%, 40%);">+        bit_offset++;</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_NULL:</span><br><span style="color: hsl(120, 100%, 40%);">+      { /* Empty member! */</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_UINT:</span><br><span style="color: hsl(120, 100%, 40%);">+      {</span><br><span style="color: hsl(120, 100%, 40%);">+        guint8 no_of_bits = (guint8) pDescr->i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (remaining_bits_len >= no_of_bits)</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (no_of_bits <= 8)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            pui8      = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+         bitvec_write_field(vector, writeIndex, *pui8, no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+          else if (no_of_bits <= 16)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            pui16       = pui16DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+          bitvec_write_field(vector, writeIndex, *pui16, no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , *pui16);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+          else if (no_of_bits <= 32)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            pui32       = pui32DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+          bitvec_write_field(vector, writeIndex, *pui32, no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , *pui32);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+          else</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_GENERAL, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+          bit_offset += no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+        else if (pDescr->may_be_null)</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGPC(DCSN1, LOGL_DEBUG, "%s = NULL | ", pDescr->sz);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+        else</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_UINT_OFFSET:</span><br><span style="color: hsl(120, 100%, 40%);">+      {</span><br><span style="color: hsl(120, 100%, 40%);">+        guint8 no_of_bits = (guint8) pDescr->i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (remaining_bits_len >= no_of_bits)</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (no_of_bits <= 8)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            pui8      = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+            bitvec_write_field(vector, writeIndex, *pui8 - (guint8)pDescr->descr.value, no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)(*pui8 - (guint8)pDescr->descr.value));</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+          else if (no_of_bits <= 16)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            pui16       = pui16DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+      bitvec_write_field(vector, writeIndex, *pui16 - (guint16)pDescr->descr.value, no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned short)(*pui16 - (guint16)pDescr->descr.value));</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+          else if (no_of_bits <= 32)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            pui32       = pui32DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+            bitvec_write_field(vector, writeIndex, *pui32 - (guint16)pDescr->descr.value, no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned int)(*pui32 - (guint16)pDescr->descr.value));</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+          else</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_GENERAL, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+        else</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+        bit_offset += no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_UINT_LH:</span><br><span style="color: hsl(120, 100%, 40%);">+      {</span><br><span style="color: hsl(120, 100%, 40%);">+        guint8 no_of_bits = (guint8) pDescr->i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (remaining_bits_len >= no_of_bits)</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (no_of_bits <= 8)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            pui8      = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+        bitvec_write_field(vector, writeIndex, *pui8, no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+            // TODO : Change get_masked_bits8()</span><br><span style="color: hsl(120, 100%, 40%);">+            *writeIndex -= no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+            guint8 ui8 = get_masked_bits8(vector, writeIndex, bit_offset, no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+            *writeIndex -= no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+           bitvec_write_field(vector, writeIndex, ui8, no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+          else</span><br><span style="color: hsl(120, 100%, 40%);">+          {/* Maybe we should support more than 8 bits ? */</span><br><span style="color: hsl(120, 100%, 40%);">+            return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_GENERAL, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+        else</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+        bit_offset += no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_UINT_ARRAY:</span><br><span style="color: hsl(120, 100%, 40%);">+      {</span><br><span style="color: hsl(120, 100%, 40%);">+        guint8  no_of_bits  = (guint8) pDescr->i;</span><br><span style="color: hsl(120, 100%, 40%);">+        guint16 nCount = (guint16)pDescr->descr.value; /* nCount supplied by value i.e. M_UINT_ARRAY(...) */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (pDescr->value != 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        { /* nCount specified by a reference to field holding value i.e. M_VAR_UINT_ARRAY(...) */</span><br><span style="color: hsl(120, 100%, 40%);">+          nCount = *pui16DATA(data, nCount);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (remaining_bits_len >= (no_of_bits * nCount))</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (no_of_bits <= 8)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            pui8 = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+            do</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+         bitvec_write_field(vector, writeIndex, *pui8, no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+              pui8++;</span><br><span style="color: hsl(120, 100%, 40%);">+              remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+              bit_offset += no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+            } while (--nCount > 0);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+          else if (no_of_bits <= 16)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            return ProcessError(writeIndex,"csnStreamEncoder NOTIMPLEMENTED", 999, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+          else if (no_of_bits <= 32)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            return ProcessError(writeIndex,"csnStreamEncoder NOTIMPLEMENTED", 999, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+          else</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_GENERAL, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+        else</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_VARIABLE_TARRAY_OFFSET:</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_VARIABLE_TARRAY:</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_TYPE_ARRAY:</span><br><span style="color: hsl(120, 100%, 40%);">+      {</span><br><span style="color: hsl(120, 100%, 40%);">+        gint16      Status;</span><br><span style="color: hsl(120, 100%, 40%);">+        csnStream_t arT    = *ar;</span><br><span style="color: hsl(120, 100%, 40%);">+        gint16      nCount = pDescr->i;</span><br><span style="color: hsl(120, 100%, 40%);">+        guint16     nSize  = (guint16)(gint32)pDescr->value;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        pui8 = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (pDescr->type == CSN_VARIABLE_TARRAY)</span><br><span style="color: hsl(120, 100%, 40%);">+        { /* Count specified in field */</span><br><span style="color: hsl(120, 100%, 40%);">+          nCount = *pui8DATA(data, pDescr->i);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+        else if (pDescr->type == CSN_VARIABLE_TARRAY_OFFSET)</span><br><span style="color: hsl(120, 100%, 40%);">+        { /* Count specified in field */</span><br><span style="color: hsl(120, 100%, 40%);">+          nCount = *pui8DATA(data, pDescr->i);</span><br><span style="color: hsl(120, 100%, 40%);">+       /*  nCount--; the 1 offset is already taken into account in CSN_UINT_OFFSET */</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        while (nCount > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        { /* resulting array of length 0 is possible</span><br><span style="color: hsl(120, 100%, 40%);">+           * but no bits shall be read from bitstream</span><br><span style="color: hsl(120, 100%, 40%);">+           */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGPC(DCSN1, LOGL_DEBUG, "%s : | ", pDescr->sz);</span><br><span style="color: hsl(120, 100%, 40%);">+          csnStreamInit(&arT, bit_offset, remaining_bits_len);</span><br><span style="color: hsl(120, 100%, 40%);">+          Status = csnStreamEncoder(&arT, (const CSN_DESCR*)pDescr->descr.ptr, vector, writeIndex, pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+          if (Status >= 0)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            pui8    += nSize;</span><br><span style="color: hsl(120, 100%, 40%);">+            remaining_bits_len = arT.remaining_bits_len;</span><br><span style="color: hsl(120, 100%, 40%);">+            bit_offset         = arT.bit_offset;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+          else</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            return Status;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+          nCount--;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_BITMAP:</span><br><span style="color: hsl(120, 100%, 40%);">+      { /* bitmap with given length. The result is left aligned! */</span><br><span style="color: hsl(120, 100%, 40%);">+        guint8 no_of_bits = (guint8) pDescr->i; /* length of bitmap */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (no_of_bits > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (no_of_bits > remaining_bits_len)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            return ProcessError(writeIndex, "csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          if (no_of_bits <= 32)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            for(ib = 0; ib < 4; ib++)</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+              pui8      = pui8DATA(data, pDescr->offset+ib);</span><br><span style="color: hsl(120, 100%, 40%);">+        bitvec_write_field(vector, writeIndex, *pui8, 8);</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPC(DCSN1, LOGL_DEBUG, "%s[%u] = %u | ", pDescr->sz , ib, (unsigned)*pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+          else if (no_of_bits <= 64)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            for(ib = 0; ib < 8; ib++)</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+              pui8      = pui8DATA(data, pDescr->offset+ib);</span><br><span style="color: hsl(120, 100%, 40%);">+       bitvec_write_field(vector, writeIndex, *pui8, 8);</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPC(DCSN1, LOGL_DEBUG, "%s[%u] = %u | ", pDescr->sz , ib, (unsigned)*pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+          else</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            return ProcessError(writeIndex,"csnStreamEncoder NOT IMPLEMENTED", 999, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+          bit_offset += no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+        /* bitmap was successfully extracted or it was empty */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_TYPE:</span><br><span style="color: hsl(120, 100%, 40%);">+      {</span><br><span style="color: hsl(120, 100%, 40%);">+        gint16      Status;</span><br><span style="color: hsl(120, 100%, 40%);">+        csnStream_t arT = *ar;</span><br><span style="color: hsl(120, 100%, 40%);">+        LOGPC(DCSN1, LOGL_DEBUG, " : %s | ", pDescr->sz);</span><br><span style="color: hsl(120, 100%, 40%);">+        csnStreamInit(&arT, bit_offset, remaining_bits_len);</span><br><span style="color: hsl(120, 100%, 40%);">+        Status = csnStreamEncoder(&arT, (const CSN_DESCR*)pDescr->descr.ptr, vector, writeIndex, pvDATA(data, pDescr->offset));</span><br><span style="color: hsl(120, 100%, 40%);">+        LOGPC(DCSN1, LOGL_DEBUG, " : End %s | ", pDescr->sz);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (Status >= 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          remaining_bits_len  = arT.remaining_bits_len;</span><br><span style="color: hsl(120, 100%, 40%);">+          bit_offset          = arT.bit_offset;</span><br><span style="color: hsl(120, 100%, 40%);">+          pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+        else</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          /* Has already been processed: ProcessError("csnStreamEncoder", Status, pDescr);  */</span><br><span style="color: hsl(120, 100%, 40%);">+          return Status;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_CHOICE:</span><br><span style="color: hsl(120, 100%, 40%);">+      {</span><br><span style="color: hsl(120, 100%, 40%);">+        gint16 count = pDescr->i;</span><br><span style="color: hsl(120, 100%, 40%);">+        const CSN_ChoiceElement_t* pChoice = (const CSN_ChoiceElement_t*) pDescr->descr.ptr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Make sure that the list of choice items is not empty */</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!count)</span><br><span style="color: hsl(120, 100%, 40%);">+          return ProcessError(writeIndex, "csnStreamEncoder", CSN_ERROR_IN_SCRIPT, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+        else if (count > 255) /* We can handle up to 256 (UCHAR_MAX) selectors */</span><br><span style="color: hsl(120, 100%, 40%);">+          return ProcessError(writeIndex, "csnStreamEncoder", CSN_ERROR_IN_SCRIPT, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Make sure that choice index is not out of range */</span><br><span style="color: hsl(120, 100%, 40%);">+        pui8 = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (*pui8 >= count)</span><br><span style="color: hsl(120, 100%, 40%);">+          return ProcessError(writeIndex, "csnStreamEncoder", CSN_ERROR_INVALID_UNION_INDEX, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        pChoice += *pui8;</span><br><span style="color: hsl(120, 100%, 40%);">+        guint8 no_of_bits = pChoice->bits;</span><br><span style="color: hsl(120, 100%, 40%);">+        guint8 value = pChoice->value;</span><br><span style="color: hsl(120, 100%, 40%);">+        LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pChoice->descr.sz , (unsigned)value);</span><br><span style="color: hsl(120, 100%, 40%);">+   bitvec_write_field(vector, writeIndex, value, no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        CSN_DESCR   descr[2];</span><br><span style="color: hsl(120, 100%, 40%);">+        gint16      Status;</span><br><span style="color: hsl(120, 100%, 40%);">+        csnStream_t arT = *ar;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        descr[0]      = pChoice->descr;</span><br><span style="color: hsl(120, 100%, 40%);">+        memset(&descr[1], 0x00, sizeof(CSN_DESCR));</span><br><span style="color: hsl(120, 100%, 40%);">+        descr[1].type = CSN_END;</span><br><span style="color: hsl(120, 100%, 40%);">+        bit_offset += no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+        remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        csnStreamInit(&arT, bit_offset, remaining_bits_len);</span><br><span style="color: hsl(120, 100%, 40%);">+        Status = csnStreamEncoder(&arT, descr, vector, writeIndex, data);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (Status >= 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          remaining_bits_len = arT.remaining_bits_len;</span><br><span style="color: hsl(120, 100%, 40%);">+          bit_offset         = arT.bit_offset;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+        else</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          return Status;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   case CSN_SERIALIZE:</span><br><span style="color: hsl(120, 100%, 40%);">+      {</span><br><span style="color: hsl(120, 100%, 40%);">+        StreamSerializeFcn_t serialize = (StreamSerializeFcn_t)pDescr->aux_fn;</span><br><span style="color: hsl(120, 100%, 40%);">+        csnStream_t          arT       = *ar;</span><br><span style="color: hsl(120, 100%, 40%);">+        guint8 length_len              = pDescr->i;</span><br><span style="color: hsl(120, 100%, 40%);">+        gint16               Status = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+        unsigned lengthIndex;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        // store writeIndex for length value (7 bit)</span><br><span style="color: hsl(120, 100%, 40%);">+        lengthIndex = *writeIndex;</span><br><span style="color: hsl(120, 100%, 40%);">+        *writeIndex += length_len;</span><br><span style="color: hsl(120, 100%, 40%);">+        bit_offset += length_len;</span><br><span style="color: hsl(120, 100%, 40%);">+        remaining_bits_len -= length_len;</span><br><span style="color: hsl(120, 100%, 40%);">+        arT.direction = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+        csnStreamInit(&arT, bit_offset, remaining_bits_len);</span><br><span style="color: hsl(120, 100%, 40%);">+        Status = serialize(&arT, vector, writeIndex, pvDATA(data, pDescr->offset));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  bitvec_write_field(vector, &lengthIndex, *writeIndex - lengthIndex - length_len, length_len);</span><br><span style="color: hsl(120, 100%, 40%);">+        LOGPC(DCSN1, LOGL_DEBUG, "%s length = %u | ", pDescr->sz , (unsigned)(*writeIndex - lengthIndex));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (Status >= 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          remaining_bits_len = arT.remaining_bits_len;</span><br><span style="color: hsl(120, 100%, 40%);">+          bit_offset         = arT.bit_offset;</span><br><span style="color: hsl(120, 100%, 40%);">+          pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+        else</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          // Has already been processed:</span><br><span style="color: hsl(120, 100%, 40%);">+          return Status;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_UNION_LH:</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_UNION:</span><br><span style="color: hsl(120, 100%, 40%);">+      {</span><br><span style="color: hsl(120, 100%, 40%);">+        gint16           Bits;</span><br><span style="color: hsl(120, 100%, 40%);">+        guint8           index;</span><br><span style="color: hsl(120, 100%, 40%);">+        gint16           count      = pDescr->i;</span><br><span style="color: hsl(120, 100%, 40%);">+        const CSN_DESCR* pDescrNext = pDescr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescrNext += count + 1; /* now this is next after the union */</span><br><span style="color: hsl(120, 100%, 40%);">+        if ((count <= 0) || (count > 16))</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_INVALID_UNION_INDEX, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Now get the bits to extract the index */</span><br><span style="color: hsl(120, 100%, 40%);">+        Bits = ixBitsTab[count];</span><br><span style="color: hsl(120, 100%, 40%);">+        index = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Assign UnionType */</span><br><span style="color: hsl(120, 100%, 40%);">+        pui8  = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+ //read index from data and write to vector</span><br><span style="color: hsl(120, 100%, 40%);">+    bitvec_write_field(vector, writeIndex, *pui8, Bits);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        //decode index</span><br><span style="color: hsl(120, 100%, 40%);">+        *writeIndex -= Bits;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        while (Bits > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          index <<= 1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          if (CSN_UNION_LH == pDescr->type)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            index |= get_masked_bits8(vector, writeIndex, bit_offset, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+          else</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+          index |= bitvec_read_field(vector, writeIndex, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          remaining_bits_len--;</span><br><span style="color: hsl(120, 100%, 40%);">+          bit_offset++;</span><br><span style="color: hsl(120, 100%, 40%);">+          Bits--;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        *writeIndex -= Bits;</span><br><span style="color: hsl(120, 100%, 40%);">+ bitvec_write_field(vector, writeIndex, index, Bits);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* script index to continue on, limited in case we do not have a power of 2 */</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr += (MIN(index + 1, count));</span><br><span style="color: hsl(120, 100%, 40%);">+        LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)index);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        switch (pDescr->type)</span><br><span style="color: hsl(120, 100%, 40%);">+        { /* get the right element of the union based on computed index */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          case CSN_BIT:</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            pui8  = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+          bitvec_write_field(vector, writeIndex, *pui8, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+            remaining_bits_len--;</span><br><span style="color: hsl(120, 100%, 40%);">+            bit_offset++;</span><br><span style="color: hsl(120, 100%, 40%);">+            pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          case CSN_NULL:</span><br><span style="color: hsl(120, 100%, 40%);">+          { /* Empty member! */</span><br><span style="color: hsl(120, 100%, 40%);">+            pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          case CSN_UINT:</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            guint8 no_of_bits = (guint8) pDescr->i;</span><br><span style="color: hsl(120, 100%, 40%);">+            if (remaining_bits_len >= no_of_bits)</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+              if (no_of_bits <= 8)</span><br><span style="color: hsl(120, 100%, 40%);">+              {</span><br><span style="color: hsl(120, 100%, 40%);">+                pui8      = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+                bitvec_write_field(vector, writeIndex, *pui8, no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+                LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+              else if (no_of_bits <= 16)</span><br><span style="color: hsl(120, 100%, 40%);">+              {</span><br><span style="color: hsl(120, 100%, 40%);">+                pui16       = pui16DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+              bitvec_write_field(vector, writeIndex, *pui16, no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+                LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , *pui16);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+              else if (no_of_bits <= 32)</span><br><span style="color: hsl(120, 100%, 40%);">+              {</span><br><span style="color: hsl(120, 100%, 40%);">+                pui32       = pui32DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+              bitvec_write_field(vector, writeIndex, *pui32, no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+                LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , *pui32);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+              else</span><br><span style="color: hsl(120, 100%, 40%);">+              {</span><br><span style="color: hsl(120, 100%, 40%);">+                return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_GENERAL, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+            else</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+              return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_GENERAL, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+            bit_offset += no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+            pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          case CSN_UINT_OFFSET:</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            guint8 no_of_bits = (guint8) pDescr->i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            if (remaining_bits_len >= no_of_bits)</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+              if (no_of_bits <= 8)</span><br><span style="color: hsl(120, 100%, 40%);">+              {</span><br><span style="color: hsl(120, 100%, 40%);">+                pui8      = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+         bitvec_write_field(vector, writeIndex, *pui8 - (guint8)pDescr->descr.value, no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+                LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)(*pui8 - (guint8)pDescr->descr.value));</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+              else if (no_of_bits <= 16)</span><br><span style="color: hsl(120, 100%, 40%);">+              {</span><br><span style="color: hsl(120, 100%, 40%);">+                pui16       = pui16DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+          bitvec_write_field(vector, writeIndex, *pui16 - (guint16)pDescr->descr.value, no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+                LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned short)(*pui16 - (guint16)pDescr->descr.value));</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+              else if (no_of_bits <= 32)</span><br><span style="color: hsl(120, 100%, 40%);">+              {</span><br><span style="color: hsl(120, 100%, 40%);">+                pui32       = pui32DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+                bitvec_write_field(vector, writeIndex, *pui32 - (guint16)pDescr->descr.value, no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+                LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned int)(*pui32 - (guint16)pDescr->descr.value));</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+              else</span><br><span style="color: hsl(120, 100%, 40%);">+              {</span><br><span style="color: hsl(120, 100%, 40%);">+                return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_GENERAL, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+            else</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+              return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+            bit_offset += no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+            pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          case CSN_UINT_LH:</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            guint8 no_of_bits = (guint8) pDescr->i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            if (remaining_bits_len >= no_of_bits)</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+              remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+              if (no_of_bits <= 8)</span><br><span style="color: hsl(120, 100%, 40%);">+              {</span><br><span style="color: hsl(120, 100%, 40%);">+                pui8      = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+               bitvec_write_field(vector, writeIndex, *pui8, no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+                // TODO : Change get_masked_bits8()</span><br><span style="color: hsl(120, 100%, 40%);">+                *writeIndex -= no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+                guint8 ui8 = get_masked_bits8(vector, writeIndex, bit_offset, no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+                *writeIndex -= no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+           bitvec_write_field(vector, writeIndex, ui8, no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+                LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+              else</span><br><span style="color: hsl(120, 100%, 40%);">+              {/* Maybe we should support more than 8 bits ? */</span><br><span style="color: hsl(120, 100%, 40%);">+                return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_GENERAL, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+            else</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+              return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+            bit_offset += no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+            pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          case CSN_UINT_ARRAY:</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            guint8  no_of_bits  = (guint8) pDescr->i;</span><br><span style="color: hsl(120, 100%, 40%);">+            guint16 nCount = (guint16)pDescr->descr.value; /* nCount supplied by value i.e. M_UINT_ARRAY(...) */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            if (pDescr->value != 0)</span><br><span style="color: hsl(120, 100%, 40%);">+            { /* nCount specified by a reference to field holding value i.e. M_VAR_UINT_ARRAY(...) */</span><br><span style="color: hsl(120, 100%, 40%);">+              nCount = *pui16DATA(data, nCount);</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            if (remaining_bits_len >= (no_of_bits * nCount))</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+              if (no_of_bits <= 8)</span><br><span style="color: hsl(120, 100%, 40%);">+              {</span><br><span style="color: hsl(120, 100%, 40%);">+                pui8 = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+                do</span><br><span style="color: hsl(120, 100%, 40%);">+                {</span><br><span style="color: hsl(120, 100%, 40%);">+             bitvec_write_field(vector, writeIndex, *pui8, no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+                  LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+                  pui8++;</span><br><span style="color: hsl(120, 100%, 40%);">+                  remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+                  bit_offset += no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+                } while (--nCount > 0);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+              else if (no_of_bits <= 16)</span><br><span style="color: hsl(120, 100%, 40%);">+              {</span><br><span style="color: hsl(120, 100%, 40%);">+                return ProcessError(writeIndex,"csnStreamEncoder NOTIMPLEMENTED", 999, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+              else if (no_of_bits <= 32)</span><br><span style="color: hsl(120, 100%, 40%);">+              {</span><br><span style="color: hsl(120, 100%, 40%);">+                return ProcessError(writeIndex,"csnStreamEncoder NOTIMPLEMENTED", 999, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+              else</span><br><span style="color: hsl(120, 100%, 40%);">+              {</span><br><span style="color: hsl(120, 100%, 40%);">+                return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_GENERAL, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+            else</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+              return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+            pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          case CSN_VARIABLE_TARRAY_OFFSET:</span><br><span style="color: hsl(120, 100%, 40%);">+          case CSN_VARIABLE_TARRAY:</span><br><span style="color: hsl(120, 100%, 40%);">+          case CSN_TYPE_ARRAY:</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            gint16      Status;</span><br><span style="color: hsl(120, 100%, 40%);">+            csnStream_t arT    = *ar;</span><br><span style="color: hsl(120, 100%, 40%);">+            gint16      nCount = pDescr->i;</span><br><span style="color: hsl(120, 100%, 40%);">+            guint16     nSize  = (guint16)(gint32)pDescr->value;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            pui8 = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+            if (pDescr->type == CSN_VARIABLE_TARRAY)</span><br><span style="color: hsl(120, 100%, 40%);">+            { /* Count specified in field */</span><br><span style="color: hsl(120, 100%, 40%);">+              nCount = *pui8DATA(data, pDescr->i);</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+            else if (pDescr->type == CSN_VARIABLE_TARRAY_OFFSET)</span><br><span style="color: hsl(120, 100%, 40%);">+            { /* Count specified in field */</span><br><span style="color: hsl(120, 100%, 40%);">+              nCount = *pui8DATA(data, pDescr->i);</span><br><span style="color: hsl(120, 100%, 40%);">+              /*  nCount--; the 1 offset is already taken into account in CSN_UINT_OFFSET */</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            while (nCount > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+            { /* resulting array of length 0 is possible</span><br><span style="color: hsl(120, 100%, 40%);">+               * but no bits shall be read from bitstream</span><br><span style="color: hsl(120, 100%, 40%);">+               */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPC(DCSN1, LOGL_DEBUG, "%s : | ", pDescr->sz);</span><br><span style="color: hsl(120, 100%, 40%);">+              csnStreamInit(&arT, bit_offset, remaining_bits_len);</span><br><span style="color: hsl(120, 100%, 40%);">+              Status = csnStreamEncoder(&arT, (const CSN_DESCR*)pDescr->descr.ptr, vector, writeIndex, pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+              if (Status >= 0)</span><br><span style="color: hsl(120, 100%, 40%);">+              {</span><br><span style="color: hsl(120, 100%, 40%);">+                pui8    += nSize;</span><br><span style="color: hsl(120, 100%, 40%);">+                remaining_bits_len = arT.remaining_bits_len;</span><br><span style="color: hsl(120, 100%, 40%);">+                bit_offset         = arT.bit_offset;</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+              else</span><br><span style="color: hsl(120, 100%, 40%);">+              {</span><br><span style="color: hsl(120, 100%, 40%);">+                return Status;</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+              nCount--;</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          case CSN_BITMAP:</span><br><span style="color: hsl(120, 100%, 40%);">+          { /* bitmap with given length. The result is left aligned! */</span><br><span style="color: hsl(120, 100%, 40%);">+            guint8 no_of_bits = (guint8) pDescr->i; /* length of bitmap */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            if (no_of_bits > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+              if (no_of_bits > remaining_bits_len)</span><br><span style="color: hsl(120, 100%, 40%);">+              {</span><br><span style="color: hsl(120, 100%, 40%);">+                return ProcessError(writeIndex, "csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              if (no_of_bits <= 32)</span><br><span style="color: hsl(120, 100%, 40%);">+              {</span><br><span style="color: hsl(120, 100%, 40%);">+                pui32 = pui32DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+              bitvec_write_field(vector, writeIndex, *pui32, no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+                LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , *pui32);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+              else if (no_of_bits <= 64)</span><br><span style="color: hsl(120, 100%, 40%);">+              {</span><br><span style="color: hsl(120, 100%, 40%);">+                pui64 = pui64DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+            bitvec_write_field(vector, writeIndex, *pui64, no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+                LOGPC(DCSN1, LOGL_DEBUG, "%s = %lu | ", pDescr->sz , *pui64);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+              else</span><br><span style="color: hsl(120, 100%, 40%);">+              {</span><br><span style="color: hsl(120, 100%, 40%);">+                 return ProcessError(writeIndex,"csnStreamEncoder NOT IMPLEMENTED", 999, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+              bit_offset += no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+            /* bitmap was successfully extracted or it was empty */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          case CSN_TYPE:</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            gint16      Status;</span><br><span style="color: hsl(120, 100%, 40%);">+            csnStream_t arT = *ar;</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGPC(DCSN1, LOGL_DEBUG, " : %s | ", pDescr->sz);</span><br><span style="color: hsl(120, 100%, 40%);">+            csnStreamInit(&arT, bit_offset, remaining_bits_len);</span><br><span style="color: hsl(120, 100%, 40%);">+            Status = csnStreamEncoder(&arT, (const CSN_DESCR*)pDescr->descr.ptr, vector, writeIndex, pvDATA(data, pDescr->offset));</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGPC(DCSN1, LOGL_DEBUG, " : End %s | ", pDescr->sz);</span><br><span style="color: hsl(120, 100%, 40%);">+            if (Status >= 0)</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+              remaining_bits_len  = arT.remaining_bits_len;</span><br><span style="color: hsl(120, 100%, 40%);">+              bit_offset          = arT.bit_offset;</span><br><span style="color: hsl(120, 100%, 40%);">+              pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+            else</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* Has already been processed: ProcessError("csnStreamEncoder", Status, pDescr);  */</span><br><span style="color: hsl(120, 100%, 40%);">+              return Status;</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          default:</span><br><span style="color: hsl(120, 100%, 40%);">+          { /* descriptions of union elements other than above are illegal */</span><br><span style="color: hsl(120, 100%, 40%);">+            return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_IN_SCRIPT, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr = pDescrNext;</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_EXIST:</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_EXIST_LH:</span><br><span style="color: hsl(120, 100%, 40%);">+      {</span><br><span style="color: hsl(120, 100%, 40%);">+        guint8 fExist;</span><br><span style="color: hsl(120, 100%, 40%);">+        unsigned exist = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+        pui8  = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+        exist = *pui8;</span><br><span style="color: hsl(120, 100%, 40%);">+      bitvec_write_field(vector, writeIndex, *pui8, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+        writeIndex--;</span><br><span style="color: hsl(120, 100%, 40%);">+        if (CSN_EXIST_LH == pDescr->type)</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          fExist = get_masked_bits8(vector, writeIndex, bit_offset, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+        else</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          fExist = bitvec_read_field(vector, writeIndex, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+        writeIndex--;</span><br><span style="color: hsl(120, 100%, 40%);">+        bitvec_write_field(vector, writeIndex, fExist, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+        LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz, (unsigned)fExist);</span><br><span style="color: hsl(120, 100%, 40%);">+        remaining_bits_len--;</span><br><span style="color: hsl(120, 100%, 40%);">+        bit_offset++;</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!exist)</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          ar->remaining_bits_len  = remaining_bits_len;</span><br><span style="color: hsl(120, 100%, 40%);">+          ar->bit_offset          = bit_offset;</span><br><span style="color: hsl(120, 100%, 40%);">+          return remaining_bits_len;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_NEXT_EXIST:</span><br><span style="color: hsl(120, 100%, 40%);">+      {</span><br><span style="color: hsl(120, 100%, 40%);">+        guint8 fExist;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        pui8  = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* this if-statement represents the M_NEXT_EXIST_OR_NULL description element */</span><br><span style="color: hsl(120, 100%, 40%);">+        if ((pDescr->may_be_null) && (remaining_bits_len == 0))</span><br><span style="color: hsl(120, 100%, 40%);">+        { /* no more bits to decode is fine here - end of message detected and allowed */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          /* Skip i entries + this entry */</span><br><span style="color: hsl(120, 100%, 40%);">+          pDescr += pDescr->i + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          break;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     bitvec_write_field(vector, writeIndex, *pui8, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+        fExist = *pui8;</span><br><span style="color: hsl(120, 100%, 40%);">+        LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        remaining_bits_len--;</span><br><span style="color: hsl(120, 100%, 40%);">+        bit_offset++;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (fExist == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        { /* Skip 'i' entries */</span><br><span style="color: hsl(120, 100%, 40%);">+          pDescr += pDescr->i;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_NEXT_EXIST_LH:</span><br><span style="color: hsl(120, 100%, 40%);">+      {</span><br><span style="color: hsl(120, 100%, 40%);">+        guint8 fExist;</span><br><span style="color: hsl(120, 100%, 40%);">+        pui8  = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* this if-statement represents the M_NEXT_EXIST_OR_NULL_LH description element */</span><br><span style="color: hsl(120, 100%, 40%);">+        if ((pDescr->descr.ptr != NULL) && (remaining_bits_len == 0))</span><br><span style="color: hsl(120, 100%, 40%);">+        { /* no more bits to decode is fine here - end of message detected and allowed */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          /* skip 'i' entries + this entry */</span><br><span style="color: hsl(120, 100%, 40%);">+          pDescr += pDescr->i + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          /* set the data member to "not exist" */</span><br><span style="color: hsl(120, 100%, 40%);">+          //*pui8 = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+          break;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* the "regular" M_NEXT_EXIST_LH description element */</span><br><span style="color: hsl(120, 100%, 40%);">+   bitvec_write_field(vector, writeIndex, *pui8, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+        writeIndex--;</span><br><span style="color: hsl(120, 100%, 40%);">+        fExist = get_masked_bits8(vector, writeIndex, bit_offset, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+        writeIndex--;</span><br><span style="color: hsl(120, 100%, 40%);">+        bitvec_write_field(vector, writeIndex, fExist, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+        pui8++;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        remaining_bits_len--;</span><br><span style="color: hsl(120, 100%, 40%);">+        bit_offset++;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (fExist == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        { /* Skip 'i' entries */</span><br><span style="color: hsl(120, 100%, 40%);">+          pDescr += pDescr->i;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_VARIABLE_BITMAP_1:</span><br><span style="color: hsl(120, 100%, 40%);">+      { /* Bitmap from here and to the end of message */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        //*pui8DATA(data, (gint16)pDescr->descr.value) = (guint8) remaining_bits_len; /* length of bitmap == remaining bits */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /*no break -</span><br><span style="color: hsl(120, 100%, 40%);">+         * with a length set we have a regular variable length bitmap so we continue */</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+      /* FALL THROUGH */</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_VARIABLE_BITMAP:</span><br><span style="color: hsl(120, 100%, 40%);">+      { /* {CSN_VARIABLE_BITMAP, 0, offsetof(_STRUCT, _ElementCountField), offsetof(_STRUCT, _MEMBER), #_MEMBER}</span><br><span style="color: hsl(120, 100%, 40%);">+         * <N: bit (5)> <bitmap: bit(N + offset)></span><br><span style="color: hsl(120, 100%, 40%);">+         * Bit array with length (in bits) specified in parameter (pDescr->descr)</span><br><span style="color: hsl(120, 100%, 40%);">+         * The result is right aligned!</span><br><span style="color: hsl(120, 100%, 40%);">+         */</span><br><span style="color: hsl(120, 100%, 40%);">+        gint16 no_of_bits = *pui8DATA(data, (gint16)pDescr->descr.value);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        no_of_bits += pDescr->i; /* adjusted by offset */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (no_of_bits > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          if (remaining_bits_len < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          { /* extract bits */</span><br><span style="color: hsl(120, 100%, 40%);">+            guint8* pui8 = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+            gint16 nB1  = no_of_bits & 0x07;/* no_of_bits Mod 8 */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            if (nB1 > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+            { /* take care of the first byte - it will be right aligned */</span><br><span style="color: hsl(120, 100%, 40%);">+             bitvec_write_field(vector, writeIndex, *pui8, nB1);</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+              pui8++;</span><br><span style="color: hsl(120, 100%, 40%);">+              no_of_bits  -= nB1;</span><br><span style="color: hsl(120, 100%, 40%);">+              bit_offset += nB1; /* (nB1 is no_of_bits Mod 8) */</span><br><span style="color: hsl(120, 100%, 40%);">+              remaining_bits_len -= nB1;</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            /* remaining no_of_bits is a multiple of 8 or 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+            while (no_of_bits > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+            bitvec_write_field(vector, writeIndex, *pui8, 8);</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+              pui8++;</span><br><span style="color: hsl(120, 100%, 40%);">+              no_of_bits -= 8;</span><br><span style="color: hsl(120, 100%, 40%);">+              remaining_bits_len -= 8;</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_LEFT_ALIGNED_VAR_BMP_1:</span><br><span style="color: hsl(120, 100%, 40%);">+      { /* Bitmap from here and to the end of message */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        //*pui8DATA(data, (gint16)pDescr->descr.value) = (guint8) remaining_bits_len; /* length of bitmap == remaining bits */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* no break -</span><br><span style="color: hsl(120, 100%, 40%);">+         * with a length set we have a regular left aligned variable length bitmap so we continue</span><br><span style="color: hsl(120, 100%, 40%);">+         */</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+      /* FALL THROUGH */</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_LEFT_ALIGNED_VAR_BMP:</span><br><span style="color: hsl(120, 100%, 40%);">+      { /* {CSN_LEFT_ALIGNED_VAR_BMP, _OFFSET, (void*)offsetof(_STRUCT, _ElementCountField), offsetof(_STRUCT, _MEMBER), #_MEMBER}</span><br><span style="color: hsl(120, 100%, 40%);">+         * <N: bit (5)> <bitmap: bit(N + offset)></span><br><span style="color: hsl(120, 100%, 40%);">+         * bit array with length (in bits) specified in parameter (pDescr->descr)</span><br><span style="color: hsl(120, 100%, 40%);">+         */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        gint16 no_of_bits = *pui8DATA(data, (gint16)pDescr->descr.value);/* Size of bitmap */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        no_of_bits += pDescr->i;/* size adjusted by offset */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (no_of_bits > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          if (remaining_bits_len < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          { /* extract bits */</span><br><span style="color: hsl(120, 100%, 40%);">+            guint8* pui8 = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+            gint16 nB1  = no_of_bits & 0x07;/* no_of_bits Mod 8 */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            while (no_of_bits > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+        bitvec_write_field(vector, writeIndex, *pui8, 8);</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+              pui8++;</span><br><span style="color: hsl(120, 100%, 40%);">+              no_of_bits -= 8;</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+            if (nB1 > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+         bitvec_write_field(vector, writeIndex, *pui8, nB1);</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+              pui8++;</span><br><span style="color: hsl(120, 100%, 40%);">+              no_of_bits  -= nB1;</span><br><span style="color: hsl(120, 100%, 40%);">+              bit_offset += nB1; /* (nB1 is no_of_bits Mod 8) */</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* bitmap was successfully extracted or it was empty */</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_PADDING_BITS:</span><br><span style="color: hsl(120, 100%, 40%);">+      { /* Padding from here and to the end of message */</span><br><span style="color: hsl(120, 100%, 40%);">+        LOGPC(DCSN1, LOGL_DEBUG, "%s = ", pDescr->sz);</span><br><span style="color: hsl(120, 100%, 40%);">+        guint8 filler = 0x2b;</span><br><span style="color: hsl(120, 100%, 40%);">+        if (remaining_bits_len > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          while (remaining_bits_len > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            guint8 bits_to_handle = remaining_bits_len%8;</span><br><span style="color: hsl(120, 100%, 40%);">+            if (bits_to_handle > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* section 11 of 44.060</span><br><span style="color: hsl(120, 100%, 40%);">+               * The padding bits may be the 'null' string. Otherwise, the</span><br><span style="color: hsl(120, 100%, 40%);">+               * padding bits starts with bit '0', followed by 'spare padding'</span><br><span style="color: hsl(120, 100%, 40%);">+               * < padding bits > ::= { null | 0 < spare padding > ! < Ignore : 1 bit** = < no string > > } ;</span><br><span style="color: hsl(120, 100%, 40%);">+              */</span><br><span style="color: hsl(120, 100%, 40%);">+              guint8 fl = filler&(0xff>>(8-bits_to_handle + 1));</span><br><span style="color: hsl(120, 100%, 40%);">+       bitvec_write_field(vector, writeIndex, fl, bits_to_handle);</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPC(DCSN1, LOGL_DEBUG, "%u|", fl);</span><br><span style="color: hsl(120, 100%, 40%);">+              remaining_bits_len -= bits_to_handle;</span><br><span style="color: hsl(120, 100%, 40%);">+              bit_offset += bits_to_handle;</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+            else if (bits_to_handle == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+          bitvec_write_field(vector, writeIndex, filler, 8);</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPC(DCSN1, LOGL_DEBUG, "%u|", filler);</span><br><span style="color: hsl(120, 100%, 40%);">+              remaining_bits_len -= 8;</span><br><span style="color: hsl(120, 100%, 40%);">+              bit_offset += 8;</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+        if (remaining_bits_len < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Padding was successfully extracted or it was empty */</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_VARIABLE_ARRAY:</span><br><span style="color: hsl(120, 100%, 40%);">+      { /* {int type; int i; void* descr; int offset; const char* sz; } CSN_DESCR;</span><br><span style="color: hsl(120, 100%, 40%);">+         * {CSN_VARIABLE_ARRAY, _OFFSET, (void*)offsetof(_STRUCT, _ElementCountField), offsetof(_STRUCT, _MEMBER), #_MEMBER}</span><br><span style="color: hsl(120, 100%, 40%);">+         * Array with length specified in parameter:</span><br><span style="color: hsl(120, 100%, 40%);">+         *  <count: bit (x)></span><br><span style="color: hsl(120, 100%, 40%);">+         *  <list: octet(count + offset)></span><br><span style="color: hsl(120, 100%, 40%);">+         */</span><br><span style="color: hsl(120, 100%, 40%);">+        gint16 count = *pui8DATA(data, (gint16)pDescr->descr.value);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        count += pDescr->i; /* Adjusted by offset */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (count > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (remaining_bits_len < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          pui8 = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          while (count > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+     bitvec_write_field(vector, writeIndex, *pui8, 8);</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGPC(DCSN1, LOGL_DEBUG, "%s = 0x%x | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+            pui8++;</span><br><span style="color: hsl(120, 100%, 40%);">+            bit_offset += 8;</span><br><span style="color: hsl(120, 100%, 40%);">+            remaining_bits_len -= 8;</span><br><span style="color: hsl(120, 100%, 40%);">+            count--;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_RECURSIVE_ARRAY:</span><br><span style="color: hsl(120, 100%, 40%);">+      { /* Recursive way to specify an array: <list> ::= {1 <number: bit (4)> <list> | 0}</span><br><span style="color: hsl(120, 100%, 40%);">+         *  or more generally:                <list> ::= { <tag> <element> <list> | <EndTag> }</span><br><span style="color: hsl(120, 100%, 40%);">+         *  where <element> ::= bit(value)</span><br><span style="color: hsl(120, 100%, 40%);">+         *        <tag>     ::= 0 | 1</span><br><span style="color: hsl(120, 100%, 40%);">+         *        <EndTag>  ::= reversed tag i.e. tag == 1 -> EndTag == 0 and vice versa</span><br><span style="color: hsl(120, 100%, 40%);">+         * {CSN_RECURSIVE_ARRAY, _BITS, (void*)offsetof(_STRUCT, _ElementCountField), offsetof(_STRUCT, _MEMBER), #_MEMBER}</span><br><span style="color: hsl(120, 100%, 40%);">+         * REMARK: recursive way to specify an array but an iterative implementation!</span><br><span style="color: hsl(120, 100%, 40%);">+         */</span><br><span style="color: hsl(120, 100%, 40%);">+        gint16 no_of_bits        = pDescr->i;</span><br><span style="color: hsl(120, 100%, 40%);">+        guint8  ElementCount = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+        pui8  = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+        ElementCount = *pui8DATA(data, (gint16)pDescr->descr.value);</span><br><span style="color: hsl(120, 100%, 40%);">+        while (ElementCount > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        { /* tag control shows existence of next list elements */</span><br><span style="color: hsl(120, 100%, 40%);">+         bitvec_write_field(vector, writeIndex, Tag, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)Tag);</span><br><span style="color: hsl(120, 100%, 40%);">+          bit_offset++;</span><br><span style="color: hsl(120, 100%, 40%);">+          remaining_bits_len--;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          /* extract and store no_of_bits long element from bitstream */</span><br><span style="color: hsl(120, 100%, 40%);">+     bitvec_write_field(vector, writeIndex, *pui8, no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)*pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+          pui8++;</span><br><span style="color: hsl(120, 100%, 40%);">+          ElementCount--;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          if (remaining_bits_len < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          bit_offset += no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+          remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        bitvec_write_field(vector, writeIndex, !Tag, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+        LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)(!Tag));</span><br><span style="color: hsl(120, 100%, 40%);">+        bit_offset++;</span><br><span style="color: hsl(120, 100%, 40%);">+        remaining_bits_len--;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_RECURSIVE_TARRAY:</span><br><span style="color: hsl(120, 100%, 40%);">+      { /* Recursive way to specify an array of type: <lists> ::= { 1 <type> } ** 0 ;</span><br><span style="color: hsl(120, 100%, 40%);">+         *  M_REC_TARRAY(_STRUCT, _MEMBER, _MEMBER_TYPE, _ElementCountField)</span><br><span style="color: hsl(120, 100%, 40%);">+         * {t, offsetof(_STRUCT, _ElementCountField), (void*)CSNDESCR_##_MEMBER_TYPE, offsetof(_STRUCT, _MEMBER), #_MEMBER, (StreamSerializeFcn_t)sizeof(_MEMBER_TYPE)}</span><br><span style="color: hsl(120, 100%, 40%);">+         */</span><br><span style="color: hsl(120, 100%, 40%);">+        gint16 nSizeElement = (gint16)(gint32)pDescr->value;</span><br><span style="color: hsl(120, 100%, 40%);">+        guint8  ElementCount = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+        pui8  = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Store the counted number of elements of the array */</span><br><span style="color: hsl(120, 100%, 40%);">+        ElementCount = *pui8DATA(data, (gint16)(gint32)pDescr->i);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        while (ElementCount > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        { /* tag control shows existence of next list elements */</span><br><span style="color: hsl(120, 100%, 40%);">+          bitvec_write_field(vector, writeIndex, Tag, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)Tag);</span><br><span style="color: hsl(120, 100%, 40%);">+          bit_offset++;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          remaining_bits_len--;</span><br><span style="color: hsl(120, 100%, 40%);">+          ElementCount--;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          { /* unpack the following data structure */</span><br><span style="color: hsl(120, 100%, 40%);">+            csnStream_t arT = *ar;</span><br><span style="color: hsl(120, 100%, 40%);">+            gint16      Status;</span><br><span style="color: hsl(120, 100%, 40%);">+            csnStreamInit(&arT, bit_offset, remaining_bits_len);</span><br><span style="color: hsl(120, 100%, 40%);">+            Status = csnStreamEncoder(&arT, (const CSN_DESCR*)pDescr->descr.ptr, vector, writeIndex, pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            if (Status >= 0)</span><br><span style="color: hsl(120, 100%, 40%);">+            { /* successful completion */</span><br><span style="color: hsl(120, 100%, 40%);">+              pui8    += nSizeElement;  /* -> to next data element */</span><br><span style="color: hsl(120, 100%, 40%);">+              remaining_bits_len = arT.remaining_bits_len;</span><br><span style="color: hsl(120, 100%, 40%);">+              bit_offset         = arT.bit_offset;</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+            else</span><br><span style="color: hsl(120, 100%, 40%);">+            { /* something went awry */</span><br><span style="color: hsl(120, 100%, 40%);">+              return Status;</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          if (remaining_bits_len < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    bitvec_write_field(vector, writeIndex, !Tag, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+        LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)(!Tag));</span><br><span style="color: hsl(120, 100%, 40%);">+        bit_offset++;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_RECURSIVE_TARRAY_2:</span><br><span style="color: hsl(120, 100%, 40%);">+      { /* Recursive way to specify an array of type: <list> ::= <type> { 0 <type> } ** 1 ; */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        Tag = REVERSED_TAG;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* NO break -</span><br><span style="color: hsl(120, 100%, 40%);">+         * handling is exactly the same as for CSN_RECURSIVE_TARRAY_1 so we continue</span><br><span style="color: hsl(120, 100%, 40%);">+         */</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+      /* FALL THROUGH */</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_RECURSIVE_TARRAY_1:</span><br><span style="color: hsl(120, 100%, 40%);">+      { /* Recursive way to specify an array of type: <lists> ::= <type> { 1 <type> } ** 0 ;</span><br><span style="color: hsl(120, 100%, 40%);">+         * M_REC_TARRAY(_STRUCT, _MEMBER, _MEMBER_TYPE, _ElementCountField)</span><br><span style="color: hsl(120, 100%, 40%);">+         * {t, offsetof(_STRUCT, _ElementCountField), (void*)CSNDESCR_##_MEMBER_TYPE, offsetof(_STRUCT, _MEMBER), #_MEMBER, (StreamSerializeFcn_t)sizeof(_MEMBER_TYPE)}</span><br><span style="color: hsl(120, 100%, 40%);">+         */</span><br><span style="color: hsl(120, 100%, 40%);">+        gint16      nSizeElement = (gint16)(gint32)pDescr->value;</span><br><span style="color: hsl(120, 100%, 40%);">+        guint8      ElementCount = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+        guint8      ElementNum   = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+        csnStream_t arT          = *ar;</span><br><span style="color: hsl(120, 100%, 40%);">+        gint16      Status;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        pui8  = pui8DATA(data, pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Store the count of the array */</span><br><span style="color: hsl(120, 100%, 40%);">+        ElementCount = *pui8DATA(data, pDescr->i);</span><br><span style="color: hsl(120, 100%, 40%);">+        ElementNum = ElementCount;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        while (ElementCount > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        { /* get data element */</span><br><span style="color: hsl(120, 100%, 40%);">+          if (ElementCount != ElementNum)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+           bitvec_write_field(vector, writeIndex, Tag, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)Tag);</span><br><span style="color: hsl(120, 100%, 40%);">+            bit_offset++;</span><br><span style="color: hsl(120, 100%, 40%);">+            remaining_bits_len--;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+          ElementCount--;</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGPC(DCSN1, LOGL_DEBUG, "%s { | ", pDescr->sz);</span><br><span style="color: hsl(120, 100%, 40%);">+          csnStreamInit(&arT, bit_offset, remaining_bits_len);</span><br><span style="color: hsl(120, 100%, 40%);">+          Status = csnStreamEncoder(&arT, (const CSN_DESCR*)pDescr->descr.ptr, vector, writeIndex, pui8);</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGPC(DCSN1, LOGL_DEBUG, "%s } | ", pDescr->sz);</span><br><span style="color: hsl(120, 100%, 40%);">+          if (Status >= 0)</span><br><span style="color: hsl(120, 100%, 40%);">+          { /* successful completion */</span><br><span style="color: hsl(120, 100%, 40%);">+            pui8    += nSizeElement;  /* -> to next */</span><br><span style="color: hsl(120, 100%, 40%);">+            remaining_bits_len = arT.remaining_bits_len;</span><br><span style="color: hsl(120, 100%, 40%);">+            bit_offset         = arT.bit_offset;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+          else</span><br><span style="color: hsl(120, 100%, 40%);">+          { /* something went awry */</span><br><span style="color: hsl(120, 100%, 40%);">+            return Status;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          if (remaining_bits_len < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+            return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+ bitvec_write_field(vector, writeIndex, !Tag, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+        bit_offset++;</span><br><span style="color: hsl(120, 100%, 40%);">+        remaining_bits_len--;</span><br><span style="color: hsl(120, 100%, 40%);">+        Tag = STANDARD_TAG; /* in case it was set to "reversed" */</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_FIXED:</span><br><span style="color: hsl(120, 100%, 40%);">+      { /* Verify the fixed bits */</span><br><span style="color: hsl(120, 100%, 40%);">+        guint8  no_of_bits = (guint8) pDescr->i;</span><br><span style="color: hsl(120, 100%, 40%);">+   bitvec_write_field(vector, writeIndex, pDescr->offset, no_of_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+        LOGPC(DCSN1, LOGL_DEBUG, "%s = %u | ", pDescr->sz , (unsigned)pDescr->offset);</span><br><span style="color: hsl(120, 100%, 40%);">+        remaining_bits_len   -= no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+        bit_offset += no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_CALLBACK:</span><br><span style="color: hsl(120, 100%, 40%);">+      {</span><br><span style="color: hsl(120, 100%, 40%);">+        guint16  no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+        DissectorCallbackFcn_t callback = (DissectorCallbackFcn_t)pDescr->aux_fn;</span><br><span style="color: hsl(120, 100%, 40%);">+        LOGPC(DCSN1, LOGL_DEBUG, "CSN_CALLBACK(%s) | ", pDescr->sz);</span><br><span style="color: hsl(120, 100%, 40%);">+        no_of_bits = callback(vector, writeIndex, pvDATA(data, pDescr->i), pvDATA(data, pDescr->offset));</span><br><span style="color: hsl(120, 100%, 40%);">+        remaining_bits_len -= no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+        bit_offset += no_of_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+        pDescr++;</span><br><span style="color: hsl(120, 100%, 40%);">+        break;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_TRAP_ERROR:</span><br><span style="color: hsl(120, 100%, 40%);">+      {</span><br><span style="color: hsl(120, 100%, 40%);">+        return ProcessError(writeIndex,"csnStreamEncoder", pDescr->i, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case CSN_END:</span><br><span style="color: hsl(120, 100%, 40%);">+      {</span><br><span style="color: hsl(120, 100%, 40%);">+        ar->remaining_bits_len  = remaining_bits_len;</span><br><span style="color: hsl(120, 100%, 40%);">+        ar->bit_offset = bit_offset;</span><br><span style="color: hsl(120, 100%, 40%);">+        return remaining_bits_len;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      default:</span><br><span style="color: hsl(120, 100%, 40%);">+      {</span><br><span style="color: hsl(120, 100%, 40%);">+        assert(0);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  } while (remaining_bits_len >= 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-pcu/+/25827">change 25827</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-pcu/+/25827"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-pcu </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I7d1b1f7e6d7f89b052b3fd73a960419bb2673020 </div>
<div style="display:none"> Gerrit-Change-Number: 25827 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>