FreeCalypso > hg > fc-magnetite
annotate src/gpf3/ccd/asn1_choice_ext.c @ 549:69e52afc01d5
configs/* except classic: rebuild tif_na7_db_{fl,ir} from source
The purpose of this change is to allow a TRACEMASK_IN_FFS=1 setting given
on the configure line to have effect; all configs except classic are
included because this feature setting is orthogonal to the choice of
G23M PS version and other config choices. (The classic config is an
exception because its very purpose is to preserve a reference config
with all of the original blobs.)
Note that even though we are switching these TIF libraries from blobs
to recompilation from source in all configs, our source for these libs
compiles into a perfect match to the original blobs in the current default
TRACEMASK_IN_FFS=0 configuration, hence there is no effective change
beyond the unfortunate small increase in compilation times.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 18 Nov 2018 08:33:30 +0000 |
parents | c41a534f33c6 |
children |
rev | line source |
---|---|
2
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /* |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2 +----------------------------------------------------------------------------- |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3 | Project : |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
4 | Modul : asn1_choice_ext.c |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 +----------------------------------------------------------------------------- |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 | Copyright 2002 Texas Instruments Berlin, AG |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 | All rights reserved. |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 | |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 | This file is confidential and a trade secret of Texas |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 | Instruments Berlin, AG |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
11 | The receipt of or possession of this file does not convey |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
12 | any rights to reproduce or disclose its contents or to |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
13 | manufacture, use, or sell anything it may describe, in |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
14 | whole, or in part, without the specific written consent of |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 | Texas Instruments Berlin, AG. |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 +----------------------------------------------------------------------------- |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 | Purpose : Encoding and decoding functions for ASN1_CHOICE_EXTENSIBLE type |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
18 +----------------------------------------------------------------------------- |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 */ |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
20 |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
21 /* |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
22 * Standard definitions like UCHAR, ERROR etc. |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
23 */ |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
24 #include "typedefs.h" |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
25 #include "header.h" |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
26 |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27 /* |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28 * Prototypes of ccd (USE_DRIVER EQ undef) for prototypes only |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
29 * look at ccdapi.h |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
30 */ |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
31 #undef USE_DRIVER |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
32 #include "ccdapi.h" |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
33 |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
34 /* |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
35 * Types and functions for bit access and manipulation |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
36 */ |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
37 #include "ccd_globs.h" |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
38 #include "bitfun.h" |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
39 |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40 /* |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
41 * Prototypes and constants in the common part of ccd |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
42 */ |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
43 #include "ccd.h" |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44 |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
45 /* |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
46 * Declaration of coder/decoder tables |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
47 */ |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
48 #include "ccdtable.h" |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
49 #include "ccddata.h" |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
50 |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
51 #ifndef RUN_INT_RAM |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
52 /* |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
53 +------------------------------------------------------------------------+ |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
54 | PROJECT : CCD (6144) MODULE : asn1_choice_ext | |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
55 | STATE : code ROUTINE : cdc_asn1_choice_ext_decode | |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
56 +------------------------------------------------------------------------+ |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
57 |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
58 PURPOSE : Decode PER extensible CHOICE type |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
59 |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
60 The value of the union tag must be calculated from the encoded |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
61 CHOICE index in the air message. |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
62 For CHOICE alternatives within the extension root: the index |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
63 bit-size relates to max index value in the extension root. |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
64 For CHOICE alternatives within the extension part: the index |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
65 is encoded as a normally small non-negative whole number. |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
66 |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
67 For decoding the CHOICE alternative itself, call the same |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
68 function as for non-extensible CHOICE types. |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
69 */ |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
70 SHORT cdc_asn1_choice_ext_decode (const ULONG c_ref, const ULONG e_ref, T_CCD_Globs *globs) |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
71 { |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
72 U32 extensionBegin; |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
73 T_ENUM UnionTag; /* default: only one alternative */ |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
74 ULONG calc_ref = calcidx[melem[e_ref].calcIdxRef].condCalcRef; |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
75 |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
76 #ifdef DEBUG_CCD |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
77 #ifndef CCD_SYMBOLS |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
78 TRACE_CCD (globs, "cdc_asn1_choice_ext_decode()"); |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
79 #else |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
80 TRACE_CCD (globs, "cdc_asn1_choice_ext_decode() %s", mcomp[melem[e_ref].elemRef].name); |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
81 #endif |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
82 #endif |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
83 |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
84 /* Don't do anything for empty choices */ |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
85 if (mcomp[melem[e_ref].elemRef].numOfComponents == 0) |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
86 { |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
87 return 1; |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
88 } |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
89 |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
90 globs->pstructOffs = melem[e_ref].structOffs; |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
91 |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
92 /* For optional elements we have already set the valid flag in the |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
93 * C-structure. We have done it while processing ASN1_SEQ. |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
94 */ |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
95 if ( ! cdc_isPresent(e_ref, globs) ) { |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
96 return 1; |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
97 } |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
98 |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
99 /* |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
100 * Get max value of CHOICE index within the extension root. |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
101 */ |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
102 if (calc_ref EQ NO_REF |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
103 OR |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
104 calc[calc_ref].operation NEQ 'P') |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
105 { |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
106 ccd_recordFault (globs, ERR_DEFECT_CCDDATA, BREAK, (USHORT) e_ref, |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
107 globs->pstruct+globs->pstructOffs); |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
108 return 1; |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
109 } |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
110 else |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
111 { |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
112 extensionBegin = calc[calc_ref].operand; |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
113 } |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
114 |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
115 /* |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
116 * Read the extensinon bit. |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
117 * If set to 1, read the CHOICE index as a normally samll |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
118 * non-negative whole number. Otherwise read it according |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
119 * to the bitSize of index in the extension root. |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
120 */ |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
121 if (bf_readBit (globs) EQ 0) |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
122 { |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
123 /* CHOICE index is encoded only if there are more than one alternatives. */ |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
124 if (mcomp[melem[e_ref].elemRef].numOfComponents > 1) |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
125 { |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
126 UnionTag = (T_ENUM)bf_getBits (bitSize[extensionBegin], globs); |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
127 } |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
128 else |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
129 UnionTag = 0; |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
130 |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
131 if (UnionTag >= (T_ENUM)extensionBegin) |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
132 { |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
133 ccd_recordFault (globs, ERR_ASN1_ENCODING, BREAK, (USHORT) e_ref, |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
134 globs->pstruct+globs->pstructOffs); |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
135 } |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
136 PER_Decode_ASN1_CHOICE_alterative (e_ref, UnionTag, globs); |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
137 } |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
138 else |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
139 { |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
140 U32 finalBP=0; |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
141 UnionTag = (T_ENUM)Read_NormallySmallNonNegativeWholeNr (globs); |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
142 UnionTag += extensionBegin; |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
143 finalBP = Read_OpenTpye_Length (globs)*8; |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
144 finalBP += globs->bitpos; |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
145 |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
146 /* |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
147 * For unknown extension skip over the octets. |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
148 */ |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
149 if (UnionTag <= (T_ENUM)mcomp[melem[e_ref].elemRef].numOfComponents) |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
150 { |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
151 PER_Decode_ASN1_CHOICE_alterative (e_ref, UnionTag, globs); |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
152 } |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
153 else |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
154 { |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
155 #ifdef DEBUG_CCD |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
156 TRACE_CCD (globs, "Unknown extension with CHOICE index = %ld...skipped to the bit %ld", UnionTag, finalBP); |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
157 #endif |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
158 } |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
159 bf_setBitpos (finalBP, globs); |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
160 } |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
161 |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
162 return 1; |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
163 } |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
164 #endif /* !RUN_INT_RAM */ |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
165 |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
166 #ifndef RUN_INT_RAM |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
167 /* |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
168 +------------------------------------------------------------------------+ |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
169 | PROJECT : CCD (6144) MODULE : asn1_choice_ext | |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
170 | STATE : code ROUTINE : cdc_asn1_choice_ext_encode | |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
171 +------------------------------------------------------------------------+ |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
172 |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
173 PURPOSE : Encode PER extensible CHOICE type |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
174 |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
175 Evaluate the union controller. |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
176 1) It refers to a CHOICE alternative within the extension root: |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
177 Set the extension bit to 0. |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
178 Write the CHOICE index. |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
179 Then encode the chosen alternative. |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
180 ------------------------------------ |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
181 | extension | CHOICE | encoded | |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
182 | bit | index | alternative | |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
183 ------------------------------------ |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
184 |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
185 2) It refers to a CHOICE alternative within the extension list: |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
186 Set the extension bit to 1. |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
187 Encode the CHOICE index as a normally small non-negative whole nr. |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
188 Skip over 6 bits dedicated to length determinant. |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
189 Encode the chosen alternative. |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
190 Calculate the bit size of the encoded alternative. |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
191 Encode the calculated bit size into the field of length |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
192 determinant. Right shift the encoded alternative, if 6 bits |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
193 are not enough for the length determinant. |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
194 ------------------------------------------------ |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
195 | extension | CHOICE | length | encoded | |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
196 | bit | index | determinant | alternative | |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
197 ------------------------------------------------ |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
198 |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
199 For encoding the CHOICE alternative itself, call the same |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
200 function as for non-extensible CHOICE types. |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
201 */ |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
202 SHORT cdc_asn1_choice_ext_encode (const ULONG c_ref, const ULONG e_ref, T_CCD_Globs *globs) |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
203 { |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
204 U16 startBitpos, Len, EndBitPos; |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
205 T_ENUM UnionTag; /* default: only one alternative */ |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
206 U32 extensionBegin; |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
207 ULONG calc_ref= calcidx[melem[e_ref].calcIdxRef].condCalcRef; |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
208 |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
209 #ifdef DEBUG_CCD |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
210 #ifndef CCD_SYMBOLS |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
211 TRACE_CCD (globs, "cdc_asn1_choice_ext_encode()"); |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
212 #else |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
213 TRACE_CCD (globs, "cdc_asn1_choice_ext_encode() %s", mcomp[melem[e_ref].elemRef].name); |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
214 #endif |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
215 #endif |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
216 |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
217 /* Don't do anything for empty choices */ |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
218 if (mcomp[melem[e_ref].elemRef].numOfComponents == 0) |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
219 { |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
220 return 1; |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
221 } |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
222 |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
223 globs->pstructOffs = melem[e_ref].structOffs; |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
224 |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
225 /* For optional elements we have already set the valid flag in the |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
226 * C-structure. We have done it while processing ASN1_SEQ. |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
227 */ |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
228 if ( ! cdc_isPresent(e_ref, globs) ) |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
229 return 1; |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
230 |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
231 /* |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
232 * Get max value of CHOICE index within the extension root. |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
233 */ |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
234 if (calc_ref EQ NO_REF |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
235 OR |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
236 calc[calc_ref].operation NEQ 'P') |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
237 { |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
238 ccd_recordFault (globs, ERR_DEFECT_CCDDATA, BREAK,(USHORT) e_ref, |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
239 globs->pstruct+globs->pstructOffs); |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
240 return 1; |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
241 } |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
242 else |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
243 { |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
244 extensionBegin = calc[calc_ref].operand; |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
245 } |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
246 |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
247 /* |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
248 * Get the value of chosen index (= union controller). |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
249 */ |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
250 UnionTag = *(T_ENUM *) (globs->pstruct+globs->pstructOffs); |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
251 |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
252 /* |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
253 * The chosen alternative belongs to the extension list. |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
254 */ |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
255 if ((U32)UnionTag >= extensionBegin) |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
256 { |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
257 /* Encode the extension bit first */ |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
258 bf_writeBit (1, globs); |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
259 /* Encode the CHOICE index. */ |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
260 Write_NormallySmallNonNegativeWholeNr (((U32)UnionTag - extensionBegin), globs); |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
261 |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
262 /* Skip over the bits estimated for the length determinant. */ |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
263 bf_incBitpos (8, globs); |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
264 startBitpos = globs->bitpos; |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
265 PER_Encode_ASN1_CHOICE_alterative (e_ref, UnionTag, globs); |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
266 |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
267 /* |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
268 * Check if zero padding bits are necessary. If encoding |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
269 * consumed no bits, insert a zero-octet in the bit string. |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
270 * Then calculate length of the encoded open type in octets. |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
271 */ |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
272 if ((Len = globs->bitpos - startBitpos) EQ 0) |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
273 { |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
274 bf_writeVal (0, 8, globs); |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
275 Len = 1; |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
276 } |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
277 else |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
278 { |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
279 if ((Len&7) NEQ 0) |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
280 bf_incBitpos (8 - (Len&7), globs); |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
281 Len = (U16)(globs->bitpos - startBitpos) >> 3; |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
282 } |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
283 EndBitPos = globs->bitpos; |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
284 |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
285 /* |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
286 * Encode the length determinant. |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
287 */ |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
288 if (Len < 128) |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
289 { |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
290 bf_setBitpos (startBitpos-8, globs); |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
291 Write_OpenTpye_Length ((U32)Len, globs); |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
292 } |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
293 /* |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
294 * This case does not seem to happen very often. |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
295 */ |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
296 else |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
297 { |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
298 ccd_recordFault (globs, ERR_ASN1_ENCODING, BREAK,(USHORT) e_ref, |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
299 globs->pstruct+globs->pstructOffs); |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
300 } |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
301 /* |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
302 * Encoding for the extensible choice is finished. |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
303 * Set the bit position pointer to the end of encoded open type. |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
304 */ |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
305 bf_setBitpos (EndBitPos, globs); |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
306 } |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
307 /* |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
308 * The chosen alternative belongs to the extension root. |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
309 */ |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
310 else |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
311 { |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
312 bf_writeBit (0, globs); |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
313 /* CHOICE index is encoded only if there are more than one alternatives. */ |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
314 if (mcomp[melem[e_ref].elemRef].numOfComponents > 1) |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
315 { |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
316 bf_writeVal ((ULONG) UnionTag, (ULONG) bitSize[extensionBegin], globs); |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
317 } |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
318 PER_Encode_ASN1_CHOICE_alterative (e_ref, UnionTag, globs); |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
319 } |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
320 |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
321 return 1; |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
322 } |
c41a534f33c6
src/gpf3: preened GPF goo from TCS3.2
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
323 #endif /* !RUN_INT_RAM */ |