5
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_integ.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_INTEGER
|
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 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
23 * Standard definitions like UCHAR, ERROR etc.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
24 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
25 #include "typedefs.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
26 #include "header.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
29 * Prototypes of ccd (USE_DRIVER EQ undef) for prototypes only
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
30 * look at ccdapi.h
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
31 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
32 #undef USE_DRIVER
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
33 #include "ccdapi.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
34
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
35 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
36 * Types and functions for bit access and manipulation
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
37 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
38 #include "ccd_globs.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
39 #include "bitfun.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
41 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
42 * Prototypes of ccd internal functions
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
43 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44 #include "ccd.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
45
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
46 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
47 * Declaration of coder/decoder tables
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
48 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
49 #include "ccdtable.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
50 #include "ccddata.h"
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
51
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
52 #ifndef RUN_INT_RAM
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
53 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
54 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
55 | PROJECT : CCD (6144) MODULE : asn1_integ |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
56 | STATE : code ROUTINE : Read_unique_Integer |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
57 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
58
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
59 PURPOSE : Decode integer with only one possible value.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
60 Such a value is never encoded.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
61 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
62 void Read_unique_Integer (const ULONG e_ref, T_CCD_Globs *globs)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
63 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
64 ULONG varRef, valRef;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
65 U8 *value;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
66
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
67 varRef = (ULONG) melem[e_ref].elemRef;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
68 valRef = (ULONG) mvar[varRef].valueDefs;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
69 #ifdef DEBUG_CCD
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
70 #ifndef CCD_SYMBOLS
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
71 TRACE_CCD (globs, "Read_unique_Integer()");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
72 #else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
73 TRACE_CCD (globs, "Read_unique_Integer() %s", ccddata_get_alias((USHORT) e_ref, 1));
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
74 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
75 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
76
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
77 if (mval[valRef].startValue EQ 0)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
78 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
79 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
80 * Do not do anything for empty sequences and NULL elements.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
81 * (Hint: Integers with only one possible value equal to 0 are
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
82 * automatically processed through memory reset of the C-structure
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
83 * at the beginning of decode activities or after each dynamic
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
84 * memory allocation.)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
85 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
86 return;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
87 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
88 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
89 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
90 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
91 * For optional elements we have already set the valid flag in the
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
92 * C-structure while processing ASN1_SEQ.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
93 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
94 if (melem[e_ref].optional)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
95 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
96 if (globs->pstruct[globs->pstructOffs++] EQ FALSE)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
97 return;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
98 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
99
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
100 #ifdef DYNAMIC_ARRAYS
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
101 if ( is_pointer_type(e_ref) )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
102 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
103 value = PER_allocmem(e_ref, 1, globs);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
104
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
105 if (value EQ (U8 *)ccdError)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
106 return;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
107
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
108 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
109 * Store pointer to allocated memory in c structure.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
110 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
111 *(U8 **)(globs->pstruct + globs->pstructOffs) = value;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
112 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
113 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
114 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
115 value = globs->pstruct + globs->pstructOffs;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
116
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
117 switch (mvar[varRef].cType)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
118 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
119 case 'B':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
120 *(U8*) value = (U8) mval[valRef].startValue;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
121 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
122 case 'C':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
123 *(S8*) value = (S8) mval[valRef].startValue;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
124 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
125 case 'S':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
126 *(U16*) value = (U16) mval[valRef].startValue;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
127 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
128 case 'T':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
129 *(S16*) value = (S16) mval[valRef].startValue;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
130 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
131 case 'L':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
132 *(U32*) value = (U32) mval[valRef].startValue;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
133 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
134 case 'M':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
135 *(S32*) value = (S32) mval[valRef].startValue;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
136 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
137 default:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
138 ccd_recordFault (globs,ERR_DEFECT_CCDDATA, BREAK, (USHORT) e_ref, value);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
139 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
140 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
141 return;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
142 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
143 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
144 #endif /* !RUN_INT_RAM */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
145
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
146 #ifndef RUN_INT_RAM
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
147 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
148 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
149 | PROJECT : CCD (6144) MODULE : asn1_integ |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
150 | STATE : code ROUTINE : cdc_asn1_integ_decode |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
151 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
152
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
153 PURPOSE : Encoding of the PER integer type for UMTS
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
154 PER-visible constraints restrict the integer value to be a
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
155 constrained whole number. This gives a lower and an upper
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
156 bound for the integer. The lb is also called offset. The
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
157 encoded value is the difference between the actual and the
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
158 offset value.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
159 A possible and meant default value is never encoded.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
160 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
161 SHORT cdc_asn1_integ_decode (const ULONG c_ref, const ULONG e_ref, T_CCD_Globs *globs)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
162 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
163 ULONG repeat=1, maxRep=1, varRef, valRef;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
164 BOOL DefaultFound= FALSE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
165 S32 IfnotPresent;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
166 UBYTE *value, *old_pstruct = NULL;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
167
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
168 varRef = (ULONG) melem[e_ref].elemRef;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
169
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
170 #ifdef DEBUG_CCD
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
171 #ifndef CCD_SYMBOLS
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
172 TRACE_CCD (globs, "cdc_asn1_integ_decode()");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
173 #else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
174 TRACE_CCD (globs, "cdc_asn1_integ_decode() %s", ccddata_get_alias((USHORT) e_ref, 1));
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
175 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
176 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
177
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
178 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
179 * Set the offset in the C-structure on the value for this element.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
180 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
181 globs->pstructOffs = melem[e_ref].structOffs;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
182
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
183 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
184 * Decode an empty sequence, a NULL element or an integer of constant value.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
185 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
186 if (mvar[varRef].bSize EQ 0)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
187 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
188 Read_unique_Integer (e_ref, globs);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
189 return 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
190 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
191 valRef = (ULONG) mvar[varRef].valueDefs;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
192
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
193 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
194 * Set pstrcutOffs and maxRep. Check the valid flag in case of optional elements.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
195 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
196 if (PER_CommonBegin (e_ref, &maxRep, globs) NEQ ccdOK)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
197 return 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
198
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
199 #ifdef DYNAMIC_ARRAYS
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
200 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
201 * Allocate memory if this is a pointer type (dynamic array)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
202 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
203 if ( is_pointer_type(e_ref) ) {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
204 old_pstruct = globs->pstruct;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
205 if ( PER_allocmem_and_update(e_ref, maxRep, globs) NEQ ccdOK)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
206 /* No memory - Return. Error already set in function call above. */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
207 return 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
208 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
209 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
210
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
211 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
212 * Check if there is a default value for the element.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
213 * If yes, just set it aside for a later comparision.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
214 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
215 if (mval[valRef+1].isDefault EQ 2)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
216 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
217 IfnotPresent = mval[valRef+1].startValue;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
218 DefaultFound = TRUE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
219 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
220
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
221 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
222 * Decode all elements of the array.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
223 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
224 while ( repeat <= maxRep)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
225 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
226
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
227 value = 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 * There is a default value for this integer elment.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
231 * While decoding of the ASN1-SEQUENCE contiaing this integer
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
232 * we have used a particular byte of C-structure to signalize
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
233 * the decoding of a default value (byte set to 0).
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
234 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
235 if (DefaultFound AND !globs->pstruct[melem[e_ref].structOffs])
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
236 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
237 switch (mvar[varRef].cType)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
238 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
239 case 'B':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
240 *(U8*) value = (U8) IfnotPresent;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
241 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
242 case 'C':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
243 *(S8*) value = (S8) IfnotPresent;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
244 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
245 case 'S':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
246 *(U16*) value = (U16) IfnotPresent;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
247 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
248 case 'T':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
249 *(S16*) value = (S16) IfnotPresent;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
250 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
251 case 'L':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
252 *(U32*) value = (U32) IfnotPresent;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
253 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
254 case 'M':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
255 *(S32*) value = (S32) IfnotPresent;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
256 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
257 default:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
258 ccd_recordFault (globs,ERR_DEFECT_CCDDATA, BREAK, (USHORT) e_ref, value);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
259 return 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
260 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
261 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
262 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
263 * There is no default value defined for this integer elment.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
264 * Read the value from the bit buffer.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
265 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
266 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
267 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
268 U32 ub, lb;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
269 ULONG readBits;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
270 U32 DecodedValue;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
271
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
272 lb = mval[valRef].startValue;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
273 ub = mval[valRef].endValue;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
274
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
275 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
276 * Read the non-negative value from the air message.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
277 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
278 readBits = bf_getBits (mvar[varRef].bSize, globs);
|
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 if (readBits <= (U32)(ub - lb))
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
282 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
283 DecodedValue = lb + readBits;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
284 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
285 * Add the offset to the read value to get the actual one.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
286
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
287 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
288 switch (mvar[varRef].cType)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
289 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
290 case 'B':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
291 *(U8*) value = (U8) DecodedValue;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
292 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
293 case 'C':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
294 *(S8*) value = (S8) DecodedValue;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
295 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
296 case 'S':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
297 *(U16*) value = (U16) DecodedValue;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
298 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
299 case 'T':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
300 *(S16*) value = (S16) DecodedValue;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
301 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
302 case 'L':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
303 *(U32*) value = (U32) DecodedValue;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
304 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
305 case 'M':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
306 *(S32*) value = (S32) DecodedValue;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
307 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
308 default:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
309 ccd_recordFault (globs,ERR_DEFECT_CCDDATA, BREAK, (USHORT) e_ref, value);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
310 break;
|
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 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
314 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
315 #ifdef DEBUG_CCD
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
316 TRACE_CCD (globs, "integer out of range! %ld require: %ld .. %ld ", DecodedValue, lb, ub);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
317 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
318 if (melem[e_ref].optional)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
319 ccd_recordFault (globs, ERR_ASN1_OPT_IE, CONTINUE, (USHORT) e_ref, value);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
320 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
321 ccd_recordFault (globs, ERR_ASN1_MAND_IE, CONTINUE, (USHORT) e_ref, value);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
322 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
323 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
324 repeat ++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
325 globs->pstructOffs += mvar[varRef].cSize;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
326 }/*while*/
|
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 (old_pstruct NEQ NULL)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
330 globs->pstruct = old_pstruct;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
331 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
332
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
333 return 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
334 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
335 #endif /* !RUN_INT_RAM */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
336
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
337 #ifndef RUN_INT_RAM
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
338 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
339 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
340 | PROJECT : CCD (6144) MODULE : asn1_integ |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
341 | STATE : code ROUTINE : cdc_asn1_integ_encode |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
342 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
343
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
344 PURPOSE : Encoding of the PER integer type for UMTS
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
345 PER-visible constraints restrict the integer value to be a
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
346 constrained whole number. This gives a lower and an upper
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
347 bound for the integer. The lb is also called offset. The
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
348 encoded value is the difference between the actual and the
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
349 offset value. Hence encoded values are non-negative.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
350 A possible and meant default value is never encoded.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
351 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
352 SHORT cdc_asn1_integ_encode (const ULONG c_ref, const ULONG e_ref, T_CCD_Globs *globs)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
353 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
354 ULONG repeat=1, maxRep=1, varRef, valRef;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
355 BOOL DefaultFound= FALSE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
356 S32 IfnotPresent;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
357 U8 *base_pstruct;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
358
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
359 #ifdef DEBUG_CCD
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
360 #ifndef CCD_SYMBOLS
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
361 TRACE_CCD (globs, "cdc_asn1_integ_encode()");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
362 #else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
363 TRACE_CCD (globs, "cdc_asn1_integ_encode() %s", ccddata_get_alias((USHORT) e_ref, 1));
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
364 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
365 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
366
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
367 varRef = (ULONG) melem[e_ref].elemRef;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
368 valRef = (ULONG) mvar[varRef].valueDefs;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
369
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
370 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
371 * Don't do anything for empty sequences, NULL elements or integers of constant value.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
372 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
373 if (mvar[varRef].bSize EQ 0)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
374 return 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
375
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
376 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
377 * Set pstrcutOffs and maxRep. Check the valid flag in case of optional elements.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
378 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
379 if (PER_CommonBegin (e_ref, &maxRep, globs) NEQ ccdOK)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
380 return 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
381
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
382 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
383 * Check if there is a default value for the element.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
384 * If yes, just set it aside for a later comparision.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
385 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
386 if (mval[valRef+1].isDefault EQ 2)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
387 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
388 IfnotPresent = mval[valRef+1].startValue;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
389 DefaultFound = TRUE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
390 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
391
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
392 #ifdef DYNAMIC_ARRAYS
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
393 if ( is_pointer_type(e_ref) )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
394 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
395 base_pstruct = *(U8 **)(globs->pstruct + globs->pstructOffs);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
396 if (ccd_check_pointer(base_pstruct) == ccdOK)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
397 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
398 globs->pstructOffs = 0;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
399 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
400 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
401 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
402 ccd_recordFault (globs, ERR_INVALID_PTR, BREAK, (USHORT) e_ref,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
403 &globs->pstruct[globs->pstructOffs]);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
404 return 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
405 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
406 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
407 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
408 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
409 base_pstruct = globs->pstruct;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
410
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
411 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
412 * Encode all elements of the array.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
413 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
414 while ( repeat <= maxRep)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
415 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
416 S32 ub, lb, value;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
417 UBYTE *p;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
418
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
419 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
420 * setup the read pointer to the element in the C-structure
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
421 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
422 p = base_pstruct + globs->pstructOffs;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
423
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
424 switch (mvar[varRef].cType)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
425 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
426 case 'B':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
427 value = (S32)*(UBYTE *) p;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
428 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
429 case 'C':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
430 value = (S32)*(S8 *) p;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
431 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
432 case 'S':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
433 value = (S32)*(USHORT *) p;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
434 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
435 case 'T':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
436 value = (S32)*(S16 *) p;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
437 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
438 case 'L':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
439 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
440 * This type casting can be critical.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
441 * Thus the case of bSize=32 will be handled separately.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
442 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
443 if (mvar[varRef].bSize < 32)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
444 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
445 value = (S32)*(U32 *) p;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
446 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
447 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
448 case 'M':
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
449 value = *(S32 *) p;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
450 break;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
451 default:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
452 ccd_recordFault (globs, ERR_DEFECT_CCDDATA, BREAK, (USHORT) e_ref, p);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
453 return 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
454 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
455
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
456 if (mvar[varRef].cType EQ 'L' AND
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
457 (mvar[varRef].bSize EQ 32))
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
458 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
459 ULONG CriticalValue;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
460 U32 lb, ub;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
461 CriticalValue = *(U32 *) p;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
462 if (!DefaultFound OR (U32)IfnotPresent NEQ CriticalValue)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
463 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
464 lb = (U32) mval[valRef].startValue;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
465 ub = (U32) mval[valRef].endValue;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
466 if (lb <= CriticalValue && CriticalValue <= ub)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
467 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
468 bf_writeVal (CriticalValue - lb, mvar[varRef].bSize, globs);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
469 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
470 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
471 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
472 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
473 #ifdef DEBUG_CCD
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
474 TRACE_CCD (globs, "integer out of range! %ld require: %ld .. %ld ",
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
475 value, lb, ub);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
476 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
477 ccd_recordFault (globs, ERR_INT_VALUE, CONTINUE, (USHORT) e_ref, p);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
478 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
479 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
480 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
481 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
482 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
483 * Encode only non-default values.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
484 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
485 if (!DefaultFound OR IfnotPresent NEQ value)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
486 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
487 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
488 * A non-negative-binary-integer will be encoded since the offset must
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
489 * be subtracted from the value read from the C-structure.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
490 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
491 lb = mval[valRef].startValue;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
492 ub = mval[valRef].endValue;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
493 if (lb <= value AND value <= ub)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
494 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
495 bf_writeVal ((ULONG)(value - lb), mvar[varRef].bSize, globs);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
496 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
497 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
498 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
499 #ifdef DEBUG_CCD
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
500 TRACE_CCD (globs, "integer out of range! %ld require: %ld .. %ld ", value, lb, ub);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
501 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
502 ccd_recordFault (globs, ERR_INT_VALUE, CONTINUE, (USHORT) e_ref, p);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
503 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
504 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
505 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
506 repeat ++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
507 globs->pstructOffs += mvar[varRef].cSize;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
508 }/* while-loop */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
509
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
510 return 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
511 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
512 #endif /* !RUN_INT_RAM */
|