diff src/gpf/ccd/asn1_bitstr.c @ 0:4e78acac3d88

src/{condat,cs,gpf,nucleus}: import from Selenite
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 16 Oct 2020 06:23:26 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/gpf/ccd/asn1_bitstr.c	Fri Oct 16 06:23:26 2020 +0000
@@ -0,0 +1,170 @@
+/* 
++----------------------------------------------------------------------------- 
+|  Project :  
+|  Modul   : asn1_bitstr.c 
++----------------------------------------------------------------------------- 
+|  Copyright 2002 Texas Instruments Berlin, AG 
+|                 All rights reserved. 
+| 
+|                 This file is confidential and a trade secret of Texas 
+|                 Instruments Berlin, AG 
+|                 The receipt of or possession of this file does not convey 
+|                 any rights to reproduce or disclose its contents or to 
+|                 manufacture, use, or sell anything it may describe, in 
+|                 whole, or in part, without the specific written consent of 
+|                 Texas Instruments Berlin, AG. 
++----------------------------------------------------------------------------- 
+|  Purpose :  Definition of encoding and decoding functions for ASN1_BITSTRING
+|             elements 
++----------------------------------------------------------------------------- 
+*/ 
+
+/*
+ * Standard definitions like UCHAR, ERROR etc.
+ */
+#include "typedefs.h"
+#include "header.h"
+
+/*
+ * Prototypes of ccd (USE_DRIVER EQ undef) for prototypes only
+ * look at ccdapi.h
+ */
+#undef USE_DRIVER
+#include "ccdapi.h"
+
+/*
+ * Types and functions for bit access and manipulation
+ */
+#include "ccd_globs.h"
+#include "bitfun.h"
+
+/*
+ * Prototypes of ccd internal functions
+ */
+#include "ccd.h"
+
+/*
+ * Declaration of coder/decoder tables
+ */
+#include "ccdtable.h"
+#include "ccddata.h"
+
+#ifndef RUN_INT_RAM
+/*
++--------------------------------------------------------------------+
+| PROJECT : CCD (6144)              MODULE  : CDC_GSM                |
+| STATE   : code                    ROUTINE : cdc_bitstring_decode   |
++--------------------------------------------------------------------+
+
+  PURPOSE : UNALIGNED PER decoding of the bit string type (UMTS)
+            The coded bits are preceded by a length indicator, if
+            they are not of fixed length. The length indicator is 
+            decoded as an ASN1_INTEGER type.
+*/
+
+SHORT cdc_bitstring_decode (const ULONG c_ref, const ULONG e_ref, T_CCD_Globs *globs)
+{
+  ULONG   repeat;
+  U8     *old_pstruct = NULL;
+
+#ifdef DEBUG_CCD
+	#ifndef CCD_SYMBOLS
+		TRACE_CCD (globs, "cdc_asn1_bitstring_decode()");
+	#else
+		TRACE_CCD (globs, "cdc_asn1_bitstring_decode() '%s'", ccddata_get_alias((USHORT) e_ref, 1));
+	#endif
+#endif
+
+  /* 
+   * Set pstrcutOffs and maxRep.
+   * Check the valid flag in case of optional elements.
+   */
+  if (PER_CommonBegin (e_ref, &repeat, globs) NEQ ccdOK)
+    return 1;
+
+#ifdef DYNAMIC_ARRAYS
+  /*
+   * Check for pointer types, and allocate memory if necessary.
+   * May overwrite globs->pstruct (and initialize globs->pstructOffs to 0).
+   */
+  if ( is_pointer_type(e_ref) ) {
+    old_pstruct = globs->pstruct;
+    if ( PER_allocmem_and_update(e_ref, (USHORT) ((repeat >> 3) +1), globs) NEQ ccdOK)
+      /* No memory - Return.  Error already set in function call above. */
+      return 1;
+  }
+#endif
+
+  bf_readBitStr_PER ((USHORT) repeat, globs);
+
+#ifdef DYNAMIC_ARRAYS
+  if (old_pstruct NEQ NULL)
+    globs->pstruct = old_pstruct;
+#endif
+
+  return 1;
+}
+
+#endif /* !RUN_INT_RAM */
+#ifndef RUN_INT_RAM
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : CCD (6144)              MODULE  : CDC_GSM                |
+| STATE   : code                    ROUTINE : cdc_bitstring_encode   |
++--------------------------------------------------------------------+
+
+  PURPOSE : UNALIGNED PER encoding of the bit string type (UMTS)
+            The coded bits are preceded by a length indicator, if
+            they are not of fixed length. The length indicator is 
+            decoded as an ASN1_INTEGER type. 
+*/
+
+SHORT cdc_bitstring_encode (const ULONG c_ref, const ULONG e_ref, T_CCD_Globs *globs)
+{
+  ULONG  repeat;
+  U8     *old_pstruct = NULL;
+
+#ifdef DEBUG_CCD
+	#ifndef CCD_SYMBOLS
+		TRACE_CCD (globs, "cdc_asn1_bitstring_encode()");
+	#else
+		TRACE_CCD (globs, "cdc_asn1_bitstring_encode() '%s'", ccddata_get_alias((USHORT) e_ref, 1));
+	#endif
+#endif
+
+  /* 
+   * Set pstructOffs and maxRep.
+   * Check the valid flag in case of optional elements.
+   */
+  if (PER_CommonBegin (e_ref, &repeat, globs) NEQ ccdOK)
+    return 1;
+
+#ifdef DYNAMIC_ARRAYS
+  if ( is_pointer_type(e_ref) ) {
+    old_pstruct = globs->pstruct;
+    globs->pstruct = *(U8 **)(globs->pstruct + globs->pstructOffs);
+
+    if (ccd_check_pointer(globs->pstruct) == ccdOK)
+    {
+      globs->pstructOffs = 0;
+    }
+    else
+    {
+      ccd_recordFault (globs, ERR_INVALID_PTR, BREAK, (USHORT) e_ref, 
+                       &globs->pstruct[globs->pstructOffs]);
+      return 1;
+    }
+  }
+#endif
+
+  bf_writeBitStr_PER ((USHORT) repeat, globs);
+
+#ifdef DYNAMIC_ARRAYS 
+ if ( old_pstruct NEQ NULL )
+    globs->pstruct = old_pstruct;
+#endif
+
+  return 1;
+}
+#endif /* !RUN_INT_RAM */