<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>