1 ///////////////////////////////////////////////////////////////////////////////
2 // Copyright (c) 2000-2014 Ericsson Telecom AB
3 // All rights reserved. This program and the accompanying materials
4 // are made available under the terms of the Eclipse Public License v1.0
5 // which accompanies this distribution, and is available at
6 // http://www.eclipse.org/legal/epl-v10.html
7 ///////////////////////////////////////////////////////////////////////////////
9 #include "../common/memory.h"
16 // =================================
18 // =================================
20 void Code::init_output(output_struct
*output
)
22 output
->header
.includes
= NULL
;
23 output
->header
.class_decls
= NULL
;
24 output
->header
.typedefs
= NULL
;
25 output
->header
.class_defs
= NULL
;
26 output
->header
.function_prototypes
= NULL
;
27 output
->header
.global_vars
= NULL
;
28 output
->header
.testport_includes
= NULL
;
29 output
->source
.includes
= NULL
;
30 output
->source
.static_function_prototypes
= NULL
;
31 output
->source
.static_conversion_function_prototypes
= NULL
;
32 output
->source
.string_literals
= NULL
;
33 output
->source
.class_defs
= NULL
;
34 output
->source
.global_vars
= NULL
;
35 output
->source
.methods
= NULL
;
36 output
->source
.function_bodies
= NULL
;
37 output
->source
.static_function_bodies
= NULL
;
38 output
->source
.static_conversion_function_bodies
= NULL
;
39 output
->functions
.pre_init
= NULL
;
40 output
->functions
.post_init
= NULL
;
41 output
->functions
.set_param
= NULL
;
42 output
->functions
.log_param
= NULL
;
43 output
->functions
.init_comp
= NULL
;
44 output
->functions
.start
= NULL
;
45 output
->functions
.control
= NULL
;
48 void Code::merge_output(output_struct
*dest
, output_struct
*src
)
50 dest
->header
.includes
=
51 mputstr(dest
->header
.includes
, src
->header
.includes
);
52 dest
->header
.class_decls
=
53 mputstr(dest
->header
.class_decls
, src
->header
.class_decls
);
54 dest
->header
.typedefs
=
55 mputstr(dest
->header
.typedefs
, src
->header
.typedefs
);
56 dest
->header
.class_defs
=
57 mputstr(dest
->header
.class_defs
, src
->header
.class_defs
);
58 dest
->header
.function_prototypes
=
59 mputstr(dest
->header
.function_prototypes
,
60 src
->header
.function_prototypes
);
61 dest
->header
.global_vars
=
62 mputstr(dest
->header
.global_vars
, src
->header
.global_vars
);
63 dest
->header
.testport_includes
=
64 mputstr(dest
->header
.testport_includes
, src
->header
.testport_includes
);
65 dest
->source
.includes
=
66 mputstr(dest
->source
.includes
, src
->source
.includes
);
67 dest
->source
.static_function_prototypes
=
68 mputstr(dest
->source
.static_function_prototypes
,
69 src
->source
.static_function_prototypes
);
70 dest
->source
.static_conversion_function_prototypes
=
71 mputstr(dest
->source
.static_conversion_function_prototypes
,
72 src
->source
.static_conversion_function_prototypes
);
73 dest
->source
.string_literals
=
74 mputstr(dest
->source
.string_literals
, src
->source
.string_literals
);
75 dest
->source
.class_defs
=
76 mputstr(dest
->source
.class_defs
, src
->source
.class_defs
);
77 dest
->source
.global_vars
=
78 mputstr(dest
->source
.global_vars
, src
->source
.global_vars
);
79 dest
->source
.methods
=
80 mputstr(dest
->source
.methods
, src
->source
.methods
);
81 dest
->source
.function_bodies
=
82 mputstr(dest
->source
.function_bodies
, src
->source
.function_bodies
);
83 dest
->source
.static_function_bodies
=
84 mputstr(dest
->source
.static_function_bodies
,
85 src
->source
.static_function_bodies
);
86 dest
->source
.static_conversion_function_bodies
=
87 mputstr(dest
->source
.static_conversion_function_bodies
,
88 src
->source
.static_conversion_function_bodies
);
89 dest
->functions
.pre_init
=
90 mputstr(dest
->functions
.pre_init
, src
->functions
.pre_init
);
91 dest
->functions
.post_init
=
92 mputstr(dest
->functions
.post_init
, src
->functions
.post_init
);
93 dest
->functions
.set_param
=
94 mputstr(dest
->functions
.set_param
, src
->functions
.set_param
);
95 dest
->functions
.log_param
=
96 mputstr(dest
->functions
.log_param
, src
->functions
.log_param
);
97 dest
->functions
.init_comp
=
98 mputstr(dest
->functions
.init_comp
, src
->functions
.init_comp
);
99 dest
->functions
.start
=
100 mputstr(dest
->functions
.start
, src
->functions
.start
);
101 dest
->functions
.control
=
102 mputstr(dest
->functions
.control
, src
->functions
.control
);
105 void Code::free_output(output_struct
*output
)
107 Free(output
->header
.includes
);
108 Free(output
->header
.class_decls
);
109 Free(output
->header
.typedefs
);
110 Free(output
->header
.class_defs
);
111 Free(output
->header
.function_prototypes
);
112 Free(output
->header
.global_vars
);
113 Free(output
->header
.testport_includes
);
114 Free(output
->source
.includes
);
115 Free(output
->source
.static_function_prototypes
);
116 Free(output
->source
.static_conversion_function_prototypes
);
117 Free(output
->source
.string_literals
);
118 Free(output
->source
.class_defs
);
119 Free(output
->source
.global_vars
);
120 Free(output
->source
.methods
);
121 Free(output
->source
.function_bodies
);
122 Free(output
->source
.static_function_bodies
);
123 Free(output
->source
.static_conversion_function_bodies
);
124 Free(output
->functions
.pre_init
);
125 Free(output
->functions
.post_init
);
126 Free(output
->functions
.set_param
);
127 Free(output
->functions
.log_param
);
128 Free(output
->functions
.init_comp
);
129 Free(output
->functions
.start
);
130 Free(output
->functions
.control
);
134 void Code::init_cdef(const_def
*cdef
)
142 void Code::merge_cdef(output_struct
*dest
, const_def
*cdef
)
144 dest
->header
.global_vars
= mputstr(dest
->header
.global_vars
, cdef
->decl
);
145 dest
->source
.global_vars
= mputstr(dest
->source
.global_vars
, cdef
->def
);
146 dest
->functions
.pre_init
= mputstr(dest
->functions
.pre_init
, cdef
->init
);
149 void Code::free_cdef(const_def
*cdef
)
157 void Code::init_expr(expression_struct
*expr
)
159 expr
->preamble
= NULL
;
161 expr
->postamble
= NULL
;
164 void Code::clean_expr(expression_struct
*expr
)
170 void Code::free_expr(expression_struct
*expr
)
172 Free(expr
->preamble
);
174 Free(expr
->postamble
);
177 char* Code::merge_free_expr(char* str
, expression_struct
*expr
,
180 if (expr
->preamble
|| expr
->postamble
) {
181 // open a statement block if the expression has a preamble or postamble
182 str
= mputstr(str
, "{\n");
183 // append the preamble if present
184 if (expr
->preamble
) str
= mputstr(str
, expr
->preamble
);
186 // append the expression itself
187 str
= mputstr(str
, expr
->expr
);
188 // terminate it with a bracket or semi-colon
189 if (is_block
) str
= mputstr(str
, "}\n");
190 else str
= mputstr(str
, ";\n");
191 if (expr
->preamble
|| expr
->postamble
) {
192 // append the postamble if present
193 if (expr
->postamble
) str
= mputstr(str
, expr
->postamble
);
194 // close the statement block
195 str
= mputstr(str
, "}\n");
201 char *Code::translate_character(char *str
, char c
, bool in_string
)
203 int i
= (unsigned char)c
;
206 return mputstr(str
, "\\a");
208 return mputstr(str
, "\\b");
210 return mputstr(str
, "\\f");
212 return mputstr(str
, "\\n");
214 return mputstr(str
, "\\r");
216 return mputstr(str
, "\\t");
218 return mputstr(str
, "\\v");
220 return mputstr(str
, "\\\\");
222 if (in_string
) return mputc(str
, '\'');
223 else return mputstr(str
, "\\'");
225 if (in_string
) return mputstr(str
, "\\\"");
226 else return mputc(str
, '"');
228 // to avoid recognition of trigraphs
229 if (in_string
) return mputstr(str
, "\\?");
230 else return mputc(str
, '?');
232 if (isascii(i
) && isprint(i
)) return mputc(str
, c
);
233 return mputprintf(str
, in_string
? "\\%03o" : "\\%o", i
);
237 char *Code::translate_string(char *str
, const char *src
)
239 for (size_t i
= 0; src
[i
] != '\0'; i
++)
240 str
= translate_character(str
, src
[i
], true);
244 } // namespace Common