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 ///////////////////////////////////////////////////////////////////////////////
8 #include "../../common/memory.h"
10 #include "../datatypes.h"
14 void defSignatureClasses(const signature_def
*sdef
, output_struct
*output
)
16 char *decl
= NULL
, *def
= NULL
, *src
= NULL
;
17 const char *name
= sdef
->name
, *dispname
= sdef
->dispname
;
18 size_t i
, num_in
= 0, num_out
= 0;
20 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
21 if (sdef
->parameters
.elements
[i
].direction
!= PAR_OUT
) num_in
++;
22 if (sdef
->parameters
.elements
[i
].direction
!= PAR_IN
) num_out
++;
31 decl
= mputprintf(decl
, "class %s_call;\n", name
);
33 /* class definition */
34 def
= mputprintf(def
, "class %s_call {\n", name
);
36 /* signature's in and inout parameters */
37 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
38 if (sdef
->parameters
.elements
[i
].direction
!= PAR_OUT
)
39 def
= mputprintf(def
, "%s param_%s;\n",
40 sdef
->parameters
.elements
[i
].type
,
41 sdef
->parameters
.elements
[i
].name
);
44 def
= mputstr(def
, "public:\n");
46 /* parameters' access functions */
47 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
48 if (sdef
->parameters
.elements
[i
].direction
!= PAR_OUT
) {
49 def
= mputprintf(def
, "inline %s& %s() { return param_%s; }\n"
50 "inline const %s& %s() const { return param_%s; }\n",
51 sdef
->parameters
.elements
[i
].type
,
52 sdef
->parameters
.elements
[i
].name
,
53 sdef
->parameters
.elements
[i
].name
,
54 sdef
->parameters
.elements
[i
].type
,
55 sdef
->parameters
.elements
[i
].name
,
56 sdef
->parameters
.elements
[i
].name
);
61 /* encode_text function */
62 def
= mputstr(def
, "void encode_text(Text_Buf& text_buf) const;\n");
63 src
= mputprintf(src
, "void %s_call::encode_text(Text_Buf& text_buf) "
66 for(i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
67 if(sdef
->parameters
.elements
[i
].direction
!= PAR_OUT
)
68 src
= mputprintf(src
, "param_%s.encode_text(text_buf);\n",
69 sdef
->parameters
.elements
[i
].name
);
71 src
= mputstr(src
, "}\n\n");
72 /* decode_text function */
73 def
= mputstr(def
, "void decode_text(Text_Buf& text_buf);\n");
74 src
= mputprintf(src
, "void %s_call::decode_text(Text_Buf& text_buf)\n"
76 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
77 if (sdef
->parameters
.elements
[i
].direction
!= PAR_OUT
)
78 src
= mputprintf(src
, "param_%s.decode_text(text_buf);\n",
79 sdef
->parameters
.elements
[i
].name
);
81 src
= mputstr(src
, "}\n\n");
83 def
= mputstr(def
, "inline void encode_text(Text_Buf&) const "
85 "inline void decode_text(Text_Buf&) { }\n");
89 def
= mputstr(def
, "void log() const;\n");
90 src
= mputprintf(src
, "void %s_call::log() const\n"
93 boolean first_param
= TRUE
;
94 src
= mputprintf(src
, "TTCN_Logger::log_event_str(\"%s : { \");\n",
96 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
97 if (sdef
->parameters
.elements
[i
].direction
!= PAR_OUT
) {
98 src
= mputstr(src
, "TTCN_Logger::log_event_str(\"");
99 if (first_param
) first_param
= FALSE
;
100 else src
= mputstr(src
, ", ");
101 src
= mputprintf(src
, "%s := \");\n"
103 sdef
->parameters
.elements
[i
].dispname
,
104 sdef
->parameters
.elements
[i
].name
);
107 src
= mputstr(src
, "TTCN_Logger::log_event_str(\" }\");\n");
109 src
= mputprintf(src
, "TTCN_Logger::log_event_str(\"%s : { }\");\n",
112 src
= mputstr(src
, "}\n\n");
114 def
= mputstr(def
, "};\n\n");
115 /* end of xxx_call class*/
119 * xxx_call_redirect class (for getcall port-operation)
122 decl
= mputprintf(decl
, "class %s_call_redirect;\n", name
);
124 /* class definition */
125 def
= mputprintf(def
, "class %s_call_redirect {\n", name
);
127 /* parameter pointers */
128 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
129 if (sdef
->parameters
.elements
[i
].direction
!= PAR_OUT
) {
130 def
= mputprintf(def
, "%s *ptr_%s;\n",
131 sdef
->parameters
.elements
[i
].type
,
132 sdef
->parameters
.elements
[i
].name
);
136 def
= mputstr(def
, "public:\n");
140 boolean first_param
= TRUE
;
141 def
= mputprintf(def
, "%s_call_redirect(", name
);
142 for (i
= 0;i
<sdef
->parameters
.nElements
;i
++) {
143 if (sdef
->parameters
.elements
[i
].direction
!= PAR_OUT
) {
144 if (first_param
) first_param
= FALSE
;
145 else def
= mputstr(def
, ", ");
146 def
= mputprintf(def
, "%s *par_%s = NULL",
147 sdef
->parameters
.elements
[i
].type
,
148 sdef
->parameters
.elements
[i
].name
);
151 def
= mputstr(def
, ")\n"
154 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
155 if (sdef
->parameters
.elements
[i
].direction
!= PAR_OUT
) {
156 if (first_param
) first_param
= FALSE
;
157 else def
= mputstr(def
, ", ");
158 def
= mputprintf(def
, "ptr_%s(par_%s)",
159 sdef
->parameters
.elements
[i
].name
,
160 sdef
->parameters
.elements
[i
].name
);
163 def
= mputstr(def
, " { }\n");
165 /* otherwise constructor is not needed */
167 /* set_parameters function (used for param redirect in getcall) */
169 def
= mputprintf(def
, "void set_parameters(const %s_call& call_par) "
171 src
= mputprintf(src
, "void %s_call_redirect::set_parameters(const "
172 "%s_call& call_par) const\n"
174 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
175 if (sdef
->parameters
.elements
[i
].direction
!= PAR_OUT
) {
176 src
= mputprintf(src
, "if (ptr_%s != NULL) "
177 "*ptr_%s = call_par.%s();\n",
178 sdef
->parameters
.elements
[i
].name
,
179 sdef
->parameters
.elements
[i
].name
,
180 sdef
->parameters
.elements
[i
].name
);
183 src
= mputstr(src
, "}\n\n");
185 def
= mputprintf(def
, "inline void set_parameters(const %s_call&"
186 ") const { }\n", name
);
189 def
= mputstr(def
, "};\n\n");
190 /* end of class xxx_call_redirect */
193 if (!sdef
->is_noblock
) {
199 decl
= mputprintf(decl
, "class %s_reply;\n", name
);
201 /* class definition */
202 def
= mputprintf(def
, "class %s_reply {\n", name
);
204 /* signature's out and inout parameters */
205 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
206 if (sdef
->parameters
.elements
[i
].direction
!= PAR_IN
) {
207 def
= mputprintf(def
, "%s param_%s;\n",
208 sdef
->parameters
.elements
[i
].type
,
209 sdef
->parameters
.elements
[i
].name
);
212 if (sdef
->return_type
!= NULL
) {
213 def
= mputprintf(def
, "%s reply_value;\n", sdef
->return_type
);
216 def
= mputstr(def
, "public:\n");
218 /* parameters' access functions */
219 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
220 if (sdef
->parameters
.elements
[i
].direction
!= PAR_IN
) {
221 def
= mputprintf(def
, "inline %s& %s() { return param_%s; }\n"
222 "inline const %s& %s() const { return param_%s; }\n",
223 sdef
->parameters
.elements
[i
].type
,
224 sdef
->parameters
.elements
[i
].name
,
225 sdef
->parameters
.elements
[i
].name
,
226 sdef
->parameters
.elements
[i
].type
,
227 sdef
->parameters
.elements
[i
].name
,
228 sdef
->parameters
.elements
[i
].name
);
231 if (sdef
->return_type
!= NULL
) {
232 def
= mputprintf(def
, "inline %s& return_value() "
233 "{ return reply_value; }\n"
234 "inline const %s& return_value() const "
235 "{ return reply_value; }\n",
236 sdef
->return_type
, sdef
->return_type
);
239 if (num_out
> 0 || sdef
->return_type
!= NULL
) {
240 /* encode_text function */
241 def
= mputstr(def
, "void encode_text(Text_Buf& text_buf) const;\n");
242 src
= mputprintf(src
, "void %s_reply::encode_text(Text_Buf& "
245 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
246 if (sdef
->parameters
.elements
[i
].direction
!= PAR_IN
)
247 src
= mputprintf(src
, "param_%s.encode_text(text_buf);\n",
248 sdef
->parameters
.elements
[i
].name
);
250 if (sdef
->return_type
!= NULL
)
251 src
= mputstr(src
, "reply_value.encode_text(text_buf);\n");
252 src
= mputstr(src
, "}\n\n");
253 /* decode_text function */
254 def
= mputstr(def
, "void decode_text(Text_Buf& text_buf);\n");
255 src
= mputprintf(src
, "void %s_reply::decode_text(Text_Buf& "
258 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
259 if (sdef
->parameters
.elements
[i
].direction
!= PAR_IN
)
260 src
= mputprintf(src
, "param_%s.decode_text(text_buf);\n",
261 sdef
->parameters
.elements
[i
].name
);
263 if (sdef
->return_type
!= NULL
)
264 src
= mputstr(src
, "reply_value.decode_text(text_buf);\n");
265 src
= mputstr(src
, "}\n\n");
267 def
= mputstr(def
, "inline void encode_text(Text_Buf&) "
269 "inline void decode_text(Text_Buf&) { }\n");
273 def
= mputstr(def
, "void log() const;\n");
274 src
= mputprintf(src
, "void %s_reply::log() const\n"
277 boolean first_param
= TRUE
;
278 src
= mputprintf(src
, "TTCN_Logger::log_event_str(\"%s : { \");\n",
280 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
281 if (sdef
->parameters
.elements
[i
].direction
!= PAR_IN
) {
282 src
= mputstr(src
, "TTCN_Logger::log_event_str(\"");
283 if (first_param
) first_param
= FALSE
;
284 else src
= mputstr(src
, ", ");
285 src
= mputprintf(src
, "%s := \");\n"
287 sdef
->parameters
.elements
[i
].dispname
,
288 sdef
->parameters
.elements
[i
].name
);
291 if (sdef
->return_type
!= NULL
) {
292 src
= mputstr(src
, "TTCN_Logger::log_event_str(\" } "
294 "reply_value.log();\n");
296 src
= mputstr(src
, "TTCN_Logger::log_event_str(\" }\");\n");
298 } else if (sdef
->return_type
!= NULL
) {
299 src
= mputprintf(src
, "TTCN_Logger::log_event_str(\"%s : { } "
301 "reply_value.log();\n", dispname
);
303 src
= mputprintf(src
, "TTCN_Logger::log_event_str(\"%s : "
304 "{ }\");\n", dispname
);
306 src
= mputstr(src
, "}\n\n");
308 def
= mputstr(def
, "};\n\n");
309 /* end of xxx_reply class*/
313 * xxx_reply_redirect class (for getreply port-operation)
316 decl
= mputprintf(decl
, "class %s_reply_redirect;\n", name
);
318 /* class definition */
319 def
= mputprintf(def
, "class %s_reply_redirect {\n", name
);
321 /* parameter pointers */
322 if (sdef
->return_type
!= NULL
) {
323 def
= mputprintf(def
, "%s *ret_val_ptr;\n", sdef
->return_type
);
325 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
326 if (sdef
->parameters
.elements
[i
].direction
!= PAR_IN
) {
327 def
= mputprintf(def
, "%s *ptr_%s;\n",
328 sdef
->parameters
.elements
[i
].type
,
329 sdef
->parameters
.elements
[i
].name
);
333 def
= mputstr(def
, "public:\n");
335 if (num_out
> 0 || sdef
->return_type
!= NULL
) {
336 boolean first_param
= TRUE
;
338 def
= mputprintf(def
, "%s_reply_redirect(", name
);
339 if (sdef
->return_type
!= NULL
) {
340 def
= mputprintf(def
, "%s *return_ptr", sdef
->return_type
);
343 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
344 if(sdef
->parameters
.elements
[i
].direction
!= PAR_IN
) {
345 if (first_param
) first_param
= FALSE
;
346 else def
= mputstr(def
, ", ");
347 def
= mputprintf(def
, "%s *par_%s = NULL",
348 sdef
->parameters
.elements
[i
].type
,
349 sdef
->parameters
.elements
[i
].name
);
352 def
= mputstr(def
, ")\n"
355 if (sdef
->return_type
!= NULL
) {
356 def
= mputstr(def
, "ret_val_ptr(return_ptr)");
359 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
360 if(sdef
->parameters
.elements
[i
].direction
!= PAR_IN
) {
361 if (first_param
) first_param
= FALSE
;
362 else def
= mputstr(def
, ", ");
363 def
= mputprintf(def
, "ptr_%s(par_%s)",
364 sdef
->parameters
.elements
[i
].name
,
365 sdef
->parameters
.elements
[i
].name
);
368 def
= mputstr(def
, " { }\n");
370 /* otherwise constructor is not needed */
372 /* set_parameters function (used for param redirect in getreply) */
373 if ((sdef
->parameters
.nElements
- num_in
) > 0
374 || sdef
->return_type
!= NULL
) {
375 /* if there are "out" or "inout" parameters or a "return" ... */
376 def
= mputprintf(def
, "void set_parameters(const %s_reply& reply_par) "
378 src
= mputprintf(src
, "void %s_reply_redirect::set_parameters(const "
379 "%s_reply& reply_par) const\n"
381 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
382 if (sdef
->parameters
.elements
[i
].direction
!= PAR_IN
) {
383 src
= mputprintf(src
, "if (ptr_%s != NULL) "
384 "*ptr_%s = reply_par.%s();\n",
385 sdef
->parameters
.elements
[i
].name
,
386 sdef
->parameters
.elements
[i
].name
,
387 sdef
->parameters
.elements
[i
].name
);
390 if (sdef
->return_type
!=NULL
) {
391 src
= mputstr(src
, "if (ret_val_ptr != NULL) "
392 "*ret_val_ptr = reply_par.return_value();\n");
394 src
= mputstr(src
, "}\n\n");
397 def
= mputprintf(def
, "inline void set_parameters(const %s_reply&) "
401 def
= mputstr(def
, "};\n\n");
402 /* end of class xxx_reply_redirect */
403 } /* if (!sdeff->is_noblock) */
406 if (sdef
->exceptions
.nElements
> 0) {
407 char *selection_type
, *unbound_value
, *selection_prefix
;
409 selection_type
= mcopystr("exception_selection_type");
410 unbound_value
= mcopystr("UNBOUND_VALUE");
411 selection_prefix
= mcopystr("ALT");
415 * xxx_exception class
418 decl
= mputprintf(decl
, "class %s_exception;\n", name
);
419 /* class definition */
420 def
= mputprintf(def
, "class %s_exception {\n", name
);
423 def
= mputstr(def
, "public:\n"
424 "enum exception_selection_type { ");
425 for (i
= 0; i
< sdef
->exceptions
.nElements
; i
++) {
426 def
= mputprintf(def
, "ALT_%s = %lu, ",
427 sdef
->exceptions
.elements
[i
].altname
, (unsigned long) i
);
429 def
= mputprintf(def
, " UNBOUND_VALUE = %lu };\n"
430 "private:\n", (unsigned long) sdef
->exceptions
.nElements
);
433 def
= mputprintf(def
, "%s exception_selection;\n"
434 "union {\n", selection_type
);
435 for (i
= 0; i
< sdef
->exceptions
.nElements
; i
++) {
436 def
= mputprintf(def
, "%s *field_%s;\n",
437 sdef
->exceptions
.elements
[i
].name
,
438 sdef
->exceptions
.elements
[i
].altname
);
440 def
= mputstr(def
, "};\n");
442 /* clean_up function */
443 def
= mputstr(def
, "void clean_up();\n");
444 src
= mputprintf(src
, "void %s_exception::clean_up()\n"
446 "switch (exception_selection) {\n", name
);
447 for (i
= 0; i
< sdef
->exceptions
.nElements
; i
++) {
448 src
= mputprintf(src
, "case %s_%s:\n"
449 "delete field_%s;\n", selection_prefix
,
450 sdef
->exceptions
.elements
[i
].altname
,
451 sdef
->exceptions
.elements
[i
].altname
);
452 if (i
< sdef
->exceptions
.nElements
- 1)
453 src
= mputstr(src
, "break;\n");
455 src
= mputprintf(src
, "default:\n"
458 "exception_selection = %s;\n"
459 "}\n\n", unbound_value
);
461 /* copy_value function */
462 def
= mputprintf(def
, "void copy_value(const %s_exception& "
463 "other_value);\n", name
);
464 src
= mputprintf(src
, "void %s_exception::copy_value(const "
465 "%s_exception& other_value)\n"
467 "switch (other_value.exception_selection) {\n", name
, name
);
468 for (i
= 0; i
< sdef
->exceptions
.nElements
; i
++) {
469 src
= mputprintf(src
, "case %s_%s:\n"
470 "field_%s = new %s(*other_value.field_%s);\n"
471 "break;\n", selection_prefix
,
472 sdef
->exceptions
.elements
[i
].altname
,
473 sdef
->exceptions
.elements
[i
].altname
,
474 sdef
->exceptions
.elements
[i
].name
,
475 sdef
->exceptions
.elements
[i
].altname
);
477 src
= mputprintf(src
, "default:\n"
478 "TTCN_error(\"Copying an uninitialized exception of signature "
481 "exception_selection = other_value.exception_selection;\n"
484 /* default constructor */
485 def
= mputprintf(def
, "public:\n"
486 "%s_exception() : exception_selection(%s) { }\n", name
,
489 /* copy constructor */
490 def
= mputprintf(def
, "%s_exception(const %s_exception& "
491 "other_value) { copy_value(other_value); }\n", name
, name
);
493 /* constructors (from exception types) */
494 for (i
= 0; i
< sdef
->exceptions
.nElements
; i
++) {
495 def
= mputprintf(def
, "%s_exception(const %s& other_value);\n",
496 name
, sdef
->exceptions
.elements
[i
].name
);
497 src
= mputprintf(src
, "%s_exception::%s_exception(const "
500 "field_%s = new %s(other_value);\n"
501 "exception_selection = %s_%s;\n"
502 "}\n\n", name
, name
, sdef
->exceptions
.elements
[i
].name
,
503 sdef
->exceptions
.elements
[i
].altname
,
504 sdef
->exceptions
.elements
[i
].name
, selection_prefix
,
505 sdef
->exceptions
.elements
[i
].altname
);
506 def
= mputprintf(def
, "%s_exception(const %s_template& "
507 "other_value);\n", name
, sdef
->exceptions
.elements
[i
].name
);
508 src
= mputprintf(src
, "%s_exception::%s_exception(const "
509 "%s_template& other_value)\n"
511 "field_%s = new %s(other_value.valueof());\n"
512 "exception_selection = %s_%s;\n"
513 "}\n\n", name
, name
, sdef
->exceptions
.elements
[i
].name
,
514 sdef
->exceptions
.elements
[i
].altname
,
515 sdef
->exceptions
.elements
[i
].name
, selection_prefix
,
516 sdef
->exceptions
.elements
[i
].altname
);
520 def
= mputprintf(def
, "~%s_exception() { clean_up(); }\n", name
);
522 /* assignment operator */
523 def
= mputprintf(def
, "%s_exception& operator=(const %s_exception& "
524 "other_value);\n", name
, name
);
525 src
= mputprintf(src
, "%s_exception& %s_exception::operator=(const "
526 "%s_exception& other_value)\n"
528 "if (this != &other_value) {\n"
530 "copy_value(other_value);\n"
533 "}\n\n", name
, name
, name
);
535 /* field (type) access functions */
536 for (i
= 0; i
< sdef
->exceptions
.nElements
; i
++) {
537 def
= mputprintf(def
, "%s& %s_field();\n",
538 sdef
->exceptions
.elements
[i
].name
,
539 sdef
->exceptions
.elements
[i
].altname
);
540 src
= mputprintf(src
, "%s& %s_exception::%s_field()\n"
542 "if (exception_selection != %s_%s) {\n"
544 "field_%s = new %s;\n"
545 "exception_selection = %s_%s;\n"
547 "return *field_%s;\n"
548 "}\n\n", sdef
->exceptions
.elements
[i
].name
, name
,
549 sdef
->exceptions
.elements
[i
].altname
, selection_prefix
,
550 sdef
->exceptions
.elements
[i
].altname
,
551 sdef
->exceptions
.elements
[i
].altname
,
552 sdef
->exceptions
.elements
[i
].name
,
553 selection_prefix
, sdef
->exceptions
.elements
[i
].altname
,
554 sdef
->exceptions
.elements
[i
].altname
);
555 def
= mputprintf(def
, "const %s& %s_field() const;\n",
556 sdef
->exceptions
.elements
[i
].name
,
557 sdef
->exceptions
.elements
[i
].altname
);
558 src
= mputprintf(src
, "const %s& %s_exception::%s_field() const\n"
560 "if (exception_selection != %s_%s) "
561 "TTCN_error(\"Referencing to non-selected type %s in an "
562 "exception of signature %s.\");\n"
563 "return *field_%s;\n"
564 "}\n\n", sdef
->exceptions
.elements
[i
].name
, name
,
565 sdef
->exceptions
.elements
[i
].altname
, selection_prefix
,
566 sdef
->exceptions
.elements
[i
].altname
,
567 sdef
->exceptions
.elements
[i
].dispname
, dispname
,
568 sdef
->exceptions
.elements
[i
].altname
);
571 /* get_selection function */
572 def
= mputprintf(def
, "inline %s get_selection() const "
573 "{ return exception_selection; }\n", selection_type
);
575 /* encode_text function */
576 def
= mputstr(def
, "void encode_text(Text_Buf& text_buf) const;\n");
577 src
= mputprintf(src
, "void %s_exception::encode_text(Text_Buf& "
580 "text_buf.push_int(exception_selection);\n"
581 "switch (exception_selection) {\n", name
);
582 for (i
= 0; i
< sdef
->exceptions
.nElements
; i
++) {
583 src
= mputprintf(src
, "case %s_%s:\n"
584 "field_%s->encode_text(text_buf);\n"
585 "break;\n", selection_prefix
,
586 sdef
->exceptions
.elements
[i
].altname
,
587 sdef
->exceptions
.elements
[i
].altname
);
589 src
= mputprintf(src
, "default:\n"
590 "TTCN_error(\"Text encoder: Encoding an uninitialized exception "
591 "of signature %s.\");\n"
595 /* decode_text function */
596 def
= mputstr(def
, "void decode_text(Text_Buf& text_buf);\n");
597 src
= mputprintf(src
, "void %s_exception::decode_text(Text_Buf& "
600 "switch ((%s)text_buf.pull_int().get_val()) {\n", name
, selection_type
);
601 for (i
= 0; i
< sdef
->exceptions
.nElements
; i
++) {
602 src
= mputprintf(src
, "case %s_%s:\n"
603 "%s_field().decode_text(text_buf);\n"
604 "break;\n", selection_prefix
,
605 sdef
->exceptions
.elements
[i
].altname
,
606 sdef
->exceptions
.elements
[i
].altname
);
608 src
= mputprintf(src
, "default:\n"
609 "TTCN_error(\"Text decoder: Unrecognized selector was received "
610 "for an exception of signature %s.\");\n"
615 def
= mputstr(def
, "void log() const;\n");
616 src
= mputprintf(src
, "void %s_exception::log() const\n"
618 "TTCN_Logger::log_event_str(\"%s, \");\n"
619 "switch (exception_selection) {\n",
621 for (i
= 0; i
< sdef
->exceptions
.nElements
; i
++) {
622 src
= mputprintf(src
, "case %s_%s:\n"
623 "TTCN_Logger::log_event_str(\"%s : \");\n"
625 "break;\n", selection_prefix
,
626 sdef
->exceptions
.elements
[i
].altname
,
627 sdef
->exceptions
.elements
[i
].dispname
,
628 sdef
->exceptions
.elements
[i
].altname
);
630 src
= mputstr(src
, "default:\n"
631 "TTCN_Logger::log_event_str(\"<uninitialized exception>\");\n"
635 def
= mputstr(def
, "};\n\n");
636 /* end of xxx_exception class*/
638 Free(selection_type
);
639 selection_type
= mprintf("%s_exception::exception_selection_type", name
);
641 unbound_value
= mprintf("%s_exception::UNBOUND_VALUE", name
);
642 Free(selection_prefix
);
643 selection_prefix
= mprintf("%s_exception::ALT", name
);
647 * simple xxx_exception_template for the catch port-operator
648 * only with constructors, a log/match function and value redirect
651 decl
= mputprintf(decl
, "class %s_exception_template;\n", name
);
653 def
= mputprintf(def
, "class %s_exception_template {\n", name
);
656 /* exception-selection enum */
657 def
= mputprintf(def
, "%s exception_selection;\n", selection_type
);
658 /* union of all possible exceptions (templates) */
659 def
= mputstr(def
, "union {\n");
660 for (i
= 0; i
< sdef
->exceptions
.nElements
; i
++) {
661 def
= mputprintf(def
, "const %s_template *field_%s;\n",
662 sdef
->exceptions
.elements
[i
].name
,
663 sdef
->exceptions
.elements
[i
].altname
);
665 def
= mputstr(def
, "};\n");
666 /* union of all possible value redirect pointers */
667 def
= mputstr(def
, "union {\n");
668 for (i
= 0; i
< sdef
->exceptions
.nElements
; i
++) {
669 def
= mputprintf(def
, "%s *ptr_%s;\n",
670 sdef
->exceptions
.elements
[i
].name
,
671 sdef
->exceptions
.elements
[i
].altname
);
673 def
= mputstr(def
, "};\n"
675 /* constructors (for all possible template + redirect pointer pairs) */
676 for (i
= 0; i
< sdef
->exceptions
.nElements
; i
++) {
677 def
= mputprintf(def
, "%s_exception_template(const %s_template& "
678 "init_template, %s *value_ptr = NULL);\n", name
,
679 sdef
->exceptions
.elements
[i
].name
,
680 sdef
->exceptions
.elements
[i
].name
);
681 src
= mputprintf(src
, "%s_exception_template::%s_exception_template"
682 "(const %s_template& init_template, %s *value_ptr)\n"
684 "exception_selection = %s_%s;\n"
685 "field_%s = &init_template;\n"
686 "ptr_%s = value_ptr;\n"
687 "}\n\n", name
, name
, sdef
->exceptions
.elements
[i
].name
,
688 sdef
->exceptions
.elements
[i
].name
, selection_prefix
,
689 sdef
->exceptions
.elements
[i
].altname
,
690 sdef
->exceptions
.elements
[i
].altname
,
691 sdef
->exceptions
.elements
[i
].altname
);
695 def
= mputprintf(def
, "boolean match(const %s_exception& other_value) "
697 src
= mputprintf(src
, "boolean %s_exception_template::match(const "
698 "%s_exception& other_value) const\n"
700 "if (exception_selection != other_value.get_selection()) "
702 "switch (exception_selection) {\n", name
, name
);
703 for (i
= 0; i
< sdef
->exceptions
.nElements
; i
++) {
704 src
= mputprintf(src
, "case %s_%s:\n"
705 "return field_%s->match(other_value.%s_field());\n",
706 selection_prefix
, sdef
->exceptions
.elements
[i
].altname
,
707 sdef
->exceptions
.elements
[i
].altname
,
708 sdef
->exceptions
.elements
[i
].altname
);
710 src
= mputprintf(src
, "default:\n"
711 "TTCN_error(\"Internal error: Invalid selector when matching an "
712 "exception of signature %s.\");\n"
717 /* log_match function */
718 def
= mputprintf(def
, "void log_match(const %s_exception& other_value) "
720 src
= mputprintf(src
, "void %s_exception_template::log_match(const "
721 "%s_exception& other_value) const\n"
723 "TTCN_Logger::log_event_str(\"%s, \");\n"
724 "if (exception_selection == other_value.get_selection()) {\n"
725 "switch (exception_selection) {\n", name
, name
, dispname
);
726 for (i
= 0; i
< sdef
->exceptions
.nElements
; i
++) {
727 src
= mputprintf(src
, "case %s_%s:\n"
728 "TTCN_Logger::log_event_str(\"%s : \");\n"
729 "field_%s->log_match(other_value.%s_field());\n"
730 "break;\n", selection_prefix
,
731 sdef
->exceptions
.elements
[i
].altname
,
732 sdef
->exceptions
.elements
[i
].dispname
,
733 sdef
->exceptions
.elements
[i
].altname
,
734 sdef
->exceptions
.elements
[i
].altname
);
736 src
= mputstr(src
, "default:\n"
737 "TTCN_Logger::log_event_str(\"<invalid selector>\");\n"
740 "other_value.log();\n"
741 "TTCN_Logger::log_event_str(\" with \");\n"
742 "switch (exception_selection) {\n");
743 for (i
= 0; i
< sdef
->exceptions
.nElements
; i
++) {
744 src
= mputprintf(src
, "case %s_%s:\n"
745 "TTCN_Logger::log_event_str(\"%s : \");\n"
747 "break;\n", selection_prefix
,
748 sdef
->exceptions
.elements
[i
].altname
,
749 sdef
->exceptions
.elements
[i
].dispname
,
750 sdef
->exceptions
.elements
[i
].altname
);
752 src
= mputstr(src
, "default:\n"
753 "TTCN_Logger::log_event_str(\"<invalid selector>\");\n"
755 "if (match(other_value)) "
756 "TTCN_Logger::log_event_str(\" matched\");\n"
757 "else TTCN_Logger::log_event_str(\" unmatched\");\n"
761 /* set_value function */
762 def
= mputprintf(def
, "void set_value(const %s_exception& "
763 "source_value) const;\n", name
);
764 src
= mputprintf(src
, "void %s_exception_template::set_value(const "
765 "%s_exception& source_value) const\n"
767 "if (exception_selection == source_value.get_selection()) {\n"
768 "switch (exception_selection) {\n", name
, name
);
769 for (i
= 0; i
< sdef
->exceptions
.nElements
; i
++) {
770 src
= mputprintf(src
, "case %s_%s:\n"
771 "if (ptr_%s != NULL) *ptr_%s = source_value.%s_field();\n"
772 "return;\n", selection_prefix
,
773 sdef
->exceptions
.elements
[i
].altname
,
774 sdef
->exceptions
.elements
[i
].altname
,
775 sdef
->exceptions
.elements
[i
].altname
,
776 sdef
->exceptions
.elements
[i
].altname
);
778 src
= mputprintf(src
, "default:\n"
782 "TTCN_error(\"Internal error: Invalid selector when performing "
783 "value redirect on an exception of signature %s.\");\n"
786 def
= mputstr(def
, "};\n\n");
787 /* end of class xxx_exception_template */
789 Free(selection_type
);
791 Free(selection_prefix
);
792 } /* if (sdef->exceptions.nElements > 0) */
798 decl
= mputprintf(decl
, "class %s_template;\n", name
);
800 def
= mputprintf(def
, "class %s_template {\n", name
);
803 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
804 def
= mputprintf(def
, "%s_template param_%s;\n",
805 sdef
->parameters
.elements
[i
].type
,
806 sdef
->parameters
.elements
[i
].name
);
808 if (sdef
->return_type
!= NULL
) {
809 def
= mputprintf(def
, "mutable %s_template reply_value;\n",
813 def
= mputstr(def
, "public:\n");
815 if (sdef
->parameters
.nElements
> 0 || sdef
->return_type
!= NULL
) {
816 boolean first_param
= TRUE
;
817 def
= mputprintf(def
, "%s_template();\n", name
);
818 src
= mputprintf(src
, "%s_template::%s_template()\n"
820 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
821 if (first_param
) first_param
= FALSE
;
822 else src
= mputstr(src
, ", ");
823 src
= mputprintf(src
, "param_%s(ANY_VALUE)",
824 sdef
->parameters
.elements
[i
].name
);
826 if (sdef
->return_type
!= NULL
) {
827 if (first_param
) /*first_param = FALSE*/;
828 else src
= mputstr(src
, ", ");
829 src
= mputstr(src
, "reply_value(ANY_VALUE)");
831 src
= mputstr(src
, "\n"
835 def
= mputprintf(def
, "%s_template() { }\n", name
);
838 if (sdef
->parameters
.nElements
== 0) {
839 /* constructor and assignment operator for parameter-less signatures */
840 if (sdef
->return_type
!= NULL
) {
841 def
= mputprintf(def
, "%s_template(null_type null_value);\n",
843 src
= mputprintf(src
,
844 "%s_template::%s_template(null_type)\n"
845 " : reply_value(ANY_VALUE)\n"
847 "}\n\n", name
, name
);
849 def
= mputprintf(def
, "%s_template(null_type) { }\n",
852 def
= mputprintf(def
, "inline %s_template& operator=(null_type)"
853 " { return *this; }\n", name
);
856 /* parameter access functions */
857 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
858 def
= mputprintf(def
, "inline %s_template& %s() { return param_%s; }\n"
859 "inline const %s_template& %s() const { return param_%s; }\n",
860 sdef
->parameters
.elements
[i
].type
,
861 sdef
->parameters
.elements
[i
].name
,
862 sdef
->parameters
.elements
[i
].name
,
863 sdef
->parameters
.elements
[i
].type
,
864 sdef
->parameters
.elements
[i
].name
,
865 sdef
->parameters
.elements
[i
].name
);
867 if (sdef
->return_type
!= NULL
) {
868 def
= mputprintf(def
, "inline %s_template& return_value() const "
869 "{ return reply_value; }\n", sdef
->return_type
);
872 /* create_call function for creating xxx_call signature-value */
874 def
= mputprintf(def
, "%s_call create_call() const;\n", name
);
875 src
= mputprintf(src
, "%s_call %s_template::create_call() const\n"
877 "%s_call ret_val;\n", name
, name
, name
);
878 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
879 if (sdef
->parameters
.elements
[i
].direction
!= PAR_OUT
) {
880 src
= mputprintf(src
, "ret_val.%s() = param_%s.valueof();\n",
881 sdef
->parameters
.elements
[i
].name
,
882 sdef
->parameters
.elements
[i
].name
);
885 src
= mputstr(src
, "return ret_val;\n"
888 def
= mputprintf(def
, "inline %s_call create_call() const "
889 "{ return %s_call(); }\n", name
, name
);
892 if (!sdef
->is_noblock
) {
893 /* create_reply function for creating xxx_reply signature-value */
894 if (num_out
> 0 || sdef
->return_type
!= NULL
) {
895 def
= mputprintf(def
, "%s_reply create_reply() const;\n", name
);
896 src
= mputprintf(src
, "%s_reply %s_template::create_reply() const\n"
898 "%s_reply ret_val;\n", name
, name
, name
);
899 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
900 if (sdef
->parameters
.elements
[i
].direction
!= PAR_IN
) {
901 src
= mputprintf(src
, "ret_val.%s() = "
902 "param_%s.valueof();\n",
903 sdef
->parameters
.elements
[i
].name
,
904 sdef
->parameters
.elements
[i
].name
);
907 if (sdef
->return_type
!= NULL
) {
908 src
= mputstr(src
, "ret_val.return_value() = "
909 "reply_value.valueof();\n");
911 src
= mputstr(src
, "return ret_val;\n"
914 def
= mputprintf(def
, "inline %s_reply create_reply() const "
915 "{ return %s_reply(); }\n", name
, name
);
919 /* match_call function for matching with xxx_call signature-value */
921 boolean first_param
= TRUE
;
922 def
= mputprintf(def
, "boolean match_call(const %s_call& match_value) "
924 src
= mputprintf(src
, "boolean %s_template::match_call(const %s_call& "
925 "match_value) const\n"
927 "return ", name
, name
);
928 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
929 if (sdef
->parameters
.elements
[i
].direction
!= PAR_OUT
) {
930 if (first_param
) first_param
= FALSE
;
931 else src
= mputstr(src
, " &&\n");
932 src
= mputprintf(src
, "param_%s.match(match_value.%s())",
933 sdef
->parameters
.elements
[i
].name
,
934 sdef
->parameters
.elements
[i
].name
);
937 src
= mputstr(src
, ";\n"
940 def
= mputprintf(def
, "inline boolean match_call(const %s_call&"
941 ") const { return TRUE; }\n", name
);
944 if (!sdef
->is_noblock
) {
945 if (num_out
> 0 || sdef
->return_type
!= NULL
) {
946 boolean first_param
= TRUE
;
947 /* match_reply function for matching with xxx_reply value */
948 def
= mputprintf(def
, "boolean match_reply(const %s_reply& "
949 "match_value) const;\n", name
);
950 src
= mputprintf(src
, "boolean %s_template::match_reply(const "
951 "%s_reply& match_value) const\n"
953 "return ", name
, name
);
954 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
955 if(sdef
->parameters
.elements
[i
].direction
!= PAR_IN
) {
956 if (first_param
) first_param
= FALSE
;
957 else src
= mputstr(src
, " &&\n");
958 src
= mputprintf(src
, "param_%s.match(match_value.%s())",
959 sdef
->parameters
.elements
[i
].name
,
960 sdef
->parameters
.elements
[i
].name
);
963 if (sdef
->return_type
!= NULL
) {
964 if (first_param
) /*first_param = FALSE*/;
965 else src
= mputstr(src
, " &&\n");
967 "reply_value.match(match_value.return_value())");
969 src
= mputstr(src
, ";\n"
972 def
= mputprintf(def
, "inline boolean match_reply(const %s_reply&"
973 ") const { return TRUE; }\n", name
);
977 /* set_value_template function */
978 if (sdef
->return_type
!= NULL
) {
979 def
= mputprintf(def
, "const %s_template& set_value_template(const "
980 "%s_template& new_template) const;\n", name
, sdef
->return_type
);
981 src
= mputprintf(src
,
982 "const %s_template& %s_template::set_value_template"
983 "(const %s_template& new_template) const\n"
985 "reply_value = new_template;\n"
987 "}\n\n", name
, name
, sdef
->return_type
);
991 def
= mputstr(def
, "void log() const;\n");
992 src
= mputprintf(src
, "void %s_template::log() const\n"
994 if (sdef
->parameters
.nElements
>= 1) {
995 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
996 src
= mputstr(src
, "TTCN_Logger::log_event_str(\"");
997 if (i
== 0) src
= mputc(src
, '{');
998 else src
= mputc(src
, ',');
999 src
= mputprintf(src
, " %s := \");\n"
1000 "param_%s.log();\n", sdef
->parameters
.elements
[i
].dispname
,
1001 sdef
->parameters
.elements
[i
].name
);
1003 src
= mputstr(src
, "TTCN_Logger::log_event_str(\" }\");\n");
1005 src
= mputstr(src
, "TTCN_Logger::log_event_str(\"{ }\");\n");
1007 src
= mputstr(src
, "}\n\n");
1009 /* log_match_call function */
1010 def
= mputprintf(def
, "void log_match_call(const %s_call& match_value) "
1012 src
= mputprintf(src
, "void %s_template::log_match_call(const %s_call& "
1015 boolean first_param
= TRUE
;
1016 src
= mputstr(src
, "match_value) const\n{\n");
1017 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
1018 if (sdef
->parameters
.elements
[i
].direction
!= PAR_OUT
) {
1019 src
= mputstr(src
, "TTCN_Logger::log_event_str(\"");
1021 src
= mputc(src
, '{');
1022 first_param
= FALSE
;
1023 } else src
= mputc(src
, ',');
1024 src
= mputprintf(src
, " %s := \");\n"
1025 "param_%s.log_match(match_value.%s());\n",
1026 sdef
->parameters
.elements
[i
].dispname
,
1027 sdef
->parameters
.elements
[i
].name
,
1028 sdef
->parameters
.elements
[i
].name
);
1031 src
= mputstr(src
, "TTCN_Logger::log_event_str(\" }\");\n");
1033 src
= mputstr(src
, ") const\n{\n"
1034 "TTCN_Logger::log_event_str(\"{ } with { } matched\");\n");
1036 src
= mputstr(src
, "}\n\n");
1038 if (!sdef
->is_noblock
) {
1039 /* log_match_reply function */
1040 def
= mputprintf(def
, "void log_match_reply(const %s_reply& match_value) "
1042 src
= mputprintf(src
, "void %s_template::log_match_reply(const %s_reply& "
1045 boolean first_param
= TRUE
;
1046 src
= mputstr(src
, "match_value) const\n{\n");
1047 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
1048 if (sdef
->parameters
.elements
[i
].direction
!= PAR_IN
) {
1049 src
= mputstr(src
, "TTCN_Logger::log_event_str(\"");
1051 src
= mputc(src
, '{');
1052 first_param
= FALSE
;
1053 } else src
= mputc(src
, ',');
1054 src
= mputprintf(src
, " %s := \");\n"
1055 "param_%s.log_match(match_value.%s());\n",
1056 sdef
->parameters
.elements
[i
].dispname
,
1057 sdef
->parameters
.elements
[i
].name
,
1058 sdef
->parameters
.elements
[i
].name
);
1061 if (sdef
->return_type
!= NULL
) {
1062 src
= mputstr(src
, "TTCN_Logger::log_event_str(\" } value "
1064 "reply_value.log_match(match_value.return_value());\n");
1066 src
= mputstr(src
, "TTCN_Logger::log_event_str(\" }\");\n");
1069 if (sdef
->return_type
!= NULL
) {
1070 src
= mputstr(src
, "match_value) const\n{\n"
1071 "TTCN_Logger::log_event_str(\"{ } with { } "
1072 "matched value \");\n"
1073 "reply_value.log_match(match_value.return_value());\n");
1075 src
= mputstr(src
, ") const\n{\n"
1076 "TTCN_Logger::log_event_str(\"{ } with { } "
1080 src
= mputstr(src
, "}\n\n");
1083 if (sdef
->parameters
.nElements
> 0) {
1084 /* encode_text function */
1085 def
= mputstr(def
, "void encode_text(Text_Buf& text_buf) const;\n");
1086 src
= mputprintf(src
, "void %s_template::encode_text(Text_Buf& "
1089 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
1090 src
= mputprintf(src
, "param_%s.encode_text(text_buf);\n",
1091 sdef
->parameters
.elements
[i
].name
);
1093 src
= mputstr(src
, "}\n\n");
1094 /* decode_text function */
1095 def
= mputstr(def
, "void decode_text(Text_Buf& text_buf);\n");
1096 src
= mputprintf(src
, "void %s_template::decode_text(Text_Buf& "
1099 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
1100 src
= mputprintf(src
, "param_%s.decode_text(text_buf);\n",
1101 sdef
->parameters
.elements
[i
].name
);
1103 src
= mputstr(src
, "}\n\n");
1105 def
= mputstr(def
, "inline void encode_text(Text_Buf&) const "
1107 "inline void decode_text(Text_Buf&) { }\n");
1110 /* end of template definition */
1111 def
= mputstr(def
, "};\n\n");
1113 output
->header
.class_decls
= mputstr(output
->header
.class_decls
, decl
);
1116 output
->header
.class_defs
= mputstr(output
->header
.class_defs
, def
);
1119 output
->source
.methods
= mputstr(output
->source
.methods
, src
);
This page took 0.059137 seconds and 5 git commands to generate.