diff gsm-fw/ccd/asn1_octet.c @ 648:970d6199f2c5

gsm-fw/ccd/*.[ch]: initial import from the LoCosto source
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Thu, 04 Sep 2014 05:48:57 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gsm-fw/ccd/asn1_octet.c	Thu Sep 04 05:48:57 2014 +0000
@@ -0,0 +1,168 @@
+/* 
++----------------------------------------------------------------------------- 
+|  Project :  
+|  Modul   : asn1_octet.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_OCTET
+|             elements 
++----------------------------------------------------------------------------- 
+*/ 
+
+
+/*
+ * standard definitions like GLOBAL, 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_asn1_octet_decode  |
++--------------------------------------------------------------------+
+
+  PURPOSE : UNALIGNED PER decoding for the octet string type (UMTS)
+            The coded octets 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_asn1_octet_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_octet_decode()");
+	#else
+	TRACE_CCD (globs, "cdc_asn1_octet_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, repeat, globs) NEQ ccdOK)
+      /* No memory - Return.  Error already set in function call above. */
+      return 1;
+  }
+#endif
+
+  bf_readBitStr_PER ((USHORT)(repeat << 3), 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_asn1_octet_encode  |
++--------------------------------------------------------------------+
+
+  PURPOSE : UNALIGNED PER encoding for the octet string type (UMTS)
+            The coded octets are preceded by a length indicator, if
+            they are not of fixed length. The length indicator is 
+            encoded as an ASN1_INTEGER type. 
+*/
+SHORT cdc_asn1_octet_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_octet_encode()");
+	#else
+	TRACE_CCD (globs, "cdc_asn1_octet_encode() %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
+  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 << 3), globs);
+
+#ifdef DYNAMIC_ARRAYS
+  if ( old_pstruct NEQ NULL )
+    globs->pstruct = old_pstruct;
+#endif
+
+  return 1;
+}
+#endif /* !RUN_INT_RAM */