2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2 +-----------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3 | Project :
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
4 | Modul : asn1_seq.c
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 +-----------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 | Copyright 2002 Texas Instruments Berlin, AG
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 | All rights reserved.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 | This file is confidential and a trade secret of Texas
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 | Instruments Berlin, AG
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
11 | The receipt of or possession of this file does not convey
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
12 | any rights to reproduce or disclose its contents or to
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
13 | manufacture, use, or sell anything it may describe, in
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
14 | whole, or in part, without the specific written consent of
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 | Texas Instruments Berlin, AG.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 +-----------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 | Purpose : Definition of encoding and decoding functions for ASN1_SEQUENCE
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
18 | elements
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 +-----------------------------------------------------------------------------
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
20 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
21
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
22 #define ASN1_SEQ_C
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
23
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
24 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
25 * Standard definitions like UCHAR, ERROR etc.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
26 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27 #include "typedefs.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28 #include "header.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
29
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
30 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
31 * Prototypes of ccd (USE_DRIVER EQ undef) for prototypes only
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
32 * look at ccdapi.h
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
33 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
34 #undef USE_DRIVER
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
35 #include "ccdapi.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
36
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
37 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
38 * Types and functions for bit access and manipulation
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
39 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40 #include "ccd_globs.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
41 #include "bitfun.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
42
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
43 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44 * Prototypes and constants in the common part of ccd
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
45 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
46 #include "ccd.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
47 #include "ccd_codingtypes.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
48
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
49 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
50 * Declaration of coder/decoder tables
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
51 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
52 #include "ccdtable.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
53 #include "ccddata.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
54
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
55 EXTERN T_FUNC_POINTER codec[MAX_CODEC_ID+1][2];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
56
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
57 #ifndef RUN_INT_RAM
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
58 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
59 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
60 | PROJECT : CCD (6144) MODULE : asn1_seq |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
61 | STATE : code ROUTINE : Read_SEQ_BitMap |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
62 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
63
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
64 PURPOSE : Decode the bit-map preamble for OPTIONAL elements
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
65 or those with DEFAULT value.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
66 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
67 void Read_SEQ_BitMap (const ULONG first_elem, const ULONG last_elem, T_CCD_Globs *globs)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
68 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
69 ULONG elem = first_elem;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
70 while (elem < last_elem)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
71 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
72 if (melem[elem].optional)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
73 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
74 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
75 * For optional elements read the corresponding bit in the preamble
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
76 * and set the valid flag in the C-Structure to it.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
77 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
78 if (melem[elem].elemType < 'P' OR melem[elem].elemType > 'R')
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
79 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
80 globs->pstruct[melem[elem].structOffs] = (UBYTE) bf_readBit(globs);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
81 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
82 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
83 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
84 if(bf_readBit(globs)) /*elemType P, Q or R*/
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
85 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
86 /*If present set the pointer to -1 (0xFFFF) - anything else than NULL, because the
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
87 element is present*/
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
88 *(void**) &globs->pstruct[melem[elem].structOffs] = (void *) 0xFFFF;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
89 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
90 else /*Not present set the pointer to NULL*/
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
91 *(void**) &globs->pstruct[melem[elem].structOffs] = NULL;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
92
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
93 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
94 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
95 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
96 * For optional elements read the corresponding bit in the preamble
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
97 * and set the valid flag in the C-structure to it.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
98 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
99 else if (melem[elem].codingType EQ CCDTYPE_ASN1_INTEGER)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
100 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
101 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
102 * Check if this variable has a default value.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
103 * As long as the DEFAULT values are given with ranges it is right to
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
104 * look for isDefault in the second entry in mval.cdg.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
105 * There is no valid flag for elements with default value. But we use
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
106 * the first byte of this element within the C-structure for giving a
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
107 * signal to this function. The only simple type which has DEFAULT is INTEGER.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
108 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
109 if (mval[mvar[melem[elem].elemRef].valueDefs+1].isDefault EQ 2)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
110 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
111 globs->pstruct[melem[elem].structOffs] = (UBYTE) bf_readBit(globs);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
112 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
113 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
114 elem++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
115 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
116 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
117 #endif /* !RUN_INT_RAM */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
118
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
119 #ifndef RUN_INT_RAM
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
120 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
121 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
122 | PROJECT : CCD (6144) MODULE : CDC_GSM |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
123 | STATE : code ROUTINE : cdc_asn1_seq_decode |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
124 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
125
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
126 PURPOSE : Decoding of the SEQUENCE and SEQUENCE OF type for UMTS
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
127 The element can be a field of fixed or variable length.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
128 It can contain OPTIONAL elements or integer elements with
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
129 a DEFAULT value.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
130 A special case is when the element is a so called msg_data.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
131 According to CCDDATA a message is made of a msg_type and
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
132 a msg_data part. If the msg_data has a coding type of
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
133 ASN1_SEQUENCE this function is called.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
134 In this case CCD needs to pass over the msg_type by
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
135 incrementing globs->pstruct. A msg_data sequence can not
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
136 be optional. Nor it can be an array of msg_data.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
137 If the sequence is not a msg_data this function is called
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
138 as an equivalent to ccd_decodeComposition. Hence the
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
139 increment on globs->ccd_recurs_level. A non-msg_data
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
140 sequence can be optional or an array.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
141 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
142 SHORT cdc_asn1_seq_decode (const ULONG c_ref, const ULONG e_ref, T_CCD_Globs *globs)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
143 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
144 ULONG repeat=1, max_rep=1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
145 ULONG cSize, first_elem, last_elem, elem;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
146 UBYTE *old_pstruct;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
147 #ifdef DEBUG_CCD
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
148 static S8 trace_nesting_level = -1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
149 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
150
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
151 #ifdef DEBUG_CCD
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
152 #ifndef CCD_SYMBOLS
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
153 TRACE_CCD (globs, "cdc_asn1_seq_decode()");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
154 #else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
155 TRACE_CCD (globs, "cdc_asn1_seq_decode() %s", mcomp[melem[e_ref].elemRef].name);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
156 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
157 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
158
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
159 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
160 * This function is called as an equivalent to ccd_decodeComposition.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
161 * Hence the increment on globs->ccd_recurs_level.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
162 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
163 globs->ccd_recurs_level ++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
164
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
165 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
166 * Set pstrcutOffs and max_rep.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
167 * Check the valid flag in case of optional elements.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
168 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
169 if (PER_CommonBegin (e_ref, &max_rep, globs) NEQ ccdOK)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
170 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
171 globs->ccd_recurs_level --;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
172 return 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
173 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
174
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
175 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
176 * Prepare for decoding of the same sequence type up to max_rep times.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
177 * Set the upper and lower bound of elemRef for processing of each repeatition.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
178 * Read the C-size to go ahead in the C-structure after each repeatition.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
179 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
180 switch (melem[e_ref].elemType)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
181 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
182 case 'C':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
183 case 'D':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
184 case 'E':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
185 case 'P':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
186 case 'Q':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
187 elem = (ULONG) melem[e_ref].elemRef;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
188 first_elem = (ULONG) mcomp[elem].componentRef;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
189 last_elem = first_elem + mcomp[elem].numOfComponents;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
190 cSize = (ULONG) mcomp[elem].cSize;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
191 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
192 case 'F':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
193 case 'R':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
194 first_elem = e_ref;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
195 last_elem = e_ref + 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
196 cSize = (ULONG) mvar[e_ref].cSize;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
197 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
198 default:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
199 ccd_setError (globs, ERR_DEFECT_CCDDATA, BREAK,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
200 (USHORT) (globs->bitpos), (USHORT) -1);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
201 return 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
202
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
203 };
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
204 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
205 * Store the current value of the C-structure pointer.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
206 * After decoding the SEQUENCE component we will set the pointer
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
207 * to this stored value. Then we will use pstructOffs for pointing
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
208 * to the next element.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
209 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
210 old_pstruct = globs->pstruct;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
211 #ifdef DYNAMIC_ARRAYS
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
212 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
213 * Allocate memory for this whole composition, if elemType is
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
214 * one of the pointer types.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
215 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
216 if ( is_pointer_type(e_ref))
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
217 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
218 if ( PER_allocmem_and_update(e_ref, max_rep, globs) NEQ ccdOK )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
219 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
220 /* No memory - Return. Error already set in function call above. */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
221 globs->ccd_recurs_level --;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
222 return 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
223 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
224
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
225 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
226 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
227 globs->pstruct += globs->pstructOffs;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
228
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
229 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
230 * Decode all elements of the field.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
231 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
232 while (repeat <= max_rep)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
233 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
234 Read_SEQ_BitMap (first_elem, last_elem, globs);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
235 elem = first_elem;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
236
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
237 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
238 * Decode all elements of the array
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
239 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
240 #ifdef DEBUG_CCD
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
241 trace_nesting_level++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
242 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
243 while (elem < last_elem)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
244 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
245 #ifdef ERR_TRC_STK_CCD
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
246 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
247 * Save the value for tracing in error case.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
248 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
249 globs->error_stack[globs->ccd_recurs_level] = (USHORT) elem;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
250 #endif /* ERR_TRC_STK_CCD */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
251
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
252 #ifdef DEBUG_CCD
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
253 #ifndef CCD_SYMBOLS
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
254 TRACE_CCD (globs, "decoding level %d element %d", trace_nesting_level, elem - first_elem);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
255 #else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
256 TRACE_CCD (globs, "decoding level %d element %d '%s'",trace_nesting_level, elem - first_elem, ccddata_get_alias((USHORT) elem, 1));
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
257 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
258 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
259
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
260 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
261 * Use the jump-table for selecting the decode function.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
262 * Possible types are 0, ASN1_INTEGER, BITSTRING, ASN1_CHOICE and
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
263 * ASN1_SEQUENCE. In case of 0 function cdc_STD_decode will be called.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
264 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
265 (void) codec[melem[elem].codingType][DECODE_FUN]
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
266 (c_ref, elem, globs);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
267 elem ++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
268 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
269 #ifdef DEBUG_CCD
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
270 trace_nesting_level--;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
271 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
272
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
273 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
274 * Set the pointer of the C-structure on the next element.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
275 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
276 globs->pstruct += cSize;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
277
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
278 repeat ++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
279 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
280
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
281 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
282 * Prepare for decoding the next element.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
283 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
284 globs->pstruct = old_pstruct;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
285 globs->ccd_recurs_level--;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
286
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
287 return 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
288 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
289 #endif /* !RUN_INT_RAM */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
290
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
291 #ifndef RUN_INT_RAM
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
292 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
293 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
294 | PROJECT : CCD (6144) MODULE : asn1_seq |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
295 | STATE : code ROUTINE : Write_SEQ_BitMap |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
296 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
297
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
298 PURPOSE : Encode the bit-map preamble for OPTIONAL elements
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
299 or those with DEFAULT value.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
300 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
301 void Write_SEQ_BitMap (const ULONG first_elem, const ULONG last_elem, T_CCD_Globs *globs)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
302 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
303 ULONG elem = first_elem;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
304 while (elem < last_elem)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
305 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
306 if (melem[elem].optional)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
307 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
308 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
309 * For optional elements read the valid flag in the C-Structure
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
310 * and overwrite the corresponding bit in the preamble.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
311 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
312
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
313 #if defined _TOOLS_
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
314 int patch;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
315 U16 stelem;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
316 stelem = globs->error_stack[globs->ccd_recurs_level];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
317 globs->error_stack[globs->ccd_recurs_level] = (USHORT) elem;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
318 patch = ccd_patch (globs, 1);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
319 globs->error_stack[globs->ccd_recurs_level] = stelem;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
320 if (patch)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
321 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
322 bf_writeBit(1, globs);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
323 elem++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
324 continue;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
325 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
326 #endif /* _TOOLS_ */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
327
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
328 #ifdef DYNAMIC_ARRAYS
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
329 if ( is_pointer_type(elem) )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
330 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
331 BOOL present;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
332 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
333 * Check for NULL pointer (== notPresent/not valid) for this element.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
334 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
335 present = (*(U8 **)(globs->pstruct + melem[elem].structOffs) NEQ NULL);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
336 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
337 * Double check for 'D' to 'F' types. Both NULL pointer and
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
338 * valid flag. (Strictly not necessary, but may catch uninitialized
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
339 * flags/pointers).
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
340 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
341 if (present AND (melem[elem].elemType >= 'D' AND
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
342 melem[elem].elemType <= 'F'))
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
343 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
344 present = (BOOL)globs->pstruct[melem[elem].structOffs];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
345 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
346 bf_writeBit(present, globs);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
347 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
348 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
349 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
350 bf_writeBit((BOOL)globs->pstruct[melem[elem].structOffs], globs);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
351 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
352 else if (melem[elem].codingType EQ CCDTYPE_ASN1_INTEGER)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
353 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
354 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
355 * Check if this variable has a default value.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
356 * As long as the DEFAULT values are given with ranges it is right to
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
357 * look for isDefault in the second entry in mval.cdg.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
358 * There is no valid flag for elements with default value. So we need
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
359 * to read the value from C-structure and compare it with the DEFAULT
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
360 * value given in the mval table. The only simple type which has
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
361 * DEFAULT is INTEGER.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
362 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
363 if (mval[mvar[melem[elem].elemRef].valueDefs+1].isDefault EQ 2)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
364 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
365 U32 value=0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
366 UBYTE *p;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
367 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
368 * setup the read pointer to the element in the C-structure
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
369 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
370 #ifdef DYNAMIC_ARRAYS
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
371 if ( is_pointer_type(elem) )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
372 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
373 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
374 * NULL pointers should be caught as part of the optionality
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
375 * check in PER_CommonBegin()
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
376 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
377 p = *(U8 **)(globs->pstruct + globs->pstructOffs);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
378 if (ccd_check_pointer(p) != ccdOK)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
379 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
380 ccd_recordFault (globs, ERR_INVALID_PTR, BREAK, (USHORT) elem,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
381 &globs->pstruct[globs->pstructOffs]);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
382 return;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
383 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
384 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
385 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
386 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
387 p = globs->pstruct + melem[elem].structOffs;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
388 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
389 * Default values are all positive and small values (< 64K)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
390 * in the current version of umts. The cases 'L' and 'C' are added
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
391 * to be ready for a future change where we need also a check of
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
392 * possible errors through type casting.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
393 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
394 switch (mvar[melem[elem].elemRef].cType)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
395 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
396 case 'B':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
397 value = (U32)*(UBYTE *) p;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
398 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
399 case 'C':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
400 value = (U32)(S32)*(S8 *) p;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
401 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
402 case 'S':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
403 value = (U32)(*(USHORT *) p);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
404 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
405 case 'T':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
406 value = (U32)(S32)*(S16 *) p;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
407 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
408 case 'L':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
409 value = (U32)*(S32 *) p;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
410 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
411 case 'M':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
412 value = (U32)*(U32 *) p;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
413 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
414 default:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
415 ccd_setError (globs, ERR_DEFECT_CCDDATA, BREAK, (USHORT) -1);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
416 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
417 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
418 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
419 * Compare the value to be encoded with the default value.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
420 * Write the presence flag into the preamble.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
421 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
422 if (value EQ (U32)mval[mvar[melem[elem].elemRef].valueDefs+1].startValue)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
423 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
424 bf_writeBit(0, globs);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
425 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
426 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
427 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
428 bf_writeBit(1, globs);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
429 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
430 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
431 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
432 elem++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
433 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
434 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
435 #endif /* !RUN_INT_RAM */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
436
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
437 #ifndef RUN_INT_RAM
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
438 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
439 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
440 | PROJECT : CCD (6144) MODULE : CDC_GSM |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
441 | STATE : code ROUTINE : cdc_asn1_seq_encode |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
442 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
443
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
444 PURPOSE : Decoding of the SEQUENCE and SEQUENCE OF type for UMTS
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
445 The element can be a field of fixed or variable length.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
446 It can contain OPTIONAL elements or integer elements with
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
447 a DEFAULT value.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
448 A special case is when the element is a so called msg_data.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
449 According to CCDDATA a message is made of a msg_type and
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
450 a msg_data part. If the msg_data has a coding type of
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
451 ASN1_SEQUENCE this function is called.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
452 In this case CCD needs to pass over the msg_type by
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
453 incrementing globs->pstruct. A msg_data sequence can not
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
454 be optional. Nor it can be an array of msg_data.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
455 If the sequence is not a msg_data this function is called
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
456 as an equivalent to ccd_encodeComposition. Hence the
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
457 increment on globs->ccd_recurs_level. A non-msg_data
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
458 sequence can be optional or an array.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
459 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
460 SHORT cdc_asn1_seq_encode (const ULONG c_ref, const ULONG e_ref, T_CCD_Globs *globs)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
461 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
462 ULONG repeat=1, max_rep=1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
463 ULONG cSize, first_elem, last_elem, elem;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
464 UBYTE *old_pstruct;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
465 #ifdef DEBUG_CCD
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
466 static S8 trace_nesting_level = -1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
467 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
468
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
469 #ifdef DEBUG_CCD
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
470 #ifndef CCD_SYMBOLS
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
471 TRACE_CCD (globs, "cdc_asn1_seq_encode()");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
472 #else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
473 TRACE_CCD (globs, "cdc_asn1_seq_encode() %s", mcomp[melem[e_ref].elemRef].name);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
474 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
475 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
476
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
477 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
478 * This function is called as an equivalent to ccd_encodeComposition.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
479 * Hence the increment on globs->ccd_recurs_level.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
480 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
481 globs->ccd_recurs_level ++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
482
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
483 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
484 * Set pstrcutOffs and max_rep.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
485 * Check the valid flag in case of optional elements.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
486 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
487 if (PER_CommonBegin (e_ref, &max_rep, globs) NEQ ccdOK)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
488 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
489 globs->ccd_recurs_level --;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
490 return 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
491 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
492
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
493 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
494 * Prepare for encoding of the same sequence type up to max_rep times.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
495 * Set the upper and lower bound of elemRef for processing of each repeatition.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
496 * Read the C-size to go ahead in the C-structure after each repeatition.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
497 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
498 switch (melem[e_ref].elemType)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
499 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
500 case 'C':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
501 case 'D':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
502 case 'E':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
503 case 'P':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
504 case 'Q':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
505 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
506 elem = (ULONG) melem[e_ref].elemRef;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
507 first_elem = (ULONG) mcomp[elem].componentRef;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
508 last_elem = first_elem + mcomp[elem].numOfComponents;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
509 cSize = (ULONG) mcomp[elem].cSize;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
510 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
511 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
512 case 'F':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
513 case 'R':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
514 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
515 first_elem = e_ref;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
516 last_elem = e_ref + 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
517 cSize = (ULONG) mvar[e_ref].cSize;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
518 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
519 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
520 default:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
521 ccd_setError (globs, ERR_DEFECT_CCDDATA, BREAK,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
522 (USHORT) (globs->bitpos), (USHORT) -1);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
523 return 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
524
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
525 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
526 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
527 * Store the current value of the C-structure pointer.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
528 * After encoding the SEQUENCE component we will set the pointer
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
529 * to this stored value. Then we will use pstructOffs for pointing
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
530 * to the next element.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
531 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
532 old_pstruct = globs->pstruct;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
533 globs->pstruct += globs->pstructOffs;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
534
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
535 #ifdef DYNAMIC_ARRAYS
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
536 if ( is_pointer_type(e_ref) ) {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
537 if (ccd_check_pointer(*(U8 **)globs->pstruct) == ccdOK)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
538 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
539 globs->pstruct = *(U8 **) globs->pstruct;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
540 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
541 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
542 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
543 ccd_recordFault (globs, ERR_INVALID_PTR, BREAK, (USHORT) e_ref,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
544 &globs->pstruct[globs->pstructOffs]);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
545 return 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
546 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
547 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
548 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
549
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
550
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
551 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
552 * Encode all elements of the field.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
553 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
554 while (repeat <= max_rep)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
555 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
556 Write_SEQ_BitMap (first_elem, last_elem, globs);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
557
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
558 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
559 * Encode all elements
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
560 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
561 #ifdef DEBUG_CCD
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
562 trace_nesting_level++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
563 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
564
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
565 elem = first_elem;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
566 while (elem < last_elem)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
567 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
568 #ifdef ERR_TRC_STK_CCD
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
569 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
570 * Save the value for tracing in error case.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
571 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
572 globs->error_stack[globs->ccd_recurs_level] = (USHORT) elem;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
573 #endif /* ERR_TRC_STK_CCD */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
574 #ifdef DEBUG_CCD
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
575 #ifndef CCD_SYMBOLS
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
576 TRACE_CCD (globs, "encoding level %d element %d", trace_nesting_level, elem - first_elem);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
577 #else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
578 TRACE_CCD (globs, "encoding level %d element %d '%s'", trace_nesting_level, elem - first_elem ,ccddata_get_alias((USHORT) elem, 1));
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
579 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
580 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
581
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
582 #if defined _TOOLS_
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
583 if (!ccd_patch (globs, 0))
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
584 #endif /* _TOOLS_ */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
585 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
586 * Use the jump-table for selecting the code function.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
587 * Possible types are 0, ASN1_INTEGER, BITSTRING, ASN1_CHOICE and
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
588 * ASN1_SEQUENCE. In case of 0 function cdc_STD_encode will be called.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
589 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
590 (void) codec[melem[elem].codingType][ENCODE_FUN]
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
591 (c_ref, elem, globs);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
592 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
593 * Set the elemRef to the next element.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
594 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
595 elem ++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
596 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
597 #ifdef DEBUG_CCD
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
598 trace_nesting_level--;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
599 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
600 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
601 * Set the pointer of the C-structure on the next element.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
602 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
603 globs->pstruct += cSize;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
604
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
605 repeat ++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
606 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
607
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
608 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
609 * Prepare for encoding the next element.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
610 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
611 globs->pstruct = old_pstruct;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
612 globs->ccd_recurs_level--;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
613 return 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
614 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
615 #endif /* !RUN_INT_RAM */
|