FreeCalypso > hg > fc-magnetite
annotate src/gpf3/ccd/asn1_choice.c @ 37:620ef4582c33
etm.lib done
| author | Mychaela Falconia <falcon@freecalypso.org> | 
|---|---|
| date | Fri, 30 Sep 2016 18:14:12 +0000 | 
| parents | c41a534f33c6 | 
| children | 
| rev | line source | 
|---|---|
| 2 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 1 /* | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 2 +----------------------------------------------------------------------------- | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 3 | Project : | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 4 | Modul : asn1_choice.c | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 5 +----------------------------------------------------------------------------- | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 6 | Copyright 2002 Texas Instruments Berlin, AG | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 7 | All rights reserved. | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 8 | | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 9 | This file is confidential and a trade secret of Texas | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 10 | Instruments Berlin, AG | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 11 | The receipt of or possession of this file does not convey | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 12 | any rights to reproduce or disclose its contents or to | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 13 | manufacture, use, or sell anything it may describe, in | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 14 | whole, or in part, without the specific written consent of | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 15 | Texas Instruments Berlin, AG. | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 16 +----------------------------------------------------------------------------- | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 17 | Purpose : Definition of encoding and decoding functions for ASN1_CHOICE | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 18 | elements | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 19 +----------------------------------------------------------------------------- | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 20 */ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 21 | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 22 /* | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 23 * Standard definitions like UCHAR, ERROR etc. | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 24 */ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 25 #include "typedefs.h" | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 26 #include "header.h" | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 27 | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 28 /* | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 29 * Prototypes of ccd (USE_DRIVER EQ undef) for prototypes only | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 30 * look at ccdapi.h | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 31 */ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 32 #undef USE_DRIVER | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 33 #include "ccdapi.h" | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 34 | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 35 /* | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 36 * Types and functions for bit access and manipulation | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 37 */ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 38 #include "ccd_globs.h" | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 39 #include "bitfun.h" | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 40 | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 41 /* | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 42 * Prototypes and constants in the common part of ccd | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 43 */ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 44 #include "ccd.h" | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 45 #include "ccd_codingtypes.h" | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 46 | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 47 /* | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 48 * Declaration of coder/decoder tables | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 49 */ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 50 #include "ccdtable.h" | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 51 #include "ccddata.h" | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 52 | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 53 EXTERN T_FUNC_POINTER codec[MAX_CODEC_ID+1][2]; | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 54 | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 55 #ifndef RUN_INT_RAM | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 56 const UBYTE bitSize[] = {0, 1, 1, 2, 2, 3, 3, 3, 3, | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 57 4, 4, 4, 4, 4, 4, 4, 4, | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 58 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 59 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 60 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6}; | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 61 #endif /* !RUN_INT_RAM */ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 62 | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 63 #ifndef RUN_INT_RAM | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 64 /* | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 65 +--------------------------------------------------------------------+ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 66 | PROJECT : CCD (6144) MODULE : asn1_choice | | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 67 | STATE : code ROUTINE : PER_Decode_ASN1_CHOICE_altervative | | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 68 +--------------------------------------------------------------------+ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 69 | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 70 PURPOSE : Decode a chosen alternative of an ASN.1 CHOICE type | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 71 Use the parameter union tag bit-size to read the CHOICE | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 72 index. Because of the ascending enumeration of union tags | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 73 it is easy to calculate the e_ref for the chosen element | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 74 which is to be decoded. Then the appropriate decoding | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 75 function for the chosen element is called. | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 76 | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 77 No actions for pointer types (dynamic arrays), as CHOICE | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 78 clauses contain no information in themselves. Memory is | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 79 allocated in the containing SEQUENCE instead. | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 80 */ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 81 void PER_Decode_ASN1_CHOICE_alterative (const ULONG e_ref, T_ENUM UnionTag, T_CCD_Globs *globs) | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 82 { | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 83 UBYTE *old_pstruct; | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 84 ULONG elem_ref, c_ref; | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 85 | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 86 c_ref = (ULONG) melem[e_ref].elemRef; | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 87 | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 88 /* | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 89 * Calculate the elem_ref for the chosen element. | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 90 * Write the CHOICE tag value in the C-structure. | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 91 */ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 92 elem_ref = mcomp[c_ref].componentRef + (ULONG) UnionTag; | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 93 *(T_ENUM *) (globs->pstruct+globs->pstructOffs) = (T_ENUM) UnionTag; | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 94 | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 95 /* | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 96 * Prepare for decoding next element. | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 97 * Store the current value of the C-structure pointer. After decoding the CHOICE component | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 98 * we will set the pointer to this stored value. Then we will use pstructOffs for pointing | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 99 * to the next element. | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 100 */ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 101 old_pstruct = globs->pstruct; | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 102 globs->pstruct += (globs->pstructOffs + sizeof(T_ENUM)); | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 103 | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 104 #ifdef DYNAMIC_ARRAYS | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 105 /* | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 106 * Allocate memory for this whole composition, if elemType is | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 107 * one of the pointer types. | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 108 */ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 109 if ( is_pointer_type(e_ref) AND | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 110 PER_allocmem_and_update(e_ref, 1, globs) NEQ ccdOK ) { | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 111 return; | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 112 } else | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 113 #endif | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 114 | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 115 /* | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 116 * Call the decode function for the chosen element. | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 117 */ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 118 (void) codec[melem[elem_ref].codingType][DECODE_FUN] | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 119 (c_ref, elem_ref, globs); | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 120 /* | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 121 * Prepare for decoding the next element. | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 122 */ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 123 globs->pstruct = old_pstruct; | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 124 } | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 125 #endif /* !RUN_INT_RAM */ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 126 | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 127 #ifndef RUN_INT_RAM | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 128 /* | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 129 +--------------------------------------------------------------------+ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 130 | PROJECT : CCD (6144) MODULE : asn1_choice | | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 131 | STATE : code ROUTINE : cdc_asn1_choice_decode | | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 132 +--------------------------------------------------------------------+ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 133 | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 134 PURPOSE : Decode ASN.1 CHOICE type according to PER | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 135 CHOICE index is read from the message bit string. Its | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 136 bit-size can be extracted from the number of CHOICE | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 137 alternatives. | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 138 For decoding the CHOICE alternative itself, call the same | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 139 function as for extensible CHOICE types. | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 140 */ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 141 SHORT cdc_asn1_choice_decode (const ULONG c_ref, const ULONG e_ref, T_CCD_Globs *globs) | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 142 { | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 143 T_ENUM UnionTag=0; /* default: only one alternative */ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 144 ULONG num_of_comps, mcomp_ref; | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 145 | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 146 mcomp_ref = (ULONG) melem[e_ref].elemRef; | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 147 | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 148 #ifdef DEBUG_CCD | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 149 #ifndef CCD_SYMBOLS | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 150 TRACE_CCD (globs, "cdc_asn1_choice_decode()"); | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 151 #else | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 152 TRACE_CCD (globs, "cdc_asn1_choice_decode() %s", mcomp[mcomp_ref].name); | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 153 #endif | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 154 #endif | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 155 | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 156 /* Don't do anything for empty choices */ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 157 if (mcomp[mcomp_ref].numOfComponents == 0) | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 158 { | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 159 return 1; | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 160 } | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 161 | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 162 globs->pstructOffs = melem[e_ref].structOffs; | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 163 | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 164 /* For optional elements we have already set the valid flag in the | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 165 * C-structure. We have done it while processing ASN1_SEQ. | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 166 */ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 167 if ( ! cdc_isPresent(e_ref, globs) ) { | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 168 return 1; | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 169 } | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 170 | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 171 /* | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 172 * Get the bit size of the CHOICE index. | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 173 * Then read the bits representing the index in the air message. | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 174 */ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 175 num_of_comps = (ULONG) mcomp[mcomp_ref].numOfComponents; | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 176 /* CHOICE index is encoded only if there are more than one alternatives. */ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 177 if (num_of_comps NEQ 1) | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 178 { | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 179 UnionTag = bf_getBits ((U32)bitSize[num_of_comps], globs); | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 180 /* | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 181 * Check correctness of the read CHOICE index. | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 182 */ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 183 if ((ULONG)UnionTag >= num_of_comps) | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 184 { | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 185 ccd_recordFault (globs, ERR_ASN1_ENCODING, BREAK, (USHORT) e_ref, globs->pstruct+globs->pstructOffs); | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 186 } | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 187 } | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 188 PER_Decode_ASN1_CHOICE_alterative (e_ref, UnionTag, globs); | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 189 return 1; | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 190 } | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 191 #endif /* !RUN_INT_RAM */ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 192 | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 193 #ifndef RUN_INT_RAM | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 194 /* | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 195 +--------------------------------------------------------------------+ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 196 | PROJECT : CCD (6144) MODULE : asn1_choice | | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 197 | STATE : code ROUTINE : PER_Encode_ASN1_CHOICE_altervative | | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 198 +--------------------------------------------------------------------+ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 199 | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 200 PURPOSE : Encode a chosen alternative of an ASN.1 CHOICE type. | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 201 | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 202 Because of ascending enumeration of union tags it is | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 203 easy to calculate the e_ref for the chosen element to be | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 204 encoded. Then the appropriate encoding function for the | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 205 chosen element is called. | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 206 | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 207 No actions for pointer types (dynamic arrays), as CHOICE | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 208 clauses contain no information in themselves. Memory is | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 209 allocated in the containing SEQUENCE instead. | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 210 */ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 211 void PER_Encode_ASN1_CHOICE_alterative (const ULONG e_ref, T_ENUM UnionTag, T_CCD_Globs *globs) | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 212 { | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 213 UBYTE *old_pstruct; | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 214 ULONG elem_ref, c_ref; | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 215 | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 216 c_ref = (ULONG) melem[e_ref].elemRef; | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 217 | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 218 /* | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 219 * Prepare for encoding next element. | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 220 * Store the current value of the C-structure pointer. After encoding | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 221 * the CHOICE component we will set the pointer to this stored value. | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 222 * Then we will use pstructOffs for pointing to the next element. | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 223 */ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 224 old_pstruct = globs->pstruct; | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 225 globs->pstruct += (globs->pstructOffs + sizeof(T_ENUM)); | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 226 | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 227 #ifdef DYNAMIC_ARRAYS | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 228 /* | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 229 * Dereference pointer if this is a pointer types (dynamic arrays) | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 230 * globs->pstruct was saved above, so no need to do it again. | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 231 */ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 232 if ( is_pointer_type(e_ref) ) { | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 233 if (ccd_check_pointer(*(U8 **)(globs->pstruct)) == ccdOK) | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 234 globs->pstruct = *(U8 **)(globs->pstruct); | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 235 else { | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 236 ccd_recordFault (globs, ERR_INVALID_PTR, BREAK, (USHORT) e_ref, | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 237 &globs->pstruct[globs->pstructOffs]); | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 238 return; | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 239 } | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 240 } | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 241 #endif | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 242 | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 243 elem_ref = mcomp[c_ref].componentRef + (USHORT) UnionTag; | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 244 | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 245 /* | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 246 * Call the decode function for the chosen element. | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 247 */ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 248 (void) codec[melem[elem_ref].codingType][ENCODE_FUN] | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 249 (c_ref, elem_ref, globs); | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 250 /* | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 251 * Prepare for encoding the next element. | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 252 */ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 253 globs->pstruct = old_pstruct; | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 254 } | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 255 #endif /* !RUN_INT_RAM */ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 256 | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 257 #ifndef RUN_INT_RAM | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 258 /* | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 259 +--------------------------------------------------------------------+ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 260 | PROJECT : CCD (6144) MODULE : asn1_choice | | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 261 | STATE : code ROUTINE : cdc_asn1_choice_encode | | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 262 +--------------------------------------------------------------------+ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 263 | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 264 PURPOSE : Encoding of CHOICE type for UMTS | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 265 The size of the union tag must be calculated. Then its value | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 266 is written in the air message. | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 267 For encoding the CHOICE alternative itself, call the same | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 268 function as for extensible CHOICE types. | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 269 */ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 270 SHORT cdc_asn1_choice_encode (const ULONG c_ref, const ULONG e_ref, T_CCD_Globs *globs) | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 271 { | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 272 T_ENUM UnionTag=0; /* default: only one alternative */ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 273 ULONG num_of_comps, mcomp_ref; | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 274 | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 275 mcomp_ref = (ULONG) melem[e_ref].elemRef; | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 276 | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 277 #ifdef DEBUG_CCD | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 278 #ifndef CCD_SYMBOLS | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 279 TRACE_CCD (globs, "cdc_asn1_choice_encode()"); | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 280 #else | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 281 TRACE_CCD (globs, "cdc_asn1_choice_encode() %s", mcomp[mcomp_ref].name); | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 282 #endif | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 283 #endif | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 284 | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 285 /* Don't do anything for empty choices */ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 286 if (mcomp[mcomp_ref].numOfComponents == 0) | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 287 { | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 288 return 1; | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 289 } | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 290 | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 291 globs->pstructOffs = melem[e_ref].structOffs; | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 292 | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 293 /* For optional elements we have already set the valid flag in the | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 294 * C-structure. We have done it while processing ASN1_SEQ. | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 295 */ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 296 if ( ! cdc_isPresent(e_ref, globs) ) | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 297 return 1; | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 298 | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 299 /* | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 300 * Get the value of CHOICE index (= union controller) from the C-structure. | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 301 * Check its correctness. Write it in the air message. | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 302 * Afterwards encode the chosen CHOICE altervative. | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 303 */ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 304 num_of_comps = mcomp[mcomp_ref].numOfComponents; | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 305 /* CHOICE index is encoded only if there are more than one alternatives. */ | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 306 if (num_of_comps NEQ 1) | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 307 { | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 308 UnionTag = *(T_ENUM *) (globs->pstruct+globs->pstructOffs); | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 309 if (UnionTag >= (T_ENUM)num_of_comps) | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 310 { | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 311 ccd_recordFault (globs, ERR_ASN1_ENCODING, BREAK, (USHORT) e_ref, | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 312 globs->pstruct+globs->pstructOffs); | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 313 } | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 314 bf_writeVal ((ULONG) UnionTag, (ULONG) bitSize[num_of_comps], globs); | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 315 } | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 316 PER_Encode_ASN1_CHOICE_alterative (e_ref, UnionTag, globs); | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 317 | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 318 return 1; | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 319 } | 
| 
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 320 #endif /* !RUN_INT_RAM */ | 
