comparison src/gpf/ccd/ccd_patch.c @ 0:4e78acac3d88

src/{condat,cs,gpf,nucleus}: import from Selenite
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 16 Oct 2020 06:23:26 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:4e78acac3d88
1 /*
2 +-----------------------------------------------------------------------------
3 | Project :
4 | Modul : ccd_patch.c
5 +-----------------------------------------------------------------------------
6 | Copyright 2002 Texas Instruments Berlin, AG
7 | All rights reserved.
8 |
9 | This file is confidential and a trade secret of Texas
10 | Instruments Berlin, AG
11 | The receipt of or possession of this file does not convey
12 | any rights to reproduce or disclose its contents or to
13 | manufacture, use, or sell anything it may describe, in
14 | whole, or in part, without the specific written consent of
15 | Texas Instruments Berlin, AG.
16 +-----------------------------------------------------------------------------
17 | Purpose : CCD - routines for patching msg elements with given values
18 +-----------------------------------------------------------------------------
19 */
20
21 #define CCD_PATCH_C
22
23 /*==== INCLUDES ==============================================================*/
24 #include <stdio.h>
25 #include <string.h>
26
27 #include "typedefs.h"
28 #include "ccd_globs.h"
29 #include "Bitfun.h"
30 #include "ccddata.h"
31 #include "ccd.h"
32
33 /*==== CONSTS ================================================================*//*==== TYPES =================================================================*/
34 /*==== LOCALS ================================================================*/
35 static T_patch_info* pi;
36
37 /*==== PRIVATE FUNCTIONS =====================================================*/
38 /*==== PUBLIC FUNCTIONS ======================================================*/
39
40 /*
41 +------------------------------------------------------------------------------
42 | Function : ccd_set_patch_infos
43 +------------------------------------------------------------------------------
44 | Description : This function submits a list of patch records to CCD
45 |
46 | Parameters : pinfo - the list
47 |
48 | Return : ccdOK on success, otherwise ccdError
49 +------------------------------------------------------------------------------
50 */
51 int CCDDATA_PREF(ccd_set_patch_infos) (T_patch_info* pinfo)
52 {
53 pi = pinfo;
54 return ccdOK;
55 }
56
57 /*
58 +------------------------------------------------------------------------------
59 | Function : ccd_patch
60 +------------------------------------------------------------------------------
61 | Description : This function checks if the element is to be patched
62 | and patches if yes.
63 |
64 | Parameters : globs - entity/code information (containing nesting stack)
65 | validflag - set if called from valid flag coding
66 |
67 | Return : FALSE if real coding function is to be called, TRUE otherwise
68 | if validflag is set, TRUE means, the element is identified
69 | in the patch list
70 +------------------------------------------------------------------------------
71 */
72
73 int ccd_patch (T_CCD_Globs* globs, int validflag)
74 {
75 int i = 0;
76 USHORT elem;
77 if (pi)
78 {
79 while (pi[i].numelems)
80 {
81 if (!memcmp (pi[i].elemid, globs->error_stack,
82 (pi[i].numelems+1) * sizeof (U16)))
83 {
84 elem = pi[i].elemid[pi[i].numelems];
85 if (validflag)
86 {
87 if (pi[i].errorcode != CCDP_NOT_FOUND)
88 {
89 #ifdef DEBUG_CCD
90 TRACE_CCD (globs, "ccd_patch(): invalid error code (%d) for %s",
91 pi[i].errorcode, ccddata_get_alias (elem, 1));
92 #endif
93 }
94 else
95 {
96 #ifdef DEBUG_CCD
97 TRACE_CCD (globs, "ccd_patch(): checked valid flag for %s",
98 ccddata_get_alias (elem, 1));
99 #endif
100 pi[i].errorcode = CCDP_VALIDFLAG_SEEN;
101 }
102 return TRUE;
103 }
104 else
105 {
106 if ((pi[i].errorcode != CCDP_NOT_FOUND) &&
107 (pi[i].errorcode != CCDP_VALIDFLAG_SEEN))
108 {
109 #ifdef DEBUG_CCD
110 TRACE_CCD (globs, "ccd_patch(): invalid error code (%d) for %s",
111 pi[i].errorcode, ccddata_get_alias (elem, 1));
112 #endif
113 }
114 else
115 {
116 UBYTE* pstruct = globs->pstruct;
117 ULONG offset = globs->pstructOffs;
118 #ifdef DEBUG_CCD
119 int j, len;
120 char out[32];
121 len = (pi[i].bitwidth+7)/8;
122 TRACE_CCD (globs, "ccd_patch(): patching %s with 0x%x bits",
123 ccddata_get_alias (elem, 1), pi[i].bitwidth);
124 for (j=0; j<len; j++)
125 {
126 sprintf (&out[(3*j)%24], "%02x \0", pi[i].bits[j]);
127 if (!((j+1)%8))
128 TRACE_CCD (globs, out);
129 }
130 if (((j+1)%8))
131 TRACE_CCD (globs, out);
132 #endif
133 globs->pstruct = pi[i].bits;
134 globs->pstructOffs = 0;
135 bf_writeBitChunk (pi[i].bitwidth, globs);
136 globs->pstruct = pstruct;
137 globs->pstructOffs = offset;
138 pi[i].errorcode = CCDP_NO_ERROR;
139 }
140 return TRUE;
141 }
142 }
143 i++;
144 }
145 }
146 return FALSE;
147 }