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 : bcd_mnc.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 BCD_MNC elements
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
18 +-----------------------------------------------------------------------------
|
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 GLOBAL, 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 : CCD |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
56 | STATE : code ROUTINE : cdc_bcd_mnc_decode |
|
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 : decoding a byte array, that contains a Mobile Network Code,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
60 from the bitstream:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
61
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
62 MSBit LSBit
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
63 7 8 6 5 4 3 2 1
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
64 DIGIT_3 XXXXXXX Octett n-1
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
65 DIGIT_2 DIGIT_1 Octett n
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
66
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
67 The current decoding position is expected after Octett n-1
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
68 The byte array should be of dimension [2..3] (preferred)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
69 or [3] or [2] (also supported)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
70
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
71 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
72
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
73
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
74 SHORT cdc_bcd_mnc_decode (const ULONG c_ref, const ULONG e_ref, T_CCD_Globs *globs)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
75 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
76 ULONG repeat, max_rep;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
77 BOOL is_variable;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
78 UBYTE digBuffer[3];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
79 UBYTE *addr_c_xxx;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
80 ULONG i;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
81 ULONG cix_ref, num_prolog_steps, prolog_step_ref;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
82 register UBYTE *digits;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
83
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
84 #ifdef DEBUG_CCD
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
85 #ifndef CCD_SYMBOLS
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
86 TRACE_CCD (globs, "cdc_bcd_mnc_decode()");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
87 #else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
88 TRACE_CCD (globs, "cdc_bcd_mnc_decode() %s", ccddata_get_alias((USHORT) e_ref, 1));
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
89 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
90 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
91
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
92 cix_ref = melem[e_ref].calcIdxRef;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
93 num_prolog_steps = calcidx[cix_ref].numPrologSteps;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
94 prolog_step_ref = calcidx[cix_ref].prologStepRef;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
95
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
96 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
97 * if this element is conditional, check the condition
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
98 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
99 if (calcidx[cix_ref].numCondCalcs NEQ 0
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
100 AND ! ccd_conditionOK (e_ref, globs))
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
101 return 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
102
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
103 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
104 * if this element have a defined Prolog
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
105 * we have to process it before decoding the bitstream
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
106 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
107 if (num_prolog_steps)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
108 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
109 ccd_performOperations (num_prolog_steps, prolog_step_ref, globs);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
110 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
111
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
112 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
113 * if this element is repeatable, and the number of
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
114 * repeats depends on another element, calculate the repeater
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
115 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
116 if (melem[e_ref].repType NEQ ' ')
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
117 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
118 is_variable = ccd_calculateRep (e_ref, &repeat, &max_rep, globs);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
119 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
120 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
121 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
122 repeat = 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
123 is_variable = FALSE;
|
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 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
127 * setup the offset into the C-structure for this element
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
128 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
129 globs->pstructOffs = melem[e_ref].structOffs;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
130
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
131 if (melem[e_ref].optional)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
132 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
133 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
134 * for optional elements set the valid-flag
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
135 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
136 globs->pstruct[globs->pstructOffs++] = (UBYTE) TRUE;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
137 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
138
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
139 if (is_variable)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
140 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
141 if (max_rep < 2 OR max_rep > 3)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
142 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
143 ccd_setError (globs, ERR_INVALID_TYPE, BREAK, (USHORT) (globs->bitpos),
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
144 (USHORT) -1);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
145 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
146 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
147 * for variable sized elements store the min-value
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
148 * as counter into the C-Structure (c_xxx).
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
149 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
150 addr_c_xxx = (UBYTE *) (globs->pstruct + globs->pstructOffs++);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
151 if (max_rep > 255)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
152 globs->pstructOffs++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
153 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
154 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
155 addr_c_xxx = NULL;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
156
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
157 digits = (UBYTE *) (globs->pstruct + globs->pstructOffs);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
158
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
159 bf_setBitpos ((globs->bitpos - 8), globs);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
160
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
161 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
162 * read the BCD digits out of the bitstream.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
163 * The read order is 3,X,2,1
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
164 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
165 digBuffer[2] = bf_decodeByteNumber (4, globs);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
166 bf_incBitpos (4, globs);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
167
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
168 digBuffer[1] = bf_decodeByteNumber (4, globs);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
169 digBuffer[0] = bf_decodeByteNumber (4, globs);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
170
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
171 if (addr_c_xxx NEQ NULL)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
172 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
173 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
174 * store the number of digits into the
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
175 * c_xxx variable if there is one.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
176 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
177 repeat = (ULONG) ((digBuffer[2] EQ 0x0f) ? 2 : 3);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
178 if (max_rep > 65535)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
179 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
180 ULONG *addr_c_xxx_u32;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
181 addr_c_xxx_u32 = (ULONG *)addr_c_xxx;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
182 *addr_c_xxx_u32 = repeat;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
183 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
184 else if (max_rep > 255)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
185 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
186 USHORT *addr_c_xxx_u16;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
187 addr_c_xxx_u16 = (USHORT *)addr_c_xxx;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
188 *addr_c_xxx_u16 = (USHORT) repeat;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
189 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
190 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
191 *addr_c_xxx = (UBYTE) repeat;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
192 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
193 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
194 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
195 if (max_rep EQ 2 AND digBuffer[2] NEQ 0xf)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
196 ccd_setError (globs, ERR_PATTERN_MISMATCH,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
197 CONTINUE,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
198 (USHORT) (globs->bitpos-16),
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
199 (USHORT) -1);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
200
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
201 repeat = max_rep;
|
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 * store the digits into the C-Structure variable
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
205 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
206 for (i=0; i<repeat; i++)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
207 digits[i] = digBuffer[i];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
208
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
209 return 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
210 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
211 #endif /* !RUN_INT_RAM */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
212
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
213 #ifndef RUN_INT_RAM
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
214 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
215 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
216 | PROJECT : CCD (6144) MODULE : CCD |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
217 | STATE : code ROUTINE : cdc_bcd_mnc_encode |
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
218 +--------------------------------------------------------------------+
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
219
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
220 PURPOSE : encoding a byte array, that contains a Mobile Network Code,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
221 into the bitstream:
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
222
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
223 MSBit LSBit
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
224 7 8 6 5 4 3 2 1
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
225 DIGIT_3 XXXXXXX Octett n-1
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
226 DIGIT_2 DIGIT_1 Octett n
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
227
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
228 The current coding position is expected after Octett n-1
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
229 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
230
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
231
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
232 SHORT cdc_bcd_mnc_encode (const ULONG c_ref, const ULONG e_ref, T_CCD_Globs *globs)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
233 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
234 ULONG repeat;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
235 UBYTE dig3;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
236 ULONG cix_ref, num_prolog_steps, prolog_step_ref;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
237 register UBYTE *digits;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
238
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
239 #ifdef DEBUG_CCD
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
240 #ifndef CCD_SYMBOLS
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
241 TRACE_CCD (globs, "cdc_bcd_mnc_encode()");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
242 #else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
243 TRACE_CCD (globs, "cdc_bcd_mnc_encode() %s", ccddata_get_alias((USHORT) e_ref, 1));
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
244 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
245 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
246
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
247 cix_ref = melem[e_ref].calcIdxRef;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
248 num_prolog_steps = calcidx[cix_ref].numPrologSteps;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
249 prolog_step_ref = calcidx[cix_ref].prologStepRef;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
250
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
251 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
252 * if this element is conditional, check the condition
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
253 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
254 if (calcidx[cix_ref].numCondCalcs NEQ 0
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
255 AND ! ccd_conditionOK (e_ref, globs))
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
256 return 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
257
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
258 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
259 * if this element have a defined Prolog
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
260 * we have to process it before decoding the bitstream
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
261 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
262 if (num_prolog_steps)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
263 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
264 ccd_performOperations (num_prolog_steps, prolog_step_ref, globs);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
265 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
266
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
267 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
268 * setup the offset into the C-structure for this element
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
269 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
270 globs->pstructOffs = melem[e_ref].structOffs;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
271
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
272 if (melem[e_ref].optional)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
273 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
274 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
275 * for optional elements check the valid-flag
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
276 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
277 if (globs->pstruct[globs->pstructOffs++] == FALSE)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
278 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
279 return 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
280 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
281 #ifdef DEBUG_CCD
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
282 else if (globs->pstruct [melem[e_ref].structOffs] != TRUE)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
283 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
284 TRACE_CCD (globs, "Ambiguous value for valid flag!\n...assumed 1 for ccdID=%d",
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
285 e_ref);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
286 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
287 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
288 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
289
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
290 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
291 * if this element is repeatable, and the number of
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
292 * repeats depends on another element, calculate the repeater
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
293 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
294 if (melem[e_ref].repType EQ 'v' OR melem[e_ref].repType EQ 'i')
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
295 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
296 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
297 * for variable sized elements read the amount
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
298 * of repeats out of the C-Structure (c_xxx).
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
299 * If the number of repeats given by the C-Structure
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
300 * exceeds the allowed value (max_repeat) CCD gives a warning!
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
301 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
302 if (melem[e_ref].maxRepeat > 255)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
303 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
304 ULONG count = (ULONG) (* (USHORT *)(globs->pstruct + globs->pstructOffs++));
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
305 repeat = MINIMUM (count, (ULONG)melem[e_ref].maxRepeat);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
306 if (repeat < count)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
307 ccd_recordFault (globs, ERR_MAX_REPEAT, CONTINUE,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
308 (USHORT) e_ref, globs->pstruct + globs->pstructOffs);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
309 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
310 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
311 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
312 repeat = (ULONG) MINIMUM (globs->pstruct[globs->pstructOffs],
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
313 melem[e_ref].maxRepeat);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
314 if ( repeat < (ULONG) (globs->pstruct[globs->pstructOffs]) )
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
315 ccd_recordFault (globs, ERR_MAX_REPEAT, CONTINUE,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
316 (USHORT) e_ref, globs->pstruct + globs->pstructOffs);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
317 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
318
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
319 globs->pstructOffs++;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
320 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
321 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
322 if (melem[e_ref].repType EQ 'c')
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
323 repeat = (ULONG) melem[e_ref].maxRepeat;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
324 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
325 repeat = 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
326
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
327 /*
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
328 * setup the read pointer to the byte array that contain
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
329 * the BCD number.
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
330 */
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
331 digits = (UBYTE *) (globs->pstruct + globs->pstructOffs);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
332
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
333 if (repeat EQ 2)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
334 dig3 = 0x0f;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
335 else if (repeat EQ 3)
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
336 dig3 = digits[2];
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
337 else
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
338 {
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
339 ccd_setError (globs, ERR_INVALID_TYPE,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
340 BREAK,
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
341 (USHORT) (globs->bitpos),
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
342 (USHORT) -1);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
343 return 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
344 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
345
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
346 bf_setBitpos ((globs->bitpos-8), globs);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
347 bf_codeByteNumber (4, dig3, globs);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
348 bf_incBitpos (4, globs);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
349 bf_codeByteNumber (4, digits[1], globs);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
350 bf_codeByteNumber (4, digits[0], globs);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
351 #ifdef DEBUG_CCD
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
352 TRACE_CCD (globs, "skipping back 8 bits");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
353 TRACE_CCD (globs, "BCD digit (%X) written", (USHORT) dig3);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
354 TRACE_CCD (globs, "skipping 4 bits");
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
355 TRACE_CCD (globs, "BCD digit (%X) written", (USHORT) digits[1]);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
356 TRACE_CCD (globs, "BCD digit (%X) written", (USHORT) digits[0]);
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
357 #endif
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
358
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
359 return 1;
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
360 }
|
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
361 #endif /* !RUN_INT_RAM */
|