1 /******************************************************************************
2 * Copyright (c) 2000-2016 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
15 * Szabo, Janos Zoltan – initial implementation
19 ******************************************************************************/
20 #include "../../common/memory.h"
21 #include "signature.h"
22 #include "../datatypes.h"
26 void defSignatureClasses(const signature_def
*sdef
, output_struct
*output
)
28 char *decl
= NULL
, *def
= NULL
, *src
= NULL
;
29 const char *name
= sdef
->name
, *dispname
= sdef
->dispname
;
30 size_t i
, num_in
= 0, num_out
= 0;
32 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
33 if (sdef
->parameters
.elements
[i
].direction
!= PAR_OUT
) num_in
++;
34 if (sdef
->parameters
.elements
[i
].direction
!= PAR_IN
) num_out
++;
43 decl
= mputprintf(decl
, "class %s_call;\n", name
);
45 /* class definition */
46 def
= mputprintf(def
, "class %s_call {\n", name
);
48 /* signature's in and inout parameters */
49 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
50 if (sdef
->parameters
.elements
[i
].direction
!= PAR_OUT
)
51 def
= mputprintf(def
, "%s param_%s;\n",
52 sdef
->parameters
.elements
[i
].type
,
53 sdef
->parameters
.elements
[i
].name
);
56 def
= mputstr(def
, "public:\n");
58 /* parameters' access functions */
59 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
60 if (sdef
->parameters
.elements
[i
].direction
!= PAR_OUT
) {
61 def
= mputprintf(def
, "inline %s& %s() { return param_%s; }\n"
62 "inline const %s& %s() const { return param_%s; }\n",
63 sdef
->parameters
.elements
[i
].type
,
64 sdef
->parameters
.elements
[i
].name
,
65 sdef
->parameters
.elements
[i
].name
,
66 sdef
->parameters
.elements
[i
].type
,
67 sdef
->parameters
.elements
[i
].name
,
68 sdef
->parameters
.elements
[i
].name
);
73 /* encode_text function */
74 def
= mputstr(def
, "void encode_text(Text_Buf& text_buf) const;\n");
75 src
= mputprintf(src
, "void %s_call::encode_text(Text_Buf& text_buf) "
78 for(i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
79 if(sdef
->parameters
.elements
[i
].direction
!= PAR_OUT
)
80 src
= mputprintf(src
, "param_%s.encode_text(text_buf);\n",
81 sdef
->parameters
.elements
[i
].name
);
83 src
= mputstr(src
, "}\n\n");
84 /* decode_text function */
85 def
= mputstr(def
, "void decode_text(Text_Buf& text_buf);\n");
86 src
= mputprintf(src
, "void %s_call::decode_text(Text_Buf& text_buf)\n"
88 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
89 if (sdef
->parameters
.elements
[i
].direction
!= PAR_OUT
)
90 src
= mputprintf(src
, "param_%s.decode_text(text_buf);\n",
91 sdef
->parameters
.elements
[i
].name
);
93 src
= mputstr(src
, "}\n\n");
95 def
= mputstr(def
, "inline void encode_text(Text_Buf&) const "
97 "inline void decode_text(Text_Buf&) { }\n");
101 def
= mputstr(def
, "void log() const;\n");
102 src
= mputprintf(src
, "void %s_call::log() const\n"
105 boolean first_param
= TRUE
;
106 src
= mputprintf(src
, "TTCN_Logger::log_event_str(\"%s : { \");\n",
108 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
109 if (sdef
->parameters
.elements
[i
].direction
!= PAR_OUT
) {
110 src
= mputstr(src
, "TTCN_Logger::log_event_str(\"");
111 if (first_param
) first_param
= FALSE
;
112 else src
= mputstr(src
, ", ");
113 src
= mputprintf(src
, "%s := \");\n"
115 sdef
->parameters
.elements
[i
].dispname
,
116 sdef
->parameters
.elements
[i
].name
);
119 src
= mputstr(src
, "TTCN_Logger::log_event_str(\" }\");\n");
121 src
= mputprintf(src
, "TTCN_Logger::log_event_str(\"%s : { }\");\n",
124 src
= mputstr(src
, "}\n\n");
126 def
= mputstr(def
, "};\n\n");
127 /* end of xxx_call class*/
131 * xxx_call_redirect class (for getcall port-operation)
134 decl
= mputprintf(decl
, "class %s_call_redirect;\n", name
);
136 /* class definition */
137 def
= mputprintf(def
, "class %s_call_redirect {\n", name
);
139 /* parameter pointers */
140 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
141 if (sdef
->parameters
.elements
[i
].direction
!= PAR_OUT
) {
142 def
= mputprintf(def
, "%s *ptr_%s;\n",
143 sdef
->parameters
.elements
[i
].type
,
144 sdef
->parameters
.elements
[i
].name
);
148 def
= mputstr(def
, "public:\n");
152 boolean first_param
= TRUE
;
153 def
= mputprintf(def
, "%s_call_redirect(", name
);
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
, "%s *par_%s = NULL",
159 sdef
->parameters
.elements
[i
].type
,
160 sdef
->parameters
.elements
[i
].name
);
163 def
= mputstr(def
, ")\n"
166 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
167 if (sdef
->parameters
.elements
[i
].direction
!= PAR_OUT
) {
168 if (first_param
) first_param
= FALSE
;
169 else def
= mputstr(def
, ", ");
170 def
= mputprintf(def
, "ptr_%s(par_%s)",
171 sdef
->parameters
.elements
[i
].name
,
172 sdef
->parameters
.elements
[i
].name
);
175 def
= mputstr(def
, " { }\n");
177 /* otherwise constructor is not needed */
179 /* set_parameters function (used for param redirect in getcall) */
181 def
= mputprintf(def
, "void set_parameters(const %s_call& call_par) "
183 src
= mputprintf(src
, "void %s_call_redirect::set_parameters(const "
184 "%s_call& call_par) const\n"
186 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
187 if (sdef
->parameters
.elements
[i
].direction
!= PAR_OUT
) {
188 src
= mputprintf(src
, "if (ptr_%s != NULL) "
189 "*ptr_%s = call_par.%s();\n",
190 sdef
->parameters
.elements
[i
].name
,
191 sdef
->parameters
.elements
[i
].name
,
192 sdef
->parameters
.elements
[i
].name
);
195 src
= mputstr(src
, "}\n\n");
197 def
= mputprintf(def
, "inline void set_parameters(const %s_call&"
198 ") const { }\n", name
);
201 def
= mputstr(def
, "};\n\n");
202 /* end of class xxx_call_redirect */
205 if (!sdef
->is_noblock
) {
211 decl
= mputprintf(decl
, "class %s_reply;\n", name
);
213 /* class definition */
214 def
= mputprintf(def
, "class %s_reply {\n", name
);
216 /* signature's out and inout parameters */
217 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
218 if (sdef
->parameters
.elements
[i
].direction
!= PAR_IN
) {
219 def
= mputprintf(def
, "%s param_%s;\n",
220 sdef
->parameters
.elements
[i
].type
,
221 sdef
->parameters
.elements
[i
].name
);
224 if (sdef
->return_type
!= NULL
) {
225 def
= mputprintf(def
, "%s reply_value;\n", sdef
->return_type
);
228 def
= mputstr(def
, "public:\n");
230 /* parameters' access functions */
231 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
232 if (sdef
->parameters
.elements
[i
].direction
!= PAR_IN
) {
233 def
= mputprintf(def
, "inline %s& %s() { return param_%s; }\n"
234 "inline const %s& %s() const { return param_%s; }\n",
235 sdef
->parameters
.elements
[i
].type
,
236 sdef
->parameters
.elements
[i
].name
,
237 sdef
->parameters
.elements
[i
].name
,
238 sdef
->parameters
.elements
[i
].type
,
239 sdef
->parameters
.elements
[i
].name
,
240 sdef
->parameters
.elements
[i
].name
);
243 if (sdef
->return_type
!= NULL
) {
244 def
= mputprintf(def
, "inline %s& return_value() "
245 "{ return reply_value; }\n"
246 "inline const %s& return_value() const "
247 "{ return reply_value; }\n",
248 sdef
->return_type
, sdef
->return_type
);
251 if (num_out
> 0 || sdef
->return_type
!= NULL
) {
252 /* encode_text function */
253 def
= mputstr(def
, "void encode_text(Text_Buf& text_buf) const;\n");
254 src
= mputprintf(src
, "void %s_reply::encode_text(Text_Buf& "
257 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
258 if (sdef
->parameters
.elements
[i
].direction
!= PAR_IN
)
259 src
= mputprintf(src
, "param_%s.encode_text(text_buf);\n",
260 sdef
->parameters
.elements
[i
].name
);
262 if (sdef
->return_type
!= NULL
)
263 src
= mputstr(src
, "reply_value.encode_text(text_buf);\n");
264 src
= mputstr(src
, "}\n\n");
265 /* decode_text function */
266 def
= mputstr(def
, "void decode_text(Text_Buf& text_buf);\n");
267 src
= mputprintf(src
, "void %s_reply::decode_text(Text_Buf& "
270 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
271 if (sdef
->parameters
.elements
[i
].direction
!= PAR_IN
)
272 src
= mputprintf(src
, "param_%s.decode_text(text_buf);\n",
273 sdef
->parameters
.elements
[i
].name
);
275 if (sdef
->return_type
!= NULL
)
276 src
= mputstr(src
, "reply_value.decode_text(text_buf);\n");
277 src
= mputstr(src
, "}\n\n");
279 def
= mputstr(def
, "inline void encode_text(Text_Buf&) "
281 "inline void decode_text(Text_Buf&) { }\n");
285 def
= mputstr(def
, "void log() const;\n");
286 src
= mputprintf(src
, "void %s_reply::log() const\n"
289 boolean first_param
= TRUE
;
290 src
= mputprintf(src
, "TTCN_Logger::log_event_str(\"%s : { \");\n",
292 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
293 if (sdef
->parameters
.elements
[i
].direction
!= PAR_IN
) {
294 src
= mputstr(src
, "TTCN_Logger::log_event_str(\"");
295 if (first_param
) first_param
= FALSE
;
296 else src
= mputstr(src
, ", ");
297 src
= mputprintf(src
, "%s := \");\n"
299 sdef
->parameters
.elements
[i
].dispname
,
300 sdef
->parameters
.elements
[i
].name
);
303 if (sdef
->return_type
!= NULL
) {
304 src
= mputstr(src
, "TTCN_Logger::log_event_str(\" } "
306 "reply_value.log();\n");
308 src
= mputstr(src
, "TTCN_Logger::log_event_str(\" }\");\n");
310 } else if (sdef
->return_type
!= NULL
) {
311 src
= mputprintf(src
, "TTCN_Logger::log_event_str(\"%s : { } "
313 "reply_value.log();\n", dispname
);
315 src
= mputprintf(src
, "TTCN_Logger::log_event_str(\"%s : "
316 "{ }\");\n", dispname
);
318 src
= mputstr(src
, "}\n\n");
320 def
= mputstr(def
, "};\n\n");
321 /* end of xxx_reply class*/
325 * xxx_reply_redirect class (for getreply port-operation)
328 decl
= mputprintf(decl
, "class %s_reply_redirect;\n", name
);
330 /* class definition */
331 def
= mputprintf(def
, "class %s_reply_redirect {\n", name
);
333 /* parameter pointers */
334 if (sdef
->return_type
!= NULL
) {
335 def
= mputprintf(def
, "%s *ret_val_ptr;\n", sdef
->return_type
);
337 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
338 if (sdef
->parameters
.elements
[i
].direction
!= PAR_IN
) {
339 def
= mputprintf(def
, "%s *ptr_%s;\n",
340 sdef
->parameters
.elements
[i
].type
,
341 sdef
->parameters
.elements
[i
].name
);
345 def
= mputstr(def
, "public:\n");
347 if (num_out
> 0 || sdef
->return_type
!= NULL
) {
348 boolean first_param
= TRUE
;
350 def
= mputprintf(def
, "%s_reply_redirect(", name
);
351 if (sdef
->return_type
!= NULL
) {
352 def
= mputprintf(def
, "%s *return_ptr", sdef
->return_type
);
355 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
356 if(sdef
->parameters
.elements
[i
].direction
!= PAR_IN
) {
357 if (first_param
) first_param
= FALSE
;
358 else def
= mputstr(def
, ", ");
359 def
= mputprintf(def
, "%s *par_%s = NULL",
360 sdef
->parameters
.elements
[i
].type
,
361 sdef
->parameters
.elements
[i
].name
);
364 def
= mputstr(def
, ")\n"
367 if (sdef
->return_type
!= NULL
) {
368 def
= mputstr(def
, "ret_val_ptr(return_ptr)");
371 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
372 if(sdef
->parameters
.elements
[i
].direction
!= PAR_IN
) {
373 if (first_param
) first_param
= FALSE
;
374 else def
= mputstr(def
, ", ");
375 def
= mputprintf(def
, "ptr_%s(par_%s)",
376 sdef
->parameters
.elements
[i
].name
,
377 sdef
->parameters
.elements
[i
].name
);
380 def
= mputstr(def
, " { }\n");
382 /* otherwise constructor is not needed */
384 /* set_parameters function (used for param redirect in getreply) */
385 if (num_out
> 0 || sdef
->return_type
!= NULL
) {
386 /* if there are "out" or "inout" parameters or a "return" ... */
387 def
= mputprintf(def
, "void set_parameters(const %s_reply& reply_par) "
389 src
= mputprintf(src
, "void %s_reply_redirect::set_parameters(const "
390 "%s_reply& reply_par) const\n"
392 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
393 if (sdef
->parameters
.elements
[i
].direction
!= PAR_IN
) {
394 src
= mputprintf(src
, "if (ptr_%s != NULL) "
395 "*ptr_%s = reply_par.%s();\n",
396 sdef
->parameters
.elements
[i
].name
,
397 sdef
->parameters
.elements
[i
].name
,
398 sdef
->parameters
.elements
[i
].name
);
401 if (sdef
->return_type
!=NULL
) {
402 src
= mputstr(src
, "if (ret_val_ptr != NULL) "
403 "*ret_val_ptr = reply_par.return_value();\n");
405 src
= mputstr(src
, "}\n\n");
408 def
= mputprintf(def
, "inline void set_parameters(const %s_reply&) "
412 def
= mputstr(def
, "};\n\n");
413 /* end of class xxx_reply_redirect */
414 } /* if (!sdeff->is_noblock) */
417 if (sdef
->exceptions
.nElements
> 0) {
418 char *selection_type
, *unbound_value
, *selection_prefix
;
420 selection_type
= mcopystr("exception_selection_type");
421 unbound_value
= mcopystr("UNBOUND_VALUE");
422 selection_prefix
= mcopystr("ALT");
426 * xxx_exception class
429 decl
= mputprintf(decl
, "class %s_exception;\n", name
);
430 /* class definition */
431 def
= mputprintf(def
, "class %s_exception {\n", name
);
434 def
= mputstr(def
, "public:\n"
435 "enum exception_selection_type { ");
436 for (i
= 0; i
< sdef
->exceptions
.nElements
; i
++) {
437 def
= mputprintf(def
, "ALT_%s = %lu, ",
438 sdef
->exceptions
.elements
[i
].altname
, (unsigned long) i
);
440 def
= mputprintf(def
, " UNBOUND_VALUE = %lu };\n"
441 "private:\n", (unsigned long) sdef
->exceptions
.nElements
);
444 def
= mputprintf(def
, "%s exception_selection;\n"
445 "union {\n", selection_type
);
446 for (i
= 0; i
< sdef
->exceptions
.nElements
; i
++) {
447 def
= mputprintf(def
, "%s *field_%s;\n",
448 sdef
->exceptions
.elements
[i
].name
,
449 sdef
->exceptions
.elements
[i
].altname
);
451 def
= mputstr(def
, "};\n");
453 /* clean_up function */
454 def
= mputstr(def
, "void clean_up();\n");
455 src
= mputprintf(src
, "void %s_exception::clean_up()\n"
457 "switch (exception_selection) {\n", name
);
458 for (i
= 0; i
< sdef
->exceptions
.nElements
; i
++) {
459 src
= mputprintf(src
, "case %s_%s:\n"
460 "delete field_%s;\n", selection_prefix
,
461 sdef
->exceptions
.elements
[i
].altname
,
462 sdef
->exceptions
.elements
[i
].altname
);
463 if (i
< sdef
->exceptions
.nElements
- 1)
464 src
= mputstr(src
, "break;\n");
466 src
= mputprintf(src
, "default:\n"
469 "exception_selection = %s;\n"
470 "}\n\n", unbound_value
);
472 /* copy_value function */
473 def
= mputprintf(def
, "void copy_value(const %s_exception& "
474 "other_value);\n", name
);
475 src
= mputprintf(src
, "void %s_exception::copy_value(const "
476 "%s_exception& other_value)\n"
478 "switch (other_value.exception_selection) {\n", name
, name
);
479 for (i
= 0; i
< sdef
->exceptions
.nElements
; i
++) {
480 src
= mputprintf(src
, "case %s_%s:\n"
481 "field_%s = new %s(*other_value.field_%s);\n"
482 "break;\n", selection_prefix
,
483 sdef
->exceptions
.elements
[i
].altname
,
484 sdef
->exceptions
.elements
[i
].altname
,
485 sdef
->exceptions
.elements
[i
].name
,
486 sdef
->exceptions
.elements
[i
].altname
);
488 src
= mputprintf(src
, "default:\n"
489 "TTCN_error(\"Copying an uninitialized exception of signature "
492 "exception_selection = other_value.exception_selection;\n"
495 /* default constructor */
496 def
= mputprintf(def
, "public:\n"
497 "%s_exception() : exception_selection(%s) { }\n", name
,
500 /* copy constructor */
501 def
= mputprintf(def
, "%s_exception(const %s_exception& "
502 "other_value) { copy_value(other_value); }\n", name
, name
);
504 /* constructors (from exception types) */
505 for (i
= 0; i
< sdef
->exceptions
.nElements
; i
++) {
506 def
= mputprintf(def
, "%s_exception(const %s& other_value);\n",
507 name
, sdef
->exceptions
.elements
[i
].name
);
508 src
= mputprintf(src
, "%s_exception::%s_exception(const "
511 "field_%s = new %s(other_value);\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
);
517 def
= mputprintf(def
, "%s_exception(const %s_template& "
518 "other_value);\n", name
, sdef
->exceptions
.elements
[i
].name
);
519 src
= mputprintf(src
, "%s_exception::%s_exception(const "
520 "%s_template& other_value)\n"
522 "field_%s = new %s(other_value.valueof());\n"
523 "exception_selection = %s_%s;\n"
524 "}\n\n", name
, name
, sdef
->exceptions
.elements
[i
].name
,
525 sdef
->exceptions
.elements
[i
].altname
,
526 sdef
->exceptions
.elements
[i
].name
, selection_prefix
,
527 sdef
->exceptions
.elements
[i
].altname
);
531 def
= mputprintf(def
, "~%s_exception() { clean_up(); }\n", name
);
533 /* assignment operator */
534 def
= mputprintf(def
, "%s_exception& operator=(const %s_exception& "
535 "other_value);\n", name
, name
);
536 src
= mputprintf(src
, "%s_exception& %s_exception::operator=(const "
537 "%s_exception& other_value)\n"
539 "if (this != &other_value) {\n"
541 "copy_value(other_value);\n"
544 "}\n\n", name
, name
, name
);
546 /* field (type) access functions */
547 for (i
= 0; i
< sdef
->exceptions
.nElements
; i
++) {
548 def
= mputprintf(def
, "%s& %s_field();\n",
549 sdef
->exceptions
.elements
[i
].name
,
550 sdef
->exceptions
.elements
[i
].altname
);
551 src
= mputprintf(src
, "%s& %s_exception::%s_field()\n"
553 "if (exception_selection != %s_%s) {\n"
555 "field_%s = new %s;\n"
556 "exception_selection = %s_%s;\n"
558 "return *field_%s;\n"
559 "}\n\n", sdef
->exceptions
.elements
[i
].name
, name
,
560 sdef
->exceptions
.elements
[i
].altname
, selection_prefix
,
561 sdef
->exceptions
.elements
[i
].altname
,
562 sdef
->exceptions
.elements
[i
].altname
,
563 sdef
->exceptions
.elements
[i
].name
,
564 selection_prefix
, sdef
->exceptions
.elements
[i
].altname
,
565 sdef
->exceptions
.elements
[i
].altname
);
566 def
= mputprintf(def
, "const %s& %s_field() const;\n",
567 sdef
->exceptions
.elements
[i
].name
,
568 sdef
->exceptions
.elements
[i
].altname
);
569 src
= mputprintf(src
, "const %s& %s_exception::%s_field() const\n"
571 "if (exception_selection != %s_%s) "
572 "TTCN_error(\"Referencing to non-selected type %s in an "
573 "exception of signature %s.\");\n"
574 "return *field_%s;\n"
575 "}\n\n", sdef
->exceptions
.elements
[i
].name
, name
,
576 sdef
->exceptions
.elements
[i
].altname
, selection_prefix
,
577 sdef
->exceptions
.elements
[i
].altname
,
578 sdef
->exceptions
.elements
[i
].dispname
, dispname
,
579 sdef
->exceptions
.elements
[i
].altname
);
582 /* get_selection function */
583 def
= mputprintf(def
, "inline %s get_selection() const "
584 "{ return exception_selection; }\n", selection_type
);
586 /* encode_text function */
587 def
= mputstr(def
, "void encode_text(Text_Buf& text_buf) const;\n");
588 src
= mputprintf(src
, "void %s_exception::encode_text(Text_Buf& "
591 "text_buf.push_int(exception_selection);\n"
592 "switch (exception_selection) {\n", name
);
593 for (i
= 0; i
< sdef
->exceptions
.nElements
; i
++) {
594 src
= mputprintf(src
, "case %s_%s:\n"
595 "field_%s->encode_text(text_buf);\n"
596 "break;\n", selection_prefix
,
597 sdef
->exceptions
.elements
[i
].altname
,
598 sdef
->exceptions
.elements
[i
].altname
);
600 src
= mputprintf(src
, "default:\n"
601 "TTCN_error(\"Text encoder: Encoding an uninitialized exception "
602 "of signature %s.\");\n"
606 /* decode_text function */
607 def
= mputstr(def
, "void decode_text(Text_Buf& text_buf);\n");
608 src
= mputprintf(src
, "void %s_exception::decode_text(Text_Buf& "
611 "switch ((%s)text_buf.pull_int().get_val()) {\n", name
, selection_type
);
612 for (i
= 0; i
< sdef
->exceptions
.nElements
; i
++) {
613 src
= mputprintf(src
, "case %s_%s:\n"
614 "%s_field().decode_text(text_buf);\n"
615 "break;\n", selection_prefix
,
616 sdef
->exceptions
.elements
[i
].altname
,
617 sdef
->exceptions
.elements
[i
].altname
);
619 src
= mputprintf(src
, "default:\n"
620 "TTCN_error(\"Text decoder: Unrecognized selector was received "
621 "for an exception of signature %s.\");\n"
626 def
= mputstr(def
, "void log() const;\n");
627 src
= mputprintf(src
, "void %s_exception::log() const\n"
629 "TTCN_Logger::log_event_str(\"%s, \");\n"
630 "switch (exception_selection) {\n",
632 for (i
= 0; i
< sdef
->exceptions
.nElements
; i
++) {
633 src
= mputprintf(src
, "case %s_%s:\n"
634 "TTCN_Logger::log_event_str(\"%s : \");\n"
636 "break;\n", selection_prefix
,
637 sdef
->exceptions
.elements
[i
].altname
,
638 sdef
->exceptions
.elements
[i
].dispname
,
639 sdef
->exceptions
.elements
[i
].altname
);
641 src
= mputstr(src
, "default:\n"
642 "TTCN_Logger::log_event_str(\"<uninitialized exception>\");\n"
646 def
= mputstr(def
, "};\n\n");
647 /* end of xxx_exception class*/
649 Free(selection_type
);
650 selection_type
= mprintf("%s_exception::exception_selection_type", name
);
652 unbound_value
= mprintf("%s_exception::UNBOUND_VALUE", name
);
653 Free(selection_prefix
);
654 selection_prefix
= mprintf("%s_exception::ALT", name
);
658 * simple xxx_exception_template for the catch port-operator
659 * only with constructors, a log/match function and value redirect
662 decl
= mputprintf(decl
, "class %s_exception_template;\n", name
);
664 def
= mputprintf(def
, "class %s_exception_template {\n", name
);
667 /* exception-selection enum */
668 def
= mputprintf(def
, "%s exception_selection;\n", selection_type
);
669 /* union of all possible exceptions (templates) */
670 def
= mputstr(def
, "union {\n");
671 for (i
= 0; i
< sdef
->exceptions
.nElements
; i
++) {
672 def
= mputprintf(def
, "const %s_template *field_%s;\n",
673 sdef
->exceptions
.elements
[i
].name
,
674 sdef
->exceptions
.elements
[i
].altname
);
676 def
= mputstr(def
, "};\n");
677 /* union of all possible value redirect pointers */
678 def
= mputstr(def
, "union {\n");
679 for (i
= 0; i
< sdef
->exceptions
.nElements
; i
++) {
680 def
= mputprintf(def
, "%s *ptr_%s;\n",
681 sdef
->exceptions
.elements
[i
].name
,
682 sdef
->exceptions
.elements
[i
].altname
);
684 def
= mputstr(def
, "};\n"
686 /* constructors (for all possible template + redirect pointer pairs) */
687 for (i
= 0; i
< sdef
->exceptions
.nElements
; i
++) {
688 def
= mputprintf(def
, "%s_exception_template(const %s_template& "
689 "init_template, %s *value_ptr = NULL);\n", name
,
690 sdef
->exceptions
.elements
[i
].name
,
691 sdef
->exceptions
.elements
[i
].name
);
692 src
= mputprintf(src
, "%s_exception_template::%s_exception_template"
693 "(const %s_template& init_template, %s *value_ptr)\n"
695 "exception_selection = %s_%s;\n"
696 "field_%s = &init_template;\n"
697 "ptr_%s = value_ptr;\n"
698 "}\n\n", name
, name
, sdef
->exceptions
.elements
[i
].name
,
699 sdef
->exceptions
.elements
[i
].name
, selection_prefix
,
700 sdef
->exceptions
.elements
[i
].altname
,
701 sdef
->exceptions
.elements
[i
].altname
,
702 sdef
->exceptions
.elements
[i
].altname
);
706 def
= mputprintf(def
, "boolean match(const %s_exception& other_value,"
707 "boolean legacy = FALSE) const;\n", name
);
708 src
= mputprintf(src
, "boolean %s_exception_template::match(const "
709 "%s_exception& other_value, boolean legacy) const\n"
711 "if (exception_selection != other_value.get_selection()) "
713 "switch (exception_selection) {\n", name
, name
);
714 for (i
= 0; i
< sdef
->exceptions
.nElements
; i
++) {
715 src
= mputprintf(src
, "case %s_%s:\n"
716 "return field_%s->match(other_value.%s_field(), legacy);\n",
717 selection_prefix
, sdef
->exceptions
.elements
[i
].altname
,
718 sdef
->exceptions
.elements
[i
].altname
,
719 sdef
->exceptions
.elements
[i
].altname
);
721 src
= mputprintf(src
, "default:\n"
722 "TTCN_error(\"Internal error: Invalid selector when matching an "
723 "exception of signature %s.\");\n"
728 /* log_match function */
729 def
= mputprintf(def
, "void log_match(const %s_exception& other_value, "
730 "boolean legacy = FALSE) const;\n", name
);
731 src
= mputprintf(src
, "void %s_exception_template::log_match(const "
732 "%s_exception& other_value, boolean legacy) const\n"
734 "TTCN_Logger::log_event_str(\"%s, \");\n"
735 "if (exception_selection == other_value.get_selection()) {\n"
736 "switch (exception_selection) {\n", name
, name
, dispname
);
737 for (i
= 0; i
< sdef
->exceptions
.nElements
; i
++) {
738 src
= mputprintf(src
, "case %s_%s:\n"
739 "TTCN_Logger::log_event_str(\"%s : \");\n"
740 "field_%s->log_match(other_value.%s_field(), legacy);\n"
741 "break;\n", selection_prefix
,
742 sdef
->exceptions
.elements
[i
].altname
,
743 sdef
->exceptions
.elements
[i
].dispname
,
744 sdef
->exceptions
.elements
[i
].altname
,
745 sdef
->exceptions
.elements
[i
].altname
);
747 src
= mputstr(src
, "default:\n"
748 "TTCN_Logger::log_event_str(\"<invalid selector>\");\n"
751 "other_value.log();\n"
752 "TTCN_Logger::log_event_str(\" with \");\n"
753 "switch (exception_selection) {\n");
754 for (i
= 0; i
< sdef
->exceptions
.nElements
; i
++) {
755 src
= mputprintf(src
, "case %s_%s:\n"
756 "TTCN_Logger::log_event_str(\"%s : \");\n"
758 "break;\n", selection_prefix
,
759 sdef
->exceptions
.elements
[i
].altname
,
760 sdef
->exceptions
.elements
[i
].dispname
,
761 sdef
->exceptions
.elements
[i
].altname
);
763 src
= mputstr(src
, "default:\n"
764 "TTCN_Logger::log_event_str(\"<invalid selector>\");\n"
766 "if (match(other_value, legacy)) "
767 "TTCN_Logger::log_event_str(\" matched\");\n"
768 "else TTCN_Logger::log_event_str(\" unmatched\");\n"
772 /* set_value function */
773 def
= mputprintf(def
, "void set_value(const %s_exception& "
774 "source_value) const;\n", name
);
775 src
= mputprintf(src
, "void %s_exception_template::set_value(const "
776 "%s_exception& source_value) const\n"
778 "if (exception_selection == source_value.get_selection()) {\n"
779 "switch (exception_selection) {\n", name
, name
);
780 for (i
= 0; i
< sdef
->exceptions
.nElements
; i
++) {
781 src
= mputprintf(src
, "case %s_%s:\n"
782 "if (ptr_%s != NULL) *ptr_%s = source_value.%s_field();\n"
783 "return;\n", selection_prefix
,
784 sdef
->exceptions
.elements
[i
].altname
,
785 sdef
->exceptions
.elements
[i
].altname
,
786 sdef
->exceptions
.elements
[i
].altname
,
787 sdef
->exceptions
.elements
[i
].altname
);
789 src
= mputprintf(src
, "default:\n"
793 "TTCN_error(\"Internal error: Invalid selector when performing "
794 "value redirect on an exception of signature %s.\");\n"
797 def
= mputstr(def
, "};\n\n");
798 /* end of class xxx_exception_template */
800 Free(selection_type
);
802 Free(selection_prefix
);
803 } /* if (sdef->exceptions.nElements > 0) */
809 decl
= mputprintf(decl
, "class %s_template;\n", name
);
811 def
= mputprintf(def
, "class %s_template {\n", name
);
814 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
815 def
= mputprintf(def
, "%s_template param_%s;\n",
816 sdef
->parameters
.elements
[i
].type
,
817 sdef
->parameters
.elements
[i
].name
);
819 if (sdef
->return_type
!= NULL
) {
820 def
= mputprintf(def
, "mutable %s_template reply_value;\n",
824 def
= mputstr(def
, "public:\n");
826 if (sdef
->parameters
.nElements
> 0 || sdef
->return_type
!= NULL
) {
827 boolean first_param
= TRUE
;
828 def
= mputprintf(def
, "%s_template();\n", name
);
829 src
= mputprintf(src
, "%s_template::%s_template()\n"
831 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
832 if (first_param
) first_param
= FALSE
;
833 else src
= mputstr(src
, ", ");
834 src
= mputprintf(src
, "param_%s(ANY_VALUE)",
835 sdef
->parameters
.elements
[i
].name
);
837 if (sdef
->return_type
!= NULL
) {
838 if (first_param
) /*first_param = FALSE*/;
839 else src
= mputstr(src
, ", ");
840 src
= mputstr(src
, "reply_value(ANY_VALUE)");
842 src
= mputstr(src
, "\n"
846 def
= mputprintf(def
, "%s_template() { }\n", name
);
849 if (sdef
->parameters
.nElements
== 0) {
850 /* constructor and assignment operator for parameter-less signatures */
851 if (sdef
->return_type
!= NULL
) {
852 def
= mputprintf(def
, "%s_template(null_type null_value);\n",
854 src
= mputprintf(src
,
855 "%s_template::%s_template(null_type)\n"
856 " : reply_value(ANY_VALUE)\n"
858 "}\n\n", name
, name
);
860 def
= mputprintf(def
, "%s_template(null_type) { }\n",
863 def
= mputprintf(def
, "inline %s_template& operator=(null_type)"
864 " { return *this; }\n", name
);
867 /* parameter access functions */
868 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
869 def
= mputprintf(def
, "inline %s_template& %s() { return param_%s; }\n"
870 "inline const %s_template& %s() const { return param_%s; }\n",
871 sdef
->parameters
.elements
[i
].type
,
872 sdef
->parameters
.elements
[i
].name
,
873 sdef
->parameters
.elements
[i
].name
,
874 sdef
->parameters
.elements
[i
].type
,
875 sdef
->parameters
.elements
[i
].name
,
876 sdef
->parameters
.elements
[i
].name
);
878 if (sdef
->return_type
!= NULL
) {
879 def
= mputprintf(def
, "inline %s_template& return_value() const "
880 "{ return reply_value; }\n", sdef
->return_type
);
883 /* create_call function for creating xxx_call signature-value */
885 def
= mputprintf(def
, "%s_call create_call() const;\n", name
);
886 src
= mputprintf(src
, "%s_call %s_template::create_call() const\n"
888 "%s_call ret_val;\n", name
, name
, name
);
889 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
890 if (sdef
->parameters
.elements
[i
].direction
!= PAR_OUT
) {
891 src
= mputprintf(src
, "ret_val.%s() = param_%s.valueof();\n",
892 sdef
->parameters
.elements
[i
].name
,
893 sdef
->parameters
.elements
[i
].name
);
896 src
= mputstr(src
, "return ret_val;\n"
899 def
= mputprintf(def
, "inline %s_call create_call() const "
900 "{ return %s_call(); }\n", name
, name
);
903 if (!sdef
->is_noblock
) {
904 /* create_reply function for creating xxx_reply signature-value */
905 if (num_out
> 0 || sdef
->return_type
!= NULL
) {
906 def
= mputprintf(def
, "%s_reply create_reply() const;\n", name
);
907 src
= mputprintf(src
, "%s_reply %s_template::create_reply() const\n"
909 "%s_reply ret_val;\n", name
, name
, name
);
910 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
911 if (sdef
->parameters
.elements
[i
].direction
!= PAR_IN
) {
912 src
= mputprintf(src
, "ret_val.%s() = "
913 "param_%s.valueof();\n",
914 sdef
->parameters
.elements
[i
].name
,
915 sdef
->parameters
.elements
[i
].name
);
918 if (sdef
->return_type
!= NULL
) {
919 src
= mputstr(src
, "ret_val.return_value() = "
920 "reply_value.valueof();\n");
922 src
= mputstr(src
, "return ret_val;\n"
925 def
= mputprintf(def
, "inline %s_reply create_reply() const "
926 "{ return %s_reply(); }\n", name
, name
);
930 /* match_call function for matching with xxx_call signature-value */
932 boolean first_param
= TRUE
;
933 def
= mputprintf(def
, "boolean match_call(const %s_call& match_value, "
934 "boolean legacy = FALSE) const;\n", name
);
935 src
= mputprintf(src
, "boolean %s_template::match_call(const %s_call& "
936 "match_value, boolean legacy) const\n"
938 "return ", name
, name
);
939 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
940 if (sdef
->parameters
.elements
[i
].direction
!= PAR_OUT
) {
941 if (first_param
) first_param
= FALSE
;
942 else src
= mputstr(src
, " &&\n");
943 src
= mputprintf(src
, "param_%s.match(match_value.%s(), legacy)",
944 sdef
->parameters
.elements
[i
].name
,
945 sdef
->parameters
.elements
[i
].name
);
948 src
= mputstr(src
, ";\n"
951 def
= mputprintf(def
, "inline boolean match_call(const %s_call&"
952 ", boolean legacy = FALSE) const { return TRUE; }\n", name
);
955 if (!sdef
->is_noblock
) {
956 if (num_out
> 0 || sdef
->return_type
!= NULL
) {
957 boolean first_param
= TRUE
;
958 /* match_reply function for matching with xxx_reply value */
959 def
= mputprintf(def
, "boolean match_reply(const %s_reply& "
960 "match_value, boolean legacy = FALSE) const;\n", name
);
961 src
= mputprintf(src
, "boolean %s_template::match_reply(const "
962 "%s_reply& match_value, boolean legacy) const\n"
964 "return ", name
, name
);
965 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
966 if(sdef
->parameters
.elements
[i
].direction
!= PAR_IN
) {
967 if (first_param
) first_param
= FALSE
;
968 else src
= mputstr(src
, " &&\n");
969 src
= mputprintf(src
, "param_%s.match(match_value.%s(), legacy)",
970 sdef
->parameters
.elements
[i
].name
,
971 sdef
->parameters
.elements
[i
].name
);
974 if (sdef
->return_type
!= NULL
) {
975 if (first_param
) /*first_param = FALSE*/;
976 else src
= mputstr(src
, " &&\n");
978 "reply_value.match(match_value.return_value(), legacy)");
980 src
= mputstr(src
, ";\n"
983 def
= mputprintf(def
, "inline boolean match_reply(const %s_reply&"
984 ", boolean legacy = FALSE) const { return TRUE; }\n", name
);
988 /* set_value_template function */
989 if (sdef
->return_type
!= NULL
) {
990 def
= mputprintf(def
, "const %s_template& set_value_template(const "
991 "%s_template& new_template) const;\n", name
, sdef
->return_type
);
992 src
= mputprintf(src
,
993 "const %s_template& %s_template::set_value_template"
994 "(const %s_template& new_template) const\n"
996 "reply_value = new_template;\n"
998 "}\n\n", name
, name
, sdef
->return_type
);
1002 def
= mputstr(def
, "void log() const;\n");
1003 src
= mputprintf(src
, "void %s_template::log() const\n"
1005 if (sdef
->parameters
.nElements
>= 1) {
1006 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
1007 src
= mputstr(src
, "TTCN_Logger::log_event_str(\"");
1008 if (i
== 0) src
= mputc(src
, '{');
1009 else src
= mputc(src
, ',');
1010 src
= mputprintf(src
, " %s := \");\n"
1011 "param_%s.log();\n", sdef
->parameters
.elements
[i
].dispname
,
1012 sdef
->parameters
.elements
[i
].name
);
1014 src
= mputstr(src
, "TTCN_Logger::log_event_str(\" }\");\n");
1016 src
= mputstr(src
, "TTCN_Logger::log_event_str(\"{ }\");\n");
1018 src
= mputstr(src
, "}\n\n");
1020 /* log_match_call function */
1021 def
= mputprintf(def
, "void log_match_call(const %s_call& match_value, "
1022 "boolean legacy = FALSE) const;\n", name
);
1023 src
= mputprintf(src
, "void %s_template::log_match_call(const %s_call& "
1026 boolean first_param
= TRUE
;
1027 src
= mputstr(src
, "match_value, boolean legacy) const\n{\n");
1028 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
1029 if (sdef
->parameters
.elements
[i
].direction
!= PAR_OUT
) {
1030 src
= mputstr(src
, "TTCN_Logger::log_event_str(\"");
1032 src
= mputc(src
, '{');
1033 first_param
= FALSE
;
1034 } else src
= mputc(src
, ',');
1035 src
= mputprintf(src
, " %s := \");\n"
1036 "param_%s.log_match(match_value.%s(), legacy);\n",
1037 sdef
->parameters
.elements
[i
].dispname
,
1038 sdef
->parameters
.elements
[i
].name
,
1039 sdef
->parameters
.elements
[i
].name
);
1042 src
= mputstr(src
, "TTCN_Logger::log_event_str(\" }\");\n");
1044 src
= mputstr(src
, ", boolean) const\n{\n"
1045 "TTCN_Logger::log_event_str(\"{ } with { } matched\");\n");
1047 src
= mputstr(src
, "}\n\n");
1049 if (!sdef
->is_noblock
) {
1050 /* log_match_reply function */
1051 def
= mputprintf(def
, "void log_match_reply(const %s_reply& match_value, "
1052 "boolean legacy = FALSE) const;\n", name
);
1053 src
= mputprintf(src
, "void %s_template::log_match_reply(const %s_reply& "
1056 boolean first_param
= TRUE
;
1057 src
= mputstr(src
, "match_value, boolean legacy) const\n{\n");
1058 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
1059 if (sdef
->parameters
.elements
[i
].direction
!= PAR_IN
) {
1060 src
= mputstr(src
, "TTCN_Logger::log_event_str(\"");
1062 src
= mputc(src
, '{');
1063 first_param
= FALSE
;
1064 } else src
= mputc(src
, ',');
1065 src
= mputprintf(src
, " %s := \");\n"
1066 "param_%s.log_match(match_value.%s(), legacy);\n",
1067 sdef
->parameters
.elements
[i
].dispname
,
1068 sdef
->parameters
.elements
[i
].name
,
1069 sdef
->parameters
.elements
[i
].name
);
1072 if (sdef
->return_type
!= NULL
) {
1073 src
= mputstr(src
, "TTCN_Logger::log_event_str(\" } value "
1075 "reply_value.log_match(match_value.return_value(), legacy);\n");
1077 src
= mputstr(src
, "TTCN_Logger::log_event_str(\" }\");\n");
1080 if (sdef
->return_type
!= NULL
) {
1081 src
= mputstr(src
, "match_value, boolean legacy) const\n{\n"
1082 "TTCN_Logger::log_event_str(\"{ } with { } "
1083 "matched value \");\n"
1084 "reply_value.log_match(match_value.return_value(), legacy);\n");
1086 src
= mputstr(src
, ", boolean) const\n{\n"
1087 "TTCN_Logger::log_event_str(\"{ } with { } "
1091 src
= mputstr(src
, "}\n\n");
1094 if (sdef
->parameters
.nElements
> 0) {
1095 /* encode_text function */
1096 def
= mputstr(def
, "void encode_text(Text_Buf& text_buf) const;\n");
1097 src
= mputprintf(src
, "void %s_template::encode_text(Text_Buf& "
1100 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
1101 src
= mputprintf(src
, "param_%s.encode_text(text_buf);\n",
1102 sdef
->parameters
.elements
[i
].name
);
1104 src
= mputstr(src
, "}\n\n");
1105 /* decode_text function */
1106 def
= mputstr(def
, "void decode_text(Text_Buf& text_buf);\n");
1107 src
= mputprintf(src
, "void %s_template::decode_text(Text_Buf& "
1110 for (i
= 0; i
< sdef
->parameters
.nElements
; i
++) {
1111 src
= mputprintf(src
, "param_%s.decode_text(text_buf);\n",
1112 sdef
->parameters
.elements
[i
].name
);
1114 src
= mputstr(src
, "}\n\n");
1116 def
= mputstr(def
, "inline void encode_text(Text_Buf&) const "
1118 "inline void decode_text(Text_Buf&) { }\n");
1121 /* end of template definition */
1122 def
= mputstr(def
, "};\n\n");
1124 output
->header
.class_decls
= mputstr(output
->header
.class_decls
, decl
);
1127 output
->header
.class_defs
= mputstr(output
->header
.class_defs
, def
);
1130 output
->source
.methods
= mputstr(output
->source
.methods
, src
);
This page took 0.080924 seconds and 5 git commands to generate.