From af7104877b9819f9e11f3ca6109eda961e971478 Mon Sep 17 00:00:00 2001 From: erititan <elemer.lelik@ericsson.com> Date: Mon, 16 Mar 2015 10:45:12 +0100 Subject: [PATCH] Sync with 5.2.0 --- Install/.gitignore | 2 +- README.cygwin | 8 + README.linux | 231 +-- README.md | 40 +- README.md~ | 79 + README.mingw | 48 + common/config_preproc_la.l | 1 + common/version.h | 4 +- compiler2/AST.cc | 23 +- compiler2/AST.hh | 35 +- compiler2/CompilerError.cc | 2 +- compiler2/Makefile | 2 +- compiler2/ProjectGenHelper.cc | 744 +++++++ compiler2/ProjectGenHelper.hh | 157 ++ compiler2/Setting.cc | 14 +- compiler2/Setting.hh | 7 +- compiler2/Type.cc | 16 +- compiler2/Type.hh | 13 + compiler2/Type_chk.cc | 41 +- compiler2/Type_codegen.cc | 119 +- compiler2/Value.cc | 29 +- compiler2/Value.hh | 5 - compiler2/asn1/AST_asn1.cc | 33 +- compiler2/asn1/AST_asn1.hh | 16 +- compiler2/asn1/Ref.cc | 6 +- compiler2/compiler.1 | 37 +- compiler2/encdec.c | 10 +- compiler2/enum.c | 4 +- compiler2/main.cc | 47 +- compiler2/main.hh | 3 +- compiler2/makefile.c | 1753 ++++++++++++----- compiler2/record.c | 310 +-- compiler2/record_of.c | 458 ++--- compiler2/subtype.cc | 24 + compiler2/subtype.hh | 2 + compiler2/subtypestuff.cc | 10 + compiler2/subtypestuff.hh | 19 + compiler2/ttcn3/AST_ttcn3.cc | 57 +- compiler2/ttcn3/AST_ttcn3.hh | 21 +- compiler2/ttcn3/Statement.cc | 13 +- compiler2/ttcn3/Statement.hh | 7 +- compiler2/ttcn3/Ttcn2Json.cc | 43 +- compiler2/ttcn3/TtcnTemplate.cc | 9 +- compiler2/ttcn3/compiler.c | 4 + compiler2/union.c | 24 +- compiler2/xpather.cc | 643 +++++- compiler2/xpather.h | 117 +- core/ASN_Any.cc | 22 + core/ASN_CharacterString.cc | 71 +- core/ASN_CharacterString.hh | 16 +- core/ASN_EmbeddedPDV.cc | 72 +- core/ASN_EmbeddedPDV.hh | 16 +- core/ASN_External.cc | 57 +- core/ASN_External.hh | 4 +- core/ASN_Null.cc | 58 +- core/ASN_Null.hh | 12 +- core/Array.hh | 18 +- core/Basetype.cc | 18 +- core/Basetype.hh | 51 +- core/Bitstring.cc | 12 +- core/Bitstring.hh | 4 +- core/Boolean.cc | 10 +- core/Boolean.hh | 4 +- core/Charstring.cc | 10 +- core/Charstring.hh | 4 +- core/Float.cc | 10 +- core/Float.hh | 4 +- core/Hexstring.cc | 12 +- core/Hexstring.hh | 4 +- core/Integer.cc | 8 +- core/Integer.hh | 4 +- core/JSON.cc | 10 + core/JSON.hh | 5 + core/Makefile | 5 +- core/Objid.cc | 143 +- core/Objid.hh | 16 +- core/Octetstring.cc | 10 +- core/Octetstring.hh | 4 +- core/Optional.hh | 317 ++- core/Profiler.cc | 839 ++++++++ core/Profiler.hh | 193 ++ core/Template.hh | 4 +- core/Universal_charstring.cc | 8 +- core/Universal_charstring.hh | 4 +- core/Verdicttype.cc | 8 +- core/Verdicttype.hh | 4 +- core/XER.hh | 53 +- core/config_process.l | 21 +- core/config_process.y | 68 + core2/Basetype2.cc | 568 +++--- doc/License_handling_in_TITAN.doc | Bin 147968 -> 120832 bytes etc/Makefile | 1 + etc/scripts/ttcn3_archive.pl | 159 ++ etc/xsd/TPD.xsd | 25 +- .../Semantic_Analyser/TTCN3_SA_13_TD.script | 43 - .../TTCN3_SA_ttcn3adhoc_TD.script | 31 + .../doc/TTCN3_Executor_TestReport.doc | Bin 1476608 -> 1091072 bytes mctr2/cli/config_read.l | 21 +- mctr2/cli/config_read.y | 54 + .../XML/EXER-whitepaper/EmbedValues.ttcnpp | 67 + regression_test/XML/Makefile | 2 +- regression_test/XML/tpdValidTest/Makefile | 12 + .../XML/tpdValidTest/tpdValidTest.sh | 22 + regression_test/compileonly/HT48786/Makefile | 45 + .../compileonly/HT48786/Test1.ttcn | 36 + .../compileonly/HT48786/Test2.ttcn | 21 + regression_test/compileonly/Makefile | 2 +- .../invalid_buildconfig_param/Makefile | 3 +- .../compileonly/mfgen-tpd/library/Makefile | 34 +- regression_test/json/Functions.ttcn | 18 + regression_test/json/JsonData.asn | 98 + regression_test/json/Testcases.ttcn | 36 + regression_test/json/Types.ttcn | 7 + regression_test/recofOper/Makefile | 11 +- regression_test/recofOper/config.cfg | 1 - regression_test/recofOper/config_rt2.cfg | 15 + regression_test/ttcn2json/CompareSchemas.ttcn | 117 ++ .../ttcn2json/General_Types_e.json | 722 +++++++ regression_test/ttcn2json/Main.ttcn | 37 + regression_test/ttcn2json/Main_e.json | 279 +++ regression_test/ttcn2json/Makefile | 6 +- regression_test/ttcn2json/MiniRanap.asn | 80 + regression_test/ttcn2json/MiniRanap_e.json | 94 + regression_test/ttcn2json/PDU_Definitions.asn | 93 + regression_test/ttcn2json/Testcases.ttcn | 31 +- .../ttcn2json/f_ext_import_schema.cc | 456 +++++ .../ttcn2json/f_ext_import_schema.hh | 27 + regression_test/ttcn2json/one_e.json | 287 +-- regression_test/ttcn2json/three_e.json | 866 ++++++++ regression_test/ttcn2json/two.ttcn | 4 +- regression_test/ttcn2json/two_e.json | 794 ++++++++ regression_test/ttcn2json/zero.asn | 7 +- .../doc/Titan_Executor_API_User_Guide.doc | Bin 64512 -> 64512 bytes usrguide/Makefile | 40 +- usrguide/PRI.doc | Bin 0 -> 83456 bytes usrguide/apiguide.doc | Bin 566784 -> 564224 bytes usrguide/installationguide.doc | Bin 117760 -> 118272 bytes usrguide/referenceguide.doc | Bin 1490944 -> 1541120 bytes usrguide/releasenotes.doc | Bin 577536 -> 572416 bytes usrguide/userguide.doc | Bin 850432 -> 849408 bytes 140 files changed, 10583 insertions(+), 2192 deletions(-) create mode 100644 README.md~ create mode 100644 README.mingw create mode 100644 compiler2/ProjectGenHelper.cc create mode 100644 compiler2/ProjectGenHelper.hh create mode 100644 core/Profiler.cc create mode 100644 core/Profiler.hh create mode 100644 etc/scripts/ttcn3_archive.pl create mode 100644 regression_test/XML/tpdValidTest/Makefile create mode 100755 regression_test/XML/tpdValidTest/tpdValidTest.sh create mode 100644 regression_test/compileonly/HT48786/Makefile create mode 100644 regression_test/compileonly/HT48786/Test1.ttcn create mode 100644 regression_test/compileonly/HT48786/Test2.ttcn create mode 100644 regression_test/recofOper/config_rt2.cfg create mode 100644 regression_test/ttcn2json/CompareSchemas.ttcn create mode 100644 regression_test/ttcn2json/Main.ttcn create mode 100644 regression_test/ttcn2json/Main_e.json create mode 100644 regression_test/ttcn2json/MiniRanap.asn create mode 100644 regression_test/ttcn2json/MiniRanap_e.json create mode 100644 regression_test/ttcn2json/PDU_Definitions.asn create mode 100644 regression_test/ttcn2json/f_ext_import_schema.cc create mode 100644 regression_test/ttcn2json/f_ext_import_schema.hh create mode 100644 regression_test/ttcn2json/three_e.json create mode 100644 regression_test/ttcn2json/two_e.json create mode 100644 usrguide/PRI.doc diff --git a/Install/.gitignore b/Install/.gitignore index 24600083d..3d758890d 100644 --- a/Install/.gitignore +++ b/Install/.gitignore @@ -1 +1 @@ -!Makefile +!Makefile \ No newline at end of file diff --git a/README.cygwin b/README.cygwin index 43be04ac3..4b683ee49 100644 --- a/README.cygwin +++ b/README.cygwin @@ -1,3 +1,11 @@ +****************************************************************************** +* Copyright (c) 2000-2015 Ericsson Telecom AB +* All rights reserved. This program and the accompanying materials +* are made available under the terms of the Eclipse Public License v1.0 +* which accompanies this distribution, and is available at +* http://www.eclipse.org/legal/epl-v10.html +****************************************************************************** + Cygwin setup - If Cygwin is installed already, refresh your Cygwin installation Titan is always build for the newest Cygwin version available. diff --git a/README.linux b/README.linux index 06666777f..9becb31bc 100644 --- a/README.linux +++ b/README.linux @@ -1,113 +1,118 @@ -Build and install Titan on Linux - -1.Install required libraries: -(examples are given for Ubuntu 12.04/14.04; for other Linuxes, pls. use the relevant library installation method) - -sudo apt-get install g++ expect libssl-dev libxml2-dev libncurses5-dev flex bison -xutils-dev is needed by makedepend: -sudo apt-get install xutils-dev -The following packages may be needed for titan_eclipse/automatic_build: -sudo apt-get install ant xsltproc - -2.Clone the titan directory from git into /home/<user_id>/titan - -git clone https://github.com/eclipse/titan.core titan - -3. Configure the build - -cd titan -check that MakefileFOSS.cfg is present and has the following content: -cat MakefileFOSS.cfg - -# Configurations for the Free Open Source Software version -LICENSING := no -USAGE_STATS := no - - -Several build options are possible; for details on options , please read through the Makefile.cfg. -Options can be overridden by the content of a file named Makefile.personal which can be used to -adapt to local installation directories, change config options etc. -Below, a small number of typical scenarios are presented. - -1) JNI disabled - -The JNI interface is used by the Eclipse Titan Executor or by the Java Executor API. -If you don't need them , Titan can be compiled without JNI. - -Create ~/titan/Makefile.personal to override settings in Makefile.cfg with the following content: -(replace paths with values relevant to your installation) - -TTCN3_DIR := /home/<user id>/titan/Install -OPENSSL_DIR := /usr -#JDKDIR := /usr/lib/jvm/java-7-openjdk-amd64 -XMLDIR := /usr -JNI := no -GEN_PDF := no - - - - -2) JNI enabled - -install JDK into /home/<user id>/jdk - -Create ~/titan/Makefile.personal to override settings in Makefile.cfg with the following content: -(replace paths with values relevant to your installation) - -TTCN3_DIR := /home/<user id>/titan/Install -OPENSSL_DIR := /usr -JDKDIR := /usr/lib/jvm/java-7-openjdk-amd64 -XMLDIR := /usr -JNI := yes -GEN_PDF := no - - - -3. Run make - -make - -4. Run make install - -make install - -This will install Titan into /home/<user id>/titan/Install - -5. Optionally , run function/regression tests - -set environment variable TTCN3_DIR to /home/<user id>/titan/Install - -(setenv TTCN3_DIR /home/<user id>/titan/Install for csh, -export TTCN3_DIR=/home/<user id>/titan/Install for bash ) - - - -cd /home/<user id>/titan/function_test - -in the following Makefiles - -XER_EncDec/Makefile -Text_EncDec/Makefile -RAW_EncDec/Makefile - -edit the value of XMLDIR to match your installation values - -run the tests - -make - -( or make |& tee outputfile if you want to save the output for verification) - -cd /home/<user id>/titan/regression_test -make run - -( or make run |& tee outputfile if you want to save the output for verification) - -These tests might run for half an hour (regr.tests) to two hours (func.tests) - -6. Optionally , copy Titan into its' final directory. -From here on, you can continue with the Titan installation guide, see /Install/docs, to set environment variables etc. - - - - +****************************************************************************** +* Copyright (c) 2000-2015 Ericsson Telecom AB +* All rights reserved. This program and the accompanying materials +* are made available under the terms of the Eclipse Public License v1.0 +* which accompanies this distribution, and is available at +* http://www.eclipse.org/legal/epl-v10.html +****************************************************************************** + +Build and install Titan on Linux + +1.Install required libraries: +(examples are given for Ubuntu 12.04/14.04; for other Linuxes, pls. use the relevant library installation method) + +sudo apt-get install g++ expect libssl-dev libxml2-dev libncurses5-dev flex bison +xutils-dev is needed by makedepend: +sudo apt-get install xutils-dev +The following packages may be needed for titan_eclipse/automatic_build: +sudo apt-get install ant xsltproc + +2.Clone the titan directory from git into /home/<user_id>/titan + +git clone https://github.com/eclipse/titan.core titan + +3. Configure the build + +cd titan +check that MakefileFOSS.cfg is present and has the following content: +cat MakefileFOSS.cfg + +# Configurations for the Free Open Source Software version +LICENSING := no +USAGE_STATS := no + + +Several build options are possible; for details on options , please read through the Makefile.cfg. +Options can be overridden by the content of a file named Makefile.personal which can be used to +adapt to local installation directories, change config options etc. +Below, a small number of typical scenarios are presented. + +1) JNI disabled + +The JNI interface is used by the Eclipse Titan Executor or by the Java Executor API. +If you don't need them , Titan can be compiled without JNI. + +Create ~/titan/Makefile.personal to override settings in Makefile.cfg with the following content: +(replace paths with values relevant to your installation) + +TTCN3_DIR := /home/<user id>/titan/Install +OPENSSL_DIR := /usr +#JDKDIR := /usr/lib/jvm/java-7-openjdk-amd64 +XMLDIR := /usr +JNI := no +GEN_PDF := no + + + + +2) JNI enabled + +install JDK into /home/<user id>/jdk + +Create ~/titan/Makefile.personal to override settings in Makefile.cfg with the following content: +(replace paths with values relevant to your installation) + +TTCN3_DIR := /home/<user id>/titan/Install +OPENSSL_DIR := /usr +JDKDIR := /usr/lib/jvm/java-7-openjdk-amd64 +XMLDIR := /usr +JNI := yes +GEN_PDF := no + + + +3. Run make + +make + +4. Run make install + +make install + +This will install Titan into /home/<user id>/titan/Install + +5. Optionally , run function/regression tests + +set environment variable TTCN3_DIR to /home/<user id>/titan/Install + +(setenv TTCN3_DIR /home/<user id>/titan/Install for csh, +export TTCN3_DIR=/home/<user id>/titan/Install for bash ) + + + +cd /home/<user id>/titan/function_test + +in the following Makefiles + +XER_EncDec/Makefile +Text_EncDec/Makefile +RAW_EncDec/Makefile + +edit the value of XMLDIR to match your installation values + +run the tests + +make + +( or make |& tee outputfile if you want to save the output for verification) + +cd /home/<user id>/titan/regression_test +make run + +( or make run |& tee outputfile if you want to save the output for verification) + +These tests might run for half an hour (regr.tests) to two hours (func.tests) + +6. Optionally , copy Titan into its' final directory. +From here on, you can continue with the Titan installation guide, see /Install/docs, to set environment variables etc. + diff --git a/README.md b/README.md index b920dec58..8dfedb8a2 100644 --- a/README.md +++ b/README.md @@ -20,26 +20,26 @@ http://polarsys.org/sites/default/files/custom_uploads/TITAN%20Datasheet%20A4%20 ##Binaries and SHA512 checksums for a number of Linux platforms can be downloaded from: -* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.1.pl0-linux32-gcc4.1.0-sles10.tgz -* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.1.pl0-linux32-gcc4.1.0-sles10.tgz.sha512 -* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.1.pl0-linux32-gcc4.1.2-sled10.2.tgz -* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.1.pl0-linux32-gcc4.1.2-sled10.2.tgz.sha512 -* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.1.pl0-linux32-gcc4.3-SLED11.1.tgz -* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.1.pl0-linux32-gcc4.3-SLED11.1.tgz.sha512 -* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.1.pl0-linux64-gcc4.1.2-rhel5.tgz -* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.1.pl0-linux64-gcc4.1.2-rhel5.tgz.sha512 -* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.1.pl0-linux64-gcc4.3-SLED11.1.tgz -* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.1.pl0-linux64-gcc4.3-SLED11.1.tgz.sha512 -* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.1.pl0-linux64-gcc4.3-sled11.0.tgz -* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.1.pl0-linux64-gcc4.3-sled11.0.tgz.sha512 -* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.1.pl0-linux64-gcc4.3-sles11.1.tgz -* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.1.pl0-linux64-gcc4.3-sles11.1.tgz.sha512 -* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.1.pl0-linux64-gcc4.4.5-rhel6.tgz -* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.1.pl0-linux64-gcc4.4.5-rhel6.tgz.sha512 -* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.1.pl0-linux64-gcc4.6-ubuntu12.04.tgz -* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.1.pl0-linux64-gcc4.6-ubuntu12.04.tgz.sha512 -* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.1.pl0-linux64-gcc4.8-ubuntu14.04.tgz -* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.1.pl0-linux64-gcc4.8-ubuntu14.04.tgz.sha512 +* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.2.pl0-linux32-gcc4.1.0-sles10.tgz +* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.2.pl0-linux32-gcc4.1.0-sles10.tgz.sha512 +* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.2.pl0-linux32-gcc4.1.2-sled10.2.tgz +* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.2.pl0-linux32-gcc4.1.2-sled10.2.tgz.sha512 +* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.2.pl0-linux32-gcc4.3-SLED11.1.tgz +* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.2.pl0-linux32-gcc4.3-SLED11.1.tgz.sha512 +* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.2.pl0-linux64-gcc4.1.2-rhel5.tgz +* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.2.pl0-linux64-gcc4.1.2-rhel5.tgz.sha512 +* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.2.pl0-linux64-gcc4.3-SLED11.1.tgz +* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.2.pl0-linux64-gcc4.3-SLED11.1.tgz.sha512 +* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.2.pl0-linux64-gcc4.3-sled11.0.tgz +* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.2.pl0-linux64-gcc4.3-sled11.0.tgz.sha512 +* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.2.pl0-linux64-gcc4.3-sles11.1.tgz +* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.2.pl0-linux64-gcc4.3-sles11.1.tgz.sha512 +* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.2.pl0-linux64-gcc4.4.5-rhel6.tgz +* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.2.pl0-linux64-gcc4.4.5-rhel6.tgz.sha512 +* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.2.pl0-linux64-gcc4.6-ubuntu12.04.tgz +* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.2.pl0-linux64-gcc4.6-ubuntu12.04.tgz.sha512 +* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.2.pl0-linux64-gcc4.8-ubuntu14.04.tgz +* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.2.pl0-linux64-gcc4.8-ubuntu14.04.tgz.sha512 # Related products: diff --git a/README.md~ b/README.md~ new file mode 100644 index 000000000..b920dec58 --- /dev/null +++ b/README.md~ @@ -0,0 +1,79 @@ +# titan.core + +TTCN-3 is a standardized, modular language specifically designed for testing. +Eclipse Titan offers a free and open source (FOSS) compiler both for TTCN-3 and for +ASN.1 (Abstract Syntax Notation One). + +# Standards page (also including downloadable code): + +* http://www.ttcn-3.org/ + +# Main project page: + +* https://projects.eclipse.org/projects/tools.titan + +##Introductory video of a presentation about Titan held at EclipseCon 2014: +* https://www.youtube.com/watch?v=2knzZuwzn-Y. + +##Titan Datasheet on polarsys.org: +http://polarsys.org/sites/default/files/custom_uploads/TITAN%20Datasheet%20A4%202.1.pdf + +##Binaries and SHA512 checksums for a number of Linux platforms can be downloaded from: + +* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.1.pl0-linux32-gcc4.1.0-sles10.tgz +* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.1.pl0-linux32-gcc4.1.0-sles10.tgz.sha512 +* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.1.pl0-linux32-gcc4.1.2-sled10.2.tgz +* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.1.pl0-linux32-gcc4.1.2-sled10.2.tgz.sha512 +* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.1.pl0-linux32-gcc4.3-SLED11.1.tgz +* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.1.pl0-linux32-gcc4.3-SLED11.1.tgz.sha512 +* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.1.pl0-linux64-gcc4.1.2-rhel5.tgz +* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.1.pl0-linux64-gcc4.1.2-rhel5.tgz.sha512 +* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.1.pl0-linux64-gcc4.3-SLED11.1.tgz +* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.1.pl0-linux64-gcc4.3-SLED11.1.tgz.sha512 +* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.1.pl0-linux64-gcc4.3-sled11.0.tgz +* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.1.pl0-linux64-gcc4.3-sled11.0.tgz.sha512 +* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.1.pl0-linux64-gcc4.3-sles11.1.tgz +* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.1.pl0-linux64-gcc4.3-sles11.1.tgz.sha512 +* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.1.pl0-linux64-gcc4.4.5-rhel6.tgz +* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.1.pl0-linux64-gcc4.4.5-rhel6.tgz.sha512 +* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.1.pl0-linux64-gcc4.6-ubuntu12.04.tgz +* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.1.pl0-linux64-gcc4.6-ubuntu12.04.tgz.sha512 +* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.1.pl0-linux64-gcc4.8-ubuntu14.04.tgz +* https://www.eclipse.org/downloads/download.php?file=/titan/ttcn3-5.1.pl0-linux64-gcc4.8-ubuntu14.04.tgz.sha512 + + +# Related products: + +## Test Ports: + +* https://github.com/eclipse/titan.TestPorts.Common_Components.Abstract_Socket +* https://github.com/eclipse/titan.TestPorts.HTTPmsg +* https://github.com/eclipse/titan.TestPorts.LANL2asp +* https://github.com/eclipse/titan.TestPorts.PCAPasp +* https://github.com/eclipse/titan.TestPorts.PIPEasp +* https://github.com/eclipse/titan.TestPorts.SCTPasp +* https://github.com/eclipse/titan.TestPorts.SIPmsg +* https://github.com/eclipse/titan.TestPorts.SQLasp +* https://github.com/eclipse/titan.TestPorts.TCPasp +* https://github.com/eclipse/titan.TestPorts.TELNETasp +* https://github.com/eclipse/titan.TestPorts.UDPasp + + +## Protocol Modules: + +* https://github.com/eclipse/titan.ProtocolModules.COMMON +* https://github.com/eclipse/titan.ProtocolModules.DHCP +* https://github.com/eclipse/titan.ProtocolModules.DHCPv6 +* https://github.com/eclipse/titan.ProtocolModules.DIAMETER_ProtocolModule_Generator +* https://github.com/eclipse/titan.ProtocolModules.DNS +* https://github.com/eclipse/titan.ProtocolModules.ICMP +* https://github.com/eclipse/titan.ProtocolModules.ICMPv6 +* https://github.com/eclipse/titan.ProtocolModules.IP +* https://github.com/eclipse/titan.ProtocolModules.RTP +* https://github.com/eclipse/titan.ProtocolModules.RTSP +* https://github.com/eclipse/titan.ProtocolModules.SMPP +* https://github.com/eclipse/titan.ProtocolModules.SMTP +* https://github.com/eclipse/titan.ProtocolModules.SNMP +* https://github.com/eclipse/titan.ProtocolModules.TCP +* https://github.com/eclipse/titan.ProtocolModules.UDP +* https://github.com/eclipse/titan.ProtocolModules.XMPP diff --git a/README.mingw b/README.mingw new file mode 100644 index 000000000..6169d871c --- /dev/null +++ b/README.mingw @@ -0,0 +1,48 @@ +****************************************************************************** +* Copyright (c) 2000-2015 Ericsson Telecom AB +* All rights reserved. This program and the accompanying materials +* are made available under the terms of the Eclipse Public License v1.0 +* which accompanies this distribution, and is available at +* http://www.eclipse.org/legal/epl-v10.html +****************************************************************************** + +MinGW setup + + (A) Download the MinGW installer from the MinGW site: + http://www.mingw.org/ + + (B) Follow the install steps found on the MinGW getting started page: + http://www.mingw.org/wiki/getting_started + Select the mingw-gcc-v3 packages because Titan only compiles + with older gcc. If you select the gcc4 packages, then the make process + stops immediately with some error messages. Select the msys packages too. + + (C) Check the PATH system variable: + System -> Advanced system settings -> Environment Variables -> Path + The MinGW installation path must be present to use the installed + executables and files. For example: + echo %PATH% + C:\MinGW\bin;C:\MinGW\usr\bin... + + (D) Working environment: + Use the <Install folder>\msys\<version>\msys.bat file to start a shell. + Download and extract the Titan source files and folders to a directory, + and create a Makefile.personal in the top directory. Please check the + installation guide and set all the needed variables like TTCN3_DIR. The + MinGW compilation needs a few extra changes in the Makefile.cfg also. Set + the PLATFORM and MINGW values: + PLATFORM := WIN32 + MINGW := -DMINGW -mno-cygwin + + (E) Compile Titan: + cd titan + make -j + make install + The compiled files will be placed into the ./Install directory. + + (F) If the build process stops with a Windows error message saying that some files + are missing, search for the indicated Cygwin package and download it from the Cygwin page. + You can search fast and easily with the Cygwin Package Search tool: + https://cygwin.com/cgi-bin2/package-grep.cgi + Extract the downloaded package into the MinGW installation directory, and + restart the build process. diff --git a/common/config_preproc_la.l b/common/config_preproc_la.l index 316b6349f..1699f33a9 100644 --- a/common/config_preproc_la.l +++ b/common/config_preproc_la.l @@ -142,6 +142,7 @@ MACRO_REFERENCE_INT \$"{"{WS}{TTCN3IDENTIFIER}{WS}(","{WS}integer{WS})?"}" } "["{WS}LOGGING{WS}"]" BEGIN(INITIAL); +"["{WS}PROFILER{WS}"]" BEGIN(INITIAL); "["{WS}EXECUTE{WS}"]" BEGIN(INITIAL); "["{WS}EXTERNAL_COMMANDS{WS}"]" BEGIN(INITIAL); "["{WS}GROUPS{WS}"]" BEGIN(INITIAL); diff --git a/common/version.h b/common/version.h index b6472c04e..a72a783c6 100644 --- a/common/version.h +++ b/common/version.h @@ -10,7 +10,7 @@ /* Version numbers */ #define TTCN3_MAJOR 5 -#define TTCN3_MINOR 1 +#define TTCN3_MINOR 2 #define TTCN3_PATCHLEVEL 0 //#define TTCN3_BUILDNUMBER 0 @@ -22,7 +22,7 @@ * TTCN3_VERSION = TTCN3_MAJOR * 1000000 + TTCN3_MINOR * 10000 + * TTCN3_PATCHLEVEL * 100 + TTCN3_BUILDNUMBER */ -#define TTCN3_VERSION 50100 +#define TTCN3_VERSION 50200 /* A monotonically increasing version number. * An official release is deemed to have the highest possible build number (99) diff --git a/compiler2/AST.cc b/compiler2/AST.cc index 3f45141d0..4cfcad260 100644 --- a/compiler2/AST.cc +++ b/compiler2/AST.cc @@ -263,17 +263,10 @@ namespace Common { return versions; } - void Modules::add_types_to_json_schema(JSON_Tokenizer& json) + void Modules::generate_json_schema(JSON_Tokenizer& json, map<Type*, JSON_Tokenizer>& json_refs) { for(size_t i = 0; i < mods_v.size(); ++i) { - mods_v[i]->add_types_to_json_schema(json); - } - } - - void Modules::add_func_to_json_schema(map<Type*, JSON_Tokenizer>& json_refs) - { - for(size_t i = 0; i < mods_v.size(); ++i) { - mods_v[i]->add_func_to_json_schema(json_refs); + mods_v[i]->generate_json_schema(json, json_refs); } } @@ -807,6 +800,12 @@ namespace Common { mputprintf(effective_module_functions, "%s\"%s\"", (effective_module_functions ? ", " : ""), get_modid().get_dispname().c_str()); } + if (profiler_enabled && MOD_TTCN == get_moduletype()) { + output->source.static_function_bodies = mputprintf(output->source.static_function_bodies, + "TTCN3_Stack_Depth stack_depth;\n" + "ttcn3_prof.enter_function(\"%s\", 0, \"%s\");\n", + get_filename(), get_modid().get_dispname().c_str()); + } } output->source.static_function_bodies = mputstr(output->source.static_function_bodies, output->functions.pre_init); @@ -844,6 +843,12 @@ namespace Common { mputprintf(effective_module_functions, "%s\"%s\"", (effective_module_functions ? ", " : ""), get_modid().get_dispname().c_str()); } + if (profiler_enabled && MOD_TTCN == get_moduletype()) { + output->source.static_function_bodies = mputprintf(output->source.static_function_bodies, + "TTCN3_Stack_Depth stack_depth;\n" + "ttcn3_prof.enter_function(\"%s\", 0, \"%s\");\n", + get_filename(), get_modid().get_dispname().c_str()); + } } output->source.static_function_bodies = mputstr(output->source.static_function_bodies, output->functions.post_init); diff --git a/compiler2/AST.hh b/compiler2/AST.hh index 693559ca6..ddb99c274 100644 --- a/compiler2/AST.hh +++ b/compiler2/AST.hh @@ -116,14 +116,15 @@ namespace Common { void generate_code(CodeGenHelper& cgh); void dump(unsigned level=1) const; - /** Generates JSON schema segments for the types defined in the modules - * and adds them to the JSON schema parameter. */ - void add_types_to_json_schema(JSON_Tokenizer& json); - - /** Generates JSON schemas containing references to the types defined in the - * modules. Information related to the types' JSON encoding and decoding - * functions is also inserted after the references. */ - void add_func_to_json_schema(map<Type*, JSON_Tokenizer>& json_refs); + /** Generates JSON schema segments for the types defined in the modules, + * and references to these types. Information related to the types' + * JSON encoding and decoding functions is also inserted after the references. + * + * @param json JSON document containing the main schema, schema segments for + * the types will be inserted here + * @param json_refs map of JSON documents containing the references and function + * info related to each type */ + void generate_json_schema(JSON_Tokenizer& json, map<Type*, JSON_Tokenizer>& json_refs); }; /** @@ -391,15 +392,15 @@ namespace Common { void generate_code(CodeGenHelper& cgh); virtual void dump(unsigned level) const; - /** Generates JSON schema segments for the types defined in the module - * and adds them to the JSON schema parameter. */ - virtual void add_types_to_json_schema(JSON_Tokenizer&) = 0; - - /** Generates JSON schemas containing references to the types that have JSON - * encoding and/or decoding functions declared in the module. Information - * related to these functions is also inserted after the references - * (only for TTCN-3 modules). */ - virtual void add_func_to_json_schema(map<Type*, JSON_Tokenizer>&) = 0; + /** Generates JSON schema segments for the types defined in the modules, + * and references to these types. Information related to the types' + * JSON encoding and decoding functions is also inserted after the references. + * + * @param json JSON document containing the main schema, schema segments for + * the types will be inserted here + * @param json_refs map of JSON documents containing the references and function + * info related to each type */ + virtual void generate_json_schema(JSON_Tokenizer& json, map<Type*, JSON_Tokenizer>& json_refs) = 0; }; /** diff --git a/compiler2/CompilerError.cc b/compiler2/CompilerError.cc index 88b5accf5..2b438fa90 100644 --- a/compiler2/CompilerError.cc +++ b/compiler2/CompilerError.cc @@ -298,7 +298,7 @@ namespace Common { if (++error_count >= max_errors) { fputs("Maximum number of errors reached, aborting.\n", stderr); fflush(stderr); - abort(); + exit(EXIT_FAILURE); } } diff --git a/compiler2/Makefile b/compiler2/Makefile index e5a183376..61ef64fc5 100644 --- a/compiler2/Makefile +++ b/compiler2/Makefile @@ -68,7 +68,7 @@ main.cc Real.cc Setting.cc SigParam.cc string.cc subtype.cc Stopwatch.cc \ Type.cc Type_chk.cc Type_codegen.cc TypeCompat.cc \ Typestuff.cc ustring.cc Value.cc Valuestuff.cc XerAttributes.cc subtypestuff.cc CodeGenHelper.cc -MFGEN_SOURCES := makefile.c xpather.cc +MFGEN_SOURCES := makefile.c xpather.cc ProjectGenHelper.cc TCOV2LCOV_SOURCES := tcov2lcov.cc diff --git a/compiler2/ProjectGenHelper.cc b/compiler2/ProjectGenHelper.cc new file mode 100644 index 000000000..991449e58 --- /dev/null +++ b/compiler2/ProjectGenHelper.cc @@ -0,0 +1,744 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2000-2014 Ericsson Telecom AB +// All rights reserved. This program and the accompanying materials +// are made available under the terms of the Eclipse Public License v1.0 +// which accompanies this distribution, and is available at +// http://www.eclipse.org/legal/epl-v10.html +/////////////////////////////////////////////////////////////////////////////// +#include "ProjectGenHelper.hh" +#include "../common/memory.h" + +#include "error.h" +#include <limits> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +const std::string ProjectDescriptor::emptyString = std::string(); + +ProjectDescriptor::ProjectDescriptor(const char * name) : + projectName(std::string(name)), + tpdFileName(), + targetExecutableName(), + projectAbsTpdDir(), + projectAbsWorkingDir(), + projectWorkingDir(), + library(false), + dynamicLinked(false), + referencedProjects(), + refProjWorkingDirs(), + libSearchPaths(), + linkerLibraries(), + ttcn3ModuleNames(), + asn1ModuleNames(), + userSources(), + userHeaders(), + ttcnPP(), + initialized(false) +{} + +void ProjectDescriptor::cleanUp() +{ + referencedProjects.clear(); + refProjWorkingDirs.clear(), + libSearchPaths.clear(); + linkerLibraries.clear(); + ttcn3ModuleNames.clear(); + asn1ModuleNames.clear(); + userSources.clear(); + userHeaders.clear(); + ttcnPP.clear(); +} + +bool ProjectDescriptor::isInitialized() +{ + if (!projectName.empty() && + !targetExecutableName.empty() && + !projectAbsTpdDir.empty() && + !projectAbsWorkingDir.empty() && + !projectWorkingDir.empty()) + initialized = true; + return initialized; +} + +void ProjectDescriptor::setTPDFileName(const char* name) +{ + const char SEPARATOR = '/'; + std::string fileName(name); + size_t refProjPos = fileName.find_last_of(SEPARATOR); + if (std::string::npos == refProjPos) { + tpdFileName = fileName; + } + else { + tpdFileName = fileName.substr(refProjPos + 1); + } +} + +void ProjectDescriptor::setProjectAbsWorkingDir(const char* name) +{ + if (!name) { + ERROR("No path was given to the working directory. Check if 'r' flag is set "); + return; + } + projectAbsWorkingDir = std::string(name); + ProjectGenHelper::Instance().setRootDirOS(name); +} + +void ProjectDescriptor::addToReferencedProjects(const char* refProjName) +{ + std::vector<std::string>::iterator it; + for (it = referencedProjects.begin(); it != referencedProjects.end(); ++it) { + if (*it == std::string(refProjName)) return; + } + referencedProjects.push_back(std::string(refProjName)); +} + +void ProjectDescriptor::addToRefProjWorkingDirs(const std::string& subProjDir) +{ + std::vector<std::string>::iterator it; + for (it = refProjWorkingDirs.begin(); it != refProjWorkingDirs.end(); ++it) { + if (*it == subProjDir) return; + } + refProjWorkingDirs.push_back(subProjDir); +} + +bool ProjectDescriptor::hasLinkerLibTo(const std::string& refProjName) const +{ + ProjectDescriptor* refProj = ProjectGenHelper::Instance().getTargetOfProject(refProjName.c_str()); + for (size_t i = 0; i < referencedProjects.size(); ++i){ + if (refProj && refProj->library) return true; + } + return false; +} + +bool ProjectDescriptor::hasLinkerLib(const char* libName) const +{ + std::string linkerLibName(libName); + std::vector<std::string>::const_iterator it; + for (it = linkerLibraries.begin(); it != linkerLibraries.end(); ++it) { + if (*it == linkerLibName) return true; + } + return false; +} + +void ProjectDescriptor::addToLibSearchPaths(const char* libSearchPath) +{ + std::string searchPath(libSearchPath); + std::vector<std::string>::iterator it; + for (it = libSearchPaths.begin(); it != libSearchPaths.end(); ++it) { + if (*it == searchPath) return; + } + libSearchPaths.push_back(libSearchPath); +} + +void ProjectDescriptor::addToLinkerLibs(const char* linkerLibs) +{ + std::string llibs(linkerLibs); + std::vector<std::string>::iterator it; + for (it = linkerLibraries.begin(); it != linkerLibraries.end(); ++it) { + if (*it == llibs) return; + } + linkerLibraries.push_back(linkerLibs); +} + +size_t ProjectDescriptor::getLibSearchPathIndex(const std::string& subProjName) const +{ + + for (size_t i = 0; i < libSearchPaths.size(); ++i) { + if (std::string::npos != libSearchPaths[i].find(subProjName)) + return i; + } + return std::numeric_limits<unsigned int>::max(); +} + +const char* ProjectDescriptor::getLibSearchPath(const std::string& subProjName) const +{ + for (size_t i = 0; i < libSearchPaths.size(); ++i) { + if (std::string::npos != libSearchPaths[i].find(subProjName)) + return libSearchPaths[i].c_str(); + } + return NULL; +} + +bool ProjectDescriptor::hasTtcn3ModuleName(const char* moduleName) const +{ + std::string modName(moduleName); + std::vector<std::string>::const_iterator it; + for (it = ttcn3ModuleNames.begin(); it != ttcn3ModuleNames.end(); ++it) { + if (*it == modName) return true; + } + return false; +} + +bool ProjectDescriptor::hasAsn1ModuleName(const char* moduleName) const +{ + std::string modName(moduleName); + std::vector<std::string>::const_iterator it; + for (it = asn1ModuleNames.begin(); it != asn1ModuleNames.end(); ++it) { + if (*it == modName) return true; + } + return false; +} + +bool ProjectDescriptor::hasUserSource(const char* userSourceName) const +{ + std::string sourceName(userSourceName); + std::vector<std::string>::const_iterator it; + for (it = userSources.begin(); it != userSources.end(); ++it) { + if (*it == sourceName) return true; + } + return false; +} + +bool ProjectDescriptor::hasUserHeader(const char* userHeaderName) const +{ + std::string headerName(userHeaderName); + std::vector<std::string>::const_iterator it; + for (it = userHeaders.begin(); it != userHeaders.end(); ++it) { + if (*it == headerName) return true; + } + return false; +} + +bool ProjectDescriptor::hasTtcn3PP(const char* ttcnPPName) const +{ + std::string ttcnPPFile(ttcnPPName); + std::vector<std::string>::const_iterator it; + for (it = ttcnPP.begin(); it != ttcnPP.end(); ++it) { + if (*it == ttcnPPFile) return true; + } + return false; +} + +std::string ProjectDescriptor::setRelativePathTo(const std::string& absPathTo) +{ + if (projectAbsWorkingDir.empty()) return std::string(); + const char SEPARATOR = '/'; + if (projectAbsWorkingDir.at(0) != SEPARATOR || absPathTo.at(0) != SEPARATOR) + ERROR("Expecting absolute path to generate LinkerLibSearchPath "); + size_t length = projectAbsWorkingDir.size() > absPathTo.size() ? absPathTo.size() : projectAbsWorkingDir.size(); + size_t lastSlash = 0; + size_t i; + for(i = 0; i < length && projectAbsWorkingDir.at(i) == absPathTo.at(i); ++i) { + if (projectAbsWorkingDir.at(i) == SEPARATOR && absPathTo.at(i) == SEPARATOR) { + lastSlash = i; // the same path until now... + } + } + if (length == i) { // got subdirectory + if (projectAbsWorkingDir == absPathTo) { + return std::string("."); // the same pathes were given + } + else if ((projectAbsWorkingDir.size() > absPathTo.size() && projectAbsWorkingDir.at(length) == SEPARATOR) || + (projectAbsWorkingDir.size() < absPathTo.size() && absPathTo.at(length) == SEPARATOR)) + lastSlash = length; + } + + size_t slashCount = 0; + for (size_t i = lastSlash; i < projectAbsWorkingDir.size(); ++i) { + if (projectAbsWorkingDir.at(i) == SEPARATOR) + ++slashCount; + } + + std::string relPath; + const std::string upDir("../"); + for (size_t i = 0; i < slashCount; ++i) + relPath.append(upDir); + + std::string pathTo = absPathTo.substr(lastSlash+1); // we left the heading slash + relPath.append(pathTo); + return std::string(relPath); +} + +void ProjectDescriptor::print() +{ + fprintf( stderr, "project name %s and it is %s initialized\n", projectName.c_str(), isInitialized() ? "" : "not"); + fprintf( stderr, " target executable name %s\n",targetExecutableName.c_str()); + fprintf( stderr, " project abs TPD dir %s\n", projectAbsTpdDir.c_str()); + fprintf( stderr, " project abs working dir %s\n", projectAbsWorkingDir.c_str()); + fprintf( stderr, " project working dir %s\n", projectWorkingDir.c_str()); + fprintf( stderr, " project is %s\n", library ? "Library" : "Executable"); + fprintf( stderr, " project linking is %s\n", dynamicLinked ? "dynamic" : "static"); + std::vector<std::string>::iterator it; + for (it = referencedProjects.begin(); it != referencedProjects.end(); ++it) { + fprintf( stderr, " Referenced project %s\n",(*it).c_str()); + } + for (it = refProjWorkingDirs.begin(); it != refProjWorkingDirs.end(); ++it) { + fprintf( stderr, " Working dir of referenced project %s\n",(*it).c_str()); + } + for (it = linkerLibraries.begin(); it != linkerLibraries.end(); ++it) { + fprintf( stderr, " Linker library %s\n", (*it).c_str()); + } + for (it = libSearchPaths.begin(); it != libSearchPaths.end(); ++it) { + fprintf( stderr, " Linker lib search path %s\n", (*it).c_str()); + } + for (it = ttcn3ModuleNames.begin(); it != ttcn3ModuleNames.end(); ++it) { + fprintf( stderr, " TTCN3 Module Name: %s\n", (*it).c_str()); + } + for (it = asn1ModuleNames.begin(); it != asn1ModuleNames.end(); ++it) { + fprintf( stderr, " ASN1 Module Name: %s\n", (*it).c_str()); + } + for (it = userSources.begin(); it != userSources.end(); ++it) { + fprintf( stderr, " Source Name: %s\n", (*it).c_str()); + } + for (it = userHeaders.begin(); it != userHeaders.end(); ++it) { + fprintf( stderr, " Header Name: %s\n", (*it).c_str()); + } + for (it = ttcnPP.begin(); it != ttcnPP.end(); ++it) { + fprintf( stderr, " TTCN PP Name: %s\n", (*it).c_str()); + } + fprintf( stderr, "\n"); +} + +ProjectGenHelper& ProjectGenHelper::Instance() +{ + static ProjectGenHelper singleton; + return singleton; +} + +const std::string ProjectGenHelper::emptyString = std::string(); + +ProjectGenHelper::ProjectGenHelper() : + nameOfTopLevelProject(), + rootDirOS(), + relPathToRootDirOS(), + Zflag(false), + Wflag(false), + Hflag(false), + projs(), + checkedProjs() +{} + +void ProjectGenHelper::addTarget(const char* projName) +{ + if (!Zflag) return; + if (projs.end() != projs.find(std::string(projName))) return; // we have it + ProjectDescriptor newLib(projName); + projs.insert(std::pair<std::string, ProjectDescriptor> (std::string(projName), newLib)); +} + +void ProjectGenHelper::setToplevelProjectName(const char* name) +{ + if (!nameOfTopLevelProject.empty()) return; + nameOfTopLevelProject = std::string(name); +} + +void ProjectGenHelper::setRootDirOS( const char* name) +{ + if (rootDirOS.empty()) { + rootDirOS = std::string(name); + } + else { //compare the 2 string and get the common part + const char* root = rootDirOS.c_str(); + const char* head = root; + for (; *root++ == *name++; ) ; + size_t length = root - head - 1; //minus the non-matching + if (rootDirOS.size() > length) { + rootDirOS.resize(length); + } + } +} + +const std::string& ProjectGenHelper::getRootDirOS(const char* name) +{ + ProjectDescriptor* proj = getProject(name); + if (!proj) return emptyString; + relPathToRootDirOS = proj->setRelativePathTo(rootDirOS); + return relPathToRootDirOS; +} + +ProjectDescriptor* ProjectGenHelper::getTargetOfProject(const char* projName) +{ + if (!Zflag) return NULL; + if (projs.end() == projs.find(std::string(projName))) return NULL; + return getProject(projName); +} + +const ProjectDescriptor* ProjectGenHelper::getTargetOfProject(const char* projName) const +{ + if (!Zflag) return NULL; + if (projs.end() == projs.find(std::string(projName))) return NULL; + return getProject(projName); +} + +ProjectDescriptor* ProjectGenHelper::getProjectDescriptor(const char* targetName) +{ + if (!Zflag) return NULL; + for (std::map<std::string, ProjectDescriptor>::iterator it = projs.begin(); it != projs.end(); ++it) { + if ((it->second).getTargetExecName() == std::string(targetName)) + return &(it->second); + } + return NULL; +} + +std::map<std::string, ProjectDescriptor>::const_iterator ProjectGenHelper::getHead() const +{ + return projs.begin(); +} + +std::map<std::string, ProjectDescriptor>::const_iterator ProjectGenHelper::getEnd() const +{ + return projs.end(); +} + +void ProjectGenHelper::addTtcn3ModuleToProject(const char* projName, const char* moduleName) +{ + if (!Zflag) return; + if (projs.end() == projs.find(std::string(projName))) return; + ProjectDescriptor* proj = getProject(projName); + if (proj && !proj->hasTtcn3ModuleName(moduleName)) { + proj->addTtcn3ModuleName(moduleName); + } +} + +void ProjectGenHelper::addAsn1ModuleToProject(const char* projName, const char* moduleName) +{ + if (!Zflag) return; + if (projs.end() == projs.find(std::string(projName))) return; + ProjectDescriptor* proj = getProject(projName); + if (proj &&!proj->hasAsn1ModuleName(moduleName)) { + proj->addAsn1ModuleName(moduleName); + } +} + +void ProjectGenHelper::addUserSourceToProject(const char* projName, const char* userSourceName) +{ + if (!Zflag) return; + if (projs.end() == projs.find(std::string(projName))) return; + ProjectDescriptor* proj = getProject(projName); + if (proj && !proj->hasUserSource(userSourceName)) { + proj->addUserSource(userSourceName); + } +} + +void ProjectGenHelper::addUserHeaderToProject(const char* projName, const char* userHeaderName) +{ + if (!Zflag) return; + if (projs.end() == projs.find(std::string(projName))) return; + ProjectDescriptor* proj = getProject(projName); + if (proj && !proj->hasUserHeader(userHeaderName)) { + proj->addUserHeader(userHeaderName); + } +} + +void ProjectGenHelper::addTtcnPPToProject(const char* projName, const char* ttcnPPName) +{ + if (!Zflag) return; + if (projs.end() == projs.find(std::string(projName))) return; + ProjectDescriptor* proj = getProject(projName); + if (proj && !proj->hasTtcn3PP(ttcnPPName)) { + proj->addTtcn3PP(ttcnPPName); + } +} + +void ProjectGenHelper::generateRefProjectWorkingDirsTo(const char* projName) +{ + if (!Zflag) return; + std::map<std::string,ProjectDescriptor>::iterator iter = projs.find(projName); + if (projs.end() == iter) { + ERROR("Project \"%s\" is not found in the project hierarchy ", projName); + return; + } + if (nameOfTopLevelProject != (iter->second).getProjectName()) { + ERROR("Project \"%s\" is not the on the top-level ", projName); + return; + } + ProjectDescriptor* proj = &(iter->second); // the Top level project + + for (size_t i = 0; i < proj->numOfReferencedProjects(); ++i) { + const std::string& refProjName = proj->getReferencedProject(i); + ProjectDescriptor* refProj = getTargetOfProject(refProjName.c_str()); + if (!refProj) return; // for sure... + const std::string& absWorkingDir = refProj->getProjectAbsWorkingDir(); + if (!absWorkingDir.empty()) { + std::string relPath = proj->setRelativePathTo(absWorkingDir); + proj->addToRefProjWorkingDirs(relPath); + } + } +} + +size_t ProjectGenHelper::numOfLibs() const +{ + if (!Zflag) return 0; + size_t num = 0; + for (std::map<std::string, ProjectDescriptor>::const_iterator it = projs.begin(); it != projs.end(); ++it) { + if ((it->second).isLibrary()) { + ++num; + } + } + return num; +} + +struct CompareStr +{ + bool operator () (const char* lhs, const char* rhs) { + int ret = strcmp(lhs, rhs); + return (0 > ret); + } +}; + +void ProjectGenHelper::getExternalLibs(std::vector<const char*>& extLibs) +{ + if (!Zflag) return; + std::map<const char*, const char*, CompareStr> libs; + for (std::map<std::string, ProjectDescriptor>::iterator it = projs.begin(); it != projs.end(); ++it) { + if ((it->second).numOfLinkerLibs() > 0) { + for (size_t i = 0; i < (it->second).numOfLinkerLibs(); ++i) { + const char* key = (it->second).getLinkerLib(i); + const char* value = (it->second).getProjectName().c_str(); + libs.insert(std::pair<const char*,const char*>(key,value)); // filter duplicates + } + } + } + std::map<const char*, const char*>::iterator it; + for (it = libs.begin(); it != libs.end(); ++it) { + extLibs.push_back(it->first); + } +} + +void ProjectGenHelper::getExternalLibSearchPathes(std::vector<const char*>& extLibPathes) +{ + if (!Zflag) return; + std::map<const char*, const char*, CompareStr> libPathes; + for (std::map<std::string, ProjectDescriptor>::iterator it = projs.begin(); it != projs.end(); ++it) { + if ((it->second).numOfLibSearchPaths() > 0) { + for (size_t i = 0; i < (it->second).numOfLibSearchPaths(); ++i) { + const char* key = (it->second).getLibSearchPath(i); + const char* value = (it->second).getProjectName().c_str(); + libPathes.insert(std::pair<const char*,const char*>(key,value)); // filter duplicates + } + } + } + std::map<const char*, const char*>::iterator it; + for (it = libPathes.begin(); it != libPathes.end(); ++it) { + extLibPathes.push_back(it->first); + } +} + +bool ProjectGenHelper::hasReferencedProject() +{ + if (!Zflag) return false; + ProjectDescriptor* topLevel = getTargetOfProject(nameOfTopLevelProject.c_str()); + if (topLevel && topLevel->numOfReferencedProjects()) return true; + return false; +} + +bool ProjectGenHelper::isTtcn3ModuleInLibrary(const char* moduleName) const +{ + if (!Zflag) return false; + for (std::map<std::string, ProjectDescriptor>::const_iterator it = projs.begin(); it != projs.end(); ++it) { + if ((it->second).hasTtcn3ModuleName(moduleName) && (it->second).isLibrary()) return true; + } + return false; +} + +bool ProjectGenHelper::isAsn1ModuleInLibrary(const char* moduleName) const +{ + if (!Zflag) return false; + for (std::map<std::string, ProjectDescriptor>::const_iterator it = projs.begin(); it != projs.end(); ++it) { + if ((it->second).hasAsn1ModuleName(moduleName) && (it->second).isLibrary()) return true; + } + return false; +} + +bool ProjectGenHelper::isSourceFileInLibrary(const char* fileName) const +{ + if (!Zflag || NULL == fileName) return false; + for (std::map<std::string, ProjectDescriptor>::const_iterator it = projs.begin(); it != projs.end(); ++it) { + if ((it->second).hasUserSource(fileName) && (it->second).isLibrary()) return true; + } + return false; +} + +bool ProjectGenHelper::isHeaderFileInLibrary(const char* fileName) const +{ + if (!Zflag || NULL == fileName) return false; + + for (std::map<std::string, ProjectDescriptor>::const_iterator it = projs.begin(); it != projs.end(); ++it) { + if ((it->second).hasUserHeader(fileName) && (it->second).isLibrary()) return true; + } + return false; +} + +bool ProjectGenHelper::isTtcnPPFileInLibrary(const char* fileName) const +{ + if (!Zflag || NULL == fileName) return false; + + for (std::map<std::string, ProjectDescriptor>::const_iterator it = projs.begin(); it != projs.end(); ++it) { + if ((it->second).hasTtcn3PP(fileName) && (it->second).isLibrary()) return true; + } + return false; +} + +bool ProjectGenHelper::isCPPSourceFile(const char* fileName) const +{ + std::string fnStr(fileName); + size_t pos = fnStr.find_last_of('.'); + if (std::string::npos == pos) return false; + const std::string EXT_CC("cc"); + const std::string EXT_CPP("cpp"); + int length = 0; + if (std::string::npos != fnStr.find (EXT_CC, pos + 1)) + length = EXT_CC.size(); + else if (std::string::npos != fnStr.find (EXT_CPP, pos + 1)) + length = EXT_CPP.size(); + + if (length && fnStr.size() == pos + length + 1) + return true; + else + return false; +} + +bool ProjectGenHelper::isCPPHeaderFile(const char* fileName) const +{ + std::string fnStr(fileName); + size_t pos = fnStr.find_last_of('.'); + if (std::string::npos == pos) return false; + const std::string EXT_HPP("hpp"); + const std::string EXT_HH("hh"); + const std::string EXT_H("h"); + int length = 0; + if (std::string::npos != fnStr.find (EXT_HH, pos + 1)) + length = EXT_HH.size(); + else if (std::string::npos != fnStr.find (EXT_HPP, pos + 1)) + length = EXT_HPP.size(); + else if (std::string::npos != fnStr.find (EXT_H, pos + 1)) + length = EXT_H.size(); + + if (length && fnStr.size() == pos + length + 1) + return true; + else + return false; +} + +bool ProjectGenHelper::isTtcnPPFile(const char* fileName) const +{ + std::string fnStr(fileName); + size_t pos = fnStr.find_last_of('.'); + if (std::string::npos == pos) return false; + const std::string EXT_TTCNPP("ttcnpp"); + int length = 0; + if (std::string::npos != fnStr.find (EXT_TTCNPP, pos + 1)) + length = EXT_TTCNPP.size(); + + if (length && fnStr.size() == pos + length + 1) + return true; + else + return false; +} + +void ProjectGenHelper::print() +{ + if (!Zflag) return; + fprintf(stderr, "Top Level project : %s\n", nameOfTopLevelProject.c_str()); + for (std::map<std::string, ProjectDescriptor>::iterator it = projs.begin(); it != projs.end(); ++it) { + (it->second).print(); + } +} + +bool ProjectGenHelper::sanityCheck() +{ + if (!Zflag) return true; + bool ret = true; +// if toplevel is a dynamic linked executable (not library) all executable shall set to the same linking method + { + ProjectDescriptor* topLevel = getTargetOfProject(nameOfTopLevelProject.c_str()); + bool isDynamicLinked = topLevel->getLinkingStrategy(); + if (!topLevel->isLibrary() && isDynamicLinked) { // dynamic linked executable + for (std::map<std::string, ProjectDescriptor>::iterator it = projs.begin(); it != projs.end(); ++it) { + if (!(it->second).isLibrary()) { //if exectubale + if (isDynamicLinked != (it->second).getLinkingStrategy()) { + ERROR("project \"%s\" is set to %s linking. Sub project \"%s\" is set to %s linking. " + "All sub-level executable shall be set to the %s's type.", + nameOfTopLevelProject.c_str(), + isDynamicLinked ? "dynamic" : "static", + ((it->second).getProjectName()).c_str(), + isDynamicLinked ? "static" : "dynamic", + nameOfTopLevelProject.c_str()); + ret = false; + } + } + } + } + } + +// under a dynamic linked library every project shall be linked dynamic library too. + { + checkedProjs.clear(); + bool found = false; // search for executable under dynamic linked library + char* execName = NULL; + for (std::map<std::string, ProjectDescriptor>::reverse_iterator rit = projs.rbegin(); rit != projs.rend(); ++rit) { + if ((rit->second).isLibrary() && (rit->second).getLinkingStrategy()) { //dynamic library + ProjectDescriptor& proj = rit->second; + found = DynamicLibraryChecker(&proj, found, &execName); + if (found) { + ERROR("Project \"%s\" is dynamic linked library. Sub project \"%s\" is executable.\n" + "in TPD file, %s's all sub-level defaultTarget shall be set library too.", + proj.getProjectName().c_str(), execName, proj.getProjectName().c_str()); + ret = false; + break; + } + } + } + } + + return ret; +} + +ProjectDescriptor* ProjectGenHelper::getProject(const char* projName) +{ + if (!projName) return NULL; + for (std::map<std::string, ProjectDescriptor>::iterator it = projs.begin(); it != projs.end(); ++it) { + if (it->first == std::string(projName)) { + return &(it->second); + } + } + return NULL; +} + +const ProjectDescriptor* ProjectGenHelper::getProject(const char* projName) const +{ + if (!projName) return NULL; + for (std::map<std::string, ProjectDescriptor>::const_iterator it = projs.begin(); it != projs.end(); ++it) { + if (it->first == std::string(projName)) { + return &(it->second); + } + } + return NULL; +} + + +void ProjectGenHelper::cleanUp() +{ + if (!Zflag) return; + checkedProjs.clear(); + for (std::map<std::string, ProjectDescriptor>::iterator it = projs.begin(); it != projs.end(); ++it) { + (it->second).cleanUp(); + } +} + +bool ProjectGenHelper::DynamicLibraryChecker(const ProjectDescriptor* desc, + bool& found, + char** executableName) +{ + if (found || !desc) return true; + for (size_t i = 0; i < desc->numOfReferencedProjects(); ++i) { + char* refProjName = const_cast<char*> (desc->getReferencedProject(i).c_str()); + const ProjectDescriptor* subProj = getTargetOfProject(refProjName); + if (0 == checkedProjs.count(subProj->getProjectName())) { + if (subProj->isLibrary()) { + found = DynamicLibraryChecker(subProj, found, executableName); + } + else { // search for executable under dynamic linked library + found = true; + *executableName = refProjName; + break; + } + } + } + // it is checked, no such executable was found. Store it not to iterate again + if (!found) + checkedProjs.insert(std::pair<const std::string, const ProjectDescriptor*> + (desc->getProjectName(), desc)); + return found; +} + diff --git a/compiler2/ProjectGenHelper.hh b/compiler2/ProjectGenHelper.hh new file mode 100644 index 000000000..638633bdb --- /dev/null +++ b/compiler2/ProjectGenHelper.hh @@ -0,0 +1,157 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2000-2014 Ericsson Telecom AB +// All rights reserved. This program and the accompanying materials +// are made available under the terms of the Eclipse Public License v1.0 +// which accompanies this distribution, and is available at +// http://www.eclipse.org/legal/epl-v10.html +/////////////////////////////////////////////////////////////////////////////// +#ifndef _LIB_GEN_HELPER_HH +#define _LIB_GEN_HELPER_HH +#include <string> +#include <map> +#include <vector> +#include <cstdio> +class ProjectGenHelper; +class ProjectDescriptor { +public: + explicit ProjectDescriptor(const char* name); + ~ProjectDescriptor() { cleanUp(); }; + + const std::string& getProjectName() const { return projectName; } + void setTPDFileName( const char* name); + const std::string& getTPDFileName() const { return tpdFileName; } + void setTargetExecName(const char* name) { targetExecutableName = std::string(name); } + const std::string& getTargetExecName() const { return targetExecutableName; } + void setProjectAbsTpdDir(const char* name) { projectAbsTpdDir = std::string(name); } + const std::string& getProjectAbsTpdDir() const { return projectAbsTpdDir; } + void setProjectAbsWorkingDir(const char* name); + void setProjectWorkingDir(const char* name) { projectWorkingDir = std::string(name); } + const std::string& getProjectAbsWorkingDir() const { return projectAbsWorkingDir; } + const std::string& getProjectWorkingDir() const { return projectWorkingDir; } + void setLinkingStrategy(bool strategy) { dynamicLinked = strategy; } + bool getLinkingStrategy() const { return dynamicLinked; } + void setLibrary(bool isLib) { library = isLib; } + bool isLibrary() const { return library; } + bool isInitialized(); + void addToReferencedProjects(const char* refProjName); + void addToRefProjWorkingDirs(const std::string& subProjDir); + bool hasLinkerLibTo(const std::string& refProjName) const; + bool hasLinkerLib(const char* libName) const; // Linker Lib got from TPD + void addToLibSearchPaths(const char* libSearchPath); + void addToLinkerLibs(const char* linkerLibs); + void print(); + void cleanUp(); + size_t numOfReferencedProjects() const { return referencedProjects.size(); }; + size_t numOfRefProjWorkingDirs() const { return refProjWorkingDirs.size(); }; + size_t numOfLibSearchPaths() const { return libSearchPaths.size(); }; + size_t numOfLinkerLibs() const { return linkerLibraries.size(); }; + const std::string& getReferencedProject(size_t index) const + { return index < referencedProjects.size() ? referencedProjects[index] : emptyString; }; + const std::string& getRefProjWorkingDir(size_t index) const + { return index < refProjWorkingDirs.size() ? refProjWorkingDirs[index] : emptyString; }; + const char* getLibSearchPath(const std::string& subProjName) const; + const char* getLibSearchPath(size_t index) const { return libSearchPaths[index].c_str(); }; + const char* getLinkerLib(const std::string& subProjName) const; + const char* getLinkerLib(size_t index) const { return linkerLibraries[index].c_str(); }; + size_t getLibSearchPathIndex(const std::string& subProjName) const; + void setLibSearchPath(size_t index, const std::string& relPath) { libSearchPaths[index] = relPath; }; + void addTtcn3ModuleName(const char* name) { ttcn3ModuleNames.push_back(name); }; + bool hasTtcn3ModuleName(const char* moduleName) const; + void addAsn1ModuleName(const char* name) { asn1ModuleNames.push_back(name); }; + bool hasAsn1ModuleName(const char* moduleName) const; + void addUserSource(const char* name) { userSources.push_back(name); }; + bool hasUserSource(const char* userSourceName) const; + void addUserHeader(const char* name) { userHeaders.push_back(name); }; + bool hasUserHeader(const char* userHeaderName) const; + void addTtcn3PP(const char* name) { ttcnPP.push_back(name); }; + bool hasTtcn3PP(const char* ttcnPPName) const; + std::string setRelativePathTo(const std::string& absPathTo); + +private: + static const std::string emptyString; + std::string projectName; + std::string tpdFileName; + std::string targetExecutableName; //Library or Executable(only the top level) + std::string projectAbsTpdDir; + std::string projectAbsWorkingDir; + std::string projectWorkingDir; + bool library; + bool dynamicLinked; + std::vector<std::string> referencedProjects; + std::vector<std::string> refProjWorkingDirs; + std::vector<std::string> libSearchPaths; + std::vector<std::string> linkerLibraries; + std::vector<std::string> ttcn3ModuleNames; + std::vector<std::string> asn1ModuleNames; + std::vector<std::string> userSources; // *.cc ; *.cpp + std::vector<std::string> userHeaders; // *.hh ; *.h ; *.hpp + std::vector<std::string> ttcnPP; // *.ttcnpp + bool initialized; +}; + +class ProjectGenHelper { +public: + static ProjectGenHelper &Instance(); + ~ProjectGenHelper() { cleanUp(); }; + void setZflag(bool flag) { Zflag = flag; }; + bool getZflag() const { return Zflag; }; + void setWflag(bool flag) { Wflag = flag; }; + bool getWflag() const { return Wflag; }; + void setHflag(bool flag) { Hflag = flag; }; + bool getHflag() const { return Hflag; }; + void setToplevelProjectName(const char* name); + const std::string& getToplevelProjectName() const { return nameOfTopLevelProject; }; + void setRootDirOS(const char* name); + const std::string& getRootDirOS(const char* name); + void addTarget(const char* projName); + void generateRefProjectWorkingDirsTo(const char* projName); + void addTtcn3ModuleToProject(const char* projName, const char* moduleName); + void addAsn1ModuleToProject(const char* projName, const char* moduleName); + void addUserSourceToProject(const char* projName, const char* userSourceName); + void addUserHeaderToProject(const char* projName, const char* userHeaderName); + void addTtcnPPToProject(const char* projName, const char* ttcnPPName); + bool isTtcn3ModuleInLibrary(const char* moduleName) const; + bool isAsn1ModuleInLibrary(const char* moduleName) const; + bool isSourceFileInLibrary(const char* fileName) const; + bool isHeaderFileInLibrary(const char* fileName) const; + bool isTtcnPPFileInLibrary(const char* fileName) const; + ProjectDescriptor* getTargetOfProject(const char* projName); + const ProjectDescriptor* getTargetOfProject(const char* projName) const; + ProjectDescriptor* getProjectDescriptor(const char* targetName); //target_executable_name + std::map<std::string, ProjectDescriptor>::const_iterator getHead() const; + std::map<std::string, ProjectDescriptor>::const_iterator getEnd() const; + size_t numOfLibs() const; + void getExternalLibs(std::vector<const char*>& extLibs); + void getExternalLibSearchPathes(std::vector<const char*>& extLibPathes); + bool hasReferencedProject(); + size_t numOfProjects() const { return projs.size();}; + bool isCPPSourceFile(const char* fileName) const; + bool isCPPHeaderFile(const char* fileName) const; + bool isTtcnPPFile(const char* fileName) const; + void print(); + bool sanityCheck(); // tests if the structure generated from TPDs is consistent + void cleanUp(); + +private: + ProjectGenHelper(); + ProjectGenHelper(const ProjectGenHelper &rhs); + ProjectGenHelper &operator=(const ProjectGenHelper &rhs); + ProjectDescriptor* getProject(const char* projName); + const ProjectDescriptor* getProject(const char* projName) const; + bool DynamicLibraryChecker(const ProjectDescriptor* desc, + bool& found, + char** executableName); +private: + static ProjectGenHelper& intance; + static const std::string emptyString; + std::string nameOfTopLevelProject; + std::string rootDirOS; // make archive needs the top dir on OS level + std::string relPathToRootDirOS; + bool Zflag; // the makefilegen switch wether to use this option at all + bool Wflag; // prefix woring directory + bool Hflag; // hierarchical make structure + std::map<const std::string, ProjectDescriptor> projs; + std::map<const std::string, const ProjectDescriptor*> checkedProjs; +}; + +#endif // _LIB_GEN_HELPER_HH diff --git a/compiler2/Setting.cc b/compiler2/Setting.cc index 64c02b6bb..1dae00b16 100644 --- a/compiler2/Setting.cc +++ b/compiler2/Setting.cc @@ -232,6 +232,12 @@ namespace Common { mputprintf(effective_module_functions, "%s\"%s\"", (effective_module_functions ? ", " : ""), entityname); } + if (profiler_enabled) { + str = mputprintf(str, + "TTCN3_Stack_Depth stack_depth;\n" + "ttcn3_prof.enter_function(\"%s\", %d, \"%s\");\n", + filename, yyloc.first_line, entityname); + } } return str; } @@ -242,6 +248,10 @@ namespace Common { if (include_location_info && !transparency) { str = mputprintf(str, "current_location.update_lineno(%d);\n", yyloc.first_line); + if (profiler_enabled) { + str = mputprintf(str, "ttcn3_prof.execute_line(\"%s\", %d);\n", + get_filename(), yyloc.first_line); + } if (tcov_file_name && in_tcov_files(get_filename())) { effective_module_lines = mputprintf(effective_module_lines, "%s%d", @@ -544,9 +554,9 @@ namespace Common { else return false; } - Type *Scope::get_mtc_system_comptype(bool is_system, bool is_connecting) + Type *Scope::get_mtc_system_comptype(bool is_system) { - if (parent_scope) return parent_scope->get_mtc_system_comptype(is_system, is_connecting); + if (parent_scope) return parent_scope->get_mtc_system_comptype(is_system); else return 0; } diff --git a/compiler2/Setting.hh b/compiler2/Setting.hh index 7ddf07497..82f1bfcb1 100644 --- a/compiler2/Setting.hh +++ b/compiler2/Setting.hh @@ -592,10 +592,9 @@ public: virtual bool has_ass_withId(const Identifier& p_id); virtual bool is_valid_moduleid(const Identifier& p_id); /** Returns the TTCN-3 component type that is associated with - * keywords 'mtc' or 'system'. Returns NULL outside testcase definitions - * (unless it's a 'map' or 'connect' statement block) or if the component type - * cannot be determined. */ - virtual Type *get_mtc_system_comptype(bool is_system, bool is_connecting); + * keywords 'mtc' or 'system'. Returns NULL if the component type + * cannot be determined (i.e. outside testcase definitions). */ + virtual Type *get_mtc_system_comptype(bool is_system); /** Checks the 'runs on' clause of definition \a p_ass that it can * be called from this scope unit. Parameters \a p_loc and \a * p_what are used in error messages. \a p_what contains "call" or diff --git a/compiler2/Type.cc b/compiler2/Type.cc index 2f59ba745..2a9683d3c 100644 --- a/compiler2/Type.cc +++ b/compiler2/Type.cc @@ -573,6 +573,7 @@ namespace Common { ownertype = OT_UNKNOWN; owner = 0; chk_finished = false; + pard_type_instance = false; } void Type::clean_up() @@ -5204,8 +5205,8 @@ end_ext: bool Type::hasEncodeAttr(const MessageEncodingType_t encoding_type) { - if (CT_JSON == encoding_type && - (is_asn1() || (is_ref() && get_type_refd()->is_asn1()))) { + if (CT_JSON == encoding_type && (implicit_json_encoding + || is_asn1() || (is_ref() && get_type_refd()->is_asn1()))) { // ASN.1 types automatically support JSON encoding return true; } @@ -5573,10 +5574,15 @@ end_ext: case T_UNIVERSALSTRING: case T_BMPSTRING: case T_VERDICT: + case T_NULL: + case T_OID: + case T_ROID: + case T_ANY: // these basic types support JSON encoding by default return json_mem.remember(t, ANSWER_YES); case T_SEQ_T: case T_SEQ_A: + case T_OPENTYPE: case T_SET_T: case T_SET_A: case T_CHOICE_T: @@ -5645,7 +5651,7 @@ end_ext: case T_ENUM_T: case T_ENUM_A: break; // check for an encode attribute - default: + default: return json_mem.remember(t, ANSWER_NO); } // switch return json_mem.remember(t, hasEncodeAttr(CT_JSON) ? ANSWER_YES : ANSWER_NO); @@ -6815,10 +6821,6 @@ end_ext: string Type::get_dispname() const { - if (T_REFD == typetype) { - // cannot calculate the display name for referenced types this way - FATAL_ERROR("Type::get_dispname()"); - } string dispname = genname; size_t pos = 0; while(pos < dispname.size()) { diff --git a/compiler2/Type.hh b/compiler2/Type.hh index f15b4e5b6..55737c94b 100644 --- a/compiler2/Type.hh +++ b/compiler2/Type.hh @@ -380,6 +380,11 @@ namespace Common { /** True if chk() has finished running. * Prevents force_raw() from running chk_raw(), chk_text() or chk_json() on unchecked types. */ bool chk_finished; + + /** Signifies that this type is an instance of an ASN.1 parameterized type. + * It will not have its own segment and reference generated in the JSON schema, + * its schema segment will be generated as an embedded type's would. */ + bool pard_type_instance; /** Copy constructor, for the use of Type::clone() only. */ Type(const Type& p); @@ -786,6 +791,7 @@ namespace Common { * If \a v is correct and it is or refers to a constant the constant value * is returned for further checking. Otherwise the return value is NULL. */ Value *chk_range_boundary(Value *v, const char *which, const Location& loc); + void chk_range_boundary_infinity(Value *v, bool is_upper); void chk_this_template_builtin(Template *t); void chk_this_template_Int_Real(Template *t); void chk_this_template_Enum(Template *t); @@ -1128,6 +1134,9 @@ namespace Common { bool is_untagged() const; + inline boolean is_pard_type_instance() { return pard_type_instance; } + inline void set_pard_type_instance() { pard_type_instance = true; } + /** Calculates the type's display name from the genname (replaces double * underscore characters with single ones) */ string get_dispname() const; @@ -1152,6 +1161,10 @@ namespace Common { /** Generates the JSON schema segment that would validate a union type or * an anytype and inserts it into the main schema. */ void generate_json_schema_union(JSON_Tokenizer& json); + + /** Generates a reference to this type's schema segment and inserts it into + * the given schema. */ + void generate_json_schema_ref(JSON_Tokenizer& json); }; /** @} end of AST_Type group */ diff --git a/compiler2/Type_chk.cc b/compiler2/Type_chk.cc index 7aee9f7ea..d3861ebb2 100644 --- a/compiler2/Type_chk.cc +++ b/compiler2/Type_chk.cc @@ -639,8 +639,8 @@ void Type::chk_xer_any_attributes() for (size_t x = 0; x < parent_type->get_nof_comps(); ++x) { CompField * cf = parent_type->get_comp_byIndex(x); if (cf->get_type() != this) continue; - if (cf->has_default() || cf->get_is_optional()) { - error("The field with ANY-ATTRIBUTES cannot be OPTIONAL or DEFAULT"); + if (cf->has_default()) { + error("The field with ANY-ATTRIBUTES cannot have DEFAULT"); } } break; @@ -5613,6 +5613,37 @@ void Type::chk_this_template_Str(Template *t) } } +void Type::chk_range_boundary_infinity(Value *v, bool is_upper) +{ + if (v) { + v->set_my_governor(this); + { + Error_Context cntxt2(v, "In %s boundary", is_upper ? "upper" : "lower"); + chk_this_value_ref(v); + Value *v_last = v->get_value_refd_last(0, EXPECTED_STATIC_VALUE); + if (v_last->get_valuetype() == Value::V_OMIT) { + v->error("`omit' value is not allowed in this context"); + v->set_valuetype(Value::V_ERROR); + return; + } + if (sub_type != NULL) { + if (is_upper) { + if (!sub_type->get_root()->is_upper_limit_infinity()) { + v->error("Infinity is not a valid value for type '%s' which has subtype %s", + asString(), sub_type->to_string().c_str()); + } + } + else { + if (!sub_type->get_root()->is_lower_limit_infinity()) { + v->error("Infinity is not a valid value for type '%s' which has subtype %s", + asString(), sub_type->to_string().c_str()); + } + } + } + } + } +} + Value *Type::chk_range_boundary(Value *v, const char *which, const Location& loc) { @@ -5693,6 +5724,12 @@ void Type::chk_this_template_Int_Real(Template *t) FATAL_ERROR("Type::chk_this_template_Int_Real()"); } } + if (v_lower && !v_upper) { + chk_range_boundary_infinity(v_lower, true); + } + if (!v_lower && v_upper) { + chk_range_boundary_infinity(v_upper, false); + } break;} default: t->error("%s cannot be used for type `%s'", t->get_templatetype_str(), diff --git a/compiler2/Type_codegen.cc b/compiler2/Type_codegen.cc index 6e9679c59..b6baffb61 100644 --- a/compiler2/Type_codegen.cc +++ b/compiler2/Type_codegen.cc @@ -243,6 +243,7 @@ void Type::generate_code_typedescriptor(output_struct *target) case OT_TYPE_DEF: case OT_COMP_FIELD: case OT_RECORD_OF: + case OT_REF_SPEC: force_xer = has_encoding(CT_XER); // && (is_ref() || (xerattrib && !xerattrib->empty())); break; default: @@ -362,10 +363,20 @@ void Type::generate_code_typedescriptor(output_struct *target) case T_UNIVERSALSTRING: case T_BMPSTRING: case T_VERDICT: + case T_NULL: + case T_OID: + case T_ROID: + case T_ANY: // use predefined JSON descriptors instead of null pointers for basic types target->source.global_vars = mputprintf(target->source.global_vars, "&%s_json_, ", gennamejsondescriptor.c_str()); break; + case T_ENUM_T: + case T_ENUM_A: + // use a predefined JSON descriptor for enumerated types + target->source.global_vars = mputstr(target->source.global_vars, + "&ENUMERATED_json_, "); + break; default: target->source.global_vars = mputstr(target->source.global_vars, "NULL, "); @@ -389,24 +400,14 @@ void Type::generate_code_typedescriptor(output_struct *target) "const TTCN_Typedescriptor_t& %s_descr_ = %s_descr_;\n", gennameown_str, gennametypedescriptor.c_str()); } - else { - /* In general, we avoid generating a XER descriptor for - * "artificial" types. */ - - if (ownertype==OT_REF_SPEC) { - // A XER descriptor without a TTCN descriptor to own it - generate_code_xerdescriptor(target); - } #ifndef NDEBUG - else - target->source.global_vars = mputprintf(target->source.global_vars, - "// %s_xer_ elided\n", gennameown_str); - + else { target->source.global_vars = mputprintf( target->source.global_vars, "// %s_descr_ not needed, use %s_descr_\n", gennameown_str, gennametypedescriptor.c_str()); -#endif } // if(needs_alias()) +#endif + } // if (gennameown == gennametypedescriptor) } @@ -2617,10 +2618,10 @@ void Type::generate_json_schema(JSON_Tokenizer& json, bool embedded, bool as_val // stored if this is a field of a union with the "as value" coding instruction if (ownertype == OT_COMP_FIELD) { CompField* cf = static_cast<CompField*>(owner); - if(as_value || (cf->get_type()->jsonattrib != NULL - && cf->get_type()->jsonattrib->alias != NULL)) { + if (as_value || (cf->get_type()->jsonattrib != NULL + && cf->get_type()->jsonattrib->alias != NULL)) { json.put_next_token(JSON_TOKEN_NAME, "originalName"); - char* field_str = mprintf("\"%s\"", cf->get_name().get_dispname().c_str()); + char* field_str = mprintf("\"%s\"", cf->get_name().get_ttcnname().c_str()); json.put_next_token(JSON_TOKEN_STRING, field_str); Free(field_str); } @@ -2635,18 +2636,20 @@ void Type::generate_json_schema(JSON_Tokenizer& json, bool embedded, bool as_val Free(alias_str); } } - + // get the type at the end of the reference chain Type* last = get_type_refd_last(); // if the type has its own definition and it's embedded in another type, then // its schema already exists, only add a reference to it - if (embedded && (last->ownertype == OT_TYPE_DEF /* TTCN-3 type definition */ + // exception: instances of ASN.1 parameterized types, always embed their schemas + if (embedded && (!is_ref() || !get_type_refd()->pard_type_instance) && + (last->ownertype == OT_TYPE_DEF /* TTCN-3 type definition */ || last->ownertype == OT_TYPE_ASS /* ASN.1 type assignment */ )) { json.put_next_token(JSON_TOKEN_NAME, "$ref"); char* ref_str = mprintf("\"#/definitions/%s/%s\"", - last->my_scope->get_scope_mod()->get_modid().get_dispname().c_str(), - last->get_dispname().c_str()); + last->my_scope->get_scope_mod()->get_modid().get_ttcnname().c_str(), + (is_ref() && last->pard_type_instance) ? get_type_refd()->get_dispname().c_str() : last->get_dispname().c_str()); json.put_next_token(JSON_TOKEN_STRING, ref_str); Free(ref_str); } else { @@ -2685,15 +2688,17 @@ void Type::generate_json_schema(JSON_Tokenizer& json, bool embedded, bool as_val case T_BSTR_A: case T_HSTR: case T_OSTR: + case T_ANY: // use the JSON string type and add a pattern to only allow bits or hex digits json.put_next_token(JSON_TOKEN_NAME, "type"); json.put_next_token(JSON_TOKEN_STRING, "\"string\""); json.put_next_token(JSON_TOKEN_NAME, "subType"); - json.put_next_token(JSON_TOKEN_STRING, (last->typetype == T_OSTR) ? "\"octetstring\"" : + json.put_next_token(JSON_TOKEN_STRING, + (last->typetype == T_OSTR || last->typetype == T_ANY) ? "\"octetstring\"" : ((last->typetype == T_HSTR) ? "\"hexstring\"" : "\"bitstring\"")); json.put_next_token(JSON_TOKEN_NAME, "pattern"); json.put_next_token(JSON_TOKEN_STRING, - (last->typetype == T_OSTR) ? "\"^([0-9A-Fa-f][0-9A-Fa-f])*$\"" : + (last->typetype == T_OSTR || last->typetype == T_ANY) ? "\"^([0-9A-Fa-f][0-9A-Fa-f])*$\"" : ((last->typetype == T_HSTR) ? "\"^[0-9A-Fa-f]*$\"" : "\"^[01]*$\"")); break; case T_CSTR: @@ -2723,6 +2728,15 @@ void Type::generate_json_schema(JSON_Tokenizer& json, bool embedded, bool as_val json.put_next_token(JSON_TOKEN_NAME, "subType"); json.put_next_token(JSON_TOKEN_STRING, "\"universal charstring\""); break; + case T_OID: + case T_ROID: + json.put_next_token(JSON_TOKEN_NAME, "type"); + json.put_next_token(JSON_TOKEN_STRING, "\"string\""); + json.put_next_token(JSON_TOKEN_NAME, "subType"); + json.put_next_token(JSON_TOKEN_STRING, "\"objid\""); + json.put_next_token(JSON_TOKEN_NAME, "pattern"); + json.put_next_token(JSON_TOKEN_STRING, "\"^[0-2][.][1-3]?[0-9]([.][0-9]|([1-9][0-9]+))*$\""); + break; case T_VERDICT: // enumerate the possible values json.put_next_token(JSON_TOKEN_NAME, "enum"); @@ -2739,8 +2753,8 @@ void Type::generate_json_schema(JSON_Tokenizer& json, bool embedded, bool as_val // enumerate the possible values json.put_next_token(JSON_TOKEN_NAME, "enum"); json.put_next_token(JSON_TOKEN_ARRAY_START); - for (size_t i = 0; i < u.enums.eis->get_nof_eis(); ++i) { - char* enum_str = mprintf("\"%s\"", get_ei_byIndex(i)->get_name().get_dispname().c_str()); + for (size_t i = 0; i < last->u.enums.eis->get_nof_eis(); ++i) { + char* enum_str = mprintf("\"%s\"", last->get_ei_byIndex(i)->get_name().get_ttcnname().c_str()); json.put_next_token(JSON_TOKEN_STRING, enum_str); Free(enum_str); } @@ -2748,13 +2762,18 @@ void Type::generate_json_schema(JSON_Tokenizer& json, bool embedded, bool as_val // list the numeric values for the enumerated items json.put_next_token(JSON_TOKEN_NAME, "numericValues"); json.put_next_token(JSON_TOKEN_ARRAY_START); - for (size_t i = 0; i < u.enums.eis->get_nof_eis(); ++i) { - char* num_val_str = mprintf("%lli", get_ei_byIndex(i)->get_value()->get_val_Int()->get_val()); + for (size_t i = 0; i < last->u.enums.eis->get_nof_eis(); ++i) { + char* num_val_str = mprintf("%lli", last->get_ei_byIndex(i)->get_value()->get_val_Int()->get_val()); json.put_next_token(JSON_TOKEN_NUMBER, num_val_str); Free(num_val_str); } json.put_next_token(JSON_TOKEN_ARRAY_END); break; + case T_NULL: + // use the JSON null value for the ASN.1 NULL type + json.put_next_token(JSON_TOKEN_NAME, "type"); + json.put_next_token(JSON_TOKEN_STRING, "\"null\""); + break; case T_SEQOF: case T_SETOF: case T_ARRAY: @@ -2769,6 +2788,7 @@ void Type::generate_json_schema(JSON_Tokenizer& json, bool embedded, bool as_val case T_CHOICE_T: case T_CHOICE_A: case T_ANYTYPE: + case T_OPENTYPE: last->generate_json_schema_union(json); break; default: @@ -2862,17 +2882,20 @@ void Type::generate_json_schema_record(JSON_Tokenizer& json) // use the field's alias if it has one json.put_next_token(JSON_TOKEN_NAME, (field->jsonattrib != NULL && field->jsonattrib->alias != NULL) ? - field->jsonattrib->alias : get_comp_byIndex(i)->get_name().get_dispname().c_str()); + field->jsonattrib->alias : get_comp_byIndex(i)->get_name().get_ttcnname().c_str()); // optional fields can also get the JSON null value if (get_comp_byIndex(i)->get_is_optional()) { - json.put_next_token(JSON_TOKEN_OBJECT_START); - json.put_next_token(JSON_TOKEN_NAME, "anyOf"); - json.put_next_token(JSON_TOKEN_ARRAY_START); - json.put_next_token(JSON_TOKEN_OBJECT_START); - json.put_next_token(JSON_TOKEN_NAME, "type"); - json.put_next_token(JSON_TOKEN_STRING, "\"null\""); - json.put_next_token(JSON_TOKEN_OBJECT_END); + // special case: ASN NULL type, since it uses the JSON literal "null" as a value + if (T_NULL != field->get_type_refd_last()->typetype) { + json.put_next_token(JSON_TOKEN_OBJECT_START); + json.put_next_token(JSON_TOKEN_NAME, "anyOf"); + json.put_next_token(JSON_TOKEN_ARRAY_START); + json.put_next_token(JSON_TOKEN_OBJECT_START); + json.put_next_token(JSON_TOKEN_NAME, "type"); + json.put_next_token(JSON_TOKEN_STRING, "\"null\""); + json.put_next_token(JSON_TOKEN_OBJECT_END); + } } else if (!has_non_optional) { has_non_optional = true; } @@ -2882,7 +2905,8 @@ void Type::generate_json_schema_record(JSON_Tokenizer& json) // for optional fields: specify the presence of the "omit as null" coding instruction // and close structures - if (get_comp_byIndex(i)->get_is_optional()) { + if (get_comp_byIndex(i)->get_is_optional() && + T_NULL != field->get_type_refd_last()->typetype) { json.put_next_token(JSON_TOKEN_ARRAY_END); json.put_next_token(JSON_TOKEN_NAME, "omitAsNull"); json.put_next_token((field->jsonattrib != NULL && field->jsonattrib->omit_as_null) ? @@ -2907,7 +2931,7 @@ void Type::generate_json_schema_record(JSON_Tokenizer& json) // use the field's alias if it has one char* field_str = mprintf("\"%s\"", (field->jsonattrib != NULL && field->jsonattrib->alias != NULL) ? - field->jsonattrib->alias : get_comp_byIndex(i)->get_name().get_dispname().c_str()); + field->jsonattrib->alias : get_comp_byIndex(i)->get_name().get_ttcnname().c_str()); json.put_next_token(JSON_TOKEN_STRING, field_str); Free(field_str); } @@ -2924,7 +2948,7 @@ void Type::generate_json_schema_record(JSON_Tokenizer& json) // use the field's alias if it has one char* field_str = mprintf("\"%s\"", (field->jsonattrib != NULL && field->jsonattrib->alias != NULL) ? - field->jsonattrib->alias : get_comp_byIndex(i)->get_name().get_dispname().c_str()); + field->jsonattrib->alias : get_comp_byIndex(i)->get_name().get_ttcnname().c_str()); json.put_next_token(JSON_TOKEN_STRING, field_str); Free(field_str); } @@ -2959,7 +2983,7 @@ void Type::generate_json_schema_union(JSON_Tokenizer& json) // use the alternative's alias if it has one json.put_next_token(JSON_TOKEN_NAME, (field->jsonattrib != NULL && field->jsonattrib->alias != NULL) ? - field->jsonattrib->alias : get_comp_byIndex(i)->get_name().get_dispname().c_str()); + field->jsonattrib->alias : get_comp_byIndex(i)->get_name().get_ttcnname().c_str()); // let the alternative's type insert its schema field->generate_json_schema(json, true, false); @@ -2977,7 +3001,7 @@ void Type::generate_json_schema_union(JSON_Tokenizer& json) // use the alternative's alias here as well char* field_str = mprintf("\"%s\"", (field->jsonattrib != NULL && field->jsonattrib->alias != NULL) ? - field->jsonattrib->alias : get_comp_byIndex(i)->get_name().get_dispname().c_str()); + field->jsonattrib->alias : get_comp_byIndex(i)->get_name().get_ttcnname().c_str()); json.put_next_token(JSON_TOKEN_STRING, field_str); Free(field_str); @@ -2991,6 +3015,23 @@ void Type::generate_json_schema_union(JSON_Tokenizer& json) json.put_next_token(JSON_TOKEN_ARRAY_END); } +void Type::generate_json_schema_ref(JSON_Tokenizer& json) +{ + // start the object containing the reference + json.put_next_token(JSON_TOKEN_OBJECT_START); + + // insert the reference + json.put_next_token(JSON_TOKEN_NAME, "$ref"); + char* ref_str = mprintf("\"#/definitions/%s/%s\"", + my_scope->get_scope_mod()->get_modid().get_ttcnname().c_str(), + get_dispname().c_str()); + json.put_next_token(JSON_TOKEN_STRING, ref_str); + Free(ref_str); + + // the object will be closed later, as it may contain other properties +} + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ } // namespace Common diff --git a/compiler2/Value.cc b/compiler2/Value.cc index 4f51aa316..a1c1c8a52 100644 --- a/compiler2/Value.cc +++ b/compiler2/Value.cc @@ -3178,10 +3178,10 @@ namespace Common { case OPTYPE_CONCAT: return get_expr_governor_v1v2(exp_val); case OPTYPE_COMP_MTC: - if (my_scope) return my_scope->get_mtc_system_comptype(false, false); + if (my_scope) return my_scope->get_mtc_system_comptype(false); else return 0; case OPTYPE_COMP_SYSTEM: - if (my_scope) return my_scope->get_mtc_system_comptype(true, false); + if (my_scope) return my_scope->get_mtc_system_comptype(true); else return 0; case OPTYPE_COMP_SELF: if (my_scope) { @@ -3234,18 +3234,6 @@ namespace Common { if(valuetype != V_INVOKE) FATAL_ERROR("Value::get_invoked_type()"); return u.invoke.v->get_expr_governor(exp_val); } - - Type* Value::get_component_governor() - { - if (V_EXPR == valuetype && OPTYPE_COMP_MTC == u.expr.v_optype) { - if (my_scope) { - return my_scope->get_mtc_system_comptype(false, true); - } else { - return 0; - } - } - return get_expr_governor(Type::EXPECTED_DYNAMIC_VALUE); - } const char* Value::get_opname() const { @@ -4048,10 +4036,10 @@ namespace Common { Type *t_comptype; switch (u.expr.v_optype) { case OPTYPE_COMP_MTC: - t_comptype = my_scope->get_mtc_system_comptype(false, false); + t_comptype = my_scope->get_mtc_system_comptype(false); break; case OPTYPE_COMP_SYSTEM: - t_comptype = my_scope->get_mtc_system_comptype(true, false); + t_comptype = my_scope->get_mtc_system_comptype(true); break; case OPTYPE_COMP_SELF: { Ttcn::RunsOnScope *t_ros = my_scope->get_scope_runs_on(); @@ -10009,13 +9997,14 @@ error: string Value::create_stringRepr() { + // note: cannot call is_asn1() when only parsing (scopes are not properly set) switch (valuetype) { case V_ERROR: return string("<erroneous>"); case V_NULL: return string("NULL"); case V_BOOL: - if (is_asn1()) { + if (!parse_only && is_asn1()) { if (u.val_bool) return string("TRUE"); else return string("FALSE"); } @@ -10066,7 +10055,7 @@ error: case V_OID: case V_ROID: { string ret_val; - if (!is_asn1()) ret_val += "objid "; + if (parse_only || !is_asn1()) ret_val += "objid "; ret_val += "{ "; for (size_t i = 0; i < u.oid_comps->size(); i++) { if (i>0) ret_val += ' '; @@ -10075,7 +10064,7 @@ error: ret_val += " }"; return ret_val; } case V_CHOICE: - if (is_asn1()) { + if (!parse_only && is_asn1()) { string ret_val(u.choice.alt_name->get_dispname()); ret_val += " : "; ret_val += u.choice.alt_value->get_stringRepr(); @@ -10109,7 +10098,7 @@ error: case V_SEQ: case V_SET: { string ret_val("{ "); - bool asn1_flag = is_asn1(); + bool asn1_flag = !parse_only && is_asn1(); for (size_t i = 0; i < u.val_nvs->get_nof_nvs(); i++) { if (i > 0) ret_val += ", "; NamedValue *nv = u.val_nvs->get_nv_byIndex(i); diff --git a/compiler2/Value.hh b/compiler2/Value.hh index 47eedebed..cfd3f796b 100644 --- a/compiler2/Value.hh +++ b/compiler2/Value.hh @@ -479,11 +479,6 @@ namespace Common { Type* get_expr_governor_last(); /** get the type invoked */ Type *get_invoked_type(Type::expected_value_t exp_val); - - /** An alternative version of get_expr_governor for components. This will - * return the MTC component type in function and altstep scopes as well. - * Calls get_expr_governor in all other cases. */ - Type* get_component_governor(); private: const char* get_opname() const; /** Used to determine whether the reference points to value or diff --git a/compiler2/asn1/AST_asn1.cc b/compiler2/asn1/AST_asn1.cc index d286ad305..6e83b0b2a 100644 --- a/compiler2/asn1/AST_asn1.cc +++ b/compiler2/asn1/AST_asn1.cc @@ -513,21 +513,34 @@ namespace Asn { asss->add_ass(p_ass); } - void Module::add_types_to_json_schema(JSON_Tokenizer& json) + void Module::generate_json_schema(JSON_Tokenizer& json, map<Type*, JSON_Tokenizer>& json_refs) { // add a new property for this module - json.put_next_token(JSON_TOKEN_NAME, modid->get_dispname().c_str()); + json.put_next_token(JSON_TOKEN_NAME, modid->get_ttcnname().c_str()); // add type definitions into an object json.put_next_token(JSON_TOKEN_OBJECT_START); - // pass the JSON tokenizer onto each type definition + // cycle through all type assignments, insert schema segments and references + // when needed for (size_t i = 0; i < asss->get_nof_asss(); ++i) { Common::Assignment* ass = asss->get_ass_byIndex(i); if (Common::Assignment::A_TYPE == ass->get_asstype()) { - Type* t = ass->get_Type(); - if (t->has_encoding(Type::CT_JSON)) { - t->generate_json_schema(json, false, false); + Asn::Assignment* asn_ass = dynamic_cast<Asn::Assignment*>(ass); + // skip parameterized types and their instances + if (NULL == asn_ass || NULL == asn_ass->get_ass_pard()) { + Type* t = ass->get_Type(); + if (!t->is_pard_type_instance() && t->has_encoding(Type::CT_JSON)) { + // insert type's schema segment + t->generate_json_schema(json, false, false); + + if (json_refs_for_all_types && !json_refs.has_key(t)) { + // create JSON schema reference for the type + JSON_Tokenizer* json_ref = new JSON_Tokenizer; + json_refs.add(t, json_ref); + t->generate_json_schema_ref(*json_ref); + } + } } } } @@ -1193,6 +1206,14 @@ namespace Asn { classify_ass(refch); return asstype != A_ERROR ? ass->is_asstype(p_asstype, refch) : false; } + + Ass_pard* Ass_Undef::get_ass_pard() const + { + if (NULL != ass) { + return ass->get_ass_pard(); + } + return ass_pard; + } bool Ass_Undef::_error_if_pard() { diff --git a/compiler2/asn1/AST_asn1.hh b/compiler2/asn1/AST_asn1.hh index 180d0d117..43eba0332 100644 --- a/compiler2/asn1/AST_asn1.hh +++ b/compiler2/asn1/AST_asn1.hh @@ -129,7 +129,7 @@ namespace Asn { virtual void set_right_scope(Scope *p_scope) =0; void set_dontgen() {dontgen=true;} /** Returns 0 if assignment is not parameterized! */ - Ass_pard* get_ass_pard() const { return ass_pard; } + virtual Ass_pard* get_ass_pard() const { return ass_pard; } /** Returns 0 if this assignment is not parameterized! */ Assignment* new_instance(Common::Module *p_mod); virtual Type* get_Type(); @@ -244,12 +244,13 @@ namespace Asn { void add_ass(Assignment *p_ass); TagDefault::tagdef_t get_tagdef() const { return tagdef; } - /** Generates JSON schema segments for the types defined in the module - * and adds them to the JSON schema parameter. */ - virtual void add_types_to_json_schema(JSON_Tokenizer&); - - /** Does nothing. ASN.1 modules can't contain functions. */ - virtual void add_func_to_json_schema(map<Type*, JSON_Tokenizer>&) {} + /** Generates JSON schema segments for the types defined in the modules, + * and references to these types. + * + * @param json JSON document containing the main schema, schema segments for + * the types will be inserted here + * @param json_refs map of JSON documents containing the references to each type */ + virtual void generate_json_schema(JSON_Tokenizer& json, map<Type*, JSON_Tokenizer>& json_refs); }; /** @@ -442,6 +443,7 @@ namespace Asn { virtual void set_my_scope(Scope *p_scope); virtual void set_right_scope(Scope *p_scope); virtual bool is_asstype(asstype_t p_asstype, ReferenceChain* refch=0); + virtual Ass_pard* get_ass_pard() const; virtual Setting* get_Setting(); virtual Type* get_Type(); virtual Value* get_Value(); diff --git a/compiler2/asn1/Ref.cc b/compiler2/asn1/Ref.cc index b933ea174..0c7b52f7b 100644 --- a/compiler2/asn1/Ref.cc +++ b/compiler2/asn1/Ref.cc @@ -190,7 +190,11 @@ namespace Asn { new_ass->set_location(*this); new_ass->set_dontgen(); new_ass->chk(); - + + if (Common::Assignment::A_TYPE == new_ass->get_asstype()) { + new_ass->get_Type()->set_pard_type_instance(); + } + ref_ds=new Ref_defd_simple(new Identifier(my_mod->get_modid()), new Identifier(new_ass_id)); ref_ds->set_fullname(get_fullname()); diff --git a/compiler2/compiler.1 b/compiler2/compiler.1 index 762b4f08d..a3416e4b5 100644 --- a/compiler2/compiler.1 +++ b/compiler2/compiler.1 @@ -26,8 +26,20 @@ or .br .B compiler .B \-v +.br +or +.br +.B compiler \-\-ttcn2json +.RB "[\| " \-jf " \|]" +.RB "[\| " \-T " \|]" +module.ttcn ... +.RB "[\| " \-A " \|]" +module.asn ... +.RB "[\| " \- +schema.json +.RB " \|]" .SH DESCRIPTION -This manual page is a quick reference for the TTCN-3 and ASN.1 to C++ +This manual page is a quick reference for the TTCN-3 and ASN.1 to C++ (or JSON schema) compiler of the TTCN-3 Test Executor. It only summarizes the meaning of all command line options. For more details please consult the .B Programmer's Technical Reference for TITAN TTCN-3 Test Executor. @@ -298,6 +310,29 @@ in the list before the dash. If the single dash is not present in the command line the compiler will generate code for .I all modules. +.TP +.B \-\-ttcn2json +Generates a JSON schema from the types defined in the specified TTCN-3 and ASN.1 modules. +Must always be the first compiler option. From the previously listed options only +.B \-T +and +.B \-A +can be used, instead the JSON schema generator has options of its own: +.TP +.B \-j +Only types that have JSON coding enabled are included in the schema. +.TP +.B \-f +The schema only validates types that have a JSON encoding or decoding method declared. +.TP +.BI \- " file" +The single dash character as command line argument specifies the name of the generated +JSON schema file. If it is not present, then the schema file name is generated from +the name of the first input file (by replacing its suffix with +.I \.json +or appending +.I \.json +to the end of the file). .SH EXIT STATUS The compiler exits with a status of zero when no errors were encountered during its operation. A status of one will be returned if syntax or diff --git a/compiler2/encdec.c b/compiler2/encdec.c index 2dc6e6642..4d5362d21 100644 --- a/compiler2/encdec.c +++ b/compiler2/encdec.c @@ -50,8 +50,10 @@ void def_encdec(const char *p_classname, #ifndef NDEBUG "// written by %s in " __FILE__ " at %d\n" #endif - "int XER_encode(const XERdescriptor_t&, TTCN_Buffer&, unsigned int, int) const;\n" - "int XER_decode(const XERdescriptor_t&, XmlReaderWrap&, unsigned int);\n" + "int XER_encode(const XERdescriptor_t&, TTCN_Buffer&, unsigned int, int, " + "embed_values_enc_struct_t*) const;\n" + "int XER_decode(const XERdescriptor_t&, XmlReaderWrap&, unsigned int, " + "embed_values_dec_struct_t*);\n" "static boolean can_start(const char *name, const char *uri, " "XERdescriptor_t const& xd, unsigned int);\n" "%s" @@ -114,7 +116,7 @@ void def_encdec(const char *p_classname, /* Do not use %s_xer_ here. It supplies the XER descriptor of oldtype * even if encoding newtype for: * <ttcn>type newtype oldtype;</ttcn> */ - " XER_encode(*(p_td.xer),p_buf, XER_coding, 0);\n" + " XER_encode(*(p_td.xer),p_buf, XER_coding, 0, 0);\n" " p_buf.put_c('\\n');\n" /* make sure it has a newline */ " break;}\n" " case TTCN_EncDec::CT_JSON: {\n" @@ -215,7 +217,7 @@ void def_encdec(const char *p_classname, " for (int rd_ok=reader.Read(); rd_ok==1; rd_ok=reader.Read()) {\n" " if (reader.NodeType() == XML_READER_TYPE_ELEMENT) break;\n" " }\n" - " XER_decode(*(p_td.xer), reader, XER_coding | XER_TOPLEVEL);\n" + " XER_decode(*(p_td.xer), reader, XER_coding | XER_TOPLEVEL, 0);\n" " size_t bytes = reader.ByteConsumed();\n" " p_buf.set_pos(bytes);\n" " break;}\n" diff --git a/compiler2/enum.c b/compiler2/enum.c index 67133e280..15ad0b576 100644 --- a/compiler2/enum.c +++ b/compiler2/enum.c @@ -605,7 +605,7 @@ void defEnumClass(const enum_def *edef, output_struct *output) src = mputprintf(src, "int %s::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf," - " unsigned int p_flavor, int p_indent) const\n" + " unsigned int p_flavor, int p_indent, embed_values_enc_struct_t*) const\n" "{\n" " int encoded_length=(int)p_buf.get_len();\n" " const boolean e_xer = is_exer(p_flavor);\n" @@ -643,7 +643,7 @@ void defEnumClass(const enum_def *edef, output_struct *output) "// written by %s in " __FILE__ " at %d\n" #endif "int %s::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& p_reader," - " unsigned int p_flavor)\n" + " unsigned int p_flavor, embed_values_dec_struct_t*)\n" "{\n" " int rd_ok = 1, type;\n" diff --git a/compiler2/main.cc b/compiler2/main.cc index 9f50d8eec..fd58f1a80 100644 --- a/compiler2/main.cc +++ b/compiler2/main.cc @@ -66,7 +66,9 @@ boolean generate_skeleton = FALSE, force_overwrite = FALSE, semantic_check_only = FALSE, output_only_linenum = FALSE, default_as_optional = FALSE, enable_set_bound_out_param = FALSE, use_runtime_2 = FALSE, gcc_compat = FALSE, asn1_xer = FALSE, - check_subtype = TRUE, suppress_context = FALSE, display_up_to_date = FALSE; + check_subtype = TRUE, suppress_context = FALSE, display_up_to_date = FALSE, + implicit_json_encoding = FALSE, json_refs_for_all_types = TRUE, + profiler_enabled = FALSE; // Default code splitting mode is set to 'no splitting'. CodeGenHelper::split_type code_splitting_mode = CodeGenHelper::SPLIT_NONE; @@ -356,7 +358,7 @@ static void usage() " [-U none|type] [-P modulename.top_level_pdu_name] [-Q number] ...\n" " [-T] module.ttcn [-A] module.asn ...\n" " or %s -v\n" - " or %s --ttcn2json [-T] module.ttcn [-A] module.asn ... - schema.json\n" + " or %s --ttcn2json [-jf] ... [-T] module.ttcn [-A] module.asn ... [- schema.json]\n" "\n" "OPTIONS:\n" " -a: force XER in ASN.1 files\n" @@ -366,10 +368,13 @@ static void usage() " -f: force overwriting of output files\n" " -g: emulate GCC error/warning message format\n" " -i: use only line numbers in error/warning messages\n" + " -j: disable JSON encoder/decoder functions\n" " -l: include source line info in C++ code\n" " -L: add source line info for logging\n" " -K file: enable selective code coverage\n" + " -o dir: output files will be placed into dir\n" " -p: parse only (no semantic check or code generation)\n" + " -P pduname: define top-level pdu\n" " -q: suppress all messages (quiet mode)\n" " -Qn: quit after n errors\n" " -r: disable RAW encoder/decoder functions\n" @@ -379,19 +384,20 @@ static void usage() " -t: generate Test Port skeleton\n" " -u: duplicate underscores in file names\n" " -U none|type: select code splitting mode for the generated C++ code\n" + " -V verb_level: set verbosity level bitmask (decimal)\n" " -w: suppress warnings\n" " -x: disable TEXT encoder/decoder functions\n" " -X: disable XER encoder/decoder functions\n" - " -j: disable JSON encoder/decoder functions\n" " -y: disable subtype checking\n" - " -V verb_level: set verbosity level bitmask (decimal)\n" - " -o dir: output files will be placed into dir\n" " -Y: Enforces legacy behaviour of the \"out\" function parameters (see refguide)\n" - " -P pduname: define top-level pdu\n" + //" -z: enable profiling and code coverage for TTCN-3 files\n" - not open to the public yet " -T file: force interpretation of file as TTCN-3 module\n" " -A file: force interpretation of file as ASN.1 module\n" " -v: show version\n" - " --ttcn2json: generate JSON schema from input modules\n", argv0, argv0, argv0); + " --ttcn2json: generate JSON schema from input modules\n" + "JSON schema generator options:\n" + " -j: only include types with JSON encoding\n" + " -f: only generate references to types with JSON encoding/decoding functions\n", argv0, argv0, argv0); } #define SET_FLAG(x) if (x##flag) {\ @@ -441,7 +447,7 @@ int main(int argc, char *argv[]) tflag = false, uflag = false, vflag = false, wflag = false, xflag = false, dflag = false, Xflag = false, Rflag = false, gflag = false, aflag = false, s0flag = false, Cflag = false, yflag = false, Uflag = false, Qflag = false, - Sflag = false, Kflag = false, jflag = false, + Sflag = false, Kflag = false, jflag = false, zflag = false, errflag = false, print_usage = false, ttcn2json = false; CodeGenHelper cgh; @@ -457,6 +463,7 @@ int main(int argc, char *argv[]) if (0 == strcmp(argv[1], "--ttcn2json")) { ttcn2json = true; display_up_to_date = TRUE; + implicit_json_encoding = TRUE; for (int i = 2; i < argc; ++i) { // A dash (-) is used to separate the schema file name from the input files if (0 == strcmp(argv[i], "-")) { @@ -487,6 +494,16 @@ int main(int argc, char *argv[]) } add_module(n_modules, module_list, argv[i], Module::MOD_TTCN); } + else if (0 == strcmp(argv[i], "-j")) { + implicit_json_encoding = FALSE; + } + else if (0 == strcmp(argv[i], "-f")) { + json_refs_for_all_types = FALSE; + } + else if (0 == strcmp(argv[i], "-fj") || 0 == strcmp(argv[i], "-jf")) { + implicit_json_encoding = FALSE; + json_refs_for_all_types = FALSE; + } else if (argv[i][0] == '-') { ERROR("Invalid option `%s' after option `--ttcn2json'", argv[i]); print_usage = true; @@ -523,7 +540,7 @@ int main(int argc, char *argv[]) if (!ttcn2json) { for ( ; ; ) { - int c = getopt(argc, argv, "aA:C:K:LP:T:V:bcdfgilo:YpqQ:rRs0StuU:vwxXjy-"); + int c = getopt(argc, argv, "aA:C:K:LP:T:V:bcdfgilo:YpqQ:rRs0StuU:vwxXjyz-"); if (c == -1) break; switch (c) { case 'a': @@ -678,6 +695,10 @@ int main(int argc, char *argv[]) SET_FLAG(y); check_subtype = FALSE; break; + case 'z': + SET_FLAG(z); + profiler_enabled = TRUE; + break; case 'Q': { long max_errs; @@ -704,7 +725,7 @@ int main(int argc, char *argv[]) case '-': if (!strcmp(argv[optind], "--ttcn2json")) { - ERROR("Option `--ttcn2json' does not allow the use of other options"); + ERROR("Option `--ttcn2json' is only allowed as the first option"); } else { ERROR("Invalid option: `%s'", argv[optind]); } @@ -722,7 +743,7 @@ int main(int argc, char *argv[]) if (Aflag || Lflag || Pflag || Tflag || Vflag || Yflag || bflag || fflag || iflag || lflag || oflag || pflag || qflag || rflag || sflag || tflag || uflag || wflag || xflag || Xflag || Rflag || - Uflag || yflag || Kflag || jflag) { + Uflag || yflag || Kflag || jflag || zflag) { errflag = true; print_usage = true; } @@ -738,6 +759,10 @@ int main(int argc, char *argv[]) ERROR("Source line information `-L' is necessary for code coverage `-K'."); errflag = true; } + if (zflag && !Lflag) { + ERROR("Source line information `-L' is necessary for profiling `-z'."); + errflag = true; + } if (iflag && gflag) { WARNING("Option `-g' overrides `-i'."); iflag = false; // -g gives more information diff --git a/compiler2/main.hh b/compiler2/main.hh index 0beb371e6..18ec89601 100644 --- a/compiler2/main.hh +++ b/compiler2/main.hh @@ -33,7 +33,8 @@ extern unsigned int nof_notupdated_files; extern boolean generate_skeleton, force_overwrite, include_line_info, include_location_info, duplicate_underscores, parse_only, semantic_check_only, output_only_linenum, default_as_optional, use_runtime_2, gcc_compat, asn1_xer, - check_subtype, suppress_context, enable_set_bound_out_param, display_up_to_date; + check_subtype, suppress_context, enable_set_bound_out_param, display_up_to_date, + implicit_json_encoding, json_refs_for_all_types, profiler_enabled; extern const char *expected_platform; diff --git a/compiler2/makefile.c b/compiler2/makefile.c index 746d12652..4252d22e3 100644 --- a/compiler2/makefile.c +++ b/compiler2/makefile.c @@ -13,7 +13,7 @@ #include <errno.h> #include <ctype.h> #if defined SOLARIS || defined SOLARIS8 -# include <sys/utsname.h> +#include <sys/utsname.h> #endif #include "../common/memory.h" @@ -32,7 +32,8 @@ static const char *program_name = NULL; static unsigned int error_count = 0; static boolean suppress_warnings = FALSE; - +void free_string2_list(struct string2_list* act_elem); +void free_string_list(struct string_list* act_elem); void ERROR(const char *fmt, ...) { va_list parameters; @@ -163,6 +164,7 @@ struct base_dir_struct { /** data structure that describes the information needed for the Makefile */ struct makefile_struct { + char *project_name; size_t nTTCN3Modules; struct module_struct *TTCN3Modules; @@ -206,11 +208,15 @@ struct makefile_struct { boolean coverage; char *tcov_file_name; boolean library; + boolean linkingStrategy; + boolean hierarchical; struct string_list* sub_project_dirs; /* not owned */ struct string_list* ttcn3_prep_includes; /* not owned */ struct string_list* ttcn3_prep_defines; /* not owned */ + struct string_list* ttcn3_prep_undefines; /* not owned */ struct string_list* prep_includes; /* not owned */ struct string_list* prep_defines; /* not owned */ + struct string_list* prep_undefines; /* not owned */ boolean codesplittpd; boolean quietly; boolean disablesubtypecheck; @@ -246,6 +252,7 @@ struct makefile_struct { /** Initializes structure \a makefile with empty lists and default settings. */ static void init_makefile_struct(struct makefile_struct *makefile) { + makefile->project_name = NULL; makefile->nTTCN3Modules = 0; makefile->TTCN3Modules = NULL; makefile->preprocess = FALSE; @@ -283,6 +290,8 @@ static void init_makefile_struct(struct makefile_struct *makefile) makefile->coverage = FALSE; makefile->tcov_file_name = NULL; makefile->library = FALSE; + makefile->linkingStrategy = FALSE; + makefile->hierarchical = FALSE; makefile->sub_project_dirs = NULL; makefile->ttcn3_prep_includes = NULL; makefile->prep_includes = NULL; @@ -303,6 +312,7 @@ static void init_makefile_struct(struct makefile_struct *makefile) /** Deallocates all memory associated with structure \a makefile. */ static void free_makefile_struct(const struct makefile_struct *makefile) { + Free(makefile->project_name); size_t i; for (i = 0; i < makefile->nTTCN3Modules; i++) { Free(makefile->TTCN3Modules[i].dir_name); @@ -348,6 +358,7 @@ static void dump_makefile_struct(const struct makefile_struct *makefile, { size_t i; DEBUG(level, "Data used for Makefile generation:"); + DEBUG(level + 1, "TTCN-3 project name: %s", makefile->project_name); DEBUG(level + 1, "TTCN-3 modules: (%u pcs.)", makefile->nTTCN3Modules); for (i = 0; i < makefile->nTTCN3Modules; i++) { const struct module_struct *module = makefile->TTCN3Modules + i; @@ -406,12 +417,12 @@ static void dump_makefile_struct(const struct makefile_struct *makefile, if (user->header_name != NULL) { DEBUG(level + 3, "Header file: %s", user->header_name); DEBUG(level + 3, "Header file has .hh or .hpp suffix: %s", - user->has_hh_suffix ? "yes" : "no"); + user->has_hh_suffix ? "yes" : "no"); } if (user->source_name != NULL) { DEBUG(level + 3, "Source file: %s", user->source_name); DEBUG(level + 3, "Source file has .cc or .cpp suffix: %s", - user->has_cc_suffix ? "yes" : "no"); + user->has_cc_suffix ? "yes" : "no"); DEBUG(level + 3, "Object file: %s.o", user->file_prefix); } } @@ -437,7 +448,7 @@ static void dump_makefile_struct(const struct makefile_struct *makefile, const struct base_dir_struct *base_dir = makefile->BaseDirs + i; DEBUG(level + 2, "Directory: %s", base_dir->dir_name); DEBUG(level + 3, "Has TTCN-3/ASN.1 modules: %s", - base_dir->has_modules ? "yes" : "no"); + base_dir->has_modules ? "yes" : "no"); } } DEBUG(level + 1, "Working directory: %s", @@ -914,7 +925,7 @@ static void add_path_to_list(size_t *list_size, char ***list_ptr, for (i = 0; i < *list_size; i++) { if (!strcmp(canonized_path_name, (*list_ptr)[i])) { if (report_warning) WARNING("File `%s' was given more than once for the " - "Makefile.", path_name); + "Makefile.", path_name); Free(canonized_path_name); return; } @@ -934,28 +945,32 @@ static void add_user_file(struct makefile_struct *makefile, const char *suffix = get_suffix(path_name); if (suffix != NULL) { if (!strcmp(suffix, "ttcn") || !strcmp(suffix, "ttcn3") || - !strcmp(suffix, "3mp") || !strcmp(suffix, "ttcnpp")) { + !strcmp(suffix, "3mp") || !strcmp(suffix, "ttcnpp")) { /* The file content was already checked. Since it doesn't look like * a valid TTCN-3 file, these suffixes are suspect */ WARNING("File `%s' does not contain a valid TTCN-3 module. " - "It will be added to the Makefile as other file.", path_name); - } else if (!strcmp(suffix, "ttcnin")) { + "It will be added to the Makefile as other file.", path_name); + } + else if (!strcmp(suffix, "ttcnin")) { /* this is a TTCN-3 include file */ if (makefile->preprocess) { - add_path_to_list(&makefile->nTTCN3IncludeFiles, - &makefile->TTCN3IncludeFiles, path_name, makefile->working_dir, TRUE); - return; - } else { - WARNING("The suffix of file `%s' indicates that it is a TTCN-3 " - "include file, but TTCN-3 preprocessing is not enabled. The file " - "will be added to the Makefile as other file.", path_name); + add_path_to_list(&makefile->nTTCN3IncludeFiles, + &makefile->TTCN3IncludeFiles, path_name, makefile->working_dir, TRUE); + return; + } + else { + WARNING("The suffix of file `%s' indicates that it is a TTCN-3 " + "include file, but TTCN-3 preprocessing is not enabled. The file " + "will be added to the Makefile as other file.", path_name); } - } else if (!strcmp(suffix, "asn") || !strcmp(suffix, "asn1")) { + } + else if (!strcmp(suffix, "asn") || !strcmp(suffix, "asn1")) { /* The file content was already checked. Since it doesn't look like * a valid ASN.1 file, these suffixes are suspect */ WARNING("File `%s' does not contain a valid ASN.1 module. " - "It will be added to the Makefile as other file.", path_name); - } else if (!strcmp(suffix, "cc") || !strcmp(suffix, "c") || !strcmp(suffix, "cpp")) { + "It will be added to the Makefile as other file.", path_name); + } + else if (!strcmp(suffix, "cc") || !strcmp(suffix, "c") || !strcmp(suffix, "cpp")) { /* this is a source file */ char *dir_name = get_dir_name(path_name, makefile->working_dir); char *file_name = get_file_from_path(path_name); @@ -963,48 +978,49 @@ static void add_user_file(struct makefile_struct *makefile, struct user_struct *user; size_t i; for (i = 0; i < makefile->nUserFiles; i++) { - user = makefile->UserFiles + i; - if (!strcmp(file_prefix, user->file_prefix)) { - if (user->source_name != NULL) { - /* the source file is already present */ - if (is_same_file(dir_name, file_name, - user->dir_name, user->source_name)) { - WARNING("File `%s' was given more than once for the Makefile.", - path_name); - } else { - char *path_name1 = compose_path_name(user->dir_name, - user->source_name); - char *path_name2 = compose_path_name(dir_name, file_name); - ERROR("C/C++ source files `%s' and `%s' cannot be used together " - "in the same Makefile.", path_name1, path_name2); - Free(path_name1); - Free(path_name2); - } - } else { - /* a header file with the same prefix is already present */ - if (is_same_directory(dir_name, user->dir_name)) { - user->source_name = file_name; - file_name = NULL; - if (!strcmp(suffix, "cc") || !strcmp(suffix, "cpp")) user->has_cc_suffix = TRUE; - } else { - char *path_name1 = compose_path_name(dir_name, file_name); - char *path_name2 = compose_path_name(user->dir_name, - user->header_name); - ERROR("C/C++ source file `%s' cannot be used together with " - "header file `%s' in the same Makefile.", path_name1, - path_name2); - Free(path_name1); - Free(path_name2); - } - } - Free(dir_name); - Free(file_name); - Free(file_prefix); - return; - } + user = makefile->UserFiles + i; + if (!strcmp(file_prefix, user->file_prefix)) { + if (user->source_name != NULL) { + /* the source file is already present */ + if (is_same_file(dir_name, file_name, + user->dir_name, user->source_name)) { + WARNING("File `%s' was given more than once for the Makefile.", path_name); + } + else { + char *path_name1 = compose_path_name(user->dir_name, user->source_name); + char *path_name2 = compose_path_name(dir_name, file_name); + ERROR("C/C++ source files `%s' and `%s' cannot be used together " + "in the same Makefile.", path_name1, path_name2); + Free(path_name1); + Free(path_name2); + } + } + else { + /* a header file with the same prefix is already present */ + if (is_same_directory(dir_name, user->dir_name)) { + user->source_name = file_name; + file_name = NULL; + if (!strcmp(suffix, "cc") || !strcmp(suffix, "cpp")) + user->has_cc_suffix = TRUE; + } + else { + char *path_name1 = compose_path_name(dir_name, file_name); + char *path_name2 = compose_path_name(user->dir_name, user->header_name); + ERROR("C/C++ source file `%s' cannot be used together with " + "header file `%s' in the same Makefile.", path_name1, + path_name2); + Free(path_name1); + Free(path_name2); + } + } + Free(dir_name); + Free(file_name); + Free(file_prefix); + return; + } } makefile->UserFiles = (struct user_struct*)Realloc(makefile->UserFiles, - (makefile->nUserFiles + 1) * sizeof(*makefile->UserFiles)); + (makefile->nUserFiles + 1) * sizeof(*makefile->UserFiles)); user = makefile->UserFiles + makefile->nUserFiles; makefile->nUserFiles++; user->dir_name = dir_name; @@ -1015,7 +1031,8 @@ static void add_user_file(struct makefile_struct *makefile, if (!strcmp(suffix, "cc") || !strcmp(suffix, "cpp")) user->has_cc_suffix = TRUE; else user->has_cc_suffix = FALSE; return; - } else if (!strcmp(suffix, "hh") || !strcmp(suffix, "h")) { + } + else if (!strcmp(suffix, "hh") || !strcmp(suffix, "h")) { /* this is a header file */ char *dir_name = get_dir_name(path_name, makefile->working_dir); char *file_name = get_file_from_path(path_name); @@ -1023,48 +1040,47 @@ static void add_user_file(struct makefile_struct *makefile, struct user_struct *user; size_t i; for (i = 0; i < makefile->nUserFiles; i++) { - user = makefile->UserFiles + i; - if (!strcmp(file_prefix, user->file_prefix)) { - if (user->header_name != NULL) { - /* the header file is already present */ - if (is_same_file(dir_name, file_name, - user->dir_name, user->header_name)) { - WARNING("File `%s' was given more than once for the Makefile.", - path_name); - } else { - char *path_name1 = compose_path_name(user->dir_name, - user->header_name); - char *path_name2 = compose_path_name(dir_name, file_name); - ERROR("C/C++ header files `%s' and `%s' cannot be used together " - "in the same Makefile.", path_name1, path_name2); - Free(path_name1); - Free(path_name2); - } - } else { - /* a source file with the same prefix is already present */ - if (is_same_directory(dir_name, user->dir_name)) { - user->header_name = file_name; - file_name = NULL; - if (!strcmp(suffix, "hh") || !strcmp(suffix, "hpp")) user->has_hh_suffix = TRUE; - } else { - char *path_name1 = compose_path_name(dir_name, file_name); - char *path_name2 = compose_path_name(user->dir_name, - user->source_name); - ERROR("C/C++ header file `%s' cannot be used together with " - "source file `%s' in the same Makefile.", path_name1, - path_name2); - Free(path_name1); - Free(path_name2); - } - } - Free(dir_name); - Free(file_name); - Free(file_prefix); - return; - } + user = makefile->UserFiles + i; + if (!strcmp(file_prefix, user->file_prefix)) { + if (user->header_name != NULL) { + /* the header file is already present */ + if (is_same_file(dir_name, file_name, user->dir_name, user->header_name)) { + WARNING("File `%s' was given more than once for the Makefile.", path_name); + } + else { + char *path_name1 = compose_path_name(user->dir_name, user->header_name); + char *path_name2 = compose_path_name(dir_name, file_name); + ERROR("C/C++ header files `%s' and `%s' cannot be used together " + "in the same Makefile.", path_name1, path_name2); + Free(path_name1); + Free(path_name2); + } + } + else { + /* a source file with the same prefix is already present */ + if (is_same_directory(dir_name, user->dir_name)) { + user->header_name = file_name; + file_name = NULL; + if (!strcmp(suffix, "hh") || !strcmp(suffix, "hpp")) + user->has_hh_suffix = TRUE; + } + else { + char *path_name1 = compose_path_name(dir_name, file_name); + char *path_name2 = compose_path_name(user->dir_name, user->source_name); + ERROR("C/C++ header file `%s' cannot be used together with " + "source file `%s' in the same Makefile.", path_name1, path_name2); + Free(path_name1); + Free(path_name2); + } + } + Free(dir_name); + Free(file_name); + Free(file_prefix); + return; + } } makefile->UserFiles = (struct user_struct*)Realloc(makefile->UserFiles, - (makefile->nUserFiles + 1) * sizeof(*makefile->UserFiles)); + (makefile->nUserFiles + 1) * sizeof(*makefile->UserFiles)); user = makefile->UserFiles + makefile->nUserFiles; makefile->nUserFiles++; user->dir_name = dir_name; @@ -1176,31 +1192,34 @@ static void complete_user_files(const struct makefile_struct *makefile) static const char * const suffix_list[] = { "hh", "h", "hpp", NULL }; const char * const *suffix_ptr; for (suffix_ptr = suffix_list; *suffix_ptr != NULL; suffix_ptr++) { - char *file_name = mprintf("%s.%s", user->file_prefix, *suffix_ptr); - char *path_name = compose_path_name(user->dir_name, file_name); - if (get_path_status(path_name) == PS_FILE) { - Free(path_name); - user->header_name = file_name; - if (!strcmp(*suffix_ptr, "hh") || !strcmp(*suffix_ptr, "hpp")) user->has_hh_suffix = TRUE; - break; - } - Free(file_name); - Free(path_name); + char *file_name = mprintf("%s.%s", user->file_prefix, *suffix_ptr); + char *path_name = compose_path_name(user->dir_name, file_name); + if (get_path_status(path_name) == PS_FILE) { + Free(path_name); + user->header_name = file_name; + if (!strcmp(*suffix_ptr, "hh") || !strcmp(*suffix_ptr, "hpp")) + user->has_hh_suffix = TRUE; + break; + } + Free(file_name); + Free(path_name); } - } else if (user->source_name == NULL) { + } + else if (user->source_name == NULL) { static const char * const suffix_list[] = { "cc", "c", "cpp", NULL }; const char * const *suffix_ptr; for (suffix_ptr = suffix_list; *suffix_ptr != NULL; suffix_ptr++) { - char *file_name = mprintf("%s.%s", user->file_prefix, *suffix_ptr); - char *path_name = compose_path_name(user->dir_name, file_name); - if (get_path_status(path_name) == PS_FILE) { - Free(path_name); - user->source_name = file_name; - if (!strcmp(*suffix_ptr, "cc") || !strcmp(*suffix_ptr, "cpp")) user->has_cc_suffix = TRUE; - break; - } - Free(file_name); - Free(path_name); + char *file_name = mprintf("%s.%s", user->file_prefix, *suffix_ptr); + char *path_name = compose_path_name(user->dir_name, file_name); + if (get_path_status(path_name) == PS_FILE) { + Free(path_name); + user->source_name = file_name; + if (!strcmp(*suffix_ptr, "cc") || !strcmp(*suffix_ptr, "cpp")) + user->has_cc_suffix = TRUE; + break; + } + Free(file_name); + Free(path_name); } } } @@ -1434,16 +1453,17 @@ static void check_naming_convention(struct makefile_struct *makefile) for (i = 0; i < makefile->nTTCN3Modules; i++) { const struct module_struct *module = makefile->TTCN3Modules + i; if (module->dir_name != NULL) { - if (!module->is_regular) makefile->BaseTTCN3ModulesRegular = FALSE; - } else { - if (!module->is_regular) makefile->TTCN3ModulesRegular = FALSE; + if (!module->is_regular) makefile->BaseTTCN3ModulesRegular = FALSE; + } + else { + if (!module->is_regular) makefile->TTCN3ModulesRegular = FALSE; } if (!makefile->TTCN3ModulesRegular && !makefile->BaseTTCN3ModulesRegular) - break; + break; } /* ttcnpp files are ttcn files */ if ((makefile->TTCN3ModulesRegular || makefile->BaseTTCN3ModulesRegular) && - makefile->preprocess) { + makefile->preprocess) { for (i = 0; i < makefile->nTTCN3PPModules; i++) { const struct module_struct *module = makefile->TTCN3PPModules + i; if (module->dir_name != NULL) { @@ -1458,29 +1478,31 @@ static void check_naming_convention(struct makefile_struct *makefile) for (i = 0; i < makefile->nASN1Modules; i++) { const struct module_struct *module = makefile->ASN1Modules + i; if (module->dir_name != NULL) { - if (!module->is_regular) makefile->BaseASN1ModulesRegular = FALSE; - } else { - if (!module->is_regular) makefile->ASN1ModulesRegular = FALSE; + if (!module->is_regular) makefile->BaseASN1ModulesRegular = FALSE; + } + else { + if (!module->is_regular) makefile->ASN1ModulesRegular = FALSE; } if (!makefile->ASN1ModulesRegular && !makefile->BaseASN1ModulesRegular) - break; + break; } for (i = 0; i < makefile->nUserFiles; i++) { const struct user_struct *user = makefile->UserFiles + i; if (user->dir_name != NULL) { - if (!user->has_cc_suffix) - makefile->BaseUserSourcesRegular = FALSE; - if (!user->has_cc_suffix || !user->has_hh_suffix) - makefile->BaseUserHeadersRegular = FALSE; - } else { - if (!user->has_cc_suffix) - makefile->UserSourcesRegular = FALSE; - if (!user->has_cc_suffix || !user->has_hh_suffix) - makefile->UserHeadersRegular = FALSE; + if (!user->has_cc_suffix) + makefile->BaseUserSourcesRegular = FALSE; + if (!user->has_cc_suffix || !user->has_hh_suffix) + makefile->BaseUserHeadersRegular = FALSE; + } + else { + if (!user->has_cc_suffix) + makefile->UserSourcesRegular = FALSE; + if (!user->has_cc_suffix || !user->has_hh_suffix) + makefile->UserHeadersRegular = FALSE; } if (!makefile->UserHeadersRegular && !makefile->UserSourcesRegular && - !makefile->BaseUserHeadersRegular && - !makefile->BaseUserSourcesRegular) break; + !makefile->BaseUserHeadersRegular && + !makefile->BaseUserSourcesRegular) break; } } else { /* this project (Makefile) will-be stand-alone */ @@ -1488,8 +1510,8 @@ static void check_naming_convention(struct makefile_struct *makefile) for (i = 0; i < makefile->nTTCN3Modules; i++) { const struct module_struct *module = makefile->TTCN3Modules + i; if (!module->is_regular || module->dir_name != NULL) { - makefile->TTCN3ModulesRegular = FALSE; - break; + makefile->TTCN3ModulesRegular = FALSE; + break; } } if (makefile->TTCN3ModulesRegular && makefile->preprocess) { @@ -1504,18 +1526,18 @@ static void check_naming_convention(struct makefile_struct *makefile) for (i = 0; i < makefile->nASN1Modules; i++) { const struct module_struct *module = makefile->ASN1Modules + i; if (!module->is_regular || module->dir_name != NULL) { - makefile->ASN1ModulesRegular = FALSE; - break; + makefile->ASN1ModulesRegular = FALSE; + break; } } for (i = 0; i < makefile->nUserFiles; i++) { const struct user_struct *user = makefile->UserFiles + i; if (!user->has_cc_suffix) - makefile->UserSourcesRegular = FALSE; + makefile->UserSourcesRegular = FALSE; if (!user->has_cc_suffix || !user->has_hh_suffix) - makefile->UserHeadersRegular = FALSE; + makefile->UserHeadersRegular = FALSE; if (!makefile->UserHeadersRegular && !makefile->UserSourcesRegular) - break; + break; } } } @@ -1639,8 +1661,13 @@ static void fprint_extra_targets(FILE* fp, struct string2_list* target_placement /** Prints the Makefile based on structure \a makefile. */ static void print_makefile(struct makefile_struct *makefile) { - boolean add_refd_prjs = makefile->sub_project_dirs && makefile->sub_project_dirs->str; - + boolean add_refd_prjs = FALSE; + if (makefile->linkingStrategy && makefile->hierarchical) { + add_refd_prjs = hasSubProject(makefile->project_name); + } + else { + add_refd_prjs = makefile->sub_project_dirs && makefile->sub_project_dirs->str; + } NOTIFY("Generating Makefile skeleton..."); if (makefile->force_overwrite || @@ -1673,7 +1700,7 @@ static void print_makefile(struct makefile_struct *makefile) fp = fopen(makefile->output_file, "w"); if (fp == NULL){ ERROR("Cannot open output file `%s' for writing: %s", - makefile->output_file, strerror(errno)); + makefile->output_file, strerror(errno)); return; } user_info = get_user_info(); @@ -1685,15 +1712,21 @@ static void print_makefile(struct makefile_struct *makefile) "# - make, make all Builds the %s.\n" "# - make archive Archives all source files.\n" "# - make check Checks the semantics of TTCN-3 and ASN.1 " - "modules.\n" - "# - make clean Removes all generated files.\n" + "modules.\n" + "%s" // clean: + "%s" //clean-all "# - make compile Translates TTCN-3 and ASN.1 modules to C++.\n" "# - make dep Creates/updates dependency list.\n" "# - make executable Builds the executable test suite.\n" "# - make library Builds the library archive.\n" "# - make objects Builds the object files without linking the " "executable.\n", user_info, - makefile->library ? "library archive." : "executable test suite"); + makefile->library ? "library archive." : "executable test suite", + (makefile->linkingStrategy && makefile->hierarchical) ? + "# - make clean Removes generated files from project.\n" : + "# - make clean Removes all generated files.\n", + (makefile->linkingStrategy && makefile->hierarchical) ? + "# - make clean-all Removes all generated files from the project hierarchy.\n" : ""); Free(user_info); if (makefile->dynamic) fprintf(fp, "# - make shared_objects Builds the shared object files " @@ -1702,14 +1735,14 @@ static void print_makefile(struct makefile_struct *makefile) fputs("# - make preprocess Preprocess TTCN-3 files.\n", fp); if (makefile->central_storage) { fputs("# WARNING! This Makefile uses pre-compiled files from the " - "following directories:\n", fp); + "following directories:\n", fp); for (i = 0; i < makefile->nBaseDirs; i++) fprintf(fp, "# %s\n", makefile->BaseDirs[i].dir_name); fputs("# The executable tests will be consistent only if all directories " - "use\n" - "# the same platform and the same version of TTCN-3 Test Executor " - "and\n" - "# C++ compiler with the same command line switches.\n\n", fp); + "use\n" + "# the same platform and the same version of TTCN-3 Test Executor " + "and\n" + "# C++ compiler with the same command line switches.\n\n", fp); } if (makefile->gnu_make) { fputs("# WARNING! This Makefile can be used with GNU make only.\n" @@ -1720,8 +1753,10 @@ static void print_makefile(struct makefile_struct *makefile) ".PHONY: all shared_objects executable library objects check clean dep archive", fp); if (makefile->preprocess) fputs(" preprocess", fp); if (add_refd_prjs) { - fputs("\\\n referenced-all referenced-shared_objects referenced-executable referenced-library referenced-objects referenced-check" - "\\\n referenced-clean referenced-archive", fp); + fprintf(fp, "\\\n referenced-all referenced-shared_objects referenced-executable referenced-library referenced-objects referenced-check" + "\\\n referenced-clean%s", + (makefile->linkingStrategy && makefile->hierarchical) ? + "-all" : ""); } fprint_extra_targets(fp, makefile->target_placement_list, "PHONY"); @@ -1731,10 +1766,31 @@ static void print_makefile(struct makefile_struct *makefile) fputs("\n\n", fp); } + if (makefile->linkingStrategy) { + const char* tpd_name = getTPDFileName(makefile->project_name); + if (tpd_name) { + fputs("# Titan Project Descriptor file what this Makefile is generated from.\n", fp); + fprintf(fp, "TPD = %s\n\n", tpd_name); + } + const char* root_dir = getPathToRootDir(makefile->project_name); + if (root_dir) { + fputs("# Relative path to top directory at OS level.\n", fp); + fprintf(fp, "ROOT_DIR = %s\n\n", root_dir); + } + } + if (add_refd_prjs) { - struct string_list* act_elem = makefile->sub_project_dirs; - fputs("# This is the top level makefile of a Makefile hierarchy generated from\n" - "# a Titan Project Descriptor hierarchy. List of referenced project\n" + struct string_list* act_elem = NULL; + struct string_list* head = NULL; + if (makefile->linkingStrategy && makefile->hierarchical) {// pair with free_string_list + head = act_elem = getRefWorkingDirs(makefile->project_name); + } + else { + act_elem = makefile->sub_project_dirs; + } + if (!makefile->linkingStrategy) + fputs("# This is the top level makefile of a Makefile hierarchy generated from\n", fp); + fputs("# Titan Project Descriptor hierarchy. List of referenced project\n" "# working directories (ordered by dependencies):\n", fp); while (act_elem) { if (act_elem->str) { @@ -1742,8 +1798,16 @@ static void print_makefile(struct makefile_struct *makefile) } act_elem = act_elem->next; } + if (makefile->linkingStrategy && makefile->hierarchical) { // pair with getRefWorkingDirs + free_string_list(head); + } fputs("REFERENCED_PROJECT_DIRS = ", fp); - act_elem = makefile->sub_project_dirs; + if (makefile->linkingStrategy && makefile->hierarchical) { + head = act_elem = getRefWorkingDirs(makefile->project_name); // pair with free_string_list + } + else { + act_elem = makefile->sub_project_dirs; + } while (act_elem) { if (act_elem->str) { fprintf(fp, "%s ", act_elem->str); @@ -1751,6 +1815,9 @@ static void print_makefile(struct makefile_struct *makefile) act_elem = act_elem->next; } fputs("\n\n", fp); + if (makefile->linkingStrategy && makefile->hierarchical) {// pair with getRefWorkingDirs + free_string_list(head); + } } fprintf(fp, "#\n" @@ -1819,6 +1886,16 @@ static void print_makefile(struct makefile_struct *makefile) } } + if (makefile->prep_undefines) { + struct string_list* act_elem = makefile->prep_undefines; + while (act_elem) { + if (act_elem->str) { + fprintf(fp, " -U%s", act_elem->str); + } + act_elem = act_elem->next; + } + } + fputs("\n\n", fp); if (makefile->gcc_dep) { @@ -1853,6 +1930,15 @@ static void print_makefile(struct makefile_struct *makefile) act_elem = act_elem->next; } } + if (makefile->ttcn3_prep_undefines) { + struct string_list* act_elem = makefile->ttcn3_prep_undefines; + while (act_elem) { + if (act_elem->str) { + fprintf(fp, " -U%s", act_elem->str); + } + act_elem = act_elem->next; + } + } fputs("\n\n", fp); } @@ -1937,7 +2023,7 @@ static void print_makefile(struct makefile_struct *makefile) fprint_extra_targets(fp, makefile->target_placement_list, "TTCN3_MODULES"); if (makefile->preprocess) { fputs("\n\n" - "# TTCN-3 modules to preprocess:\n" + "# TTCN-3 modules to preprocess:\n" "TTCN3_PP_MODULES =", fp); for (i = 0; i < makefile->nTTCN3PPModules; i++) { const struct module_struct *module = makefile->TTCN3PPModules + i; @@ -1948,21 +2034,58 @@ static void print_makefile(struct makefile_struct *makefile) } if (makefile->central_storage) { fputs("\n\n" - "# TTCN-3 modules used from central project(s):\n" - "BASE_TTCN3_MODULES =", fp); - for (i = 0; i < makefile->nTTCN3Modules; i++) { - const struct module_struct *module = makefile->TTCN3Modules + i; - /* Central storage used AND file is not in the current directory => - * it goes into BASE_TTCN3_MODULES */ - if (module->dir_name != NULL) print_file_name(fp, module); + "# TTCN-3 modules used from central project(s):\n" + "BASE_TTCN3_MODULES =", fp); + if (!makefile->linkingStrategy) { + for (i = 0; i < makefile->nTTCN3Modules; i++) { + const struct module_struct *module = makefile->TTCN3Modules + i; + /* Central storage used AND file is not in the current directory => it goes into BASE_TTCN3_MODULES */ + if (module->dir_name != NULL) print_file_name(fp, module); + } + if (makefile->preprocess) { + fputs("\n\n" + "# TTCN-3 modules to preprocess used from central project(s):\n" + "BASE_TTCN3_PP_MODULES =", fp); + for (i = 0; i < makefile->nTTCN3PPModules; i++) { + const struct module_struct *module = makefile->TTCN3PPModules + i; + if (module->dir_name != NULL && !isTtcnPPFileInLibrary(module->file_name)) + print_file_name(fp, module); + } + } } - if (makefile->preprocess) { + else { // new linking strategy + for (i = 0; i < makefile->nTTCN3Modules; i++) { + const struct module_struct *module = makefile->TTCN3Modules + i; + /* Central storage used AND file is not in the current directory => it goes into BASE_TTCN3_MODULES */ + if (module->dir_name != NULL && !isTtcn3ModuleInLibrary(module->module_name)) + print_file_name(fp, module); + } fputs("\n\n" - "# TTCN-3 modules to preprocess used from central project(s):\n" - "BASE_TTCN3_PP_MODULES =", fp); - for (i = 0; i < makefile->nTTCN3PPModules; i++) { - const struct module_struct *module = makefile->TTCN3PPModules + i; - if (module->dir_name != NULL) print_file_name(fp, module); + "# TTCN-3 library linked modules used from central project(s):\n" + "BASE2_TTCN3_MODULES =", fp); + for (i = 0; i < makefile->nTTCN3Modules; i++) { + const struct module_struct *module = makefile->TTCN3Modules + i; + /* Central storage used AND file is not in the current directory => it goes into BASE_TTCN3_MODULES */ + if (module->dir_name != NULL && isTtcn3ModuleInLibrary(module->module_name)) + print_file_name(fp, module); + } + if (makefile->preprocess) { + fputs("\n\n" + "# TTCN-3 modules to preprocess used from central project(s):\n" + "BASE_TTCN3_PP_MODULES =", fp); + for (i = 0; i < makefile->nTTCN3PPModules; i++) { + const struct module_struct *module = makefile->TTCN3PPModules + i; + if (module->dir_name != NULL && !isTtcnPPFileInLibrary(module->file_name)) + print_file_name(fp, module); + } + fputs("\n\n" + "# TTCN-3 library linked modules to preprocess used from central project(s):\n" + "BASE2_TTCN3_PP_MODULES =", fp); + for (i = 0; i < makefile->nTTCN3PPModules; i++) { + const struct module_struct *module = makefile->TTCN3PPModules + i; + if (module->dir_name != NULL && isTtcnPPFileInLibrary(module->file_name)) + print_file_name(fp, module); + } } } } @@ -1971,7 +2094,7 @@ static void print_makefile(struct makefile_struct *makefile) "# Files to include in TTCN-3 preprocessed modules:\n" "TTCN3_INCLUDES =", fp); for (i = 0; i < makefile->nTTCN3IncludeFiles; i++) - fprintf(fp, " %s", makefile->TTCN3IncludeFiles[i]); + fprintf(fp, " %s", makefile->TTCN3IncludeFiles[i]); fprint_extra_targets(fp, makefile->target_placement_list, "TTCN3_INCLUDES"); } fputs("\n\n" @@ -1980,16 +2103,33 @@ static void print_makefile(struct makefile_struct *makefile) for (i = 0; i < makefile->nASN1Modules; i++) { const struct module_struct *module = makefile->ASN1Modules + i; if (module->dir_name == NULL || !makefile->central_storage) - print_file_name(fp, module); + print_file_name(fp, module); } fprint_extra_targets(fp, makefile->target_placement_list, "ASN1_MODULES"); if (makefile->central_storage) { fputs("\n\n" - "# ASN.1 modules used from central project(s):\n" - "BASE_ASN1_MODULES =", fp); - for (i = 0; i < makefile->nASN1Modules; i++) { - const struct module_struct *module = makefile->ASN1Modules + i; - if (module->dir_name != NULL) print_file_name(fp, module); + "# ASN.1 modules used from central project(s):\n" + "BASE_ASN1_MODULES =", fp); + if (!makefile->linkingStrategy) { + for (i = 0; i < makefile->nASN1Modules; i++) { + const struct module_struct *module = makefile->ASN1Modules + i; + if (module->dir_name != NULL) print_file_name(fp, module); + } + } + else { + for (i = 0; i < makefile->nASN1Modules; i++) { + const struct module_struct *module = makefile->ASN1Modules + i; + if (module->dir_name != NULL && !isAsn1ModuleInLibrary(module->module_name)) + print_file_name(fp, module); + } + fputs("\n\n" + "# ASN.1 library linked modules used from central project(s):\n" + "BASE2_ASN1_MODULES =", fp); + for (i = 0; i < makefile->nASN1Modules; i++) { + const struct module_struct *module = makefile->ASN1Modules + i; + if (module->dir_name != NULL && isAsn1ModuleInLibrary(module->module_name)) + print_file_name(fp, module); + } } } if (makefile->preprocess) { @@ -1998,17 +2138,34 @@ static void print_makefile(struct makefile_struct *makefile) "PREPROCESSED_TTCN3_MODULES =", fp); for (i = 0; i < makefile->nTTCN3PPModules; i++) { const struct module_struct *module = makefile->TTCN3PPModules + i; - if (module->dir_name == NULL || !makefile->central_storage) - print_preprocessed_file_name(fp, module); + if (module->dir_name == NULL || !makefile->central_storage) + print_preprocessed_file_name(fp, module); } if (makefile->central_storage) { fputs("\n\n" "# TTCN-3 files generated by the CPP used from central project(s):\n" "BASE_PREPROCESSED_TTCN3_MODULES =", fp); - for (i = 0; i < makefile->nTTCN3PPModules; i++) { - const struct module_struct *module = makefile->TTCN3PPModules + i; - if (module->dir_name != NULL) - print_preprocessed_file_name(fp, module); + if (!makefile->linkingStrategy) { + for (i = 0; i < makefile->nTTCN3PPModules; i++) { + const struct module_struct *module = makefile->TTCN3PPModules + i; + if (module->dir_name != NULL) + print_preprocessed_file_name(fp, module); + } + } + else { // new linking strategy + for (i = 0; i < makefile->nTTCN3PPModules; i++) { + const struct module_struct *module = makefile->TTCN3PPModules + i; + if (module->dir_name != NULL && !isTtcnPPFileInLibrary(module->file_name)) + print_preprocessed_file_name(fp, module); + } + fputs("\n\n" + "# TTCN-3 library linked files generated by the CPP used from central project(s):\n" + "BASE2_PREPROCESSED_TTCN3_MODULES =", fp); + for (i = 0; i < makefile->nTTCN3PPModules; i++) { + const struct module_struct *module = makefile->TTCN3PPModules + i; + if (module->dir_name != NULL && isTtcnPPFileInLibrary(module->file_name)) + print_preprocessed_file_name(fp, module); + } } } } @@ -2080,11 +2237,12 @@ static void print_makefile(struct makefile_struct *makefile) fputs("\nGENERATED_HEADERS =", fp); if (makefile->gnu_make) { fputs(" $(GENERATED_SOURCES:.cc=.hh)", fp); - } else { + } + else { for (i = 0; i < makefile->nTTCN3Modules; i++) { - const struct module_struct *module = makefile->TTCN3Modules + i; - if (module->dir_name == NULL || !makefile->central_storage) - print_generated_file_name(fp, module, FALSE, ".hh"); + const struct module_struct *module = makefile->TTCN3Modules + i; + if (module->dir_name == NULL || !makefile->central_storage) + print_generated_file_name(fp, module, FALSE, ".hh"); } if (makefile->preprocess) { for (i = 0; i < makefile->nTTCN3PPModules; i++) { @@ -2094,9 +2252,9 @@ static void print_makefile(struct makefile_struct *makefile) } } for (i = 0; i < makefile->nASN1Modules; i++) { - const struct module_struct *module = makefile->ASN1Modules + i; - if (module->dir_name == NULL || !makefile->central_storage) - print_generated_file_name(fp, module, FALSE, ".hh"); + const struct module_struct *module = makefile->ASN1Modules + i; + if (module->dir_name == NULL || !makefile->central_storage) + print_generated_file_name(fp, module, FALSE, ".hh"); } } if (makefile->central_storage) { @@ -2168,36 +2326,74 @@ static void print_makefile(struct makefile_struct *makefile) } fputs("\nBASE_GENERATED_HEADERS =", fp); if (makefile->gnu_make) { - fputs(" $(BASE_GENERATED_SOURCES:.cc=.hh)", fp); + fputs(" $(BASE_GENERATED_SOURCES:.cc=.hh)", fp); } else { - for (i = 0; i < makefile->nTTCN3Modules; i++) { - const struct module_struct *module = makefile->TTCN3Modules + i; - if (module->dir_name != NULL) - print_generated_file_name(fp, module, TRUE, ".hh"); - } - if (makefile->preprocess) { - for (i = 0; i < makefile->nTTCN3PPModules; i++) { - const struct module_struct *module = makefile->TTCN3PPModules + i; - if (module->dir_name != NULL) - print_generated_file_name(fp, module, TRUE, ".hh"); - } - } - for (i = 0; i < makefile->nASN1Modules; i++) { - const struct module_struct *module = makefile->ASN1Modules + i; - if (module->dir_name != NULL) - print_generated_file_name(fp, module, TRUE, ".hh"); - } + for (i = 0; i < makefile->nTTCN3Modules; i++) { + const struct module_struct *module = makefile->TTCN3Modules + i; + if (module->dir_name != NULL) + print_generated_file_name(fp, module, TRUE, ".hh"); + } + if (makefile->preprocess) { + for (i = 0; i < makefile->nTTCN3PPModules; i++) { + const struct module_struct *module = makefile->TTCN3PPModules + i; + if (module->dir_name != NULL) + print_generated_file_name(fp, module, TRUE, ".hh"); + } + } + for (i = 0; i < makefile->nASN1Modules; i++) { + const struct module_struct *module = makefile->ASN1Modules + i; + if (module->dir_name != NULL) + print_generated_file_name(fp, module, TRUE, ".hh"); + } + } + } + + if (makefile->linkingStrategy) { + fputs("\n\n" + "# C++ source & header files generated from the TTCN-3 " + " library linked modules of\n" + "# central project(s):\n" + "BASE2_GENERATED_SOURCES =", fp); + if (makefile->gnu_make && makefile->BaseTTCN3ModulesRegular) { + fputs(" $(BASE2_TTCN3_MODULES:.ttcn=.cc)", fp); + fputs(" $(BASE2_ASN1_MODULES:.asn=.cc)", fp); + if (makefile->preprocess) + fputs(" $(BASE2_TTCN3_PP_MODULES:.ttcnpp=.cc)", fp); + } + else { + for (i = 0; i < makefile->nTTCN3Modules; i++) { + const struct module_struct *module = makefile->TTCN3Modules + i; + if (module->dir_name != NULL && isTtcn3ModuleInLibrary(module->module_name)) { + print_generated_file_name(fp, module, TRUE, ".cc"); + } + } + if (makefile->preprocess) { + for (i = 0; i < makefile->nTTCN3PPModules; i++) { + const struct module_struct *module = makefile->TTCN3PPModules + i; + if (module->dir_name != NULL && isTtcnPPFileInLibrary(module->file_name)) { + print_generated_file_name(fp, module, TRUE, ".cc"); + } + } + } } + + fputs("\nBASE2_GENERATED_HEADERS =", fp); + if (makefile->gnu_make) { + fputs(" $(BASE2_GENERATED_SOURCES:.cc=.hh)", fp); + } + else + ERROR("the usage of 'Z' flag requires GNU make"); } + fputs("\n\n" "# C/C++ Source & header files of Test Ports, external functions " - "and\n" - "# other modules:\n" + "and\n" + "# other modules:\n" "USER_SOURCES =", fp); for (i = 0; i < makefile->nUserFiles; i++) { const struct user_struct *user = makefile->UserFiles + i; if (user->dir_name == NULL || !makefile->central_storage) - print_source_name(fp, user); + print_source_name(fp, user); } fprint_extra_targets(fp, makefile->target_placement_list, "USER_SOURCES"); fputs("\nUSER_HEADERS =", fp); @@ -2205,35 +2401,80 @@ static void print_makefile(struct makefile_struct *makefile) fputs(" $(USER_SOURCES:.cc=.hh)", fp); } else { for (i = 0; i < makefile->nUserFiles; i++) { - const struct user_struct *user = makefile->UserFiles + i; - if (user->dir_name == NULL || !makefile->central_storage) - print_header_name(fp, user); + const struct user_struct *user = makefile->UserFiles + i; + if (user->dir_name == NULL || !makefile->central_storage) + print_header_name(fp, user); } } fprint_extra_targets(fp, makefile->target_placement_list, "USER_HEADERS"); if (makefile->central_storage) { fputs("\n\n" "# C/C++ Source & header files of Test Ports, external functions " - "and\n" - "# other modules used from central project(s):\n" + "and\n" + "# other modules used from central project(s):\n" "BASE_USER_SOURCES =", fp); - for (i = 0; i < makefile->nUserFiles; i++) { - const struct user_struct *user = makefile->UserFiles + i; - if (user->dir_name != NULL) - print_source_name(fp, user); + if (!makefile->linkingStrategy) { + for (i = 0; i < makefile->nUserFiles; i++) { + const struct user_struct *user = makefile->UserFiles + i; + if (user->dir_name != NULL) { + print_source_name(fp, user); + } + } + fputs("\nBASE_USER_HEADERS =", fp); + if (makefile->gnu_make && makefile->BaseUserHeadersRegular) { + fputs(" $(BASE_USER_SOURCES:.cc=.hh)", fp); + } + else { + for (i = 0; i < makefile->nUserFiles; i++) { + const struct user_struct *user = makefile->UserFiles + i; + if (user->dir_name != NULL) + print_header_name(fp, user); + } + } } - fputs("\nBASE_USER_HEADERS =", fp); - if (makefile->gnu_make && makefile->BaseUserHeadersRegular) { - fputs(" $(BASE_USER_SOURCES:.cc=.hh)", fp); - } else { - for (i = 0; i < makefile->nUserFiles; i++) { - const struct user_struct *user = makefile->UserFiles + i; - if (user->dir_name != NULL) - print_header_name(fp, user); - } + else { + for (i = 0; i < makefile->nUserFiles; i++) { + const struct user_struct *user = makefile->UserFiles + i; + if (user->dir_name != NULL && !isSourceFileInLibrary(user->source_name)) { + print_source_name(fp, user); + } + } + fputs("\nBASE_USER_HEADERS =", fp); + if (makefile->gnu_make && makefile->BaseUserHeadersRegular) { + fputs(" $(BASE_USER_SOURCES:.cc=.hh)", fp); + } + else { + for (i = 0; i < makefile->nUserFiles; i++) { + const struct user_struct *user = makefile->UserFiles + i; + if (user->dir_name != NULL && !isHeaderFileInLibrary(user->header_name)) + print_header_name(fp, user); + } + } + + fputs("\n\n" + "# C/C++ Source & header files of Test Ports, external functions " + "and\n" + "# other modules used from library linked central project(s):\n" + "BASE2_USER_SOURCES =", fp); + for (i = 0; i < makefile->nUserFiles; i++) { + const struct user_struct *user = makefile->UserFiles + i; + if (user->dir_name != NULL && isSourceFileInLibrary(user->source_name)) { + print_source_name(fp, user); + } + } + fputs("\nBASE2_USER_HEADERS =", fp); + if (makefile->gnu_make && makefile->BaseUserHeadersRegular) { + fputs(" $(BASE2_USER_SOURCES:.cc=.hh)", fp); + } + else { + for (i = 0; i < makefile->nUserFiles; i++) { + const struct user_struct *user = makefile->UserFiles + i; + if (user->dir_name != NULL && isHeaderFileInLibrary(user->header_name)) + print_header_name(fp, user); + } + } } } - if (makefile->dynamic) { fputs("\n\n" "# Shared object files of this project:\n" @@ -2299,7 +2540,7 @@ static void print_makefile(struct makefile_struct *makefile) fputs("\n\n" "# Object files of this project that are needed for the executable " - "test suite:\n" + "test suite:\n" "OBJECTS = $(GENERATED_OBJECTS) $(USER_OBJECTS)\n\n" /* never := */ "GENERATED_OBJECTS =", fp); if (makefile->gnu_make) { @@ -2376,77 +2617,170 @@ static void print_makefile(struct makefile_struct *makefile) fputs("\n\n" "# Shared object files of central project(s):\n" "BASE_SHARED_OBJECTS =", fp); + if (!makefile->linkingStrategy) { + if (makefile->gnu_make) { + fputs(" $(BASE_GENERATED_SOURCES:.cc=.so)", fp); + } + else { + for (i = 0; i < makefile->nTTCN3Modules; i++) { + const struct module_struct *module = makefile->TTCN3Modules + i; + if (module->dir_name != NULL) + print_generated_file_name(fp, module, TRUE, ".so"); + } + if (makefile->preprocess) { + for (i = 0; i < makefile->nTTCN3PPModules; i++) { + const struct module_struct *module = + makefile->TTCN3PPModules + i; + if (module->dir_name != NULL) + print_generated_file_name(fp, module, TRUE, ".so"); + } + } + for (i = 0; i < makefile->nASN1Modules; i++) { + const struct module_struct *module = makefile->ASN1Modules + i; + if (module->dir_name != NULL) + print_generated_file_name(fp, module, TRUE, ".so"); + } + } + if (makefile->gnu_make && makefile->BaseUserSourcesRegular) { + fputs(" $(BASE_USER_SOURCES:.cc=.so)", fp); + } + else { + for (i = 0; i < makefile->nUserFiles; i++) { + const struct user_struct *user = makefile->UserFiles + i; + if (user->dir_name != NULL) + print_shared_object_name(fp, user); + } + } + } + else { // new linkingStrategy + if (makefile->gnu_make) { + fputs(" $(BASE_GENERATED_SOURCES:.cc=.so)", fp); + } + else + ERROR("the usage of 'Z' flag requires GNU make"); + + if (makefile->gnu_make && makefile->BaseUserSourcesRegular) { + fputs(" $(BASE_USER_SOURCES:.cc=.so)", fp); + } + else { + for (i = 0; i < makefile->nUserFiles; i++) { + const struct user_struct *user = makefile->UserFiles + i; + if (user->dir_name != NULL && !isSourceFileInLibrary(user->source_name)) + print_shared_object_name(fp, user); + } + } + } + } /* if dynamic */ + fputs("\n\n" + "# Object files of central project(s) that are needed for the " + "executable test suite:\n" + "BASE_OBJECTS =", fp); + if (!makefile->linkingStrategy) { if (makefile->gnu_make) { - fputs(" $(BASE_GENERATED_SOURCES:.cc=.so)", fp); - } else { + fputs(" $(BASE_GENERATED_SOURCES:.cc=.o)", fp); + } + else { for (i = 0; i < makefile->nTTCN3Modules; i++) { const struct module_struct *module = makefile->TTCN3Modules + i; if (module->dir_name != NULL) - print_generated_file_name(fp, module, TRUE, ".so"); + print_generated_file_name(fp, module, TRUE, ".o"); } if (makefile->preprocess) { for (i = 0; i < makefile->nTTCN3PPModules; i++) { - const struct module_struct *module = - makefile->TTCN3PPModules + i; + const struct module_struct *module = makefile->TTCN3PPModules + i; if (module->dir_name != NULL) - print_generated_file_name(fp, module, TRUE, ".so"); + print_generated_file_name(fp, module, TRUE, ".o"); } } for (i = 0; i < makefile->nASN1Modules; i++) { const struct module_struct *module = makefile->ASN1Modules + i; if (module->dir_name != NULL) - print_generated_file_name(fp, module, TRUE, ".so"); + print_generated_file_name(fp, module, TRUE, ".o"); } } if (makefile->gnu_make && makefile->BaseUserSourcesRegular) { - fputs(" $(BASE_USER_SOURCES:.cc=.so)", fp); - } else { + fputs(" $(BASE_USER_SOURCES:.cc=.o)", fp); + } + else { for (i = 0; i < makefile->nUserFiles; i++) { const struct user_struct *user = makefile->UserFiles + i; if (user->dir_name != NULL) - print_shared_object_name(fp, user); + print_object_name(fp, user); } } - } /* if dynamic */ - fputs("\n\n" - "# Object files of central project(s) that are needed for the " - "executable test suite:\n" - "BASE_OBJECTS =", fp); - if (makefile->gnu_make) { - fputs(" $(BASE_GENERATED_SOURCES:.cc=.o)", fp); - } else { - for (i = 0; i < makefile->nTTCN3Modules; i++) { - const struct module_struct *module = makefile->TTCN3Modules + i; - if (module->dir_name != NULL) - print_generated_file_name(fp, module, TRUE, ".o"); + } + else { // new linkingStrategy + if (makefile->gnu_make) { + fputs(" $(BASE_GENERATED_SOURCES:.cc=.o)", fp); } - if (makefile->preprocess) { - for (i = 0; i < makefile->nTTCN3PPModules; i++) { - const struct module_struct *module = makefile->TTCN3PPModules + i; - if (module->dir_name != NULL) - print_generated_file_name(fp, module, TRUE, ".o"); - } + else + ERROR("the usage of 'Z' flag requires GNU make"); + + if (makefile->gnu_make && makefile->BaseUserSourcesRegular) { + fputs(" $(BASE_USER_SOURCES:.cc=.o)", fp); } - for (i = 0; i < makefile->nASN1Modules; i++) { - const struct module_struct *module = makefile->ASN1Modules + i; - if (module->dir_name != NULL) - print_generated_file_name(fp, module, TRUE, ".o"); + else { + for (i = 0; i < makefile->nUserFiles; i++) { + const struct user_struct *user = makefile->UserFiles + i; + if (user->dir_name != NULL && !isSourceFileInLibrary(user->source_name)) + print_object_name(fp, user); + } } } + } + if (makefile->linkingStrategy) { + fputs("\n\n" + "# Object files of library linked central project(s) that are needed for the " + "executable test suite:\n" + "BASE2_OBJECTS =", fp); + if (makefile->gnu_make) { + if (makefile->dynamic) + fputs(" $(BASE2_GENERATED_SOURCES:.cc=.so)", fp); + else + fputs(" $(BASE2_GENERATED_SOURCES:.cc=.o)", fp); + } + else ERROR("the usage of 'Z' flag requires GNU make"); + if (makefile->gnu_make && makefile->BaseUserSourcesRegular) { - fputs(" $(BASE_USER_SOURCES:.cc=.o)", fp); - } else { + if (makefile->dynamic) + fputs(" $(BASE2_USER_SOURCES:.cc=.so)", fp); + else + fputs(" $(BASE2_USER_SOURCES:.cc=.o)", fp); + } + else { for (i = 0; i < makefile->nUserFiles; i++) { const struct user_struct *user = makefile->UserFiles + i; - if (user->dir_name != NULL) - print_object_name(fp, user); + if (user->dir_name != NULL && isSourceFileInLibrary(user->source_name)) { + if (makefile->dynamic) + print_shared_object_name(fp, user); + else + print_object_name(fp, user); + } + } + } + if (makefile->hierarchical) { + fputs("\n\n" + "#Libraries of referenced project(s) that are needed for the " + "executable or library target:\n" + "BASE2_LIBRARY =", fp); + struct string2_list* head = getLinkerLibs(makefile->project_name); + struct string2_list* act_elem = head; + while (act_elem) { + if (act_elem->str2) { + fputs(" ", fp); + fprintf(fp, "%s/lib%s.%s", act_elem->str1, act_elem->str2, + isDynamicLibrary(act_elem->str2) ? "so" : "a"); + } + act_elem = act_elem->next; } + free_string2_list(head); } } + fputs("\n\n" - "# Other files of the project (Makefile, configuration files, etc.)\n" - "# that will be added to the archived source files:\n" - "OTHER_FILES =", fp); + "# Other files of the project (Makefile, configuration files, etc.)\n" + "# that will be added to the archived source files:\n" + "OTHER_FILES =", fp); for (i = 0; i < makefile->nOtherFiles; i++) fprintf(fp, " %s", makefile->OtherFiles[i]); fprint_extra_targets(fp, makefile->target_placement_list, "OTHER_FILES"); @@ -2465,19 +2799,35 @@ static void print_makefile(struct makefile_struct *makefile) fputs(".exe", fp); } #endif - fputs("\n", fp); - + fputs("\n\n", fp); + if (makefile->linkingStrategy) { +#ifndef WIN32 + fputs("DYNAMIC_LIBRARY = lib$(EXECUTABLE).so\n", fp); + fputs("STATIC_LIBRARY = lib$(EXECUTABLE).a\n", fp); +#else + char* name_prefix = cut_suffix(makefile->ets_name); + fprintf(fp, "DYNAMIC_LIBRARY = lib%s.so\n", name_prefix); + fprintf(fp, "STATIC_LIBRARY = lib%s.a\n", name_prefix); + Free(name_prefix); +#endif + } /* LIBRARY variable */ ets_suffix = get_suffix(makefile->ets_name); if (ets_suffix != NULL && !strcmp(ets_suffix, "exe")) { char* name_prefix = cut_suffix(makefile->ets_name); - fprintf(fp, "\n\nLIBRARY = %s%s\n", name_prefix ? name_prefix : "library", - makefile->dynamic ? "_lib.so" : ".a"); - Free(name_prefix); - } else { - fprintf(fp, "\n\nLIBRARY = %s%s\n", makefile->ets_name, - makefile->dynamic ? "_lib.so" : ".a"); + fprintf(fp, "\n\nLIBRARY = %s%s%s\n", "lib", name_prefix ? name_prefix : "library", + makefile->dynamic ? ".so" : ".a"); + Free(name_prefix); } + else { +#ifndef WIN32 + fprintf(fp, "\n\nLIBRARY = lib$(EXECUTABLE)%s\n", + makefile->dynamic ? ".so" : ".a"); +#else + fprintf(fp, "\n\nLIBRARY = lib%s%s\n", + makefile->ets_name, makefile->dynamic ? ".so" : ".a"); +#endif + } } else { fputs("\n\n" @@ -2485,10 +2835,20 @@ static void print_makefile(struct makefile_struct *makefile) "EXECUTABLE =\n" "LIBRARY =\n", fp); } - - fprintf(fp, "\n" + if (!makefile->linkingStrategy || !buildObjects(makefile->project_name, add_refd_prjs)) { + fprintf(fp, "\n" "TARGET = $(%s)", makefile->library ? "LIBRARY" : "EXECUTABLE"); - + } + else { + if (makefile->dynamic) { + fputs("\n" + "TARGET = $(SHARED_OBJECTS)", fp); + } + else { + fputs("\n" + "TARGET = $(OBJECTS)", fp); + } + } fputs("\n\n" "#\n" "# Do not modify these unless you know what you are doing...\n" @@ -2583,8 +2943,10 @@ static void print_makefile(struct makefile_struct *makefile) /* There is no need to create the .so for all the source files */ fputs("$(EXECUTABLE): $(LIBRARY)\n" "\tif $(CXX) $(LDFLAGS) -o $@ $(LIBRARY)", fp); - } else { - fprintf(fp, "$(EXECUTABLE): %s", makefile->dynamic ? "$(SHARED_OBJECTS)" : "$(OBJECTS)"); + } + else { + fprintf(fp, "$(EXECUTABLE): %s", makefile->dynamic ? "$(SHARED_OBJECTS)" : "$(OBJECTS)"); + if (!makefile->linkingStrategy) { // use the old linking method if (makefile->central_storage) { if (makefile->dynamic) { fputs(" $(BASE_SHARED_OBJECTS)", fp); @@ -2592,19 +2954,39 @@ static void print_makefile(struct makefile_struct *makefile) fputs(" $(BASE_OBJECTS)", fp); } } - fputs("\n" - "\tif $(CXX) $(LDFLAGS) -o $@ ", fp); /* start writing the link step */ - if (makefile->gnu_make) fputs("$^", fp); - else { + } + else { + if (!makefile->library) { if (makefile->dynamic) { - fputs("$(SHARED_OBJECTS)", fp); + fputs(" $(BASE_SHARED_OBJECTS)", fp); + } + else { + fputs(" $(BASE_OBJECTS)", fp); + } + if (makefile->hierarchical) { + fputs(" $(BASE2_LIBRARY)", fp); + } + } + } + fprintf(fp, "\n" + "\tif $(CXX) $(LDFLAGS) -o $@ %s", +#if defined (SOLARIS) || defined (SOLARIS8) + ""); +#else + makefile->dynamic ? "-Wl,--no-as-needed " : ""); /* start writing the link step */ +#endif + if (makefile->gnu_make) fputs("$^", fp); + else { + if (makefile->dynamic) { + fputs("$(SHARED_OBJECTS)", fp); if (makefile->central_storage) - fputs(" $(BASE_SHARED_OBJECTS)", fp); - } else { - fputs("$(OBJECTS)", fp); + fputs(" $(BASE_SHARED_OBJECTS)", fp); + } + else { + fputs("$(OBJECTS)", fp); if (makefile->central_storage) - fputs(" $(BASE_OBJECTS)", fp); - } + fputs(" $(BASE_OBJECTS)", fp); + } } } @@ -2622,27 +3004,65 @@ static void print_makefile(struct makefile_struct *makefile) "\t-L$(TTCN3_DIR)/lib -l$(TTCN3_LIB)" " \\\n" "\t-L$(OPENSSL_DIR)/lib -lcrypto"); - if (makefile->linkerlibraries) { - struct string_list* act_elem = makefile->linkerlibraries; - while (act_elem) { - if (act_elem->str) { - fprintf(fp, " -l%s", act_elem->str); + if (!makefile->linkingStrategy) { + if (makefile->linkerlibraries) { + struct string_list* act_elem = makefile->linkerlibraries; + while (act_elem) { + if (act_elem->str) { + fprintf(fp, " -l%s", act_elem->str); + } + act_elem = act_elem->next; } - act_elem = act_elem->next; } - } - if (makefile->linkerlibsearchpath) { - struct string_list* act_elem = makefile->linkerlibsearchpath; - while (act_elem) { - if (act_elem->str) { - fprintf(fp, " -L%s", act_elem->str); + if (makefile->linkerlibsearchpath) { + struct string_list* act_elem = makefile->linkerlibsearchpath; + while (act_elem) { + if (act_elem->str) { + fprintf(fp, " -L%s", act_elem->str); + } + act_elem = act_elem->next; } - act_elem = act_elem->next; } + fprintf(fp, " \\\n" + "\t-L$(XMLDIR)/lib $($(PLATFORM)_LIBS); \\\n" + "\tthen : ; else $(TTCN3_DIR)/bin/titanver $(OBJECTS); exit 1; fi\n"); + } + else { // new linking strategy + fputs (" \\\n", fp); + if (makefile->linkerlibraries && !makefile->library) { + struct string2_list* head = getLinkerLibs(makefile->project_name); + struct string2_list* act_elem = head; + while (act_elem) { + if (act_elem->str1 && act_elem->str2) { + fprintf(fp, "\t-L%s -Wl,-rpath=%s -l%s \\\n", act_elem->str1, act_elem->str1, act_elem->str2); + } + act_elem = act_elem->next; + } + free_string2_list(head); + + struct string_list* act_head = getExternalLibPathes(makefile->project_name); + struct string_list* act_ext_elem = act_head; + while (act_ext_elem) { + if (act_ext_elem->str) { + fprintf(fp, "\t-L%s \\\n", act_ext_elem->str); + } + act_ext_elem = act_ext_elem->next; + } + free_string_list(act_head); + act_head = getExternalLibs(makefile->project_name); + act_ext_elem = act_head; + while (act_ext_elem) { + if (act_ext_elem->str) { + fprintf(fp, "\t-l%s \\\n", act_ext_elem->str); + } + act_ext_elem = act_ext_elem->next; + } + free_string_list(act_head); + } + fprintf(fp, + "\t-L$(XMLDIR)/lib $($(PLATFORM)_LIBS); \\\n" + "\tthen : ; else $(TTCN3_DIR)/bin/titanver $(OBJECTS); exit 1; fi\n"); } - fprintf(fp, " \\\n" - "\t-L$(XMLDIR)/lib $($(PLATFORM)_LIBS); \\\n" - "\tthen : ; else $(TTCN3_DIR)/bin/titanver $(OBJECTS); exit 1; fi\n"); /* If the compiler will not be run because there are no TTCN(PP) or ASN.1 * files, create the "compile" marker file which is checked by the * superior makefile if using this project as central storage */ @@ -2651,21 +3071,115 @@ static void print_makefile(struct makefile_struct *makefile) /* target $(LIBRARY) */ if (makefile->dynamic) { - fputs("\n" - "$(LIBRARY): $(OBJECTS)\n" - "\t$(CXX) -shared -o $@ $(OBJECTS)", fp); - if (makefile->central_storage) { - fputs(" $(BASE_SHARED_OBJECTS)", fp); + fprintf(fp, "\n" + "$(LIBRARY): $(OBJECTS)%s\n" + "\t$(CXX) -shared -o $@ $(OBJECTS)", + makefile->hierarchical ? " $(BASE2_LIBRARY)" : ""); + if (makefile->central_storage && !makefile->linkingStrategy) { + fputs(" $(BASE_SHARED_OBJECTS) ;\n" + "\tln -s $@ $(subst lib, ,$@) > /dev/null 2>&1 ;", fp); } - } else { - fputs("\n" - "$(LIBRARY): $(OBJECTS)\n" - "\t$(AR) -r $(ARFLAGS) $(LIBRARY) $(OBJECTS)", fp); - if (makefile->central_storage) { + if (makefile->linkingStrategy) { + struct string2_list* head = getLinkerLibs(makefile->project_name); + struct string2_list* act_elem = head; + // If the project is Executable on Top Level the linker can link the *.a and *.so together + while (act_elem && !isTopLevelExecutable(makefile->project_name)) { + if (act_elem->str1 && act_elem->str2 && isDynamicLibrary(act_elem->str2)) { + fputs(" \\\n", fp); + fprintf(fp, "\t-L%s -Wl,-rpath=%s -l%s", act_elem->str1, act_elem->str1, act_elem->str2); + } + else { + const char* mainLibName = getLibFromProject(makefile->project_name); + ERROR("Library archive 'lib%s.a' cannot be linked to dynamic library 'lib%s.so' " + "in project '%s' ", + act_elem->str2, mainLibName ? mainLibName : "", makefile->project_name); + free_string2_list(head); + exit(EXIT_FAILURE); + } + act_elem = act_elem->next; + } + free_string2_list(head); + struct string_list* act_head = getExternalLibPathes(makefile->project_name); + struct string_list* act_ext_elem = act_head; + while (act_ext_elem) { + if (act_ext_elem->str) { + fputs(" \\\n", fp); + fprintf(fp, "\t-L%s", act_ext_elem->str); + } + act_ext_elem = act_ext_elem->next; + } + free_string_list(act_head); + act_head = getExternalLibs(makefile->project_name); + act_ext_elem = act_head; + while (act_ext_elem) { + if (act_ext_elem->str) { + fputs(" \\\n", fp); + fprintf(fp, "\t-l%s", act_ext_elem->str); + } + act_ext_elem = act_ext_elem->next; + } + free_string_list(act_head); + } + } + else { // static linking + fprintf(fp, "\n" + "$(LIBRARY): $(OBJECTS)%s\n" + "\t$(AR) -r%s $(ARFLAGS) $(LIBRARY) $(OBJECTS)", + makefile->hierarchical ? " $(BASE2_LIBRARY)" : "", + makefile->linkingStrategy ? "cT" : ""); + if (makefile->central_storage && !makefile->linkingStrategy) { fputs(" $(BASE_OBJECTS)", fp); } + if (makefile->linkingStrategy) { + if ( makefile->library) { + struct string2_list* head = getLinkerLibs(makefile->project_name); + struct string2_list* act_elem = head; + while (act_elem) { + if (act_elem->str2 && !isDynamicLibrary(act_elem->str2)) { + fputs(" \\\n", fp); + fprintf(fp, "\t%s/lib%s.a", act_elem->str1, act_elem->str2); + } + else { + const char* mainLibName = getLibFromProject(makefile->project_name); + if (act_elem->str2) { + ERROR("Dynamic library 'lib%s.so' cannot be linked to static library 'lib%s.a' " + "in project '%s' ", + act_elem->str2, mainLibName ? mainLibName : "", makefile->project_name); + exit(EXIT_FAILURE); + } + else { + struct string_list* ext_libs = getExternalLibs(makefile->project_name); + if (ext_libs && ext_libs->str) { + ERROR("Third party dynamic library '%s' cannot be linked to static library 'lib%s.a' " + "in project '%s' ", ext_libs->str, + mainLibName ? mainLibName : "", makefile->project_name); + free_string_list(ext_libs); + exit(EXIT_FAILURE); + } + free_string_list(ext_libs); + } + } + act_elem = act_elem->next; + } + free_string2_list(head); + + struct string_list* act_head = getExternalLibs(makefile->project_name); + struct string_list* act_ext_elem = act_head; + while (act_ext_elem) { + if (act_ext_elem->str && hasExternalLibrary(act_ext_elem->str, makefile->project_name)) { + fputs(" \\\n", fp); + fprintf(fp, "\tlib%s.a", act_ext_elem->str); + ERROR("linking static 3d party or sytem library 'lib%s.a' to " + "project library 'lib%s.a' is not supported ", + act_ext_elem->str, makefile->ets_name); + exit(EXIT_FAILURE); + } + act_ext_elem = act_ext_elem->next; + } + free_string_list(act_head); + } + } } - fputs("\n\n.cc.o .c.o:\n" "\t$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) -o $@ $<\n\n", fp); @@ -2698,7 +3212,9 @@ static void print_makefile(struct makefile_struct *makefile) if (makefile->central_storage) { boolean is_first = TRUE; - fputs("$(GENERATED_SOURCES) $(GENERATED_HEADERS): compile-all compile ", fp); + fprintf(fp, "$(GENERATED_SOURCES) $(GENERATED_HEADERS):%s compile-all compile ", + makefile->hierarchical ? " update" : ""); + if (add_refd_prjs) fputs("referenced-dep", fp); /* These extra compile dependencies for the generated .cc are here to * check if all the referenced projects are up to date. @@ -2707,175 +3223,260 @@ static void print_makefile(struct makefile_struct *makefile) */ if (!add_refd_prjs) for (i = 0; i < makefile->nBaseDirs; i++) { const struct base_dir_struct *base_dir = makefile->BaseDirs + i; - if (base_dir->has_modules) { - if (is_first) { - fputs(" \\\n", fp); - is_first = FALSE; - } else putc(' ', fp); - fprintf(fp, "%s/compile", base_dir->dir_name); - } + if (base_dir->has_modules) { + if (is_first) { + fputs(" \\\n", fp); + is_first = FALSE; + } + else putc(' ', fp); + fprintf(fp, "%s/compile", base_dir->dir_name); + } } - if (makefile->preprocess) { - fprintf(fp, "\n" - "\t@if [ ! -f $@ ]; then %s compile-all; $(MAKE) compile-all; fi\n" - "\n" - "check:%s $(TTCN3_MODULES) $(BASE_TTCN3_MODULES) \\\n" - "\t$(PREPROCESSED_TTCN3_MODULES) $(BASE_PREPROCESSED_TTCN3_MODULES) " - "\\\n" - "\t$(ASN1_MODULES) $(BASE_ASN1_MODULES)\n" - "\t$(TTCN3_DIR)/bin/compiler -s $(COMPILER_FLAGS) ", rm_command, add_refd_prjs?" referenced-check":""); - if (makefile->gnu_make) { - if (add_refd_prjs) // referenced-check cannot be compiled it is not a ttcn modul - fputs("$(TTCN3_MODULES) $(BASE_TTCN3_MODULES) \\\n" - "\t$(PREPROCESSED_TTCN3_MODULES) $(BASE_PREPROCESSED_TTCN3_MODULES) " - "\\\n" - "\t$(ASN1_MODULES) $(BASE_ASN1_MODULES)\n", fp); - else - fputs("$^", fp); - } - else { - fputs("\\\n" - "\t$(TTCN3_MODULES) $(BASE_TTCN3_MODULES) \\\n" - "\t$(PREPROCESSED_TTCN3_MODULES) " - "$(BASE_PREPROCESSED_TTCN3_MODULES) \\\n" - "\t$(ASN1_MODULES) $(BASE_ASN1_MODULES)", fp); - } - fputs("\n\n" - "compile: $(TTCN3_MODULES) $(PREPROCESSED_TTCN3_MODULES) " - "$(ASN1_MODULES)\n" - "\t$(TTCN3_DIR)/bin/compiler $(COMPILER_FLAGS) \\\n" - "\t$(TTCN3_MODULES) $(BASE_TTCN3_MODULES) \\\n" - "\t$(PREPROCESSED_TTCN3_MODULES) " - "$(BASE_PREPROCESSED_TTCN3_MODULES) \\\n" - "\t$(ASN1_MODULES) $(BASE_ASN1_MODULES) - $?\n" - "\ttouch $@\n" - "\n" - "compile-all: $(BASE_TTCN3_MODULES) " - "$(BASE_PREPROCESSED_TTCN3_MODULES) \\\n" - "$(BASE_ASN1_MODULES)\n" - "\t$(MAKE) preprocess\n" - "\t$(TTCN3_DIR)/bin/compiler $(COMPILER_FLAGS) \\\n" - "\t$(TTCN3_MODULES) $(BASE_TTCN3_MODULES) \\\n" - "\t$(PREPROCESSED_TTCN3_MODULES) $(BASE_PREPROCESSED_TTCN3_MODULES) " - "\\\n" - "\t$(ASN1_MODULES) $(BASE_ASN1_MODULES) \\\n" - "\t- $(TTCN3_MODULES) $(PREPROCESSED_TTCN3_MODULES) $(ASN1_MODULES)\n" - "\ttouch $@ compile\n\n", fp); - } else { - fprintf(fp, "\n" - "\t@if [ ! -f $@ ]; then %s compile-all; $(MAKE) compile-all; fi\n" - "\n" - "check:%s $(TTCN3_MODULES) $(BASE_TTCN3_MODULES) \\\n" - "\t$(ASN1_MODULES) $(BASE_ASN1_MODULES)\n" - "\t$(TTCN3_DIR)/bin/compiler -s $(COMPILER_FLAGS) ", rm_command, add_refd_prjs?" referenced-check":""); - if (makefile->gnu_make) { - if (add_refd_prjs) // referenced-check cannot be compiled it is not a ttcn modul - fputs("$(TTCN3_MODULES) $(BASE_TTCN3_MODULES) \\\n" - "\t$(ASN1_MODULES) $(BASE_ASN1_MODULES)\n", fp); - else - fputs("$^", fp); - } - else { - fputs("\\\n" - "\t$(TTCN3_MODULES) $(BASE_TTCN3_MODULES) \\\n" - "\t$(ASN1_MODULES) $(BASE_ASN1_MODULES)", fp); - } - fputs("\n\n" - "compile: $(TTCN3_MODULES) $(ASN1_MODULES)\n" - "\t$(TTCN3_DIR)/bin/compiler $(COMPILER_FLAGS) \\\n" - "\t$(TTCN3_MODULES) $(BASE_TTCN3_MODULES) \\\n" - "\t$(ASN1_MODULES) $(BASE_ASN1_MODULES) \\\n" - "\t- $?\n" - "\ttouch $@\n" - "\n" - "compile-all: $(BASE_TTCN3_MODULES) $(BASE_ASN1_MODULES)\n" - "\t$(TTCN3_DIR)/bin/compiler $(COMPILER_FLAGS) \\\n" - "\t$(TTCN3_MODULES) $(BASE_TTCN3_MODULES) \\\n" - "\t$(ASN1_MODULES) $(BASE_ASN1_MODULES) \\\n" - "\t- $(TTCN3_MODULES) $(ASN1_MODULES)\n" - "\ttouch $@ compile\n\n", fp); - } - for (i = 0; i < makefile->nBaseDirs; i++) { - const struct base_dir_struct *base_dir = makefile->BaseDirs + i; - if (base_dir->has_modules) { - size_t j; - fprintf(fp, "%s/compile:", base_dir->dir_name); - for (j = 0; j < makefile->nTTCN3Modules; j++) { - const struct module_struct *module = makefile->TTCN3Modules + j; - if (module->dir_name != NULL && - !strcmp(base_dir->dir_name, module->dir_name)) - print_file_name(fp, module); - } - for (j = 0; j < makefile->nTTCN3PPModules; j++) { - const struct module_struct *module = makefile->TTCN3PPModules + j; - if (module->dir_name != NULL && - !strcmp(base_dir->dir_name, module->dir_name)) - print_file_name(fp, module); - } - for (j = 0; j < makefile->nASN1Modules; j++) { - const struct module_struct *module = makefile->ASN1Modules + j; - if (module->dir_name != NULL && - !strcmp(base_dir->dir_name, module->dir_name)) - print_file_name(fp, module); - } - fprintf(fp, "\n" - "\t@echo 'Central directory %s is not up-to-date!'\n" - "\t@exit 2\n\n", base_dir->dir_name); - } + fprintf(fp, "\n" + "\t@if [ ! -f $@ ]; then %s compile-all; $(MAKE) compile-all; fi\n" + "\n" + "check:%s $(TTCN3_MODULES) $(BASE_TTCN3_MODULES) %s\\\n" + "\t$(PREPROCESSED_TTCN3_MODULES) $(BASE_PREPROCESSED_TTCN3_MODULES) " + "%s\\\n" + "\t$(ASN1_MODULES) $(BASE_ASN1_MODULES) %s\n" + "\t$(TTCN3_DIR)/bin/compiler -s $(COMPILER_FLAGS) ", + rm_command, add_refd_prjs?" referenced-check":"", + makefile->linkingStrategy ? "$(BASE2_TTCN3_MODULES) ":"", + makefile->linkingStrategy ? "$(BASE2_PREPROCESSED_TTCN3_MODULES) ":"", + makefile->linkingStrategy ? "$(BASE2_ASN1_MODULES) ":""); + if (makefile->gnu_make) { + if (add_refd_prjs) // referenced-check cannot be compiled it is not a ttcn modul + fprintf(fp, "$(TTCN3_MODULES) $(BASE_TTCN3_MODULES) %s\\\n" + "\t$(PREPROCESSED_TTCN3_MODULES) $(BASE_PREPROCESSED_TTCN3_MODULES) " + "%s\\\n" + "\t$(ASN1_MODULES) $(BASE_ASN1_MODULES) %s\n", + makefile->linkingStrategy ? "$(BASE2_TTCN3_MODULES) ":"", + makefile->linkingStrategy ? "$(BASE2_PREPROCESSED_TTCN3_MODULES) ":"", + makefile->linkingStrategy ? "$(BASE2_ASN1_MODULES) ":""); + else + fputs("$^", fp); + } + else { + fputs("\\\n" + "\t$(TTCN3_MODULES) $(BASE_TTCN3_MODULES) \\\n" + "\t$(PREPROCESSED_TTCN3_MODULES) " + "$(BASE_PREPROCESSED_TTCN3_MODULES) \\\n" + "\t$(ASN1_MODULES) $(BASE_ASN1_MODULES)", fp); + } + if (makefile->linkingStrategy && makefile->hierarchical) { + fputs("\n\n" + "update: $(BASE_TTCN3_MODULES) $(BASE_ASN1_MODULES) $(BASE_PREPROCESSED_TTCN3_MODULES) \\\n" + "\t$(BASE2_TTCN3_MODULES) $(BASE2_ASN1_MODULES) $(BASE2_PREPROCESSED_TTCN3_MODULES)\n" + "ifneq ($(wildcard $(GENERATED_SOURCES)), ) \n" + "ifeq ($(wildcard $?), ) \n" + "\ttouch compile-all; \n" + "\ttouch update; \n" + "endif\n" + "endif",fp); + } + fprintf(fp, "\n\n" + "compile: $(TTCN3_MODULES) $(PREPROCESSED_TTCN3_MODULES) " + "$(ASN1_MODULES)\n" + "\t@echo \"compiling \"'$(patsubst %%.tpd, %%, $(TPD))';\n" + "\t$(TTCN3_DIR)/bin/compiler $(COMPILER_FLAGS) \\\n" + "\t$(TTCN3_MODULES) $(BASE_TTCN3_MODULES) %s\\\n" + "\t$(PREPROCESSED_TTCN3_MODULES) $(BASE_PREPROCESSED_TTCN3_MODULES) %s\\\n" + "\t$(ASN1_MODULES) $(BASE_ASN1_MODULES) %s - $?\n" + "\ttouch $@\n\n", + makefile->linkingStrategy ? "$(BASE2_TTCN3_MODULES) ":"", + makefile->linkingStrategy ? "$(BASE2_PREPROCESSED_TTCN3_MODULES) ":"", + makefile->linkingStrategy ? "$(BASE2_ASN1_MODULES)":""); + fprintf (fp, + "compile-all: $(BASE_TTCN3_MODULES) $(BASE_ASN1_MODULES) $(BASE_PREPROCESSED_TTCN3_MODULES) " + "%s" + "\t$(MAKE) preprocess\n" + "\t@echo \"compiling all \"'$(patsubst %%.tpd, %%, $(TPD))';\n" + "\t$(TTCN3_DIR)/bin/compiler $(COMPILER_FLAGS) \\\n" + "\t$(TTCN3_MODULES) $(BASE_TTCN3_MODULES) %s\\\n" + "\t$(PREPROCESSED_TTCN3_MODULES) $(BASE_PREPROCESSED_TTCN3_MODULES) %s" + "\\\n" + "\t$(ASN1_MODULES) $(BASE_ASN1_MODULES) %s\\\n" + "\t- $(TTCN3_MODULES) $(PREPROCESSED_TTCN3_MODULES) $(ASN1_MODULES)\n" + "\ttouch $@ compile\n\n", + makefile->linkingStrategy ? "\\\n\t$(BASE2_TTCN3_MODULES) $(BASE2_ASN1_MODULES) " + "$(BASE2_PREPROCESSED_TTCN3_MODULES) \n":"\n", + makefile->linkingStrategy ? "$(BASE2_TTCN3_MODULES) ":"", + makefile->linkingStrategy ? "$(BASE2_PREPROCESSED_TTCN3_MODULES) ":"", + makefile->linkingStrategy ? "$(BASE2_ASN1_MODULES) ":""); + } + else { + fprintf(fp, "\n" + "\t@if [ ! -f $@ ]; then %s compile-all; $(MAKE) compile-all; fi\n", rm_command); + fprintf(fp, "\n" + "check:%s $(TTCN3_MODULES) $(BASE_TTCN3_MODULES) %s\\\n" + "\t$(ASN1_MODULES) $(BASE_ASN1_MODULES) %s\n" + "\t$(TTCN3_DIR)/bin/compiler -s $(COMPILER_FLAGS) ", + add_refd_prjs?" referenced-check":"", + makefile->linkingStrategy ? "$(BASE2_TTCN3_MODULES) ":"", + makefile->linkingStrategy ? "$(BASE2_ASN1_MODULES) ":""); + if (makefile->gnu_make) { + if (add_refd_prjs) // referenced-check cannot be compiled it is not a ttcn modul + fprintf(fp, "$(TTCN3_MODULES) $(BASE_TTCN3_MODULES) %s\\\n" + "\t$(ASN1_MODULES) $(BASE_ASN1_MODULES) %s\n", + makefile->linkingStrategy ? "$(BASE2_TTCN3_MODULES) ":"", + makefile->linkingStrategy ? "$(BASE2_ASN1_MODULES) ":""); + else + fputs("$^", fp); } - } else { /* not central storage */ + else { + fputs("\\\n" + "\t$(TTCN3_MODULES) $(BASE_TTCN3_MODULES) \\\n" + "\t$(ASN1_MODULES) $(BASE_ASN1_MODULES)", fp); + } + + if (makefile->linkingStrategy && makefile->hierarchical) { + fputs("\n\n" + "update: $(BASE_TTCN3_MODULES) $(BASE_ASN1_MODULES) $(BASE_PREPROCESSED_TTCN3_MODULES) \\\n" + "\t$(BASE2_TTCN3_MODULES) $(BASE2_ASN1_MODULES) $(BASE2_PREPROCESSED_TTCN3_MODULES)\n" + "ifneq ($(wildcard $(GENERATED_SOURCES)), ) \n" + "ifeq ($(wildcard $?), ) \n" + "\ttouch compile-all; \n" + "\ttouch update; \n" + "endif\n" + "endif",fp); + } + + fprintf(fp, "\n\n" + "compile: $(TTCN3_MODULES) $(ASN1_MODULES)\n" + "\t@echo \"compiling \"'$(patsubst %%.tpd, %%, $(TPD))';\n" + "\t$(TTCN3_DIR)/bin/compiler $(COMPILER_FLAGS) \\\n" + "\t$(TTCN3_MODULES) $(BASE_TTCN3_MODULES) %s\\\n" + "\t$(ASN1_MODULES) $(BASE_ASN1_MODULES) %s\\\n" + "\t- $?\n" + "\ttouch $@\n\n", + makefile->linkingStrategy ? "$(BASE2_TTCN3_MODULES) " : "", + makefile->linkingStrategy ? "$(BASE2_ASN1_MODULES) " : ""); + fprintf(fp, + "compile-all: $(BASE_TTCN3_MODULES) $(BASE_ASN1_MODULES) %s\n", + makefile->linkingStrategy ? "$(BASE2_TTCN3_MODULES) $(BASE2_ASN1_MODULES)" : ""); + fputs("\t@echo \"compiling all \"'$(patsubst %.tpd, %, $(TPD))';\n", fp); + fprintf(fp,"\t$(TTCN3_DIR)/bin/compiler $(COMPILER_FLAGS) \\\n" + "\t$(TTCN3_MODULES) $(BASE_TTCN3_MODULES) %s\\\n" + "\t$(ASN1_MODULES) $(BASE_ASN1_MODULES) %s\\\n" + "\t- $(TTCN3_MODULES) $(ASN1_MODULES)\n" + "\ttouch $@ compile\n\n", + makefile->linkingStrategy ? "$(BASE2_TTCN3_MODULES) " : "", + makefile->linkingStrategy ? "$(BASE2_ASN1_MODULES) " : ""); + } + if (!makefile->hierarchical) + for (i = 0; i < makefile->nBaseDirs; i++) { + const struct base_dir_struct *base_dir = makefile->BaseDirs + i; + if (base_dir->has_modules) { + size_t j; + fprintf(fp, "%s/compile:", base_dir->dir_name); + for (j = 0; j < makefile->nTTCN3Modules; j++) { + const struct module_struct *module = makefile->TTCN3Modules + j; + if (module->dir_name != NULL && + !strcmp(base_dir->dir_name, module->dir_name)) + print_file_name(fp, module); + } + for (j = 0; j < makefile->nTTCN3PPModules; j++) { + const struct module_struct *module = makefile->TTCN3PPModules + j; + if (module->dir_name != NULL && + !strcmp(base_dir->dir_name, module->dir_name)) + print_file_name(fp, module); + } + for (j = 0; j < makefile->nASN1Modules; j++) { + const struct module_struct *module = makefile->ASN1Modules + j; + if (module->dir_name != NULL && + !strcmp(base_dir->dir_name, module->dir_name)) + print_file_name(fp, module); + } + fprintf(fp, "\n" + "\t@echo 'Central directory %s is not up-to-date!'\n" + "\t@exit 2\n\n", base_dir->dir_name); + } + } + } + else { /* not central storage */ fprintf(fp, "$(GENERATED_SOURCES) $(GENERATED_HEADERS): compile\n" - "\t@if [ ! -f $@ ]; then %s compile; $(MAKE) compile; fi\n\n" - "check: $(TTCN3_MODULES) ", rm_command); + "\t@if [ ! -f $@ ]; then %s compile; $(MAKE) compile; fi\n\n" + "check: $(TTCN3_MODULES) ", rm_command); if (makefile->preprocess) fputs("$(PREPROCESSED_TTCN3_MODULES) ", fp); fputs("$(ASN1_MODULES)\n" - "\t$(TTCN3_DIR)/bin/compiler -s $(COMPILER_FLAGS) ", fp); + "\t$(TTCN3_DIR)/bin/compiler -s $(COMPILER_FLAGS) ", fp); if (makefile->gnu_make) fputs("$^", fp); else { - fputs("\\\n" - "\t$(TTCN3_MODULES) $(PREPROCESSED_TTCN3_MODULES) $(ASN1_MODULES)", - fp); + fputs("\\\n" + "\t$(TTCN3_MODULES) $(PREPROCESSED_TTCN3_MODULES) $(ASN1_MODULES)", + fp); } fputs("\n\n" - "compile: $(TTCN3_MODULES) ", fp); + "compile: $(TTCN3_MODULES) ", fp); if (makefile->preprocess) fputs("$(PREPROCESSED_TTCN3_MODULES) ", fp); fputs("$(ASN1_MODULES)\n" - "\t$(TTCN3_DIR)/bin/compiler $(COMPILER_FLAGS) ", fp); + "\t$(TTCN3_DIR)/bin/compiler $(COMPILER_FLAGS) ", fp); if (makefile->gnu_make) fputs("$^", fp); else { - fputs("\\\n" - "\t$(TTCN3_MODULES) ", fp); - if (makefile->preprocess) fputs("$(PREPROCESSED_TTCN3_MODULES) ", fp); - fputs("$(ASN1_MODULES)", fp); + fputs("\\\n" + "\t$(TTCN3_MODULES) ", fp); + if (makefile->preprocess) fputs("$(PREPROCESSED_TTCN3_MODULES) ", fp); + fputs("$(ASN1_MODULES)", fp); } fputs(" - $?\n" - "\ttouch $@\n" - "\n", fp); - } - fprintf(fp, "clean:%s\n" - "\t-%s $(EXECUTABLE) $(LIBRARY) $(OBJECTS) $(GENERATED_HEADERS) \\\n" - "\t$(GENERATED_SOURCES) ", add_refd_prjs?" referenced-clean":"", rm_command); - if (makefile->dynamic) fputs("$(SHARED_OBJECTS) ", fp); - if (makefile->preprocess) fputs("$(PREPROCESSED_TTCN3_MODULES) ", fp); - fputs("compile", fp); - if (makefile->central_storage) fputs(" compile-all", fp); - if (makefile->gcc_dep) fputs(" $(DEPFILES)", fp); - fprintf(fp, " \\\n" - "\ttags *.log%s", - add_refd_prjs?" referenced*":""); - + "\ttouch $@\n" + "\n", fp); + } +// clean: + if (makefile->linkingStrategy) { + fprintf(fp, "clean:%s\n", (add_refd_prjs && !makefile->hierarchical) ? + " referenced-clean" : ""); + if (makefile->dynamic && (makefile->central_storage || makefile->linkingStrategy)) { + fprintf(fp,"\tfind . -type l -name \"*.so\" -exec unlink {} \\;\n"); + } + fprintf(fp, "\t%s $(EXECUTABLE) $(DYNAMIC_LIBRARY) $(STATIC_LIBRARY) " + "$(OBJECTS) $(GENERATED_HEADERS) \\\n" + "\t$(GENERATED_SOURCES) ", rm_command); + if (makefile->dynamic) fputs("$(SHARED_OBJECTS) ", fp); + if (makefile->preprocess) fputs("$(PREPROCESSED_TTCN3_MODULES) ", fp); + fputs("compile", fp); + if (makefile->central_storage) fputs(" compile-all", fp); + if (makefile->gcc_dep) fputs(" $(DEPFILES)", fp); + fprintf(fp, " \\\n" + "\ttags *.log%s%s\n\n", + add_refd_prjs?" referenced*":"", + makefile->hierarchical ? " update":""); + } + else { + fprintf(fp, "clean:%s\n" + "\t-%s $(EXECUTABLE) $(LIBRARY) $(OBJECTS) $(GENERATED_HEADERS) \\\n" + "\t$(GENERATED_SOURCES) ", add_refd_prjs?" referenced-clean":"", rm_command); + if (makefile->dynamic) fputs("$(SHARED_OBJECTS) ", fp); + if (makefile->preprocess) fputs("$(PREPROCESSED_TTCN3_MODULES) ", fp); + fputs("compile", fp); + if (makefile->central_storage) fputs(" compile-all", fp); + if (makefile->gcc_dep) fputs(" $(DEPFILES)", fp); + fprintf(fp, " \\\n" + "\ttags *.log%s", + add_refd_prjs?" referenced*":""); + } + +// clean-all: + if (makefile->linkingStrategy && makefile->hierarchical) + fprintf(fp, "clean-all: %s clean\n", add_refd_prjs ? "referenced-clean-all":""); + +// dep: fputs("\n\ndep: $(GENERATED_SOURCES) $(USER_SOURCES)",fp); - if (add_refd_prjs) fprintf(fp, "\n\t%s referenced-dep", rm_command); + if (add_refd_prjs) { + fprintf(fp, "\n\t%s referenced-dep", rm_command); + } else fputs(" ;",fp); - + if (makefile->gcc_dep) { fprintf(fp, " \n\n" "ifeq ($(findstring n,$(MAKEFLAGS)),)\n" - "ifeq ($(filter clean check compile archive diag%s,$(MAKECMDGOALS)),)\n" + "ifeq ($(filter clean%s check compile archive diag%s,$(MAKECMDGOALS)),)\n" "-include $(DEPFILES)\n" "endif\n" - "endif", (makefile->preprocess ? " preprocess" : "")); + "endif", + (makefile->linkingStrategy && makefile->hierarchical) ? " clean-all" : "", + (makefile->preprocess ? " preprocess" : "")); /* Don't include .d files when cleaning etc.; make will try to build them * and this involves running the Titan compiler. Same for preprocess. * The check target would be pointless if running the compiler @@ -2887,36 +3488,50 @@ static void print_makefile(struct makefile_struct *makefile) if (makefile->gnu_make) fputs("$^", fp); else fputs("$(GENERATED_SOURCES) $(USER_SOURCES)", fp); } - fprintf(fp, "\n\n" - "archive:%s\n" - "\tmkdir -p $(ARCHIVE_DIR)\n" - "\ttar -cvhf - ", add_refd_prjs?" referenced-archive":""); - if (makefile->central_storage) { - fputs("$(TTCN3_MODULES) $(BASE_TTCN3_MODULES) \\\n", fp); - if (makefile->preprocess) { - fputs("\t$(TTCN3_PP_MODULES) $(BASE_TTCN3_PP_MODULES) " - "$(TTCN3_INCLUDES)\\\n", fp); + + if (makefile->linkingStrategy) { + fputs("\n\n" + "archive:\n" + "\t@perl $(TTCN3_DIR)/bin/ttcn3_archive.pl\n\n", fp); + } + else { + fputs("\n\n" + "archive:\n" + "\tmkdir -p $(ARCHIVE_DIR)\n" + "\ttar -cvhf - ", fp); + if (makefile->central_storage) { + fprintf(fp, "$(TTCN3_MODULES) $(BASE_TTCN3_MODULES) %s\\\n", + makefile->linkingStrategy ? "$(BASE2_TTCN3_MODULES) " : ""); + if (makefile->preprocess) { + fprintf(fp, "\t$(TTCN3_PP_MODULES) $(BASE_TTCN3_PP_MODULES) " + "%s $(TTCN3_INCLUDES) \\\n", + makefile->linkingStrategy ? "$(BASE2_TTCN3_PP_MODULES)" : ""); + } + fprintf(fp, "\t$(ASN1_MODULES) $(BASE_ASN1_MODULES) %s\\\n" + "\t$(USER_HEADERS) $(BASE_USER_HEADERS) %s\\\n" + "\t$(USER_SOURCES) $(BASE_USER_SOURCES) %s", + makefile->linkingStrategy ? "$(BASE2_ASN1_MODULES) " : "", + makefile->linkingStrategy ? "$(BASE2_USER_HEADERS) " : "", + makefile->linkingStrategy ? "$(BASE2_USER_SOURCES)" : ""); } - fputs("\t$(ASN1_MODULES) $(BASE_ASN1_MODULES) \\\n" - "\t$(USER_HEADERS) $(BASE_USER_HEADERS) \\\n" - "\t$(USER_SOURCES) $(BASE_USER_SOURCES)", fp); - } else { - fputs("$(TTCN3_MODULES) ", fp); - if (makefile->preprocess) { - fputs("$(TTCN3_PP_MODULES) \\\n" - "\t$(TTCN3_INCLUDES) ", fp); + else { + fputs("$(TTCN3_MODULES) ", fp); + if (makefile->preprocess) { + fputs("$(TTCN3_PP_MODULES) \\\n" + "\t$(TTCN3_INCLUDES) ", fp); + } + fputs("$(ASN1_MODULES) \\\n" + "\t$(USER_HEADERS) $(USER_SOURCES)", fp); } - fputs("$(ASN1_MODULES) \\\n" - "\t$(USER_HEADERS) $(USER_SOURCES)", fp); + fputs(" $(OTHER_FILES) \\\n" + "\t| gzip >$(ARCHIVE_DIR)/`basename $(TARGET) .exe`-" + "`date '+%y%m%d-%H%M'`.tgz\n\n", fp); } - fputs(" $(OTHER_FILES) \\\n" - "\t| gzip >$(ARCHIVE_DIR)/`basename $(TARGET) .exe`-" - "`date '+%y%m%d-%H%M'`.tgz\n\n", fp); fprintf(fp, "diag:\n" - "\t$(TTCN3_DIR)/bin/compiler -v 2>&1\n" - "\t$(TTCN3_DIR)/bin/mctr_cli -v 2>&1\n" - "\t$(CXX) -v 2>&1\n" + "\t$(TTCN3_DIR)/bin/compiler -v 2>&1\n" + "\t$(TTCN3_DIR)/bin/mctr_cli -v 2>&1\n" + "\t$(CXX) -v 2>&1\n" "%s" "\t@echo TTCN3_DIR=$(TTCN3_DIR)\n" "\t@echo OPENSSL_DIR=$(OPENSSL_DIR)\n" @@ -2925,12 +3540,13 @@ static void print_makefile(struct makefile_struct *makefile) makefile->dynamic ? "" : "\t$(AR) -V 2>&1\n"); if (add_refd_prjs) { - fputs("referenced-all referenced-shared_objects referenced-executable referenced-library \\\n" - "referenced-objects referenced-check \\\n" - "referenced-clean referenced-archive:\n" - "\t@for dir in $(REFERENCED_PROJECT_DIRS); do \\\n" - "\t $(MAKE) -C $$dir $(subst referenced-,,$@) || exit; \\\n" - "\tdone; \n\n", fp); + fprintf(fp, "referenced-all referenced-shared_objects referenced-executable referenced-library \\\n" + "referenced-objects referenced-check \\\n" + "referenced-clean%s:\n" + "\t@for dir in $(REFERENCED_PROJECT_DIRS); do \\\n" + "\t $(MAKE) -C $$dir $(subst referenced-,,$@) || exit; \\\n" + "\tdone; \n\n", + (makefile->linkingStrategy && makefile->hierarchical) ? "-all" : ""); fputs("referenced-dep:\n" "\t@for dir in $(REFERENCED_PROJECT_DIRS); do \\\n" "\t $(MAKE) -C $$dir $(subst referenced-,,$@) || exit; \\\n" @@ -2953,9 +3569,12 @@ static void print_makefile(struct makefile_struct *makefile) } else { NOTIFY("Makefile skeleton was generated."); } - } else { - ERROR("Output file `%s' already exists. Use switch `-f' to force " - "overwrite.", makefile->output_file); + } + else { + ERROR("Output file `%s' already exists. Use switch `%s' to force " + "overwrite.", + makefile->output_file, + makefile->linkingStrategy ? "-F" : "-f"); } } @@ -2977,7 +3596,8 @@ static void run_makefilegen_commands(struct string2_list* run_command_list) rv = set_working_dir(sub_proj_effective_work_dir); if (rv) ERROR("Could not set working dir to `%s'", sub_proj_effective_work_dir); else { - printf("Executing `%s' in working directory `%s'...\n", command, sub_proj_effective_work_dir); + fprintf(stderr, "Executing `%s' in working directory `%s'...\n", + command, sub_proj_effective_work_dir); rv = system(command); if (rv) ERROR("Execution failed with error code %d", rv); // TODO: it's not clear what system()'s return codes can be in different situations and platforms } @@ -3015,15 +3635,15 @@ static void generate_symlinks(struct string2_list* create_symlink_list) * command line switches. */ static void generate_makefile(size_t n_arguments, char *arguments[], size_t n_other_files, const char *other_files[], const char *output_file, - const char *ets_name, boolean gnu_make, boolean single_mode, + const char *ets_name, char *project_name, boolean gnu_make, boolean single_mode, boolean central_storage, boolean absolute_paths, boolean preprocess, boolean dump_makefile_data, boolean force_overwrite, boolean use_runtime_2, boolean dynamic, boolean makedepend, boolean coverage, const char *code_splitting_mode, const char *tcov_file_name, - boolean Lflag, struct string_list* sub_project_dirs, struct string_list* ttcn3_prep_includes, - struct string_list* ttcn3_prep_defines, struct string_list* prep_includes, struct string_list* prep_defines, - boolean codesplittpd, boolean quietly, boolean disablesubtypecheck, const char* cxxcompiler, - const char* optlevel, const char* optflags, boolean disableber, boolean disableraw, boolean disabletext, + boolean Lflag, boolean Zflag, boolean Hflag, struct string_list* sub_project_dirs, struct string_list* ttcn3_prep_includes, + struct string_list* ttcn3_prep_defines, struct string_list* ttcn3_prep_undefines, struct string_list* prep_includes, + struct string_list* prep_defines, struct string_list* prep_undefines, boolean codesplittpd, boolean quietly, boolean disablesubtypecheck, + const char* cxxcompiler, const char* optlevel, const char* optflags, boolean disableber, boolean disableraw, boolean disabletext, boolean disablexer, boolean disablejson, boolean forcexerinasn, boolean defaultasomit, boolean gccmsgformat, boolean linenumbersonlymsg, boolean includesourceinfo, boolean addsourcelineinfo, boolean suppresswarnings, boolean outparamboundness, struct string_list* solspeclibraries, struct string_list* sol8speclibraries, @@ -3037,6 +3657,7 @@ static void generate_makefile(size_t n_arguments, char *arguments[], struct makefile_struct makefile; init_makefile_struct(&makefile); + makefile.project_name = project_name; makefile.central_storage = central_storage; makefile.gnu_make = gnu_make; makefile.preprocess = preprocess; @@ -3047,11 +3668,15 @@ static void generate_makefile(size_t n_arguments, char *arguments[], makefile.gcc_dep = gnu_make && !makedepend; makefile.coverage = coverage; makefile.library = Lflag; + makefile.linkingStrategy = Zflag; + makefile.hierarchical = Hflag; makefile.sub_project_dirs = sub_project_dirs; makefile.ttcn3_prep_includes = ttcn3_prep_includes; makefile.ttcn3_prep_defines = ttcn3_prep_defines; + makefile.ttcn3_prep_undefines = ttcn3_prep_undefines; makefile.prep_includes = prep_includes; makefile.prep_defines = prep_defines; + makefile.prep_undefines = prep_undefines; makefile.codesplittpd = codesplittpd; makefile.quietly = quietly; makefile.disablesubtypecheck = disablesubtypecheck; @@ -3148,7 +3773,7 @@ static void generate_makefile(size_t n_arguments, char *arguments[], } if (tcov_file_name != NULL) { - makefile.tcov_file_name = mputprintf(makefile.tcov_file_name, "-K %s", tcov_file_name); + makefile.tcov_file_name = mputprintf(makefile.tcov_file_name, "-K %s", tcov_file_name); } if (makefile.nTTCN3Modules >= 1) { @@ -3188,7 +3813,6 @@ static void generate_makefile(size_t n_arguments, char *arguments[], if (dump_makefile_data) dump_makefile_struct(&makefile, 0); if (error_count == 0) print_makefile(&makefile); - free_makefile_struct(&makefile); } @@ -3202,7 +3826,7 @@ static void generate_makefile(size_t n_arguments, char *arguments[], static void usage(void) { fprintf(stderr, "\n" - "usage: %s [-abc" C_flag "dDfFglLmprRstTVwWX] [-K file] [-P dir]" + "usage: %s [-abc" C_flag "dDfFglLmprRstTVwWXZ] [-K file] [-P dir]" " [-U none|type] [-e ets_name] [-o dir|file]\n" " [-t project_descriptor.tpd [-b buildconfig]]\n" " [-O file] ... module_name ... testport_name ...\n" @@ -3242,6 +3866,8 @@ static void usage(void) " -P dir: prints out a file list found in a given TPD relative to the given directory\n" " -X: generate XML file that describes the TPD hierarchy, use with -r\n" " -W: prefix working directories with project name\n" + " -Z: recursive Makefile generation from TPD using object files and dynamic libraries too\n" + " -H: hierachical Makefile generation from TPD use with -Z\n" , program_name, program_name); } @@ -3285,10 +3911,11 @@ int main(int argc, char *argv[]) dxflag = FALSE, fxflag = FALSE, doflag = FALSE, gfflag = FALSE, lnflag = FALSE, isflag = FALSE, asflag = FALSE, swflag = FALSE, Vflag = FALSE, Dflag = FALSE, Wflag = FALSE, - djflag = FALSE; + djflag = FALSE, Zflag = FALSE, Hflag = FALSE; boolean error_flag = FALSE; char *output_file = NULL; char *ets_name = NULL; + char *project_name = NULL; size_t n_other_files = 0; const char **other_files = NULL; const char *code_splitting_mode = NULL; @@ -3301,8 +3928,10 @@ int main(int argc, char *argv[]) struct string2_list* create_symlink_list = NULL; struct string_list* ttcn3_prep_includes = NULL; struct string_list* ttcn3_prep_defines = NULL; + struct string_list* ttcn3_prep_undefines = NULL; struct string_list* prep_includes = NULL; struct string_list* prep_defines = NULL; + struct string_list* prep_undefines = NULL; char *cxxcompiler = NULL; char *optlevel = NULL; char *optflags = NULL; @@ -3318,6 +3947,7 @@ int main(int argc, char *argv[]) char* generatorCommandOutput = NULL; struct string2_list* target_placement_list = NULL; struct string2_list* run_command_list = NULL; + struct string2_list* required_configs = NULL; #ifdef LICENSE license_struct lstr; @@ -3334,7 +3964,7 @@ int main(int argc, char *argv[]) } for ( ; ; ) { - int c = getopt(argc, argv, "O:ab:c" C_flag "dDe:fFgK:o:lLmpP:rRst:TU:vVwWXY"); + int c = getopt(argc, argv, "O:ab:c" C_flag "dDe:fFgK:o:lLmpP:rRst:TU:vVwWXYZH"); if (c == -1) break; switch (c) { case 'O': @@ -3381,6 +4011,9 @@ int main(int argc, char *argv[]) case 'g': SET_FLAG(g); break; + case 'H': + SET_FLAG(H); + break; case 'o': SET_FLAG(o); output_file = optarg; @@ -3401,11 +4034,11 @@ int main(int argc, char *argv[]) SET_FLAG(P); /* Optional arguments with `::' are GNU specific... */ if (get_path_status(optarg) == PS_DIRECTORY) { - file_list_path = optarg; + file_list_path = optarg; } else { - ERROR("The -P flag requires a valid directory as its argument " - "instead of `%s'", optarg); - error_flag = TRUE; + ERROR("The -P flag requires a valid directory as its argument " + "instead of `%s'", optarg); + error_flag = TRUE; } break; case 'r': @@ -3451,6 +4084,9 @@ int main(int argc, char *argv[]) case 'X': SET_FLAG(X); break; + case 'Z': + SET_FLAG(Z); + break; default: error_flag = TRUE; break; @@ -3463,12 +4099,17 @@ int main(int argc, char *argv[]) if ( aflag || bflag || cflag || Cflag || dflag || eflag || fflag || Fflag || gflag || mflag || oflag || lflag || pflag || Pflag || rflag || Rflag || sflag || tflag || Tflag || Vflag || wflag || Xflag || Kflag || Dflag || Wflag || Yflag - || n_other_files > 0) - error_flag = TRUE; + || Zflag || Hflag || n_other_files > 0) + error_flag = TRUE; + } + + if (Zflag) { + if (!gflag) gflag = TRUE; // GNU make + if (!cflag) cflag = TRUE; // central sorage } - if ((bflag || Dflag || Pflag || Vflag || rflag || Wflag) && !tflag) { - ERROR("Using the '-b', '-D', '-P', '-V', '-r' or '-W' option requires the use of the -t' option."); + if ((bflag || Dflag || Pflag || Vflag || rflag || Wflag || Zflag) && !tflag) { + ERROR("Using the '-b', '-D', '-P', '-V', '-r' 'Z' or '-W' option requires the use of the -t' option."); error_flag = TRUE; } @@ -3492,6 +4133,16 @@ int main(int argc, char *argv[]) error_flag = TRUE; } + if (!Zflag && Hflag) { + ERROR("Using the '-H' option requires use of the '-Z' option."); + error_flag = TRUE; + } + + if (Zflag && !Fflag && !fflag) { + ERROR("Using the '-Z' option requires use of the '-F' option."); + error_flag = TRUE; + } + if (lflag && !strncmp(get_platform_string(), "WIN32", 5)) { ERROR("Generating Makefile with dynamic linking enabled is not supported " "on Windows platform"); @@ -3544,12 +4195,18 @@ int main(int argc, char *argv[]) ttcn3_prep_defines = (struct string_list*)Malloc(sizeof(struct string_list)); ttcn3_prep_defines->str = NULL; ttcn3_prep_defines->next = NULL; + ttcn3_prep_undefines = (struct string_list*)Malloc(sizeof(struct string_list)); + ttcn3_prep_undefines->str = NULL; + ttcn3_prep_undefines->next = NULL; prep_includes = (struct string_list*)Malloc(sizeof(struct string_list)); prep_includes->str = NULL; prep_includes->next = NULL; prep_defines = (struct string_list*)Malloc(sizeof(struct string_list)); prep_defines->str = NULL; prep_defines->next = NULL; + prep_undefines = (struct string_list*)Malloc(sizeof(struct string_list)); + prep_undefines->str = NULL; + prep_undefines->next = NULL; solspeclibraries = (struct string_list*)Malloc(sizeof(struct string_list)); solspeclibraries->str = NULL; solspeclibraries->next = NULL; @@ -3593,29 +4250,45 @@ int main(int argc, char *argv[]) run_command_list->str1 = NULL; run_command_list->str2 = NULL; run_command_list->next = NULL; + required_configs = (struct string2_list*)Malloc(sizeof(struct string2_list)); + required_configs->str1 = NULL; + required_configs->str2 = NULL; + required_configs->next = NULL; + tpd_processed = process_tpd(tpd_file_name, tpd_build_config, file_list_path, - &argc, &argv, &optind, &ets_name, + &argc, &argv, &optind, &ets_name, &project_name, &gflag, &sflag, &cflag, &aflag, &pflag, &Rflag, &lflag, &mflag, &Pflag, &Lflag, rflag, Fflag, Tflag, output_file, &abs_work_dir, sub_project_dirs, program_name, prj_graph_fp, - create_symlink_list,ttcn3_prep_includes, ttcn3_prep_defines, prep_includes, prep_defines, &csflag, &quflag, &dsflag, &cxxcompiler, - &optlevel, &optflags, &dbflag, &drflag, &dtflag, &dxflag, &djflag, &fxflag, &doflag, &gfflag, &lnflag, &isflag, + create_symlink_list,ttcn3_prep_includes, ttcn3_prep_defines,ttcn3_prep_undefines, prep_includes, prep_defines, prep_undefines, &csflag, + &quflag, &dsflag, &cxxcompiler, &optlevel, &optflags, &dbflag, &drflag, &dtflag, &dxflag, &djflag, &fxflag, &doflag, &gfflag, &lnflag, &isflag, &asflag, &swflag, &Yflag, solspeclibraries, sol8speclibraries, linuxspeclibraries, freebsdspeclibraries, win32speclibraries, &ttcn3prep, - linkerlibraries, additionalObjects, linkerlibsearchpath, Vflag, Dflag, &generatorCommandOutput, target_placement_list, Wflag, run_command_list); + linkerlibraries, additionalObjects, linkerlibsearchpath, Vflag, Dflag, &Zflag, &Hflag, + &generatorCommandOutput, target_placement_list, Wflag, run_command_list, required_configs); + Free(abs_work_dir); if (prj_graph_fp) { fprintf(prj_graph_fp, "</project_hierarchy_graph>\n"); fclose(prj_graph_fp); } - if (tpd_processed == TPD_FAILED) ERROR("Failed to process %s", tpd_file_name); + if (tpd_processed == TPD_FAILED) { + ERROR("Failed to process %s", tpd_file_name); + exit(EXIT_FAILURE); + } } if (!Pflag) { run_makefilegen_commands(run_command_list); generate_symlinks(create_symlink_list); + if (Zflag) { + if (Fflag) + NOTIFY("Makefile generation from top-level TPD: %s", tpd_file_name); + if (!Fflag && fflag) + NOTIFY("Makefile generation from lower level TPD: %s", tpd_file_name); + } generate_makefile(argc - optind, argv + optind, n_other_files, other_files, - output_file, ets_name, gflag, sflag, cflag, aflag, pflag, dflag, fflag||Fflag, - Rflag, lflag, mflag, Cflag, code_splitting_mode, tcov_file_name, Lflag, rflag ? sub_project_dirs : NULL, ttcn3_prep_includes, - ttcn3_prep_defines, prep_includes, prep_defines, csflag, quflag, dsflag, cxxcompiler, optlevel, optflags, dbflag, + output_file, ets_name, project_name, gflag, sflag, cflag, aflag, pflag, dflag, fflag||Fflag, + Rflag, lflag, mflag, Cflag, code_splitting_mode, tcov_file_name, Lflag, Zflag, Hflag, rflag ? sub_project_dirs : NULL, ttcn3_prep_includes, + ttcn3_prep_defines, ttcn3_prep_undefines, prep_includes, prep_defines, prep_undefines, csflag, quflag, dsflag, cxxcompiler, optlevel, optflags, dbflag, drflag, dtflag, dxflag, djflag, fxflag, doflag, gfflag, lnflag, isflag, asflag, swflag, Yflag, solspeclibraries, sol8speclibraries, linuxspeclibraries, freebsdspeclibraries, win32speclibraries, ttcn3prep, linkerlibraries, additionalObjects, linkerlibsearchpath, generatorCommandOutput, target_placement_list); @@ -3624,8 +4297,10 @@ int main(int argc, char *argv[]) free_string_list(sub_project_dirs); free_string_list(ttcn3_prep_includes); free_string_list(ttcn3_prep_defines); + free_string_list(ttcn3_prep_undefines); free_string_list(prep_includes); free_string_list(prep_defines); + free_string_list(prep_undefines); free_string_list(solspeclibraries); free_string_list(sol8speclibraries); free_string_list(linuxspeclibraries); @@ -3637,6 +4312,7 @@ int main(int argc, char *argv[]) Free(generatorCommandOutput); free_string2_list(target_placement_list); + free_string2_list(required_configs); Free(other_files); if (tpd_processed == TPD_SUCCESS) { @@ -3655,8 +4331,7 @@ int main(int argc, char *argv[]) for (E = 0; E < argc; ++E) Free(argv[E]); Free(argv); } - /* check_mem_leak(program_name); not needed when linked to new.cc */ + /* check_mem_leak(program_name); not needed when linked to new.cc */ return error_count > 0 ? EXIT_FAILURE : EXIT_SUCCESS; } - diff --git a/compiler2/record.c b/compiler2/record.c index 67b7e96e5..79e914f38 100644 --- a/compiler2/record.c +++ b/compiler2/record.c @@ -1799,11 +1799,6 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) /* start_at is the index of the first "real" member of the record */ size_t start_at = uo + (sdef->xerUseOrderPossible != 0); - /* Max. number of EMBED-VALUES strings. The actual number may change - * at runtime: omitted optional (non-attribute) members decrease the - * number of embed strings needed, and xsi:nil=true sets it to zero.*/ - size_t max_embed; - /* Number of optional non-attributes */ size_t n_opt_elements = 0; @@ -1828,7 +1823,6 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) ++n_opt_elements; } } - max_embed = sdef->nElements - start_at - num_attributes + 1; /* Write some helper functions */ def = mputstr(def, @@ -1904,7 +1898,7 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) /* * * * * * * * * * XER_encode * * * * * * * * * * * * * * */ src = mputprintf(src, "int %s::XER_encode(const XERdescriptor_t& p_td, " - "TTCN_Buffer& p_buf, unsigned int p_flavor, int p_indent) const\n" + "TTCN_Buffer& p_buf, unsigned int p_flavor, int p_indent, embed_values_enc_struct_t*) const\n" "{\n" " if (!is_bound()) TTCN_EncDec_ErrorContext::error" "(TTCN_EncDec::ET_UNBOUND, \"Encoding an unbound value.\");\n" @@ -1994,7 +1988,7 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) " if (e_xer && (p_td.xer_bits & USE_QNAME)) {\n" " if (field_%s.is_value()) {\n" " p_buf.put_s(11, (cbyte*)\" xmlns:b0='\");\n" - " field_%s.XER_encode(%s_xer_, p_buf, p_flavor | XER_LIST, p_indent+1);\n" + " field_%s.XER_encode(%s_xer_, p_buf, p_flavor | XER_LIST, p_indent+1, 0);\n" " p_buf.put_c('\\'');\n" " }\n" " if (p_td.xer_bits & XER_ATTRIBUTE) begin_attribute(p_td, p_buf);\n" @@ -2003,7 +1997,7 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) " p_buf.put_s(3, (cbyte*)\"b0:\");\n" " sub_len += 3;\n" " }\n" - " sub_len += field_%s.XER_encode(%s_xer_, p_buf, p_flavor | XER_LIST, p_indent+1);\n" + " sub_len += field_%s.XER_encode(%s_xer_, p_buf, p_flavor | XER_LIST, p_indent+1, 0);\n" " if (p_td.xer_bits & XER_ATTRIBUTE) p_buf.put_c('\\'');\n" " } else" /* no newline */ , sdef->elements[0].name @@ -2017,12 +2011,10 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) /* First, the EMBED-VALUES member as an ordinary member if not doing EXER */ if (sdef->xerEmbedValuesPossible) { src = mputprintf(src, - " int exp_emb = %u;\n" " if (!e_xer && (p_td.xer_bits & EMBED_VALUES)) {\n" " ec_1.set_msg(\"%s': \");\n" - " sub_len += field_%s.XER_encode(%s_xer_, p_buf, p_flavor, p_indent+1);\n" + " sub_len += field_%s.XER_encode(%s_xer_, p_buf, p_flavor, p_indent+1, 0);\n" " }\n" - , (unsigned int)max_embed , sdef->elements[0].dispname , sdef->elements[0].name, sdef->elements[0].typegen ); @@ -2031,7 +2023,7 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) if (sdef->xerUseOrderPossible) { src = mputprintf(src, " if (!e_xer && (p_td.xer_bits & USE_ORDER)) {\n" - " sub_len += field_%s.XER_encode(%s_xer_, p_buf, p_flavor, p_indent+1);\n" + " sub_len += field_%s.XER_encode(%s_xer_, p_buf, p_flavor, p_indent+1, 0);\n" " }\n" , sdef->elements[uo].name, sdef->elements[uo].typegen ); @@ -2067,7 +2059,7 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) if (i==0 && sdef->xerEmbedValuesPossible && (sdef->elements[i].xerAnyKind & ANY_ATTRIB_BIT)) continue ; src = mputprintf(src, " ec_1.set_msg(\"%s': \");\n" - " tmp_len = field_%s.XER_encode(%s_xer_, p_buf, p_flavor, p_indent+1);\n" + " tmp_len = field_%s.XER_encode(%s_xer_, p_buf, p_flavor, p_indent+1, 0);\n" " %ssub_len += tmp_len;\n" /* do not add if attribute and EXER */ , sdef->elements[i].dispname , sdef->elements[i].name, sdef->elements[i].typegen @@ -2098,46 +2090,19 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) } if (sdef->xerEmbedValuesPossible) { - size_t op; src = mputprintf(src, " ec_1.set_msg(\"%s': \");\n" " if (e_xer && (p_td.xer_bits & EMBED_VALUES)) {\n" - , sdef->elements[0].dispname - ); - - if (sdef->xerUseNilPossible) { - src = mputstr(src, /* 25.2.6 a */ - " if ((p_td.xer_bits & USE_NIL) && nil_attribute) exp_emb = 0;\n" - " else {\n"); - } - - for (op = 0; op < sdef->nElements; ++op) { - if (sdef->elements[op].isOptional && !sdef->elements[op].xerAttribute) { - src = mputprintf(src, - " if (!field_%s.ispresent()) --exp_emb;\n" - , sdef->elements[op].name - ); - } - } - - if (sdef->xerUseNilPossible) src = mputstr(src, " }\n"); - - src = mputprintf(src, - " if (field_%s.size_of()!=exp_emb) " - "TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_CONSTRAINT, " - "\"Wrong number %%d of EMBED-VALUEs, expected %%d\", field_%s.size_of(), exp_emb);\n" - , sdef->elements[0].name - , sdef->elements[0].name); /* write the first string (must come AFTER the attributes) */ - src = mputprintf(src, - " %ssub_len += field_%s[0].XER_encode(UNIVERSAL_CHARSTRING_xer_, p_buf, p_flavor | EMBED_VALUES, p_indent+1);\n" + " if (field_%s.size_of() > 0) {\n" + " sub_len += field_%s[0].XER_encode(UNIVERSAL_CHARSTRING_xer_, p_buf, p_flavor | EMBED_VALUES, p_indent+1, 0);\n" + " }\n" " }\n" - , (sdef->xerUseNilPossible ? "if (exp_emb > 0) " : "") - , sdef->elements[0].name); + , sdef->elements[0].dispname, sdef->elements[0].name, sdef->elements[0].name); if (want_namespaces) { /* here's another chance */ src = mputprintf(src, " else if ( !(p_td.xer_bits & EMBED_VALUES)) {\n" - " %sfield_%s.XER_encode(%s_xer_, p_buf, p_flavor, p_indent+1);\n" + " %sfield_%s.XER_encode(%s_xer_, p_buf, p_flavor, p_indent+1, 0);\n" " }\n" , ((sdef->elements[0].xerAnyKind & ANY_ATTRIB_BIT) ? "" : "sub_len += " ) , sdef->elements[0].name, sdef->elements[0].typegen @@ -2148,6 +2113,17 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) /* Then, all the non-attributes. Structuring the code like this depends on * all attributes appearing before all non-attributes (excluding * special members for EMBED-VALUES, USE-ORDER, etc.) */ + if (sdef->xerEmbedValuesPossible) { + src = mputprintf(src, + " embed_values_enc_struct_t* emb_val = 0;\n" + " if (e_xer && (p_td.xer_bits & EMBED_VALUES) && field_%s.size_of() > 1) {\n" + " emb_val = new embed_values_enc_struct_t;\n" + " emb_val->embval_array = &field_%s;\n" + " emb_val->embval_index = 1;\n" + " emb_val->embval_size = field_%s.size_of();\n" + " }\n", sdef->elements[0].name, sdef->elements[0].name, sdef->elements[0].name); + } + if (sdef->xerUseOrderPossible) { int max_ordered = sdef->nElements - start_at - num_attributes; int min_ordered = max_ordered - n_opt_elements; @@ -2169,7 +2145,7 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) src = mputprintf(src, " if (!nil_attribute) {\n" "%s" - " if (!e_xer) sub_len += field_%s.XER_encode(%s_xer_, p_buf, p_flavor, p_indent+!omit_tag);\n" + " if (!e_xer) sub_len += field_%s.XER_encode(%s_xer_, p_buf, p_flavor, p_indent+!omit_tag, 0);\n" " else" /* no newline */ , (sdef->xerUseNilPossible ? " if (!(p_td.xer_bits & USE_ORDER)) p_flavor |= (p_td.xer_bits & USE_NIL);\n" : "") /* If USE-ORDER is on, the tag-removing effect of USE-NIL has been @@ -2224,7 +2200,7 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) src = mputprintf(src, " case %lu:\n" " ec_1.set_msg(\"%s': \");\n" - " sub_len += field_%s%s%s%s.XER_encode(%s_xer_, p_buf, p_flavor, p_indent+!omit_tag);\n" + " sub_len += field_%s%s%s%s.XER_encode(%s_xer_, p_buf, p_flavor, p_indent+!omit_tag, %s);\n" , (unsigned long)offset++ , sdef->elements[i].dispname @@ -2233,7 +2209,7 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) , (sdef->xerUseNilPossible ? sdef->elements[i].name : "") , (sdef->xerUseNilPossible ? "()" : "") , sdef->elements[i].typegen - + , sdef->xerEmbedValuesPossible ? "emb_val" : "0" ); src = mputstr(src, " break;\n"); @@ -2246,8 +2222,11 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) if (sdef->xerEmbedValuesPossible) { src = mputprintf(src, - " if (e_xer && i+1 < exp_emb && (p_td.xer_bits & EMBED_VALUES)) { // embed-val\n" - " field_%s[i+1].XER_encode(UNIVERSAL_CHARSTRING_xer_, p_buf, p_flavor | EMBED_VALUES, p_indent+1);\n" + " if (e_xer && (p_td.xer_bits & EMBED_VALUES) && 0 != emb_val &&\n" + " emb_val->embval_index < emb_val->embval_size) { // embed-val\n" + " field_%s[emb_val->embval_index].XER_encode(\n" + " UNIVERSAL_CHARSTRING_xer_, p_buf, p_flavor | EMBED_VALUES, p_indent+1, 0);\n" + " ++emb_val->embval_index;\n" " }\n" , sdef->elements[0].name); } @@ -2267,22 +2246,38 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) , sdef->elements[i].dispname ); src = mputprintf(src, - " sub_len += field_%s.XER_encode(%s_xer_, p_buf, p_flavor%s, p_indent+!omit_tag);\n" + " sub_len += field_%s.XER_encode(%s_xer_, p_buf, p_flavor%s, p_indent+!omit_tag, %s);\n" , sdef->elements[i].name, sdef->elements[i].typegen , sdef->xerUseNilPossible ? "| (p_td.xer_bits & USE_NIL)" : "" + , sdef->xerEmbedValuesPossible ? "emb_val" : "0" ); if (sdef->xerEmbedValuesPossible) { - unsigned long idx = i - start_at - num_attributes + 1; src = mputprintf(src, - " if (e_xer && exp_emb > %lu && (p_td.xer_bits & EMBED_VALUES)) {\n" - " field_%s[%lu].XER_encode(UNIVERSAL_CHARSTRING_xer_, p_buf, p_flavor | EMBED_VALUES, p_indent+1);\n" + " if (e_xer && (p_td.xer_bits & EMBED_VALUES) && 0 != emb_val &&\n" + " emb_val->embval_index < emb_val->embval_size) {\n" + " field_%s[emb_val->embval_index].XER_encode(\n" + " UNIVERSAL_CHARSTRING_xer_, p_buf, p_flavor | EMBED_VALUES, p_indent+1, 0);\n" + " ++emb_val->embval_index;\n" " }\n" - , idx - , sdef->elements[0].name, idx); + , sdef->elements[0].name); } } /* next field when not USE-ORDER */ + if (sdef->xerEmbedValuesPossible) { + src = mputprintf(src, + " if (0 != emb_val) {\n" + " if (emb_val->embval_index < emb_val->embval_size) {\n" + " ec_1.set_msg(\"%s': \");\n" + " TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_CONSTRAINT,\n" + " \"Too many EMBED-VALUEs specified: %%d (expected %%d or less)\",\n" + " emb_val->embval_size, emb_val->embval_index);\n" + " }\n" + " delete emb_val;\n" + " }\n" + , sdef->elements[0].name); + } + src = mputstr(src, " } // QN?\n"); { @@ -2335,7 +2330,7 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) src = mputprintf(src, /* XERSTUFF decodegen for record/SEQUENCE*/ "int %s::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& p_reader," - " unsigned int p_flavor)\n" + " unsigned int p_flavor, embed_values_dec_struct_t*)\n" "{\n" " bound_flag = TRUE;\n" /* Remove XER_LIST, XER_RECOF from p_flavor. This is not required @@ -2441,8 +2436,9 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) } else { /* must be the ANY-ATTRIBUTES */ src = mputprintf(src, - " field_%s.set_size(0);\n", - sdef->elements[aaa].name); + " field_%s%s;\n" + , sdef->elements[aaa].name + , sdef->elements[aaa].isOptional ? " = OMIT_VALUE" : ".set_size(0)"); } } @@ -2493,7 +2489,7 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) src = mputprintf(src, " if (check_name(attr_name, %s_xer_, 1) && check_namespace(ns_uri, %s_xer_)) {\n" " ec_1.set_msg(\"%s': \");\n" - " field_%s.XER_decode(%s_xer_, p_reader, p_flavor | (p_td.xer_bits & USE_NIL));\n" + " field_%s.XER_decode(%s_xer_, p_reader, p_flavor | (p_td.xer_bits & USE_NIL), 0);\n" " } else" , sdef->elements[i].typegen, sdef->elements[i].typegen , sdef->elements[i].dispname /* set_msg */ @@ -2514,8 +2510,8 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) /* we are at a dangling else */ src = mputprintf(src, " {\n" - " TTCN_EncDec_ErrorContext ec_0(\"Attribute %%d: \", (int)num_aa);" - " UNIVERSAL_CHARSTRING& new_elem = field_%s[num_aa++];\n" + " TTCN_EncDec_ErrorContext ec_0(\"Attribute %%d: \", (int)num_aa);\n" + " UNIVERSAL_CHARSTRING& new_elem = field_%s%s[num_aa++];\n" /* Construct the AnyAttributeFormat (X.693amd1, 18.2.6) */ " TTCN_Buffer aabuf;\n" " const xmlChar *x_name = p_reader.LocalName();\n" @@ -2536,6 +2532,7 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) " new_elem.decode_utf8(aabuf.get_len(), aabuf.get_data());\n" " } \n" , sdef->elements[aa_index].name + , sdef->elements[aa_index].isOptional ? "()" : "" , sdef->elements[aa_index].typegen, sdef->elements[aa_index].typegen ); } @@ -2584,7 +2581,7 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) " if (!(p_td.xer_bits & EMBED_VALUES)) {\n" " ec_1.set_msg(\"%s': \");\n" " field_%s.XER_decode(%s_xer_, p_reader, " - "p_flavor | (p_td.xer_bits & USE_NIL)| (tag_closed ? PARENT_CLOSED : 0));\n" + "p_flavor | (p_td.xer_bits & USE_NIL)| (tag_closed ? PARENT_CLOSED : 0), 0);\n" " }\n" , sdef->elements[0].dispname , sdef->elements[0].name, sdef->elements[0].typegen @@ -2618,7 +2615,7 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) src = mputprintf(src, " {\n" " ec_1.set_msg(\"%s': \");\n" - " field_%s.XER_decode(%s_xer_, p_reader, p_flavor | (p_td.xer_bits & USE_NIL));\n" + " field_%s.XER_decode(%s_xer_, p_reader, p_flavor | (p_td.xer_bits & USE_NIL), 0);\n" " }\n" , sdef->elements[i].dispname , sdef->elements[i].name, sdef->elements[i].typegen @@ -2633,6 +2630,17 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) if (num_attributes || sdef->xerEmbedValuesPossible || sdef->xerUseOrderPossible) { src = mputstr(src, "}\n"); } + + if (sdef->xerEmbedValuesPossible) { + src = mputprintf(src, + " embed_values_dec_struct_t* emb_val = 0;\n" + " if (e_xer && (p_td.xer_bits & EMBED_VALUES)) {\n" + " emb_val = new embed_values_dec_struct_t;\n" + " emb_val->embval_array = &field_%s;\n" + " emb_val->embval_index = 0;\n" + " field_%s.set_size(0);\n" + " }\n", sdef->elements[0].name, sdef->elements[0].name); + } if (sdef->xerUseOrderPossible) { size_t begin = start_at + num_attributes; /* first non-attribute */ @@ -2657,23 +2665,6 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) } } - if (sdef->xerEmbedValuesPossible) { /* EMBED-VALUES with USE-ORDER */ - src = mputprintf(src, - " if (p_td.xer_bits & EMBED_VALUES) {\n" - " field_%s.set_size(%lu);\n" - " %s::of_type empty_string(\"\");\n" - " for (int j_j=0; j_j<%lu; ++j_j) {\n" - " field_%s[j_j] = empty_string;\n" - " }\n" - " }\n" - , sdef->elements[0].name - , (unsigned long)(n_embed + 1) - , sdef->elements[0].type - , (unsigned long)(n_embed + 1) - , sdef->elements[0].name - ); - } - if (sdef->xerUseNilPossible) { /* USE-NIL and USE-ORDER */ src = mputprintf(src, " if (nil_attribute) field_%s.set_size(0);\n else" @@ -2684,18 +2675,26 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) " {\n" " field_%s.set_size(0);\n" " int e_val, num_seen = 0, *seen_f = new int[%lu];\n" - " for (int i=0; i < %lu; ++i) {\n" - " for (rd_ok=p_reader.Ok(); rd_ok==1; rd_ok=p_reader.Read()) {\n" , sdef->elements[uo].name , (unsigned long)(n_embed) + ); + if (sdef->xerEmbedValuesPossible) { + // The index of the latest embedded value can change outside of this function + // (if the field is a untagged record of), in this case the next value should + // be ignored, as it's already been handled by the record of + src = mputstr(src, " int last_embval_index = 0;\n"); + } + src = mputprintf(src, + " for (int i=0; i < %lu; ++i) {\n" + " for (rd_ok=p_reader.Ok(); rd_ok==1; rd_ok=p_reader.Read()) {\n" , (unsigned long)(n_embed)); if (sdef->xerEmbedValuesPossible) { /* read and store embedValues text if present */ src = mputprintf(src, - " if ((p_td.xer_bits & EMBED_VALUES) && (p_reader.NodeType()==XML_READER_TYPE_TEXT)) {\n" + " if (0 != emb_val && p_reader.NodeType()==XML_READER_TYPE_TEXT) {\n" " UNIVERSAL_CHARSTRING emb_ustr((const char*)p_reader.Value());\n" - " field_%s[i] = emb_ustr;\n" + " field_%s[emb_val->embval_index] = emb_ustr;\n" " }\n" , sdef->elements[0].name); } @@ -2706,7 +2705,16 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) " }\n" " if (rd_ok != 1) break;\n" " const char * x_name = (const char*)p_reader.LocalName();\n" /* Name or LocalName ? */); - + + if (sdef->xerEmbedValuesPossible) { + src = mputstr(src, + " if (0 != emb_val) {\n" + " if (last_embval_index == emb_val->embval_index) {\n" + " ++emb_val->embval_index;\n" + " }\n" + " last_embval_index = emb_val->embval_index;\n" + " }\n"); + } /* * * * * code for USE-ORDER * * * * */ @@ -2716,20 +2724,20 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) src = mputprintf(src, " if (check_name(x_name, %s_xer_, 1)) {\n" " ec_1.set_msg(\"%s': \");\n" - " field_%s%s%s%s.XER_decode(%s_xer_, p_reader, p_flavor);\n" + " field_%s%s%s%s.XER_decode(%s_xer_, p_reader, p_flavor, %s);\n" , sdef->elements[i].typegen , sdef->elements[i].dispname - , (sdef->xerUseNilPossible ? sdef->elements[sdef->nElements-1].name: sdef->elements[i].name) , (sdef->xerUseNilPossible ? "()." : "") , (sdef->xerUseNilPossible ? sdef->elements[i].name : "") , (sdef->xerUseNilPossible ? "()" : "") , sdef->elements[i].typegen + , sdef->xerEmbedValuesPossible ? "emb_val" : "0" ); src = mputprintf(src, - " field_%s[i] = e_val = %s::of_type::%s;\n" - , sdef->elements[uo].name - , sdef->elements[uo].typegen, sdef->elements[i].name); + " field_%s[i] = e_val = %s::of_type::%s;\n" + , sdef->elements[uo].name + , sdef->elements[uo].typegen, sdef->elements[i].name); src = mputstr(src, " }\n else"); } } @@ -2753,7 +2761,7 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) " }\n" " if (!next_any) {\n" " ec_1.set_msg(\"%s': \");\n" - " field_%s%s%s%s.XER_decode(%s_xer_, p_reader, p_flavor);\n" + " field_%s%s%s%s.XER_decode(%s_xer_, p_reader, p_flavor, 0);\n" " field_%s[i] = e_val;\n" " any_found = true;\n" " }\n" @@ -2781,11 +2789,16 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) if (sdef->xerEmbedValuesPossible) { /* read and store embedValues text if present */ src = mputprintf(src, - " if ((p_td.xer_bits & EMBED_VALUES) && (p_reader.NodeType()==XML_READER_TYPE_TEXT)) {\n" - " UNIVERSAL_CHARSTRING emb_ustr((const char*)p_reader.Value());\n" - " field_%s[%lu] = emb_ustr;\n" + " if (0 != emb_val) {\n" + " if (p_reader.NodeType()==XML_READER_TYPE_TEXT) {\n" + " UNIVERSAL_CHARSTRING emb_ustr((const char*)p_reader.Value());\n" + " field_%s[emb_val->embval_index] = emb_ustr;\n" + " }\n" + " if (last_embval_index == emb_val->embval_index) {\n" + " ++emb_val->embval_index;\n" + " }\n" " }\n" - , sdef->elements[0].name, (unsigned long)(n_embed)); + , sdef->elements[0].name); } src = mputprintf(src, @@ -2816,16 +2829,29 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) " p_reader.MoveToElement();\n" " } else {\n"); } + if (sdef->xerEmbedValuesPossible) { + // The index of the latest embedded value can change outside of this function + // (if the field is a untagged record of), in this case the next value should + // be ignored, as it's already been handled by the record of + // Omitted fields can also reset this value + src = mputstr(src, " int last_embval_index = 0;\n"); + } /* for all the non-attribute fields... */ for (i = start_at + num_attributes; i < sdef->nElements; ++i) { if (sdef->xerEmbedValuesPossible) { /* read and store embedValues text if present */ src = mputprintf(src, - " if ((p_td.xer_bits & EMBED_VALUES) && (p_reader.NodeType()==XML_READER_TYPE_TEXT)) {\n" - " UNIVERSAL_CHARSTRING emb_ustr((const char*)p_reader.Value());\n" - " field_%s[%lu] = emb_ustr;\n" + " if (0 != emb_val) {\n" + " if (p_reader.NodeType()==XML_READER_TYPE_TEXT) {\n" + " UNIVERSAL_CHARSTRING emb_ustr((const char*)p_reader.Value());\n" + " field_%s[emb_val->embval_index] = emb_ustr;\n" + " }\n" + " if (last_embval_index == emb_val->embval_index) {\n" + " ++emb_val->embval_index;\n" + " }\n" + " last_embval_index = emb_val->embval_index;\n" " }\n" - , sdef->elements[0].name, (unsigned long)(i-(start_at+num_attributes))); + , sdef->elements[0].name); } /* The DEFAULT-FOR-EMPTY member can not be involved with EMBED-VALUES, * so we can use the same pattern: optional "if(...) else" before {} @@ -2860,69 +2886,59 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc) src = mputprintf(src, " field_%s.XER_decode(%s_xer_, p_reader, p_flavor" - " | (p_td.xer_bits & USE_NIL)| (tag_closed ? PARENT_CLOSED : 0));\n" + " | (p_td.xer_bits & USE_NIL)| (tag_closed ? PARENT_CLOSED : 0), %s);\n" " }\n" - , sdef->elements[i].name, sdef->elements[i].typegen); + , sdef->elements[i].name, sdef->elements[i].typegen + , sdef->xerEmbedValuesPossible ? "emb_val" : "0"); + if (sdef->xerEmbedValuesPossible) { + src = mputprintf(src, + " if (!field_%s.is_present()) {\n" + // there was no new element, the last embedded value is for the next field + // (or the end of the record if this is the last field) + " last_embval_index = -1;\n" + " }\n" + , sdef->elements[i].name); + } } /* next field */ - if (sdef->xerUseNilPossible) { - src = mputstr(src, " } // use_nil\n"); - } - if (sdef->xerEmbedValuesPossible) { /* read and store embedValues text if present */ src = mputprintf(src, - " if ((p_td.xer_bits & EMBED_VALUES) && (p_reader.NodeType()==XML_READER_TYPE_TEXT)) {\n" - " UNIVERSAL_CHARSTRING emb_ustr((const char*)p_reader.Value());\n" - " field_%s[%lu] = emb_ustr;\n" + " if (0 != emb_val) {\n" + " if (p_reader.NodeType()==XML_READER_TYPE_TEXT) {\n" + " UNIVERSAL_CHARSTRING emb_ustr((const char*)p_reader.Value());\n" + " field_%s[emb_val->embval_index] = emb_ustr;\n" + " }\n" + " if (last_embval_index == emb_val->embval_index) {\n" + " ++emb_val->embval_index;\n" + " }\n" " }\n" - , sdef->elements[0].name, (unsigned long)(i-(start_at+num_attributes))); + , sdef->elements[0].name); + } + + if (sdef->xerUseNilPossible) { + src = mputstr(src, " } // use_nil\n"); } + if (sdef->xerUseOrderPossible) { + src = mputstr(src, " } // uo\n"); + } + if (sdef->xerEmbedValuesPossible) { - size_t op; src = mputprintf(src, - /* Set the embed-values member to the correct nr of strings */ - " if (e_xer && (p_td.xer_bits & EMBED_VALUES)) {\n" - " int exp_embed = %lu;\n" - , (unsigned long)max_embed - ); - - if (sdef->xerUseNilPossible) { - src = mputstr(src, - " if (nil_attribute) exp_embed = 0;\n" - " else {"); - } - - for (op = 0; op < sdef->nElements; ++op) { - if (sdef->elements[op].isOptional && !sdef->elements[op].xerAttribute) { - src = mputprintf(src, - " if (!field_%s.ispresent()) --exp_embed;\n" - , sdef->elements[op].name - ); - } - } - - if (sdef->xerUseNilPossible) src = mputstr(src, " }\n"); - - src = mputprintf(src, - " field_%s.set_size(exp_embed);//normal\n" + " if (0 != emb_val) {\n" " %s::of_type empty_string(\"\");\n" - " for (int j_j=0; j_j<exp_embed; ++j_j) {\n" + " for (int j_j = 0; j_j < emb_val->embval_index; ++j_j) {\n" " if (!field_%s[j_j].is_bound()) field_%s[j_j] = empty_string;\n" " }\n" - " }" - , sdef->elements[0].name + " delete emb_val;\n" + " }\n" , sdef->elements[0].type , sdef->elements[0].name , sdef->elements[0].name ); } - if (sdef->xerUseOrderPossible) { - src = mputstr(src, " } // uo\n"); - } - if (sdef->xerUseQName) { src = mputstr(src, " } // qn\n"); } @@ -5773,8 +5789,8 @@ static void defEmptyRecordClass(const struct_def *sdef, ); src = mputprintf(src, - "int %s::XER_encode(const XERdescriptor_t& p_td," - " TTCN_Buffer& p_buf, unsigned int p_flavor, int p_indent) const{\n" + "int %s::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, " + "unsigned int p_flavor, int p_indent, embed_values_enc_struct_t*) const{\n" " int encoded_length=(int)p_buf.get_len();\n" " int is_indented = !is_canonical(p_flavor);\n" " int e_xer = is_exer(p_flavor);\n" @@ -5791,7 +5807,7 @@ static void defEmptyRecordClass(const struct_def *sdef, "// written by %s in " __FILE__ " at %d\n" #endif "int %s::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& p_reader, " - "unsigned int p_flavor)\n" + "unsigned int p_flavor, embed_values_dec_struct_t*)\n" "{\n" " int e_xer = is_exer(p_flavor);\n" " bound_flag = true;\n" diff --git a/compiler2/record_of.c b/compiler2/record_of.c index 0b7616528..b820722e9 100644 --- a/compiler2/record_of.c +++ b/compiler2/record_of.c @@ -56,8 +56,6 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) "int n_elements;\n" "%s **value_elements;\n" "} *val_ptr;\n" - "Vector<int> refd_indices;\n" - "int max_refd_index;\n" #ifndef NDEBUG , __FUNCTION__, __LINE__ #endif @@ -98,63 +96,6 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) "}\n" "}\n\n", name, name, dispname, name, dispname, name, name, name, name, name); } - - /* function that returns the actual number of elements */ - def = mputstr(def, "int get_nof_elements() const;\n"); - src = mputprintf(src, - "int %s::get_nof_elements() const\n" - "{\n" - " int nof_elements = (val_ptr != NULL) ? val_ptr->n_elements : 0;\n" - " if (!refd_indices.empty()) {\n" - " while (nof_elements > 0) {\n" - " if (is_elem_bound(nof_elements - 1)) {\n" - " break;\n" - " }\n" - " --nof_elements;\n" - " }\n" - " }\n" - " return nof_elements;\n" - "}\n\n", name); - - /* element boundness check function */ - def = mputstr(def, "bool is_elem_bound(int index) const;\n"); - src = mputprintf(src, - "bool %s::is_elem_bound(int index) const\n" - "{\n" - " return val_ptr->value_elements[index] != NULL &&\n" - " val_ptr->value_elements[index]->is_bound();\n" - "}\n\n", name); - - /* function that calculates and caches the maximum referenced index */ - def = mputstr(def, "int get_max_refd_index();\n"); - src = mputprintf(src, - "int %s::get_max_refd_index()\n" - "{\n" - " if (refd_indices.empty()) {\n" - " return -1;\n" - " }\n" - " if (-1 == max_refd_index) {\n" - " for (size_t i = 0; i < refd_indices.size(); ++i) {\n" - " if (refd_indices[i] > max_refd_index) {\n" - " max_refd_index = refd_indices[i];\n" - " }\n" - " }\n" - " }\n" - " return max_refd_index;\n" - "}\n\n", name); - - /* referenced index check function */ - def = mputstr(def, "bool is_index_refd(int index);\n"); - src = mputprintf(src, - "bool %s::is_index_refd(int index)\n" - "{\n" - " for (size_t i = 0; i < refd_indices.size(); ++i) {\n" - " if (index == refd_indices[i]) {\n" - " return true;\n" - " }\n" - " }\n" - " return false;\n" - "}\n\n", name); /* public member functions */ def = mputstr(def, "\npublic:\n"); @@ -166,7 +107,6 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) "%s::%s()\n" "{\n" "val_ptr = NULL;\n" - "max_refd_index = -1;\n" "}\n\n", name, name); def = mputprintf(def, "%s(null_type other_value);\n", name); @@ -177,7 +117,6 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) "val_ptr->ref_count = 1;\n" "val_ptr->n_elements = 0;\n" "val_ptr->value_elements = NULL;\n" - "max_refd_index = -1;\n" "}\n\n", name, name); /* copy constructor */ @@ -187,23 +126,9 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) "{\n" "if (!other_value.is_bound()) " "TTCN_error(\"Copying an unbound value of type %s.\");\n" - "if (other_value.refd_indices.empty()) {\n" "val_ptr = other_value.val_ptr;\n" "val_ptr->ref_count++;\n" - "}\n" - "else {\n" - // there are references to at least one element => the array must be copied - "val_ptr = NULL;\n" - "int nof_elements = other_value.get_nof_elements();\n" - "set_size(nof_elements);\n" - "for (int i = 0; i < nof_elements; ++i) {\n" - "if (other_value.is_elem_bound(i)) {\n" - "val_ptr->value_elements[i] = new %s(*(other_value.val_ptr->value_elements[i]));\n" - "}\n" - "}\n" - "}\n" - "max_refd_index = -1;\n" - "}\n\n", name, name, name, dispname, type); + "}\n\n", name, name, name, dispname); /* destructor */ def = mputprintf(def, "~%s();\n\n", name); @@ -226,7 +151,6 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) "val_ptr = NULL;\n" "}\n" "else if (val_ptr->ref_count == 1) {\n" - "if (refd_indices.empty()) {\n" "for (int elem_count = 0; elem_count < val_ptr->n_elements;\n" "elem_count++)\n" "if (val_ptr->value_elements[elem_count] != NULL)\n" @@ -235,10 +159,6 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) "delete val_ptr;\n" "val_ptr = NULL;\n" "}\n" - "else {\n" - "set_size(0);\n" - "}\n" - "}\n" "else\n" "TTCN_error(\"Internal error: Invalid reference counter in a record " "of/set of value.\");\n" @@ -250,7 +170,11 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) src = mputprintf(src, "%s& %s::operator=(null_type)\n" "{\n" - "set_size(0);\n" + "clean_up();\n" + "val_ptr = new recordof_setof_struct;\n" + "val_ptr->ref_count = 1;\n" + "val_ptr->n_elements = 0;\n" + "val_ptr->value_elements = NULL;\n" "return *this;\n" "}\n\n", name, name); @@ -259,39 +183,15 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) src = mputprintf(src, "%s& %s::operator=(const %s& other_value)\n" "{\n" - "if (!other_value.is_bound()) " + "if (other_value.val_ptr == NULL) " "TTCN_error(\"Assigning an unbound value of type %s.\");\n" "if (this != &other_value) {\n" - "if (refd_indices.empty() && other_value.refd_indices.empty()) {\n" "clean_up();\n" "val_ptr = other_value.val_ptr;\n" "val_ptr->ref_count++;\n" "}\n" - "else {\n" - // there are references to at least one element => the array must be copied - "int nof_elements = other_value.get_nof_elements();\n" - "set_size(nof_elements);\n" - "for (int i = 0; i < nof_elements; ++i) {\n" - "if (other_value.is_elem_bound(i)) {\n" - "if (val_ptr->value_elements[i] == NULL) {\n" - "val_ptr->value_elements[i] = new %s;\n" - "}\n" - "*val_ptr->value_elements[i] = *other_value.val_ptr->value_elements[i];\n" - "}\n" - "else if (val_ptr->value_elements[i] != NULL) {\n" - "if (is_index_refd(i)) {\n" - "val_ptr->value_elements[i]->clean_up();\n" - "}\n" - "else {\n" - "delete val_ptr->value_elements[i];\n" - "val_ptr->value_elements[i] = NULL;\n" - "}\n" - "}\n" - "}\n" - "}\n" - "}\n" "return *this;\n" - "}\n\n", name, name, name, dispname, type); + "}\n\n", name, name, name, dispname); /* comparison operators */ def = mputstr(def, "boolean operator==(null_type other_value) const;\n"); @@ -301,7 +201,7 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) "if (val_ptr == NULL)\n" "TTCN_error(\"The left operand of comparison is an unbound value of " "type %s.\");\n" - "return get_nof_elements() == 0 ;\n" + "return val_ptr->n_elements == 0 ;\n" "}\n\n", name, dispname); def = mputprintf(def, "boolean operator==(const %s& other_value) const;\n", @@ -319,22 +219,23 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) dispname, dispname); if (sdef->kind == SET_OF) { src = mputstr(src, - "return compare_set_of(this, get_nof_elements(), &other_value, " - "other_value.get_nof_elements(), compare_function);\n"); + "return compare_set_of(this, val_ptr->n_elements, &other_value, " + "(other_value.val_ptr)->n_elements, compare_function);\n"); } else { src = mputstr (src, - "if (get_nof_elements() != other_value.get_nof_elements())\n" + "if (val_ptr->n_elements != (other_value.val_ptr)->n_elements)\n" "return FALSE;\n" - "for (int elem_count = 0; elem_count < get_nof_elements(); elem_count++){\n" - "if (is_elem_bound(elem_count)){\n" - "if (other_value.is_elem_bound(elem_count)){\n" + "for (int elem_count = 0; elem_count < val_ptr->n_elements; elem_count++){\n" + "if (val_ptr->value_elements[elem_count] != NULL){\n" + "if ((other_value.val_ptr)->value_elements[elem_count] != NULL){\n" " if (*val_ptr->value_elements[elem_count] != " "*(other_value.val_ptr)->value_elements[elem_count]) " "return FALSE;\n" "} else return FALSE;\n" "} else {\n" - "if (other_value.is_elem_bound(elem_count)) return FALSE;\n" + "if ((other_value.val_ptr)->value_elements[elem_count] != NULL) " + "return FALSE;\n" "}\n" "}\n" "return TRUE;\n"); @@ -403,9 +304,9 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) "TTCN_error(\"Accessing an element in an unbound value of type %s.\");\n" "if (index_value < 0) TTCN_error(\"Accessing an element of type %s " "using a negative index: %%d.\", index_value);\n" - "if (index_value >= get_nof_elements()) TTCN_error(\"Index overflow in " + "if (index_value >= val_ptr->n_elements) TTCN_error(\"Index overflow in " "a value of type %s: The index is %%d, but the value has only %%d " - "elements.\", index_value, get_nof_elements());\n" + "elements.\", index_value, val_ptr->n_elements);\n" "return (val_ptr->value_elements[index_value] != NULL) ?\n" "*val_ptr->value_elements[index_value] : UNBOUND_ELEM;\n" "}\n\n", type, name, dispname, dispname, dispname); @@ -449,17 +350,16 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) "if (val_ptr == NULL) " "TTCN_error(\"Performing rotation operation on an unbound value of type " "%s.\");\n" - "int nof_elements = get_nof_elements();\n" - "if (nof_elements == 0) return *this;\n" + "if (val_ptr->n_elements == 0) return *this;\n" "int rc;\n" - "if (rotate_count>=0) rc = rotate_count %% nof_elements;\n" - "else rc = nof_elements - ((-rotate_count) %% nof_elements);\n" + "if (rotate_count>=0) rc = rotate_count %% val_ptr->n_elements;\n" + "else rc = val_ptr->n_elements - ((-rotate_count) %% val_ptr->n_elements);\n" "if (rc == 0) return *this;\n" "%s ret_val;\n" - "ret_val.set_size(nof_elements);\n" - "for (int i=0; i<nof_elements; i++) {\n" - "if (is_elem_bound(i)) {\n" - "ret_val.val_ptr->value_elements[(i+rc)%%nof_elements] =" + "ret_val.set_size(val_ptr->n_elements);\n" + "for (int i=0; i<val_ptr->n_elements; i++) {\n" + "if (val_ptr->value_elements[i] != NULL) {\n" + "ret_val.val_ptr->value_elements[(i+rc)%%val_ptr->n_elements] =" "new %s(*val_ptr->value_elements[i]);\n" "}\n" "}\n" @@ -475,20 +375,18 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) "{\n" "if (val_ptr == NULL || other_value.val_ptr == NULL) " "TTCN_error(\"Unbound operand of %s concatenation.\");\n" - "int nof_elements = get_nof_elements();\n" - "if (nof_elements == 0) return other_value;\n" - "int other_value_nof_elements = other_value.get_nof_elements();" - "if (other_value_nof_elements == 0) return *this;\n" + "if (val_ptr->n_elements == 0) return other_value;\n" + "if (other_value.val_ptr->n_elements == 0) return *this;\n" "%s ret_val;\n" - "ret_val.set_size(nof_elements + other_value_nof_elements);\n" - "for (int i=0; i<nof_elements; i++) {\n" - "if (is_elem_bound(i)) {\n" + "ret_val.set_size(val_ptr->n_elements+other_value.val_ptr->n_elements);\n" + "for (int i=0; i<val_ptr->n_elements; i++) {\n" + "if (val_ptr->value_elements[i] != NULL) {\n" "ret_val.val_ptr->value_elements[i] = new %s(*val_ptr->value_elements[i]);\n" "}\n" "}\n" - "for (int i=0; i<other_value_nof_elements; i++) {\n" - "if (other_value.is_elem_bound(i)) {\n" - "ret_val.val_ptr->value_elements[i + nof_elements] = " + "for (int i=0; i<other_value.val_ptr->n_elements; i++) {\n" + "if (other_value.val_ptr->value_elements[i] != NULL) {\n" + "ret_val.val_ptr->value_elements[i+val_ptr->n_elements] = " "new %s(*other_value.val_ptr->value_elements[i]);\n" "}\n" "}\n" @@ -504,12 +402,12 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) "if (val_ptr == NULL) " "TTCN_error(\"The first argument of substr() is an unbound value of " "type %s.\");\n" - "check_substr_arguments(get_nof_elements(), index, returncount, " + "check_substr_arguments(val_ptr->n_elements, index, returncount, " "\"%s\",\"element\");\n" "%s ret_val;\n" "ret_val.set_size(returncount);\n" "for (int i=0; i<returncount; i++) {\n" - "if (is_elem_bound(i+index)) {\n" + "if (val_ptr->value_elements[i+index] != NULL) {\n" "ret_val.val_ptr->value_elements[i] = " "new %s(*val_ptr->value_elements[i+index]);\n" "}\n" @@ -529,26 +427,24 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) "if (repl.val_ptr == NULL) " "TTCN_error(\"The fourth argument of replace() is an unbound value of " "type %s.\");\n" - "int nof_elements = get_nof_elements();\n" - "check_replace_arguments(nof_elements, index, len, " + "check_replace_arguments(val_ptr->n_elements, index, len, " "\"%s\",\"element\");\n" "%s ret_val;\n" - "int repl_nof_elements = repl.get_nof_elements();\n" - "ret_val.set_size(nof_elements + repl_nof_elements - len);\n" + "ret_val.set_size(val_ptr->n_elements + repl.val_ptr->n_elements - len);\n" "for (int i = 0; i < index; i++) {\n" - "if (is_elem_bound(i)) {\n" + "if (val_ptr->value_elements[i] != NULL) {\n" "ret_val.val_ptr->value_elements[i] = new %s(*val_ptr->value_elements[i]);\n" "}\n" "}\n" - "for (int i = 0; i < repl_nof_elements; i++) {\n" - "if (repl.is_elem_bound(i)) {\n" + "for (int i = 0; i < repl.val_ptr->n_elements; i++) {\n" + "if (repl.val_ptr->value_elements[i] != NULL) {\n" "ret_val.val_ptr->value_elements[i+index] = " "new %s(*repl.val_ptr->value_elements[i]);\n" "}\n" "}\n" - "for (int i = 0; i < nof_elements - index - len; i++) {\n" - "if (is_elem_bound(index+i+len)) {\n" - "ret_val.val_ptr->value_elements[index+i+repl_nof_elements] = " + "for (int i = 0; i < val_ptr->n_elements - index - len; i++) {\n" + "if (val_ptr->value_elements[index+i+len] != NULL) {\n" + "ret_val.val_ptr->value_elements[index+i+repl.val_ptr->n_elements] = " "new %s(*val_ptr->value_elements[index+i+len]);\n" "}\n" "}\n" @@ -604,40 +500,19 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) "val_ptr->n_elements = new_size;\n" "} else if (new_size < val_ptr->n_elements) {\n" "for (int elem_count = new_size; elem_count < val_ptr->n_elements; " - "elem_count++) {\n" - "if (val_ptr->value_elements[elem_count] != NULL) {\n" - "if (is_index_refd(elem_count)) {\n" - "val_ptr->value_elements[elem_count]->clean_up();\n" - "}\n" - "else {\n" + "elem_count++)\n" + "if (val_ptr->value_elements[elem_count] != NULL)" "delete val_ptr->value_elements[elem_count];\n" - "val_ptr->value_elements[elem_count] = 0;\n" - "}\n" - "}\n" - "}\n" - "if (new_size <= get_max_refd_index()) {\n" - "new_size = get_max_refd_index() + 1;\n" - "}\n" - "if (new_size < val_ptr->n_elements) {\n" "val_ptr->value_elements = (%s**)" "reallocate_pointers((void**)val_ptr->value_elements, " "val_ptr->n_elements, new_size);\n" "val_ptr->n_elements = new_size;\n" "}\n" - "}\n" "}\n\n", name, dispname, type, type, type, dispname, type); /* is_bound function */ def = mputstr(def, - "boolean is_bound() const;\n"); - src = mputprintf(src, - "boolean %s::is_bound() const\n" - "{\n" - "if (refd_indices.empty()) {\n" - "return (val_ptr != NULL);\n" - "}\n" - "return (get_nof_elements() != 0);\n" - "}\n\n", name); + "inline boolean is_bound() const {return val_ptr != NULL; }\n"); /* is_present function */ def = mputstr(def, @@ -650,8 +525,8 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) "boolean %s::is_value() const\n" "{\n" "if (val_ptr == NULL) return false;\n" - "for(int i = 0; i < get_nof_elements(); ++i) {\n" - "if (!is_elem_bound(i) || " + "for(int i = 0; i < val_ptr->n_elements; ++i) {\n" + "if (val_ptr->value_elements[i] == NULL || " "!val_ptr->value_elements[i]->is_value()) return FALSE;\n" "}\n" "return TRUE;\n" @@ -667,7 +542,7 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) "if (val_ptr == NULL) " "TTCN_error(\"Performing sizeof operation on an unbound value of type " "%s.\");\n" - "return get_nof_elements();\n" + "return val_ptr->n_elements;\n" "}\n\n", name, dispname); /* lengthof operation */ @@ -678,8 +553,8 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) "if (val_ptr == NULL) " "TTCN_error(\"Performing lengthof operation on an unbound value of type " "%s.\");\n" - "for (int my_length=get_nof_elements(); my_length>0; my_length--) " - "if (is_elem_bound(my_length-1)) return my_length;\n" + "for (int my_length=val_ptr->n_elements; my_length>0; my_length--) " + "if (val_ptr->value_elements[my_length-1] != NULL) return my_length;\n" "return 0;\n" "}\n\n", name, dispname); @@ -693,13 +568,13 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) "TTCN_Logger::log_event_unbound();\n" "return;\n" "}\n" - "switch (get_nof_elements()) {\n" + "switch (val_ptr->n_elements) {\n" "case 0:\n" "TTCN_Logger::log_event_str(\"{ }\");\n" "break;\n" "default:\n" "TTCN_Logger::log_event_str(\"{ \");\n" - "for (int elem_count = 0; elem_count < get_nof_elements(); " + "for (int elem_count = 0; elem_count < val_ptr->n_elements; " "elem_count++) {\n" "if (elem_count > 0) TTCN_Logger::log_event_str(\", \");\n" "(*this)[elem_count].log();\n" @@ -786,35 +661,9 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) src = mputprintf(src, "void %s::set_implicit_omit()\n{\n" "if (val_ptr == NULL) return;\n" - "for (int i = 0; i < get_nof_elements(); i++) {\n" - "if (is_elem_bound(i)) val_ptr->value_elements[i]->set_implicit_omit();\n" + "for (int i = 0; i < val_ptr->n_elements; i++) {\n" + "if (val_ptr->value_elements[i] != NULL) val_ptr->value_elements[i]->set_implicit_omit();\n" "}\n}\n\n", name); - - /* functions for inserting and removing references to elements of the record of */ - def = mputstr(def, " void add_refd_index(int index);\n"); - src = mputprintf(src, - "void %s::add_refd_index(int index)\n" - "{\n" - " refd_indices.push_back(index);\n" - " if (index > get_max_refd_index()) {\n" - " max_refd_index = index;\n" - " }\n" - "}\n\n", name); - - def = mputstr(def, " void remove_refd_index(int index);\n"); - src = mputprintf(src, - "void %s::remove_refd_index(int index)\n" - "{\n" - " for (size_t i = refd_indices.size(); i > 0; --i) {\n" - " if (refd_indices[i - 1] == index) {\n" - " refd_indices.erase_at(i - 1);\n" - " break;\n" - " }\n" - " }\n" - " if (get_max_refd_index() == index) {\n" - " max_refd_index = -1;\n" - " }\n" - "}\n\n", name); /* encoding / decoding functions */ def = mputstr(def, "void encode_text(Text_Buf& text_buf) const;\n"); @@ -823,8 +672,8 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) "{\n" "if (val_ptr == NULL) " "TTCN_error(\"Text encoder: Encoding an unbound value of type %s.\");\n" - "text_buf.push_int(get_nof_elements());\n" - "for (int elem_count = 0; elem_count < get_nof_elements(); " + "text_buf.push_int(val_ptr->n_elements);\n" + "for (int elem_count = 0; elem_count < val_ptr->n_elements; " "elem_count++)\n" "(*this)[elem_count].encode_text(text_buf);\n" "}\n\n", name, dispname); @@ -833,18 +682,19 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) src = mputprintf(src, "void %s::decode_text(Text_Buf& text_buf)\n" "{\n" - "int new_size = text_buf.pull_int().get_val();\n" - "if (new_size < 0)\n TTCN_error(\"Text decoder: Negative size " + "clean_up();\n" + "val_ptr = new recordof_setof_struct;\n" + "val_ptr->ref_count = 1;\n" + "val_ptr->n_elements = text_buf.pull_int().get_val();\n" + "if (val_ptr->n_elements < 0) TTCN_error(\"Text decoder: Negative size " "was received for a value of type %s.\");\n" - "set_size(new_size);\n" - "for (int elem_count = 0; elem_count < new_size; " + "val_ptr->value_elements = (%s**)allocate_pointers(val_ptr->n_elements);\n" + "for (int elem_count = 0; elem_count < val_ptr->n_elements; " "elem_count++) {\n" - "if (val_ptr->value_elements[elem_count] == NULL) {\n" "val_ptr->value_elements[elem_count] = new %s;\n" - "}\n" "val_ptr->value_elements[elem_count]->decode_text(text_buf);\n" "}\n" - "}\n\n", name, dispname, type); + "}\n\n", name, dispname, type, type); if(ber_needed || raw_needed || text_needed || xer_needed || json_needed) def_encdec(name, &def, &src, ber_needed, raw_needed, text_needed, @@ -868,7 +718,7 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) " }\n" " return encoded_length;\n" " }\n" - " for(int a=0;a<get_nof_elements();a++){\n" + " for(int a=0;a<val_ptr->n_elements;a++){\n" " if(a!=0 && p_td.text->separator_encode){\n" " p_buf.put_cs(*p_td.text->separator_encode);\n" " encoded_length+=p_td.text->separator_encode->lengthof();\n" @@ -914,9 +764,13 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) " ml++;\n" " }\n" " if(first_call) {\n" - " set_size(0);\n" + " clean_up();\n" + " val_ptr=new recordof_setof_struct;\n" + " val_ptr->ref_count=1;\n" + " val_ptr->n_elements=0;\n" + " val_ptr->value_elements=NULL;\n" " }\n" - " int more=get_nof_elements();\n" + " int more=val_ptr->n_elements;\n" " while(TRUE){\n" " %s *val=new %s;\n" " pos=p_buf.get_pos();\n" @@ -931,17 +785,11 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) " break;\n" " }\n" " sep_found=FALSE;\n" - " if (refd_indices.empty()) {\n" - " val_ptr->value_elements = (%s**)reallocate_pointers" + " val_ptr->value_elements = (%s**)reallocate_pointers" "((void**)val_ptr->value_elements, val_ptr->n_elements, " "val_ptr->n_elements + 1);\n" - " val_ptr->value_elements[val_ptr->n_elements]=val;\n" - " val_ptr->n_elements++;\n" - " }\n" - " else {\n" - " (*this)[get_nof_elements()] = *val;\n" - " delete val;\n" - " }\n" + " val_ptr->value_elements[val_ptr->n_elements]=val;\n" + " val_ptr->n_elements++;\n" " decoded_length+=len;\n" " if(p_td.text->separator_decode){\n" " int tl;\n" @@ -977,7 +825,9 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) " if((tl=p_td.text->end_decode->match_begin(p_buf))<0){\n" " if(no_err){" " if(!first_call){\n" - " set_size(more);\n" + " for(int a=more; a<val_ptr->n_elements; a++) " + "delete val_ptr->value_elements[a];\n" + " val_ptr->n_elements=more;\n" " }\n" " return -1;\n" " }\n" @@ -990,7 +840,7 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) " decoded_length+=tl;\n" " p_buf.increase_pos(tl);\n" " }\n" - " if(get_nof_elements()==0){\n" + " if(val_ptr->n_elements==0){\n" " if(!(p_td.text->end_decode || p_td.text->begin_decode)) {\n" " if(no_err)return -1;\n" " TTCN_EncDec_ErrorContext::error" @@ -998,7 +848,7 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) " return decoded_length;\n" " }\n" " }\n" - " if(!first_call && more==get_nof_elements() && " + " if(!first_call && more==val_ptr->n_elements && " "!(p_td.text->end_decode || p_td.text->begin_decode)) return -1;\n" " return decoded_length;\n" "}\n" @@ -1018,7 +868,7 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) " if(!new_tlv) {\n" " new_tlv=ASN_BER_TLV_t::construct(NULL);\n" " TTCN_EncDec_ErrorContext ec;\n" - " for(int elem_i=0; elem_i<get_nof_elements(); elem_i++) {\n" + " for(int elem_i=0; elem_i<val_ptr->n_elements; elem_i++) {\n" " ec.set_msg(\"Component #%%d: \", elem_i);\n" " new_tlv->add_TLV((*this)[elem_i].BER_encode_TLV" "(%s_descr_, p_coding));\n" @@ -1039,23 +889,32 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) " TTCN_EncDec_ErrorContext ec_0(\"While decoding '%%s' type: \"," " p_td.name);\n" " stripped_tlv.chk_constructed_flag(TRUE);\n" - " set_size(0);\n" + " clean_up();\n" + " val_ptr = new recordof_setof_struct;\n" + " val_ptr->ref_count = 1;\n" + " val_ptr->n_elements = 0;\n" + " val_ptr->value_elements = NULL;\n" " size_t V_pos=0;\n" " ASN_BER_TLV_t tmp_tlv;\n" " TTCN_EncDec_ErrorContext ec_1(\"Component #\");\n" " TTCN_EncDec_ErrorContext ec_2(\"0: \");\n" " while(BER_decode_constdTLV_next(stripped_tlv, V_pos, L_form, " "tmp_tlv)) {\n" - " (*this)[get_nof_elements()].BER_decode_TLV(%s_descr_, tmp_tlv, " + " val_ptr->value_elements = (%s**)reallocate_pointers(" + "(void**)val_ptr->value_elements, val_ptr->n_elements, " + "val_ptr->n_elements + 1);\n" + " val_ptr->n_elements++;\n" + " val_ptr->value_elements[val_ptr->n_elements - 1] = new %s;\n" + " val_ptr->value_elements[val_ptr->n_elements - 1]->BER_decode_TLV(%s_descr_, tmp_tlv, " "L_form);\n" - " ec_2.set_msg(\"%%d: \", get_nof_elements());\n" + " ec_2.set_msg(\"%%d: \", val_ptr->n_elements);\n" " }\n" " return TRUE;\n" "}\n" "\n" , name, sdef->oftypedescrname , sdef->kind==SET_OF?" new_tlv->sort_tlvs();\n":"" - , name, sdef->oftypedescrname + , name, type, type, sdef->oftypedescrname ); if(sdef->has_opentypes) { @@ -1072,9 +931,9 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) " p_typelist.push(this);\n" " TTCN_EncDec_ErrorContext ec_0(\"Component #\");\n" " TTCN_EncDec_ErrorContext ec_1;\n" - " for(int elem_i=0; elem_i<get_nof_elements(); elem_i++) {\n" + " for(int elem_i=0; elem_i<val_ptr->n_elements; elem_i++) {\n" " ec_1.set_msg(\"%%d: \", elem_i);\n" - " (*this)[elem_i].BER_decode_opentypes(p_typelist," + " val_ptr->value_elements[elem_i]->BER_decode_opentypes(p_typelist," " L_form);\n" " }\n" " p_typelist.pop();\n" @@ -1096,9 +955,13 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) " int decoded_field_length=0;\n" " size_t start_of_field=0;\n" " if(first_call) {\n" - " set_size(0);\n" + " clean_up();\n" + " val_ptr=new recordof_setof_struct;\n" + " val_ptr->ref_count=1;\n" + " val_ptr->n_elements=0;\n" + " val_ptr->value_elements=NULL;\n" " }\n" - " int start_field=get_nof_elements();\n" + " int start_field=val_ptr->n_elements;\n" " if(p_td.raw->fieldlength || sel_field!=-1){\n" " int a=0;\n" " if(sel_field==-1) sel_field=p_td.raw->fieldlength;\n" @@ -1109,10 +972,12 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) " decoded_length+=decoded_field_length;\n" " limit-=decoded_field_length;\n" " }\n" + " if(a==0) val_ptr->n_elements=0;\n" " } else {\n" " int a=start_field;\n" " if(limit==0){\n" " if(!first_call) return -1;\n" + " val_ptr->n_elements=0;\n" " return decoded_length+p_buf.increase_pos_padd(p_td.raw->padding)" "+prepaddlength;\n" " }\n" @@ -1121,7 +986,8 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) " decoded_field_length=(*this)[a].RAW_decode(%s_descr_,p_buf,limit," "top_bit_ord,TRUE);\n" " if(decoded_field_length < 0){\n" - " set_size(get_nof_elements() - 1);\n" + " delete &(*this)[a];\n" + " val_ptr->n_elements--;\n" " p_buf.set_pos_bit(start_of_field);\n" " if(a>start_field){\n" " return decoded_length+p_buf.increase_pos_padd(p_td.raw->padding)" @@ -1149,8 +1015,8 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) "RAW_enc_tree& myleaf) const{\n" " int encoded_length=0;\n" " int encoded_num_of_records=p_td.raw->fieldlength?" - "smaller(get_nof_elements(), p_td.raw->fieldlength)" - ":get_nof_elements();\n" + "smaller(val_ptr->n_elements, p_td.raw->fieldlength)" + ":val_ptr->n_elements;\n" " myleaf.isleaf=FALSE;\n" " myleaf.rec_of=TRUE;\n" " myleaf.body.node.num_of_nodes=encoded_num_of_records;\n" @@ -1215,7 +1081,7 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) " if (val_ptr) try {\n" " char **new_ns;\n" " size_t num_new;\n" - " for (int i = 0; i < get_nof_elements(); ++i) {\n" + " for (int i = 0; i < val_ptr->n_elements; ++i) {\n" " bool def_ns_1 = false;" " new_ns = (*this)[i].collect_ns(%s_xer_, num_new, def_ns_1);\n" " merge_ns(collected_ns, num_collected, new_ns, num_new);\n" @@ -1235,8 +1101,8 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) , name, sdef->oftypedescrname); src=mputprintf(src, - "int %s::XER_encode(const XERdescriptor_t& p_td," - " TTCN_Buffer& p_buf, unsigned int p_flavor, int p_indent) const\n{\n" + "int %s::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, " + "unsigned int p_flavor, int p_indent, embed_values_enc_struct_t* emb_val) const\n{\n" " if (val_ptr == 0) TTCN_error(\"Attempt to XER-encode an unbound record of\");\n" /* TODO type name */ " int encoded_length=(int)p_buf.get_len();\n" " boolean e_xer = is_exer(p_flavor);\n" @@ -1244,8 +1110,7 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) " || (p_flavor & USE_TYPE_ATTR)));\n" " boolean indenting = !is_canonical(p_flavor) && own_tag;\n" "%s" /* Factor out p_indent if not attribute */ - " int nof_elements = get_nof_elements();\n" - " if (nof_elements==0) {\n" /* Empty record of */ + " if (val_ptr->n_elements==0) {\n" /* Empty record of */ , name , sdef->xerAttribute ? "" : " if (indenting) do_indent(p_buf, p_indent);\n" ); @@ -1298,9 +1163,9 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) " unsigned char saved[4];\n" " memcpy(saved, buf_data + (buf_len - shorter), shorter);\n" " p_buf.increase_length(-shorter);\n" - " for (int i = 0; i < nof_elements; ++i) {\n" + " for (int i = 0; i < val_ptr->n_elements; ++i) {\n" " TTCN_EncDec_ErrorContext ec_0(\"Attribute %d: \", i);\n" - " if (!is_elem_bound(i)) {\n" + " if (val_ptr->value_elements[i] == NULL) {\n" " TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_UNBOUND,\n" " \"Encoding an unbound universal charstring value.\");\n" " continue;\n" @@ -1330,7 +1195,7 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) " p_buf.put_s(ns_len, (const unsigned char*)ns);\n" " UNIVERSAL_CHARSTRING before(sp_at, (const universal_char*)(*val_ptr->value_elements[i]));\n" - " before.XER_encode(UNIVERSAL_CHARSTRING_xer_, p_buf, p_flavor | ANY_ATTRIBUTES, p_indent);\n" + " before.XER_encode(UNIVERSAL_CHARSTRING_xer_, p_buf, p_flavor | ANY_ATTRIBUTES, p_indent, 0);\n" // Ensure the namespace abides to its restrictions " if (p_td.xer_bits & (ANY_FROM | ANY_EXCEPT)) {\n" " TTCN_Buffer ns_buf;\n" @@ -1358,7 +1223,7 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) " }\n" " UNIVERSAL_CHARSTRING after(len - j, (const universal_char*)(*val_ptr->value_elements[i]) + j);\n" - " after.XER_encode(UNIVERSAL_CHARSTRING_xer_, p_buf, p_flavor | ANY_ATTRIBUTES, p_indent);\n" + " after.XER_encode(UNIVERSAL_CHARSTRING_xer_, p_buf, p_flavor | ANY_ATTRIBUTES, p_indent, 0);\n" // Put this attribute in a dummy element and walk through it to check its validity " TTCN_Buffer check_buf;\n" " check_buf.put_s(2, (unsigned char*)\"<a\");\n" @@ -1413,10 +1278,16 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) " TTCN_EncDec_ErrorContext ec_1;\n" ); src=mputprintf(src, - " for (int i = 0; i < nof_elements; ++i) {\n" + " for (int i = 0; i < val_ptr->n_elements; ++i) {\n" + /*" if (i > 0 && !own_tag && 0 != emb_val &&\n" + " emb_val->embval_index < emb_val->embval_size) {\n" + " emb_val->embval_array->get_embedded_value(emb_val->embval_index).XER_encode(\n" + " UNIVERSAL_CHARSTRING_xer_, p_buf, p_flavor | EMBED_VALUES, p_indent+1, 0);\n" + " ++emb_val->embval_index;\n" + " }\n" - temporarily removed in RT1 */ " ec_1.set_msg(\"%%d: \", i);\n" " if (e_xer && (p_td.xer_bits & XER_LIST) && i>0) p_buf.put_c(' ');\n" - " (*this)[i].XER_encode(%s_xer_, p_buf, p_flavor, p_indent+own_tag);\n" + " (*this)[i].XER_encode(%s_xer_, p_buf, p_flavor, p_indent+own_tag, emb_val);\n" " }\n" " if (indenting && !is_exerlist(p_flavor)) {\n", sdef->oftypedescrname @@ -1453,7 +1324,7 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) "// written by %s in " __FILE__ " at %d\n" #endif "int %s::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& p_reader, " - "unsigned int p_flavor)\n{\n" + "unsigned int p_flavor, embed_values_dec_struct_t* emb_val)\n{\n" " boolean e_xer = is_exer(p_flavor);\n" " int xerbits = p_td.xer_bits;\n" " if (p_flavor & XER_TOPLEVEL) xerbits &= ~UNTAGGED;\n" @@ -1462,7 +1333,7 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) /* not toplevel anymore and remove the flags for USE-UNION the oftype doesn't need them */ " p_flavor &= ~XER_TOPLEVEL & ~XER_LIST & ~USE_TYPE_ATTR;\n" " int rd_ok=1, xml_depth=-1;\n" - " set_size(0);\n" /* empty but initialized array */ + " *this = NULL_VALUE;\n" /* empty but initialized array */ " int type = 0;\n" /* none */ " if (own_tag) for (rd_ok = p_reader.Ok(); rd_ok == 1; rd_ok = p_reader.Read()) {\n" " type = p_reader.NodeType();\n" @@ -1530,14 +1401,14 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) /* Don't move to the #text, that's the callee's responsibility. */ /* The call to the non-const operator[] creates a new element object, * then we call its XER_decode with the temporary XML reader. */ - " (*this)[get_nof_elements()].XER_decode(%s_xer_, reader_2, p_flavor);\n" - " if (p_flavor & EXIT_ON_ERROR && !(*this)[get_nof_elements() - 1].is_bound()) {\n" - " if (1 == get_nof_elements()) {\n" + " (*this)[val_ptr->n_elements].XER_decode(%s_xer_, reader_2, p_flavor, 0);\n" + " if (p_flavor & EXIT_ON_ERROR && !(*this)[val_ptr->n_elements - 1].is_bound()) {\n" + " if (1 == val_ptr->n_elements) {\n" // Failed to decode even the first element " clean_up();\n" " } else {\n" // Some elements were successfully decoded -> only delete the last one - " set_size(get_nof_elements() - 1);\n" + " set_size(val_ptr->n_elements - 1);\n" " }\n" " xmlFree(x_val);\n" " return -1;\n" @@ -1580,7 +1451,7 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) * for the element type (a string), so behave like a record-of * (string with ANY-ELEMENT): call the non-const operator[] * to create a new element, then read the entire XML element into it. */ - " (*this)[get_nof_elements()] = (const char*)p_reader.ReadOuterXml();\n" + " (*this)[val_ptr->n_elements] = (const char*)p_reader.ReadOuterXml();\n" /* Consume the element, then move ahead */ " for (rd_ok = p_reader.Read(); rd_ok == 1 && p_reader.Depth() > xml_depth; rd_ok = p_reader.Read()) {}\n" " if (p_reader.NodeType() != XML_READER_TYPE_ELEMENT) rd_ok = p_reader.Read();\n" @@ -1596,7 +1467,10 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) " break;\n" " }\n" /* The call to the non-const operator[] creates the element */ - " (*this)[get_nof_elements()].XER_decode(%s_xer_, p_reader, p_flavor);\n" + " (*this)[val_ptr->n_elements].XER_decode(%s_xer_, p_reader, p_flavor, emb_val);\n" + " if (0 != emb_val && !own_tag && val_ptr->n_elements > 1) {\n" + " ++emb_val->embval_index;\n" + " }\n" " }\n" " }\n" " else if (XML_READER_TYPE_END_ELEMENT == type) {\n" @@ -1607,6 +1481,11 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) " }\n" " break;\n" " }\n" + /*" else if (XML_READER_TYPE_TEXT == type && 0 != emb_val && !own_tag && get_nof_elements() > 0) {\n" + " UNIVERSAL_CHARSTRING emb_ustr((const char*)p_reader.Value());\n" + " emb_val->embval_array->set_embedded_value(emb_val->embval_index, emb_ustr);\n" + " rd_ok = p_reader.Read();\n" + " }\n" - temporarily removed in RT1 */ " else {\n" " rd_ok = p_reader.Read();\n" " }\n" @@ -1629,7 +1508,7 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) " return -1;\n" " }\n\n" " int enc_len = p_tok.put_next_token(JSON_TOKEN_ARRAY_START, NULL);\n" - " for(int i = 0; i < get_nof_elements(); ++i) {\n" + " for(int i = 0; i < val_ptr->n_elements; ++i) {\n" " int ret_val = (*this)[i].JSON_encode(%s_descr_, p_tok);\n" " if (0 > ret_val) break;\n" " enc_len += ret_val;\n" @@ -1669,17 +1548,11 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) " }\n" " return JSON_ERROR_FATAL;\n" " }\n" - " if (refd_indices.empty()) {\n" - " val_ptr->value_elements = (%s**)reallocate_pointers(\n" - " (void**)val_ptr->value_elements, val_ptr->n_elements, val_ptr->n_elements + 1);\n" - " val_ptr->value_elements[val_ptr->n_elements] = val;\n" - " val_ptr->n_elements++;\n" - " dec_len += ret_val;\n" - " }\n" - " else {\n" - " (*this)[get_nof_elements()] = *val;\n" - " delete val;\n" - " }\n" + " val_ptr->value_elements = (%s**)reallocate_pointers(\n" + " (void**)val_ptr->value_elements, val_ptr->n_elements, val_ptr->n_elements + 1);\n" + " val_ptr->value_elements[val_ptr->n_elements] = val;\n" + " val_ptr->n_elements++;\n" + " dec_len += ret_val;\n" " }\n\n" " dec_len += p_tok.get_next_token(&token, NULL, NULL);\n" " if (JSON_TOKEN_ARRAY_END != token) {\n" @@ -1714,7 +1587,7 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output) "if (other_value.val_ptr == NULL)\n" "TTCN_error(\"The right operand of comparison is an unbound value of " "type %s.\");\n" - "return other_value.get_nof_elements() == 0;\n" + "return other_value.val_ptr->n_elements == 0;\n" "}\n\n", name, dispname); output->header.function_prototypes = @@ -2657,8 +2530,8 @@ void defRecordOfClassMemAllocOptimized(const struct_of_def *sdef, output_struct , name, sdef->oftypedescrname); src=mputprintf(src, - "int %s::XER_encode(const XERdescriptor_t& p_td," - " TTCN_Buffer& p_buf, unsigned int p_flavor, int p_indent) const\n{\n" + "int %s::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, " + "unsigned int p_flavor, int p_indent, embed_values_enc_struct_t* emb_val) const\n{\n" " if (n_elements==-1) TTCN_error(\"Attempt to XER-encode an unbound record of\");\n" /* TODO type name */ " int encoded_length=(int)p_buf.get_len();\n" " boolean e_xer = is_exer(p_flavor);\n" @@ -2746,7 +2619,7 @@ void defRecordOfClassMemAllocOptimized(const struct_of_def *sdef, output_struct " p_buf.put_s(ns_len, (const unsigned char*)ns);\n" " UNIVERSAL_CHARSTRING before(sp_at, (const universal_char*)(value_elements[i]));\n" - " before.XER_encode(UNIVERSAL_CHARSTRING_xer_, p_buf, p_flavor | ANY_ATTRIBUTES, p_indent);\n" + " before.XER_encode(UNIVERSAL_CHARSTRING_xer_, p_buf, p_flavor | ANY_ATTRIBUTES, p_indent, 0);\n" // Ensure the namespace abides to its restrictions " if (p_td.xer_bits & (ANY_FROM | ANY_EXCEPT)) {\n" " TTCN_Buffer ns_buf;\n" @@ -2774,7 +2647,7 @@ void defRecordOfClassMemAllocOptimized(const struct_of_def *sdef, output_struct " }\n" " UNIVERSAL_CHARSTRING after(len - j, (const universal_char*)(value_elements[i]) + j);\n" - " after.XER_encode(UNIVERSAL_CHARSTRING_xer_, p_buf, p_flavor | ANY_ATTRIBUTES, p_indent);\n" + " after.XER_encode(UNIVERSAL_CHARSTRING_xer_, p_buf, p_flavor | ANY_ATTRIBUTES, p_indent, 0);\n" // Put this attribute in a dummy element and walk through it to check its validity " TTCN_Buffer check_buf;\n" " check_buf.put_s(2, (unsigned char*)\"<a\");\n" @@ -2830,9 +2703,15 @@ void defRecordOfClassMemAllocOptimized(const struct_of_def *sdef, output_struct ); src=mputprintf(src, " for (int i = 0; i < n_elements; ++i) {\n" + /*" if (i > 0 && !own_tag && 0 != emb_val &&\n" + " emb_val->embval_index < emb_val->embval_size) {\n" + " emb_val->embval_array->get_embedded_value(emb_val->embval_index).XER_encode(\n" + " UNIVERSAL_CHARSTRING_xer_, p_buf, p_flavor | EMBED_VALUES, p_indent+1, 0);\n" + " ++emb_val->embval_index;\n" + " }\n" - temporarily removed in RT1 */ " ec_1.set_msg(\"%%d: \", i);\n" " if (e_xer && (p_td.xer_bits & XER_LIST) && i>0) p_buf.put_c(' ');\n" - " value_elements[i].XER_encode(%s_xer_, p_buf, p_flavor, p_indent+own_tag);\n" + " value_elements[i].XER_encode(%s_xer_, p_buf, p_flavor, p_indent+own_tag, emb_val);\n" " }\n" " if (indenting && !is_exerlist(p_flavor)) {\n", sdef->oftypedescrname @@ -2869,7 +2748,7 @@ void defRecordOfClassMemAllocOptimized(const struct_of_def *sdef, output_struct "// written by %s in " __FILE__ " at %d\n" #endif "int %s::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& p_reader, " - "unsigned int p_flavor)\n{\n" + "unsigned int p_flavor, embed_values_dec_struct_t* emb_val)\n{\n" " boolean e_xer = is_exer(p_flavor);\n" " int xerbits = p_td.xer_bits;\n" " if (p_flavor & XER_TOPLEVEL) xerbits &= ~UNTAGGED;\n" @@ -2946,7 +2825,7 @@ void defRecordOfClassMemAllocOptimized(const struct_of_def *sdef, output_struct /* Don't move to the #text, that's the callee's responsibility. */ /* The call to the non-const operator[] creates a new element object, * then we call its XER_decode with the temporary XML reader. */ - " (*this)[n_elements].XER_decode(%s_xer_, reader_2, p_flavor);\n" + " (*this)[n_elements].XER_decode(%s_xer_, reader_2, p_flavor, 0);\n" " if (p_flavor & EXIT_ON_ERROR && !(*this)[n_elements - 1].is_bound()) {\n" " if (1 == n_elements) {\n" // Failed to decode even the first element @@ -3012,7 +2891,10 @@ void defRecordOfClassMemAllocOptimized(const struct_of_def *sdef, output_struct " break;\n" " }\n" /* The call to the non-const operator[] creates the element */ - " operator [](n_elements).XER_decode(%s_xer_, p_reader, p_flavor);\n" + " operator [](n_elements).XER_decode(%s_xer_, p_reader, p_flavor, emb_val);\n" + " if (0 != emb_val && !own_tag && n_elements > 1) {\n" + " ++emb_val->embval_index;\n" + " }\n" " }\n" " }\n" " else if (XML_READER_TYPE_END_ELEMENT == type) {\n" @@ -3023,6 +2905,11 @@ void defRecordOfClassMemAllocOptimized(const struct_of_def *sdef, output_struct " }\n" " break;\n" " }\n" + /*" else if (XML_READER_TYPE_TEXT == type && 0 != emb_val && !own_tag && n_elements > 0) {\n" + " UNIVERSAL_CHARSTRING emb_ustr((const char*)p_reader.Value());\n" + " emb_val->embval_array->set_embedded_value(emb_val->embval_index, emb_ustr);\n" + " rd_ok = p_reader.Read();\n" + " }\n" - temporarily removed in RT1 */ " else {\n" " rd_ok = p_reader.Read();\n" " }\n" @@ -3099,11 +2986,6 @@ void defRecordOfClassMemAllocOptimized(const struct_of_def *sdef, output_struct "}\n\n" , name, type, sdef->oftypedescrname); } - - /* functions for keeping track of referenced indices (only implemented for regular record of class) */ - def = mputstr(def, - "void add_refd_index(int) {}\n" - "void remove_refd_index(int) {}\n\n"); /* end of class */ def = mputstr(def, "};\n\n"); diff --git a/compiler2/subtype.cc b/compiler2/subtype.cc index d59cf5ca0..29b023220 100644 --- a/compiler2/subtype.cc +++ b/compiler2/subtype.cc @@ -1241,6 +1241,30 @@ bool SubtypeConstraint::is_length_compatible(const SubtypeConstraint *p_st) cons return ((*length_restriction * *(p_st->length_restriction)).is_empty()!=TTRUE); } +bool SubtypeConstraint::is_upper_limit_infinity() const +{ + if (ST_INTEGER == subtype && integer_st) { + return integer_st->is_upper_limit_infinity(); + } + if (ST_FLOAT == subtype && float_st) { + return float_st->is_upper_limit_infinity(); + } + return false; +} + +bool SubtypeConstraint::is_lower_limit_infinity() const +{ + if (ST_INTEGER == subtype && integer_st) { + return integer_st->is_lower_limit_infinity(); + } + + if (ST_FLOAT == subtype && float_st) { + return float_st->is_lower_limit_infinity(); + } + return false; +} + + void SubtypeConstraint::except(const SubtypeConstraint* other) { if (other==NULL) FATAL_ERROR("SubtypeConstraint::except()"); diff --git a/compiler2/subtype.hh b/compiler2/subtype.hh index a9618aa05..f7fde1aa5 100644 --- a/compiler2/subtype.hh +++ b/compiler2/subtype.hh @@ -199,6 +199,8 @@ public: bool is_compatible_with_elem() const; // used to check compatibility of structured types bool is_length_compatible(const SubtypeConstraint *p_st) const; + bool is_upper_limit_infinity() const; + bool is_lower_limit_infinity() const; }; /** diff --git a/compiler2/subtypestuff.cc b/compiler2/subtypestuff.cc index 02adf32eb..bc18d923b 100644 --- a/compiler2/subtypestuff.cc +++ b/compiler2/subtypestuff.cc @@ -451,6 +451,16 @@ string RealRangeListConstraint::to_string() const return ret_val; } +bool RealRangeListConstraint::is_upper_limit_infinity () const +{ + return rlc.is_upper_limit_infinity(); +} + +bool RealRangeListConstraint::is_lower_limit_infinity () const +{ + return rlc.is_lower_limit_infinity(); +} + //////////////////////////////////////////////////////////////////////////////// string BooleanListConstraint::to_string() const diff --git a/compiler2/subtypestuff.hh b/compiler2/subtypestuff.hh index 86970b385..473213e7b 100644 --- a/compiler2/subtypestuff.hh +++ b/compiler2/subtypestuff.hh @@ -260,6 +260,9 @@ public: LIMITTYPE get_minimal() const; LIMITTYPE get_maximal() const; + bool is_upper_limit_infinity() const; + bool is_lower_limit_infinity() const; + string to_string(bool add_brackets=true) const; /** conversion from integer range to size range, @@ -538,6 +541,20 @@ LIMITTYPE RangeListConstraint<LIMITTYPE>::get_maximal() const return values[values.size()-1]; } +template <typename LIMITTYPE> +bool RangeListConstraint<LIMITTYPE>::is_upper_limit_infinity () const +{ + if (0 == values.size()) return false; + return LIMITTYPE::maximum == values[values.size()-1]; +} + +template <typename LIMITTYPE> +bool RangeListConstraint<LIMITTYPE>::is_lower_limit_infinity () const +{ + if (0 == values.size()) return false; + return LIMITTYPE::minimum == values[0]; +} + template <typename LIMITTYPE> string RangeListConstraint<LIMITTYPE>::to_string(bool add_brackets) const { @@ -597,6 +614,8 @@ public: real_limit_t get_maximal() const { return rlc.get_maximal(); } string to_string() const; + bool is_upper_limit_infinity() const; + bool is_lower_limit_infinity() const; }; //////////////////////////////////////////////////////////////////////////////// diff --git a/compiler2/ttcn3/AST_ttcn3.cc b/compiler2/ttcn3/AST_ttcn3.cc index 80c05634a..7b0a70c77 100644 --- a/compiler2/ttcn3/AST_ttcn3.cc +++ b/compiler2/ttcn3/AST_ttcn3.cc @@ -2707,28 +2707,37 @@ namespace Ttcn { return false; } - void Module::add_types_to_json_schema(JSON_Tokenizer& json) + void Module::generate_json_schema(JSON_Tokenizer& json, map<Type*, JSON_Tokenizer>& json_refs) { // add a new property for this module - json.put_next_token(JSON_TOKEN_NAME, modid->get_dispname().c_str()); + json.put_next_token(JSON_TOKEN_NAME, modid->get_ttcnname().c_str()); // add type definitions into an object json.put_next_token(JSON_TOKEN_OBJECT_START); - // pass the JSON tokenizer onto each type definition + // cycle through each type, generate schema segment and reference when needed for (size_t i = 0; i < asss->get_nof_asss(); ++i) { Def_Type* def = dynamic_cast<Def_Type*>(asss->get_ass_byIndex(i)); if (def != NULL) { - def->generate_json_schema(json); + Type* t = def->get_Type(); + if (t->has_encoding(Type::CT_JSON)) { + // insert type's schema segment + t->generate_json_schema(json, false, false); + + if (json_refs_for_all_types && !json_refs.has_key(t)) { + // create JSON schema reference for the type + JSON_Tokenizer* json_ref = new JSON_Tokenizer; + json_refs.add(t, json_ref); + t->generate_json_schema_ref(*json_ref); + } + } } } // end of type definitions json.put_next_token(JSON_TOKEN_OBJECT_END); - } - - void Module::add_func_to_json_schema(map<Type*, JSON_Tokenizer>& json_refs) - { + + // insert function data for (size_t i = 0; i < asss->get_nof_asss(); ++i) { Def_ExtFunction* def = dynamic_cast<Def_ExtFunction*>(asss->get_ass_byIndex(i)); if (def != NULL) { @@ -3124,13 +3133,6 @@ namespace Ttcn { } w_attrib_path->set_parent(p_path); } - - void Def_Type::generate_json_schema(JSON_Tokenizer& json) - { - if (type->has_encoding(Type::CT_JSON)) { - type->generate_json_schema(json, false, false); - } - } // ================================= // ===== Def_Const @@ -6729,13 +6731,7 @@ namespace Ttcn { // the schema segment doesn't exist yet, create it and insert the reference json = new JSON_Tokenizer; json_refs.add(type, json); - json->put_next_token(JSON_TOKEN_OBJECT_START); - json->put_next_token(JSON_TOKEN_NAME, "$ref"); - char* ref_str = mprintf("\"#/definitions/%s/%s\"", - type->get_my_scope()->get_scope_mod()->get_modid().get_dispname().c_str(), - type->get_dispname().c_str()); - json->put_next_token(JSON_TOKEN_STRING, ref_str); - Free(ref_str); + type->generate_json_schema_ref(*json); } // insert a property to specify which function this is (encoding or decoding) @@ -9087,7 +9083,7 @@ namespace Ttcn { case AP_REF: if (gen_restriction_check!=TR_NONE || gen_post_restriction_check!=TR_NONE) return false; - if (ref->get_subrefs() != NULL) { + if (use_runtime_2 && ref->get_subrefs() != NULL) { FieldOrArrayRefs* subrefs = ref->get_subrefs(); for (size_t i = 0; i < subrefs->get_nof_refs(); ++i) { if (FieldOrArrayRef::ARRAY_REF == subrefs->get_ref(i)->get_type()) { @@ -9488,7 +9484,7 @@ namespace Ttcn { } } - if (ActualPar::AP_REF == par->get_selection()) { + if (use_runtime_2 && ActualPar::AP_REF == par->get_selection()) { // if the parameter references an element of a record of/set of, then // the record of object needs to know, so it doesn't delete the referenced // element @@ -9526,17 +9522,12 @@ namespace Ttcn { // let the array object know that the index is referenced before // calling the function, and let it know that it's now longer // referenced after the function call - string tmp_id = ref->get_my_scope()->get_scope_mod_gen()->get_temporary_id(); - expr->preamble = mputprintf(expr->preamble, - "INTEGER %s = %s;\n" + expr->preamble = mputprintf(expr->preamble, "%s.add_refd_index(%s);\n", - tmp_id.c_str(), index_expr.expr, array_expr.expr, index_expr.expr); + array_expr.expr, index_expr.expr); expr->postamble = mputprintf(expr->postamble, - "%s.remove_refd_index(%s);\n" - "if (%s >= %s.size_of()) TTCN_warning(\"" - "Warning: possibly incompatible behaviour related to TR HT24380;" - " for details see release notes\");\n", - array_expr.expr, index_expr.expr, tmp_id.c_str(), array_expr.expr); + "%s.remove_refd_index(%s);\n", + array_expr.expr, index_expr.expr); // insert any postambles the array object or the index might have if (array_expr.postamble != NULL) { expr->preamble = mputstr(expr->preamble, array_expr.postamble); diff --git a/compiler2/ttcn3/AST_ttcn3.hh b/compiler2/ttcn3/AST_ttcn3.hh index 85e69998c..06a57a6a9 100644 --- a/compiler2/ttcn3/AST_ttcn3.hh +++ b/compiler2/ttcn3/AST_ttcn3.hh @@ -625,14 +625,15 @@ namespace Ttcn { bool is_visible(const Identifier& id, visibility_t visibility); - /** Generates JSON schema segments for the types defined in the module - * and adds them to the JSON schema parameter. */ - void add_types_to_json_schema(JSON_Tokenizer& json); - - /** Generates JSON schemas containing references to the types that have JSON - * encoding and/or decoding functions declared in the module. Information - * related to these functions is also inserted after the references. */ - void add_func_to_json_schema(map<Type*, JSON_Tokenizer>& json_refs); + /** Generates JSON schema segments for the types defined in the modules, + * and references to these types. Information related to the types' + * JSON encoding and decoding functions is also inserted after the references. + * + * @param json JSON document containing the main schema, schema segments for + * the types will be inserted here + * @param json_refs map of JSON documents containing the references and function + * info related to each type */ + virtual void generate_json_schema(JSON_Tokenizer& json, map<Type*, JSON_Tokenizer>& json_refs); }; /** @@ -888,10 +889,6 @@ namespace Ttcn { virtual void set_with_attr(MultiWithAttrib* p_attrib); virtual WithAttribPath* get_attrib_path(); virtual void set_parent_path(WithAttribPath* p_path); - - /** Generates a JSON schema segment for the defined type and inserts it into - * the JSON schema parameter. */ - void generate_json_schema(JSON_Tokenizer& json); }; /** diff --git a/compiler2/ttcn3/Statement.cc b/compiler2/ttcn3/Statement.cc index 717c36167..2a452a902 100644 --- a/compiler2/ttcn3/Statement.cc +++ b/compiler2/ttcn3/Statement.cc @@ -152,13 +152,11 @@ namespace Ttcn { else return get_parent_scope()->get_ass_bySRef(p_ref); } - Type *StatementBlock::get_mtc_system_comptype(bool is_system, bool is_connecting) + Type *StatementBlock::get_mtc_system_comptype(bool is_system) { // return NULL outside test cases - if (!my_def || ((is_system || !is_connecting) && - my_def->get_asstype() != Common::Assignment::A_TESTCASE)) { + if (!my_def || my_def->get_asstype() != Common::Assignment::A_TESTCASE) return 0; - } if (is_system) { Def_Testcase *t_tc = dynamic_cast<Def_Testcase*>(my_def); if (!t_tc) FATAL_ERROR("StatementBlock::get_mtc_system_comptype()"); @@ -4958,7 +4956,7 @@ error: } } - Type *Statement::chk_comp_ref(Value *p_val, bool allow_mtc, bool allow_system, bool is_connecting) + Type *Statement::chk_comp_ref(Value *p_val, bool allow_mtc, bool allow_system) { if (!my_sb->get_my_def()) error("Component operation is not allowed in the control part"); @@ -5001,8 +4999,7 @@ error: p_val->error("A component reference was expected as operand"); return 0; } - Type *ret_val = is_connecting ? p_val->get_component_governor() : - p_val->get_expr_governor(Type::EXPECTED_DYNAMIC_VALUE); + Type *ret_val = p_val->get_expr_governor(Type::EXPECTED_DYNAMIC_VALUE); if (!ret_val) return 0; ret_val = ret_val->get_type_refd_last(); switch (ret_val->get_typetype()) { @@ -5020,7 +5017,7 @@ error: Type *Statement::chk_conn_endpoint(Value *p_compref, Reference *p_portref, bool allow_system) { - Type *comp_type = chk_comp_ref(p_compref, true, allow_system, true); + Type *comp_type = chk_comp_ref(p_compref, true, allow_system); if (comp_type) { ComponentTypeBody *comp_body = comp_type->get_CompBody(); p_portref->set_base_scope(comp_body); diff --git a/compiler2/ttcn3/Statement.hh b/compiler2/ttcn3/Statement.hh index 9a36b1e2d..1c1aa6c17 100644 --- a/compiler2/ttcn3/Statement.hh +++ b/compiler2/ttcn3/Statement.hh @@ -96,7 +96,7 @@ namespace Ttcn { void register_def(Definition *p_def); virtual bool has_ass_withId(const Identifier& p_id); virtual Common::Assignment* get_ass_bySRef(Ref_simple *p_ref); - virtual Type *get_mtc_system_comptype(bool is_system, bool is_connecting); + virtual Type *get_mtc_system_comptype(bool is_system); Definition* get_my_def() const { return my_def; } virtual Ttcn::StatementBlock *get_statementblock_scope(); void set_my_sb(StatementBlock *p_sb, size_t p_index); @@ -702,9 +702,8 @@ namespace Ttcn { * type is a component type). Returns a pointer to the component * type if available or NULL otherwise. Flags \a allow_mtc and \a * allow_system indicate whether the mtc or system component - * reference is acceptable in this context. Flag \a is_connecting - * is set if the component is part of a 'map' or 'connect' statement. */ - Type *chk_comp_ref(Value *p_val, bool allow_mtc, bool allow_system, bool is_connecting = false); + * reference is acceptable in this context. */ + Type *chk_comp_ref(Value *p_val, bool allow_mtc, bool allow_system); /** Checks an endpoint for a port connection or mapping. Parameter * \a p_compref is a component reference, \a p_portref refers to * a port within the corresponding component type. A pointer to diff --git a/compiler2/ttcn3/Ttcn2Json.cc b/compiler2/ttcn3/Ttcn2Json.cc index ab3410360..fb70102fb 100644 --- a/compiler2/ttcn3/Ttcn2Json.cc +++ b/compiler2/ttcn3/Ttcn2Json.cc @@ -36,31 +36,32 @@ void Ttcn2Json::create_schema(JSON_Tokenizer& json) json.put_next_token(JSON_TOKEN_NAME, "definitions"); json.put_next_token(JSON_TOKEN_OBJECT_START, NULL); - // insert module names and schemas for types - modules->add_types_to_json_schema(json); + // insert module names and schemas for types; gather references to types and + // JSON encoding/decoding function information + map<Common::Type*, JSON_Tokenizer> json_refs; + modules->generate_json_schema(json, json_refs); // end of type definitions json.put_next_token(JSON_TOKEN_OBJECT_END, NULL); - - // top-level "anyOf" structure containing references to the types the schema validates - json.put_next_token(JSON_TOKEN_NAME, "anyOf"); - json.put_next_token(JSON_TOKEN_ARRAY_START, NULL); - - // gather type references and JSON encoding/decoding function data - map<Common::Type*, JSON_Tokenizer> json_refs; - modules->add_func_to_json_schema(json_refs); - - // close schema segments and add them to the main schema - for (size_t i = 0; i < json_refs.size(); ++i) { - JSON_Tokenizer* segment = json_refs.get_nth_elem(i); - segment->put_next_token(JSON_TOKEN_OBJECT_END, NULL); - insert_schema(json, *segment); - delete segment; + + if (!json_refs.empty()) { + // top-level "anyOf" structure containing references to the types the schema validates + // don't insert an empty "anyOf" if there are no references + json.put_next_token(JSON_TOKEN_NAME, "anyOf"); + json.put_next_token(JSON_TOKEN_ARRAY_START, NULL); + + // close schema segments and add them to the main schema + for (size_t i = 0; i < json_refs.size(); ++i) { + JSON_Tokenizer* segment = json_refs.get_nth_elem(i); + segment->put_next_token(JSON_TOKEN_OBJECT_END, NULL); + insert_schema(json, *segment); + delete segment; + } + json_refs.clear(); + + // end of the "anyOf" structure + json.put_next_token(JSON_TOKEN_ARRAY_END, NULL); } - json_refs.clear(); - - // end of the "anyOf" structure - json.put_next_token(JSON_TOKEN_ARRAY_END, NULL); // top-level object end json.put_next_token(JSON_TOKEN_OBJECT_END, NULL); diff --git a/compiler2/ttcn3/TtcnTemplate.cc b/compiler2/ttcn3/TtcnTemplate.cc index 8052ecc0c..bf646c6ac 100644 --- a/compiler2/ttcn3/TtcnTemplate.cc +++ b/compiler2/ttcn3/TtcnTemplate.cc @@ -1729,7 +1729,8 @@ namespace Ttcn { vs->add_v(v); } ret_val = new Value(Value::V_SEQOF, vs); - if (gov) ret_val->set_my_governor(gov->get_parent_type()); + if (gov) gov = gov->get_parent_type(); + if (gov) ret_val->set_my_governor(gov); break; } case NAMED_TEMPLATE_LIST: { NamedValues *nvs = new NamedValues; @@ -1744,7 +1745,8 @@ namespace Ttcn { nvs->add_nv(nv); } ret_val = new Value(Value::V_SEQ, nvs); - if (gov) ret_val->set_my_governor(gov->get_parent_type()); + if (gov) gov = gov->get_parent_type(); + if (gov) ret_val->set_my_governor(gov); break; } case INDEXED_TEMPLATE_LIST: { Values *ivs = new Values(true); @@ -1759,7 +1761,8 @@ namespace Ttcn { ivs->add_iv(iv); } ret_val = new Value(Value::V_SEQOF, ivs); - if (gov) ret_val->set_my_governor(gov->get_parent_type()); + if (gov) gov = gov->get_parent_type(); + if (gov) ret_val->set_my_governor(gov); break; } default: FATAL_ERROR("Template::get_Value()"); diff --git a/compiler2/ttcn3/compiler.c b/compiler2/ttcn3/compiler.c index 9f8675b18..ce428baaa 100644 --- a/compiler2/ttcn3/compiler.c +++ b/compiler2/ttcn3/compiler.c @@ -310,6 +310,10 @@ void write_output(output_struct *output, const char *module_name, COPYRIGHT_STRING "\n\n" "// Do not edit this file unless you know what you are doing.\n", is_ttcn ? "TTCN-3" : "ASN.1", user_info); + + if (profiler_enabled) { + output->source.includes = mputstr(output->source.includes, "#include \"Profiler.hh\"\n"); + } if (output->source.includes != NULL) { fputs("\n/* Including header files */\n\n", fp); diff --git a/compiler2/union.c b/compiler2/union.c index 0393bcc3c..e469f4abf 100644 --- a/compiler2/union.c +++ b/compiler2/union.c @@ -1306,7 +1306,7 @@ void defUnionClass(struct_def const *sdef, output_struct *output) src = mputprintf(src, /* XERSTUFF XER_encode for union */ "int %s::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, " - "unsigned int p_flavor, int p_indent) const\n" + "unsigned int p_flavor, int p_indent, embed_values_enc_struct_t*) const\n" "{\n" "%s" " if (%s==union_selection) {\n" @@ -1318,7 +1318,7 @@ void defUnionClass(struct_def const *sdef, output_struct *output) " int encoded_length=(int)p_buf.get_len();\n" , name , (use_runtime_2 ? " if (err_descr) return XER_encode_negtest" - "(err_descr, p_td, p_buf, p_flavor, p_indent);\n" : "") + "(err_descr, p_td, p_buf, p_flavor, p_indent, 0);\n" : "") , unbound_value ); @@ -1380,7 +1380,7 @@ void defUnionClass(struct_def const *sdef, output_struct *output) src = mputprintf(src, " case %s_%s:\n" " ec_1.set_msg(\"%s': \");\n" " field_%s->XER_encode(%s_xer_, p_buf, flavor_0, " - "p_indent + (!p_indent || !omit_tag));\n" + "p_indent + (!p_indent || !omit_tag), 0);\n" " break;\n", selection_prefix, sdef->elements[i].name, sdef->elements[i].dispname, @@ -1403,11 +1403,11 @@ void defUnionClass(struct_def const *sdef, output_struct *output) def = mputstr(def, "int XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr, " "const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, " - "unsigned int p_flavor, int p_indent) const;\n"); + "unsigned int p_flavor, int p_indent, embed_values_enc_struct_t*) const;\n"); src = mputprintf(src, /* XERSTUFF XER_encode for union */ "int %s::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr, " "const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, " - "unsigned int p_flavor, int p_indent) const\n" + "unsigned int p_flavor, int p_indent, embed_values_enc_struct_t*) const\n" "{\n" " if (%s==union_selection) {\n" " TTCN_error(\"Attempt to XER-encode an unbound union value.\");\n" @@ -1486,15 +1486,15 @@ void defUnionClass(struct_def const *sdef, output_struct *output) "(\"internal error: erroneous value typedescriptor missing\");\n" " else err_vals->value->errval->XER_encode(" "*err_vals->value->type_descr->xer, p_buf, flavor_0, " - "p_indent + (!p_indent || !omit_tag));\n" + "p_indent + (!p_indent || !omit_tag), 0);\n" " }\n" " }\n" " } else {\n" " ec_1.set_msg(\"%s': \");\n" " if (emb_descr) field_%s->XER_encode_negtest(emb_descr, " - "%s_xer_, p_buf, flavor_0, p_indent + (!p_indent || !omit_tag));\n" + "%s_xer_, p_buf, flavor_0, p_indent + (!p_indent || !omit_tag), 0);\n" " else field_%s->XER_encode(%s_xer_, p_buf, flavor_0, " - "p_indent + (!p_indent || !omit_tag));\n" + "p_indent + (!p_indent || !omit_tag), 0);\n" " }\n" " break;\n", selection_prefix, sdef->elements[i].name, /* case label */ @@ -1533,7 +1533,7 @@ void defUnionClass(struct_def const *sdef, output_struct *output) #endif src = mputprintf(src, /* XERSTUFF decoder functions for union */ "int %s::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& p_reader," - " unsigned int p_flavor)\n" + " unsigned int p_flavor, embed_values_dec_struct_t*)\n" "{\n" " int e_xer = is_exer(p_flavor);\n" " int type = 0;\n" /* None */ @@ -1643,7 +1643,7 @@ void defUnionClass(struct_def const *sdef, output_struct *output) " ec_2.set_msg(\"%s': \");\n" " if (%s==union_selection) {\n" " matched = %d;\n" - " %s().XER_decode(%s_xer_, p_reader, flavor_1);\n" + " %s().XER_decode(%s_xer_, p_reader, flavor_1, 0);\n" " }\n" " if (field_%s->is_bound()) break; else clean_up();\n" " }\n", @@ -1696,7 +1696,7 @@ void defUnionClass(struct_def const *sdef, output_struct *output) src = mputprintf(src, " %sif (%s::can_start(elem_name, ns_uri, %s_xer_, flavor_1) || (%s_xer_.xer_bits & ANY_ELEMENT)) {\n" " ec_2.set_msg(\"%s': \");\n" - " %s%s().XER_decode(%s_xer_, p_reader, flavor_1);\n" + " %s%s().XER_decode(%s_xer_, p_reader, flavor_1, 0);\n" " if (!%s%s().is_bound()) {\n" " TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_INVAL_MSG, \"Failed to decode field.\");\n" " }\n" @@ -1713,7 +1713,7 @@ void defUnionClass(struct_def const *sdef, output_struct *output) src = mputprintf(src, " %sif ((e_xer && (type==XML_READER_TYPE_END_ELEMENT || !own_tag)) || %s::can_start(elem_name, ns_uri, %s_xer_, flavor_1) || (%s_xer_.xer_bits & ANY_ELEMENT)) {\n" "empty_xml: ec_2.set_msg(\"%s': \");\n" - " %s%s().XER_decode(%s_xer_, p_reader, flavor_1);\n" + " %s%s().XER_decode(%s_xer_, p_reader, flavor_1, 0);\n" " if (!%s%s().is_bound()) {\n" " TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_INVAL_MSG, \"Failed to decode field.\");\n" " }\n" diff --git a/compiler2/xpather.cc b/compiler2/xpather.cc index 14c15a6de..d81658438 100644 --- a/compiler2/xpather.cc +++ b/compiler2/xpather.cc @@ -29,7 +29,10 @@ // Do _NOT_ #include "string.hh", it drags in ustring.o, common/Quadruple.o, // Int.o, ttcn3/PatternString.o, and then the entire AST :( #include "map.hh" +#include "ProjectGenHelper.hh" #include "../common/path.h" +#include "ttcn3/ttcn3_preparser.h" +#include "asn1/asn1_preparser.h" // in makefile.c void ERROR (const char *fmt, ...); @@ -52,6 +55,8 @@ void fatal_error(const char * filename, int lineno, const char * fmt, ...) abort(); } +ProjectGenHelper& projGenHelper = ProjectGenHelper::Instance(); + /// Run an XPath query and return an xmlXPathObjectPtr, which must be freed xmlXPathObjectPtr run_xpath(xmlXPathContextPtr xpathCtx, const char *xpathExpr) { @@ -218,12 +223,299 @@ void xsdbool2boolean(const XPathContext& xpathCtx, const char *actcfg, } } +extern "C" string_list* getExternalLibs(const char* projName) +{ + if (!projGenHelper.getZflag()) return NULL; + ProjectDescriptor* proj = projGenHelper.getTargetOfProject(projName); + if (!proj) return NULL; + + std::vector<const char*> externalLibs; + projGenHelper.getExternalLibs(externalLibs); + + if (0 == externalLibs.size()) return NULL; + + struct string_list* head = (struct string_list*)Malloc(sizeof(struct string_list)); + struct string_list* last_elem = head; + struct string_list* tail = head; + + for (size_t i = 0; i < externalLibs.size(); ++i) { + tail = last_elem; + last_elem->str = mcopystr(externalLibs[i]); + last_elem->next = (struct string_list*)Malloc(sizeof(struct string_list)); + last_elem = last_elem->next; + } + Free(last_elem); + tail->next = NULL; + return head; +} + +extern "C" string_list* getExternalLibPathes(const char* projName) +{ + if (!projGenHelper.getZflag()) return NULL; + ProjectDescriptor* proj = projGenHelper.getTargetOfProject(projName); + if (!proj) return NULL; + + std::vector<const char*> externalLibs; + projGenHelper.getExternalLibSearchPathes(externalLibs); + + if (0 == externalLibs.size()) return NULL; + + struct string_list* head = (struct string_list*)Malloc(sizeof(struct string_list)); + struct string_list* last_elem = head; + struct string_list* tail = head; + + for (size_t i = 0; i < externalLibs.size(); ++i) { + tail = last_elem; + last_elem->str = mcopystr(externalLibs[i]); + last_elem->next = (struct string_list*)Malloc(sizeof(struct string_list)); + last_elem = last_elem->next; + } + Free(last_elem); + tail->next = NULL; + return head; +} + +extern "C" string_list* getRefWorkingDirs(const char* projName) +{ + if (!projGenHelper.getZflag()) return NULL; + ProjectDescriptor* proj = projGenHelper.getTargetOfProject(projName); + if (!proj) FATAL_ERROR("Project \"%s\" was not found in the project list", projName); + + struct string_list* head = (struct string_list*)Malloc(sizeof(struct string_list)); + struct string_list* last_elem = head; + struct string_list* tail = head; + last_elem->str = NULL; + last_elem->next = NULL; + for (size_t i = 0; i < proj->numOfRefProjWorkingDirs(); ++i) { + tail = last_elem; + last_elem->str = mcopystr(proj->getRefProjWorkingDir(i).c_str()); + last_elem->next = (struct string_list*)Malloc(sizeof(struct string_list)); + last_elem = last_elem->next; + } + Free(last_elem); + tail->next = NULL; + return head; +} + +extern "C" string2_list* getLinkerLibs(const char* projName) +{ + + if (!projGenHelper.getZflag()) return NULL; + if (1 == projGenHelper.numOfProjects() || 0 == projGenHelper.numOfLibs()){ + return NULL; //no library + } + ProjectDescriptor* projLib = projGenHelper.getTargetOfProject(projName); + if (!projLib) FATAL_ERROR("Project \"%s\" was not found in the project list", projName); + + struct string2_list* head = (struct string2_list*)Malloc(sizeof(struct string2_list)); + struct string2_list* last_elem = head; + struct string2_list* tail = head; + last_elem->next = NULL; + last_elem->str1 = NULL; + last_elem->str2 = NULL; + for (std::map<std::string, ProjectDescriptor>::const_iterator it = projGenHelper.getHead(); + it != projGenHelper.getEnd(); ++it) { + if ((it->second).isLibrary()) { + if (!(it->second).getLinkingStrategy() && + !projLib->hasLinkerLibTo((it->second).getProjectName())) { // static linked library + continue; + } + std::string relPath = projLib->setRelativePathTo((it->second).getProjectAbsWorkingDir()); + if (relPath == std::string(".")) { + continue; // the relpath shows to itself + } + tail = last_elem; + last_elem->str1 = mcopystr(relPath.c_str()); + last_elem->str2 = mcopystr((it->second).getTargetExecName().c_str()); + last_elem->next = (struct string2_list*)Malloc(sizeof(struct string2_list)); + last_elem = last_elem->next; + } + } + tail->next = NULL; + Free(last_elem); + + if (head->str1 && head->str2) + return head; + else + return NULL; +} + +extern "C" const char* getLibFromProject(const char* projName) +{ + if (!projGenHelper.getZflag()) return NULL; + ProjectDescriptor* lib = projGenHelper.getTargetOfProject(projName); + if (lib) return lib->getTargetExecName().c_str(); + return NULL; +} + +extern "C" void erase_libs() { + projGenHelper.cleanUp(); +} + +extern "C" void print_libs() { + projGenHelper.print(); +} + + +extern "C" boolean hasSubProject(const char* projName) { + if (!projGenHelper.getZflag()) return FALSE; + if (projGenHelper.getHflag()) + return static_cast<boolean>(projGenHelper.hasReferencedProject()); + else if(std::string(projName) == projGenHelper.getToplevelProjectName()) + return static_cast<boolean>(projGenHelper.hasReferencedProject()); + else + return FALSE; +} + +extern "C" boolean hasExternalLibrary(const char* libName, const char* projName) { + if (!projGenHelper.getZflag()) return FALSE; + ProjectDescriptor* projLib = projGenHelper.getTargetOfProject(projName); + if (projLib && projLib->hasLinkerLib(libName)) + return TRUE; + else + return FALSE; +} + +extern "C" boolean isTopLevelExecutable(const char* projName) { + if (!projGenHelper.getZflag()) return false; + ProjectDescriptor* proj = projGenHelper.getTargetOfProject(projName); + if (projGenHelper.getToplevelProjectName() != std::string(projName)) return FALSE; + if (proj && proj->isLibrary()) + return FALSE; + else + return TRUE; +} + +extern "C" boolean isDynamicLibrary(const char* key) { + if (!projGenHelper.getZflag()) return false; + ProjectDescriptor* proj = projGenHelper.getProjectDescriptor(key); + if (proj) return proj->getLinkingStrategy(); + FATAL_ERROR("Library \"%s\" was not found", key); + return false; +} + +extern "C" const char* getTPDFileName(const char* projName) { + if (!projGenHelper.getZflag()) return NULL; + ProjectDescriptor* proj = projGenHelper.getTargetOfProject(projName); + if (proj) return proj->getTPDFileName().c_str(); + FATAL_ERROR("TPD file name to project \"%s\" was not found", projName); +} + +extern "C" const char* getPathToRootDir(const char* projName) { + if (!projGenHelper.getZflag()) return NULL; + ProjectDescriptor* proj = projGenHelper.getTargetOfProject(projName); + const char* rootDir = projGenHelper.getRootDirOS(projName).c_str(); + if (proj && rootDir) { + return rootDir; + } + FATAL_ERROR("Project \"%s\": no relative path was found to top directory at OS level.", projName); +} + +extern "C" const char* findLibraryPath(const char* libraryName, const char* projName) +{ + if (!projGenHelper.getZflag()) return NULL; + ProjectDescriptor* projLib = projGenHelper.getTargetOfProject(projName); + if (!projLib) FATAL_ERROR("Project \"%s\" was not found in the project list", projName); + ProjectDescriptor* libLib = projGenHelper.getProjectDescriptor(libraryName); + if (!libLib) return NULL; + std::string str = projLib->setRelativePathTo(libLib->getProjectAbsWorkingDir()); + size_t refIndex = projLib->getLibSearchPathIndex(libLib->getProjectName()); + if (refIndex > projLib->numOfLibSearchPaths()) return NULL; + projLib->setLibSearchPath(refIndex, str); + return projLib->getLibSearchPath(libLib->getProjectName()); +} + +extern "C" const char* findLibraryName(const char* libraryName, const char* projName) +{ + if (!projGenHelper.getZflag()) return NULL; + ProjectDescriptor* projLib = projGenHelper.getTargetOfProject(projName); + if (!projLib) FATAL_ERROR("Project \"%s\" was not found in the project list", projName); + ProjectDescriptor* libLib = projGenHelper.getProjectDescriptor(libraryName); + if (!libLib) return NULL; + for (size_t i = 0; i < projLib->numOfReferencedProjects(); ++i) { + const std:: string refProjName = projLib->getReferencedProject(i); + ProjectDescriptor* refLib = projGenHelper.getTargetOfProject(refProjName.c_str()); + if (refLib->getTargetExecName() == std::string(libraryName)) + return libraryName; + } + return NULL; +} + +extern "C" boolean isTtcn3ModuleInLibrary(const char* moduleName) +{ + if (!projGenHelper.getZflag()) return FALSE; + return (boolean)projGenHelper.isTtcn3ModuleInLibrary(moduleName); +} + +extern "C" boolean isAsn1ModuleInLibrary(const char* moduleName) +{ + if (!projGenHelper.getZflag()) return FALSE; + return (boolean)projGenHelper.isAsn1ModuleInLibrary(moduleName); +} + +extern "C" boolean isSourceFileInLibrary(const char* fileName) +{ + if (!projGenHelper.getZflag()) return FALSE; + return (boolean)projGenHelper.isSourceFileInLibrary(fileName); +} + +extern "C" boolean isHeaderFileInLibrary(const char* fileName) +{ + if (!projGenHelper.getZflag()) return FALSE; + return (boolean)projGenHelper.isHeaderFileInLibrary(fileName); +} + +extern "C" boolean isTtcnPPFileInLibrary(const char* fileName) +{ + if (!projGenHelper.getZflag()) return FALSE; + return (boolean)projGenHelper.isTtcnPPFileInLibrary(fileName); +} + + +extern "C" boolean buildObjects(const char* projName, boolean add_referenced) +{ + if (!projGenHelper.getZflag()) return FALSE; + if (projGenHelper.getHflag()) return FALSE; + if (add_referenced) return FALSE; + ProjectDescriptor* desc =projGenHelper.getTargetOfProject(projName); + if (desc && desc->isLibrary()) return FALSE; + return TRUE; +} + +void append_to_library_list (const char* prjName, + const XPathContext& xpathCtx, + const char *actcfg) +{ + if (!projGenHelper.getZflag()) return; + + char *exeXpath = mprintf( + "/TITAN_Project_File_Information/Configurations/Configuration[@name='%s']" + "/ProjectProperties/MakefileSettings/targetExecutable/text()", + actcfg); + XPathObject exeObj(run_xpath(xpathCtx, exeXpath)); + Free(exeXpath); + std::string lib_name; + if (exeObj->nodesetval && exeObj->nodesetval->nodeNr > 0) { + const char* target_executable = (const char*)exeObj->nodesetval->nodeTab[0]->content; + autostring target_exe_dir(get_dir_from_path(target_executable)); + autostring target_exe_file(get_file_from_path(target_executable)); + lib_name = target_exe_file; + ProjectDescriptor* projDesc = projGenHelper.getTargetOfProject(prjName); + if (projDesc) { + projDesc->setTargetExecName(lib_name.c_str()); + } + } +} + // data structures and functions to manage excluded folders/files -map<cstring, void> excluded_files; +map<cstring, const char> excluded_files; -boolean is_excluded_file(const cstring& path) { - return excluded_files.has_key(path); +boolean is_excluded_file(const cstring& path, const char* project) { + if (!excluded_files.has_key(path)) return false; + const char* proj = excluded_files[path]; + if (0 == strcmp(project, proj)) return true; + return false; } vector<const char> excluded_folders; @@ -305,58 +597,80 @@ static void clear_seen_tpd_files(map<cstring, int>& seen_tpd_files) { seen_tpd_files.clear(); } +const char* get_act_config(struct string2_list* cfg, const char* project_name) { + while (cfg && cfg->str1 && project_name) { + if (!strcmp(cfg->str1, project_name)) return cfg->str2; + cfg = cfg->next; + } + return NULL; +} + static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcfg, const char *file_list_path, int *p_argc, char ***p_argv, - int *p_optind, char **p_ets_name, + int *p_optind, char **p_ets_name, char **p_project_name, boolean *p_gflag, boolean *p_sflag, boolean *p_cflag, boolean *p_aflag, boolean *preprocess, boolean *p_Rflag, boolean *p_lflag, boolean *p_mflag, boolean *p_Pflag, boolean *p_Lflag, boolean recursive, boolean force_overwrite, boolean gen_only_top_level, const char *output_file, char** abs_work_dir_p, struct string_list* sub_project_dirs, const char* program_name, FILE* prj_graph_fp, struct string2_list* create_symlink_list, struct string_list* ttcn3_prep_includes, - struct string_list* ttcn3_prep_defines, struct string_list* prep_includes, struct string_list* prep_defines, - boolean *p_csflag, boolean *p_quflag, boolean* p_dsflag, char** cxxcompiler, - char** optlevel, char** optflags, boolean* p_dbflag, boolean* p_drflag, boolean* p_dtflag, boolean* p_dxflag, boolean* p_djflag, - boolean* p_fxflag, boolean* p_doflag, boolean* p_gfflag, boolean* p_lnflag, boolean* p_isflag, + struct string_list* ttcn3_prep_defines, struct string_list* ttcn3_prep_undefines, struct string_list* prep_includes, + struct string_list* prep_defines, struct string_list* prep_undefines, boolean *p_csflag, boolean *p_quflag, boolean* p_dsflag, + char** cxxcompiler, char** optlevel, char** optflags, boolean* p_dbflag, boolean* p_drflag, boolean* p_dtflag, boolean* p_dxflag, + boolean* p_djflag, boolean* p_fxflag, boolean* p_doflag, boolean* p_gfflag, boolean* p_lnflag, boolean* p_isflag, boolean* p_asflag, boolean* p_swflag, boolean* p_Yflag, struct string_list* solspeclibs, struct string_list* sol8speclibs, struct string_list* linuxspeclibs, struct string_list* freebsdspeclibs, struct string_list* win32speclibs, char** ttcn3prep, struct string_list* linkerlibs, struct string_list* additionalObjects, struct string_list* linkerlibsearchp, boolean Vflag, boolean Dflag, - char** generatorCommandOutput, struct string2_list* target_placement_list, boolean prefix_workdir, struct string2_list* run_command_list, - map<cstring, int>& seen_tpd_files); + boolean *p_Zflag, boolean *p_Hflag, char** generatorCommandOutput, struct string2_list* target_placement_list, boolean prefix_workdir, + struct string2_list* run_command_list, map<cstring, int>& seen_tpd_files, struct string2_list* required_configs); extern "C" tpd_result process_tpd(const char *p_tpd_name, const char *actcfg, const char *file_list_path, int *p_argc, char ***p_argv, - int *p_optind, char **p_ets_name, + int *p_optind, char **p_ets_name, char **p_project_name, boolean *p_gflag, boolean *p_sflag, boolean *p_cflag, boolean *p_aflag, boolean *preprocess, boolean *p_Rflag, boolean *p_lflag, boolean *p_mflag, boolean *p_Pflag, boolean *p_Lflag, boolean recursive, boolean force_overwrite, boolean gen_only_top_level, const char *output_file, char** abs_work_dir_p, struct string_list* sub_project_dirs, const char* program_name, FILE* prj_graph_fp, struct string2_list* create_symlink_list, struct string_list* ttcn3_prep_includes, - struct string_list* ttcn3_prep_defines, struct string_list* prep_includes, struct string_list* prep_defines, - boolean *p_csflag, boolean *p_quflag, boolean* p_dsflag, char** cxxcompiler, - char** optlevel, char** optflags, boolean* p_dbflag, boolean* p_drflag, boolean* p_dtflag, boolean* p_dxflag, boolean* p_djflag, - boolean* p_fxflag, boolean* p_doflag, boolean* p_gfflag, boolean* p_lnflag, boolean* p_isflag, + struct string_list* ttcn3_prep_defines, struct string_list* ttcn3_prep_undefines, struct string_list* prep_includes, + struct string_list* prep_defines, struct string_list* prep_undefines, boolean *p_csflag, boolean *p_quflag, boolean* p_dsflag, + char** cxxcompiler, char** optlevel, char** optflags, boolean* p_dbflag, boolean* p_drflag, boolean* p_dtflag, boolean* p_dxflag, + boolean* p_djflag, boolean* p_fxflag, boolean* p_doflag, boolean* p_gfflag, boolean* p_lnflag, boolean* p_isflag, boolean* p_asflag, boolean* p_swflag, boolean* p_Yflag, struct string_list* solspeclibs, struct string_list* sol8speclibs, struct string_list* linuxspeclibs, struct string_list* freebsdspeclibs, struct string_list* win32speclibs, char** ttcn3prep, - string_list* linkerlibs, string_list* additionalObjects, string_list* linkerlibsearchp, boolean Vflag, boolean Dflag, - char** generatorCommandOutput, struct string2_list* target_placement_list, boolean prefix_workdir, struct string2_list* run_command_list) { + string_list* linkerlibs, string_list* additionalObjects, string_list* linkerlibsearchp, boolean Vflag, boolean Dflag, boolean *p_Zflag, + boolean *p_Hflag, char** generatorCommandOutput, struct string2_list* target_placement_list, boolean prefix_workdir, + struct string2_list* run_command_list, struct string2_list* required_configs) { map<cstring, int> seen_tpd_files; + projGenHelper.setZflag(*p_Zflag); + projGenHelper.setWflag(prefix_workdir); + projGenHelper.setHflag(*p_Hflag); tpd_result success = process_tpd_internal(p_tpd_name, - actcfg, file_list_path, p_argc, p_argv, p_optind, p_ets_name, + actcfg, file_list_path, p_argc, p_argv, p_optind, p_ets_name, p_project_name, p_gflag, p_sflag, p_cflag, p_aflag, preprocess, p_Rflag, p_lflag, p_mflag, p_Pflag, p_Lflag, recursive, force_overwrite, gen_only_top_level, output_file, abs_work_dir_p, sub_project_dirs, program_name, prj_graph_fp, create_symlink_list, ttcn3_prep_includes, - ttcn3_prep_defines, prep_includes, prep_defines, - p_csflag, p_quflag, p_dsflag, cxxcompiler, + ttcn3_prep_defines, ttcn3_prep_undefines, prep_includes, prep_defines, + prep_undefines, p_csflag, p_quflag, p_dsflag, cxxcompiler, optlevel, optflags, p_dbflag, p_drflag, p_dtflag, p_dxflag, p_djflag, p_fxflag, p_doflag, p_gfflag, p_lnflag, p_isflag, p_asflag, p_swflag, p_Yflag, solspeclibs, sol8speclibs, linuxspeclibs, freebsdspeclibs, win32speclibs, ttcn3prep, - linkerlibs, additionalObjects, linkerlibsearchp, Vflag, Dflag, - generatorCommandOutput, target_placement_list, prefix_workdir, run_command_list, seen_tpd_files); + linkerlibs, additionalObjects, linkerlibsearchp, Vflag, Dflag, p_Zflag, + p_Hflag, generatorCommandOutput, target_placement_list, prefix_workdir, + run_command_list, seen_tpd_files, required_configs); + + if (TPD_FAILED == success) exit(EXIT_FAILURE); + + if (false == projGenHelper.sanityCheck()) { + fprintf (stderr, "makefilegen exits\n"); + exit(EXIT_FAILURE); + } + + projGenHelper.generateRefProjectWorkingDirsTo(*p_project_name); for (size_t i = 0, num = seen_tpd_files.size(); i < num; ++i) { const cstring& key = seen_tpd_files.get_nth_key(i); @@ -381,22 +695,23 @@ extern "C" tpd_result process_tpd(const char *p_tpd_name, const char *actcfg, // it must nevertheless make a copy on the heap via mcopystr(). static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcfg, const char *file_list_path, int *p_argc, char ***p_argv, - int *p_optind, char **p_ets_name, + int *p_optind, char **p_ets_name, char **p_project_name, boolean *p_gflag, boolean *p_sflag, boolean *p_cflag, boolean *p_aflag, boolean *preprocess, boolean *p_Rflag, boolean *p_lflag, boolean *p_mflag, boolean *p_Pflag, boolean *p_Lflag, boolean recursive, boolean force_overwrite, boolean gen_only_top_level, const char *output_file, char** abs_work_dir_p, struct string_list* sub_project_dirs, const char* program_name, FILE* prj_graph_fp, struct string2_list* create_symlink_list, struct string_list* ttcn3_prep_includes, - struct string_list* ttcn3_prep_defines, struct string_list* prep_includes, struct string_list* prep_defines, - boolean *p_csflag, boolean *p_quflag, boolean* p_dsflag, char** cxxcompiler, - char** optlevel, char** optflags, boolean* p_dbflag, boolean* p_drflag, boolean* p_dtflag, boolean* p_dxflag, boolean* p_djflag, - boolean* p_fxflag, boolean* p_doflag, boolean* p_gfflag, boolean* p_lnflag, boolean* p_isflag, + struct string_list* ttcn3_prep_defines, struct string_list* ttcn3_prep_undefines, struct string_list* prep_includes, + struct string_list* prep_defines, struct string_list* prep_undefines, boolean *p_csflag, boolean *p_quflag, boolean* p_dsflag, + char** cxxcompiler, char** optlevel, char** optflags, boolean* p_dbflag, boolean* p_drflag, boolean* p_dtflag, boolean* p_dxflag, + boolean* p_djflag, boolean* p_fxflag, boolean* p_doflag, boolean* p_gfflag, boolean* p_lnflag, boolean* p_isflag, boolean* p_asflag, boolean* p_swflag, boolean* p_Yflag, struct string_list* solspeclibs, struct string_list* sol8speclibs, struct string_list* linuxspeclibs, struct string_list* freebsdspeclibs, struct string_list* win32speclibs, char** ttcn3prep, - string_list* linkerlibs, string_list* additionalObjects, string_list* linkerlibsearchp, boolean Vflag, boolean Dflag, - char** generatorCommandOutput, struct string2_list* target_placement_list, boolean prefix_workdir, struct string2_list* run_command_list, - map<cstring, int>& seen_tpd_files) + string_list* linkerlibs, string_list* additionalObjects, string_list* linkerlibsearchp, boolean Vflag, boolean Dflag, boolean *p_Zflag, + boolean *p_Hflag, char** generatorCommandOutput, struct string2_list* target_placement_list, boolean prefix_workdir, + struct string2_list* run_command_list, map<cstring, int>& seen_tpd_files, struct string2_list* required_configs) { + tpd_result result = TPD_SUCCESS; // read-only non-pointer aliases //char** const& local_argv = *p_argv; int const& local_argc = *p_argc; @@ -410,7 +725,10 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcf autostring tpd_dir(get_dir_from_path(p_tpd_name)); autostring abs_tpd_dir(get_absolute_dir(tpd_dir, NULL)); - + if (NULL == (const char*)abs_tpd_dir) { + ERROR("absolut TPD directory could not be retreaved from %s", (const char*)tpd_dir); + return TPD_FAILED; + } autostring tpd_filename(get_file_from_path(p_tpd_name)); autostring abs_tpd_name(compose_path_name(abs_tpd_dir, tpd_filename)); @@ -552,8 +870,25 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcf } // next FolderResource } - if (actcfg == NULL) + ///////////////////////////////////////////////////////////////////////////// { + char *projectNameXpath = mprintf("/TITAN_Project_File_Information/ProjectName/text()"); + XPathObject projectNameObj(run_xpath(xpathCtx, projectNameXpath)); + Free(projectNameXpath); + if (projectNameObj->nodesetval && projectNameObj->nodesetval->nodeNr > 0) { + *p_project_name = mcopystr((const char*)projectNameObj->nodesetval->nodeTab[0]->content); + projGenHelper.addTarget(*p_project_name); + projGenHelper.setToplevelProjectName(*p_project_name); + ProjectDescriptor* projDesc = projGenHelper.getTargetOfProject(*p_project_name); + if (projDesc) projDesc->setProjectAbsTpdDir((const char*)abs_tpd_dir); + } + } + ///////////////////////////////////////////////////////////////////////////// + + if (!actcfg) { + actcfg = get_act_config(required_configs,*p_project_name); + } + if (actcfg == NULL) { // Find out the active config XPathObject activeConfig(run_xpath(xpathCtx, "/TITAN_Project_File_Information/ActiveConfiguration/text()")); @@ -590,8 +925,6 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcf return TPD_FAILED; } } - - ///////////////////////////////////////////////////////////////////////////// // working directory stuff autostring workdir; { @@ -623,6 +956,8 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcf const char *real_workdir = folders[workdir]; // This is relative to the location of the tpd file excluded_folders.add(real_workdir); // excluded by convention + autostring proj_abs_workdir; + autostring abs_workdir; // If -D flag was specified then we ignore the workdir // in the TPD (the current dir is considered the work dir). @@ -643,7 +978,8 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcf break; default: if (recursive || local_argc != 0) { // we only want to create workdir if necessary - printf("Working directory `%s' in project `%s' does not exist, trying to create it...\n", real_workdir, (const char*)abs_tpd_dir); + fprintf(stderr, "Working directory `%s' in project `%s' does not exist, trying to create it...\n", + real_workdir, (const char*)abs_tpd_dir); int rv = mkdir(real_workdir, 0755); if (rv) ERROR("Could not create working directory, mkdir() failed: %s", strerror(errno)); else printf("Working directory created\n"); @@ -660,8 +996,21 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcf if (hasWorkDir) { //we created working directory, or its already been created (from a parent makefilegen process maybe) *abs_work_dir_p = get_absolute_dir(real_workdir, abs_tpd_dir); abs_workdir = (mcopystr(*abs_work_dir_p)); + proj_abs_workdir = mcopystr(*abs_work_dir_p); } } + + if (Dflag) { // the path to subproject working dir is needed to find the linkerlibsearchpath + proj_abs_workdir = compose_path_name(abs_tpd_dir, real_workdir); + } + + ProjectDescriptor* projDesc = projGenHelper.getTargetOfProject(*p_project_name); + if (projDesc) { + projDesc->setProjectAbsWorkingDir((const char*)proj_abs_workdir); + projDesc->setProjectWorkingDir(real_workdir); + projDesc->setTPDFileName(p_tpd_name); + } + ///////////////////////////////////////////////////////////////////////////// // Gather the excluded folders in the active config @@ -697,7 +1046,7 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcf xmlNodePtr curnode = nodes->nodeTab[i]; cstring aa((const char*)curnode->content); - excluded_files.add(aa, 0); + excluded_files.add(aa, *p_project_name); } } @@ -742,13 +1091,45 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcf } cstring cpath(path); - if (!is_excluded_file(cpath) && !is_excluded_folder(path)) { + if (!is_excluded_file(cpath, *p_project_name) && !is_excluded_folder(path)) { // relativeURI wins over rawURI char *ruri = uri ? mcopystr(uri) : cook(raw, path_vars); - if (files.has_key(cpath)) { ERROR("A FileResource %s must be unique!", (const char*)cpath); - } else { + } + else { + const char* file_path = ruri; + expstring_t rel_file_dir = get_dir_from_path(file_path); + expstring_t file_name = get_file_from_path(file_path); + expstring_t abs_dir_path = get_absolute_dir(rel_file_dir, abs_tpd_dir); + expstring_t abs_file_name = compose_path_name(abs_dir_path, file_name); + if (abs_file_name != NULL) { + if (get_path_status(abs_file_name) == PS_FILE) { + FILE *fp = fopen(abs_file_name, "r"); + if (fp != NULL) { + char* ttcn3_module_name; + if (is_ttcn3_module(abs_file_name, fp, &ttcn3_module_name)) { + projGenHelper.addTtcn3ModuleToProject(*p_project_name, ttcn3_module_name); + } + Free(ttcn3_module_name); + char* asn1_module_name; + if (is_asn1_module(abs_file_name, fp, &asn1_module_name)) { + projGenHelper.addAsn1ModuleToProject(*p_project_name, asn1_module_name); + } + Free(asn1_module_name); + if (projGenHelper.isCPPSourceFile(file_name)) { + projGenHelper.addUserSourceToProject(*p_project_name, file_name); + } + if (projGenHelper.isCPPHeaderFile(file_name)) { + projGenHelper.addUserHeaderToProject(*p_project_name, file_name); + } + if (projGenHelper.isTtcnPPFile(file_name)) { + projGenHelper.addTtcnPPToProject(*p_project_name, file_name); + } + } + fclose(fp); + } + } files.add(cpath, ruri); // relativeURI to the TPD location { // set the *preprocess value if .ttcnpp file was found const size_t ttcnpp_extension_len = 7; // ".ttcnpp" @@ -757,6 +1138,10 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcf *preprocess = TRUE; } } + Free(rel_file_dir); + Free(file_name); + Free(abs_dir_path); + Free(abs_file_name); } } } // next FileResource @@ -765,6 +1150,7 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcf // Check options xsdbool2boolean(xpathCtx, actcfg, "useAbsolutePath", p_aflag); xsdbool2boolean(xpathCtx, actcfg, "GNUMake", p_gflag); + if (*p_Zflag) *p_lflag = FALSE; xsdbool2boolean(xpathCtx, actcfg, "dynamicLinking", p_lflag); xsdbool2boolean(xpathCtx, actcfg, "functiontestRuntime", p_Rflag); xsdbool2boolean(xpathCtx, actcfg, "singleMode", p_sflag); @@ -785,6 +1171,9 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcf xsdbool2boolean(xpathCtx, actcfg, "suppressWarnings", p_swflag); xsdbool2boolean(xpathCtx, actcfg, "outParamBoundness", p_Yflag); + projDesc = projGenHelper.getTargetOfProject(*p_project_name); + if (projDesc) projDesc->setLinkingStrategy(*p_lflag); + // Extract the "incremental dependencies" option { boolean incremental_deps = TRUE; @@ -811,7 +1200,7 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcf // Extract the default target option // if it is not defined as a command line argument if (!(*p_Lflag)) { - char *defTargetXpath = mprintf( + expstring_t defTargetXpath = mprintf( "/TITAN_Project_File_Information/Configurations/Configuration[@name='%s']" "/ProjectProperties/MakefileSettings/defaultTarget/text()", actcfg); @@ -828,6 +1217,8 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcf " The available targets are: 'executable', 'library'", content); } } + ProjectDescriptor* projDesc = projGenHelper.getTargetOfProject(*p_project_name); + if (projDesc) projDesc->setLibrary(*p_Lflag); } // Executable name (don't care unless top-level invocation) @@ -939,6 +1330,36 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcf } } } + { + //TTCN3preprocessorUnDefines + char *ttcn3preUndefinesXpath = mprintf( + "/TITAN_Project_File_Information/Configurations/Configuration[@name='%s']" + "/ProjectProperties/MakefileSettings/TTCN3preprocessorUndefines/listItem/text()", + actcfg); + XPathObject ttcn3preUndefinesObj(run_xpath(xpathCtx, ttcn3preUndefinesXpath)); + Free(ttcn3preUndefinesXpath); + + xmlNodeSetPtr nodes = ttcn3preUndefinesObj->nodesetval; + + if (nodes) for (int i = 0; i < nodes->nodeNr; ++i) { + const char* content = (const char*)ttcn3preUndefinesObj->nodesetval->nodeTab[i]->content; + + // add includes to the end of list + if (ttcn3_prep_undefines) { + // go to last element + struct string_list* last_elem = ttcn3_prep_undefines; + while (last_elem->next) last_elem = last_elem->next; + // add string to last element if empty or create new last element and add it to that + if (last_elem->str) { + last_elem->next = (struct string_list*)Malloc(sizeof(struct string_list)); + last_elem = last_elem->next; + last_elem->next = NULL; + } + last_elem->str = mcopystr(content); + } + } + } + { //preprocessorIncludes char *preincludesXpath = mprintf( @@ -998,6 +1419,35 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcf } } } + { + //preprocessorUnDefines + char *preUndefinesXpath = mprintf( + "/TITAN_Project_File_Information/Configurations/Configuration[@name='%s']" + "/ProjectProperties/MakefileSettings/preprocessorUndefines/listItem/text()", + actcfg); + XPathObject preUndefinesObj(run_xpath(xpathCtx, preUndefinesXpath)); + Free(preUndefinesXpath); + + xmlNodeSetPtr nodes = preUndefinesObj->nodesetval; + + if (nodes) for (int i = 0; i < nodes->nodeNr; ++i) { + const char* content = (const char*)preUndefinesObj->nodesetval->nodeTab[i]->content; + + // add includes to the end of list + if (prep_undefines) { + // go to last element + struct string_list* last_elem = prep_undefines; + while (last_elem->next) last_elem = last_elem->next; + // add string to last element if empty or create new last element and add it to that + if (last_elem->str) { + last_elem->next = (struct string_list*)Malloc(sizeof(struct string_list)); + last_elem = last_elem->next; + last_elem->next = NULL; + } + last_elem->str = mcopystr(content); + } + } + } { char *cxxCompilerXpath = mprintf( "/TITAN_Project_File_Information/Configurations/Configuration[@name='%s']" @@ -1229,6 +1679,16 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcf } } { + //The project name needed the hierarchical projects + char* prjNameStr = 0; + char *prjNameStrXpath = mprintf("/TITAN_Project_File_Information/ProjectName/text()"); + XPathObject prjName(run_xpath(xpathCtx, prjNameStrXpath)); + if (prjName->nodesetval && prjName->nodesetval->nodeNr == 1) { + prjNameStr = (char*)prjName->nodesetval->nodeTab[0]->content; + } + Free(prjNameStrXpath); + append_to_library_list (prjNameStr, xpathCtx, actcfg); + //linkerLibraries char *linkerlibsXpath = mprintf( "/TITAN_Project_File_Information/Configurations/Configuration[@name='%s']" @@ -1255,6 +1715,9 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcf } replacechar(&content); last_elem->str = content; + + ProjectDescriptor* projDesc = projGenHelper.getTargetOfProject(*p_project_name); + if (projDesc) projDesc->addToLinkerLibs(last_elem->str); } } } @@ -1285,6 +1748,9 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcf } replacechar(&content); last_elem->str = content; + + ProjectDescriptor* projDesc = projGenHelper.getTargetOfProject(*p_project_name); + if (projDesc) projDesc->addToLibSearchPaths(last_elem->str); } } } @@ -1350,6 +1816,63 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcf } } +// collect the required configurations + { + if (required_configs) { + char* cfgReqsXpath(mprintf( + "/TITAN_Project_File_Information/Configurations/Configuration[@name='%s']" + "/ProjectProperties/ConfigurationRequirements/configurationRequirement", + actcfg)); + XPathObject reqcfgObjects(run_xpath(xpathCtx, cfgReqsXpath)); + Free (cfgReqsXpath); + xmlNodeSetPtr configs = reqcfgObjects->nodesetval; + if (configs) for (int i = 0; i < configs->nodeNr; ++i) { + xmlNodePtr curNodePtr = configs->nodeTab[i]->children; + const char* projectName = NULL; + const char* reqConfig = NULL; + while(curNodePtr) { + if (!strcmp((const char*)curNodePtr->name, "projectName")) { + projectName = (const char*)curNodePtr->children->content; + } + if (!strcmp((const char*)curNodePtr->name, "rerquiredConfiguration") || // backward compatibility + !strcmp((const char*)curNodePtr->name, "requiredConfiguration")) { + reqConfig = (const char*)curNodePtr->children->content; + } + curNodePtr = curNodePtr->next; + } + struct string2_list* last_elem = required_configs; + bool duplicate = false; + while (last_elem->next) { + if (!strcmp(last_elem->str1, projectName) && !strcmp(last_elem->str2, reqConfig)) { + duplicate = true; + } + else if (!strcmp(last_elem->str1, projectName) && strcmp(last_elem->str2, reqConfig)) { + ERROR("Required configuration is inconsistent : Project '%s' cannot have 2 " + "different configuration '%s' '%s'", + last_elem->str1, last_elem->str2, reqConfig); + result = TPD_FAILED; + } + last_elem = last_elem->next; + } + // add string to last element if empty or create new last element and add it to that + if (last_elem->str1 && !duplicate) { + if (strcmp(last_elem->str1, projectName) || strcmp(last_elem->str2, reqConfig)) { + last_elem->next = (struct string2_list*)Malloc(sizeof(struct string2_list)); + last_elem = last_elem->next; + last_elem->next = NULL; + } + else { + duplicate = true; + } + } + if (!duplicate) { + last_elem->str1 = mcopystr(projectName); + last_elem->str2 = mcopystr(reqConfig); + } + } + } + } + // Referenced projects { XPathObject subprojects(run_xpath(xpathCtx, @@ -1374,28 +1897,17 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcf if (name && projectLocationURI) { // collected both // see if there is a specified configuration for the project - const char *my_actcfg = NULL; - autostring req_xpath(mprintf( - "/TITAN_Project_File_Information/Configurations/Configuration[@name='%s']" - "/ProjectProperties/ConfigurationRequirements/configurationRequirement" - "/projectName[text()='%s']" - // Up to this point, we selected the projectName node which contains - // the name of the subproject. But we want its sibling. - // So we go up one and down the other path. - "/parent::*/rerquiredConfiguration/text()", - //Yes, it's rerquiredConfiguration; the Designer misspells it :( - actcfg, name)); - XPathObject reqcfgObj(run_xpath(xpathCtx, req_xpath)); - if (reqcfgObj->nodesetval && reqcfgObj->nodesetval->nodeNr == 1) { - my_actcfg = (const char*)reqcfgObj->nodesetval->nodeTab[0]->content; - } + ProjectDescriptor* projDesc = projGenHelper.getTargetOfProject(*p_project_name); + if (projDesc) projDesc->addToReferencedProjects(name); + + const char *my_actcfg = NULL; int my_argc = 0; char *my_args[] = { NULL }; char **my_argv = my_args + 0; int my_optind = 0; boolean my_gflag = *p_gflag, my_aflag = *p_aflag, my_cflag = *p_cflag, // pass down - my_Rflag = *p_Rflag, my_Pflag = *p_Pflag, + my_Rflag = *p_Rflag, my_Pflag = *p_Pflag, my_Zflag = *p_Zflag, my_Hflag = *p_Hflag, my_sflag = 0, my_Lflag = 0, my_lflag = 0, my_mflag = 0, my_csflag = 0, my_quflag = 0, my_dsflag = 0, my_dbflag = 0, my_drflag = 0, my_dtflag = 0, my_dxflag = 0, my_djflag = 0, my_fxflag = 0, my_doflag = 0, @@ -1403,24 +1915,28 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcf my_swflag = 0, my_Yflag = 0; char *my_ets = NULL; - + char *my_proj_name = NULL; autostring abs_projectLocationURI( compose_path_name(abs_tpd_dir, projectLocationURI)); char* sub_proj_abs_work_dir = NULL; + tpd_result success = process_tpd_internal((const char*)abs_projectLocationURI, - my_actcfg, file_list_path, &my_argc, &my_argv, &my_optind, &my_ets, + my_actcfg, file_list_path, &my_argc, &my_argv, &my_optind, &my_ets, &my_proj_name, &my_gflag, &my_sflag, &my_cflag, &my_aflag, preprocess, &my_Rflag, &my_lflag, &my_mflag, &my_Pflag, &my_Lflag, recursive, force_overwrite, gen_only_top_level, NULL, &sub_proj_abs_work_dir, - sub_project_dirs, program_name, prj_graph_fp, create_symlink_list, ttcn3_prep_includes, ttcn3_prep_defines, prep_includes, prep_defines, &my_csflag, + sub_project_dirs, program_name, prj_graph_fp, create_symlink_list, ttcn3_prep_includes, ttcn3_prep_defines, ttcn3_prep_undefines, + prep_includes, prep_defines, prep_undefines, &my_csflag, &my_quflag, &my_dsflag, cxxcompiler, optlevel, optflags, &my_dbflag, &my_drflag, &my_dtflag, &my_dxflag, &my_djflag, &my_fxflag, &my_doflag, &my_gfflag, &my_lnflag, &my_isflag, &my_asflag, &my_swflag, &my_Yflag, solspeclibs, sol8speclibs, linuxspeclibs, freebsdspeclibs, win32speclibs, - ttcn3prep, linkerlibs, additionalObjects, linkerlibsearchp, Vflag, FALSE, NULL, NULL, prefix_workdir, run_command_list, seen_tpd_files); + ttcn3prep, linkerlibs, additionalObjects, linkerlibsearchp, Vflag, FALSE, &my_Zflag, + &my_Hflag, NULL, NULL, prefix_workdir, run_command_list, seen_tpd_files, required_configs); + autostring sub_proj_abs_work_dir_as(sub_proj_abs_work_dir); // ?! if (success == TPD_SUCCESS) { - + my_actcfg = get_act_config(required_configs, my_proj_name); if (recursive) { // call ttcn3_makefilegen on referenced project's tpd file // -r is not needed any more because top level process traverses all projects recursively expstring_t command = mprintf("%s -cVD", program_name); @@ -1432,6 +1948,8 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcf if (*p_Rflag) command = mputc(command, 'R'); if (*p_lflag) command = mputc(command, 'l'); if (*p_mflag) command = mputc(command, 'm'); + if (*p_Zflag) command = mputc(command, 'Z'); + if (*p_Hflag) command = mputc(command, 'H'); command = mputstr(command, " -t "); command = mputstr(command, (const char*)abs_projectLocationURI); if (my_actcfg) { @@ -1491,6 +2009,7 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcf Free(my_argv); // free the array; we keep the pointers Free(my_ets); + Free(my_proj_name); } else if (success == TPD_FAILED) { ERROR("Failed to process %s", (const char*)abs_projectLocationURI); @@ -1650,5 +2169,5 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, const char *actcf xmlCleanupParser(); // ifdef debug xmlMemoryDump(); - return TPD_SUCCESS; + return result; } diff --git a/compiler2/xpather.h b/compiler2/xpather.h index fc5b9fc8d..935e22524 100644 --- a/compiler2/xpather.h +++ b/compiler2/xpather.h @@ -27,6 +27,112 @@ char* str2; struct string2_list* next; }; +#ifdef __cplusplus +extern "C" +#endif +boolean isTopLevelExecutable(const char* projName); + +#ifdef __cplusplus +extern "C" +#endif +boolean isDynamicLibrary(const char* key); + +#ifdef __cplusplus +extern "C" +#endif +const char* findLibraryPath(const char* libraryName, const char* projName); + +#ifdef __cplusplus +extern "C" +#endif +const char* findLibraryName(const char* libraryName, const char* projName); + +#ifdef __cplusplus +extern "C" +#endif +void erase_libs(); + +#ifdef __cplusplus +extern "C" +#endif +const char* getLibFromProject(const char* projName); + +#ifdef __cplusplus + extern "C" +#endif +struct string_list* getExternalLibs(const char* projName); + +#ifdef __cplusplus +extern "C" +#endif +struct string_list* getExternalLibPathes(const char* projName); + +#ifdef __cplusplus +extern "C" +#endif +struct string2_list* getLinkerLibs(const char* projName); + +#ifdef __cplusplus +extern "C" +#endif +struct string_list* getRefWorkingDirs(const char* projName); + +#ifdef __cplusplus +extern "C" +#endif +boolean hasExternalLibrary(const char* libName, const char* projName); + +#ifdef __cplusplus +extern "C" +#endif +boolean hasSubProject(const char* projName); + +#ifdef __cplusplus +extern "C" +#endif +void print_libs(); + +#ifdef __cplusplus +extern "C" +#endif +boolean isTtcn3ModuleInLibrary(const char* moduleName); + +#ifdef __cplusplus +extern "C" +#endif +const char* getTPDFileName(const char* projName); + +#ifdef __cplusplus +extern "C" +#endif +const char* getPathToRootDir(const char* projName); + +#ifdef __cplusplus +extern "C" +#endif +boolean isAsn1ModuleInLibrary(const char* moduleName); + +#ifdef __cplusplus +extern "C" +#endif +boolean isSourceFileInLibrary(const char* fileName); + +#ifdef __cplusplus +extern "C" +#endif +boolean isHeaderFileInLibrary(const char* fileName); + +#ifdef __cplusplus +extern "C" +#endif +boolean isTtcnPPFileInLibrary(const char* fileName); + +#ifdef __cplusplus +extern "C" +#endif +boolean buildObjects(const char* projName, boolean add_referenced); + + /** * * @param p_tpd_name filename @@ -102,7 +208,7 @@ enum tpd_result process_tpd(const char *p_tpd_name, const char *actcfg, const char *file_list_path, int *argc, char ***argv, - int *optind, char **ets_name, + int *optind, char **ets_name, char **project_name, boolean *gnu_make, boolean *single_mode, boolean *central_storage, boolean *absolute_paths, boolean *preprocess, boolean *use_runtime_2, @@ -110,14 +216,15 @@ tpd_result process_tpd(const char *p_tpd_name, const char *actcfg, boolean *library, boolean recursive, boolean force_overwrite, boolean gen_only_top_level, const char *output_file, char** abs_work_dir, struct string_list* sub_project_dirs, const char* program_name, FILE* prj_graph_fp, struct string2_list* create_symlink_list, struct string_list* ttcn3_prep_includes, - struct string_list* ttcn3_prep_defines, struct string_list* prep_includes, struct string_list* prep_defines, - boolean *codesplit, boolean *quietly, boolean *disablesubtypecheck, char** cxxcompiler, - char** optlevel, char** optflags, boolean *disableber, boolean *disableraw, boolean *disabletext, boolean *disablexer, + struct string_list* ttcn3_prep_defines, struct string_list* ttcn3_prep_undefines, struct string_list* prep_includes, + struct string_list* prep_defines, struct string_list* prep_undefines, boolean *codesplit, boolean *quietly, boolean *disablesubtypecheck, + char** cxxcompiler, char** optlevel, char** optflags, boolean *disableber, boolean *disableraw, boolean *disabletext, boolean *disablexer, boolean *disablejson, boolean *forcexerinasn, boolean *defaultasomit, boolean *gccmessageformat, boolean *linenumber, boolean *includesourceinfo, boolean *addsourcelineinfo, boolean *suppresswarnings, boolean *outparamboundness, struct string_list* solspeclibs, struct string_list* sol8speclibs, struct string_list* linuxspeclibs, struct string_list* freebsdspeclibs, struct string_list* win32speclibs, char** ttcn3preprocessor, struct string_list* linkerlibs, struct string_list* additionalObjects, struct string_list* linkerlibsearchpath, boolean Vflag, boolean Dflag, - char** generatorCommandOutput, struct string2_list* target_placement_list, boolean prefix_workdir, struct string2_list* run_command_list); + boolean *Zflag, boolean *Hflag, char** generatorCommandOutput, struct string2_list* target_placement_list, boolean prefix_workdir, struct string2_list* run_command_list, + struct string2_list* required_configs); #endif /* XPATHER_H_ */ diff --git a/core/ASN_Any.cc b/core/ASN_Any.cc index daf462053..129081b88 100644 --- a/core/ASN_Any.cc +++ b/core/ASN_Any.cc @@ -25,6 +25,15 @@ void ASN_ANY::encode(const TTCN_Typedescriptor_t& p_td, tlv->put_in_buffer(p_buf); ASN_BER_TLV_t::destruct(tlv); break;} + case TTCN_EncDec::CT_JSON: { + TTCN_EncDec_ErrorContext ec("While JSON-encoding type '%s': ", p_td.name); + if(!p_td.json) + TTCN_EncDec_ErrorContext::error_internal + ("No JSON descriptor available for type '%s'.", p_td.name); + JSON_Tokenizer tok(va_arg(pvar, int) != 0); + JSON_encode(p_td, tok); + p_buf.put_s(tok.get_buffer_length(), (const unsigned char*)tok.get_buffer()); + break;} case TTCN_EncDec::CT_RAW: default: TTCN_error("Unknown coding method requested to encode type '%s'", @@ -48,6 +57,19 @@ void ASN_ANY::decode(const TTCN_Typedescriptor_t& p_td, BER_decode_TLV(p_td, tlv, L_form); if(tlv.isComplete) p_buf.increase_pos(tlv.get_len()); break;} + case TTCN_EncDec::CT_JSON: { + TTCN_EncDec_ErrorContext ec("While JSON-decoding type '%s': ", p_td.name); + if(!p_td.json) + TTCN_EncDec_ErrorContext::error_internal + ("No JSON descriptor available for type '%s'.", p_td.name); + JSON_Tokenizer tok((const char*)p_buf.get_data(), p_buf.get_len()); + if(JSON_decode(p_td, tok, false)<0) + ec.error(TTCN_EncDec::ET_INCOMPL_MSG, + "Can not decode type '%s', because invalid or incomplete" + " message was received" + , p_td.name); + p_buf.set_pos(tok.get_buf_pos()); + break;} case TTCN_EncDec::CT_RAW: default: TTCN_error("Unknown coding method requested to decode type '%s'", diff --git a/core/ASN_CharacterString.cc b/core/ASN_CharacterString.cc index c9c01f027..f4ae4a5d7 100644 --- a/core/ASN_CharacterString.cc +++ b/core/ASN_CharacterString.cc @@ -646,7 +646,7 @@ boolean CHARACTER_STRING_identification::BER_decode_TLV(const TTCN_Typedescripto // FIXME maybe: XER_encode and decode is virtually identical to EMBEDDED_PDV int CHARACTER_STRING_identification::XER_encode(const XERdescriptor_t& p_td, - TTCN_Buffer& p_buf, unsigned int flavor, int indent) const + TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const { int encoded_length=(int)p_buf.get_len(); @@ -655,22 +655,22 @@ int CHARACTER_STRING_identification::XER_encode(const XERdescriptor_t& p_td, flavor &= XER_MASK; switch (union_selection) { case ALT_syntaxes: - field_syntaxes->XER_encode(EMBEDDED_PDV_identification_sxs_xer_, p_buf, flavor, indent); + field_syntaxes->XER_encode(EMBEDDED_PDV_identification_sxs_xer_, p_buf, flavor, indent, 0); break; case ALT_syntax: - field_syntax->XER_encode(EMBEDDED_PDV_identification_sx_xer_, p_buf, flavor, indent); + field_syntax->XER_encode(EMBEDDED_PDV_identification_sx_xer_, p_buf, flavor, indent, 0); break; case ALT_presentation__context__id: - field_presentation__context__id->XER_encode(EMBEDDED_PDV_identification_pci_xer_, p_buf, flavor, indent); + field_presentation__context__id->XER_encode(EMBEDDED_PDV_identification_pci_xer_, p_buf, flavor, indent, 0); break; case ALT_context__negotiation: - field_context__negotiation->XER_encode(EMBEDDED_PDV_identification_cn_xer_, p_buf, flavor, indent); + field_context__negotiation->XER_encode(EMBEDDED_PDV_identification_cn_xer_, p_buf, flavor, indent, 0); break; case ALT_transfer__syntax: - field_transfer__syntax->XER_encode(EMBEDDED_PDV_identification_ts_xer_, p_buf, flavor, indent); + field_transfer__syntax->XER_encode(EMBEDDED_PDV_identification_ts_xer_, p_buf, flavor, indent, 0); break; case ALT_fixed: - field_fixed->XER_encode(EMBEDDED_PDV_identification_fix_xer_, p_buf, flavor, indent); + field_fixed->XER_encode(EMBEDDED_PDV_identification_fix_xer_, p_buf, flavor, indent, 0); break; default: TTCN_EncDec_ErrorContext::error_internal("Unknown selection."); @@ -683,7 +683,7 @@ int CHARACTER_STRING_identification::XER_encode(const XERdescriptor_t& p_td, } int CHARACTER_STRING_identification::XER_decode(const XERdescriptor_t& p_td, - XmlReaderWrap& reader, unsigned int flavor) + XmlReaderWrap& reader, unsigned int flavor, embed_values_dec_struct_t*) { int exer = is_exer(flavor); // we are supposed to be parked on our element @@ -704,27 +704,27 @@ int CHARACTER_STRING_identification::XER_decode(const XERdescriptor_t& p_td, size_t namelen = strlen(name); switch (namelen) { case 8: // syntaxes - syntaxes().XER_decode(EMBEDDED_PDV_identification_sxs_xer_, reader, flavor); + syntaxes().XER_decode(EMBEDDED_PDV_identification_sxs_xer_, reader, flavor, 0); break; case 6: // syntax - syntax().XER_decode(EMBEDDED_PDV_identification_sx_xer_, reader, flavor); + syntax().XER_decode(EMBEDDED_PDV_identification_sx_xer_, reader, flavor, 0); break; case 23: // presentation-context-id - presentation__context__id().XER_decode(EMBEDDED_PDV_identification_pci_xer_, reader, flavor); + presentation__context__id().XER_decode(EMBEDDED_PDV_identification_pci_xer_, reader, flavor, 0); break; case 19: // context-negotiation - context__negotiation().XER_decode(EMBEDDED_PDV_identification_cn_xer_, reader, flavor); + context__negotiation().XER_decode(EMBEDDED_PDV_identification_cn_xer_, reader, flavor, 0); break; case 15: // transfer-syntax - transfer__syntax().XER_decode(EMBEDDED_PDV_identification_ts_xer_, reader, flavor); + transfer__syntax().XER_decode(EMBEDDED_PDV_identification_ts_xer_, reader, flavor, 0); break; case 5: // fixed - fixed().XER_decode(EMBEDDED_PDV_identification_fix_xer_, reader, flavor); + fixed().XER_decode(EMBEDDED_PDV_identification_fix_xer_, reader, flavor, 0); break; default: @@ -1673,14 +1673,14 @@ boolean CHARACTER_STRING_identification_syntaxes::BER_decode_TLV(const TTCN_Type } int CHARACTER_STRING_identification_syntaxes::XER_encode(const XERdescriptor_t& p_td, - TTCN_Buffer& p_buf, unsigned int flavor, int indent) const + TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const { int encoded_length=(int)p_buf.get_len(); begin_xml(p_td, p_buf, flavor, indent++, false); - field_abstract.XER_encode(CHARACTER_STRING_identification_sxs_abs_xer_, p_buf, flavor, indent); - field_transfer.XER_encode(CHARACTER_STRING_identification_sxs_xfr_xer_, p_buf, flavor, indent); + field_abstract.XER_encode(CHARACTER_STRING_identification_sxs_abs_xer_, p_buf, flavor, indent, 0); + field_transfer.XER_encode(CHARACTER_STRING_identification_sxs_xfr_xer_, p_buf, flavor, indent, 0); end_xml(p_td, p_buf, flavor, --indent, false); @@ -1688,7 +1688,7 @@ int CHARACTER_STRING_identification_syntaxes::XER_encode(const XERdescriptor_t& } int CHARACTER_STRING_identification_syntaxes::XER_decode( - const XERdescriptor_t& /*p_td*/, XmlReaderWrap& reader, unsigned int flavor) + const XERdescriptor_t& /*p_td*/, XmlReaderWrap& reader, unsigned int flavor, embed_values_dec_struct_t*) { // we stand on <syntaxes>, move ahead first for (int success = reader.Read(); success == 1; success = reader.Read()) { @@ -1698,8 +1698,8 @@ int CHARACTER_STRING_identification_syntaxes::XER_decode( break; } // FIXME this assumes the right element - field_abstract.XER_decode(EMBEDDED_PDV_identification_sxs_abs_xer_, reader, flavor); - field_transfer.XER_decode(EMBEDDED_PDV_identification_sxs_xfr_xer_, reader, flavor); + field_abstract.XER_decode(EMBEDDED_PDV_identification_sxs_abs_xer_, reader, flavor, 0); + field_transfer.XER_decode(EMBEDDED_PDV_identification_sxs_xfr_xer_, reader, flavor, 0); for (int success = 1; success == 1; success = reader.Read()) { int type = reader.NodeType(); @@ -2319,14 +2319,14 @@ boolean CHARACTER_STRING_identification_context__negotiation::BER_decode_TLV(con } int CHARACTER_STRING_identification_context__negotiation::XER_encode(const XERdescriptor_t& p_td, - TTCN_Buffer& p_buf, unsigned int flavor, int indent) const + TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const { int encoded_length=(int)p_buf.get_len(); begin_xml(p_td, p_buf, flavor, indent++, false); - field_presentation__context__id.XER_encode(CHARACTER_STRING_identification_pci_xer_, p_buf, flavor, indent); - field_transfer__syntax .XER_encode(CHARACTER_STRING_identification_ts_xer_ , p_buf, flavor, indent); + field_presentation__context__id.XER_encode(CHARACTER_STRING_identification_pci_xer_, p_buf, flavor, indent, 0); + field_transfer__syntax .XER_encode(CHARACTER_STRING_identification_ts_xer_ , p_buf, flavor, indent, 0); end_xml(p_td, p_buf, flavor, --indent, false); @@ -2334,7 +2334,7 @@ int CHARACTER_STRING_identification_context__negotiation::XER_encode(const XERde } int CHARACTER_STRING_identification_context__negotiation::XER_decode( - const XERdescriptor_t& p_td, XmlReaderWrap& reader, unsigned int flavor) + const XERdescriptor_t& p_td, XmlReaderWrap& reader, unsigned int flavor, embed_values_dec_struct_t*) { int exer = is_exer(flavor); int type = reader.NodeType(), depth = -1; @@ -2345,8 +2345,8 @@ int CHARACTER_STRING_identification_context__negotiation::XER_decode( depth = reader.Depth(); success = reader.Read(); } - field_presentation__context__id.XER_decode(EMBEDDED_PDV_identification_cn_pci_xer_, reader, flavor); - field_transfer__syntax .XER_decode(EMBEDDED_PDV_identification_cn_tsx_xer_, reader, flavor); + field_presentation__context__id.XER_decode(EMBEDDED_PDV_identification_cn_pci_xer_, reader, flavor, 0); + field_transfer__syntax .XER_decode(EMBEDDED_PDV_identification_cn_tsx_xer_, reader, flavor, 0); for (; success == 1; success = reader.Read()) { type = reader.NodeType(); if (XML_READER_TYPE_END_ELEMENT == type) { @@ -2972,7 +2972,7 @@ void CHARACTER_STRING::encode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_ case TTCN_EncDec::CT_XER: { TTCN_EncDec_ErrorContext ec("While XER-encoding type '%s': ", p_td.name); unsigned XER_coding=va_arg(pvar, unsigned); - XER_encode(*p_td.xer,p_buf, XER_coding, 0); + XER_encode(*p_td.xer,p_buf, XER_coding, 0, 0); p_buf.put_c('\n'); break;} case TTCN_EncDec::CT_JSON: { @@ -3019,7 +3019,7 @@ void CHARACTER_STRING::decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_ if (type==XML_READER_TYPE_ELEMENT) break; } - XER_decode(*p_td.xer, reader, XER_coding); + XER_decode(*p_td.xer, reader, XER_coding, 0); size_t bytes = reader.ByteConsumed(); p_buf.set_pos(bytes); break;} @@ -3085,7 +3085,8 @@ boolean CHARACTER_STRING::BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, cons return TRUE; } -int CHARACTER_STRING::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, unsigned int flavor, int indent) const +int CHARACTER_STRING::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, + unsigned int flavor, int indent, embed_values_enc_struct_t*) const { if(!is_bound()) { TTCN_EncDec_ErrorContext::error @@ -3096,10 +3097,10 @@ int CHARACTER_STRING::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf flavor &= ~XER_RECOF; // ASN.1 character string doesn't care begin_xml(p_td, p_buf, flavor, indent++, false); - field_identification.XER_encode(CHARACTER_STRING_identification_xer_, p_buf, flavor, indent); + field_identification.XER_encode(CHARACTER_STRING_identification_xer_, p_buf, flavor, indent, 0); // data-value-descriptor is OPTIONAL and can never be present. // Its encoding is empty. - field_string__value .XER_encode(CHARACTER_STRING_data_value_xer_ , p_buf, flavor, indent); + field_string__value .XER_encode(CHARACTER_STRING_data_value_xer_ , p_buf, flavor, indent, 0); end_xml(p_td, p_buf, flavor, --indent, false); @@ -3107,7 +3108,7 @@ int CHARACTER_STRING::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf } int CHARACTER_STRING::XER_decode(const XERdescriptor_t& p_td, - XmlReaderWrap& reader, unsigned int flavor) + XmlReaderWrap& reader, unsigned int flavor, embed_values_dec_struct_t*) { int exer = is_exer(flavor); int success = reader.Ok(), depth = -1, type; @@ -3120,13 +3121,13 @@ int CHARACTER_STRING::XER_decode(const XERdescriptor_t& p_td, break; } } - field_identification .XER_decode(CHARACTER_STRING_identification_xer_ , reader, flavor); - field_data__value__descriptor.XER_decode(CHARACTER_STRING_data_value_descriptor_xer_, reader, flavor); + field_identification .XER_decode(CHARACTER_STRING_identification_xer_ , reader, flavor, 0); + field_data__value__descriptor.XER_decode(CHARACTER_STRING_data_value_descriptor_xer_, reader, flavor, 0); if (field_data__value__descriptor.is_value()) { TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_INVAL_MSG, "data-value-descriptor not allowed for EMBEDDED PDV"); } - field_string__value .XER_decode(CHARACTER_STRING_data_value_xer_ , reader, flavor); + field_string__value .XER_decode(CHARACTER_STRING_data_value_xer_ , reader, flavor, 0); for (success = reader.Read(); success == 1; success = reader.Read()) { type = reader.NodeType(); if (XML_READER_TYPE_END_ELEMENT == type) { diff --git a/core/ASN_CharacterString.hh b/core/ASN_CharacterString.hh index 5e0c24b61..279bccc0a 100644 --- a/core/ASN_CharacterString.hh +++ b/core/ASN_CharacterString.hh @@ -86,9 +86,9 @@ public: ASN_BER_TLV_t* BER_encode_TLV(const TTCN_Typedescriptor_t& p_td, unsigned p_coding) const; boolean BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, const ASN_BER_TLV_t& p_tlv, unsigned L_form); int XER_encode(const XERdescriptor_t& p_td, - TTCN_Buffer& p_buf, unsigned int flavor, int indent) const; + TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const; int XER_decode(const XERdescriptor_t& p_td, - XmlReaderWrap& reader, unsigned int flavor); + XmlReaderWrap& reader, unsigned int flavor, embed_values_dec_struct_t*); private: boolean BER_decode_set_selection(const ASN_BER_TLV_t& p_tlv); public: @@ -208,9 +208,9 @@ public: ASN_BER_TLV_t* BER_encode_TLV(const TTCN_Typedescriptor_t& p_td, unsigned p_coding) const; boolean BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, const ASN_BER_TLV_t& p_tlv, unsigned L_form); int XER_encode(const XERdescriptor_t& p_td, - TTCN_Buffer& p_buf, unsigned int flavor, int indent) const; + TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const; int XER_decode(const XERdescriptor_t& p_td, - XmlReaderWrap& reader, unsigned int flavor); + XmlReaderWrap& reader, unsigned int flavor, embed_values_dec_struct_t*); }; class CHARACTER_STRING_identification_syntaxes_template : public Base_Template { @@ -315,9 +315,9 @@ public: ASN_BER_TLV_t* BER_encode_TLV(const TTCN_Typedescriptor_t& p_td, unsigned p_coding) const; boolean BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, const ASN_BER_TLV_t& p_tlv, unsigned L_form); int XER_encode(const XERdescriptor_t& p_td, - TTCN_Buffer& p_buf, unsigned int flavor, int indent) const; + TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const; int XER_decode(const XERdescriptor_t& p_td, - XmlReaderWrap& reader, unsigned int flavor); + XmlReaderWrap& reader, unsigned int flavor, embed_values_dec_struct_t*); }; class CHARACTER_STRING_identification_context__negotiation_template : public Base_Template { @@ -430,8 +430,8 @@ public: void decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, TTCN_EncDec::coding_t p_coding, ...); ASN_BER_TLV_t* BER_encode_TLV(const TTCN_Typedescriptor_t& p_td, unsigned p_coding) const; boolean BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, const ASN_BER_TLV_t& p_tlv, unsigned L_form); - int XER_encode(const XERdescriptor_t&, TTCN_Buffer&, unsigned int, int) const; - int XER_decode(const XERdescriptor_t&, XmlReaderWrap& reader, unsigned int); + int XER_encode(const XERdescriptor_t&, TTCN_Buffer&, unsigned int, int, embed_values_enc_struct_t*) const; + int XER_decode(const XERdescriptor_t&, XmlReaderWrap& reader, unsigned int, embed_values_dec_struct_t*); }; class CHARACTER_STRING_template : public Base_Template { diff --git a/core/ASN_EmbeddedPDV.cc b/core/ASN_EmbeddedPDV.cc index 003b81f55..7a05319d6 100644 --- a/core/ASN_EmbeddedPDV.cc +++ b/core/ASN_EmbeddedPDV.cc @@ -633,7 +633,7 @@ boolean EMBEDDED_PDV_identification::BER_decode_TLV(const TTCN_Typedescriptor_t& // FIXME maybe: XER_encode and decode is virtually identical to CHARACTER_STRING int EMBEDDED_PDV_identification::XER_encode(const XERdescriptor_t& p_td, - TTCN_Buffer& p_buf, unsigned int flavor, int indent) const + TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const { int indenting = !is_canonical(flavor); int exer = is_exer(flavor); @@ -646,22 +646,22 @@ int EMBEDDED_PDV_identification::XER_encode(const XERdescriptor_t& p_td, ++indent; switch (union_selection) { case ALT_syntaxes: - field_syntaxes->XER_encode(EMBEDDED_PDV_identification_sxs_xer_, p_buf, flavor, indent);; + field_syntaxes->XER_encode(EMBEDDED_PDV_identification_sxs_xer_, p_buf, flavor, indent, 0);; break; case ALT_syntax: - field_syntax->XER_encode(EMBEDDED_PDV_identification_sx_xer_, p_buf, flavor, indent);; + field_syntax->XER_encode(EMBEDDED_PDV_identification_sx_xer_, p_buf, flavor, indent, 0);; break; case ALT_presentation__context__id: - field_presentation__context__id->XER_encode(EMBEDDED_PDV_identification_pci_xer_, p_buf, flavor, indent);; + field_presentation__context__id->XER_encode(EMBEDDED_PDV_identification_pci_xer_, p_buf, flavor, indent, 0);; break; case ALT_context__negotiation: - field_context__negotiation->XER_encode(EMBEDDED_PDV_identification_cn_xer_, p_buf, flavor, indent);; + field_context__negotiation->XER_encode(EMBEDDED_PDV_identification_cn_xer_, p_buf, flavor, indent, 0);; break; case ALT_transfer__syntax: - field_transfer__syntax->XER_encode(EMBEDDED_PDV_identification_ts_xer_, p_buf, flavor, indent);; + field_transfer__syntax->XER_encode(EMBEDDED_PDV_identification_ts_xer_, p_buf, flavor, indent, 0);; break; case ALT_fixed: - field_fixed->XER_encode(EMBEDDED_PDV_identification_fix_xer_, p_buf, flavor, indent);; + field_fixed->XER_encode(EMBEDDED_PDV_identification_fix_xer_, p_buf, flavor, indent, 0);; break; default: TTCN_EncDec_ErrorContext::error_internal("Unknown selection."); @@ -677,7 +677,7 @@ int EMBEDDED_PDV_identification::XER_encode(const XERdescriptor_t& p_td, } int EMBEDDED_PDV_identification::XER_decode(const XERdescriptor_t& p_td, - XmlReaderWrap& reader, unsigned int flavor) + XmlReaderWrap& reader, unsigned int flavor, embed_values_dec_struct_t*) { int exer = is_exer(flavor); // we are supposed to be parked on our element @@ -697,27 +697,27 @@ int EMBEDDED_PDV_identification::XER_decode(const XERdescriptor_t& p_td, size_t namelen = strlen(name); switch (namelen) { case 8: // syntaxes - syntaxes().XER_decode(EMBEDDED_PDV_identification_sxs_xer_, reader, flavor); + syntaxes().XER_decode(EMBEDDED_PDV_identification_sxs_xer_, reader, flavor, 0); break; case 6: // syntax - syntax().XER_decode(EMBEDDED_PDV_identification_sx_xer_, reader, flavor); + syntax().XER_decode(EMBEDDED_PDV_identification_sx_xer_, reader, flavor, 0); break; case 23: // presentation-context-id - presentation__context__id().XER_decode(EMBEDDED_PDV_identification_pci_xer_, reader, flavor); + presentation__context__id().XER_decode(EMBEDDED_PDV_identification_pci_xer_, reader, flavor, 0); break; case 19: // context-negotiation - context__negotiation().XER_decode(EMBEDDED_PDV_identification_cn_xer_, reader, flavor); + context__negotiation().XER_decode(EMBEDDED_PDV_identification_cn_xer_, reader, flavor, 0); break; case 15: // transfer-syntax - transfer__syntax().XER_decode(EMBEDDED_PDV_identification_ts_xer_, reader, flavor); + transfer__syntax().XER_decode(EMBEDDED_PDV_identification_ts_xer_, reader, flavor, 0); break; case 5: // fixed - fixed().XER_decode(EMBEDDED_PDV_identification_fix_xer_, reader, flavor); + fixed().XER_decode(EMBEDDED_PDV_identification_fix_xer_, reader, flavor, 0); break; default: @@ -1667,7 +1667,7 @@ boolean EMBEDDED_PDV_identification_syntaxes::BER_decode_TLV(const TTCN_Typedesc } int EMBEDDED_PDV_identification_syntaxes::XER_encode(const XERdescriptor_t& p_td, - TTCN_Buffer& p_buf, unsigned int flavor, int indent) const + TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const { int indenting = !is_canonical(flavor); int exer = is_exer(flavor); @@ -1678,8 +1678,8 @@ int EMBEDDED_PDV_identification_syntaxes::XER_encode(const XERdescriptor_t& p_td p_buf.put_s((size_t)p_td.namelens[exer] - 1 + indenting, (const unsigned char*)p_td.names[exer]); ++indent; - field_abstract.XER_encode(EMBEDDED_PDV_identification_sxs_abs_xer_, p_buf, flavor, indent); - field_transfer.XER_encode(EMBEDDED_PDV_identification_sxs_xfr_xer_, p_buf, flavor, indent); + field_abstract.XER_encode(EMBEDDED_PDV_identification_sxs_abs_xer_, p_buf, flavor, indent, 0); + field_transfer.XER_encode(EMBEDDED_PDV_identification_sxs_xfr_xer_, p_buf, flavor, indent, 0); if (indenting) do_indent(p_buf, --indent); p_buf.put_c('<'); @@ -1690,7 +1690,7 @@ int EMBEDDED_PDV_identification_syntaxes::XER_encode(const XERdescriptor_t& p_td } int EMBEDDED_PDV_identification_syntaxes::XER_decode(const XERdescriptor_t& /*p_td*/, - XmlReaderWrap& reader, unsigned int flavor) + XmlReaderWrap& reader, unsigned int flavor, embed_values_dec_struct_t*) { // we stand on <syntaxes>, move ahead first int type; for (int success = reader.Read(); success == 1; success = reader.Read()) @@ -1701,8 +1701,8 @@ int EMBEDDED_PDV_identification_syntaxes::XER_decode(const XERdescriptor_t& /*p_ break; } // FIXME this assumes the right element - field_abstract.XER_decode(EMBEDDED_PDV_identification_sxs_abs_xer_, reader, flavor); - field_transfer.XER_decode(EMBEDDED_PDV_identification_sxs_xfr_xer_, reader, flavor); + field_abstract.XER_decode(EMBEDDED_PDV_identification_sxs_abs_xer_, reader, flavor, 0); + field_transfer.XER_decode(EMBEDDED_PDV_identification_sxs_xfr_xer_, reader, flavor, 0); for (int success = 1; success == 1; success = reader.Read()) { type = reader.NodeType(); @@ -2323,7 +2323,7 @@ boolean EMBEDDED_PDV_identification_context__negotiation::BER_decode_TLV(const T } int EMBEDDED_PDV_identification_context__negotiation::XER_encode(const XERdescriptor_t& p_td, - TTCN_Buffer& p_buf, unsigned int flavor, int indent) const + TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const { int indenting = !is_canonical(flavor); int exer = is_exer(flavor); @@ -2334,8 +2334,8 @@ int EMBEDDED_PDV_identification_context__negotiation::XER_encode(const XERdescri p_buf.put_s((size_t)p_td.namelens[exer] - 1 + indenting, (const unsigned char*)p_td.names[exer]); ++indent; - field_presentation__context__id.XER_encode(EMBEDDED_PDV_identification_cn_pci_xer_, p_buf, flavor, indent); - field_transfer__syntax .XER_encode(EMBEDDED_PDV_identification_cn_tsx_xer_, p_buf, flavor, indent); + field_presentation__context__id.XER_encode(EMBEDDED_PDV_identification_cn_pci_xer_, p_buf, flavor, indent, 0); + field_transfer__syntax .XER_encode(EMBEDDED_PDV_identification_cn_tsx_xer_, p_buf, flavor, indent, 0); if (indenting) do_indent(p_buf, --indent); p_buf.put_c('<'); @@ -2346,7 +2346,7 @@ int EMBEDDED_PDV_identification_context__negotiation::XER_encode(const XERdescri } int EMBEDDED_PDV_identification_context__negotiation::XER_decode( - const XERdescriptor_t& p_td, XmlReaderWrap& reader, unsigned int flavor) + const XERdescriptor_t& p_td, XmlReaderWrap& reader, unsigned int flavor, embed_values_dec_struct_t*) { int exer = is_exer(flavor); int type = reader.NodeType(), depth = -1; @@ -2357,8 +2357,8 @@ int EMBEDDED_PDV_identification_context__negotiation::XER_decode( depth = reader.Depth(); success = reader.Read(); } - field_presentation__context__id.XER_decode(EMBEDDED_PDV_identification_cn_pci_xer_, reader, flavor); - field_transfer__syntax .XER_decode(EMBEDDED_PDV_identification_cn_tsx_xer_, reader, flavor); + field_presentation__context__id.XER_decode(EMBEDDED_PDV_identification_cn_pci_xer_, reader, flavor, 0); + field_transfer__syntax .XER_decode(EMBEDDED_PDV_identification_cn_tsx_xer_, reader, flavor, 0); for (; success == 1; success = reader.Read()) { type = reader.NodeType(); if (XML_READER_TYPE_END_ELEMENT == type) { @@ -2984,7 +2984,7 @@ void EMBEDDED_PDV::encode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, case TTCN_EncDec::CT_XER: { TTCN_EncDec_ErrorContext ec("While XER-encoding type '%s': ", p_td.name); unsigned XER_coding=va_arg(pvar, unsigned); - XER_encode(*p_td.xer,p_buf, XER_coding, 0); + XER_encode(*p_td.xer,p_buf, XER_coding, 0, 0); break;} case TTCN_EncDec::CT_JSON: { TTCN_EncDec_ErrorContext ec("While JSON-encoding type '%s': ", p_td.name); @@ -3030,7 +3030,7 @@ void EMBEDDED_PDV::decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, if (type==XML_READER_TYPE_ELEMENT) break; } - XER_decode(*p_td.xer, reader, XER_coding); + XER_decode(*p_td.xer, reader, XER_coding, 0); size_t bytes = reader.ByteConsumed(); p_buf.set_pos(bytes); break;} @@ -3097,7 +3097,7 @@ boolean EMBEDDED_PDV::BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, const AS } int EMBEDDED_PDV::XER_encode(const XERdescriptor_t& p_td, - TTCN_Buffer& p_buf, unsigned int flavor, int indent) const { + TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const { if(!is_bound()) { TTCN_EncDec_ErrorContext::error (TTCN_EncDec::ET_UNBOUND, "Encoding an unbound value."); @@ -3111,13 +3111,13 @@ int EMBEDDED_PDV::XER_encode(const XERdescriptor_t& p_td, p_buf.put_s((size_t)p_td.namelens[exer] - 1 + indenting, (const unsigned char*)p_td.names[exer]); flavor &= XER_MASK; ++indent; - field_identification .XER_encode(EMBEDDED_PDV_identification_xer_ , p_buf, flavor, indent); + field_identification .XER_encode(EMBEDDED_PDV_identification_xer_ , p_buf, flavor, indent, 0); if (field_data__value__descriptor.is_value()) { TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_INVAL_MSG, "data-value-descriptor not allowed for EMBEDDED PDV"); } - field_data__value__descriptor.XER_encode(EMBEDDED_PDV_data_value_descriptor_xer_, p_buf, flavor, indent); - field_data__value .XER_encode(EMBEDDED_PDV_data_value_xer_ , p_buf, flavor, indent); + field_data__value__descriptor.XER_encode(EMBEDDED_PDV_data_value_descriptor_xer_, p_buf, flavor, indent, 0); + field_data__value .XER_encode(EMBEDDED_PDV_data_value_xer_ , p_buf, flavor, indent, 0); if (indenting) do_indent(p_buf, --indent); p_buf.put_c('<'); @@ -3127,7 +3127,7 @@ int EMBEDDED_PDV::XER_encode(const XERdescriptor_t& p_td, return (int)p_buf.get_len() - encoded_length; } -int EMBEDDED_PDV::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, unsigned int flavor) +int EMBEDDED_PDV::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, unsigned int flavor, embed_values_dec_struct_t*) { int exer = is_exer(flavor); int depth = 1, type, success; @@ -3140,13 +3140,13 @@ int EMBEDDED_PDV::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, break; } } - field_identification .XER_decode(EMBEDDED_PDV_identification_xer_ , reader, flavor); - field_data__value__descriptor.XER_decode(EMBEDDED_PDV_data_value_descriptor_xer_, reader, flavor); + field_identification .XER_decode(EMBEDDED_PDV_identification_xer_ , reader, flavor, 0); + field_data__value__descriptor.XER_decode(EMBEDDED_PDV_data_value_descriptor_xer_, reader, flavor, 0); if (field_data__value__descriptor.is_value()) { TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_INVAL_MSG, "data-value-descriptor not allowed for EMBEDDED PDV"); } - field_data__value .XER_decode(EMBEDDED_PDV_data_value_xer_ , reader, flavor); + field_data__value .XER_decode(EMBEDDED_PDV_data_value_xer_ , reader, flavor, 0); for (success = reader.Read(); success == 1; success = reader.Read()) { type = reader.NodeType(); if (XML_READER_TYPE_END_ELEMENT == type) { diff --git a/core/ASN_EmbeddedPDV.hh b/core/ASN_EmbeddedPDV.hh index 6dce034b0..0ee44cf13 100644 --- a/core/ASN_EmbeddedPDV.hh +++ b/core/ASN_EmbeddedPDV.hh @@ -86,9 +86,9 @@ public: ASN_BER_TLV_t* BER_encode_TLV(const TTCN_Typedescriptor_t& p_td, unsigned p_coding) const; boolean BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, const ASN_BER_TLV_t& p_tlv, unsigned L_form); int XER_encode(const XERdescriptor_t& p_td, - TTCN_Buffer& p_buf, unsigned int flavor, int indent) const; + TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const; int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor); + unsigned int flavor, embed_values_dec_struct_t*); private: boolean BER_decode_set_selection(const ASN_BER_TLV_t& p_tlv); public: @@ -207,8 +207,8 @@ public: //void decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, TTCN_EncDec::coding_t p_coding, ...); ASN_BER_TLV_t* BER_encode_TLV(const TTCN_Typedescriptor_t& p_td, unsigned p_coding) const; boolean BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, const ASN_BER_TLV_t& p_tlv, unsigned L_form); - int XER_encode(const XERdescriptor_t&, TTCN_Buffer&, unsigned int, int) const; - int XER_decode(const XERdescriptor_t&, XmlReaderWrap& reader, unsigned int); + int XER_encode(const XERdescriptor_t&, TTCN_Buffer&, unsigned int, int, embed_values_enc_struct_t*) const; + int XER_decode(const XERdescriptor_t&, XmlReaderWrap& reader, unsigned int, embed_values_dec_struct_t*); }; class EMBEDDED_PDV_identification_syntaxes_template : public Base_Template { @@ -312,8 +312,8 @@ public: //void decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, TTCN_EncDec::coding_t p_coding, ...); ASN_BER_TLV_t* BER_encode_TLV(const TTCN_Typedescriptor_t& p_td, unsigned p_coding) const; boolean BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, const ASN_BER_TLV_t& p_tlv, unsigned L_form); - int XER_encode(const XERdescriptor_t&, TTCN_Buffer&, unsigned int, int) const; - int XER_decode(const XERdescriptor_t&, XmlReaderWrap& reader, unsigned int); + int XER_encode(const XERdescriptor_t&, TTCN_Buffer&, unsigned int, int, embed_values_enc_struct_t*) const; + int XER_decode(const XERdescriptor_t&, XmlReaderWrap& reader, unsigned int, embed_values_dec_struct_t*); }; class EMBEDDED_PDV_identification_context__negotiation_template : public Base_Template { @@ -423,8 +423,8 @@ public: void decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, TTCN_EncDec::coding_t p_coding, ...); ASN_BER_TLV_t* BER_encode_TLV(const TTCN_Typedescriptor_t& p_td, unsigned p_coding) const; boolean BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, const ASN_BER_TLV_t& p_tlv, unsigned L_form); - int XER_encode(const XERdescriptor_t&, TTCN_Buffer&, unsigned int, int) const; - int XER_decode(const XERdescriptor_t&, XmlReaderWrap&, unsigned int); + int XER_encode(const XERdescriptor_t&, TTCN_Buffer&, unsigned int, int, embed_values_enc_struct_t*) const; + int XER_decode(const XERdescriptor_t&, XmlReaderWrap&, unsigned int, embed_values_dec_struct_t*); }; class EMBEDDED_PDV_template : public Base_Template { diff --git a/core/ASN_External.cc b/core/ASN_External.cc index 94836ac45..65e7e3dd0 100644 --- a/core/ASN_External.cc +++ b/core/ASN_External.cc @@ -102,9 +102,9 @@ namespace { /* anonymous namespace */ ASN_BER_TLV_t* BER_encode_TLV(const TTCN_Typedescriptor_t& p_td, unsigned p_coding) const; boolean BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, const ASN_BER_TLV_t& p_tlv, unsigned L_form); int XER_encode(const XERdescriptor_t& p_td, - TTCN_Buffer& p_buf, unsigned int flavor, int indent) const; + TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const; int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor); + unsigned int flavor, embed_values_dec_struct_t*); private: boolean BER_decode_set_selection(const ASN_BER_TLV_t& p_tlv); public: @@ -159,9 +159,9 @@ namespace { /* anonymous namespace */ ASN_BER_TLV_t* BER_encode_TLV(const TTCN_Typedescriptor_t& p_td, unsigned p_coding) const; boolean BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, const ASN_BER_TLV_t& p_tlv, unsigned L_form); int XER_encode(const XERdescriptor_t& p_td, - TTCN_Buffer& p_buf, unsigned int flavor, int indent) const; + TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const; int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor); + unsigned int flavor, embed_values_dec_struct_t*); }; /** Transform the information from the visible format to the encoding format @@ -398,7 +398,7 @@ namespace { /* anonymous namespace */ } int EXTERNALtransfer_encoding::XER_encode(const XERdescriptor_t& p_td, - TTCN_Buffer& p_buf, unsigned int flavor, int indent) const + TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const { int indenting = !is_canonical(flavor); int exer = is_exer(flavor); @@ -411,13 +411,13 @@ namespace { /* anonymous namespace */ ++indent; switch (union_selection) { case ALT_single__ASN1__type: - field_single__ASN1__type->XER_encode(EXTERNAL_encoding_singleASN_xer_, p_buf, flavor, indent); + field_single__ASN1__type->XER_encode(EXTERNAL_encoding_singleASN_xer_, p_buf, flavor, indent, 0); break; case ALT_octet__aligned: - field_octet__aligned ->XER_encode(EXTERNAL_encoding_octet_aligned_xer_, p_buf, flavor, indent); + field_octet__aligned ->XER_encode(EXTERNAL_encoding_octet_aligned_xer_, p_buf, flavor, indent, 0); break; case ALT_arbitrary: - field_arbitrary ->XER_encode(EXTERNAL_encoding_arbitrary_xer_, p_buf, flavor, indent); + field_arbitrary ->XER_encode(EXTERNAL_encoding_arbitrary_xer_, p_buf, flavor, indent, 0); break; case UNBOUND_VALUE: TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_UNBOUND, @@ -438,7 +438,7 @@ namespace { /* anonymous namespace */ } int EXTERNALtransfer_encoding::XER_decode(const XERdescriptor_t& p_td, - XmlReaderWrap& reader, unsigned int flavor) + XmlReaderWrap& reader, unsigned int flavor, embed_values_dec_struct_t*) { int exer = is_exer(flavor); int success = reader.Ok(), type, depth = -1; @@ -461,15 +461,15 @@ namespace { /* anonymous namespace */ switch (*name) { case 's': // single-ASN1-type - single__ASN1__type().XER_decode(EXTERNAL_encoding_singleASN_xer_, reader, flavor); + single__ASN1__type().XER_decode(EXTERNAL_encoding_singleASN_xer_, reader, flavor, 0); break; case 'o': // octet-aligned - octet__aligned().XER_decode(EXTERNAL_encoding_octet_aligned_xer_, reader, flavor); + octet__aligned().XER_decode(EXTERNAL_encoding_octet_aligned_xer_, reader, flavor, 0); break; case 'a': // arbitrary - arbitrary().XER_decode(EXTERNAL_encoding_arbitrary_xer_, reader, flavor); + arbitrary().XER_decode(EXTERNAL_encoding_arbitrary_xer_, reader, flavor, 0); break; default: @@ -555,7 +555,7 @@ namespace { /* anonymous namespace */ } int EXTERNALtransfer::XER_encode(const XERdescriptor_t& p_td, - TTCN_Buffer& p_buf, unsigned int flavor, int indent) const + TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const { int indenting = !is_canonical(flavor); int exer = is_exer(flavor); @@ -566,10 +566,10 @@ namespace { /* anonymous namespace */ p_buf.put_s((size_t)p_td.namelens[exer] - 1 + indenting, (const unsigned char*)p_td.names[exer]); ++indent; - field_direct__reference .XER_encode(EXTERNAL_direct_reference_xer_ , p_buf, flavor, indent); - field_indirect__reference .XER_encode(EXTERNAL_indirect_reference_xer_ , p_buf, flavor, indent); - field_data__value__descriptor.XER_encode(EXTERNAL_data_value_descriptor_xer_, p_buf, flavor, indent); - field_encoding .XER_encode(EXTERNAL_encoding_xer_ , p_buf, flavor, indent); + field_direct__reference .XER_encode(EXTERNAL_direct_reference_xer_ , p_buf, flavor, indent, 0); + field_indirect__reference .XER_encode(EXTERNAL_indirect_reference_xer_ , p_buf, flavor, indent, 0); + field_data__value__descriptor.XER_encode(EXTERNAL_data_value_descriptor_xer_, p_buf, flavor, indent, 0); + field_encoding .XER_encode(EXTERNAL_encoding_xer_ , p_buf, flavor, indent, 0); if (indenting) do_indent(p_buf, --indent); p_buf.put_c('<'); @@ -579,7 +579,8 @@ namespace { /* anonymous namespace */ return (int)p_buf.get_len() - encoded_length; } - int EXTERNALtransfer::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, unsigned int flavor) + int EXTERNALtransfer::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, + unsigned int flavor, embed_values_dec_struct_t*) { int exer = is_exer(flavor); int success = reader.Ok(), depth = -1; @@ -593,10 +594,10 @@ namespace { /* anonymous namespace */ } } - field_direct__reference .XER_decode(EXTERNAL_direct_reference_xer_ , reader, flavor); - field_indirect__reference .XER_decode(EXTERNAL_indirect_reference_xer_ , reader, flavor); - field_data__value__descriptor.XER_decode(EXTERNAL_data_value_descriptor_xer_, reader, flavor); - field_encoding .XER_decode(EXTERNAL_encoding_xer_ , reader, flavor); + field_direct__reference .XER_decode(EXTERNAL_direct_reference_xer_ , reader, flavor, 0); + field_indirect__reference .XER_decode(EXTERNAL_indirect_reference_xer_ , reader, flavor, 0); + field_data__value__descriptor.XER_decode(EXTERNAL_data_value_descriptor_xer_, reader, flavor, 0); + field_encoding .XER_decode(EXTERNAL_encoding_xer_ , reader, flavor, 0); for (success = reader.Read(); success == 1; success = reader.Read()) { int type = reader.NodeType(); @@ -694,7 +695,7 @@ boolean EXTERNAL::BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, const ASN_BE } int EXTERNAL::XER_encode(const XERdescriptor_t& p_td, - TTCN_Buffer& p_buf, unsigned int flavor, int indent) const + TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const { if(!is_bound()) { TTCN_EncDec_ErrorContext::error @@ -702,14 +703,14 @@ int EXTERNAL::XER_encode(const XERdescriptor_t& p_td, } EXTERNALtransfer xfer; xfer.load(*this); - return xfer.XER_encode(p_td, p_buf, flavor, indent); + return xfer.XER_encode(p_td, p_buf, flavor, indent, 0); } int EXTERNAL::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor) + unsigned int flavor, embed_values_dec_struct_t*) { EXTERNALtransfer xfer; - xfer.XER_decode(p_td, reader, flavor); + xfer.XER_decode(p_td, reader, flavor, 0); transfer(&xfer); return 1; // decode successful } @@ -3182,7 +3183,7 @@ void EXTERNAL::encode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, TTC case TTCN_EncDec::CT_XER: { TTCN_EncDec_ErrorContext ec("While XER-encoding type '%s': ", p_td.name); unsigned XER_coding=va_arg(pvar, unsigned); - XER_encode(*p_td.xer, p_buf, XER_coding, 0); + XER_encode(*p_td.xer, p_buf, XER_coding, 0, 0); break;} case TTCN_EncDec::CT_JSON: { TTCN_EncDec_ErrorContext ec("While JSON-encoding type '%s': ", p_td.name); @@ -3228,7 +3229,7 @@ void EXTERNAL::decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, TTC if (type==XML_READER_TYPE_ELEMENT) break; } - XER_decode(*p_td.xer, reader, XER_coding); + XER_decode(*p_td.xer, reader, XER_coding, 0); size_t bytes = reader.ByteConsumed(); p_buf.set_pos(bytes); break;} diff --git a/core/ASN_External.hh b/core/ASN_External.hh index cb926e145..9405c254c 100644 --- a/core/ASN_External.hh +++ b/core/ASN_External.hh @@ -403,9 +403,9 @@ public: ASN_BER_TLV_t* BER_encode_TLV(const TTCN_Typedescriptor_t& p_td, unsigned p_coding) const; boolean BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, const ASN_BER_TLV_t& p_tlv, unsigned L_form); int XER_encode(const XERdescriptor_t& p_td, - TTCN_Buffer& p_buf, unsigned int flavor, int indent) const; + TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const; int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor); + unsigned int flavor, embed_values_dec_struct_t*); }; class EXTERNAL_template : public Base_Template { diff --git a/core/ASN_Null.cc b/core/ASN_Null.cc index 800c53341..ab3c9a2c8 100644 --- a/core/ASN_Null.cc +++ b/core/ASN_Null.cc @@ -105,7 +105,16 @@ void ASN_NULL::encode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, case TTCN_EncDec::CT_XER: { TTCN_EncDec_ErrorContext ec("While XER-encoding type '%s': ", p_td.name); unsigned XER_coding=va_arg(pvar, unsigned); - XER_encode(*p_td.xer, p_buf, XER_coding, 0); + XER_encode(*p_td.xer, p_buf, XER_coding, 0, 0); + break;} + case TTCN_EncDec::CT_JSON: { + TTCN_EncDec_ErrorContext ec("While JSON-encoding type '%s': ", p_td.name); + if(!p_td.json) + TTCN_EncDec_ErrorContext::error_internal + ("No JSON descriptor available for type '%s'.", p_td.name); + JSON_Tokenizer tok(va_arg(pvar, int) != 0); + JSON_encode(p_td, tok); + p_buf.put_s(tok.get_buffer_length(), (const unsigned char*)tok.get_buffer()); break;} case TTCN_EncDec::CT_RAW: default: @@ -130,7 +139,7 @@ void ASN_NULL::decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, if(tlv.isComplete) p_buf.increase_pos(tlv.get_len()); break;} case TTCN_EncDec::CT_XER: { - TTCN_EncDec_ErrorContext ec("While XER-encoding type '%s': ", p_td.name); + TTCN_EncDec_ErrorContext ec("While XER-decoding type '%s': ", p_td.name); unsigned XER_coding=va_arg(pvar, unsigned); XmlReaderWrap reader(p_buf); int success = reader.Read(); @@ -139,10 +148,23 @@ void ASN_NULL::decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, if (type==XML_READER_TYPE_ELEMENT) break; } - XER_decode(*p_td.xer, reader, XER_coding); + XER_decode(*p_td.xer, reader, XER_coding, 0); size_t bytes = reader.ByteConsumed(); p_buf.set_pos(bytes); break;} + case TTCN_EncDec::CT_JSON: { + TTCN_EncDec_ErrorContext ec("While JSON-decoding type '%s': ", p_td.name); + if(!p_td.json) + TTCN_EncDec_ErrorContext::error_internal + ("No JSON descriptor available for type '%s'.", p_td.name); + JSON_Tokenizer tok((const char*)p_buf.get_data(), p_buf.get_len()); + if(JSON_decode(p_td, tok, false)<0) + ec.error(TTCN_EncDec::ET_INCOMPL_MSG, + "Can not decode type '%s', because invalid or incomplete" + " message was received" + , p_td.name); + p_buf.set_pos(tok.get_buf_pos()); + break;} case TTCN_EncDec::CT_RAW: default: TTCN_error("Unknown coding method requested to decode type '%s'", @@ -181,7 +203,7 @@ boolean ASN_NULL::BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, } int ASN_NULL::XER_encode(const XERdescriptor_t& p_td, - TTCN_Buffer& p_buf, unsigned int flavor, int indent ) const + TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const { int exer = is_exer(flavor); TTCN_EncDec_ErrorContext ec("While XER encoding NULL type: "); @@ -205,7 +227,7 @@ int ASN_NULL::XER_encode(const XERdescriptor_t& p_td, } int ASN_NULL::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor) + unsigned int flavor, embed_values_dec_struct_t*) { int exer = is_exer(flavor); TTCN_EncDec_ErrorContext ec("While XER decoding NULL type: "); @@ -235,6 +257,32 @@ int ASN_NULL::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, return 1; // decode successful } +int ASN_NULL::JSON_encode(const TTCN_Typedescriptor_t&, JSON_Tokenizer& p_tok) const +{ + if (!is_bound()) { + TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_UNBOUND, + "Encoding an unbound ASN.1 NULL value."); + return -1; + } + + return p_tok.put_next_token(JSON_TOKEN_LITERAL_NULL); +} + +int ASN_NULL::JSON_decode(const TTCN_Typedescriptor_t&, JSON_Tokenizer& p_tok, boolean p_silent) +{ + json_token_t token = JSON_TOKEN_NONE; + int dec_len = p_tok.get_next_token(&token, NULL, NULL); + if (JSON_TOKEN_ERROR == token) { + JSON_ERROR(TTCN_EncDec::ET_INVAL_MSG, JSON_DEC_BAD_TOKEN_ERROR, ""); + return JSON_ERROR_FATAL; + } + else if (JSON_TOKEN_LITERAL_NULL != token) { + return JSON_ERROR_INVALID_TOKEN; + } + bound_flag = TRUE; + return dec_len; +} + boolean operator==(asn_null_type, const ASN_NULL& other_value) { if (!other_value.is_bound()) TTCN_error("The right operand of comparison " diff --git a/core/ASN_Null.hh b/core/ASN_Null.hh index e83c564e8..dae43d0f8 100644 --- a/core/ASN_Null.hh +++ b/core/ASN_Null.hh @@ -69,9 +69,17 @@ public: boolean BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, const ASN_BER_TLV_t& p_tlv, unsigned L_form); int XER_encode(const XERdescriptor_t& p_td, - TTCN_Buffer& p_buf, unsigned int flavor, int indent) const; + TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const; int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor); + unsigned int flavor, embed_values_dec_struct_t*); + + /** Encodes accordingly to the JSON encoding rules. + * Returns the length of the encoded data. */ + int JSON_encode(const TTCN_Typedescriptor_t&, JSON_Tokenizer&) const; + + /** Decodes accordingly to the JSON decoding rules. + * Returns the length of the encoded data. */ + int JSON_decode(const TTCN_Typedescriptor_t&, JSON_Tokenizer&, boolean); }; extern boolean operator==(asn_null_type par_value, const ASN_NULL& other_value); diff --git a/core/Array.hh b/core/Array.hh index a85ab09dd..bfbfde7ea 100644 --- a/core/Array.hh +++ b/core/Array.hh @@ -85,6 +85,13 @@ public: } TTCN_Logger::log_event_str(" }"); } + +#ifdef TITAN_RUNTIME_2 + // Dummy functions, only used in record of/set of in RT2 (the referenced indices + // cannot be deleted, since arrays have a fixed size) + void add_refd_index(int) {} + void remove_refd_index(int) {} +#endif }; extern unsigned int get_port_array_index(int index_value, @@ -145,6 +152,13 @@ public: } TTCN_Logger::log_event_str(" }"); } + +#ifdef TITAN_RUNTIME_2 + // Dummy functions, only used in record of/set of in RT2 (the referenced indices + // cannot be deleted, since arrays have a fixed size) + void add_refd_index(int) {} + void remove_refd_index(int) {} +#endif }; //////////////////////////////////////////////////////////////////////////////// @@ -227,10 +241,12 @@ public: * Returns the length of the decoded data. */ int JSON_decode(const TTCN_Typedescriptor_t&, JSON_Tokenizer&, boolean); - // Dummy functions, only used in record of/set of (the referenced indices +#ifdef TITAN_RUNTIME_2 + // Dummy functions, only used in record of/set of in RT2 (the referenced indices // cannot be deleted, since arrays have a fixed size) void add_refd_index(int) {} void remove_refd_index(int) {} +#endif }; template <typename T_type, unsigned int array_size, int index_offset> diff --git a/core/Basetype.cc b/core/Basetype.cc index d253707d0..104e6b0f9 100644 --- a/core/Basetype.cc +++ b/core/Basetype.cc @@ -16,6 +16,7 @@ #include "JSON.hh" #include "XmlReader.hh" #include "Module_list.hh" +#include "Universal_charstring.hh" #include <openssl/bn.h> @@ -74,7 +75,7 @@ void Base_Type::encode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, if(!p_td.xer) TTCN_EncDec_ErrorContext::error_internal( "No XER descriptor available for type '%s'.", p_td.name); unsigned XER_coding=va_arg(pvar, unsigned); - XER_encode(*(p_td.xer),p_buf, XER_coding, 0); + XER_encode(*(p_td.xer),p_buf, XER_coding, 0, 0); p_buf.put_c('\n'); break;} case TTCN_EncDec::CT_JSON: { @@ -148,7 +149,7 @@ void Base_Type::decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, for (int success=reader.Read(); success==1; success=reader.Read()) { if (reader.NodeType() == XML_READER_TYPE_ELEMENT) break; } - XER_decode(*(p_td.xer), reader, XER_coding); + XER_decode(*(p_td.xer), reader, XER_coding, 0); size_t bytes = reader.ByteConsumed(); p_buf.set_pos(bytes); break;} @@ -966,14 +967,15 @@ int Base_Type::RAW_decode(const TTCN_Typedescriptor_t& p_td, } int Base_Type::XER_encode(const XERdescriptor_t& p_td, - TTCN_Buffer&, unsigned int, int) const + TTCN_Buffer&, unsigned int, int, embed_values_enc_struct_t*) const { TTCN_error("XER encoding requested for type '%-.*s' which has no" " XER encoding method.", p_td.namelens[0]-2, p_td.names[0]); return 0; } -int Base_Type::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap&, unsigned int) { +int Base_Type::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap&, + unsigned int, embed_values_dec_struct_t*) { TTCN_error("XER decoding requested for type '%-.*s' which has no" " XER decoding method.", p_td.namelens[0]-2, p_td.names[0]); return 0; @@ -1096,7 +1098,7 @@ const TTCN_Typedescriptor_t VERDICTTYPE_descr_={"verdicttype", NULL, NULL, NULL, &VERDICTTYPE_xer_, &VERDICTTYPE_json_, TTCN_Typedescriptor_t::DONTCARE}; const TTCN_Typedescriptor_t OBJID_descr_={"OBJECT IDENTIFIER", &OBJID_ber_, - NULL, NULL, &OBJID_xer_, NULL, TTCN_Typedescriptor_t::OBJID}; + NULL, NULL, &OBJID_xer_, &OBJID_json_, TTCN_Typedescriptor_t::OBJID}; const TTCN_Typedescriptor_t BITSTRING_descr_={"BIT STRING", &BITSTRING_ber_, &BITSTRING_raw_, NULL, &BITSTRING_xer_, &BITSTRING_json_, TTCN_Typedescriptor_t::DONTCARE}; @@ -1120,10 +1122,10 @@ const TTCN_Typedescriptor_t DEFAULT_descr_={"default", NULL, NULL, NULL, NULL, NULL, TTCN_Typedescriptor_t::DONTCARE}; const TTCN_Typedescriptor_t ASN_NULL_descr_={"NULL", &ASN_NULL_ber_, NULL, - NULL, &ASN_NULL_xer_, NULL, TTCN_Typedescriptor_t::DONTCARE}; + NULL, &ASN_NULL_xer_, &ASN_NULL_json_, TTCN_Typedescriptor_t::DONTCARE}; const TTCN_Typedescriptor_t ASN_ANY_descr_={"ANY", &ASN_ANY_ber_, NULL, - NULL, NULL, NULL, TTCN_Typedescriptor_t::DONTCARE}; + NULL, NULL, &ASN_ANY_json_, TTCN_Typedescriptor_t::DONTCARE}; const TTCN_Typedescriptor_t EXTERNAL_descr_={"EXTERNAL", &EXTERNAL_ber_, NULL, NULL, &EXTERNAL_xer_, NULL, TTCN_Typedescriptor_t::DONTCARE}; @@ -1141,7 +1143,7 @@ const TTCN_Typedescriptor_t UTF8String_descr_={"UTF8String", &UTF8String_ber_, NULL, NULL, &UTF8String_xer_, NULL, TTCN_Typedescriptor_t::UTF8STRING}; const TTCN_Typedescriptor_t ASN_ROID_descr_={"RELATIVE-OID", &ASN_ROID_ber_, - NULL, NULL, &ASN_ROID_xer_, NULL, TTCN_Typedescriptor_t::ROID}; + NULL, NULL, &ASN_ROID_xer_, &ASN_ROID_json_, TTCN_Typedescriptor_t::ROID}; const TTCN_Typedescriptor_t NumericString_descr_={"NumericString", &NumericString_ber_, NULL, NULL, &NumericString_xer_, NULL, TTCN_Typedescriptor_t::DONTCARE}; diff --git a/core/Basetype.hh b/core/Basetype.hh index fca5d1c0e..2e4937555 100644 --- a/core/Basetype.hh +++ b/core/Basetype.hh @@ -15,6 +15,7 @@ #include "Vector.hh" #ifdef TITAN_RUNTIME_2 #include "Struct_of.hh" +#include "XER.hh" #endif struct ASN_BERdescriptor_t; @@ -25,6 +26,8 @@ struct XERdescriptor_t; struct TTCN_JSONdescriptor_t; class XmlReaderWrap; class Module_Param; +struct embed_values_enc_struct_t; +struct embed_values_dec_struct_t; /** @brief Type descriptor * @@ -204,7 +207,7 @@ public: */ virtual void set_to_present(); /** @} */ - + virtual ~Base_Type() { } #endif @@ -444,15 +447,16 @@ public: * @param p_buf buffer * @param flavor one of XER_flavor values * @param indent indentation level + * @param emb_val embed values data (only relevant for record of types) * @return number of bytes written into the buffer */ VIRTUAL_IF_RUNTIME_2 int XER_encode(const XERdescriptor_t& p_td, - TTCN_Buffer& p_buf, unsigned int flavor, int indent) const; + TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t* emb_val) const; #ifdef TITAN_RUNTIME_2 virtual int XER_encode_negtest(const Erroneous_descriptor_t* /*p_err_descr*/, const XERdescriptor_t& /*p_td*/, TTCN_Buffer& /*p_buf*/, - unsigned int /*flavor*/, int /*indent*/) const; + unsigned int /*flavor*/, int /*indent*/, embed_values_enc_struct_t* /*emb_val*/) const; #endif /** Decode the current object from the supplied buffer. @@ -482,10 +486,11 @@ public: * @param p_td type descriptor * @param reader Wrapper around the XML processor * @param flavor one of XER_flavor values + * @param emb_val embed values data (only relevant for record of types) * @return number of bytes "consumed" */ VIRTUAL_IF_RUNTIME_2 int XER_decode(const XERdescriptor_t& p_td, - XmlReaderWrap& reader, unsigned int flavor); + XmlReaderWrap& reader, unsigned int flavor, embed_values_dec_struct_t* emb_val); /** Return an array of namespace declarations. * @@ -651,15 +656,17 @@ protected: } *val_ptr; Erroneous_descriptor_t* err_descr; - /** Stores the indices of elements that are referenced by 'out' and 'inout' parameters. - * These elements must not be deleted.*/ - Vector<int> refd_indices; - - /** Cached maximum value of \a refd_indices (default: -1).*/ - int max_refd_index; + struct refd_index_struct { + /** Stores the indices of elements that are referenced by 'out' and 'inout' parameters. + * These elements must not be deleted.*/ + Vector<int> refd_indices; + + /** Cached maximum value of \a refd_indices (default: -1).*/ + int max_refd_index; + } *refd_ind_ptr; static boolean compare_function(const Record_Of_Type *left_ptr, int left_index, const Record_Of_Type *right_ptr, int right_index); - Record_Of_Type() : val_ptr(NULL), err_descr(NULL), max_refd_index(-1) {} + Record_Of_Type() : val_ptr(NULL), err_descr(NULL), refd_ind_ptr(NULL) {} Record_Of_Type(null_type other_value); Record_Of_Type(const Record_Of_Type& other_value); /// Assignment disabled @@ -765,14 +772,14 @@ public: virtual int TEXT_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, Limit_Token_List&, boolean no_err=FALSE, boolean first_call=TRUE); virtual int XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, - unsigned int flavor, int indent) const; + unsigned int flavor, int indent, embed_values_enc_struct_t*) const; virtual int XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr, - const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, unsigned flavor, int indent) const; + const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, unsigned flavor, int indent, embed_values_enc_struct_t*) const; /// Helper for XER_encode_negtest int encode_element(int i, const Erroneous_values_t* err_vals, const Erroneous_descriptor_t* emb_descr, - TTCN_Buffer& p_buf, unsigned int flavor, int indent) const; - virtual int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, unsigned int); + TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t* emb_val) const; + virtual int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, unsigned int, embed_values_dec_struct_t*); virtual boolean isXerAttribute() const; virtual boolean isXmlValueList() const; @@ -905,11 +912,12 @@ public: virtual int TEXT_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, Limit_Token_List&, boolean no_err=FALSE, boolean first_call=TRUE); virtual int XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, - unsigned int flavor, int indent) const; + unsigned int flavor, int indent, embed_values_enc_struct_t*) const; virtual int XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr, const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, - unsigned int flavor, int indent) const; - virtual int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, unsigned int); + unsigned int flavor, int indent, embed_values_enc_struct_t*) const; + virtual int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, + unsigned int, embed_values_dec_struct_t*); /// @{ /// Methods overridden in the derived (generated) class virtual int get_xer_num_attr() const { return 0; /* default */ } @@ -932,7 +940,7 @@ public: private: /// Helper for XER_encode_negtest int encode_field(int i, const Erroneous_values_t* err_vals, const Erroneous_descriptor_t* emb_descr, - TTCN_Buffer& p_buf, unsigned int sub_flavor, int indent) const; + TTCN_Buffer& p_buf, unsigned int sub_flavor, int indent, embed_values_enc_struct_t* emb_val) const; }; //////////////////////////////////////////////////////////////////////////////// @@ -978,8 +986,9 @@ public: virtual int TEXT_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, Limit_Token_List&, boolean no_err=FALSE, boolean first_call=TRUE); virtual int XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, - unsigned int flavor, int indent) const; - virtual int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, unsigned int); + unsigned int flavor, int indent, embed_values_enc_struct_t*) const; + virtual int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, + unsigned int, embed_values_dec_struct_t*); /** Encodes accordingly to the JSON encoding rules. * Returns the length of the encoded data. */ diff --git a/core/Bitstring.cc b/core/Bitstring.cc index 513bc292b..d55b1fa8e 100644 --- a/core/Bitstring.cc +++ b/core/Bitstring.cc @@ -612,10 +612,10 @@ void BITSTRING::encode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, case TTCN_EncDec::CT_XER: { TTCN_EncDec_ErrorContext ec("While XER-encoding type '%s': ", p_td.name); unsigned XER_coding=va_arg(pvar, unsigned); - XER_encode(*p_td.xer, p_buf, XER_coding, 0); + XER_encode(*p_td.xer, p_buf, XER_coding, 0, 0); break;} case TTCN_EncDec::CT_JSON: { - TTCN_EncDec_ErrorContext ec("While XER-encoding type '%s': ", p_td.name); + TTCN_EncDec_ErrorContext ec("While JSON-encoding type '%s': ", p_td.name); if(!p_td.json) TTCN_EncDec_ErrorContext::error_internal ("No JSON descriptor available for type '%s'.", p_td.name); @@ -665,7 +665,7 @@ void BITSTRING::decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, , p_td.name); break;} case TTCN_EncDec::CT_XER: { - TTCN_EncDec_ErrorContext ec("While XER-encoding type '%s': ", p_td.name); + TTCN_EncDec_ErrorContext ec("While XER-decoding type '%s': ", p_td.name); unsigned XER_coding=va_arg(pvar, unsigned); XmlReaderWrap reader(p_buf); int success = reader.Read(); @@ -674,7 +674,7 @@ void BITSTRING::decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, if (type==XML_READER_TYPE_ELEMENT) break; } - XER_decode(*p_td.xer, reader, XER_coding); + XER_decode(*p_td.xer, reader, XER_coding, 0); size_t bytes = reader.ByteConsumed(); p_buf.set_pos(bytes); break;} @@ -1008,7 +1008,7 @@ int BITSTRING::RAW_decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& buff, } int BITSTRING::XER_encode(const XERdescriptor_t& p_td, - TTCN_Buffer& p_buf, unsigned int flavor, int indent) const + TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const { if(!is_bound()) { TTCN_EncDec_ErrorContext::error @@ -1032,7 +1032,7 @@ int BITSTRING::XER_encode(const XERdescriptor_t& p_td, } int BITSTRING::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor) + unsigned int flavor, embed_values_dec_struct_t*) { int exer = is_exer(flavor); int success = reader.Ok(), depth = -1, type; diff --git a/core/Bitstring.hh b/core/Bitstring.hh index ed25023a3..f10616150 100644 --- a/core/Bitstring.hh +++ b/core/Bitstring.hh @@ -172,8 +172,8 @@ public: int RAW_decode(const TTCN_Typedescriptor_t& , TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE, int sel_field=-1, boolean first_call=TRUE); - int XER_encode(const XERdescriptor_t&, TTCN_Buffer&, unsigned int, int) const; - int XER_decode(const XERdescriptor_t&, XmlReaderWrap& reader, unsigned int); + int XER_encode(const XERdescriptor_t&, TTCN_Buffer&, unsigned int, int, embed_values_enc_struct_t*) const; + int XER_decode(const XERdescriptor_t&, XmlReaderWrap& reader, unsigned int, embed_values_dec_struct_t*); /** Encodes accordingly to the JSON encoding rules. * Returns the length of the encoded data. */ diff --git a/core/Boolean.cc b/core/Boolean.cc index 80bc0ec7b..210ff8576 100644 --- a/core/Boolean.cc +++ b/core/Boolean.cc @@ -204,7 +204,7 @@ void BOOLEAN::encode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, case TTCN_EncDec::CT_XER: { TTCN_EncDec_ErrorContext ec("While XER-encoding type '%s': ", p_td.name); unsigned XER_coding=va_arg(pvar, unsigned); - XER_encode(*p_td.xer, p_buf, XER_coding, 0); + XER_encode(*p_td.xer, p_buf, XER_coding, 0, 0); break;} case TTCN_EncDec::CT_JSON: { TTCN_EncDec_ErrorContext ec("While JSON-encoding type '%s': ", p_td.name); @@ -275,7 +275,7 @@ void BOOLEAN::decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, , p_td.name); break;} case TTCN_EncDec::CT_XER: { - TTCN_EncDec_ErrorContext ec("While XER-encoding type '%s': ", p_td.name); + TTCN_EncDec_ErrorContext ec("While XER-decoding type '%s': ", p_td.name); unsigned XER_coding=va_arg(pvar, unsigned); XmlReaderWrap reader(p_buf); for (int success = reader.Read(); success==1; success=reader.Read()) { @@ -283,7 +283,7 @@ void BOOLEAN::decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, if (type==XML_READER_TYPE_ELEMENT) break; } - XER_decode(*p_td.xer, reader, XER_coding); + XER_decode(*p_td.xer, reader, XER_coding, 0); size_t bytes = reader.ByteConsumed(); p_buf.set_pos(bytes); break;} @@ -575,7 +575,7 @@ int BOOLEAN::RAW_decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& buff, } int BOOLEAN::XER_encode(const XERdescriptor_t& p_td, - TTCN_Buffer& p_buf, unsigned int flavor, int indent) const + TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const { if(!is_bound()) { TTCN_EncDec_ErrorContext::error @@ -608,7 +608,7 @@ int BOOLEAN::XER_encode(const XERdescriptor_t& p_td, } int BOOLEAN::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor) + unsigned int flavor, embed_values_dec_struct_t*) { const boolean exer = is_exer(flavor); int XMLValueList = !exer && is_record_of(flavor); diff --git a/core/Boolean.hh b/core/Boolean.hh index 2a1c07b99..0807ea524 100644 --- a/core/Boolean.hh +++ b/core/Boolean.hh @@ -102,9 +102,9 @@ public: int TEXT_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, Limit_Token_List&, boolean no_err=FALSE, boolean first_call=TRUE); int XER_encode(const XERdescriptor_t& p_td, - TTCN_Buffer& p_buf, unsigned int flavor, int indent) const; + TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const; int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor); + unsigned int flavor, embed_values_dec_struct_t*); /** Encodes accordingly to the JSON encoding rules. * Returns the length of the encoded data. */ diff --git a/core/Charstring.cc b/core/Charstring.cc index c0cbe3375..180fc91fd 100644 --- a/core/Charstring.cc +++ b/core/Charstring.cc @@ -731,7 +731,7 @@ void CHARSTRING::encode(const TTCN_Typedescriptor_t& p_td, case TTCN_EncDec::CT_XER: { TTCN_EncDec_ErrorContext ec("While XER-encoding type '%s': ", p_td.name); unsigned XER_coding=va_arg(pvar, unsigned); - XER_encode(*p_td.xer, p_buf, XER_coding, 0); + XER_encode(*p_td.xer, p_buf, XER_coding, 0, 0); p_buf.put_c('\n'); break;} case TTCN_EncDec::CT_JSON: { @@ -804,7 +804,7 @@ void CHARSTRING::decode(const TTCN_Typedescriptor_t& p_td, , p_td.name); break;} case TTCN_EncDec::CT_XER: { - TTCN_EncDec_ErrorContext ec("While XER-encoding type '%s': ", p_td.name); + TTCN_EncDec_ErrorContext ec("While XER-decoding type '%s': ", p_td.name); unsigned XER_coding=va_arg(pvar, unsigned); XmlReaderWrap reader(p_buf); int success = reader.Read(); @@ -813,7 +813,7 @@ void CHARSTRING::decode(const TTCN_Typedescriptor_t& p_td, if (type==XML_READER_TYPE_ELEMENT) break; } - XER_decode(*p_td.xer, reader, XER_coding); + XER_decode(*p_td.xer, reader, XER_coding, 0); size_t bytes = reader.ByteConsumed(); p_buf.set_pos(bytes); break;} @@ -1145,7 +1145,7 @@ extern const char cb64[]= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; int CHARSTRING::XER_encode(const XERdescriptor_t& p_td, - TTCN_Buffer& p_buf, unsigned int flavor, int indent) const + TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const { if(!is_bound()) { TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_UNBOUND, @@ -1270,7 +1270,7 @@ unsigned int xlate(cbyte*in, int phase, unsigned char*dest) { } int CHARSTRING::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor) { + unsigned int flavor, embed_values_dec_struct_t*) { int exer = is_exer(flavor); int success = reader.Ok(), depth = -1; diff --git a/core/Charstring.hh b/core/Charstring.hh index 22a2c5634..4ca62b41b 100644 --- a/core/Charstring.hh +++ b/core/Charstring.hh @@ -205,8 +205,8 @@ public: TTCN_Buffer&) const; int TEXT_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, Limit_Token_List&, boolean no_err=FALSE, boolean first_call=TRUE); - int XER_encode(const XERdescriptor_t&, TTCN_Buffer&, unsigned int, int) const; - int XER_decode(const XERdescriptor_t&, XmlReaderWrap& reader, unsigned int); + int XER_encode(const XERdescriptor_t&, TTCN_Buffer&, unsigned int, int, embed_values_enc_struct_t*) const; + int XER_decode(const XERdescriptor_t&, XmlReaderWrap& reader, unsigned int, embed_values_dec_struct_t*); /** Returns the charstring in the format a string would appear in C or TTCN-3 code. * Inserts double quotation marks to the beginning and end of the string and diff --git a/core/Float.cc b/core/Float.cc index 5a3d83db6..50c1c919e 100644 --- a/core/Float.cc +++ b/core/Float.cc @@ -290,7 +290,7 @@ void FLOAT::encode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, case TTCN_EncDec::CT_XER: { TTCN_EncDec_ErrorContext ec("While XER-encoding type '%s': ", p_td.name); unsigned XER_coding=va_arg(pvar, unsigned); - XER_encode(*p_td.xer, p_buf, XER_coding, 0); + XER_encode(*p_td.xer, p_buf, XER_coding, 0, 0); break;} case TTCN_EncDec::CT_JSON: { TTCN_EncDec_ErrorContext ec("While JSON-encoding type '%s': ", p_td.name); @@ -343,7 +343,7 @@ void FLOAT::decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, , p_td.name); break;} case TTCN_EncDec::CT_XER: { - TTCN_EncDec_ErrorContext ec("While XER-encoding type '%s': ", p_td.name); + TTCN_EncDec_ErrorContext ec("While XER-decoding type '%s': ", p_td.name); unsigned XER_coding=va_arg(pvar, unsigned); XmlReaderWrap reader(p_buf); for (int success = reader.Read(); success==1; success=reader.Read()) { @@ -351,7 +351,7 @@ void FLOAT::decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, if (type==XML_READER_TYPE_ELEMENT) break; } - XER_decode(*p_td.xer, reader, XER_coding); + XER_decode(*p_td.xer, reader, XER_coding, 0); size_t bytes = reader.ByteConsumed(); p_buf.set_pos(bytes); break;} @@ -765,7 +765,7 @@ int FLOAT::RAW_decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& buff, } int FLOAT::XER_encode(const XERdescriptor_t& p_td, - TTCN_Buffer& p_buf, unsigned int flavor, int indent) const + TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const { if(!is_bound()) { TTCN_EncDec_ErrorContext::error( @@ -794,7 +794,7 @@ int FLOAT::XER_encode(const XERdescriptor_t& p_td, } int FLOAT::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor) + unsigned int flavor, embed_values_dec_struct_t*) { int exer = is_exer(flavor); int success = reader.Ok(), depth = -1; diff --git a/core/Float.hh b/core/Float.hh index 76e32b47f..013d39de7 100644 --- a/core/Float.hh +++ b/core/Float.hh @@ -136,9 +136,9 @@ public: int sel_field=-1, boolean first_call=TRUE); int XER_encode(const XERdescriptor_t& p_td, - TTCN_Buffer& p_buf, unsigned int flavor, int indent) const; + TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const; int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor); + unsigned int flavor, embed_values_dec_struct_t*); /** Encodes accordingly to the JSON encoding rules. * Returns the length of the encoded data. */ diff --git a/core/Hexstring.cc b/core/Hexstring.cc index 04c67465a..27c7e4af4 100644 --- a/core/Hexstring.cc +++ b/core/Hexstring.cc @@ -623,7 +623,7 @@ void HEXSTRING::encode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, case TTCN_EncDec::CT_XER: { TTCN_EncDec_ErrorContext ec("While XER-encoding type '%s': ", p_td.name); unsigned XER_coding=va_arg(pvar, unsigned); - XER_encode(*p_td.xer, p_buf, XER_coding, 0); + XER_encode(*p_td.xer, p_buf, XER_coding, 0, 0); break;} case TTCN_EncDec::CT_JSON: { TTCN_EncDec_ErrorContext ec("While JSON-encoding type '%s': ", p_td.name); @@ -665,7 +665,7 @@ void HEXSTRING::decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, " message was received", p_td.name); break;} case TTCN_EncDec::CT_XER: { - TTCN_EncDec_ErrorContext ec("While XER-encoding type '%s': ", p_td.name); + TTCN_EncDec_ErrorContext ec("While XER-decoding type '%s': ", p_td.name); unsigned XER_coding=va_arg(pvar, unsigned); XmlReaderWrap reader(p_buf); int success = reader.Read(); @@ -674,12 +674,12 @@ void HEXSTRING::decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, if (type==XML_READER_TYPE_ELEMENT) break; } - XER_decode(*p_td.xer, reader, XER_coding); + XER_decode(*p_td.xer, reader, XER_coding, 0); size_t bytes = reader.ByteConsumed(); p_buf.set_pos(bytes); break;} case TTCN_EncDec::CT_JSON: { - TTCN_EncDec_ErrorContext ec("While JSON-encoding type '%s': ", p_td.name); + TTCN_EncDec_ErrorContext ec("While JSON-decoding type '%s': ", p_td.name); if(!p_td.json) TTCN_EncDec_ErrorContext::error_internal ("No JSON descriptor available for type '%s'.", p_td.name); @@ -790,7 +790,7 @@ extern char base64_decoder_table[256]; extern const char cb64[]; int HEXSTRING::XER_encode(const XERdescriptor_t& p_td, - TTCN_Buffer& p_buf, unsigned int flavor, int indent) const + TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const { if(!is_bound()) { TTCN_EncDec_ErrorContext::error @@ -864,7 +864,7 @@ Because of this, the bit shifting is different. The first three bytes */ int HEXSTRING::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor) + unsigned int flavor, embed_values_dec_struct_t*) { int exer = is_exer(flavor); int success = reader.Ok(), depth = -1, type; diff --git a/core/Hexstring.hh b/core/Hexstring.hh index c4392ab1e..1fd91e888 100644 --- a/core/Hexstring.hh +++ b/core/Hexstring.hh @@ -125,9 +125,9 @@ public: int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE, int sel_field=-1, boolean first_call=TRUE); int XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, - unsigned int flavor, int indent) const; + unsigned int flavor, int indent, embed_values_enc_struct_t*) const; int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor); + unsigned int flavor, embed_values_dec_struct_t*); /** Encodes accordingly to the JSON encoding rules. * Returns the length of the encoded data. */ diff --git a/core/Integer.cc b/core/Integer.cc index 331cd944f..b99752758 100644 --- a/core/Integer.cc +++ b/core/Integer.cc @@ -715,7 +715,7 @@ void INTEGER::encode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, case TTCN_EncDec::CT_XER: { TTCN_EncDec_ErrorContext ec("While XER-encoding type '%s': ", p_td.name); unsigned XER_coding=va_arg(pvar, unsigned); - XER_encode(*p_td.xer, p_buf, XER_coding, 0); + XER_encode(*p_td.xer, p_buf, XER_coding, 0, 0); break;} case TTCN_EncDec::CT_JSON: { TTCN_EncDec_ErrorContext ec("While JSON-encoding type '%s': ", p_td.name); @@ -794,7 +794,7 @@ void INTEGER::decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, if (type==XML_READER_TYPE_ELEMENT) break; } - XER_decode(*p_td.xer, reader, XER_coding); + XER_decode(*p_td.xer, reader, XER_coding, 0); size_t bytes = reader.ByteConsumed(); p_buf.set_pos(bytes); break;} @@ -1265,7 +1265,7 @@ int INTEGER::RAW_decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& buff, } int INTEGER::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, - unsigned int flavor, int indent) const + unsigned int flavor, int indent, embed_values_enc_struct_t*) const { if (!is_bound()) { TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_UNBOUND, @@ -1295,7 +1295,7 @@ int INTEGER::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, } int INTEGER::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor) + unsigned int flavor, embed_values_dec_struct_t*) { const boolean exer = is_exer(flavor); int depth = -1, success = reader.Ok(), type; diff --git a/core/Integer.hh b/core/Integer.hh index 1e48b62bb..bf6ec359c 100644 --- a/core/Integer.hh +++ b/core/Integer.hh @@ -161,11 +161,11 @@ public: /** @brief Encode according to XML Encoding Rules. **/ int XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, unsigned int flavor, - int indent) const; + int indent, embed_values_enc_struct_t*) const; /** @brief Decode according to XML Encoding Rules. **/ int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor); + unsigned int flavor, embed_values_dec_struct_t*); /** Encodes accordingly to the JSON encoding rules. * Returns the length of the encoded data. */ diff --git a/core/JSON.cc b/core/JSON.cc index 59b62db0f..ad429c413 100644 --- a/core/JSON.cc +++ b/core/JSON.cc @@ -47,3 +47,13 @@ const TTCN_JSONdescriptor_t TeletexString_json_ = { false, NULL, false, NULL }; const TTCN_JSONdescriptor_t VideotexString_json_ = { false, NULL, false, NULL }; const TTCN_JSONdescriptor_t VisibleString_json_ = { false, NULL, false, NULL }; + +const TTCN_JSONdescriptor_t ASN_NULL_json_ = { false, NULL, false, NULL }; + +const TTCN_JSONdescriptor_t OBJID_json_ = { false, NULL, false, NULL }; + +const TTCN_JSONdescriptor_t ASN_ROID_json_ = { false, NULL, false, NULL }; + +const TTCN_JSONdescriptor_t ASN_ANY_json_ = { false, NULL, false, NULL }; + +const TTCN_JSONdescriptor_t ENUMERATED_json_ = { false, NULL, false, NULL }; diff --git a/core/JSON.hh b/core/JSON.hh index 39cbec482..6c9357d69 100644 --- a/core/JSON.hh +++ b/core/JSON.hh @@ -64,6 +64,11 @@ extern const TTCN_JSONdescriptor_t IA5String_json_; extern const TTCN_JSONdescriptor_t TeletexString_json_; extern const TTCN_JSONdescriptor_t VideotexString_json_; extern const TTCN_JSONdescriptor_t VisibleString_json_; +extern const TTCN_JSONdescriptor_t ASN_NULL_json_; +extern const TTCN_JSONdescriptor_t OBJID_json_; +extern const TTCN_JSONdescriptor_t ASN_ROID_json_; +extern const TTCN_JSONdescriptor_t ASN_ANY_json_; +extern const TTCN_JSONdescriptor_t ENUMERATED_json_; /** JSON decoder error codes */ enum json_decode_error { diff --git a/core/Makefile b/core/Makefile index bb6ac4d94..ff35320ae 100644 --- a/core/Makefile +++ b/core/Makefile @@ -78,7 +78,8 @@ LoggerPluginManager.cc LegacyLogger.cc LoggingBits.cc \ Module_list.cc Objid.cc Octetstring.cc Parallel_main.cc Port.cc RAW.cc \ Runtime.cc Single_main.cc Snapshot.cc Struct_of.cc Template.cc TEXT.cc \ Textbuf.cc Timer.cc Param_Types.cc Universal_charstring.cc \ -Verdicttype.cc XER.cc XmlReader.cc TitanLoggerControlImpl.cc TCov.cc JSON.cc $(RT2_SOURCES) +Verdicttype.cc XER.cc XmlReader.cc TitanLoggerControlImpl.cc TCov.cc JSON.cc \ +Profiler.cc $(RT2_SOURCES) # Keep GENERATED_SOURCES at the beginning. This may speed up parallel builds # by starting early the compilation of the largest files. @@ -156,7 +157,7 @@ Port.hh Event_Handler.hh Struct_of.hh Array.hh Optional.hh Textbuf.hh Encdec.hh Module_list.hh Parameters.h Addfunc.hh RAW.hh BER.hh TEXT.hh ASN_Null.hh \ ASN_Any.hh ASN_External.hh ASN_EmbeddedPDV.hh ASN_CharacterString.hh XER.hh \ XmlReader.hh cversion.h TitanLoggerControl.ttcn TitanLoggerApi.xsd Vector.hh \ -JSON.hh +JSON.hh Profiler.hh # Copied during "make install" ifdef REGEX_DIR diff --git a/core/Objid.cc b/core/Objid.cc index 00d37bab4..79fe281c0 100644 --- a/core/Objid.cc +++ b/core/Objid.cc @@ -264,7 +264,16 @@ void OBJID::encode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, case TTCN_EncDec::CT_XER: { TTCN_EncDec_ErrorContext ec("While XER-encoding type '%s': ", p_td.name); unsigned XER_coding=va_arg(pvar, unsigned); - XER_encode(*p_td.xer, p_buf, XER_coding, 0); + XER_encode(*p_td.xer, p_buf, XER_coding, 0, 0); + break;} + case TTCN_EncDec::CT_JSON: { + TTCN_EncDec_ErrorContext ec("While JSON-encoding type '%s': ", p_td.name); + if(!p_td.json) + TTCN_EncDec_ErrorContext::error_internal + ("No JSON descriptor available for type '%s'.", p_td.name); + JSON_Tokenizer tok(va_arg(pvar, int) != 0); + JSON_encode(p_td, tok); + p_buf.put_s(tok.get_buffer_length(), (const unsigned char*)tok.get_buffer()); break;} default: TTCN_error("Unknown coding method requested to encode type '%s'", @@ -293,7 +302,7 @@ void OBJID::decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, ("No RAW descriptor available for type '%s'.", p_td.name); break;} case TTCN_EncDec::CT_XER: { - TTCN_EncDec_ErrorContext ec("While XER-encoding type '%s': ", p_td.name); + TTCN_EncDec_ErrorContext ec("While XER-decoding type '%s': ", p_td.name); unsigned XER_coding=va_arg(pvar, unsigned); XmlReaderWrap reader(p_buf); int success = reader.Read(); @@ -302,10 +311,23 @@ void OBJID::decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, if (type==XML_READER_TYPE_ELEMENT) break; } - XER_decode(*p_td.xer, reader, XER_coding); + XER_decode(*p_td.xer, reader, XER_coding, 0); size_t bytes = reader.ByteConsumed(); p_buf.set_pos(bytes); break;} + case TTCN_EncDec::CT_JSON: { + TTCN_EncDec_ErrorContext ec("While JSON-decoding type '%s': ", p_td.name); + if(!p_td.json) + TTCN_EncDec_ErrorContext::error_internal + ("No JSON descriptor available for type '%s'.", p_td.name); + JSON_Tokenizer tok((const char*)p_buf.get_data(), p_buf.get_len()); + if(JSON_decode(p_td, tok, false)<0) + ec.error(TTCN_EncDec::ET_INCOMPL_MSG, + "Can not decode type '%s', because invalid or incomplete" + " message was received" + , p_td.name); + p_buf.set_pos(tok.get_buf_pos()); + break;} default: TTCN_error("Unknown coding method requested to decode type '%s'", p_td.name); @@ -446,7 +468,7 @@ boolean OBJID::BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, int OBJID::XER_encode(const XERdescriptor_t& p_td, - TTCN_Buffer& p_buf, unsigned int flavor, int indent ) const + TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const { if(!is_bound()) { TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_UNBOUND, @@ -478,8 +500,33 @@ int OBJID::XER_encode(const XERdescriptor_t& p_td, return (int)p_buf.get_len() - encoded_length; } +void OBJID::from_string(char* p_str) +{ + // Count dots to find number of components. (1 dot = 2 components, etc.) + unsigned comps = 1; + const char *p; + for (p = p_str; *p != 0; ++p) { + if (*p == '.') ++comps; + } + // p now points at the end of the string. If it was empty, then there were + // no components; compensate the fact that we started at 1. + init_struct((p != p_str) ? comps : 0); + + char *beg, *end = 0; + comps = 0; + for (beg = p_str; beg < p; ++beg) { + errno = 0; + long ret = strtol(beg, &end, 10); + if (errno) break; + + // TODO check value for too big ? + (*this)[comps++] = ret; + beg = end; // move to the dot; will move past it when incremented + } +} + int OBJID::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor) + unsigned int flavor, embed_values_dec_struct_t*) { int exer = is_exer(flavor); int success = reader.Ok(), depth = -1; @@ -497,27 +544,8 @@ int OBJID::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_INVAL_MSG, "Bogus object identifier"); return 0; } - // Count dots to find number of components. (1 dot = 2 components, etc.) - unsigned comps = 1; - const char *p; - for (p = val; *p != 0; ++p) { - if (*p == '.') ++comps; - } - // p now points at the end of the string. If it was empty, then there were - // no components; compensate the fact that we started at 1. - init_struct((p != val) ? comps : 0); - - char *beg, *end = 0; - comps = 0; - for (beg = val; beg < p; ++beg) { - errno = 0; - long ret = strtol(beg, &end, 10); - if (errno) break; - - // TODO check value for too big ? - (*this)[comps++] = ret; - beg = end; // move to the dot; will move past it when incremented - } + + from_string(val); xmlFree(val); } @@ -532,6 +560,69 @@ int OBJID::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, return 1; // decode successful } +int OBJID::JSON_encode(const TTCN_Typedescriptor_t&, JSON_Tokenizer& p_tok) const +{ + if (!is_bound()) { + TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_UNBOUND, + "Encoding an unbound object identifier value."); + return -1; + } + + char* objid_str = mcopystrn("\"", 1); + for (int i = 0; i < val_ptr->n_components; ++i) { + objid_str = mputprintf(objid_str, "%s" OBJID_FMT, (i > 0 ? "." : ""), val_ptr->components_ptr[i]); + } + objid_str = mputstrn(objid_str, "\"", 1); + int enc_len = p_tok.put_next_token(JSON_TOKEN_STRING, objid_str); + Free(objid_str); + return enc_len; +} + +int OBJID::JSON_decode(const TTCN_Typedescriptor_t& p_td, JSON_Tokenizer& p_tok, boolean p_silent) +{ + json_token_t token = JSON_TOKEN_NONE; + char* value = 0; + size_t value_len = 0; + boolean error = false; + int dec_len = 0; + boolean use_default = p_td.json->default_value && 0 == p_tok.get_buffer_length(); + if (use_default) { + // No JSON data in the buffer -> use default value + value = (char*)p_td.json->default_value; + value_len = strlen(value); + } else { + dec_len = p_tok.get_next_token(&token, &value, &value_len); + } + if (JSON_TOKEN_ERROR == token) { + JSON_ERROR(TTCN_EncDec::ET_INVAL_MSG, JSON_DEC_BAD_TOKEN_ERROR, ""); + return JSON_ERROR_FATAL; + } + else if (JSON_TOKEN_STRING == token || use_default) { + if (use_default || (value_len > 2 && value[0] == '\"' && value[value_len - 1] == '\"')) { + if (!use_default) { + // The default value doesn't have quotes around it + value_len -= 2; + ++value; + } + // need a null-terminated string + char* value2 = mcopystrn(value, value_len); + from_string(value2); + Free(value2); + } + } + else { + return JSON_ERROR_INVALID_TOKEN; + } + + if (error) { + JSON_ERROR(TTCN_EncDec::ET_INVAL_MSG, JSON_DEC_FORMAT_ERROR, "string", "object identifier"); + if (p_silent) { + clean_up(); + } + return JSON_ERROR_FATAL; + } + return dec_len; +} void OBJID_template::clean_up() { diff --git a/core/Objid.hh b/core/Objid.hh index c5828b55c..b2b7489c9 100644 --- a/core/Objid.hh +++ b/core/Objid.hh @@ -27,6 +27,10 @@ class OBJID : public Base_Type { void init_struct(int n_components); void copy_value(); + + /** Initializes the object identifier with a string containing the components + * separated by dots. */ + void from_string(char* p_str); public: typedef unsigned int objid_element; @@ -83,9 +87,17 @@ public: boolean BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, const ASN_BER_TLV_t& p_tlv, unsigned L_form); int XER_encode(const XERdescriptor_t& p_td, - TTCN_Buffer& p_buf, unsigned int flavor, int indent) const; + TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const; int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor); + unsigned int flavor, embed_values_dec_struct_t*); + + /** Encodes accordingly to the JSON encoding rules. + * Returns the length of the encoded data. */ + int JSON_encode(const TTCN_Typedescriptor_t&, JSON_Tokenizer&) const; + + /** Decodes accordingly to the JSON decoding rules. + * Returns the length of the encoded data. */ + int JSON_decode(const TTCN_Typedescriptor_t&, JSON_Tokenizer&, boolean); }; // objid template class diff --git a/core/Octetstring.cc b/core/Octetstring.cc index 948c22562..644ca5096 100644 --- a/core/Octetstring.cc +++ b/core/Octetstring.cc @@ -573,7 +573,7 @@ void OCTETSTRING::encode(const TTCN_Typedescriptor_t& p_td, case TTCN_EncDec::CT_XER: { TTCN_EncDec_ErrorContext ec("While XER-encoding type '%s': ", p_td.name); unsigned XER_coding=va_arg(pvar, unsigned); - XER_encode(*p_td.xer, p_buf, XER_coding, 0); + XER_encode(*p_td.xer, p_buf, XER_coding, 0, 0); break;} case TTCN_EncDec::CT_JSON: { TTCN_EncDec_ErrorContext ec("While TEXT-encoding type '%s': ", p_td.name); @@ -645,7 +645,7 @@ void OCTETSTRING::decode(const TTCN_Typedescriptor_t& p_td, , p_td.name); break;} case TTCN_EncDec::CT_XER: { - TTCN_EncDec_ErrorContext ec("While XER-encoding type '%s': ", p_td.name); + TTCN_EncDec_ErrorContext ec("While XER-decoding type '%s': ", p_td.name); unsigned XER_coding=va_arg(pvar, unsigned); XmlReaderWrap reader(p_buf); int success = reader.Read(); @@ -654,7 +654,7 @@ void OCTETSTRING::decode(const TTCN_Typedescriptor_t& p_td, if (type==XML_READER_TYPE_ELEMENT) break; } - XER_decode(*p_td.xer, reader, XER_coding); + XER_decode(*p_td.xer, reader, XER_coding, 0); size_t bytes = reader.ByteConsumed(); p_buf.set_pos(bytes); break;} @@ -849,7 +849,7 @@ extern unsigned int xlate(cbyte* in, int phase, unsigned char* dest); extern const char cb64[]; int OCTETSTRING::XER_encode(const XERdescriptor_t& p_td, - TTCN_Buffer& p_buf, unsigned int flavor, int indent) const + TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const { if(!is_bound()) { TTCN_EncDec_ErrorContext::error @@ -894,7 +894,7 @@ int OCTETSTRING::XER_encode(const XERdescriptor_t& p_td, } int OCTETSTRING::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor) + unsigned int flavor, embed_values_dec_struct_t*) { int exer = is_exer(flavor); int success = reader.Ok(), depth = -1, type; diff --git a/core/Octetstring.hh b/core/Octetstring.hh index 8c8e9b461..bb1428aab 100644 --- a/core/Octetstring.hh +++ b/core/Octetstring.hh @@ -150,9 +150,9 @@ public: int TEXT_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, Limit_Token_List&, boolean no_err=FALSE, boolean first_call=TRUE); int XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, - unsigned int flavor, int indent) const; + unsigned int flavor, int indent, embed_values_enc_struct_t*) const; int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor); + unsigned int flavor, embed_values_dec_struct_t*); /** Encodes accordingly to the JSON encoding rules. * Returns the length of the encoded data. */ diff --git a/core/Optional.hh b/core/Optional.hh index 7c47aacc9..85e14757f 100644 --- a/core/Optional.hh +++ b/core/Optional.hh @@ -26,19 +26,23 @@ enum optional_sel { OPTIONAL_UNBOUND, OPTIONAL_OMIT, OPTIONAL_PRESENT }; template <typename T_type> class OPTIONAL : public Base_Type { + /** The value, if present (owned by OPTIONAL) + * In Runtime2 the pointer is null, when the value is not present. + * In Runtime1 its presence is indicated by the optional_selection member. */ + T_type *optional_value; + /** Specifies the state of the optional field - * @tricky The optional value can be modified through parameter references, + * @tricky In Runtime2 the optional value can be modified through parameter references, * in which case this member variable will not be updated. Always use the function * get_selection() instead of directly referencing this variable. */ - optional_sel optional_selection; - - /** The value, if present (owned by OPTIONAL) */ - T_type *optional_value; + optional_sel optional_selection; +#ifdef TITAN_RUNTIME_2 /** Stores the number of elements referenced by 'out' and 'inout' parameters, - * if the optional field is a record of/set of/array. + * if the optional field is a record of/set of/array (only in Runtime2). * If at least one element is referenced, the value must not be deleted. */ - int param_refs; + int param_refs; +#endif /** Set the optional value to present. * If the value was already present, does nothing. @@ -55,9 +59,10 @@ public: void set_to_present() { if (optional_selection != OPTIONAL_PRESENT) { optional_selection = OPTIONAL_PRESENT; - if (optional_value == NULL) { +#ifdef TITAN_RUNTIME_2 + if (optional_value == NULL) +#endif optional_value = new T_type; - } } } @@ -72,6 +77,7 @@ public: inline #endif void set_to_omit() { +#ifdef TITAN_RUNTIME_2 if (is_present()) { if (param_refs > 0) { optional_value->clean_up(); @@ -81,12 +87,21 @@ public: optional_value = NULL; } } +#else + if (optional_selection == OPTIONAL_PRESENT) { + delete optional_value; + } +#endif optional_selection = OPTIONAL_OMIT; } public: /// Default constructor creates an unbound object - OPTIONAL() : optional_selection(OPTIONAL_UNBOUND), optional_value(NULL), param_refs(0) { } + OPTIONAL() : optional_value(NULL), optional_selection(OPTIONAL_UNBOUND) +#ifdef TITAN_RUNTIME_2 + , param_refs(0) +#endif + { } /// Construct an optional object set to omit. /// @p other_value must be OMIT_VALUE, or else dynamic testcase error. @@ -104,12 +119,21 @@ public: /// Construct from an object of different type template <typename T_tmp> OPTIONAL(const T_tmp& other_value) - : optional_selection(OPTIONAL_PRESENT), - optional_value(new T_type(other_value)), - param_refs(0) { } + : optional_value(new T_type(other_value)) + , optional_selection(OPTIONAL_PRESENT) +#ifdef TITAN_RUNTIME_2 + , param_refs(0) +#endif + { } - ~OPTIONAL() - { if (NULL != optional_value) delete optional_value; } + ~OPTIONAL() { +#ifdef TITAN_RUNTIME_2 + if (NULL != optional_value) +#else + if (optional_selection == OPTIONAL_PRESENT) +#endif + delete optional_value; + } void clean_up(); @@ -161,12 +185,20 @@ public: { return is_equal(other_value); } #endif +#ifdef TITAN_RUNTIME_2 boolean is_bound() const; +#else + inline boolean is_bound() const { return optional_selection != OPTIONAL_UNBOUND; } +#endif boolean is_value() const { return optional_selection == OPTIONAL_PRESENT && optional_value->is_value(); } /** Whether the optional value is present. * @return \c true if optional_selection is OPTIONAL_PRESENT, else \c false */ +#ifdef TITAN_RUNTIME_2 boolean is_present() const; +#else + inline boolean is_present() const { return optional_selection==OPTIONAL_PRESENT; } +#endif #ifdef TITAN_RUNTIME_2 /** @name override virtual functions of Base_Type @@ -207,9 +239,14 @@ public: */ boolean ispresent() const; +#ifdef TITAN_RUNTIME_2 /** @tricky Calculates and returns the actual state of the optional object, - * not just the optional_selection member. */ + * not just the optional_selection member. + * (Only needed in Runtime2, in Runtime1 optional_selection is always up to date.) */ optional_sel get_selection() const; +#else + inline optional_sel get_selection() const { return optional_selection; } +#endif void log() const; void set_param(Module_Param& param); @@ -221,10 +258,12 @@ public: raw_order_t top_bit_ord, boolean no_err=FALSE, int sel_field=-1, boolean first_call=TRUE); #endif - int XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& buf, unsigned int flavor, int indent) const; + int XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& buf, unsigned int flavor, + int indent, embed_values_enc_struct_t* emb_val) const; #ifdef TITAN_RUNTIME_2 int XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr, - const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, unsigned int flavor, int indent) const; + const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, unsigned int flavor, + int indent, embed_values_enc_struct_t* emb_val) const; #endif /** Used during XML decoding, in case this object is an AnyElement field in a record. * Determines whether XER_decode() should be called or this field should be omitted. @@ -236,7 +275,8 @@ public: * @param next_field_name name of the next field in the record, or null if this is the last one * @param parent_tag_closed true, if the record's XML tag is closed (is an empty element)*/ bool XER_check_any_elem(XmlReaderWrap& reader, const char* next_field_name, bool parent_tag_closed); - int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, unsigned int flavor); + int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, + unsigned int flavor, embed_values_dec_struct_t* emb_val); char ** collect_ns(const XERdescriptor_t& p_td, size_t& num, bool& def_ns) const; @@ -274,16 +314,18 @@ public: * Returns the length of the decoded data. */ int JSON_decode(const TTCN_Typedescriptor_t&, JSON_Tokenizer&, boolean); +#ifdef TITAN_RUNTIME_2 /** Called before an element of an optional record of/set of is indexed and passed as an - * 'inout' or 'out' parameter to a function. + * 'inout' or 'out' parameter to a function (only in Runtime2). * Sets the optional value to present (this would be done by the indexing operation * anyway) and redirects the call to the optional value. */ void add_refd_index(int index); /** Called after an element of an optional record of/set of is passed as an - * 'inout' or 'out' parameter to a function. + * 'inout' or 'out' parameter to a function (only in Runtime2). * Redirects the call to the optional value. */ void remove_refd_index(int index); +#endif /** Called before an element of an optional record of/set of is passed as an * 'inout' or 'out' parameter to a function. Returns the size of the record of/ @@ -302,7 +344,11 @@ public: template<typename T_type> Base_Type* OPTIONAL<T_type>::get_opt_value() { +#ifdef TITAN_RUNTIME_2 if (!is_present()) +#else + if (optional_selection!=OPTIONAL_PRESENT) +#endif TTCN_error("Internal error: get_opt_value() called on a non-present optional field."); return optional_value; } @@ -310,7 +356,11 @@ Base_Type* OPTIONAL<T_type>::get_opt_value() template<typename T_type> const Base_Type* OPTIONAL<T_type>::get_opt_value() const { +#ifdef TITAN_RUNTIME_2 if (!is_present()) +#else + if (optional_selection!=OPTIONAL_PRESENT) +#endif TTCN_error("Internal error: get_opt_value() const called on a non-present optional field."); return optional_value; } @@ -318,20 +368,35 @@ const Base_Type* OPTIONAL<T_type>::get_opt_value() const template<typename T_type> boolean OPTIONAL<T_type>::is_seof() const { - return (is_present()) ? optional_value->is_seof() : T_type().is_seof(); + return +#ifdef TITAN_RUNTIME_2 + (is_present()) +#else + (optional_selection==OPTIONAL_PRESENT) +#endif + ? optional_value->is_seof() : T_type().is_seof(); } template<typename T_type> const TTCN_Typedescriptor_t* OPTIONAL<T_type>::get_descriptor() const { - return (is_present()) ? optional_value->get_descriptor() : T_type().get_descriptor(); + return +#ifdef TITAN_RUNTIME_2 + (is_present()) +#else + (optional_selection==OPTIONAL_PRESENT) +#endif + ? optional_value->get_descriptor() : T_type().get_descriptor(); } #endif template<typename T_type> OPTIONAL<T_type>::OPTIONAL(template_sel other_value) - : optional_selection(OPTIONAL_OMIT), optional_value(NULL), param_refs(0) + : optional_value(NULL), optional_selection(OPTIONAL_OMIT) +#ifdef TITAN_RUNTIME_2 + , param_refs(0) +#endif { if (other_value != OMIT_VALUE) TTCN_error("Setting an optional field to an invalid value."); @@ -340,9 +405,11 @@ OPTIONAL<T_type>::OPTIONAL(template_sel other_value) template<typename T_type> OPTIONAL<T_type>::OPTIONAL(const OPTIONAL& other_value) : Base_Type(other_value) - , optional_selection(other_value.optional_selection) , optional_value(NULL) + , optional_selection(other_value.optional_selection) +#ifdef TITAN_RUNTIME_2 , param_refs(0) +#endif { switch (other_value.optional_selection) { case OPTIONAL_PRESENT: @@ -357,7 +424,10 @@ OPTIONAL<T_type>::OPTIONAL(const OPTIONAL& other_value) template<typename T_type> template<typename T_tmp> OPTIONAL<T_type>::OPTIONAL(const OPTIONAL<T_tmp>& other_value) - : optional_selection(other_value.get_selection()), optional_value(NULL), param_refs(0) + : optional_value(NULL), optional_selection(other_value.get_selection()) +#ifdef TITAN_RUNTIME_2 + , param_refs(0) +#endif { switch (other_value.get_selection()) { case OPTIONAL_PRESENT: @@ -373,6 +443,7 @@ OPTIONAL<T_type>::OPTIONAL(const OPTIONAL<T_tmp>& other_value) template<typename T_type> void OPTIONAL<T_type>::clean_up() { +#ifdef TITAN_RUNTIME_2 if (is_present()) { if (param_refs > 0) { optional_value->clean_up(); @@ -382,6 +453,11 @@ void OPTIONAL<T_type>::clean_up() optional_value = NULL; } } +#else + if (OPTIONAL_PRESENT == optional_selection) { + delete optional_value; + } +#endif optional_selection = OPTIONAL_UNBOUND; } @@ -399,9 +475,13 @@ OPTIONAL<T_type>& OPTIONAL<T_type>::operator=(const OPTIONAL& other_value) { switch (other_value.optional_selection) { case OPTIONAL_PRESENT: - optional_selection = OPTIONAL_PRESENT; +#ifdef TITAN_RUNTIME_2 if (NULL == optional_value) { +#else + if (optional_selection != OPTIONAL_PRESENT) { +#endif optional_value = new T_type(*other_value.optional_value); + optional_selection = OPTIONAL_PRESENT; } else *optional_value = *other_value.optional_value; break; case OPTIONAL_OMIT: @@ -420,9 +500,13 @@ OPTIONAL<T_type>::operator=(const OPTIONAL<T_tmp>& other_value) { switch (other_value.get_selection()) { case OPTIONAL_PRESENT: - optional_selection = OPTIONAL_PRESENT; +#ifdef TITAN_RUNTIME_2 if (NULL == optional_value) { +#else + if (optional_selection != OPTIONAL_PRESENT) { +#endif optional_value = new T_type((const T_tmp&)other_value); + optional_selection = OPTIONAL_PRESENT; } else *optional_value = (const T_tmp&)other_value; break; case OPTIONAL_OMIT: @@ -439,9 +523,13 @@ template<typename T_type> template <typename T_tmp> OPTIONAL<T_type>& OPTIONAL<T_type>::operator=(const T_tmp& other_value) { - optional_selection = OPTIONAL_PRESENT; +#ifdef TITAN_RUNTIME_2 if (NULL == optional_value) { +#else + if (optional_selection != OPTIONAL_PRESENT) { +#endif optional_value = new T_type(other_value); + optional_selection = OPTIONAL_PRESENT; } else *optional_value = other_value; return *this; } @@ -449,28 +537,52 @@ OPTIONAL<T_type>::operator=(const T_tmp& other_value) template<typename T_type> boolean OPTIONAL<T_type>::is_equal(template_sel other_value) const { +#ifdef TITAN_RUNTIME_2 if (!is_bound()) { +#else + if (optional_selection == OPTIONAL_UNBOUND) { +#endif if (other_value == UNINITIALIZED_TEMPLATE) return TRUE; TTCN_error("The left operand of comparison is an unbound optional value."); } if (other_value != OMIT_VALUE) TTCN_error("Internal error: The right operand " "of comparison is an invalid value."); - return !is_present(); + return +#ifdef TITAN_RUNTIME_2 + !is_present(); +#else + optional_selection == OPTIONAL_OMIT; +#endif } template<typename T_type> boolean OPTIONAL<T_type>::is_equal(const OPTIONAL& other_value) const { +#ifdef TITAN_RUNTIME_2 if (!is_bound()) { - if (!other_value.is_bound()) return TRUE; + if (!other_value.is_bound()) +#else + if (optional_selection == OPTIONAL_UNBOUND) { + if (other_value.optional_selection == OPTIONAL_UNBOUND) +#endif + return TRUE; TTCN_error("The left operand of " "comparison is an unbound optional value."); } +#ifdef TITAN_RUNTIME_2 if (!other_value.is_bound()) +#else + if (other_value.optional_selection == OPTIONAL_UNBOUND) +#endif TTCN_error("The right operand of comparison is an unbound optional value."); +#ifdef TITAN_RUNTIME_2 boolean present = is_present(); if (present != other_value.is_present()) return FALSE; else if (present) +#else + if (optional_selection != other_value.optional_selection) return FALSE; + else if (optional_selection == OPTIONAL_PRESENT) +#endif return *optional_value == *other_value.optional_value; else return TRUE; } @@ -478,7 +590,11 @@ boolean OPTIONAL<T_type>::is_equal(const OPTIONAL& other_value) const template<typename T_type> template <typename T_tmp> boolean OPTIONAL<T_type>::is_equal(const T_tmp& other_value) const { +#ifdef TITAN_RUNTIME_2 switch (get_selection()) { +#else + switch (optional_selection) { +#endif case OPTIONAL_PRESENT: return *optional_value == other_value; case OPTIONAL_OMIT: @@ -492,20 +608,37 @@ boolean OPTIONAL<T_type>::is_equal(const T_tmp& other_value) const template<typename T_type> template <typename T_tmp> boolean OPTIONAL<T_type>::is_equal(const OPTIONAL<T_tmp>& other_value) const { +#ifdef TITAN_RUNTIME_2 if (!is_bound()) { - if (!other_value.is_bound()) return TRUE; + if (!other_value.is_bound()) +#else + optional_sel other_selection = other_value.get_selection(); + if (optional_selection == OPTIONAL_UNBOUND) { + if (other_selection == OPTIONAL_UNBOUND) +#endif + return TRUE; TTCN_error("The left operand of " "comparison is an unbound optional value."); } - if (!other_value.is_bound()) TTCN_error("The right operand of " - "comparison is an unbound optional value."); +#ifdef TITAN_RUNTIME_2 + if (!other_value.is_bound()) +#else + if (other_selection == OPTIONAL_UNBOUND) +#endif + TTCN_error("The right operand of comparison is an unbound optional value."); +#ifdef TITAN_RUNTIME_2 boolean present = is_present(); if (present != other_value.is_present()) return FALSE; else if (present) +#else + if (optional_selection != other_selection) return FALSE; + else if (optional_selection == OPTIONAL_PRESENT) +#endif return *optional_value == (const T_tmp&)other_value; else return TRUE; } +#ifdef TITAN_RUNTIME_2 template<typename T_type> boolean OPTIONAL<T_type>::is_bound() const { @@ -535,6 +668,7 @@ boolean OPTIONAL<T_type>::is_present() const return FALSE; } } +#endif template<typename T_type> boolean OPTIONAL<T_type>::ispresent() const @@ -543,19 +677,24 @@ boolean OPTIONAL<T_type>::ispresent() const case OPTIONAL_PRESENT: return TRUE; case OPTIONAL_OMIT: +#ifdef TITAN_RUNTIME_2 if (NULL != optional_value) { return optional_value->is_bound(); } +#endif return FALSE; default: +#ifdef TITAN_RUNTIME_2 if (NULL != optional_value && optional_value->is_bound()) { return TRUE; } +#endif TTCN_error("Using an unbound optional field."); - return FALSE; } + return FALSE; } +#ifdef TITAN_RUNTIME_2 template<typename T_type> optional_sel OPTIONAL<T_type>::get_selection() const { @@ -568,11 +707,16 @@ optional_sel OPTIONAL<T_type>::get_selection() const } return OPTIONAL_UNBOUND; } +#endif template<typename T_type> void OPTIONAL<T_type>::log() const { +#ifdef TITAN_RUNTIME_2 switch (get_selection()) { +#else + switch (optional_selection) { +#endif case OPTIONAL_PRESENT: optional_value->log(); break; @@ -600,7 +744,11 @@ void OPTIONAL<T_type>::set_param(Module_Param& param) { template<typename T_type> void OPTIONAL<T_type>::encode_text(Text_Buf& text_buf) const { +#ifdef TITAN_RUNTIME_2 switch (get_selection()) { +#else + switch (optional_selection) { +#endif case OPTIONAL_OMIT: text_buf.push_int((RInt)FALSE); break; @@ -625,7 +773,11 @@ void OPTIONAL<T_type>::decode_text(Text_Buf& text_buf) template<typename T_type> int OPTIONAL<T_type>::JSON_encode(const TTCN_Typedescriptor_t& p_td, JSON_Tokenizer& p_tok) const { +#ifdef TITAN_RUNTIME_2 switch(get_selection()) { +#else + switch(optional_selection) { +#endif case OPTIONAL_PRESENT: return optional_value->JSON_encode(p_td, p_tok); case OPTIONAL_OMIT: @@ -640,33 +792,36 @@ int OPTIONAL<T_type>::JSON_encode(const TTCN_Typedescriptor_t& p_td, JSON_Tokeni template<typename T_type> int OPTIONAL<T_type>::JSON_decode(const TTCN_Typedescriptor_t& p_td, JSON_Tokenizer& p_tok, boolean p_silent) { + // try the optional value first + set_to_present(); size_t buf_pos = p_tok.get_buf_pos(); - json_token_t token = JSON_TOKEN_NONE; - int dec_len = p_tok.get_next_token(&token, NULL, NULL); - if (JSON_TOKEN_ERROR == token) { - JSON_ERROR(TTCN_EncDec::ET_INVAL_MSG, JSON_DEC_BAD_TOKEN_ERROR, ""); - dec_len = JSON_ERROR_FATAL; - } - else if (JSON_TOKEN_LITERAL_NULL == token) { - set_to_omit(); + int dec_len = optional_value->JSON_decode(p_td, p_tok, p_silent); + if (JSON_ERROR_FATAL == dec_len) { + if (p_silent) { + clean_up(); + } else { + set_to_omit(); + } } - else { - // read the token again - set_to_present(); + else if (JSON_ERROR_INVALID_TOKEN == dec_len) { + // invalid token, rewind the buffer and check if it's a "null" (= omit) + // this needs to be checked after the optional value, because it might also be + // able to decode a "null" value p_tok.set_buf_pos(buf_pos); - int ret_val = optional_value->JSON_decode(p_td, p_tok, p_silent); - if (0 > ret_val) { - if (p_silent) { - clean_up(); - } else { - set_to_omit(); - } + json_token_t token = JSON_TOKEN_NONE; + dec_len = p_tok.get_next_token(&token, NULL, NULL); + if (JSON_TOKEN_LITERAL_NULL == token) { + set_to_omit(); + } + else { + // cannot get JSON_TOKEN_ERROR here, that was already checked by the optional value + dec_len = JSON_ERROR_INVALID_TOKEN; } - dec_len = ret_val; } return dec_len; } +#ifdef TITAN_RUNTIME_2 template<typename T_type> void OPTIONAL<T_type>::add_refd_index(int index) { @@ -681,15 +836,7 @@ void OPTIONAL<T_type>::remove_refd_index(int index) --param_refs; optional_value->remove_refd_index(index); } - -template<typename T_type> -int OPTIONAL<T_type>::size_of() -{ - if (!is_present()) { - return 0; - } - return optional_value->size_of(); -} +#endif template<typename T_type> OPTIONAL<T_type>::operator T_type&() @@ -701,7 +848,11 @@ OPTIONAL<T_type>::operator T_type&() template<typename T_type> OPTIONAL<T_type>::operator const T_type&() const { +#ifdef TITAN_RUNTIME_2 if (!is_present()) +#else + if (optional_selection != OPTIONAL_PRESENT) +#endif TTCN_error("Using the value of an optional field containing omit."); return *optional_value; } @@ -712,7 +863,11 @@ OPTIONAL<T_type>::BER_encode_TLV(const TTCN_Typedescriptor_t& p_td, unsigned p_coding) const { BER_chk_descr(p_td); +#ifdef TITAN_RUNTIME_2 switch (get_selection()) { +#else + switch (optional_selection) { +#endif case OPTIONAL_PRESENT: return optional_value->BER_encode_TLV(p_td, p_coding); case OPTIONAL_OMIT: @@ -729,7 +884,11 @@ OPTIONAL<T_type>::BER_encode_TLV_negtest(const Erroneous_descriptor_t* p_err_des const TTCN_Typedescriptor_t& p_td, unsigned p_coding) const { BER_chk_descr(p_td); +#ifdef TITAN_RUNTIME_2 switch (get_selection()) { +#else + switch (optional_selection) { +#endif case OPTIONAL_PRESENT: return optional_value->BER_encode_TLV_negtest(p_err_descr, p_td, p_coding); case OPTIONAL_OMIT: @@ -752,11 +911,15 @@ int OPTIONAL<T_type>::RAW_decode(const TTCN_Typedescriptor_t& p_td, template<typename T_type> int -OPTIONAL<T_type>::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& buf, unsigned int flavor, int indent) const +OPTIONAL<T_type>::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& buf, unsigned int flavor, int indent, embed_values_enc_struct_t* emb_val) const { +#ifdef TITAN_RUNTIME_2 switch (get_selection()) { +#else + switch (optional_selection) { +#endif case OPTIONAL_PRESENT: - return optional_value->XER_encode(p_td, buf, flavor, indent); + return optional_value->XER_encode(p_td, buf, flavor, indent, emb_val); case OPTIONAL_OMIT: return 0; // nothing to do ! default: @@ -770,11 +933,12 @@ OPTIONAL<T_type>::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& buf, unsi template<typename T_type> int OPTIONAL<T_type>::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr, - const XERdescriptor_t& p_td, TTCN_Buffer& buf, unsigned int flavor, int indent) const + const XERdescriptor_t& p_td, TTCN_Buffer& buf, unsigned int flavor, int indent, + embed_values_enc_struct_t* emb_val) const { switch (get_selection()) { case OPTIONAL_PRESENT: - return optional_value->XER_encode_negtest(p_err_descr, p_td, buf, flavor, indent); + return optional_value->XER_encode_negtest(p_err_descr, p_td, buf, flavor, indent, emb_val); case OPTIONAL_OMIT: return 0; // nothing to do ! default: @@ -819,7 +983,8 @@ OPTIONAL<T_type>::XER_check_any_elem(XmlReaderWrap& reader, const char* next_fie template<typename T_type> int -OPTIONAL<T_type>::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, unsigned int flavor) +OPTIONAL<T_type>::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, + unsigned int flavor, embed_values_dec_struct_t* emb_val) { int exer = is_exer(flavor); for (int success = reader.Ok(); success==1; success=reader.Read()) { @@ -841,7 +1006,7 @@ OPTIONAL<T_type>::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, if (!check_namespace((const char*)reader.NamespaceUri(), p_td)) break; set_to_present(); - optional_value->XER_decode(p_td, reader, flavor); + optional_value->XER_decode(p_td, reader, flavor, emb_val); goto finished; } else break; @@ -858,7 +1023,7 @@ OPTIONAL<T_type>::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, found_it: set_to_present(); //success = reader.Read(); // move to next thing TODO should it loop till an element ? - optional_value->XER_decode(p_td, reader, flavor); + optional_value->XER_decode(p_td, reader, flavor, emb_val); } else break; // it's not us, bail @@ -881,7 +1046,11 @@ finished: template<typename T_type> char ** OPTIONAL<T_type>::collect_ns(const XERdescriptor_t& p_td, size_t& num, bool& def_ns) const { +#ifdef TITAN_RUNTIME_2 switch (get_selection()) { +#else + switch (optional_selection) { +#endif case OPTIONAL_PRESENT: return optional_value->collect_ns(p_td, num, def_ns); case OPTIONAL_OMIT: @@ -921,8 +1090,12 @@ template<typename T_type> void OPTIONAL<T_type>::BER_decode_opentypes(TTCN_Type_list& p_typelist, unsigned L_form) { +#ifdef TITAN_RUNTIME_2 if (is_present()) { optional_selection = OPTIONAL_PRESENT; +#else + if (optional_selection==OPTIONAL_PRESENT) { +#endif optional_value->BER_decode_opentypes(p_typelist, L_form); } } @@ -933,7 +1106,7 @@ template<typename T_type> int OPTIONAL<T_type>::TEXT_encode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& buff) const { - if (get_selection()) + if (is_present()) return optional_value->TEXT_encode(p_td, buff); TTCN_error("Internal error: TEXT encoding an unbound/omit optional field."); return 0; @@ -943,7 +1116,7 @@ template<typename T_type> int OPTIONAL<T_type>::TEXT_encode_negtest(const Erroneous_descriptor_t* p_err_descr, const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& buff) const { - if (get_selection()) + if (is_present()) return optional_value->TEXT_encode_negtest(p_err_descr, p_td, buff); TTCN_error("Internal error: TEXT encoding an unbound/omit optional field."); return 0; diff --git a/core/Profiler.cc b/core/Profiler.cc new file mode 100644 index 000000000..860e5c8a0 --- /dev/null +++ b/core/Profiler.cc @@ -0,0 +1,839 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2000-2015 Ericsson Telecom AB +// All rights reserved. This program and the accompanying materials +// are made available under the terms of the Eclipse Public License v1.0 +// which accompanies this distribution, and is available at +// http://www.eclipse.org/legal/epl-v10.html +/////////////////////////////////////////////////////////////////////////////// + +#include "Profiler.hh" +#include <sys/time.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include "JSON_Tokenizer.hh" +#include "memory.h" +#include "Runtime.hh" + +//////////////////////////////////// +////////// TTCN3_Profiler ////////// +//////////////////////////////////// + +TTCN3_Profiler ttcn3_prof; + +TTCN3_Profiler::TTCN3_Profiler() +: disable_profiler(FALSE), disable_coverage(FALSE), aggregate_data(FALSE) +, disable_stats(FALSE) +{ + database_filename = mcopystr("profiler.db"); + stats_filename = mcopystr("profiler.stats"); + reset(); +} + +TTCN3_Profiler::~TTCN3_Profiler() +{ + if (!disable_profiler || !disable_coverage) { + import_data(); + export_data(); + if (!disable_stats && (TTCN_Runtime::is_single() || TTCN_Runtime::is_hc())) { + print_stats(); + } + } + for (size_t i = 0; i < profiler_db.size(); ++i) { + Free(profiler_db[i].filename); + for (size_t j = 0; j < profiler_db[i].functions.size(); ++j) { + Free(profiler_db[i].functions[j].name); + } + } + Free(database_filename); + Free(stats_filename); +} + +void TTCN3_Profiler::set_disable_profiler(boolean p_disable_profiler) +{ + disable_profiler = p_disable_profiler; +} + +void TTCN3_Profiler::set_disable_coverage(boolean p_disable_coverage) +{ + disable_coverage = p_disable_coverage; +} + +void TTCN3_Profiler::set_database_filename(const char* p_database_filename) +{ + Free(database_filename); + database_filename = mcopystr(p_database_filename); +} + +void TTCN3_Profiler::set_aggregate_data(boolean p_aggregate_data) +{ + aggregate_data = p_aggregate_data; +} + +void TTCN3_Profiler::set_stats_filename(const char* p_stats_filename) +{ + Free(stats_filename); + stats_filename = mcopystr(p_stats_filename); +} + +void TTCN3_Profiler::set_disable_stats(boolean p_disable_stats) +{ + disable_stats = p_disable_stats; +} + +boolean TTCN3_Profiler::is_profiler_disabled() const +{ + return disable_profiler; +} + +#define IMPORT_FORMAT_ERROR(cond) \ + if (cond) { \ + TTCN_warning("Database format is invalid. Profiler and/or code coverage data will not be loaded."); \ + return; \ + } + +void TTCN3_Profiler::init_data_file() +{ + // delete the database file (from the previous run) if data aggregation is not set + if (!aggregate_data && (!disable_profiler || !disable_coverage)) { + remove(database_filename); + } +} + +void TTCN3_Profiler::import_data() +{ + // open the file, if it exists + FILE* file = fopen(database_filename, "r"); + if (NULL == file) { + return; + } + + // get the file size + fseek(file, 0, SEEK_END); + int file_size = ftell(file); + rewind(file); + + // read the entire file into a character buffer + char* buffer = (char*)Malloc(file_size); + fread(buffer, 1, file_size, file); + + // initialize a JSON tokenizer with the buffer + JSON_Tokenizer json(buffer, file_size); + Free(buffer); + + // attempt to read tokens from the buffer + // if the format is invalid, abort the importing process + json_token_t token = JSON_TOKEN_NONE; + char* value = NULL; + size_t value_len = 0; + + // start of main array + json.get_next_token(&token, NULL, NULL); + IMPORT_FORMAT_ERROR(JSON_TOKEN_ARRAY_START != token); + + // read objects (one for each TTCN-3 file), until the main array end mark is reached + json.get_next_token(&token, NULL, NULL); + while (JSON_TOKEN_OBJECT_START == token) { + size_t file_index = 0; + + // file name: + json.get_next_token(&token, &value, &value_len); + IMPORT_FORMAT_ERROR(JSON_TOKEN_NAME != token || value_len != 4 || + 0 != strncmp(value, "file", value_len)); + + // read the file name and see if its record already exists + json.get_next_token(&token, &value, &value_len); + IMPORT_FORMAT_ERROR(JSON_TOKEN_STRING != token); + for (file_index = 0; file_index < profiler_db.size(); ++file_index) { + if (strlen(profiler_db[file_index].filename) == value_len - 2 && + 0 == strncmp(profiler_db[file_index].filename, value + 1, value_len - 2)) { + break; + } + } + + // insert a new element if the file was not found + if (profiler_db.size() == file_index) { + profiler_db_item_t item; + item.filename = mcopystrn(value + 1, value_len - 2); + profiler_db.push_back(item); + } + + // functions: + json.get_next_token(&token, &value, &value_len); + IMPORT_FORMAT_ERROR(JSON_TOKEN_NAME != token || value_len != 9 || + 0 != strncmp(value, "functions", value_len)); + + // read and store the functions (an array of objects, same as before) + json.get_next_token(&token, NULL, NULL); + IMPORT_FORMAT_ERROR(JSON_TOKEN_ARRAY_START != token); + json.get_next_token(&token, NULL, NULL); + while (JSON_TOKEN_OBJECT_START == token) { + size_t function_index = 0; + + // function name: + json.get_next_token(&token, &value, &value_len); + IMPORT_FORMAT_ERROR(JSON_TOKEN_NAME != token || value_len != 4 || + 0 != strncmp(value, "name", value_len)); + + // read the function name, it will be checked later + json.get_next_token(&token, &value, &value_len); + IMPORT_FORMAT_ERROR(JSON_TOKEN_STRING != token); + char* function_name = mcopystrn(value + 1, value_len - 2); + + // function start line: + json.get_next_token(&token, &value, &value_len); + IMPORT_FORMAT_ERROR(JSON_TOKEN_NAME != token || value_len != 10 || + 0 != strncmp(value, "start line", value_len)); + + // read the start line and check if the function already exists + json.get_next_token(&token, &value, &value_len); + IMPORT_FORMAT_ERROR(JSON_TOKEN_NUMBER != token); + int start_line = atoi(value); + for (function_index = 0; function_index < profiler_db[file_index].functions.size(); ++function_index) { + if (profiler_db[file_index].functions[function_index].lineno == start_line && + 0 == strcmp(profiler_db[file_index].functions[function_index].name, function_name)) { + break; + } + } + + // insert a new element if the function was not found + if (profiler_db[file_index].functions.size() == function_index) { + profiler_db_item_t::profiler_function_data_t func_data; + func_data.name = function_name; + func_data.lineno = start_line; + func_data.exec_count = 0; + func_data.total_time = 0.0; + profiler_db[file_index].functions.push_back(func_data); + } + + if (!disable_coverage) { + // function execution count: + json.get_next_token(&token, &value, &value_len); + IMPORT_FORMAT_ERROR(JSON_TOKEN_NAME != token || value_len != 15 || + 0 != strncmp(value, "execution count", value_len)); + + // read the execution count and add it to the current data + json.get_next_token(&token, &value, &value_len); + IMPORT_FORMAT_ERROR(JSON_TOKEN_NUMBER != token); + profiler_db[file_index].functions[function_index].exec_count += atoi(value); + } + + if (!disable_profiler) { + // total function execution time: + json.get_next_token(&token, &value, &value_len); + IMPORT_FORMAT_ERROR(JSON_TOKEN_NAME != token || value_len != 10 || + 0 != strncmp(value, "total time", value_len)); + + // read the total time and add it to the current data + json.get_next_token(&token, &value, &value_len); + IMPORT_FORMAT_ERROR(JSON_TOKEN_NUMBER != token); + profiler_db[file_index].functions[function_index].total_time += atof(value); + } + + // end of the function's object + json.get_next_token(&token, NULL, NULL); + IMPORT_FORMAT_ERROR(JSON_TOKEN_OBJECT_END != token); + + // read the next token (either the start of another object or the function array end) + json.get_next_token(&token, NULL, NULL); + } + + // function array end + IMPORT_FORMAT_ERROR(JSON_TOKEN_ARRAY_END != token); + + // lines: + json.get_next_token(&token, &value, &value_len); + IMPORT_FORMAT_ERROR(JSON_TOKEN_NAME != token || value_len != 5 || + 0 != strncmp(value, "lines", value_len)); + + // read and store the lines (an array of objects, same as before) + json.get_next_token(&token, NULL, NULL); + IMPORT_FORMAT_ERROR(JSON_TOKEN_ARRAY_START != token); + json.get_next_token(&token, NULL, NULL); + while (JSON_TOKEN_OBJECT_START == token) { + + // line number: + json.get_next_token(&token, &value, &value_len); + IMPORT_FORMAT_ERROR(JSON_TOKEN_NAME != token || value_len != 6 || + 0 != strncmp(value, "number", value_len)); + + // read the line number and check if the line already exists + json.get_next_token(&token, &value, &value_len); + IMPORT_FORMAT_ERROR(JSON_TOKEN_NUMBER != token); + int lineno = atoi(value); + IMPORT_FORMAT_ERROR(lineno < 0); + size_t line_no = lineno; + if (line_no >= profiler_db[file_index].lines.size()) { + for (size_t i = profiler_db[file_index].lines.size(); i <= line_no; ++i) { + profiler_db_item_t::profiler_line_data_t line_data; + line_data.total_time = 0.0; + line_data.exec_count = 0; + profiler_db[file_index].lines.push_back(line_data); + } + } + + if (!disable_coverage) { + // line execution count: + json.get_next_token(&token, &value, &value_len); + IMPORT_FORMAT_ERROR(JSON_TOKEN_NAME != token || value_len != 15 || + 0 != strncmp(value, "execution count", value_len)); + + // read the execution count and add it to the current data + json.get_next_token(&token, &value, &value_len); + IMPORT_FORMAT_ERROR(JSON_TOKEN_NUMBER != token); + profiler_db[file_index].lines[line_no].exec_count += atoi(value); + } + + if (!disable_profiler) { + // total line execution time: + json.get_next_token(&token, &value, &value_len); + IMPORT_FORMAT_ERROR(JSON_TOKEN_NAME != token || value_len != 10 || + 0 != strncmp(value, "total time", value_len)); + + // read the total time and add it to the current data + json.get_next_token(&token, &value, &value_len); + IMPORT_FORMAT_ERROR(JSON_TOKEN_NUMBER != token); + profiler_db[file_index].lines[line_no].total_time += atof(value); + } + + // end of the line's object + json.get_next_token(&token, NULL, NULL); + IMPORT_FORMAT_ERROR(JSON_TOKEN_OBJECT_END != token); + + // read the next token (either the start of another object or the line array end) + json.get_next_token(&token, NULL, NULL); + } + + // line array end + IMPORT_FORMAT_ERROR(JSON_TOKEN_ARRAY_END != token); + + // end of the file's object + json.get_next_token(&token, NULL, NULL); + IMPORT_FORMAT_ERROR(JSON_TOKEN_OBJECT_END != token); + + // read the next token (either the start of another object or the main array end) + json.get_next_token(&token, NULL, NULL); + } + + // main array end + IMPORT_FORMAT_ERROR(JSON_TOKEN_ARRAY_END != token); +} + +void TTCN3_Profiler::export_data() +{ + // nothing to export if the database is empty + if (profiler_db.empty()) { + return; + } + + // check whether the file can be opened for writing + FILE* file = fopen(database_filename, "w"); + if (NULL == file) { + TTCN_warning("Could not open file '%s' for writing. Profiler and/or code coverage " + "data will not be saved.", database_filename); + return; + } + + // use the JSON tokenizer to create a JSON document from the database + JSON_Tokenizer json(true); + + // main array, contains an element for each file + json.put_next_token(JSON_TOKEN_ARRAY_START, NULL); + for (size_t i = 0; i < profiler_db.size(); ++i) { + + // each file's data is stored in an object + json.put_next_token(JSON_TOKEN_OBJECT_START, NULL); + + // store the file name + json.put_next_token(JSON_TOKEN_NAME, "file"); + char* file_name_str = mprintf("\"%s\"", profiler_db[i].filename); + json.put_next_token(JSON_TOKEN_STRING, file_name_str); + Free(file_name_str); + + // store the function data in an array (one element for each function) + json.put_next_token(JSON_TOKEN_NAME, "functions"); + json.put_next_token(JSON_TOKEN_ARRAY_START, NULL); + for (size_t j = 0; j < profiler_db[i].functions.size(); ++j) { + + // the data is stored in an object for each function + json.put_next_token(JSON_TOKEN_OBJECT_START, NULL); + + // store the function name + json.put_next_token(JSON_TOKEN_NAME, "name"); + char* func_name_str = mprintf("\"%s\"", profiler_db[i].functions[j].name); + json.put_next_token(JSON_TOKEN_STRING, func_name_str); + Free(func_name_str); + + // store the function start line + json.put_next_token(JSON_TOKEN_NAME, "start line"); + char* start_line_str = mprintf("%d", profiler_db[i].functions[j].lineno); + json.put_next_token(JSON_TOKEN_NUMBER, start_line_str); + Free(start_line_str); + + if (!disable_coverage) { + // store the function execution count + json.put_next_token(JSON_TOKEN_NAME, "execution count"); + char* exec_count_str = mprintf("%d", profiler_db[i].functions[j].exec_count); + json.put_next_token(JSON_TOKEN_NUMBER, exec_count_str); + Free(exec_count_str); + } + + if (!disable_profiler) { + // store the function's total execution time + json.put_next_token(JSON_TOKEN_NAME, "total time"); + char* exec_count_str = mprintf("%.6lf", profiler_db[i].functions[j].total_time); + json.put_next_token(JSON_TOKEN_NUMBER, exec_count_str); + Free(exec_count_str); + } + + // end of function object + json.put_next_token(JSON_TOKEN_OBJECT_END, NULL); + } + + // end of function data array + json.put_next_token(JSON_TOKEN_ARRAY_END, NULL); + + // store the line data in an array (one element for each line with useful data) + json.put_next_token(JSON_TOKEN_NAME, "lines"); + json.put_next_token(JSON_TOKEN_ARRAY_START, NULL); + for (size_t j = 0; j < profiler_db[i].lines.size(); ++j) { + if (0.0 != profiler_db[i].lines[j].total_time || + 0 != profiler_db[i].lines[j].exec_count) { + + // store line data in an object + json.put_next_token(JSON_TOKEN_OBJECT_START, NULL); + + // store the line number + json.put_next_token(JSON_TOKEN_NAME, "number"); + char* line_number_str = mprintf("%lu", j); + json.put_next_token(JSON_TOKEN_NUMBER, line_number_str); + Free(line_number_str); + + if (!disable_coverage) { + // store the line execution count + json.put_next_token(JSON_TOKEN_NAME, "execution count"); + char* exec_count_str = mprintf("%d", profiler_db[i].lines[j].exec_count); + json.put_next_token(JSON_TOKEN_NUMBER, exec_count_str); + Free(exec_count_str); + } + + if (!disable_profiler) { + // store the line's total execution time + json.put_next_token(JSON_TOKEN_NAME, "total time"); + char* exec_count_str = mprintf("%.6lf", profiler_db[i].lines[j].total_time); + json.put_next_token(JSON_TOKEN_NUMBER, exec_count_str); + Free(exec_count_str); + } + + // end of this line's object + json.put_next_token(JSON_TOKEN_OBJECT_END, NULL); + } + } + + // end of line data array + json.put_next_token(JSON_TOKEN_ARRAY_END, NULL); + + // end of this file's object + json.put_next_token(JSON_TOKEN_OBJECT_END, NULL); + } + + // end of main array + json.put_next_token(JSON_TOKEN_ARRAY_END, NULL); + + // write the JSON document into the file + fprintf(file, "%s\n", json.get_buffer()); + fclose(file); +} + +void TTCN3_Profiler::print_stats() +{ + if (profiler_db.empty()) { + return; + } + + // title + char* title_str = mprintf( + "##################################################\n" + "%s## TTCN-3 %s%s%sstatistics ##%s\n" + "##################################################\n\n\n" + , disable_profiler ? "#######" : (disable_coverage ? "#########" : "") + , disable_profiler ? "" : "profiler " + , (disable_profiler || disable_coverage) ? "" : "and " + , disable_coverage ? "" : "code coverage " + , disable_profiler ? "######" : (disable_coverage ? "#########" : "")); + + // line data + char* line_data_str = mprintf( + "-------------------------------------------------\n" + "%s- Code line data (%s%s%s) -%s\n" + "-------------------------------------------------\n" + , disable_profiler ? "-------" : (disable_coverage ? "---------" : "") + , disable_profiler ? "" : "total time" + , (disable_profiler || disable_coverage) ? "" : " / " + , disable_coverage ? "" : "execution count" + , disable_profiler ? "------" : (disable_coverage ? "---------" : "")); + + // average time / exec count for lines + char* line_avg_str = NULL; + if (!disable_coverage && !disable_profiler) { + line_avg_str = mcopystr( + "-------------------------------------------------\n" + "- Average time / execution count for code lines -\n" + "-------------------------------------------------\n"); + } + + // function data + char* func_data_str = mprintf( + "------------------------------------------------\n" + "%s- Function data (%s%s%s) -%s\n" + "------------------------------------------------\n" + , disable_profiler ? "-------" : (disable_coverage ? "---------" : "") + , disable_profiler ? "" : "total time" + , (disable_profiler || disable_coverage) ? "" : " / " + , disable_coverage ? "" : "execution count" + , disable_profiler ? "------" : (disable_coverage ? "---------" : "")); + + // average time / exec count for functions + char* func_avg_str = NULL; + if (!disable_coverage && !disable_profiler) { + func_avg_str = mcopystr( + "------------------------------------------------\n" + "- Average time / execution count for functions -\n" + "------------------------------------------------\n"); + } + + // cycle through the database and gather the necessary data + for (size_t i = 0; i < profiler_db.size(); ++i) { + if (i > 0) { + // add separators between files + line_data_str = mputstr(line_data_str, "-------------------------------------------------\n"); + func_data_str = mputstr(func_data_str, "------------------------------------------------\n"); + if (!disable_profiler && !disable_coverage) { + line_avg_str = mputstr(line_avg_str, "-------------------------------------------------\n"); + func_avg_str = mputstr(func_avg_str, "------------------------------------------------\n"); + } + } + + // lines + for (size_t j = 0; j < profiler_db[i].lines.size(); ++j) { + if (0.0 != profiler_db[i].lines[j].total_time || + 0 != profiler_db[i].lines[j].exec_count) { + if (!disable_profiler) { + line_data_str = mputprintf(line_data_str, "%.6lfs", profiler_db[i].lines[j].total_time); + if (!disable_coverage) { + line_data_str = mputstrn(line_data_str, "\t/\t", 3); + line_avg_str = mputprintf(line_avg_str, "%.6lfs", + profiler_db[i].lines[j].total_time / profiler_db[i].lines[j].exec_count); + } + } + if (!disable_coverage) { + line_data_str = mputprintf(line_data_str, "%d", profiler_db[i].lines[j].exec_count); + } + + // line specification (including function name for the function's start line) + char* line_spec_str = mprintf("\t%s:%lu", profiler_db[i].filename, j); + int func = get_function(i, j); + if (-1 != func) { + line_spec_str = mputprintf(line_spec_str, " [%s]", profiler_db[i].functions[func].name); + } + line_spec_str = mputstrn(line_spec_str, "\n", 1); + + // add the line spec string to the other strings + line_data_str = mputstr(line_data_str, line_spec_str); + if (!disable_profiler && !disable_coverage) { + line_avg_str = mputstr(line_avg_str, line_spec_str); + } + } + } + + // functions + for (size_t j = 0; j < profiler_db[i].functions.size(); ++j) { + if (!disable_profiler) { + func_data_str = mputprintf(func_data_str, "%.6lfs", profiler_db[i].functions[j].total_time); + if (!disable_coverage) { + func_data_str = mputstrn(func_data_str, "\t/\t", 3); + func_avg_str = mputprintf(func_avg_str, "%.6lfs", + profiler_db[i].functions[j].total_time / profiler_db[i].functions[j].exec_count); + } + } + if (!disable_coverage) { + func_data_str = mputprintf(func_data_str, "%d", profiler_db[i].functions[j].exec_count); + } + + // functions specification + char* func_spec_str = mprintf("\t%s:%d [%s]\n", profiler_db[i].filename, + profiler_db[i].functions[j].lineno, profiler_db[i].functions[j].name); + + // add the line spec string to the other strings + func_data_str = mputstr(func_data_str, func_spec_str); + if (!disable_profiler && !disable_coverage) { + func_avg_str = mputstr(func_avg_str, func_spec_str); + } + } + } + + // add new lines at the end of each segment + line_data_str = mputstrn(line_data_str, "\n", 1); + func_data_str = mputstrn(func_data_str, "\n", 1); + if (!disable_profiler && !disable_coverage) { + line_avg_str = mputstrn(line_avg_str, "\n", 1); + func_avg_str = mputstrn(func_avg_str, "\n", 1); + } + + // write the statistics to the specified file + FILE* file = fopen(stats_filename, "w"); + if (NULL == file) { + TTCN_warning("Could not open file '%s' for writing. Profiler and/or code coverage " + "statistics will not be saved.", stats_filename); + return; + } + fprintf(file, "%s%s%s%s%s" + , title_str, line_data_str + , (disable_profiler || disable_coverage) ? "" : line_avg_str + , func_data_str, (disable_profiler || disable_coverage) ? "" : func_avg_str); + fclose(file); +} + +void TTCN3_Profiler::reset() +{ + prev_time = 0.0; + prev_file = NULL; + prev_line = -1; + prev_stack_len = 0; +} + +double TTCN3_Profiler::get_time() +{ + timeval tv; + gettimeofday(&tv, NULL); + return tv.tv_sec + tv.tv_usec / 1000000.0; +} + +void TTCN3_Profiler::enter_function(const char* filename, int lineno, const char* function_name) +{ + if (disable_profiler && disable_coverage) { + return; + } + + // Note that the execution time of the last line in a function + // is measured by using the stack depth. + execute_line(filename, lineno); + + int element = get_element(filename); + + // store function data + int func = get_function(element, lineno); + if (-1 == func) { + create_function(element, lineno, function_name); + func = profiler_db[element].functions.size() - 1; + } + + if (!disable_coverage) { + ++profiler_db[element].functions[func].exec_count; + } +} + +void TTCN3_Profiler::execute_line(const char* filename, int lineno) +{ + if (disable_profiler && disable_coverage) { + return; + } + + if (!disable_profiler) { + double currentTime = get_time(); + + // prev line should not be measured, because it is still running: we are in longer stack level + if (0.0 == prev_time || TTCN3_Stack_Depth::depth() > prev_stack_len) { + // add prev timer to call stack: + TTCN3_Stack_Depth::add_stack(prev_stack_len, prev_file, filename, prev_line, lineno); + } + else { + // if stack level is the same or higher: current line should be measured: + double elapsed = currentTime - prev_time; + + // add the elapsed time to the time of the previous line: + add_line_time(elapsed, get_element(prev_file), prev_line); + + TTCN3_Stack_Depth::update_stack_elapsed(elapsed); + } + } + + // several instructions could be in the same line, only count the line once + if (!disable_coverage && (lineno != prev_line || NULL == prev_file || + 0 != strcmp(prev_file, filename))) { + int element = get_element(filename); + + // make sure the line exists in the database + create_lines(element, lineno); + + // increase line execution count + ++profiler_db[element].lines[lineno].exec_count; + } + + // store the current location as previous for the next call + set_prev(disable_profiler ? -1 : TTCN3_Stack_Depth::depth(), filename, lineno); +} + +int TTCN3_Profiler::get_element(const char* filename) +{ + for (size_t i = 0; i < profiler_db.size(); ++i) { + if (0 == strcmp(profiler_db[i].filename, filename)) { + return i; + } + } + + profiler_db_item_t item; + item.filename = mcopystr(filename); + profiler_db.push_back(item); + return profiler_db.size() - 1; +} + +int TTCN3_Profiler::get_function(int element, int lineno) +{ + for (size_t i = 0; i < profiler_db[element].functions.size(); ++i) { + if (profiler_db[element].functions[i].lineno == lineno) { + return i; + } + } + return -1; +} + +void TTCN3_Profiler::create_function(int element, int lineno, const char* function_name) +{ + profiler_db_item_t::profiler_function_data_t func_data; + func_data.lineno = lineno; + func_data.total_time = 0.0; + func_data.exec_count = 0; + func_data.name = mcopystr(function_name); + profiler_db[element].functions.push_back(func_data); +} + +void TTCN3_Profiler::create_lines(int element, int lineno) +{ + // set 0 for the unknown lines + size_t line_no = lineno; + if (profiler_db[element].lines.size() <= line_no) { + for (size_t i = profiler_db[element].lines.size(); i <= line_no; ++i) { + profiler_db_item_t::profiler_line_data_t line_data; + line_data.total_time = 0.0; + line_data.exec_count = 0; + profiler_db[element].lines.push_back(line_data); + } + } +} + +void TTCN3_Profiler::add_line_time(double elapsed, int element, int lineno) +{ + if (-1 == lineno) { + return; + } + + // ensure the line data exists + create_lines(element, lineno); + + // increase the time of the line in the current file: + profiler_db[element].lines[lineno].total_time += elapsed; +} + +void TTCN3_Profiler::add_function_time(double elapsed, int element, int lineno) +{ + int func = get_function(element, lineno); + if (-1 == func) { + return; + } + profiler_db[element].functions[func].total_time += elapsed; +} + +void TTCN3_Profiler::update_last() +{ + if (0.0 == prev_time) { + return; + } + + double currentTime = get_time(); + double elapsed = currentTime - prev_time; + + int element = get_element(prev_file); + + // add the elapsed time to the time of the previous line: + add_line_time(elapsed, element, prev_line); + TTCN3_Stack_Depth::update_stack_elapsed(elapsed); + + // reset measurement: + prev_time = 0.0; +} + +void TTCN3_Profiler::set_prev(int stack_len, const char* filename, int lineno) +{ + prev_file = filename; + prev_line = lineno; + if (!disable_profiler) { + prev_time = get_time(); + prev_stack_len = stack_len; + } +} + +///////////////////////////////////// +///////// TTCN3_Stack_Depth ///////// +///////////////////////////////////// + +int TTCN3_Stack_Depth::current_depth = -1; +Vector<TTCN3_Stack_Depth::call_stack_timer_item_t> TTCN3_Stack_Depth::call_stack_timer_db; + +TTCN3_Stack_Depth::TTCN3_Stack_Depth() +{ + if (ttcn3_prof.is_profiler_disabled()) { + return; + } + ++current_depth; +} + +TTCN3_Stack_Depth::~TTCN3_Stack_Depth() +{ + if (ttcn3_prof.is_profiler_disabled()) { + return; + } + ttcn3_prof.update_last(); + remove_stack(); + if (0 == current_depth) { + ttcn3_prof.reset(); + } + --current_depth; +} + +void TTCN3_Stack_Depth::add_stack(int stack_len, const char* caller_file, const char* func_file, + int caller_line, int start_line) +{ + call_stack_timer_item_t item; + item.stack_len = stack_len; + item.caller_file = caller_file; + item.func_file = func_file; + item.caller_line = caller_line; + item.start_line = start_line; + item.elapsed = 0.0; + call_stack_timer_db.push_back(item); +} + +void TTCN3_Stack_Depth::remove_stack() +{ + // if stack level is the same or higher: measure the time: + double elapsed = call_stack_timer_db[current_depth].elapsed; + + int element = ttcn3_prof.get_element(call_stack_timer_db[current_depth].func_file); + + // add elapsed time to the total execution time of the previous line: + ttcn3_prof.add_function_time(elapsed, element, call_stack_timer_db[current_depth].start_line); + + ttcn3_prof.set_prev(call_stack_timer_db[current_depth].stack_len, + call_stack_timer_db[current_depth].caller_file, + call_stack_timer_db[current_depth].caller_line); + + call_stack_timer_db.erase_at(current_depth); +} + +void TTCN3_Stack_Depth::update_stack_elapsed(double elapsed) +{ + for(int i = 0; i <= current_depth; i++) { + call_stack_timer_db[i].elapsed += elapsed; + } +} \ No newline at end of file diff --git a/core/Profiler.hh b/core/Profiler.hh new file mode 100644 index 000000000..c84bb97a9 --- /dev/null +++ b/core/Profiler.hh @@ -0,0 +1,193 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2000-2015 Ericsson Telecom AB +// All rights reserved. This program and the accompanying materials +// are made available under the terms of the Eclipse Public License v1.0 +// which accompanies this distribution, and is available at +// http://www.eclipse.org/legal/epl-v10.html +/////////////////////////////////////////////////////////////////////////////// + +#ifndef PROFILER_HH +#define PROFILER_HH + +#include "Vector.hh" +#include "Types.h" + +/** This class performs profiling and code coverage on lines and functions in + * TTCN-3 code (requires the -z compiler option). + * Customizable through the configuration file's [PROFILER] section. */ +class TTCN3_Profiler { +public: + + /** Database entry for one file */ + struct profiler_db_item_t { + /** Database entry for one line */ + struct profiler_line_data_t { + /** The line's total execution time */ + double total_time; + /** The number of times this line was executed */ + int exec_count; + }; + /** Database entry for one function (including test cases, alt steps, the control part, etc.) */ + struct profiler_function_data_t { + /** Function name (owned) */ + char* name; + /** Function starting line */ + int lineno; + /** The function's total execution time */ + double total_time; + /** The number of times this function was executed */ + int exec_count; + }; + /** TTCN-3 File name (relative path, owned) */ + char* filename; + /** Contains database entries for all the lines in this file (its index is + * the line number, so there may be empty elements) */ + Vector<profiler_line_data_t> lines; + /** Contains database entries for all the functions in this file (one entry + * for each function) */ + Vector<profiler_function_data_t> functions; + }; + + /** Constructor */ + TTCN3_Profiler(); + /** Destructor - adds all gathered data to the database file and prints + * statistics if necessary */ + ~TTCN3_Profiler(); + + /** Enables or disables profiling - called by the config file parser */ + void set_disable_profiler(boolean p_disable_profiler); + /** Enables or disables code coverage - called by the config file parser */ + void set_disable_coverage(boolean p_disable_coverage); + /** Sets the database file name (default is "profiler.db" - called by the config file parser */ + void set_database_filename(const char* p_database_filename); + /** Enables or disables data aggregation - called by the config file parser */ + void set_aggregate_data(boolean p_aggregate_data); + /** Sets the statistics file name (default is "profiler.stats" - called by the config file parser */ + void set_stats_filename(const char* p_stats_filename); + /** Enables or disables the printing of statistics - called by the config file parser */ + void set_disable_stats(boolean p_disable_stats); + + /** Returns true if profiling is disabled */ + boolean is_profiler_disabled() const; + + /** Deletes the database file if data aggregation is not set */ + void init_data_file(); + /** Adds the data from the database file to the local database */ + void import_data(); + /** Writes the local database to the database file (overwrites the file) */ + void export_data(); + + /** Calculates and prints statistics from the gathered data */ + void print_stats(); + + /** Resets data related to the previous location and time (the local database is not changed) */ + void reset(); + /** Returns the current time (in seconds) */ + static double get_time(); + /** Called when a TTCN-3 function starts execution - stores data */ + void enter_function(const char* filename, int lineno, const char* function_name); + /** Called when a TTCN-3 code line starts execution - stores data */ + void execute_line(const char* filename, int lineno); + /** Returns the index of a TTCN-3 file's entry in the local database */ + int get_element(const char* filename); + /** Returns the index of a TTCN-3 function's entry in the database + * @param element index of the file (where the function is declared) + * @param lineno function start line */ + int get_function(int element, int lineno); + /** Creates a new TTCN-3 function entry and inserts it in the database + * @param element file entry's index + * @param lineno function start line + * @param function_name name of the function */ + void create_function(int element, int lineno, const char* function_name); + /** Creates TTCN-3 code line entries up to the given line number */ + void create_lines(int element, int lineno); + /** Adds elapsed time to the specified TTCN-3 code line's total time */ + void add_line_time(double elapsed, int element, int lineno); + /** Adds elapsed time to the specified TTCN-3 function's total time*/ + void add_function_time(double elapsed, int element, int lineno); + /** Called when a TTCN-3 function's execution ends - stores data */ + void update_last(); + /** Stores data related to the previous location */ + void set_prev(int stack_len, const char* filename, int lineno); + +private: + /** Profiling is disabled if true */ + boolean disable_profiler; + /** Code coverage is disabled if true */ + boolean disable_coverage; + /** Contains the database file name */ + char* database_filename; + /** If true, data gathered by previous runs will be added to the data gathered + * in this run */ + boolean aggregate_data; + /** Contains the statistics file name */ + char* stats_filename; + /** Statistics will not be calculated and printed if true */ + boolean disable_stats; + + /** The time measured at the previous TTCN-3 code line */ + double prev_time; + /** Name of the TTCN-3 file, where the last executed line is (not owned) */ + const char* prev_file; + /** The number of the previously executed line */ + int prev_line; + /** The local database */ + Vector<profiler_db_item_t> profiler_db; + /** The stack length at the previously executed line */ + int prev_stack_len; +}; + +/** The global TTCN3_Profiler object + * + * One instance is created in each process (in parallel mode). + * After construction the configuration file parser may change the profiler's settings. + * The destructor merges its data with that of other processes (and possibly with previous runs) + * through the database file. The last destructor (the one in the Host Controller's process) + * prints the statistics (if enabled). */ +extern TTCN3_Profiler ttcn3_prof; + +/** Helper class for profiling + * + * Its instances depict the current call stack. One instance is created at the start + * of each TTCN-3 function execution, and it's destroyed at the function's end. */ +class TTCN3_Stack_Depth { +public: + /** Entry for one function call in the call stack */ + struct call_stack_timer_item_t { + /** Stack length before the function call */ + int stack_len; + /** File name, where the calling function is declared (not owned) */ + const char* caller_file; + /** File name, where the called function is declared (not owned)*/ + const char* func_file; + /** Calling function's start line */ + int caller_line; + /** Called function's start line */ + int start_line; + /** Time elapsed in this function call */ + double elapsed; + }; + + /** Constructor - increases the stack depth */ + TTCN3_Stack_Depth(); + /** Destructor - decreases the stack depth, updates call times in the profiler */ + ~TTCN3_Stack_Depth(); + + /** Returns the current stack depth */ + static int depth() { return current_depth; } + /** Inserts a new function call entry into the call stack database */ + static void add_stack(int stack_len, const char* caller_file, const char* func_file, + int caller_line, int start_line); + /** Removes the last entry from the call stack database */ + static void remove_stack(); + /** Adds the elapsed time to all entries in the call stack database */ + static void update_stack_elapsed(double elapsed); +private: + /** The current stack depth (starts from 0)*/ + static int current_depth; + /** The call stack database */ + static Vector<call_stack_timer_item_t> call_stack_timer_db; +}; + +#endif /* PROFILER_HH */ + diff --git a/core/Template.hh b/core/Template.hh index de50db9d1..44ccdc483 100644 --- a/core/Template.hh +++ b/core/Template.hh @@ -161,9 +161,11 @@ public: boolean is_omit() const; boolean is_any_or_omit() const; - // Dummy functions, only used in record of/set of value +#ifdef TITAN_RUNTIME_2 + // Dummy functions, only used in record of/set of value in RT2 void add_refd_index(int) {} void remove_refd_index(int) {} +#endif }; #ifndef TITAN_RUNTIME_2 diff --git a/core/Universal_charstring.cc b/core/Universal_charstring.cc index 12a39eb1b..330f4f27b 100644 --- a/core/Universal_charstring.cc +++ b/core/Universal_charstring.cc @@ -1079,7 +1079,7 @@ void UNIVERSAL_CHARSTRING::encode(const TTCN_Typedescriptor_t& p_td, default: // nothing to do break; } - XER_encode(*p_td.xer,p_buf, XER_coding, 0); + XER_encode(*p_td.xer,p_buf, XER_coding, 0, 0); p_buf.put_c('\n'); break; } case TTCN_EncDec::CT_JSON: { @@ -1126,7 +1126,7 @@ void UNIVERSAL_CHARSTRING::decode(const TTCN_Typedescriptor_t& p_td, if (type==XML_READER_TYPE_ELEMENT) break; } - XER_decode(*p_td.xer, reader, XER_coding); + XER_decode(*p_td.xer, reader, XER_coding, 0); size_t bytes = reader.ByteConsumed(); p_buf.set_pos(bytes); break; } @@ -1486,7 +1486,7 @@ boolean UNIVERSAL_CHARSTRING::BER_decode_TLV extern void xml_escape(const unsigned int c, TTCN_Buffer& p_buf); int UNIVERSAL_CHARSTRING::XER_encode(const XERdescriptor_t& p_td, - TTCN_Buffer& p_buf, unsigned int flavor, int indent) const + TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const { if(!is_bound()) { TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_UNBOUND, @@ -1799,7 +1799,7 @@ in_word_set (const char *str, unsigned int len) universal_char const uspace = {0,0,0,32}; int UNIVERSAL_CHARSTRING::XER_decode(const XERdescriptor_t& p_td, - XmlReaderWrap& reader, unsigned int flavor) + XmlReaderWrap& reader, unsigned int flavor, embed_values_dec_struct_t*) { int exer = is_exer(flavor); int success = reader.Ok(), depth = -1; diff --git a/core/Universal_charstring.hh b/core/Universal_charstring.hh index 518503279..62ea9fbf9 100644 --- a/core/Universal_charstring.hh +++ b/core/Universal_charstring.hh @@ -318,8 +318,8 @@ public: boolean BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, const ASN_BER_TLV_t& p_tlv, unsigned L_form); - int XER_encode(const XERdescriptor_t&, TTCN_Buffer&, unsigned int, int) const; - int XER_decode(const XERdescriptor_t&, XmlReaderWrap& reader, unsigned int); + int XER_encode(const XERdescriptor_t&, TTCN_Buffer&, unsigned int, int, embed_values_enc_struct_t*) const; + int XER_decode(const XERdescriptor_t&, XmlReaderWrap& reader, unsigned int, embed_values_dec_struct_t*); /** Decodes UTF-8 into the internal representation (UCS4-BE) * * @param n_octets number of UTF-8 bytes (not characters) diff --git a/core/Verdicttype.cc b/core/Verdicttype.cc index 9cf0f8733..e8ba46055 100644 --- a/core/Verdicttype.cc +++ b/core/Verdicttype.cc @@ -154,7 +154,7 @@ void VERDICTTYPE::encode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, case TTCN_EncDec::CT_XER: { TTCN_EncDec_ErrorContext ec("While XER-encoding type '%s': ", p_td.name); unsigned XER_coding=va_arg(pvar, unsigned); - XER_encode(*p_td.xer, p_buf, XER_coding, 0); + XER_encode(*p_td.xer, p_buf, XER_coding, 0, 0); break;} case TTCN_EncDec::CT_JSON: { TTCN_EncDec_ErrorContext ec("While JSON-encoding type '%s': ", p_td.name); @@ -227,7 +227,7 @@ void VERDICTTYPE::decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, if (type==XML_READER_TYPE_ELEMENT) break; } - XER_decode(*p_td.xer, reader, XER_coding); + XER_decode(*p_td.xer, reader, XER_coding, 0); size_t bytes = reader.ByteConsumed(); p_buf.set_pos(bytes); break;} @@ -253,7 +253,7 @@ void VERDICTTYPE::decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, int VERDICTTYPE::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, - unsigned int p_flavor, int p_indent) const + unsigned int p_flavor, int p_indent, embed_values_enc_struct_t*) const { int encoded_length=(int)p_buf.get_len(); //const boolean e_xer = is_exer(p_flavor); @@ -285,7 +285,7 @@ verdicttype VERDICTTYPE::str_to_verdict(const char *v, boolean silent) } int VERDICTTYPE::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& p_reader, - unsigned int p_flavor) + unsigned int p_flavor, embed_values_dec_struct_t*) { int rd_ok = 1, type; const int e_xer = is_exer(p_flavor); diff --git a/core/Verdicttype.hh b/core/Verdicttype.hh index ea0fdd88b..4ea1a52c1 100644 --- a/core/Verdicttype.hh +++ b/core/Verdicttype.hh @@ -82,9 +82,9 @@ public: TTCN_EncDec::coding_t p_coding, ...); int XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, - unsigned int flavor, int indent) const; + unsigned int flavor, int indent, embed_values_enc_struct_t*) const; int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, - unsigned int flavor); + unsigned int flavor, embed_values_dec_struct_t*); /** Encodes accordingly to the JSON encoding rules. * Returns the length of the encoded data. */ diff --git a/core/XER.hh b/core/XER.hh index 27c6da5c1..604ca048f 100644 --- a/core/XER.hh +++ b/core/XER.hh @@ -16,6 +16,10 @@ class XmlReaderWrap; class Base_Type; +#ifdef TITAN_RUNTIME_2 +class Record_Of_Type; +class Erroneous_descriptor_t; +#endif class TTCN_Module; /** @defgroup XER XER codec @@ -171,7 +175,7 @@ inline bool is_exerlist(unsigned int f) * Example: * @code * int Foo::XER_encode(const XERdescriptor_t& p_td, - * TTCN_Buffer& p_buf, unsigned int flavor, int indent) const { + * TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const { * int canon = is_canonical(flavor); * if (!canon) do_indent(p_buf, indent); * // output the start tag @@ -193,7 +197,7 @@ inline bool is_exerlist(unsigned int f) * * @code * int Foo::XER_encode(const XERdescriptor_t& p_td, - * TTCN_Buffer& p_buf, unsigned int flavor, int indent) const { + * TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const { * int canon = is_canonical(flavor); * if (!canon) do_indent(p_buf, indent); * // output an empty element tag @@ -253,6 +257,51 @@ struct XERdescriptor_t const char** ns_uris; }; +/** Information related to the embedded values in XML encoding + * + * Used when a record/set with the EMBED-VALUES coding instruction contains + * one or more record of/set of fields. */ +struct embed_values_enc_struct_t +{ +#ifdef TITAN_RUNTIME_2 + /** Stores the array of embedded values */ + const Record_Of_Type* embval_array; + /** Stores the erroneous descriptor of the embedded values field (for negative tests) */ + const Erroneous_descriptor_t* embval_err; + /** Error value index for the embedded values (for negative tests) */ + int embval_err_val_idx; + /** Erroneous descriptor index for the embedded values (for negative tests) */ + int embval_err_descr_idx; +#else + /** Stores the array of embedded values as a Base_Type (use get_embedded_value + * to retrieve values - temporarily disabled) */ + const Base_Type* embval_array; + /** Stores the size of the embedded value array */ + int embval_size; +#endif + /** Stores the index of the next embedded value to be read */ + int embval_index; +}; + +/** Information related to the embedded values in XML decoding + * + * Used when a record/set with the EMBED-VALUES coding instruction contains + * one or more record of/set of fields. */ +struct embed_values_dec_struct_t +{ +#ifdef TITAN_RUNTIME_2 + /** Stores the array of embedded values */ + Record_Of_Type* embval_array; +#else + /** Stores the array of embedded values as a Base_type (use set_embedded_value + * to insert new values - temporarily disabled) */ + Base_Type* embval_array; +#endif + /** Stores the number of embedded values that are currently in the array, + * and the index where the next one should be inserted */ + int embval_index; +}; + /** Check the name of an XML node against a XER type descriptor. * * @param name the (local, unqualified) name of the XML element diff --git a/core/config_process.l b/core/config_process.l index a1bdde0e3..4d96260b1 100644 --- a/core/config_process.l +++ b/core/config_process.l @@ -121,7 +121,7 @@ TTCNSTRINGPARSING_COMPONENT "$#&&&(#TTCNSTRINGPARSING_COMPONENT$#&&^#% " %x SC_commentblock SC_cstring SC_DEFINE %s SC_MODULE_PARAMETERS SC_LOGGING SC_TESTPORT_PARAMETERS SC_EXECUTE SC_GROUPS %s SC_COMPONENTS SC_EXTERNAL_COMMANDS SC_MAIN_CONTROLLER SC_INCLUDE SC_ORDERED_INCLUDE -%s SC_STRING2TTCN_COMPONENT +%s SC_STRING2TTCN_COMPONENT SC_PROFILER %% @@ -185,6 +185,13 @@ TTCNSTRINGPARSING_COMPONENT "$#&&&(#TTCNSTRINGPARSING_COMPONENT$#&&^#% " } } +<*>"["{WS}PROFILER{WS}"]" { + if (YY_START!=SC_commentblock && YY_START!=SC_cstring) { + BEGIN(SC_PROFILER); + return ProfilerKeyword; + } +} + <*>"["{WS}TESTPORT_PARAMETERS{WS}"]" { if (YY_START!=SC_commentblock && YY_START!=SC_cstring) { BEGIN(SC_TESTPORT_PARAMETERS); @@ -493,7 +500,7 @@ ifpresent return IfpresentKeyword; infinity return InfinityKeyword; } -<SC_MODULE_PARAMETERS,SC_LOGGING> +<SC_MODULE_PARAMETERS,SC_LOGGING,SC_PROFILER> { true { yylval.bool_val = TRUE; @@ -957,6 +964,16 @@ LOG_ALL { [Dd]elete return Delete; } +<SC_PROFILER> +{ + [Dd]isable[Pp]rofiler return DisableProfilerKeyword; + [Dd]isable[Cc]overage return DisableCoverageKeyword; + [Dd]ata[Bb]ase[Ff]ile return DatabaseFileKeyword; + [Aa]ggregate[Dd]ata return AggregateDataKeyword; + [Ss]tatistics[Ff]ile return StatisticsFileKeyword; + [Dd]isable[Ss]tatistics return DisableStatisticsKeyword; +} + <SC_EXECUTE>control return ControlKeyword; <SC_EXTERNAL_COMMANDS> diff --git a/core/config_process.y b/core/config_process.y index dad40098c..92c209798 100644 --- a/core/config_process.y +++ b/core/config_process.y @@ -37,6 +37,8 @@ #include "LoggingBits.hh" #include "LoggingParam.hh" +#include "Profiler.hh" + #define YYERROR_VERBOSE #include "config_process.lex.hh" @@ -128,6 +130,7 @@ string_map_t *config_defines; %token ModuleParametersKeyword %token LoggingKeyword +%token ProfilerKeyword %token TestportParametersKeyword %token ExecuteKeyword %token ExternalCommandsKeyword @@ -216,6 +219,12 @@ string_map_t *config_defines; %token Retry %token Delete %token TtcnStringParsingKeyword +%token DisableProfilerKeyword "DisableProfiler" +%token DisableCoverageKeyword "DisableCoverage" +%token DatabaseFileKeyword "DatabaseFile" +%token AggregateDataKeyword "AggregateData" +%token StatisticsFileKeyword "StatisticsFile" +%token DisableStatisticsKeyword "DisableStatistics" %type <int_val> IntegerValue %type <float_val> FloatValue @@ -375,6 +384,7 @@ ConfigFile: Section: ModuleParametersSection | LoggingSection + | ProfilerSection | TestportParametersSection | ExecuteSection | ExternalCommandsSection @@ -1660,6 +1670,62 @@ LogEventTypesValue: | Detailed { $$ = TTCN_Logger::LOGEVENTTYPES_SUBCATEGORIES; } ; +/*********************** [PROFILER] ********************************/ + +ProfilerSection: + ProfilerKeyword ProfilerSettings +; + +ProfilerSettings: + /* empty */ +| ProfilerSettings ProfilerSetting optSemiColon +; + +ProfilerSetting: + DisableProfilerSetting +| DisableCoverageSetting +| DatabaseFileSetting +| AggregateDataSetting +| StatisticsFileSetting +| DisableStatisticsSetting +; + +DisableProfilerSetting: + DisableProfilerKeyword AssignmentChar BooleanValue { + ttcn3_prof.set_disable_profiler($3); + } +; + +DisableCoverageSetting: + DisableCoverageKeyword AssignmentChar BooleanValue { + ttcn3_prof.set_disable_coverage($3); + } +; + +DatabaseFileSetting: + DatabaseFileKeyword AssignmentChar StringValue { + ttcn3_prof.set_database_filename($3); + } +; + +AggregateDataSetting: + AggregateDataKeyword AssignmentChar BooleanValue { + ttcn3_prof.set_aggregate_data($3); + } +; + +StatisticsFileSetting: + StatisticsFileKeyword AssignmentChar StringValue { + ttcn3_prof.set_stats_filename($3); + } +; + +DisableStatisticsSetting: + DisableStatisticsKeyword AssignmentChar BooleanValue { + ttcn3_prof.set_disable_stats($3); + } +; + /**************** [TESTPORT_PARAMETERS] ****************************/ TestportParametersSection: @@ -2141,6 +2207,8 @@ boolean process_config_file(const char *file_name) string_map_free(config_defines); config_defines = NULL; + ttcn3_prof.init_data_file(); + return !error_flag; } diff --git a/core2/Basetype2.cc b/core2/Basetype2.cc index 7a2114789..c3389472e 100644 --- a/core2/Basetype2.cc +++ b/core2/Basetype2.cc @@ -176,9 +176,9 @@ int Base_Type::RAW_encode_negtest_raw(RAW_enc_tree&) const } int Base_Type::XER_encode_negtest(const Erroneous_descriptor_t* /*p_err_descr*/, - const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, unsigned int flavor, int indent) const + const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const { - return XER_encode(p_td, p_buf, flavor, indent); // ignore erroneous + return XER_encode(p_td, p_buf, flavor, indent, 0); // ignore erroneous } int Base_Type::RAW_encode_negtest(const Erroneous_descriptor_t *, @@ -225,7 +225,7 @@ void Record_Of_Type::clean_up() val_ptr = NULL; } else if (val_ptr->ref_count == 1) { - if (refd_indices.empty()) { + if (NULL == refd_ind_ptr) { for (int elem_count = 0; elem_count < val_ptr->n_elements; elem_count++) { if (val_ptr->value_elements[elem_count] != NULL) { delete val_ptr->value_elements[elem_count]; @@ -247,7 +247,7 @@ void Record_Of_Type::clean_up() } Record_Of_Type::Record_Of_Type(null_type /*other_value*/) -: Base_Type(), val_ptr(new recordof_setof_struct), err_descr(NULL), max_refd_index(-1) +: Base_Type(), val_ptr(new recordof_setof_struct), err_descr(NULL), refd_ind_ptr(NULL) { val_ptr->ref_count = 1; val_ptr->n_elements = 0; @@ -255,13 +255,13 @@ Record_Of_Type::Record_Of_Type(null_type /*other_value*/) } Record_Of_Type::Record_Of_Type(const Record_Of_Type& other_value) -: Base_Type(other_value), val_ptr(NULL), err_descr(other_value.err_descr), max_refd_index(-1) +: Base_Type(other_value), val_ptr(NULL), err_descr(other_value.err_descr), refd_ind_ptr(NULL) { if (!other_value.is_bound()) TTCN_error("Copying an unbound record of/set of value."); // Increment ref_count only if val_ptr is not NULL if (other_value.val_ptr != NULL) { - if (other_value.refd_indices.empty()) { + if (NULL == other_value.refd_ind_ptr) { val_ptr = other_value.val_ptr; val_ptr->ref_count++; } @@ -281,7 +281,7 @@ Record_Of_Type::Record_Of_Type(const Record_Of_Type& other_value) int Record_Of_Type::get_nof_elements() const { int nof_elements = (val_ptr != NULL) ? val_ptr->n_elements : 0; - if (!refd_indices.empty()) { + if (NULL != refd_ind_ptr) { while (nof_elements > 0) { if (is_elem_bound(nof_elements - 1)) { break; @@ -300,23 +300,26 @@ bool Record_Of_Type::is_elem_bound(int index) const int Record_Of_Type::get_max_refd_index() { - if (refd_indices.empty()) { + if (NULL == refd_ind_ptr) { return -1; } - if (-1 == max_refd_index) { - for (size_t i = 0; i < refd_indices.size(); ++i) { - if (refd_indices[i] > max_refd_index) { - max_refd_index = refd_indices[i]; + if (-1 == refd_ind_ptr->max_refd_index) { + for (size_t i = 0; i < refd_ind_ptr->refd_indices.size(); ++i) { + if (refd_ind_ptr->refd_indices[i] > refd_ind_ptr->max_refd_index) { + refd_ind_ptr->max_refd_index = refd_ind_ptr->refd_indices[i]; } } } - return max_refd_index; + return refd_ind_ptr->max_refd_index; } bool Record_Of_Type::is_index_refd(int index) { - for (size_t i = 0; i < refd_indices.size(); ++i) { - if (index == refd_indices[i]) { + if (NULL == refd_ind_ptr) { + return false; + } + for (size_t i = 0; i < refd_ind_ptr->refd_indices.size(); ++i) { + if (index == refd_ind_ptr->refd_indices[i]) { return true; } } @@ -362,7 +365,7 @@ void Record_Of_Type::set_value(const Base_Type* other_value) TTCN_error("Assigning an unbound value of type %s.", other_value->get_descriptor()->name); if (this != other_recof) { - if (refd_indices.empty() && other_recof->refd_indices.empty()) { + if (NULL == refd_ind_ptr && NULL == other_recof->refd_ind_ptr) { clean_up(); val_ptr = other_recof->val_ptr; val_ptr->ref_count++; @@ -733,7 +736,7 @@ void Record_Of_Type::set_size(int new_size) boolean Record_Of_Type::is_bound() const { - if (refd_indices.empty()) { + if (NULL == refd_ind_ptr) { return (val_ptr != NULL); } return (get_nof_elements() != 0); @@ -1020,7 +1023,7 @@ int Record_Of_Type::TEXT_decode(const TTCN_Typedescriptor_t& p_td, break; } sep_found=FALSE; - if (refd_indices.empty()) { + if (NULL == refd_ind_ptr) { val_ptr->value_elements = (Base_Type**)reallocate_pointers( (void**)val_ptr->value_elements, val_ptr->n_elements, val_ptr->n_elements + 1); val_ptr->value_elements[val_ptr->n_elements]=val; @@ -1469,7 +1472,7 @@ int Record_Of_Type::JSON_decode(const TTCN_Typedescriptor_t& p_td, JSON_Tokenize } return JSON_ERROR_FATAL; } - if (refd_indices.empty()) { + if (NULL == refd_ind_ptr) { val_ptr->value_elements = (Base_Type**)reallocate_pointers( (void**)val_ptr->value_elements, val_ptr->n_elements, val_ptr->n_elements + 1); val_ptr->value_elements[val_ptr->n_elements] = val; @@ -1528,7 +1531,7 @@ void Record_Of_Type::encode(const TTCN_Typedescriptor_t& p_td, case TTCN_EncDec::CT_XER: { TTCN_EncDec_ErrorContext ec("While XER-encoding type '%s': ", p_td.name); unsigned XER_coding=va_arg(pvar, unsigned); - XER_encode(*(p_td.xer),p_buf, XER_coding, 0); + XER_encode(*(p_td.xer),p_buf, XER_coding, 0, 0); p_buf.put_c('\n'); break;} case TTCN_EncDec::CT_JSON: { @@ -1598,7 +1601,7 @@ void Record_Of_Type::decode(const TTCN_Typedescriptor_t& p_td, for (int success=reader.Read(); success==1; success=reader.Read()) { if (reader.NodeType() == XML_READER_TYPE_ELEMENT) break; } - XER_decode(*(p_td.xer), reader, XER_coding | XER_TOPLEVEL); + XER_decode(*(p_td.xer), reader, XER_coding | XER_TOPLEVEL, 0); size_t bytes = reader.ByteConsumed(); p_buf.set_pos(bytes); break;} @@ -1652,10 +1655,10 @@ static const universal_char sp = { 0,0,0,' ' }; static const universal_char tb = { 0,0,0,9 }; int Record_Of_Type::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, - unsigned int flavor, int indent) const + unsigned int flavor, int indent, embed_values_enc_struct_t* emb_val) const { if (err_descr) { - return XER_encode_negtest(err_descr, p_td, p_buf, flavor, indent); + return XER_encode_negtest(err_descr, p_td, p_buf, flavor, indent, emb_val); } if (val_ptr == 0) TTCN_error( @@ -1745,7 +1748,7 @@ int Record_Of_Type::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, check_namespace_restrictions(p_td, (const char*)cs); } before.XER_encode(UNIVERSAL_CHARSTRING_xer_, p_buf, - flavor | ANY_ATTRIBUTES, indent); + flavor | ANY_ATTRIBUTES, indent, 0); p_buf.put_c('\''); p_buf.put_c(' '); @@ -1767,7 +1770,7 @@ int Record_Of_Type::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, UNIVERSAL_CHARSTRING after(len - j, (const universal_char*)(*elem) + j); after.XER_encode(UNIVERSAL_CHARSTRING_xer_, p_buf, - flavor | ANY_ATTRIBUTES, indent); + flavor | ANY_ATTRIBUTES, indent, 0); // Put this attribute in a dummy element and walk through it to check its validity TTCN_Buffer check_buf; @@ -1785,9 +1788,15 @@ int Record_Of_Type::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, unsigned int sub_flavor = flavor | XER_RECOF | (p_td.xer_bits & (XER_LIST)); for (int i = 0; i < nof_elements; ++i) { + if (i > 0 && !own_tag && 0 != emb_val && + emb_val->embval_index < emb_val->embval_array->size_of()) { + emb_val->embval_array->get_at(emb_val->embval_index)->XER_encode( + UNIVERSAL_CHARSTRING_xer_, p_buf, flavor | EMBED_VALUES, indent+1, 0); + ++emb_val->embval_index; + } if (exer && (p_td.xer_bits & XER_LIST) && i>0) p_buf.put_c(' '); get_at(i)->XER_encode(*get_elem_descr()->xer, p_buf, - sub_flavor, indent+own_tag); + sub_flavor, indent+own_tag, emb_val); } if (indenting && nof_elements && !is_exerlist(flavor)) { @@ -1817,7 +1826,7 @@ int Record_Of_Type::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, */ int Record_Of_Type::encode_element(int i, const Erroneous_values_t* ev, const Erroneous_descriptor_t* ed, - TTCN_Buffer& p_buf, unsigned int sub_flavor, int indent) const + TTCN_Buffer& p_buf, unsigned int sub_flavor, int indent, embed_values_enc_struct_t* emb_val) const { int enc_len = p_buf.get_len(); TTCN_EncDec_ErrorContext ec; @@ -1834,7 +1843,7 @@ int Record_Of_Type::encode_element(int i, if (ev->before->type_descr==NULL) TTCN_error( "internal error: erroneous before type descriptor missing"); ev->before->errval->XER_encode(*ev->before->type_descr->xer, - p_buf, sub_flavor, indent); + p_buf, sub_flavor, indent, 0); } } @@ -1854,16 +1863,16 @@ int Record_Of_Type::encode_element(int i, if (ev->value->type_descr==NULL) TTCN_error( "internal error: erroneous value type descriptor missing"); ev->value->errval->XER_encode(*ev->value->type_descr->xer, - p_buf, sub_flavor, indent); + p_buf, sub_flavor, indent, 0); } } // else -> omit } else { ec.set_msg("Component #%d: ", i); if (ed) { - get_at(i)->XER_encode_negtest(ed, *get_elem_descr()->xer, p_buf, sub_flavor, indent); + get_at(i)->XER_encode_negtest(ed, *get_elem_descr()->xer, p_buf, sub_flavor, indent, emb_val); } else { // the "real" encoder - get_at(i)->XER_encode(*get_elem_descr()->xer, p_buf, sub_flavor, indent); + get_at(i)->XER_encode(*get_elem_descr()->xer, p_buf, sub_flavor, indent, emb_val); } } @@ -1878,7 +1887,7 @@ int Record_Of_Type::encode_element(int i, if (ev->after->type_descr==NULL) TTCN_error( "internal error: erroneous after type descriptor missing"); ev->after->errval->XER_encode(*ev->after->type_descr->xer, - p_buf, sub_flavor, indent); + p_buf, sub_flavor, indent, 0); } } @@ -1887,7 +1896,8 @@ int Record_Of_Type::encode_element(int i, // XERSTUFF Record_Of_Type::XER_encode_negtest int Record_Of_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr, - const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, unsigned flavor, int indent) const + const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, unsigned flavor, int indent, + embed_values_enc_struct_t* emb_val) const { if (val_ptr == 0) TTCN_error( "Attempt to XER-encode an unbound record of type %s", get_descriptor()->name); @@ -1949,7 +1959,7 @@ int Record_Of_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr if (ev->before->type_descr==NULL) TTCN_error( "internal error: erroneous before type descriptor missing"); else ev->before->errval->XER_encode(*ev->before->type_descr->xer, - p_buf, flavor, indent); + p_buf, flavor, indent, 0); } } @@ -1960,7 +1970,7 @@ int Record_Of_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr if (ev->value->type_descr==NULL) TTCN_error( "internal error: erroneous value type descriptor missing"); else ev->value->errval->XER_encode(*ev->value->type_descr->xer, - p_buf, flavor, indent); + p_buf, flavor, indent, 0); } } } @@ -2001,7 +2011,7 @@ int Record_Of_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr UNIVERSAL_CHARSTRING before(sp_at, (const universal_char*)(*elem)); before.XER_encode(UNIVERSAL_CHARSTRING_xer_, p_buf, - flavor | ANY_ATTRIBUTES, indent); + flavor | ANY_ATTRIBUTES, indent, 0); p_buf.put_c('\''); p_buf.put_c(' '); @@ -2018,7 +2028,7 @@ int Record_Of_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr UNIVERSAL_CHARSTRING after(len - j, (const universal_char*)(*elem) + j); after.XER_encode(UNIVERSAL_CHARSTRING_xer_, p_buf, - flavor | ANY_ATTRIBUTES, indent); + flavor | ANY_ATTRIBUTES, indent, 0); } } @@ -2031,7 +2041,7 @@ int Record_Of_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr if (ev->after->type_descr==NULL) TTCN_error( "internal error: erroneous after type descriptor missing"); else ev->after->errval->XER_encode(*ev->after->type_descr->xer, - p_buf, flavor, indent); + p_buf, flavor, indent, 0); } } } @@ -2050,13 +2060,26 @@ int Record_Of_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr for (int i = 0; i < nof_elements; ++i) { if (i < p_err_descr->omit_before) continue; + + if (0 != emb_val && i > 0 && !own_tag && + emb_val->embval_index < emb_val->embval_array->size_of()) { + const Erroneous_values_t * ev0_i = NULL; + const Erroneous_descriptor_t* ed0_i = NULL; + if (emb_val->embval_err) { + ev0_i = emb_val->embval_err->next_field_err_values(emb_val->embval_index, emb_val->embval_err_val_idx); + ed0_i = emb_val->embval_err->next_field_emb_descr (emb_val->embval_index, emb_val->embval_err_descr_idx); + } + emb_val->embval_array->encode_element(emb_val->embval_index, ev0_i, ed0_i, + p_buf, flavor | EMBED_VALUES, indent + own_tag, 0); + ++emb_val->embval_index; + } const Erroneous_values_t* err_vals = p_err_descr->next_field_err_values(i, values_idx); const Erroneous_descriptor_t* emb_descr = p_err_descr->next_field_emb_descr (i, edescr_idx); - encode_element(i, err_vals, emb_descr, p_buf, sub_flavor, indent+own_tag); + encode_element(i, err_vals, emb_descr, p_buf, sub_flavor, indent+own_tag, emb_val); // omit_after value -1 becomes "very big" if ((unsigned int)i >= (unsigned int)p_err_descr->omit_after) break; @@ -2073,7 +2096,7 @@ int Record_Of_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr } int Record_Of_Type::XER_decode(const XERdescriptor_t& p_td, - XmlReaderWrap& reader, unsigned int flavor) + XmlReaderWrap& reader, unsigned int flavor, embed_values_dec_struct_t* emb_val) { int exer = is_exer(flavor); int xerbits = p_td.xer_bits; @@ -2152,7 +2175,7 @@ int Record_Of_Type::XER_decode(const XERdescriptor_t& p_td, // The call to the non-const operator[], I mean get_at(), creates // a new element (because it is indexing one past the last element). // Then we call its XER_decode with the temporary XML reader. - get_at(get_nof_elements())->XER_decode(sub_xer, reader2, flavor); + get_at(get_nof_elements())->XER_decode(sub_xer, reader2, flavor, 0); if (flavor & EXIT_ON_ERROR && !is_elem_bound(get_nof_elements() - 1)) { if (1 == get_nof_elements()) { // Failed to decode even the first element @@ -2218,7 +2241,10 @@ int Record_Of_Type::XER_decode(const XERdescriptor_t& p_td, } ec_1.set_msg("%d: ", get_nof_elements()); /* The call to the non-const get_at() creates the element */ - get_at(get_nof_elements())->XER_decode(*get_elem_descr()->xer, reader, flavor); + get_at(get_nof_elements())->XER_decode(*get_elem_descr()->xer, reader, flavor, emb_val); + if (0 != emb_val && !own_tag && get_nof_elements() > 1) { + ++emb_val->embval_index; + } } } else if (XML_READER_TYPE_END_ELEMENT == type) { @@ -2231,6 +2257,11 @@ int Record_Of_Type::XER_decode(const XERdescriptor_t& p_td, } break; } + else if (XML_READER_TYPE_TEXT == type && 0 != emb_val && !own_tag && get_nof_elements() > 0) { + UNIVERSAL_CHARSTRING emb_ustr((const char*)reader.Value()); + emb_val->embval_array->get_at(emb_val->embval_index)->set_value(&emb_ustr); + success = reader.Read(); + } else { success = reader.Read(); } @@ -2317,22 +2348,30 @@ void Record_Of_Type::set_implicit_omit() void Record_Of_Type::add_refd_index(int index) { - refd_indices.push_back(index); + if (NULL == refd_ind_ptr) { + refd_ind_ptr = new refd_index_struct; + refd_ind_ptr->max_refd_index = -1; + } + refd_ind_ptr->refd_indices.push_back(index); if (index > get_max_refd_index()) { - max_refd_index = index; + refd_ind_ptr->max_refd_index = index; } } void Record_Of_Type::remove_refd_index(int index) { - for (size_t i = refd_indices.size(); i > 0; --i) { - if (refd_indices[i - 1] == index) { - refd_indices.erase_at(i - 1); + for (size_t i = refd_ind_ptr->refd_indices.size(); i > 0; --i) { + if (refd_ind_ptr->refd_indices[i - 1] == index) { + refd_ind_ptr->refd_indices.erase_at(i - 1); break; } } - if (get_max_refd_index() == index) { - max_refd_index = -1; + if (refd_ind_ptr->refd_indices.empty()) { + delete refd_ind_ptr; + refd_ind_ptr = NULL; + } + else if (get_max_refd_index() == index) { + refd_ind_ptr->max_refd_index = -1; } } @@ -2592,7 +2631,7 @@ void Record_Type::encode(const TTCN_Typedescriptor_t& p_td, case TTCN_EncDec::CT_XER: { TTCN_EncDec_ErrorContext ec("While XER-encoding type '%s': ", p_td.name); unsigned XER_coding=va_arg(pvar, unsigned); - XER_encode(*(p_td.xer),p_buf, XER_coding, 0); + XER_encode(*(p_td.xer),p_buf, XER_coding, 0, 0); p_buf.put_c('\n'); break;} case TTCN_EncDec::CT_JSON: { @@ -2678,7 +2717,7 @@ void Record_Type::decode(const TTCN_Typedescriptor_t& p_td, for (int success=reader.Read(); success==1; success=reader.Read()) { if (reader.NodeType() == XML_READER_TYPE_ELEMENT) break; } - XER_decode(*(p_td.xer), reader, XER_coding | XER_TOPLEVEL); + XER_decode(*(p_td.xer), reader, XER_coding | XER_TOPLEVEL, 0); size_t bytes = reader.ByteConsumed(); p_buf.set_pos(bytes); break;} @@ -3851,10 +3890,10 @@ int Record_Type::get_index_byname(const char *name, const char *uri) const { } int Record_Type::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, - unsigned int flavor, int indent) const + unsigned int flavor, int indent, embed_values_enc_struct_t*) const { if (err_descr) { - return XER_encode_negtest(err_descr, p_td, p_buf, flavor, indent); + return XER_encode_negtest(err_descr, p_td, p_buf, flavor, indent, 0); } if (!is_bound()) { TTCN_EncDec_ErrorContext::error @@ -3961,7 +4000,7 @@ int Record_Type::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, const Base_Type * const q_uri = get_at(0); if (q_uri->is_present()) { p_buf.put_s(11, (cbyte*)" xmlns:b0='"); - q_uri->XER_encode(*xer_descr(0), p_buf, flavor | XER_LIST, indent+1); + q_uri->XER_encode(*xer_descr(0), p_buf, flavor | XER_LIST, indent+1, 0); p_buf.put_c('\''); } @@ -3973,18 +4012,18 @@ int Record_Type::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, sub_len += 3; } const Base_Type* const q_name = get_at(1); - sub_len += q_name->XER_encode(*xer_descr(1), p_buf, flavor | XER_LIST, indent+1); + sub_len += q_name->XER_encode(*xer_descr(1), p_buf, flavor | XER_LIST, indent+1, 0); if (p_td.xer_bits & XER_ATTRIBUTE) p_buf.put_c('\''); } else { // not USE-QNAME if (!exer && (p_td.xer_bits & EMBED_VALUES)) { // The EMBED-VALUES member as an ordinary record of string - sub_len += embed_values->XER_encode(*xer_descr(0), p_buf, flavor, indent+1); + sub_len += embed_values->XER_encode(*xer_descr(0), p_buf, flavor, indent+1, 0); } if (!exer && (p_td.xer_bits & USE_ORDER)) { // The USE-ORDER member as an ordinary record of enumerated - sub_len += use_order->XER_encode(*xer_descr(uo_index), p_buf, flavor, indent+1); + sub_len += use_order->XER_encode(*xer_descr(uo_index), p_buf, flavor, indent+1, 0); } if (exer && (indent==0 || (flavor & DEF_NS_SQUASHED))) // write namespaces for toplevel only @@ -4011,7 +4050,7 @@ int Record_Type::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, for (i = start_at; i < first_nonattr; ++i) { boolean is_xer_attr_field = xer_descr(i)->xer_bits & XER_ATTRIBUTE; ec_1.set_msg("%s': ", fld_name(i)); // attr - int tmp_len = get_at(i)->XER_encode(*xer_descr(i), p_buf, flavor, indent+1); + int tmp_len = get_at(i)->XER_encode(*xer_descr(i), p_buf, flavor, indent+1, 0); if (is_xer_attr_field && !exer) sub_len += tmp_len; /* do not add if attribute and EXER */ } @@ -4043,31 +4082,11 @@ int Record_Type::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, p_buf.put_s(start_tag_len , (cbyte*)">\n"); } - int expected_embed = (field_cnt - first_nonattr + 1); if (exer && (p_td.xer_bits & EMBED_VALUES)) { - ec_1.set_msg("%s': ", fld_name(0)); - int num_opt; - if ((p_td.xer_bits & USE_NIL) && !get_at(field_cnt-1)->ispresent()) { - expected_embed = 0; //25.2.6 a - } - else if ((num_opt = optional_count())) { - const int * optionals = get_optional_indexes(); - for (int opt_idx = 0; opt_idx < num_opt; ++opt_idx) { - // skip optional attributes - if (optionals[opt_idx] < start_at + num_attributes) continue; - // reduce for each omitted member - if (!get_at(optionals[opt_idx])->is_present()) --expected_embed; - } - } - // Check the correct number of EMBED-VALUES (regular non-attributes + 1) - if (embed_values->size_of() != expected_embed) - TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_CONSTRAINT, - "Wrong number %d of EMBED-VALUEs, expected %d", - embed_values->size_of(), expected_embed); /* write the first string */ - if (expected_embed > 0) { + if (embed_values->size_of() > 0) { sub_len += embed_values->get_at(0)->XER_encode(UNIVERSAL_CHARSTRING_xer_, - p_buf, flavor | EMBED_VALUES, indent+1); + p_buf, flavor | EMBED_VALUES, indent+1, 0); } } @@ -4147,33 +4166,55 @@ int Record_Type::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, * pseudo-members for USE-ORDER, etc.) */ // early_to_bed can only be true if exer is true (transitive through nil_attribute) - if (!early_to_bed) for ( i = begin; i < end; ++i ) { - const Base_Type *uoe = 0; // "useOrder enum" - const Enum_Type *enm = 0; // the enum value selecting the field - if (exer && use_order) { - uoe = use_order->get_at(i - begin); - enm = static_cast<const Enum_Type *>(uoe); - } - - // "actual" index, may be perturbed by USE-ORDER - int ai = !(exer && (p_td.xer_bits & USE_ORDER)) ? i : - enm->as_int() + useorder_base; - ec_1.set_msg("%s': ", ordered->fld_name(ai)); // non-attr - - const XERdescriptor_t& descr = *ordered->xer_descr(ai); - sub_len += ordered->get_at(ai)->XER_encode(descr, p_buf, - // Pass USE-NIL to the last field (except when USE-ORDER is also in effect, - // because the tag-stripping effect of USE-NIL has been achieved - // by encoding the sub-fields directly). - flavor | ((exer && !use_order && (i == field_cnt-1)) ? (p_td.xer_bits & USE_NIL) : 0), - indent+!omit_tag); - - // Now the next embed-values string (NOT affected by USE-ORDER!) - if (exer && (p_td.xer_bits & EMBED_VALUES) && (i - begin + 1) < expected_embed) { - embed_values->get_at(i - begin + 1)->XER_encode(UNIVERSAL_CHARSTRING_xer_ - , p_buf, flavor | EMBED_VALUES, indent+1); - } - } //for + if (!early_to_bed) { + embed_values_enc_struct_t* emb_val = 0; + if (exer && (p_td.xer_bits & EMBED_VALUES) && embed_values->size_of() > 1) { + emb_val = new embed_values_enc_struct_t; + emb_val->embval_array = embed_values; + emb_val->embval_index = 1; + emb_val->embval_err = 0; + } + + for ( i = begin; i < end; ++i ) { + const Base_Type *uoe = 0; // "useOrder enum" + const Enum_Type *enm = 0; // the enum value selecting the field + if (exer && use_order) { + uoe = use_order->get_at(i - begin); + enm = static_cast<const Enum_Type *>(uoe); + } + + // "actual" index, may be perturbed by USE-ORDER + int ai = !(exer && (p_td.xer_bits & USE_ORDER)) ? i : + enm->as_int() + useorder_base; + ec_1.set_msg("%s': ", ordered->fld_name(ai)); // non-attr + + const XERdescriptor_t& descr = *ordered->xer_descr(ai); + sub_len += ordered->get_at(ai)->XER_encode(descr, p_buf, + // Pass USE-NIL to the last field (except when USE-ORDER is also in effect, + // because the tag-stripping effect of USE-NIL has been achieved + // by encoding the sub-fields directly). + flavor | ((exer && !use_order && (i == field_cnt-1)) ? (p_td.xer_bits & USE_NIL) : 0), + indent+!omit_tag, emb_val); + + // Now the next embed-values string (NOT affected by USE-ORDER!) + if (exer && (p_td.xer_bits & EMBED_VALUES) && 0 != emb_val && + emb_val->embval_index < embed_values->size_of()) { + embed_values->get_at(emb_val->embval_index)->XER_encode(UNIVERSAL_CHARSTRING_xer_ + , p_buf, flavor | EMBED_VALUES, indent+1, 0); + ++emb_val->embval_index; + } + } //for + + if (0 != emb_val) { + if (emb_val->embval_index < embed_values->size_of()) { + ec_1.set_msg("%s': ", fld_name(0)); + TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_CONSTRAINT, + "Too many EMBED-VALUEs specified: %d (expected %d or less)", + embed_values->size_of(), emb_val->embval_index); + } + delete emb_val; + } + } // if (!early_to_bed) } // if (QNAME) if (!omit_tag) { @@ -4226,7 +4267,7 @@ int Record_Type::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, */ int Record_Type::encode_field(int i, const Erroneous_values_t* err_vals, const Erroneous_descriptor_t* emb_descr, - TTCN_Buffer& p_buf, unsigned int sub_flavor, int indent) const + TTCN_Buffer& p_buf, unsigned int sub_flavor, int indent, embed_values_enc_struct_t* emb_val) const { int enc_len = 0; TTCN_EncDec_ErrorContext ec; @@ -4240,7 +4281,7 @@ int Record_Type::encode_field(int i, if (err_vals->before->type_descr==NULL) TTCN_error( "internal error: erroneous before typedescriptor missing"); enc_len += err_vals->before->errval->XER_encode( - *err_vals->before->type_descr->xer, p_buf, sub_flavor, indent); + *err_vals->before->type_descr->xer, p_buf, sub_flavor, indent, 0); } } @@ -4253,18 +4294,18 @@ int Record_Type::encode_field(int i, if (err_vals->value->type_descr==NULL) TTCN_error( "internal error: erroneous value typedescriptor missing"); enc_len += err_vals->value->errval->XER_encode( - *err_vals->value->type_descr->xer, p_buf, sub_flavor, indent); + *err_vals->value->type_descr->xer, p_buf, sub_flavor, indent, 0); } } // else -> omit } else { ec.set_msg("Component %s: ", fld_name(i)); if (emb_descr) { enc_len += get_at(i)->XER_encode_negtest(emb_descr, *xer_descr(i), p_buf, - sub_flavor, indent); + sub_flavor, indent, emb_val); } else { // the "real" encoder enc_len += get_at(i)->XER_encode(*xer_descr(i), p_buf, - sub_flavor, indent); + sub_flavor, indent, emb_val); } } @@ -4278,7 +4319,7 @@ int Record_Type::encode_field(int i, if (err_vals->after->type_descr==NULL) TTCN_error( "internal error: erroneous after typedescriptor missing"); enc_len += err_vals->after->errval->XER_encode( - *err_vals->after->type_descr->xer, p_buf, sub_flavor, indent); + *err_vals->after->type_descr->xer, p_buf, sub_flavor, indent, 0); } } @@ -4287,7 +4328,8 @@ int Record_Type::encode_field(int i, // XERSTUFF Record_Type::XER_encode_negtest int Record_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr, - const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, unsigned int flavor, int indent) const + const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, unsigned int flavor, int indent, + embed_values_enc_struct_t*) const { if (!is_bound()) { TTCN_EncDec_ErrorContext::error @@ -4411,7 +4453,7 @@ int Record_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr, if (ev->before->type_descr==NULL) TTCN_error( "internal error: erroneous before typedescriptor missing"); sub_len += ev->before->errval->XER_encode( - *ev->before->type_descr->xer, p_buf, flavor, indent); + *ev->before->type_descr->xer, p_buf, flavor, indent, 0); } } @@ -4424,7 +4466,7 @@ int Record_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr, if (ev->value->type_descr==NULL) TTCN_error( "internal error: erroneous value typedescriptor missing"); sub_len += ev->value->errval->XER_encode( - *ev->value->type_descr->xer, p_buf, flavor, indent); + *ev->value->type_descr->xer, p_buf, flavor, indent, 0); } } // else -> omit } else { @@ -4438,7 +4480,7 @@ int Record_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr, // the "real" encoder if (q_uri->is_present()) { p_buf.put_s(11, (cbyte*)" xmlns:b0='"); - sub_len += q_uri->XER_encode(*xer_descr(0), p_buf, flavor | XER_LIST, indent+1); + sub_len += q_uri->XER_encode(*xer_descr(0), p_buf, flavor | XER_LIST, indent+1, 0); p_buf.put_c('\''); } } @@ -4454,7 +4496,7 @@ int Record_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr, if (ev->after->type_descr==NULL) TTCN_error( "internal error: erroneous after typedescriptor missing"); sub_len += ev->after->errval->XER_encode( - *ev->after->type_descr->xer, p_buf, flavor, indent); + *ev->after->type_descr->xer, p_buf, flavor, indent, 0); } } @@ -4475,7 +4517,7 @@ int Record_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr, if (ev->before->type_descr==NULL) TTCN_error( "internal error: erroneous before typedescriptor missing"); sub_len += ev->before->errval->XER_encode( - *ev->before->type_descr->xer, p_buf, flavor, indent); + *ev->before->type_descr->xer, p_buf, flavor, indent, 0); } } @@ -4488,7 +4530,7 @@ int Record_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr, if (ev->value->type_descr==NULL) TTCN_error( "internal error: erroneous value typedescriptor missing"); sub_len += ev->value->errval->XER_encode( - *ev->value->type_descr->xer, p_buf, flavor, indent); + *ev->value->type_descr->xer, p_buf, flavor, indent, 0); } } // else -> omit } else { @@ -4503,7 +4545,7 @@ int Record_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr, sub_len += 3; } - sub_len += get_at(1)->XER_encode(*xer_descr(1), p_buf, flavor | XER_LIST, indent+1); + sub_len += get_at(1)->XER_encode(*xer_descr(1), p_buf, flavor | XER_LIST, indent+1, 0); } } @@ -4517,7 +4559,7 @@ int Record_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr, if (ev->after->type_descr==NULL) TTCN_error( "internal error: erroneous after typedescriptor missing"); sub_len += ev->after->errval->XER_encode( - *ev->after->type_descr->xer, p_buf, flavor, indent); + *ev->after->type_descr->xer, p_buf, flavor, indent, 0); } } @@ -4526,12 +4568,12 @@ int Record_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr, else { // not USE-QNAME if (!exer && (p_td.xer_bits & EMBED_VALUES)) { // The EMBED-VALUES member as an ordinary record of string - sub_len += embed_values->XER_encode(*xer_descr(0), p_buf, flavor, indent+1); + sub_len += embed_values->XER_encode(*xer_descr(0), p_buf, flavor, indent+1, 0); } if (!exer && (p_td.xer_bits & USE_ORDER)) { // The USE-ORDER member as an ordinary record of enumerated - sub_len += use_order->XER_encode(*xer_descr(uo_index), p_buf, flavor, indent+1); + sub_len += use_order->XER_encode(*xer_descr(uo_index), p_buf, flavor, indent+1, 0); } if (exer && (indent==0 || (flavor & DEF_NS_SQUASHED))) // write namespaces for toplevel only @@ -4572,7 +4614,7 @@ int Record_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr, boolean is_xer_attr_field = xer_descr(i)->xer_bits & XER_ATTRIBUTE; ec_1.set_msg("%s': ", fld_name(i)); // attr - tmp_len = encode_field(i, ev, ed, p_buf, flavor, indent + !omit_tag); + tmp_len = encode_field(i, ev, ed, p_buf, flavor, indent + !omit_tag, 0); if (is_xer_attr_field && !exer) sub_len += tmp_len; // do not add if attribute and EXER @@ -4637,31 +4679,11 @@ int Record_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr, int embed_values_val_idx = 0; int embed_values_descr_idx = 0; - int expected_embed = (field_cnt - first_nonattr + 1); if (exer && (p_td.xer_bits & EMBED_VALUES)) { ed0 = p_err_descr->next_field_emb_descr(0, edescr_idx); - ec_1.set_msg("%s': ", fld_name(0)); - int num_opt; - if ((p_td.xer_bits & USE_NIL) && !get_at(field_cnt-1)->ispresent()) { - expected_embed = 0; //25.2.6 a - } - else if ((num_opt = optional_count()) > 0) { - const int * optionals = get_optional_indexes(); - for (int opt_idx = 0; opt_idx < num_opt; ++opt_idx) { - // skip optional attributes - if (optionals[opt_idx] < start_at + num_attributes) continue; - // reduce for each omitted member - if (!get_at(optionals[opt_idx])->is_present()) --expected_embed; - } - } - // Check the correct number of EMBED-VALUES (regular non-attributes + 1) - if (embed_values->size_of() != expected_embed) - TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_CONSTRAINT, - "Wrong number %d of EMBED-VALUEs, expected %d", - embed_values->size_of(), expected_embed); // write the first string - if (expected_embed > 0) { + if (embed_values->size_of() > 0) { const Erroneous_values_t * ev0_0 = NULL; const Erroneous_descriptor_t* ed0_0 = NULL; if (ed0) { @@ -4669,7 +4691,7 @@ int Record_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr, ed0_0 = ed0->next_field_emb_descr (0, embed_values_descr_idx); } sub_len += embed_values->encode_element(0, ev0_0, ed0_0, - p_buf, flavor | EMBED_VALUES, indent+!omit_tag); + p_buf, flavor | EMBED_VALUES, indent+!omit_tag, 0); } } @@ -4757,64 +4779,86 @@ int Record_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr, // fields of this record; and the USE_ORDER case (with or without USE-NIL). // // early_to_bed can only be true if exer is true (transitive through nil_attribute) - if (!early_to_bed) for ( i = begin; i < end; ++i ) { - - const Base_Type *uoe = 0; // "useOrder enum" - const Enum_Type *enm = 0; // the enum value selecting the field - - // "actual" index, may be perturbed by USE-ORDER. - // We use this value to index the appropriate record. - int ai = i; - - const Erroneous_values_t * ev = NULL; - const Erroneous_descriptor_t* ed = NULL; - if (exer && use_order) { - // If USE-ORDER is in effect, it introduces a level of indirection - // into the indexing of fields: "i" is used to select an element - // of the use_order member (an enum), whose value is used to select - // the field being encoded. - uoe = use_order->get_at(i - begin); - enm = static_cast<const Enum_Type *>(uoe); - ai = enm->as_int() + useorder_base; - - // Because it is not guaranteed that ai will increase monotonically, - // we can't use next_field_...(). - ev = p_err_descr->get_field_err_values(ai); - ed = p_err_descr->get_field_emb_descr (ai); - } - else { // not USE-ORDER, sequential access - ev = p_err_descr->next_field_err_values(ai, values_idx); - ed = p_err_descr->next_field_emb_descr (ai, edescr_idx); - } - ec_1.set_msg("%s': ", ordered->fld_name(ai)); // non-attr - - if (ai < p_err_descr->omit_before) continue; - - // omit_after value -1 becomes "very big". - if ((unsigned int)ai > (unsigned int)p_err_descr->omit_after) continue; - // We can't skip all fields with break, because the next ai may be lower - // than omit_after. - - sub_len += ordered->encode_field(ai, ev, ed, p_buf, - // Pass USE-NIL to the last field (except when USE-ORDER is also in effect, - // because the tag-stripping effect of USE-NIL has been achieved - // by encoding the sub-fields directly). - flavor | ((exer && !use_order && (i == field_cnt-1)) ? (p_td.xer_bits & USE_NIL) : 0), - indent + !omit_tag); - - // Now the next embed-values string (NOT affected by USE-ORDER!) - int i1 = i - begin + 1; - if (exer && (p_td.xer_bits & EMBED_VALUES) && i1 < expected_embed) { - const Erroneous_values_t * ev0_i = NULL; - const Erroneous_descriptor_t* ed0_i = NULL; - if (ed0) { - ev0_i = ed0->next_field_err_values(i1, embed_values_val_idx); - ed0_i = ed0->next_field_emb_descr (i1, embed_values_descr_idx); + if (!early_to_bed) { + embed_values_enc_struct_t* emb_val = 0; + if (exer && (p_td.xer_bits & EMBED_VALUES) && embed_values->size_of() > 1) { + emb_val = new embed_values_enc_struct_t; + emb_val->embval_array = embed_values; + emb_val->embval_index = 1; + emb_val->embval_err = ed0; + emb_val->embval_err_val_idx = embed_values_val_idx; + emb_val->embval_err_descr_idx = embed_values_descr_idx; + } + + for ( i = begin; i < end; ++i ) { + + const Base_Type *uoe = 0; // "useOrder enum" + const Enum_Type *enm = 0; // the enum value selecting the field + + // "actual" index, may be perturbed by USE-ORDER. + // We use this value to index the appropriate record. + int ai = i; + + const Erroneous_values_t * ev = NULL; + const Erroneous_descriptor_t* ed = NULL; + if (exer && use_order) { + // If USE-ORDER is in effect, it introduces a level of indirection + // into the indexing of fields: "i" is used to select an element + // of the use_order member (an enum), whose value is used to select + // the field being encoded. + uoe = use_order->get_at(i - begin); + enm = static_cast<const Enum_Type *>(uoe); + ai = enm->as_int() + useorder_base; + + // Because it is not guaranteed that ai will increase monotonically, + // we can't use next_field_...(). + ev = p_err_descr->get_field_err_values(ai); + ed = p_err_descr->get_field_emb_descr (ai); + } + else { // not USE-ORDER, sequential access + ev = p_err_descr->next_field_err_values(ai, values_idx); + ed = p_err_descr->next_field_emb_descr (ai, edescr_idx); + } + ec_1.set_msg("%s': ", ordered->fld_name(ai)); // non-attr + + if (ai < p_err_descr->omit_before) continue; + + // omit_after value -1 becomes "very big". + if ((unsigned int)ai > (unsigned int)p_err_descr->omit_after) continue; + // We can't skip all fields with break, because the next ai may be lower + // than omit_after. + + sub_len += ordered->encode_field(ai, ev, ed, p_buf, + // Pass USE-NIL to the last field (except when USE-ORDER is also in effect, + // because the tag-stripping effect of USE-NIL has been achieved + // by encoding the sub-fields directly). + flavor | ((exer && !use_order && (i == field_cnt-1)) ? (p_td.xer_bits & USE_NIL) : 0), + indent + !omit_tag, emb_val); + + // Now the next embed-values string (NOT affected by USE-ORDER!) + if (exer && (p_td.xer_bits & EMBED_VALUES) && 0 != emb_val && + emb_val->embval_index < embed_values->size_of()) { + const Erroneous_values_t * ev0_i = NULL; + const Erroneous_descriptor_t* ed0_i = NULL; + if (ed0) { + ev0_i = ed0->next_field_err_values(emb_val->embval_index, emb_val->embval_err_val_idx); + ed0_i = ed0->next_field_emb_descr (emb_val->embval_index, emb_val->embval_err_descr_idx); + } + embed_values->encode_element(emb_val->embval_index, ev0_i, ed0_i, + p_buf, flavor | EMBED_VALUES, indent + !omit_tag, 0); + ++emb_val->embval_index; + } + } //for + if (0 != emb_val) { + if (emb_val->embval_index < embed_values->size_of()) { + ec_1.set_msg("%s': ", fld_name(0)); + TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_CONSTRAINT, + "Too many EMBED-VALUEs specified: %d (expected %d or less)", + embed_values->size_of(), emb_val->embval_index); } - embed_values->encode_element(i1, ev0_i, ed0_i, - p_buf, flavor | EMBED_VALUES, indent + !omit_tag); + delete emb_val; } - } //for + } // if (!early_to_bed) } // if (QNAME) @@ -4850,7 +4894,8 @@ int Record_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr, return (int)p_buf.get_len() - encoded_length; } -int Record_Type::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, unsigned int flavor) +int Record_Type::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, + unsigned int flavor, embed_values_dec_struct_t*) { bound_flag = TRUE; int exer = is_exer(flavor); @@ -4886,7 +4931,9 @@ int Record_Type::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, for (int k = 0; k < first_nonattr; ++k) { if (xer_descr(k)->xer_bits & ANY_ATTRIBUTES) { aa_index = k; - static_cast<Record_Of_Type*>(get_at(aa_index))->set_size(0); + if (!get_at(aa_index)->is_optional()) { + static_cast<Record_Of_Type*>(get_at(aa_index))->set_size(0); + } break; // there can be only one, 18.2.2 } } @@ -4951,7 +4998,7 @@ int Record_Type::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, // First, the (would-be) attributes (unaffected by USE-ORDER) for (i = 0; i < first_nonattr; i++) { ec_1.set_msg("%s': ", fld_name(i)); - get_at(i)->XER_decode(*xer_descr(i), reader, flavor); + get_at(i)->XER_decode(*xer_descr(i), reader, flavor, 0); } // next field } else if (own_tag || parent_tag) { // EXER and not UNTAGGED: do attributes @@ -4993,7 +5040,7 @@ int Record_Type::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, if (field_index != -1) { // There is a field. Let it decode the attribute. ec_1.set_msg("%s': ", fld_name(field_index)); - get_at(field_index)->XER_decode(*xer_descr(field_index), reader, flavor); + get_at(field_index)->XER_decode(*xer_descr(field_index), reader, flavor, 0); continue; } @@ -5031,7 +5078,16 @@ int Record_Type::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, TTCN_EncDec_ErrorContext ec_2("Attribute %d: ", num_aa); // We have a component with ANY-ATTRIBUTE. It must be a record of // UNIVERSAL_CHARSTRING. Add the attribute to it. - Record_Of_Type *aa = static_cast<Record_Of_Type *>(get_at(aa_index)); + Record_Of_Type *aa = 0; + if (get_at(aa_index)->is_optional()) { + if (num_aa == 0) { + get_at(aa_index)->set_to_present(); + } + aa = static_cast<Record_Of_Type*>(get_at(aa_index)->get_opt_value()); + } + else { + aa = static_cast<Record_Of_Type*>(get_at(aa_index)); + } UNIVERSAL_CHARSTRING *new_elem = static_cast<UNIVERSAL_CHARSTRING *> (aa->get_at(num_aa++)); @@ -5092,9 +5148,12 @@ int Record_Type::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, } // end if (own_tag) /* * * * * * * * Non-attributes (elements) * * * * * * * * * * * */ - Record_Of_Type* embed_values = 0; + embed_values_dec_struct_t* emb_val = 0; if (exer && (p_td.xer_bits & EMBED_VALUES)) { - embed_values = static_cast<Record_Of_Type*>(get_at(0)); + emb_val = new embed_values_dec_struct_t; + emb_val->embval_array = static_cast<Record_Of_Type*>(get_at(0)); + emb_val->embval_array->set_size(0); + emb_val->embval_index = 0; } if (exer && (p_td.xer_bits & USE_ORDER)) { @@ -5144,19 +5203,27 @@ int Record_Type::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, int *seen = new int[end-begin]; int num_seen = 0; int last_any_elem = begin - 1; + // The index of the latest embedded value can change outside of this function + // (if the field is a untagged record of), in this case the next value should + // be ignored, as it's already been handled by the record of + int last_embval_index = 0; for (i = begin; i < end; i++) { for (success = reader.Ok(); success == 1; success = reader.Read()) { type = reader.NodeType(); - if (embed_values) { - if (reader.NodeType()==XML_READER_TYPE_TEXT) { - UNIVERSAL_CHARSTRING emb_ustr((const char*)reader.Value()); - embed_values->get_at(i-begin)->set_value(&emb_ustr); - } + if (0 != emb_val && reader.NodeType()==XML_READER_TYPE_TEXT) { + UNIVERSAL_CHARSTRING emb_ustr((const char*)reader.Value()); + emb_val->embval_array->get_at(emb_val->embval_index)->set_value(&emb_ustr); } // The non-attribute components must not be UNTAGGED if (type == XML_READER_TYPE_ELEMENT) break; // else if (type==XML_READER_TYPE_END_ELEMENT) panic? } + if (0 != emb_val) { + if (last_embval_index == emb_val->embval_index) { + ++emb_val->embval_index; + } + last_embval_index = emb_val->embval_index; + } if (success != 1) break; const char *name = (const char *)reader.LocalName(); boolean field_name_found = false; @@ -5182,7 +5249,7 @@ int Record_Type::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, static_cast<Enum_Type*>(use_order->get_at(i - begin)) ->from_int(in_dex); Base_Type *b = jumbled->get_at(k); - b->XER_decode(*jumbled->xer_descr(k), reader, flavor); + b->XER_decode(*jumbled->xer_descr(k), reader, flavor, emb_val); field_name_found = true; break; } @@ -5208,17 +5275,20 @@ int Record_Type::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, static_cast<Enum_Type*>(use_order->get_at(i - begin)) ->from_int(in_dex); Base_Type *b = jumbled->get_at(k); - b->XER_decode(*jumbled->xer_descr(k), reader, flavor); + b->XER_decode(*jumbled->xer_descr(k), reader, flavor, emb_val); last_any_elem = k; break; } } } } // next field - if (embed_values) { + if (0 != emb_val) { if (reader.NodeType()==XML_READER_TYPE_TEXT) { UNIVERSAL_CHARSTRING emb_ustr((const char*)reader.Value()); - embed_values->get_at(i-begin)->set_value(&emb_ustr); + emb_val->embval_array->get_at(emb_val->embval_index)->set_value(&emb_ustr); + } + if (last_embval_index == emb_val->embval_index) { + ++emb_val->embval_index; } } delete [] seen; @@ -5249,14 +5319,21 @@ int Record_Type::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, if (usenil_attribute) { reader.MoveToElement(); // value absent, nothing more to do } else { - int emb_idx = 0; + // The index of the latest embedded value can change outside of this function + // (if the field is a untagged record of), in this case the next value should + // be ignored, as it's already been handled by the record of + // Omitted fields can also reset this value + int last_embval_index = 0; for (; i<field_cnt; i++) { - if (embed_values) { + if (0 != emb_val) { if (reader.NodeType()==XML_READER_TYPE_TEXT) { UNIVERSAL_CHARSTRING emb_ustr((const char*)reader.Value()); - embed_values->get_at(emb_idx)->set_value(&emb_ustr); + emb_val->embval_array->get_at(emb_val->embval_index)->set_value(&emb_ustr); } - emb_idx++; + if (last_embval_index == emb_val->embval_index) { + ++emb_val->embval_index; + } + last_embval_index = emb_val->embval_index; } ec_1.set_msg("%s': ", fld_name(i)); if (exer && i==field_cnt-1 && p_td.dfeValue && reader.IsEmptyElement()) { @@ -5281,38 +5358,35 @@ int Record_Type::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, if (i == field_cnt-1) new_flavor |= (p_td.xer_bits & USE_NIL); if (tag_closed) new_flavor |= PARENT_CLOSED; - get_at(i)->XER_decode(*xer_descr(i), reader, new_flavor); + get_at(i)->XER_decode(*xer_descr(i), reader, new_flavor, emb_val); } } + if (!get_at(i)->is_present()) { + // there was no new element, the last embedded value is for the next field + // (or the end of the record if this is the last field) + last_embval_index = -1; + } } // next field - if (embed_values) { + if (0 != emb_val) { if (reader.NodeType()==XML_READER_TYPE_TEXT) { UNIVERSAL_CHARSTRING emb_ustr((const char*)reader.Value()); - embed_values->get_at(emb_idx)->set_value(&emb_ustr); + emb_val->embval_array->get_at(emb_val->embval_index)->set_value(&emb_ustr); + } + if (last_embval_index == emb_val->embval_index) { + ++emb_val->embval_index; } } } } // if use-order - if (embed_values) { - // Set the embed_values member to the correct number of strings - int num_embedded = 0; // if usenil_attribute - if (!usenil_attribute) { - num_embedded = field_cnt - first_nonattr + 1; - const int num_opt = optional_count(); - const int * optionals = get_optional_indexes(); - for (int opt_idx = 0; opt_idx < num_opt; ++opt_idx) { - // skip optional attributes - if (optionals[opt_idx] < start_at + num_attributes) continue; - // reduce for each omitted member - if (!get_at(optionals[opt_idx])->is_present()) --num_embedded; - } - } - embed_values->set_size(num_embedded); + if (0 != emb_val) { static const UNIVERSAL_CHARSTRING emptystring(0, (const char*)NULL); - for (int j = 0; j < num_embedded; ++j) { - if (!embed_values->get_at(j)->is_bound()) embed_values->get_at(j)->set_value(&emptystring); + for (int j = 0; j < emb_val->embval_index; ++j) { + if (!emb_val->embval_array->get_at(j)->is_bound()) { + emb_val->embval_array->get_at(j)->set_value(&emptystring); + } } + delete emb_val; } // if embed-values } // if use-qname @@ -5588,7 +5662,7 @@ void Empty_Record_Type::encode(const TTCN_Typedescriptor_t& p_td, case TTCN_EncDec::CT_XER: { TTCN_EncDec_ErrorContext ec("While XER-encoding type '%s': ", p_td.name); unsigned XER_coding=va_arg(pvar, unsigned); - XER_encode(*(p_td.xer),p_buf, XER_coding, 0); + XER_encode(*(p_td.xer),p_buf, XER_coding, 0, 0); p_buf.put_c('\n'); break;} case TTCN_EncDec::CT_JSON: { @@ -5661,7 +5735,7 @@ void Empty_Record_Type::decode(const TTCN_Typedescriptor_t& p_td, for (int success=reader.Read(); success==1; success=reader.Read()) { if (reader.NodeType() == XML_READER_TYPE_ELEMENT) break; } - XER_decode(*(p_td.xer), reader, XER_coding | XER_TOPLEVEL); + XER_decode(*(p_td.xer), reader, XER_coding | XER_TOPLEVEL, 0); size_t bytes = reader.ByteConsumed(); p_buf.set_pos(bytes); break;} @@ -5770,7 +5844,7 @@ int Empty_Record_Type::TEXT_decode(const TTCN_Typedescriptor_t& p_td, } int Empty_Record_Type::XER_encode(const XERdescriptor_t& p_td, - TTCN_Buffer& p_buf, unsigned int flavor, int indent) const + TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const { int encoded_length=(int)p_buf.get_len(); int indenting = !is_canonical(flavor); @@ -5784,7 +5858,7 @@ int Empty_Record_Type::XER_encode(const XERdescriptor_t& p_td, } int Empty_Record_Type::XER_decode(const XERdescriptor_t& p_td, - XmlReaderWrap& reader, unsigned int flavor) + XmlReaderWrap& reader, unsigned int flavor, embed_values_dec_struct_t*) { int exer = is_exer(flavor); bound_flag = true; diff --git a/doc/License_handling_in_TITAN.doc b/doc/License_handling_in_TITAN.doc index 0ec550ab700fcb3901fe78015f5733194c218637..979fb5e2389141ca75419858751efbd2f411395e 100644 GIT binary patch delta 30079 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�ug$6_XN@(excu1Z+hrH7Z>WE&U0T|aTX~t6 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 literal 147968 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 DZ6fSR diff --git a/etc/Makefile b/etc/Makefile index d24f96479..68ea35628 100644 --- a/etc/Makefile +++ b/etc/Makefile @@ -32,4 +32,5 @@ else # cp asciiart/*.txt $(ETCDIR)/asciiart mkdir -p $(ETCDIR)/scripts cp scripts/*.py $(ETCDIR)/scripts + cp scripts/ttcn3_archive.pl $(BINDIR) endif diff --git a/etc/scripts/ttcn3_archive.pl b/etc/scripts/ttcn3_archive.pl new file mode 100644 index 000000000..058f5e34f --- /dev/null +++ b/etc/scripts/ttcn3_archive.pl @@ -0,0 +1,159 @@ +############################################################################### +# Copyright (c) 2000-2014 Ericsson Telecom AB +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Eclipse Public License v1.0 +# which accompanies this distribution, and is available at +# http://www.eclipse.org/legal/epl-v10.html +############################################################################### +#!/usr/bin/perl +############################################################################### +# This script is intended to archive the project hierarchy from a TPD file structure +############################################################################### +use 5.010; +use strict; +use warnings; +use Cwd; +use File::Copy; + +my $ttcn3_dir = $ENV{'TTCN3_DIR'}; +my $bindir = $ttcn3_dir . "/bin"; +my $home = cwd(); +my @list = readFile(); +my $tpd = getTPDFileName(\@list); +chomp ($tpd); +if (-l $tpd) #get the path if it is a symlink +{ + $tpd = `readlink $tpd`; + chomp ($tpd); +} +my $root = getPathToRootDir(\@list); # get the workspace directory of the OS +chomp ($root); +chdir ($root) or die "cannot change: $!\n"; +my $cutstring = cwd; # this is string generated from the the absolut path to the workspace +my $archiveDir = getArchiveDir(\@list); #directory to place the archive +$archiveDir = $home . "/" . $archiveDir; +chomp ($archiveDir); +my $createDir = "mkdir -p " . $archiveDir; +my $res = system($createDir); +my $backupFileName = createBackupFileName(); +my $backupfile = $archiveDir . "/" . $backupFileName; +if ($res != 0) { die (" creating directory " . $archiveDir ." failed\n"); } +my $archive = $bindir . "/" . "ttcn3_makefilegen" ." -V -P " . $cutstring . " -t " . $tpd . " | xargs tar cfz ". $archiveDir . "/" . $backupFileName . " 2> /dev/null"; +system($archive); #running it +if (-e $backupfile) { print ("archiving succeeded\n"); } +else { print ("archiving failed\n"); } +chdir ($home) or die "cannot change: $!\n"; +############################################################ +sub readFile +{ + my $makefile = "Makefile"; + open ( FILE, "<", $makefile ) or die ( "failed to open file: $home\/$makefile\n" ); + my @lines = <FILE>; + close FILE; + return @lines; +} +############################################################ +sub getPathToRootDir #get the relative path to OS workspace +{ + my @list = @{$_[0]}; + my $search = qr/^ROOT_DIR =/s; + my $offset = 0; + my $line; + for my $i ( 0 .. $#list ) + { + if ( $list[$i] =~ $search ) + { + $line = $list[$i]; + my $dot = '.'; + $offset = index($list[$i], $dot); + last; + } + } + if ($offset == 0) { die ( "no ROOT_DIR variable was found in the Makefile\n" ); } + my $path = substr $line, $offset; + return $path; +} +############################################################ +sub getTPDFileName # TPD filename what the Makefile is created from +{ + my @list = @{$_[0]}; + my $search = qr/^TPD =/s; + my $offset = 0; + my $line; + for my $i ( 0 .. $#list ) + { + if ( $list[$i] =~ $search ) + { + $line = $list[$i]; + my $assign = '='; + $offset = index($list[$i], $assign); + last; + } + } + if ($offset == 0) { die ( "no TPD variable was found in the Makefile\n" ); } + my $file = substr $line, $offset + 1; + $file =~ s/^\s+|\s+$//; # remove heading and traling whitespaces + return $file; +} +############################################################ +sub getArchiveDir # the name of the archive directory +{ + my @list = @{$_[0]}; + my $search = qr/^ARCHIVE_DIR =/s; + my $offset = 0; + my $line; + for my $i ( 0 .. $#list ) + { + if ( $list[$i] =~ $search ) + { + $line = $list[$i]; + my $assign = '='; + $offset = index($list[$i], $assign); + last; + } + } + if ($offset == 0) { die ( "no ARCHIVE_DIR variable was found in the Makefile\n" ); } + my $dir = substr $line, $offset + 1; + $dir =~ s/^\s+|\s+$//; # remove heading and trailing whitespaces + return $dir; +} +############################################################ +sub getExecutableName # the name of the target executable +{ + my @list = @{$_[0]}; + my $search = qr/^EXECUTABLE =/s; + my $offset = 0; + my $line; + for my $i ( 0 .. $#list ) + { + if ( $list[$i] =~ $search ) + { + $line = $list[$i]; + my $assign = '='; + $offset = index($list[$i], $assign); + last; + } + } + if ($offset == 0) { die ( "no EXCUTABLE variable was found in the Makefile\n" ); } + my $exec = substr $line, $offset + 1; + $exec =~ s/^\s+|\s+$//; # remove heading and trailing whitespaces + return $exec; +} +############################################################ +sub createBackupFileName +{ + my $backupFile = getExecutableName(\@list); + my $dot = '.'; + my $result = index($backupFile, $dot); + if ($result > -1) + { + $backupFile = substr $backupFile, 0, $result; + } + chomp ($backupFile); + my $date = `date '+%y%m%d-%H%M'`; + chomp ($date); + my $baseName = $backupFile . "-" . $date . ".tgz"; + chomp ($baseName); + return $baseName; +} +############################################################ \ No newline at end of file diff --git a/etc/xsd/TPD.xsd b/etc/xsd/TPD.xsd index a599afddd..d56c8e15f 100644 --- a/etc/xsd/TPD.xsd +++ b/etc/xsd/TPD.xsd @@ -367,13 +367,22 @@ XML Schema for JunitLogger plugin </xs:restriction> </xs:simpleType> </xs:element> - <xs:element name="rerquiredConfiguration" minOccurs="1" maxOccurs="1"> - <xs:simpleType> - <xs:restriction base="xs:normalizedString"> - <xs:minLength value="1" /> - </xs:restriction> - </xs:simpleType> - </xs:element> + <xs:choice> + <xs:element name="requiredConfiguration" minOccurs="1" maxOccurs="1"> + <xs:simpleType> + <xs:restriction base="xs:normalizedString"> + <xs:minLength value="1" /> + </xs:restriction> + </xs:simpleType> + </xs:element> + <xs:element name="rerquiredConfiguration" minOccurs="1" maxOccurs="1"> + <xs:simpleType> + <xs:restriction base="xs:normalizedString"> + <xs:minLength value="1" /> + </xs:restriction> + </xs:simpleType> + </xs:element> + </xs:choice> </xs:sequence> </xs:complexType> @@ -453,7 +462,7 @@ XML Schema for JunitLogger plugin <xs:complexType name="TopLevelProjectType"> <!-- This is an extra indirection level. It adds the "version" attribute to - ProjecType and the optional element "PackedReferencedProjects" + ProjectType and the optional element "PackedReferencedProjects" --> <xs:complexContent> <xs:extension base="ProjectType"> diff --git a/function_test/Semantic_Analyser/TTCN3_SA_13_TD.script b/function_test/Semantic_Analyser/TTCN3_SA_13_TD.script index c4c266aec..36678584a 100644 --- a/function_test/Semantic_Analyser/TTCN3_SA_13_TD.script +++ b/function_test/Semantic_Analyser/TTCN3_SA_13_TD.script @@ -1114,49 +1114,6 @@ template RoI t_i10 := permutation((all from t_RoI2),100); error: at or before token `permutation': syntax error, unexpected PermutationKeyword <END_RESULT> -<END_TC> -:exmp -*---------------------------------------------------------------------* -:h3. Component mapping: invalid ports -.*---------------------------------------------------------------------* -:xmp tab=0. - -<TC -Component mapping: invalid port > - -<COMPILE> - -<MODULE TTCN test test.ttcn > -module test { - -type port P message { - inout charstring; -} with { extension "internal" } - -type component MTCType -{ - port P MyPCO_PT1; -} - -function akarmi () runs on MTCType { -map(mtc:MyPCO_PT, system:MyPCO_PT2); - -} - -testcase tc_akarmi () runs on MTCType { -map(mtc:MyPCO_PT, system:MyPCO_PT2); - -} - -} -<END_MODULE> - -<RESULT COUNT 2> -Component type `@test.MTCType' does not have port with name `MyPCO_PT' -<END_RESULT> -<RESULT COUNT 1> -Component type `@test.MTCType' does not have port with name `MyPCO_PT2' -<END_RESULT> - <END_TC> :exmp diff --git a/function_test/Semantic_Analyser/TTCN3_SA_ttcn3adhoc_TD.script b/function_test/Semantic_Analyser/TTCN3_SA_ttcn3adhoc_TD.script index d08f2a23a..db2b40fc7 100644 --- a/function_test/Semantic_Analyser/TTCN3_SA_ttcn3adhoc_TD.script +++ b/function_test/Semantic_Analyser/TTCN3_SA_ttcn3adhoc_TD.script @@ -8609,4 +8609,35 @@ Temp.control <END_TC> :exmp. +*-----------------------------------------------------------* +:h3.Adhoc:: HT23335: Type Infinity is not a valid value for type `integer' which as subtype (-1..65535) +.*-----------------------------------------------------------* +:xmp tab=0. +<TC - HT23335: Type Infinity is not a valid value for type `integer' which as subtype (-1..65535)> + +<COMPILE> +<VERDICT_LEAF FAIL> +<MODULE TTCN Temp Temp.ttcn> +module Temp { +const integer limes_i := 65535; +const float limes_f2 := 65535.0; +const float limes_f1 := -1.0; +type record MyRecI { + integer inum (-1..limes_i) +}; +type record MyRecF { + float fnum (limes_f1..limes_f2) +}; + +template MyRecI t1 := { inum := (0..infinity) }; +template MyRecF t2 := { fnum := (-infinity..0.0) }; + +} +<END_MODULE> +<RESULT IF_FAIL COUNT 2> +(?im)\Infinity is not a valid value for type\b +<END_RESULT> +<END_TC> +:exmp. + :etext. diff --git a/function_test/doc/TTCN3_Executor_TestReport.doc b/function_test/doc/TTCN3_Executor_TestReport.doc index bb3ede923e0998f9e99459a563527c74d8ab2baf..458f786c0c7725b5e73773bf4e43fdc44ffa0591 100644 GIT binary patch literal 1091072 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	E=NmHrZVFw1q<kM`Aio1 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 G!2bgZzH-6< literal 1476608 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 diff --git a/mctr2/cli/config_read.l b/mctr2/cli/config_read.l index 7d59c229b..be8c19348 100644 --- a/mctr2/cli/config_read.l +++ b/mctr2/cli/config_read.l @@ -121,7 +121,7 @@ IPV6 [0-9A-Fa-f:.]+(%[0-9A-Za-z]+)? %x SC_blockcomment SC_DEFINE SC_CSTRING SC_ORDERED_INCLUDE %s SC_MODULE_PARAMETERS SC_LOGGING SC_TESTPORT_PARAMETERS SC_EXECUTE SC_GROUPS -%s SC_COMPONENTS SC_EXTERNAL_COMMANDS SC_MAIN_CONTROLLER SC_INCLUDE +%s SC_COMPONENTS SC_EXTERNAL_COMMANDS SC_MAIN_CONTROLLER SC_INCLUDE SC_PROFILER %% int comment_caller = INITIAL; @@ -158,6 +158,13 @@ IPV6 [0-9A-Fa-f:.]+(%[0-9A-Za-z]+)? } } +<*>"["{WS}PROFILER{WS}"]" { + if (YY_START!=SC_blockcomment) { + BEGIN(SC_PROFILER); + RETURN(ProfilerKeyword); + } +} + <*>"["{WS}TESTPORT_PARAMETERS{WS}"]" { if (YY_START!=SC_blockcomment) { BEGIN(SC_TESTPORT_PARAMETERS); @@ -390,7 +397,7 @@ ifpresent RETURN(IfpresentKeyword); infinity RETURN(InfinityKeyword); } -<SC_MODULE_PARAMETERS,SC_LOGGING> +<SC_MODULE_PARAMETERS,SC_LOGGING,SC_PROFILER> { true | false RETURN(BooleanValue); @@ -551,6 +558,16 @@ WARNING_UNQUALIFIED RETURN(LoggingBit); [Dd]elete RETURN(Delete); } +<SC_PROFILER> +{ +[Dd]isable[Pp]rofiler return DisableProfilerKeyword; +[Dd]isable[Cc]overage return DisableCoverageKeyword; +[Dd]ata[Bb]ase[Ff]ile return DatabaseFileKeyword; +[Aa]ggregate[Dd]ata return AggregateDataKeyword; +[Ss]tatistics[Ff]ile return StatisticsFileKeyword; +[Dd]isable[Ss]tatistics return DisableStatisticsKeyword; +} + <SC_EXECUTE>control RETURN(ControlKeyword); <SC_EXTERNAL_COMMANDS> diff --git a/mctr2/cli/config_read.y b/mctr2/cli/config_read.y index f70b1606b..496d4f399 100644 --- a/mctr2/cli/config_read.y +++ b/mctr2/cli/config_read.y @@ -69,12 +69,14 @@ static void yyprint(FILE *file, int type, const YYSTYPE& value); char *str_val; BIGNUM *int_val; double float_val; + boolean bool_val; cf_timestamp_format ts_val; execute_list_item execute_item_val; } %token ModuleParametersKeyword %token LoggingKeyword +%token ProfilerKeyword %token TestportParametersKeyword %token ExecuteKeyword %token ExternalCommandsKeyword @@ -163,6 +165,13 @@ static void yyprint(FILE *file, int type, const YYSTYPE& value); %token Re_try /* Retry clashes with an enum in Qt */ %token Delete +%token DisableProfilerKeyword "DisableProfiler" +%token DisableCoverageKeyword "DisableCoverage" +%token DatabaseFileKeyword "DatabaseFile" +%token AggregateDataKeyword "AggregateData" +%token StatisticsFileKeyword "StatisticsFile" +%token DisableStatisticsKeyword "DisableStatistics" + %type <int_val> IntegerValue %type <float_val> FloatValue KillTimerValue %type <str_val> HostName StringValue LogFileName @@ -219,6 +228,7 @@ ConfigFile: Section: ModuleParametersSection | LoggingSection + | ProfilerSection | TestportParametersSection | ExecuteSection | ExternalCommandsSection @@ -678,6 +688,50 @@ MatchVerbosityValue: | Detailed ; +/*********************** [PROFILER] ********************************/ + +ProfilerSection: + ProfilerKeyword ProfilerSettings +; + +ProfilerSettings: + /* empty */ +| ProfilerSettings ProfilerSetting optSemiColon +; + +ProfilerSetting: + DisableProfilerSetting +| DisableCoverageSetting +| DatabaseFileSetting +| AggregateDataSetting +| StatisticsFileSetting +| DisableStatisticsSetting +; + +DisableProfilerSetting: + DisableProfilerKeyword AssignmentChar BooleanValue +; + +DisableCoverageSetting: + DisableCoverageKeyword AssignmentChar BooleanValue +; + +DatabaseFileSetting: + DatabaseFileKeyword AssignmentChar StringValue { Free($3); } +; + +AggregateDataSetting: + AggregateDataKeyword AssignmentChar BooleanValue +; + +StatisticsFileSetting: + StatisticsFileKeyword AssignmentChar StringValue { Free($3); } +; + +DisableStatisticsSetting: + DisableStatisticsKeyword AssignmentChar BooleanValue +; + /******************* [TESTPORT_PARAMETERS] section *******************/ TestportParametersSection: diff --git a/regression_test/XML/EXER-whitepaper/EmbedValues.ttcnpp b/regression_test/XML/EXER-whitepaper/EmbedValues.ttcnpp index 9ce328c9d..fc5cb934a 100644 --- a/regression_test/XML/EXER-whitepaper/EmbedValues.ttcnpp +++ b/regression_test/XML/EXER-whitepaper/EmbedValues.ttcnpp @@ -154,6 +154,71 @@ testcase decode_emb_any() runs on EMB CHECK_DECODE(exer_dec_emb_any, str_emb_any, EmbedAnyElem, c_emb_any); } +// EMBED-VALUES with untagged array +// the values are also embedded between the array elements, not just the fields of the record +type record Inner { + integer num, + charstring str +} + +type record length (1..infinity) of Inner RoInner; + +type record Outer { + record of universal charstring embed_values, + integer attr, + octetstring bytes, + RoInner stuff +} with { + variant "embedValues"; + variant(attr) "attribute"; + variant(bytes) "name as 'Bytes'"; + variant(stuff) "untagged"; +} + +DECLARE_EXER_ENCODERS(Outer, emb_outer); + +const Outer c_emb_array := { + embed_values := { "one", "two", "three", "four", "five", "six" }, + attr := 48, + bytes := 'DEADBEEF'O, + stuff := { { 3, "abc" }, { 4, "def" }, { -6, "red" }, { 118, "blue" } } +} + +const Outer c_emb_array_w_holes := { + embed_values := { "one", "", "three", "", "five" }, + attr := 48, + bytes := 'DEADBEEF'O, + stuff := { { 3, "abc" }, { 4, "def" }, { -6, "red" }, { 118, "blue" } } +} + +const universal charstring str_emb_array := +"<Outer attr='48'>one" & +"<Bytes>DEADBEEF</Bytes>two" & +"<Inner><num>3</num><str>abc</str></Inner>three" & +"<Inner><num>4</num><str>def</str></Inner>four" & +"<Inner><num>-6</num><str>red</str></Inner>five" & +"<Inner><num>118</num><str>blue</str></Inner>six</Outer>\n"; + +const universal charstring str_emb_array_w_holes := +"<Outer attr='48'>one" & +"<Bytes>DEADBEEF</Bytes>" & +"<Inner><num>3</num><str>abc</str></Inner>three" & +"<Inner><num>4</num><str>def</str></Inner>" & +"<Inner><num>-6</num><str>red</str></Inner>five" & +"<Inner><num>118</num><str>blue</str></Inner></Outer>\n"; + +testcase encode_emb_array() runs on EMB +{ + CHECK_METHOD(exer_enc_emb_outer, c_emb_array, str_emb_array); + CHECK_METHOD(exer_enc_emb_outer, c_emb_array_w_holes, str_emb_array_w_holes); +} + +testcase decode_emb_array() runs on EMB +{ + CHECK_DECODE(exer_dec_emb_outer, str_emb_array, Outer, c_emb_array); + CHECK_DECODE(exer_dec_emb_outer, str_emb_array_w_holes, Outer, c_emb_array_w_holes); +} + control { execute(encode_emb()); execute(decode_emb()); @@ -161,6 +226,8 @@ control { execute(decode_emb_all()); execute(encode_emb_any()); execute(decode_emb_any()); + //execute(encode_emb_array()); - this functionality was temporarily removed in RT1 + //execute(decode_emb_array()); } } diff --git a/regression_test/XML/Makefile b/regression_test/XML/Makefile index 340501f72..6d9a50d4b 100644 --- a/regression_test/XML/Makefile +++ b/regression_test/XML/Makefile @@ -19,7 +19,7 @@ endif XDIRS := $(wildcard $(SHADOWED)) xsdConverter \ HM60295 HN15589 HQ30408 HR49727 $(RT2_ONLY) \ -XmlWorkflow +XmlWorkflow tpdValidTest # List of fake targets: .PHONY: all dep clean run $(XDIRS) $(addsuffix /, $(XDIRS)) profile diff --git a/regression_test/XML/tpdValidTest/Makefile b/regression_test/XML/tpdValidTest/Makefile new file mode 100644 index 000000000..843b77225 --- /dev/null +++ b/regression_test/XML/tpdValidTest/Makefile @@ -0,0 +1,12 @@ +############################################################################### +# Copyright (c) 2000-2014 Ericsson Telecom AB +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Eclipse Public License v1.0 +# which accompanies this distribution, and is available at +# http://www.eclipse.org/legal/epl-v10.html +############################################################################### + +dep clean distclean: + +all run: + ./tpdValidTest.sh >&2 diff --git a/regression_test/XML/tpdValidTest/tpdValidTest.sh b/regression_test/XML/tpdValidTest/tpdValidTest.sh new file mode 100755 index 000000000..e5876700a --- /dev/null +++ b/regression_test/XML/tpdValidTest/tpdValidTest.sh @@ -0,0 +1,22 @@ +#!/bin/bash +############################################################################### +# Copyright (c) 2000-2014 Ericsson Telecom AB +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Eclipse Public License v1.0 +# which accompanies this distribution, and is available at +# http://www.eclipse.org/legal/epl-v10.html +############################################################################### + +TPD_DIR="$WORKSPACE/titan_eclipse/Semantic_Analizer_Tests/tpdTest/" +XSD_DIR="$TTCN3_DIR/etc/xsd/" +XSD="TPD.xsd" + +find $TPD_DIR -type f -name *.tpd | xargs -I {} xmllint --noout --schema $XSD_DIR/$XSD {} + +if [ $? -ne 0 ]; then + echo "Not every .tpd is valid! Overall verdict: fail" + exit 1 +else + echo "Every .tpd is valid! Overall verdict: pass" + exit 0 +fi diff --git a/regression_test/compileonly/HT48786/Makefile b/regression_test/compileonly/HT48786/Makefile new file mode 100644 index 000000000..11d423050 --- /dev/null +++ b/regression_test/compileonly/HT48786/Makefile @@ -0,0 +1,45 @@ +############################################################################### +# Copyright (c) 2000-2015 Ericsson Telecom AB +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Eclipse Public License v1.0 +# which accompanies this distribution, and is available at +# http://www.eclipse.org/legal/epl-v10.html +############################################################################### +TOPDIR := ../.. +include $(TOPDIR)/Makefile.regression + +.PHONY: all clean dep + +TTCN3_LIB = ttcn3$(RT2_SUFFIX)$(DYNAMIC_SUFFIX) + +EXTRA_COMPILER_FLAGS = -p -V 63 + +TTCN3_MODULES = Test1.ttcn Test2.ttcn + +GENERATED_SOURCES = $(TTCN3_MODULES:.ttcn=.cc) +GENERATED_HEADERS = $(GENERATED_SOURCES:.cc=.hh) +ifdef CODE_SPLIT +GENERATED_SOURCES := $(foreach file, $(GENERATED_SOURCES:.cc=), $(addprefix $(file), .cc _seq.cc _set.cc _seqof.cc _setof.cc _union.cc)) +endif + +OBJECTS = $(GENERATED_SOURCES:.cc=.o) + +TARGET = HT48786$(EXESUFFIX) + +all: $(TARGET) + +$(TARGET): $(GENERATED_SOURCES) $(USER_SOURCES) + $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@ $^ -L$(TTCN3_DIR)/lib -l$(TTCN3_LIB) \ + -L$(OPENSSL_DIR)/lib -lcrypto $($(PLATFORM)_LIBS) + +# an extra compilation is tested (with only parsing and maximum verbosity level) +$(GENERATED_SOURCES) $(GENERATED_HEADERS): $(TTCN3_MODULES) + $(TTCN3_COMPILER) $(EXTRA_COMPILER_FLAGS) $(COMPILER_FLAGS) $^ + $(TTCN3_COMPILER) $(COMPILER_FLAGS) $^ + +clean distclean: + $(RM) $(TARGET) $(OBJECTS) $(GENERATED_HEADERS) \ + $(GENERATED_SOURCES) compile *.log + +dep: $(GENERATED_SOURCES) + makedepend $(CPPFLAGS) $(GENERATED_SOURCES) diff --git a/regression_test/compileonly/HT48786/Test1.ttcn b/regression_test/compileonly/HT48786/Test1.ttcn new file mode 100644 index 000000000..28b691705 --- /dev/null +++ b/regression_test/compileonly/HT48786/Test1.ttcn @@ -0,0 +1,36 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2000-2015 Ericsson Telecom AB +// All rights reserved. This program and the accompanying materials +// are made available under the terms of the Eclipse Public License v1.0 +// which accompanies this distribution, and is available at +// http://www.eclipse.org/legal/epl-v10.html +/////////////////////////////////////////////////////////////////////////////// +module Test1 +{ + +type component EMPTY_CT +{ +} + +type record Union +{ + record of integer record_of_integer, + charstring string +}; + +testcase TC_1() runs on EMPTY_CT +{ + var boolean b := false; + var Union u1 := { + record_of_integer := { + str2int("2"), + str2int("3") + } + }; +} + +control { + execute(TC_1()); +} + +} diff --git a/regression_test/compileonly/HT48786/Test2.ttcn b/regression_test/compileonly/HT48786/Test2.ttcn new file mode 100644 index 000000000..ae4a64ac0 --- /dev/null +++ b/regression_test/compileonly/HT48786/Test2.ttcn @@ -0,0 +1,21 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2000-2015 Ericsson Telecom AB +// All rights reserved. This program and the accompanying materials +// are made available under the terms of the Eclipse Public License v1.0 +// which accompanies this distribution, and is available at +// http://www.eclipse.org/legal/epl-v10.html +/////////////////////////////////////////////////////////////////////////////// + +module Test2 { + +type record of integer Record1; +type record of Record1 Record2; + +function f1() { + var Record2 r1, r2; + r1 := {{1, 2}}; + r2 := valueof(r1); + r2 := valueof({{1, 2}}); +} + +} diff --git a/regression_test/compileonly/Makefile b/regression_test/compileonly/Makefile index facd1dae6..f5f02fedf 100644 --- a/regression_test/compileonly/Makefile +++ b/regression_test/compileonly/Makefile @@ -14,7 +14,7 @@ CODIRS := dynamicTemplate styleGuide topLevelPdu \ centralstorage mfgen-tpd \ openType optionalAssignCompare portConstructor \ isbound namedActualParameters assignmentNotation \ - attribQualif + attribQualif HT48786 all dep clean distclean: for dir in $(CODIRS); do $(MAKE) -C $$dir $@ || exit; done diff --git a/regression_test/compileonly/mfgen-tpd/invalid_buildconfig_param/Makefile b/regression_test/compileonly/mfgen-tpd/invalid_buildconfig_param/Makefile index 57fb44086..e98152720 100644 --- a/regression_test/compileonly/mfgen-tpd/invalid_buildconfig_param/Makefile +++ b/regression_test/compileonly/mfgen-tpd/invalid_buildconfig_param/Makefile @@ -26,8 +26,7 @@ BuildHelloTpd: -t ../HelloTpd.tpd -b notexisting 2>&1 | tee ../output CheckHelloTpd: BuildHelloTpd - if [ `grep -c "error: The active build configuration named 'notexisting' does not exist" ./HelloTpd/output` -ne 1 ] \ - || [ `grep -c "error: Failed to process ../HelloTpd.tpd" ./HelloTpd/output` -ne 1 ]; \ + if [ `grep -c "error: The active build configuration named 'notexisting' does not exist" ./HelloTpd/output` -ne 1 ]; \ then exit 1; fi clean: diff --git a/regression_test/compileonly/mfgen-tpd/library/Makefile b/regression_test/compileonly/mfgen-tpd/library/Makefile index 051955a15..a4a5665c5 100644 --- a/regression_test/compileonly/mfgen-tpd/library/Makefile +++ b/regression_test/compileonly/mfgen-tpd/library/Makefile @@ -40,7 +40,7 @@ BuildLibraryL: a.ttcn -L a.ttcn && ${MAKEPROG} CheckLibraryL: BuildLibraryL - if [ ! -f ./bin/a.a ]; then exit 1; fi + if [ ! -f ./bin/liba.a ]; then exit 1; fi if [ -f ./bin/a ]; then exit 1; fi # ttcn3_makefilegen -L; make executable @@ -51,7 +51,7 @@ BuildLibrary3L: a.ttcn -L a.ttcn && ${MAKEPROG} executable CheckLibrary3L: BuildLibrary3L - if [ -f ./bin3/a.a ]; then exit 1; fi + if [ -f ./bin3/liba.a ]; then exit 1; fi if [ ! -f ./bin3/a ]; then exit 1; fi # ttcn3_makefilegen -L; make library @@ -62,7 +62,7 @@ BuildLibrary2L: a.ttcn -L a.ttcn && ${MAKEPROG} library CheckLibrary2L: BuildLibrary2L - if [ ! -f ./bin2/a.a ]; then exit 1; fi + if [ ! -f ./bin2/liba.a ]; then exit 1; fi if [ -f ./bin2/a ]; then exit 1; fi # ttcn3_makefilegen -L; make run @@ -73,7 +73,7 @@ BuildLibrary4L: a.ttcn -L a.ttcn && ${MAKEPROG} all CheckLibrary4L: BuildLibrary4L - if [ ! -f ./bin4/a.a ]; then exit 1; fi + if [ ! -f ./bin4/liba.a ]; then exit 1; fi if [ -f ./bin4/a ]; then exit 1; fi #### Without -L #### @@ -86,7 +86,7 @@ BuildLibrary: a.ttcn a.ttcn && ${MAKEPROG} CheckLibrary: BuildLibrary - if [ -f ./bin/a.a ]; then exit 1; fi + if [ -f ./bin/liba.a ]; then exit 1; fi if [ ! -f ./bin/a ]; then exit 1; fi # ttcn3_makefilegen; make executable @@ -97,7 +97,7 @@ BuildLibrary3: a.ttcn a.ttcn && ${MAKEPROG} executable CheckLibrary3: BuildLibrary3 - if [ -f ./bin3/a.a ]; then exit 1; fi + if [ -f ./bin3/liba.a ]; then exit 1; fi if [ ! -f ./bin3/a ]; then exit 1; fi # ttcn3_makefilegen; make library @@ -108,7 +108,7 @@ BuildLibrary2: a.ttcn a.ttcn && ${MAKEPROG} library CheckLibrary2: BuildLibrary2 - if [ ! -f ./bin2/a.a ]; then exit 1; fi + if [ ! -f ./bin2/liba.a ]; then exit 1; fi if [ -f ./bin2/a ]; then exit 1; fi # ttcn3_makefilegen; make all @@ -119,7 +119,7 @@ BuildLibrary4: a.ttcn a.ttcn && ${MAKEPROG} all CheckLibrary4: BuildLibrary4 - if [ -f ./bin4/a.a ]; then exit 1; fi + if [ -f ./bin4/liba.a ]; then exit 1; fi if [ ! -f ./bin4/a ]; then exit 1; fi ############################### @@ -136,7 +136,7 @@ Build_dynamic: a.ttcn a.ttcn && ${MAKEPROG} Check_dynamic: Build_dynamic - if [ ! -f ./bin_dynamic/a_lib.so ]; then exit 1; fi + if [ ! -f ./bin_dynamic/liba.so ]; then exit 1; fi if [ -f ./bin_dynamic/a ]; then exit 1; fi # ttcn3_makefilegen -L -l; make library @@ -147,7 +147,7 @@ Build_dynamic2: a.ttcn a.ttcn && ${MAKEPROG} library Check_dynamic2: Build_dynamic2 - if [ ! -f ./bin_dynamic2/a_lib.so ]; then exit 1; fi + if [ ! -f ./bin_dynamic2/liba.so ]; then exit 1; fi if [ -f ./bin_dynamic2/a ]; then exit 1; fi # ttcn3_makefilegen -L -l; make executable @@ -158,7 +158,7 @@ Build_dynamic3: a.ttcn a.ttcn && ${MAKEPROG} executable Check_dynamic3: Build_dynamic3 - if [ ! -f ./bin_dynamic3/a_lib.so ]; then exit 1; fi + if [ ! -f ./bin_dynamic3/liba.so ]; then exit 1; fi if [ -f ./bin_dynamic3/a.so ]; then exit 1; fi if [ ! -f ./bin_dynamic3/a ]; then exit 1; fi @@ -172,7 +172,7 @@ Build_dynamic4: a.ttcn a.ttcn && ${MAKEPROG} Check_dynamic4: Build_dynamic4 - if [ -f ./bin_dynamic4/a_lib.so ]; then exit 1; fi + if [ -f ./bin_dynamic4/liba.so ]; then exit 1; fi if [ ! -f ./bin_dynamic4/a ]; then exit 1; fi # ttcn3_makefilegen -l; make library @@ -183,7 +183,7 @@ Build_dynamic5: a.ttcn a.ttcn && ${MAKEPROG} library Check_dynamic5: Build_dynamic5 - if [ ! -f ./bin_dynamic5/a_lib.so ]; then exit 1; fi + if [ ! -f ./bin_dynamic5/liba.so ]; then exit 1; fi if [ -f ./bin_dynamic5/a ]; then exit 1; fi # ttcn3_makefilegen -l; make executable @@ -194,7 +194,7 @@ Build_dynamic6: a.ttcn a.ttcn && ${MAKEPROG} executable Check_dynamic6: Build_dynamic6 - if [ -f ./bin_dynamic6/a_lib.so ]; then exit 1; fi + if [ -f ./bin_dynamic6/liba.so ]; then exit 1; fi if [ ! -f ./bin_dynamic6/a ]; then exit 1; fi @@ -208,7 +208,7 @@ Build_dynamic_central: b.ttcn Central b.ttcn ../central_storage/central.ttcn && ${MAKEPROG} Check_dynamic_central: Build_dynamic_central - if [ ! -f ./bin_central/b_lib.so ]; then exit 1; fi + if [ ! -f ./bin_central/libb.so ]; then exit 1; fi if [ -f ./bin_central/b ]; then exit 1; fi # ttcn3_makefilegen -c -l; make @@ -236,7 +236,7 @@ BuildHelloTpd: CheckHelloTpd: BuildHelloTpd if [ -f HelloTpd/bin/HelloTpd_test.exe ]; then exit 1; fi - if [ ! -f HelloTpd/bin/HelloTpd_test.a ]; then exit 1; fi + if [ ! -f HelloTpd/bin/libHelloTpd_test.a ]; then exit 1; fi # the default target is executable in the tpd file # check if the command line option overrides the one defined in the tpd @@ -249,7 +249,7 @@ BuildHelloTpd2: CheckHelloTpd2: BuildHelloTpd2 if [ -f HelloTpd2/bin/HelloTpd_test.exe ]; then exit 1; fi - if [ ! -f HelloTpd2/bin/HelloTpd_test.a ]; then exit 1; fi + if [ ! -f HelloTpd2/bin/libHelloTpd_test.a ]; then exit 1; fi clean: -rm -rf bin* diff --git a/regression_test/json/Functions.ttcn b/regression_test/json/Functions.ttcn index 18224c871..6064b6269 100755 --- a/regression_test/json/Functions.ttcn +++ b/regression_test/json/Functions.ttcn @@ -102,6 +102,9 @@ external function f_enc_cba(in CBA u) return octetstring external function f_enc_stuff(in Stuff x) return octetstring with { extension "prototype(convert) encode(JSON)" } +external function f_enc_hpt(in HasPardType x) return octetstring + with { extension "prototype(convert) encode(JSON)" } + // for ASN.1 types external function f_enc_seqofint(in SeqOfInt x) return octetstring with { extension "prototype(convert) encode(JSON)" } @@ -117,6 +120,12 @@ external function f_enc_strings(in ManyStrings x) return octetstring external function f_enc_complex(in ComplexSet x) return octetstring with { extension "prototype(convert) encode(JSON)" } + +external function f_enc_obj(in Object x) return octetstring + with { extension "prototype(convert) encode(JSON)" } + +external function f_enc_null(in HasNull x) return octetstring + with { extension "prototype(convert) encode(JSON)" } //=================== Decoders ===================================== @@ -199,6 +208,9 @@ external function f_dec_stuff(in octetstring x) return Stuff external function f_dec_def(in octetstring x) return RecDef with { extension "prototype(convert) decode(JSON)" } +external function f_dec_hpt(in octetstring x) return HasPardType + with { extension "prototype(convert) decode(JSON)" } + // for ASN.1 types external function f_dec_seqofint(in octetstring x) return SeqOfInt with { extension "prototype(convert) decode(JSON)" } @@ -214,6 +226,12 @@ external function f_dec_strings(in octetstring x) return ManyStrings external function f_dec_complex(in octetstring x) return ComplexSet with { extension "prototype(convert) decode(JSON)" } + +external function f_dec_obj(in octetstring x) return Object + with { extension "prototype(convert) decode(JSON)" } + +external function f_dec_null(in octetstring x) return HasNull + with { extension "prototype(convert) decode(JSON)" } //============== Internal Functions ==================== diff --git a/regression_test/json/JsonData.asn b/regression_test/json/JsonData.asn index a10069925..962186e5f 100644 --- a/regression_test/json/JsonData.asn +++ b/regression_test/json/JsonData.asn @@ -19,8 +19,10 @@ IMPORTS ; -- Type definitions -- ---------------------- +-- Sequence of SeqOfInt ::= SEQUENCE OF INTEGER +-- Sequence SeqProduct ::= SEQUENCE { name UniversalString, price REAL, @@ -28,12 +30,14 @@ SeqProduct ::= SEQUENCE { available BOOLEAN } +-- Choice Number ::= CHOICE { decimal INTEGER, binary BIT STRING, hexadecimal OCTET STRING } +-- Choice containing all string types AnyString ::= CHOICE { generalstr GeneralString, numericstr NumericString, @@ -48,14 +52,93 @@ AnyString ::= CHOICE { visiblestr VisibleString } +-- Sequence of strings ManyStrings ::= SEQUENCE OF AnyString +-- Set containing all of the above ComplexSet ::= SET { product SeqProduct, numbers SET OF Number, strings ManyStrings } +Priority ::= ENUMERATED { low, normal, medium, high, urgent } + +Conditionality ::= ENUMERATED { optional, conditional, mandatory } + +ProtocolElem-ID ::= INTEGER (0..65535) + +-- IOC +PROTOCOL-ELEMS ::= CLASS +{ + &id ProtocolElem-ID UNIQUE, + &priority Priority, + &Value, + &conditionality Conditionality +} +WITH SYNTAX +{ + ID &id + PRIORITY &priority + TYPE &Value + CONDITIONALITY &conditionality +} + +-- parameterized type +ProtocolElem-Field {PROTOCOL-ELEMS : ElemsSetParam} ::= SEQUENCE +{ + id PROTOCOL-ELEMS.&id ({ElemsSetParam}), + priority PROTOCOL-ELEMS.&priority ({ElemsSetParam}{@id}), + val PROTOCOL-ELEMS.&Value ({ElemsSetParam}{@id}) +} + + +-- Information objects +ies-Set-Element-1 PROTOCOL-ELEMS ::= +{ + ID 0 + PRIORITY low + TYPE INTEGER + CONDITIONALITY mandatory +} + +ies-Set-Element-2 PROTOCOL-ELEMS ::= +{ + ID 1 + PRIORITY high + TYPE IA5String + CONDITIONALITY optional +} +-- Information Object Set +Elems-Set PROTOCOL-ELEMS ::= { ies-Set-Element-1 | ies-Set-Element-2 } + + +-- instantiation +ProtocolElem-Field1 ::= ProtocolElem-Field {{Elems-Set}} + +ProtocolElem-Field2 ::= ProtocolElem-Field {{ies-Set-Element-2 }} + +-- Choice containing NULL +Price ::= CHOICE +{ + value REAL, + invaluable NULL +} + +-- Sequence containing an object identifier and an ANY type +Object ::= SEQUENCE +{ + id OBJECT IDENTIFIER, + data ANY +} + +-- Sequence containing an optional NULL field +HasNull ::= SEQUENCE +{ + theNull NULL OPTIONAL +} + + -- Values and their encoding -- ------------------------------- @@ -114,4 +197,19 @@ c-set-val ComplexSet ::= { c-set-val-str VisibleString ::= "{""product"":{""name"":""Headset"",""price"":28.500000,""available"":false},""numbers"":[{""hexadecimal"":""16678D""},{""decimal"":12}],""strings"":[{""printablestr"":""first""},{""numericstr"":""2""}]}" +-- Object +c-obj Object ::= { + id { joint-iso-itu-t remote-operations(4) informationObjects(5) version1(0) }, + data 'DEADBEEF'H +} + +c-obj-str VisibleString ::= "{""id"":""2.4.5.0"",""data"":""DEADBEEF""}" + +-- HasNull +c-null HasNull ::= { theNull NULL } +c-not-null HasNull ::= {} + +c-null-str VisibleString ::= "{""theNull"":null}" +c-not-null-str VisibleString ::= "{}" + END diff --git a/regression_test/json/Testcases.ttcn b/regression_test/json/Testcases.ttcn index 81cb2fd2e..e452ecc24 100755 --- a/regression_test/json/Testcases.ttcn +++ b/regression_test/json/Testcases.ttcn @@ -517,6 +517,38 @@ testcase tc_asn_complex() runs on MTC { f_bool2verdict(match(f_dec_complex(os), c_set_val)); } +// ====== Special ASN.1 types ====== +// record containing an open type and a possible NULL value +testcase tc_asn_open_type_and_null() runs on MTC { + var HasPardType x := { + pard := { + id := 0, + priority := low, + val := { iNTEGER := 19 } + }, + buul := true, + price := { invaluable := NULL } + }; + var octetstring os := char2oct("{\"pard\":{\"id\":0,\"priority\":\"low\",\"val\":{\"iNTEGER\":19}},\"buul\":true,\"price\":{\"invaluable\":null}}"); + f_check_encoding(encoded := f_enc_hpt(x), expected := os); + f_bool2verdict(match(f_dec_hpt(os), x)); +} + +// SEQUENCE containing an object identifier and an ANY type +testcase tc_asn_objid_and_any() runs on MTC { + var octetstring os := char2oct(c_obj_str); + f_check_encoding(encoded:= f_enc_obj(c_obj), expected := os); + f_bool2verdict(match(f_dec_obj(os), c_obj)); +} + +testcase tc_asn_optional_null() runs on MTC { + var octetstring os := char2oct(c_null_str); + f_check_encoding(encoded:= f_enc_null(c_null), expected := os); + f_bool2verdict(match(f_dec_null(os), c_null)); + os := char2oct(c_not_null_str); + f_check_encoding(encoded:= f_enc_null(c_not_null), expected := os); + f_bool2verdict(match(f_dec_null(os), c_not_null)); +} //========================================================================= // Control @@ -572,6 +604,10 @@ control { execute(tc_asn_choice()); execute(tc_asn_strings()); execute(tc_asn_complex()); + + execute(tc_asn_open_type_and_null()); + execute(tc_asn_objid_and_any()); + execute(tc_asn_optional_null()); } diff --git a/regression_test/json/Types.ttcn b/regression_test/json/Types.ttcn index f1f372c8c..21eef2829 100755 --- a/regression_test/json/Types.ttcn +++ b/regression_test/json/Types.ttcn @@ -7,6 +7,8 @@ ******************************************************************************/ module Types { +import from JsonData all; + const integer c_imported_i :=11; type component MTC {} @@ -156,6 +158,11 @@ type record RecDef { variant(b) "JSON:default(false)"; } +type record HasPardType { + ProtocolElem_Field1 pard, + boolean buul, + Price price +} } with { encode "JSON"; diff --git a/regression_test/recofOper/Makefile b/regression_test/recofOper/Makefile index 654a1d7c7..e4b9c7a22 100644 --- a/regression_test/recofOper/Makefile +++ b/regression_test/recofOper/Makefile @@ -13,8 +13,15 @@ include $(TOPDIR)/Makefile.regression TTCN3_LIB = ttcn3$(RT2_SUFFIX)$(DYNAMIC_SUFFIX) -TTCN3_MODULES = TrecofOper.ttcn TrecofParamRef.ttcn +TTCN3_MODULES = TrecofOper.ttcn +ifdef RT2 +TTCN3_MODULES += TrecofParamRef.ttcn ASN1_MODULES = BerType.asn +CFG_FILE = config_rt2.cfg +else +ASN1_MODULES = +CFG_FILE = config.cfg +endif GENERATED_SOURCES = $(TTCN3_MODULES:.ttcn=.cc) $(ASN1_MODULES:.asn=.cc) GENERATED_HEADERS = $(GENERATED_SOURCES:.cc=.hh) @@ -41,7 +48,7 @@ clean distclean: dep: $(GENERATED_SOURCES) makedepend $(CPPFLAGS) $(GENERATED_SOURCES) -run: $(TARGET) config.cfg +run: $(TARGET) $(CFG_FILE) ./$^ .NOTPARALLEL: diff --git a/regression_test/recofOper/config.cfg b/regression_test/recofOper/config.cfg index a3b9428e8..eb0d2a5a6 100644 --- a/regression_test/recofOper/config.cfg +++ b/regression_test/recofOper/config.cfg @@ -12,4 +12,3 @@ FileMask := LOG_ALL ConsoleMask := TTCN_WARNING | TTCN_ERROR | TTCN_TESTCASE | TTCN_STATISTICS [EXECUTE] TrecofOper -TrecofParamRef diff --git a/regression_test/recofOper/config_rt2.cfg b/regression_test/recofOper/config_rt2.cfg new file mode 100644 index 000000000..8cd9abc95 --- /dev/null +++ b/regression_test/recofOper/config_rt2.cfg @@ -0,0 +1,15 @@ +############################################################################### +# Copyright (c) 2000-2015 Ericsson Telecom AB +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Eclipse Public License v1.0 +# which accompanies this distribution, and is available at +# http://www.eclipse.org/legal/epl-v10.html +############################################################################### +[MODULE_PARAMETERS] +[LOGGING] +Logfile := "recofOper.log" +FileMask := LOG_ALL +ConsoleMask := TTCN_WARNING | TTCN_ERROR | TTCN_TESTCASE | TTCN_STATISTICS +[EXECUTE] +TrecofOper +TrecofParamRef diff --git a/regression_test/ttcn2json/CompareSchemas.ttcn b/regression_test/ttcn2json/CompareSchemas.ttcn new file mode 100644 index 000000000..426111b7e --- /dev/null +++ b/regression_test/ttcn2json/CompareSchemas.ttcn @@ -0,0 +1,117 @@ +/****************************************************************************** + * Copyright (c) 2000-2015 Ericsson Telecom AB + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + ******************************************************************************/ + +// This module compares two JSON schemas generated by the TITAN compiler +module CompareSchemas { + +////////////////////////////////////// +// JSON schema container data types // +////////////////////////////////////// + +// top level object +type record JsonSchema { + DefSchemas defs, + RefSchemas refs +} + +// definitions section: +type set of DefSchema DefSchemas; + +type record DefSchema { + charstring moduleName, + charstring typeName, + TypeSchema schema +} + +type set of TypeSchemaElement TypeSchema; + +type record TypeSchemaElement { + ElemKey key, + ElemValue val +} + +type enumerated ElemKey { + Ref, Type, SubType, Pattern, OriginalName, UnusedAlias, MinItems, MaxItems, // strVal + AdditionalProperties, OmitAsNull, // boolVal + Default, // strVal or boolVal + Enum, NumericValues, Required, FieldOrder, // strArrayVal + Items, // typeVal + AnyOf, // typeArrayVal + Properties // fieldSetVal +} + +type union ElemValue { + charstring strVal, + boolean boolVal, + record of charstring strArrayVal, + TypeSchema typeVal, + record of TypeSchema typeArrayVal, + set of FieldValue fieldSetVal +} + +type record FieldValue { + charstring fieldName, + TypeSchema schema +} + +// references/functions section: +type set of RefSchema RefSchemas; + +type record RefSchema { + charstring ref, + EncDecData enc optional, + EncDecData dec optional +} + +type record EncDecData { + PrototypeData prototype, + ErrorBehaviorData eb optional, + charstring printing optional +} + +type record of charstring PrototypeData; + +type record of ErrorBehaviorElem ErrorBehaviorData; + +type record ErrorBehaviorElem { + charstring errorType, + charstring errorBehavior +} + +////////////////////////////////// +// Import and compare functions // +////////////////////////////////// + +// Imports a JSON schema from the given file and stores it in the specified container. +// Throws a Dynamic Testcase Error if the file cannot be read or does not have the correct format. +// The resulting JsonSchema should not have any unbound fields. +external function f_ext_import_schema(in charstring file, out JsonSchema schema); + +// Compares the two schemas found in the files specified by the parameters. +// Returns true if they are equal. +function f_compare_schemas(in charstring schema_file1, in charstring schema_file2) return boolean +{ + // read the schemas from the files + var JsonSchema schema1; + f_ext_import_schema(schema_file1, schema1); + var JsonSchema schema2; + f_ext_import_schema(schema_file2, schema2); + + // log both schemas (good luck digging through these...) + //log("Generated (", schema_file1, "): ", schema1); + //log("Expected (", schema_file2, "): ", schema2); + + // set the verdict depending on their equality + if (match(schema1, schema2)) { + return true; + } + log(match(schema1, schema2)); + return false; +} + +} diff --git a/regression_test/ttcn2json/General_Types_e.json b/regression_test/ttcn2json/General_Types_e.json index fa9bfecbd..3fc889a28 100644 --- a/regression_test/ttcn2json/General_Types_e.json +++ b/regression_test/ttcn2json/General_Types_e.json @@ -3,178 +3,222 @@ "General_Types" : { "BIT1" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT10" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT11" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT12" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT12n" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT14" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT14_24n" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT14n" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT15" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT15n" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT15np" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT16" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT16_BO_LAST" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT16n" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT1n" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT1np" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT2" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT24" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT2n" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT2np" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT3" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT31" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT32_BO_LAST" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT3n" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT3np" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT4" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT4n" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT4np" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT5" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT56" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT56n" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT5n" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT5np" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT6" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT6_BO_LAST" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT6n" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT6np" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT7" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT7n" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT7np" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT8" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT8n" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT9" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "BIT9n" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" }, "CHAR4" : { @@ -183,58 +227,72 @@ }, "Dummy" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "HEX0_16" : { "type" : "string", + "subType" : "hexstring", "pattern" : "^[0-9A-Fa-f]*$" }, "HEX0_18n" : { "type" : "string", + "subType" : "hexstring", "pattern" : "^[0-9A-Fa-f]*$" }, "HEX1" : { "type" : "string", + "subType" : "hexstring", "pattern" : "^[0-9A-Fa-f]*$" }, "HEX15n" : { "type" : "string", + "subType" : "hexstring", "pattern" : "^[0-9A-Fa-f]*$" }, "HEX16n" : { "type" : "string", + "subType" : "hexstring", "pattern" : "^[0-9A-Fa-f]*$" }, "HEX1_20n" : { "type" : "string", + "subType" : "hexstring", "pattern" : "^[0-9A-Fa-f]*$" }, "HEX1_32" : { "type" : "string", + "subType" : "hexstring", "pattern" : "^[0-9A-Fa-f]*$" }, "HEX1_34n" : { "type" : "string", + "subType" : "hexstring", "pattern" : "^[0-9A-Fa-f]*$" }, "HEX24n" : { "type" : "string", + "subType" : "hexstring", "pattern" : "^[0-9A-Fa-f]*$" }, "HEX4n" : { "type" : "string", + "subType" : "hexstring", "pattern" : "^[0-9A-Fa-f]*$" }, "HEX5_16" : { "type" : "string", + "subType" : "hexstring", "pattern" : "^[0-9A-Fa-f]*$" }, "HEX6n" : { "type" : "string", + "subType" : "hexstring", "pattern" : "^[0-9A-Fa-f]*$" }, "HEX8n" : { "type" : "string", + "subType" : "hexstring", "pattern" : "^[0-9A-Fa-f]*$" }, "INT1" : { @@ -343,102 +401,127 @@ }, "OCT0" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT0n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT1" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT10" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT100n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT10n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT11" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT11n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT12" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT128n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT12n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT13" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT13n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT14" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT14n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT15" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT15n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT16" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT16n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT17" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT17n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT18" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT18n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT19" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT19n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT1List" : { @@ -450,122 +533,152 @@ }, "OCT1_112n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT1_12" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT1_127n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT1_128n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT1_12n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT1_15n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT1_16n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT1_172n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT1_18n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT1_20n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT1_24n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT1_260" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT1_32" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT1_32n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT1_34n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT1_3n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT1_46n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT1_4n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT1_50" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT1_50n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT1_5n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT1_6n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT1_7n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT1_8" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT1_8n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT1n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT2" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT20" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT20n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT28n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT2List" : { @@ -577,26 +690,32 @@ }, "OCT2n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT3" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT32" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT32n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT34" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT34n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT3List" : { @@ -608,42 +727,52 @@ }, "OCT3_14n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT3_17n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT3_5n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT3_7n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT3_8" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT3_8n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT3n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT4" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT46" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT46n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT4List" : { @@ -655,22 +784,27 @@ }, "OCT4_8n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT4n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT5" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT500n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT50n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT5List" : { @@ -682,14 +816,17 @@ }, "OCT5n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT6" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT69n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT6List" : { @@ -701,10 +838,12 @@ }, "OCT6n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT7" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT7List" : { @@ -716,30 +855,37 @@ }, "OCT7n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT8" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT8n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT9" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCT9n" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCTN" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "OCTNn" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "ProtocolList" : { @@ -761,10 +907,586 @@ "bssmap", "ranap", "dtap" + ], + "numericValues" : [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 ] } } }, "anyOf" : [ + { + "$ref" : "#/definitions/General_Types/OCT7n" + }, + { + "$ref" : "#/definitions/General_Types/OCT8n" + }, + { + "$ref" : "#/definitions/General_Types/OCT9n" + }, + { + "$ref" : "#/definitions/General_Types/BIT2n" + }, + { + "$ref" : "#/definitions/General_Types/BIT3n" + }, + { + "$ref" : "#/definitions/General_Types/BIT4n" + }, + { + "$ref" : "#/definitions/General_Types/BIT5n" + }, + { + "$ref" : "#/definitions/General_Types/BIT6n" + }, + { + "$ref" : "#/definitions/General_Types/BIT7n" + }, + { + "$ref" : "#/definitions/General_Types/BIT8n" + }, + { + "$ref" : "#/definitions/General_Types/BIT9n" + }, + { + "$ref" : "#/definitions/General_Types/BIT12n" + }, + { + "$ref" : "#/definitions/General_Types/BIT14n" + }, + { + "$ref" : "#/definitions/General_Types/BIT15n" + }, + { + "$ref" : "#/definitions/General_Types/BIT16n" + }, + { + "$ref" : "#/definitions/General_Types/BIT56n" + }, + { + "$ref" : "#/definitions/General_Types/BIT14_24n" + }, + { + "$ref" : "#/definitions/General_Types/BIT1np" + }, + { + "$ref" : "#/definitions/General_Types/BIT2np" + }, + { + "$ref" : "#/definitions/General_Types/BIT11" + }, + { + "$ref" : "#/definitions/General_Types/BIT3np" + }, + { + "$ref" : "#/definitions/General_Types/BIT4np" + }, + { + "$ref" : "#/definitions/General_Types/BIT5np" + }, + { + "$ref" : "#/definitions/General_Types/BIT6np" + }, + { + "$ref" : "#/definitions/General_Types/BIT7np" + }, + { + "$ref" : "#/definitions/General_Types/BIT15np" + }, + { + "$ref" : "#/definitions/General_Types/BIT1" + }, + { + "$ref" : "#/definitions/General_Types/BIT2" + }, + { + "$ref" : "#/definitions/General_Types/BIT3" + }, + { + "$ref" : "#/definitions/General_Types/BIT4" + }, + { + "$ref" : "#/definitions/General_Types/BIT1n" + }, + { + "$ref" : "#/definitions/General_Types/BIT5" + }, + { + "$ref" : "#/definitions/General_Types/BIT6" + }, + { + "$ref" : "#/definitions/General_Types/BIT7" + }, + { + "$ref" : "#/definitions/General_Types/BIT8" + }, + { + "$ref" : "#/definitions/General_Types/BIT9" + }, + { + "$ref" : "#/definitions/General_Types/BIT10" + }, + { + "$ref" : "#/definitions/General_Types/OCT46n" + }, + { + "$ref" : "#/definitions/General_Types/BIT12" + }, + { + "$ref" : "#/definitions/General_Types/BIT14" + }, + { + "$ref" : "#/definitions/General_Types/BIT15" + }, + { + "$ref" : "#/definitions/General_Types/BIT16" + }, + { + "$ref" : "#/definitions/General_Types/BIT24" + }, + { + "$ref" : "#/definitions/General_Types/BIT31" + }, + { + "$ref" : "#/definitions/General_Types/BIT56" + }, + { + "$ref" : "#/definitions/General_Types/OCT0n" + }, + { + "$ref" : "#/definitions/General_Types/OCT1n" + }, + { + "$ref" : "#/definitions/General_Types/OCT2n" + }, + { + "$ref" : "#/definitions/General_Types/OCT3n" + }, + { + "$ref" : "#/definitions/General_Types/OCT4n" + }, + { + "$ref" : "#/definitions/General_Types/OCT5n" + }, + { + "$ref" : "#/definitions/General_Types/OCT6n" + }, + { + "$ref" : "#/definitions/General_Types/OCT10n" + }, + { + "$ref" : "#/definitions/General_Types/OCT11n" + }, + { + "$ref" : "#/definitions/General_Types/OCT12n" + }, + { + "$ref" : "#/definitions/General_Types/OCT13n" + }, + { + "$ref" : "#/definitions/General_Types/OCT14n" + }, + { + "$ref" : "#/definitions/General_Types/OCT15n" + }, + { + "$ref" : "#/definitions/General_Types/OCT16n" + }, + { + "$ref" : "#/definitions/General_Types/OCT17n" + }, + { + "$ref" : "#/definitions/General_Types/OCT18n" + }, + { + "$ref" : "#/definitions/General_Types/OCT19n" + }, + { + "$ref" : "#/definitions/General_Types/OCT20n" + }, + { + "$ref" : "#/definitions/General_Types/OCT28n" + }, + { + "$ref" : "#/definitions/General_Types/OCT32n" + }, + { + "$ref" : "#/definitions/General_Types/OCT34n" + }, + { + "$ref" : "#/definitions/General_Types/OCT6" + }, + { + "$ref" : "#/definitions/General_Types/OCT50n" + }, + { + "$ref" : "#/definitions/General_Types/OCT69n" + }, + { + "$ref" : "#/definitions/General_Types/OCT100n" + }, + { + "$ref" : "#/definitions/General_Types/OCT128n" + }, + { + "$ref" : "#/definitions/General_Types/OCT500n" + }, + { + "$ref" : "#/definitions/General_Types/OCTNn" + }, + { + "$ref" : "#/definitions/General_Types/OCT1_3n" + }, + { + "$ref" : "#/definitions/General_Types/OCT1_4n" + }, + { + "$ref" : "#/definitions/General_Types/OCT1_5n" + }, + { + "$ref" : "#/definitions/General_Types/OCT1_6n" + }, + { + "$ref" : "#/definitions/General_Types/OCT1_7n" + }, + { + "$ref" : "#/definitions/General_Types/OCT1_8n" + }, + { + "$ref" : "#/definitions/General_Types/OCT1_12n" + }, + { + "$ref" : "#/definitions/General_Types/OCT1_15n" + }, + { + "$ref" : "#/definitions/General_Types/OCT1_16n" + }, + { + "$ref" : "#/definitions/General_Types/OCT1_18n" + }, + { + "$ref" : "#/definitions/General_Types/OCT1_20n" + }, + { + "$ref" : "#/definitions/General_Types/OCT1_24n" + }, + { + "$ref" : "#/definitions/General_Types/OCT1_32n" + }, + { + "$ref" : "#/definitions/General_Types/OCT1_34n" + }, + { + "$ref" : "#/definitions/General_Types/OCT1_46n" + }, + { + "$ref" : "#/definitions/General_Types/OCT1_50n" + }, + { + "$ref" : "#/definitions/General_Types/OCT1_112n" + }, + { + "$ref" : "#/definitions/General_Types/OCT1_127n" + }, + { + "$ref" : "#/definitions/General_Types/OCT1_128n" + }, + { + "$ref" : "#/definitions/General_Types/OCT1_172n" + }, + { + "$ref" : "#/definitions/General_Types/OCT3_5n" + }, + { + "$ref" : "#/definitions/General_Types/OCT3_7n" + }, + { + "$ref" : "#/definitions/General_Types/OCT3_8n" + }, + { + "$ref" : "#/definitions/General_Types/OCT3_14n" + }, + { + "$ref" : "#/definitions/General_Types/OCT3_17n" + }, + { + "$ref" : "#/definitions/General_Types/OCT4_8n" + }, + { + "$ref" : "#/definitions/General_Types/CHAR4" + }, + { + "$ref" : "#/definitions/General_Types/HEX4n" + }, + { + "$ref" : "#/definitions/General_Types/HEX6n" + }, + { + "$ref" : "#/definitions/General_Types/HEX8n" + }, + { + "$ref" : "#/definitions/General_Types/HEX15n" + }, + { + "$ref" : "#/definitions/General_Types/HEX16n" + }, + { + "$ref" : "#/definitions/General_Types/HEX24n" + }, + { + "$ref" : "#/definitions/General_Types/HEX0_18n" + }, + { + "$ref" : "#/definitions/General_Types/HEX1_20n" + }, + { + "$ref" : "#/definitions/General_Types/HEX1_34n" + }, + { + "$ref" : "#/definitions/General_Types/INT3nb" + }, + { + "$ref" : "#/definitions/General_Types/INT4nb" + }, + { + "$ref" : "#/definitions/General_Types/INT5nb" + }, + { + "$ref" : "#/definitions/General_Types/INT8nb" + }, + { + "$ref" : "#/definitions/General_Types/INT2nbp" + }, + { + "$ref" : "#/definitions/General_Types/INT1nbp" + }, + { + "$ref" : "#/definitions/General_Types/INT3nbp" + }, + { + "$ref" : "#/definitions/General_Types/INT5nbp" + }, + { + "$ref" : "#/definitions/General_Types/INT9nbp" + }, + { + "$ref" : "#/definitions/General_Types/INT13nbp" + }, + { + "$ref" : "#/definitions/General_Types/INT15nbp" + }, + { + "$ref" : "#/definitions/General_Types/BIT6_BO_LAST" + }, + { + "$ref" : "#/definitions/General_Types/BIT16_BO_LAST" + }, + { + "$ref" : "#/definitions/General_Types/BIT32_BO_LAST" + }, + { + "$ref" : "#/definitions/General_Types/Dummy" + }, + { + "$ref" : "#/definitions/General_Types/OCT0" + }, + { + "$ref" : "#/definitions/General_Types/OCT1" + }, + { + "$ref" : "#/definitions/General_Types/OCT2" + }, + { + "$ref" : "#/definitions/General_Types/OCT3" + }, + { + "$ref" : "#/definitions/General_Types/OCT4" + }, + { + "$ref" : "#/definitions/General_Types/OCT5" + }, + { + "$ref" : "#/definitions/General_Types/OCT7" + }, + { + "$ref" : "#/definitions/General_Types/OCT8" + }, + { + "$ref" : "#/definitions/General_Types/OCT9" + }, + { + "$ref" : "#/definitions/General_Types/OCT10" + }, + { + "$ref" : "#/definitions/General_Types/OCT11" + }, + { + "$ref" : "#/definitions/General_Types/OCT12" + }, + { + "$ref" : "#/definitions/General_Types/OCT13" + }, + { + "$ref" : "#/definitions/General_Types/OCT14" + }, + { + "$ref" : "#/definitions/General_Types/OCT15" + }, + { + "$ref" : "#/definitions/General_Types/OCT16" + }, + { + "$ref" : "#/definitions/General_Types/OCT17" + }, + { + "$ref" : "#/definitions/General_Types/OCT18" + }, + { + "$ref" : "#/definitions/General_Types/OCT19" + }, + { + "$ref" : "#/definitions/General_Types/OCT20" + }, + { + "$ref" : "#/definitions/General_Types/OCT32" + }, + { + "$ref" : "#/definitions/General_Types/OCT34" + }, + { + "$ref" : "#/definitions/General_Types/OCT46" + }, + { + "$ref" : "#/definitions/General_Types/OCT1_260" + }, + { + "$ref" : "#/definitions/General_Types/OCT1_8" + }, + { + "$ref" : "#/definitions/General_Types/OCT1_12" + }, + { + "$ref" : "#/definitions/General_Types/OCT1_32" + }, + { + "$ref" : "#/definitions/General_Types/OCT1_50" + }, + { + "$ref" : "#/definitions/General_Types/OCT3_8" + }, + { + "$ref" : "#/definitions/General_Types/OCTN" + }, + { + "$ref" : "#/definitions/General_Types/HEX1" + }, + { + "$ref" : "#/definitions/General_Types/HEX0_16" + }, + { + "$ref" : "#/definitions/General_Types/HEX5_16" + }, + { + "$ref" : "#/definitions/General_Types/HEX1_32" + }, + { + "$ref" : "#/definitions/General_Types/INT1" + }, + { + "$ref" : "#/definitions/General_Types/LIN1" + }, + { + "$ref" : "#/definitions/General_Types/LIN2" + }, + { + "$ref" : "#/definitions/General_Types/LIN2_BO_LAST" + }, + { + "$ref" : "#/definitions/General_Types/LIN3_BO_LAST" + }, + { + "$ref" : "#/definitions/General_Types/LIN4_BO_LAST" + }, + { + "$ref" : "#/definitions/General_Types/INT1b" + }, + { + "$ref" : "#/definitions/General_Types/INT2b" + }, + { + "$ref" : "#/definitions/General_Types/INT3b" + }, + { + "$ref" : "#/definitions/General_Types/INT4b" + }, + { + "$ref" : "#/definitions/General_Types/INT5b" + }, + { + "$ref" : "#/definitions/General_Types/INT6b" + }, + { + "$ref" : "#/definitions/General_Types/INT7b" + }, + { + "$ref" : "#/definitions/General_Types/INT11b_BO_LAST" + }, + { + "$ref" : "#/definitions/General_Types/INT12b_BO_LAST" + }, + { + "$ref" : "#/definitions/General_Types/INT13b_BO_LAST" + }, + { + "$ref" : "#/definitions/General_Types/INT14b_BO_LAST" + }, + { + "$ref" : "#/definitions/General_Types/INT20b_BO_LAST" + }, + { + "$ref" : "#/definitions/General_Types/INT31b_BO_LAST" + }, + { + "$ref" : "#/definitions/General_Types/Integers" + }, + { + "$ref" : "#/definitions/General_Types/Integer_array" + }, + { + "$ref" : "#/definitions/General_Types/Protocols" + }, + { + "$ref" : "#/definitions/General_Types/OCT1List" + }, + { + "$ref" : "#/definitions/General_Types/OCT2List" + }, + { + "$ref" : "#/definitions/General_Types/OCT3List" + }, + { + "$ref" : "#/definitions/General_Types/OCT4List" + }, + { + "$ref" : "#/definitions/General_Types/OCT5List" + }, + { + "$ref" : "#/definitions/General_Types/OCT6List" + }, + { + "$ref" : "#/definitions/General_Types/OCT7List" + }, + { + "$ref" : "#/definitions/General_Types/ProtocolList" + } ] } diff --git a/regression_test/ttcn2json/Main.ttcn b/regression_test/ttcn2json/Main.ttcn new file mode 100644 index 000000000..258f2a2eb --- /dev/null +++ b/regression_test/ttcn2json/Main.ttcn @@ -0,0 +1,37 @@ +/****************************************************************************** + * Copyright (c) 2000-2015 Ericsson Telecom AB + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + ******************************************************************************/ + +module Main +{ + +import from PDU_Definitions all; + +type record HasPardType { + ProtocolElem_Field1 pard, + boolean buul, + Price price +} + +external function f_enc_hpt(in HasPardType x) return octetstring + with { extension "prototype(convert) encode(JSON) printing(pretty)" } + +external function f_dec_hpt(in octetstring x) return HasPardType + with { extension "prototype(convert) decode(JSON)" } + +external function f_enc_pard(in ProtocolElem_Field1 x) return octetstring + with { extension "prototype(convert) encode(JSON) printing(pretty)" } + +external function f_enc_obj(in Object x) return octetstring + with { extension "prototype(convert) encode(JSON)" } + +external function f_dec_obj(in octetstring x) return Object + with { extension "prototype(convert) decode(JSON)" } + +} with { + encode "JSON" +} diff --git a/regression_test/ttcn2json/Main_e.json b/regression_test/ttcn2json/Main_e.json new file mode 100644 index 000000000..40a29b30e --- /dev/null +++ b/regression_test/ttcn2json/Main_e.json @@ -0,0 +1,279 @@ +{ + "definitions" : { + "Main" : { + "HasPardType" : { + "type" : "object", + "subType" : "record", + "properties" : { + "pard" : { + "$ref" : "#/definitions/PDU_Definitions/ProtocolElem_Field1" + }, + "buul" : { + "type" : "boolean" + }, + "price" : { + "$ref" : "#/definitions/PDU_Definitions/Price" + } + }, + "additionalProperties" : false, + "fieldOrder" : [ + "pard", + "buul", + "price" + ], + "required" : [ + "pard", + "buul", + "price" + ] + } + }, + "PDU_Definitions" : { + "Priority" : { + "enum" : [ + "low", + "normal", + "medium", + "high", + "urgent" + ], + "numericValues" : [ + 0, + 1, + 2, + 3, + 4 + ] + }, + "Conditionality" : { + "enum" : [ + "optional_", + "conditional", + "mandatory" + ], + "numericValues" : [ + 0, + 1, + 2 + ] + }, + "ProtocolElem_ID" : { + "type" : "integer" + }, + "ProtocolElem_Field2" : { + "type" : "object", + "subType" : "record", + "properties" : { + "id" : { + "$ref" : "#/definitions/PDU_Definitions/ProtocolElem_ID" + }, + "priority" : { + "$ref" : "#/definitions/PDU_Definitions/Priority" + }, + "val" : { + "anyOf" : [ + { + "type" : "object", + "properties" : { + "iA5String" : { + "type" : "string", + "subType" : "charstring" + } + }, + "additionalProperties" : false, + "required" : [ + "iA5String" + ] + } + ] + } + }, + "additionalProperties" : false, + "fieldOrder" : [ + "id", + "priority", + "val" + ], + "required" : [ + "id", + "priority", + "val" + ] + }, + "ProtocolElem_Field1" : { + "type" : "object", + "subType" : "record", + "properties" : { + "id" : { + "$ref" : "#/definitions/PDU_Definitions/ProtocolElem_ID" + }, + "priority" : { + "$ref" : "#/definitions/PDU_Definitions/Priority" + }, + "val" : { + "anyOf" : [ + { + "type" : "object", + "properties" : { + "iNTEGER" : { + "type" : "integer" + } + }, + "additionalProperties" : false, + "required" : [ + "iNTEGER" + ] + }, + { + "type" : "object", + "properties" : { + "iA5String" : { + "type" : "string", + "subType" : "charstring" + } + }, + "additionalProperties" : false, + "required" : [ + "iA5String" + ] + } + ] + } + }, + "additionalProperties" : false, + "fieldOrder" : [ + "id", + "priority", + "val" + ], + "required" : [ + "id", + "priority", + "val" + ] + }, + "Price" : { + "anyOf" : [ + { + "type" : "object", + "properties" : { + "value_" : { + "anyOf" : [ + { + "type" : "number" + }, + { + "enum" : [ + "not_a_number", + "infinity", + "-infinity" + ] + } + ] + } + }, + "additionalProperties" : false, + "required" : [ + "value_" + ] + }, + { + "type" : "object", + "properties" : { + "invaluable" : { + "type" : "null" + } + }, + "additionalProperties" : false, + "required" : [ + "invaluable" + ] + } + ] + }, + "Object" : { + "type" : "object", + "subType" : "record", + "properties" : { + "id" : { + "type" : "string", + "subType" : "objid", + "pattern" : "^[0-2][.][1-3]?[0-9]([.][0-9]|([1-9][0-9]+))*$" + }, + "data" : { + "type" : "string", + "subType" : "octetstring", + "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" + } + }, + "additionalProperties" : false, + "fieldOrder" : [ + "id", + "data" + ], + "required" : [ + "id", + "data" + ] + }, + "HasNull" : { + "type" : "object", + "subType" : "record", + "properties" : { + "theNull" : { + "type" : "null" + } + }, + "additionalProperties" : false + } + } + }, + "anyOf" : [ + { + "$ref" : "#/definitions/Main/HasPardType", + "decoding" : { + "prototype" : [ + "convert", + "f_dec_hpt", + "x" + ] + }, + "encoding" : { + "prototype" : [ + "convert", + "f_enc_hpt", + "x" + ], + "printing" : "pretty" + } + }, + { + "$ref" : "#/definitions/PDU_Definitions/ProtocolElem_Field1", + "encoding" : { + "prototype" : [ + "convert", + "f_enc_pard", + "x" + ], + "printing" : "pretty" + } + }, + { + "$ref" : "#/definitions/PDU_Definitions/Object", + "decoding" : { + "prototype" : [ + "convert", + "f_dec_obj", + "x" + ] + }, + "encoding" : { + "prototype" : [ + "convert", + "f_enc_obj", + "x" + ] + } + } + ] +} diff --git a/regression_test/ttcn2json/Makefile b/regression_test/ttcn2json/Makefile index a72bacd2a..30664bbb1 100755 --- a/regression_test/ttcn2json/Makefile +++ b/regression_test/ttcn2json/Makefile @@ -13,7 +13,7 @@ include $(TOPDIR)/Makefile.regression TTCN3_LIB = ttcn3$(RT2_SUFFIX)$(DYNAMIC_SUFFIX) -TTCN3_MODULES = PIPEasp_PortType.ttcn PIPEasp_Types.ttcn PIPEasp_Templates.ttcn Shell.ttcn Testcases.ttcn +TTCN3_MODULES = PIPEasp_PortType.ttcn PIPEasp_Types.ttcn PIPEasp_Templates.ttcn Shell.ttcn Testcases.ttcn CompareSchemas.ttcn ASN1_MODULES = @@ -23,14 +23,14 @@ ifdef CODE_SPLIT GENERATED_SOURCES := $(foreach file, $(GENERATED_SOURCES:.cc=), $(addprefix $(file), .cc _seq.cc _set.cc _seqof.cc _setof.cc _union.cc)) endif -USER_SOURCES = PIPEasp_PT.cc +USER_SOURCES = PIPEasp_PT.cc f_ext_import_schema.cc USER_HEADERS = $(USER_SOURCES:.cc=.hh) OBJECTS = $(GENERATED_SOURCES:.cc=.o) $(USER_SOURCES:.cc=.o) TARGET = ttcn2json$(EXESUFFIX) -TEMP_FILES = General_Types.json one.json two.json three.json +TEMP_FILES = General_Types.json one.json two.json three.json Main.json all: $(TARGET) diff --git a/regression_test/ttcn2json/MiniRanap.asn b/regression_test/ttcn2json/MiniRanap.asn new file mode 100644 index 000000000..0be5148e3 --- /dev/null +++ b/regression_test/ttcn2json/MiniRanap.asn @@ -0,0 +1,80 @@ +------------------------------------------------------------------------------- +-- Copyright (c) 2000-2015 Ericsson Telecom AB +-- All rights reserved. This program and the accompanying materials +-- are made available under the terms of the Eclipse Public License v1.0 +-- which accompanies this distribution, and is available at +-- http://www.eclipse.org/legal/epl-v10.html +------------------------------------------------------------------------------- + +MiniRanap + +-- This module contains a simplified version of the type DirectTransferInformationList-RANAP-RelocInf +-- from the RANAP protocol module and any elements needed to recreate it. +-- Used for tesing the JSON schema generator on an ASN.1 ellipsis type + +DEFINITIONS + +AUTOMATIC TAGS ::= + +BEGIN + +IMPORTS ; + +-- RANAP-CommonDataTypes +Criticality ::= ENUMERATED { reject, ignore, notify } + +Presence ::= ENUMERATED { optionalValue, conditional, mandatory } + +ProtocolIE-ID ::= INTEGER (0..65535) + +-- RANAP-Containers +RANAP-PROTOCOL-IES ::= CLASS { + &id ProtocolIE-ID UNIQUE, + &criticality Criticality, + &Value, + &presence Presence +} +WITH SYNTAX { + ID &id + CRITICALITY &criticality + TYPE &Value + PRESENCE &presence +} + +ProtocolIE-ContainerList {INTEGER : lowerBound, INTEGER : upperBound, RANAP-PROTOCOL-IES : IEsSetParam} ::= + SEQUENCE (SIZE (lowerBound..upperBound)) OF + ProtocolIE-Container {{IEsSetParam}} + +ProtocolIE-Container {RANAP-PROTOCOL-IES : IEsSetParam} ::= + SEQUENCE (SIZE (0..maxProtocolIEs)) OF + ProtocolIE-Field {{IEsSetParam}} + +ProtocolIE-Field {RANAP-PROTOCOL-IES : IEsSetParam} ::= SEQUENCE { + id RANAP-PROTOCOL-IES.&id ({IEsSetParam}), + criticality RANAP-PROTOCOL-IES.&criticality ({IEsSetParam}{@id}), + valueField RANAP-PROTOCOL-IES.&Value ({IEsSetParam}{@id}) +} + +-- RANAP-PDU-Contents +DirectTransfer-IE-ContainerList { RANAP-PROTOCOL-IES : IEsSetParam } ::= + ProtocolIE-ContainerList { 1, maxNrOfDTs, {IEsSetParam} } + +DirectTransferInformationList-RANAP-RelocInf ::= + DirectTransfer-IE-ContainerList { {DirectTransferInformationItemIEs-RANAP-RelocInf} } + +DirectTransferInformationItemIEs-RANAP-RelocInf RANAP-PROTOCOL-IES ::= { + { ID id-DirectTransferInformationItem-RANAP-RelocInf + CRITICALITY ignore TYPE INTEGER --DirectTransferInformationItem-RANAP-RelocInf + PRESENCE mandatory }, + ... +} + +-- RABAP-Constants +maxNrOfDTs INTEGER ::= 15 + +id-DirectTransferInformationItem-RANAP-RelocInf INTEGER ::= 80 + +maxProtocolIEs INTEGER ::= 65535 + +END + diff --git a/regression_test/ttcn2json/MiniRanap_e.json b/regression_test/ttcn2json/MiniRanap_e.json new file mode 100644 index 000000000..534ec07f6 --- /dev/null +++ b/regression_test/ttcn2json/MiniRanap_e.json @@ -0,0 +1,94 @@ +{ + "definitions" : { + "MiniRanap" : { + "Criticality" : { + "enum" : [ + "reject", + "ignore", + "notify" + ], + "numericValues" : [ + 0, + 1, + 2 + ] + }, + "DirectTransferInformationList_RANAP_RelocInf" : { + "type" : "array", + "subType" : "record of", + "items" : { + "type" : "array", + "subType" : "record of", + "items" : { + "type" : "object", + "subType" : "record", + "properties" : { + "id" : { + "$ref" : "#/definitions/MiniRanap/ProtocolIE_ID" + }, + "criticality" : { + "$ref" : "#/definitions/MiniRanap/Criticality" + }, + "valueField" : { + "anyOf" : [ + { + "type" : "object", + "properties" : { + "iNTEGER" : { + "type" : "integer" + } + }, + "additionalProperties" : false, + "required" : [ + "iNTEGER" + ] + } + ] + } + }, + "additionalProperties" : false, + "fieldOrder" : [ + "id", + "criticality", + "valueField" + ], + "required" : [ + "id", + "criticality", + "valueField" + ] + } + } + }, + "Presence" : { + "enum" : [ + "optionalValue", + "conditional", + "mandatory" + ], + "numericValues" : [ + 0, + 1, + 2 + ] + }, + "ProtocolIE_ID" : { + "type" : "integer" + } + } + }, + "anyOf" : [ + { + "$ref" : "#/definitions/MiniRanap/Criticality" + }, + { + "$ref" : "#/definitions/MiniRanap/Presence" + }, + { + "$ref" : "#/definitions/MiniRanap/ProtocolIE_ID" + }, + { + "$ref" : "#/definitions/MiniRanap/DirectTransferInformationList_RANAP_RelocInf" + } + ] +} diff --git a/regression_test/ttcn2json/PDU_Definitions.asn b/regression_test/ttcn2json/PDU_Definitions.asn new file mode 100644 index 000000000..4b3388825 --- /dev/null +++ b/regression_test/ttcn2json/PDU_Definitions.asn @@ -0,0 +1,93 @@ +------------------------------------------------------------------------------ +-- Copyright (c) 2000-2015 Ericsson Telecom AB +-- All rights reserved. This program and the accompanying materials +-- are made available under the terms of the Eclipse Public License v1.0 +-- which accompanies this distribution, and is available at +-- http://www.eclipse.org/legal/epl-v10.html +------------------------------------------------------------------------------ + +-- +-- Based on definitions used in S1AP +-- + +PDU-Definitions DEFINITIONS ::= +BEGIN + +Priority ::= ENUMERATED { low, normal, medium, high, urgent } + +Conditionality ::= ENUMERATED { optional, conditional, mandatory } + +ProtocolElem-ID ::= INTEGER (0..65535) + + +--IOC +PROTOCOL-ELEMS ::= CLASS +{ + &id ProtocolElem-ID UNIQUE, + &priority Priority, + &Value, + &conditionality Conditionality +} +WITH SYNTAX +{ + ID &id + PRIORITY &priority + TYPE &Value + CONDITIONALITY &conditionality +} + +--parameterized type +ProtocolElem-Field {PROTOCOL-ELEMS : ElemsSetParam} ::= SEQUENCE +{ + id PROTOCOL-ELEMS.&id ({ElemsSetParam}), + priority PROTOCOL-ELEMS.&priority ({ElemsSetParam}{@id}), + val PROTOCOL-ELEMS.&Value ({ElemsSetParam}{@id}) +} + + +--Information objects +ies-Set-Element-1 PROTOCOL-ELEMS ::= +{ + ID 0 + PRIORITY low + TYPE INTEGER + CONDITIONALITY mandatory +} + +ies-Set-Element-2 PROTOCOL-ELEMS ::= +{ + ID 1 + PRIORITY high + TYPE IA5String + CONDITIONALITY optional +} +--Information Object Set +Elems-Set PROTOCOL-ELEMS ::= { ies-Set-Element-1 | ies-Set-Element-2 } + + +--instantiation +ProtocolElem-Field1 ::= ProtocolElem-Field {{Elems-Set}} + +ProtocolElem-Field2 ::= ProtocolElem-Field {{ies-Set-Element-2 }} + +--Choice containing NULL +Price ::= CHOICE +{ + value REAL, + invaluable NULL +} + +--Sequence containing an object identifier and an ANY type +Object ::= SEQUENCE +{ + id OBJECT IDENTIFIER, + data ANY +} + +--Sequence containing an optional NULL field +HasNull ::= SEQUENCE +{ + theNull NULL OPTIONAL +} + +END diff --git a/regression_test/ttcn2json/Testcases.ttcn b/regression_test/ttcn2json/Testcases.ttcn index 7c3d3269c..b6ae4a648 100644 --- a/regression_test/ttcn2json/Testcases.ttcn +++ b/regression_test/ttcn2json/Testcases.ttcn @@ -9,6 +9,7 @@ module Testcases { import from Shell all; +import from CompareSchemas all; function f_test_ttcn2json(in charstring p_args, in charstring p_gen_file_name, in charstring p_exp_file_name, in integer p_exp_result) runs on Shell_CT @@ -16,34 +17,32 @@ function f_test_ttcn2json(in charstring p_args, in charstring p_gen_file_name, i var charstring v_cmd := "compiler --ttcn2json " & p_args; f_shellCommandWithVerdict(v_cmd, "", p_exp_result); - /* The generated schema cannot be checked this way, as different platforms generate the parts of the schema - in a different order if (getverdict == pass) { - f_compareFiles(p_gen_file_name, p_exp_file_name, 0); - if (getverdict == fail) { - action("Generated and expected files do not match"); + if (f_compare_schemas(p_gen_file_name, p_exp_file_name) == false) { + setverdict(fail, "Generated and expected files do not match"); } } else { action("Command ", v_cmd, " failed"); - }*/ + } + } testcase tc_t2j_one() runs on Shell_CT { - f_test_ttcn2json("one.ttcn two.ttcn three.ttcn zero.asn", "one.json", "one_e.json", + f_test_ttcn2json("-f one.ttcn two.ttcn three.ttcn zero.asn", "one.json", "one_e.json", c_shell_successWithWarning); } testcase tc_t2j_two() runs on Shell_CT { - f_test_ttcn2json("one.ttcn two.ttcn three.ttcn zero.asn - two.json", "two.json", "one_e.json", + f_test_ttcn2json("-jf one.ttcn two.ttcn three.ttcn zero.asn - two.json", "two.json", "two_e.json", c_shell_successWithWarning); } testcase tc_t2j_three() runs on Shell_CT { - f_test_ttcn2json("-T one.ttcn -T two.ttcn -T three.ttcn -A zero.asn - three.json", "three.json", "one_e.json", + f_test_ttcn2json("-j -T one.ttcn -T two.ttcn -T three.ttcn -A zero.asn - three.json", "three.json", "three_e.json", c_shell_successWithWarning); } @@ -53,11 +52,25 @@ testcase tc_t2j_general_types() runs on Shell_CT c_shell_successWithoutWarningAndError); } +testcase tc_t2j_main_asn() runs on Shell_CT +{ + f_test_ttcn2json("-f Main.ttcn PDU_Definitions.asn", "Main.json", "Main_e.json", + c_shell_successWithoutWarningAndError); +} + +testcase tc_t2j_mini_ranap() runs on Shell_CT +{ + f_test_ttcn2json("MiniRanap.asn", "MiniRanap.json", "MiniRanap_e.json", + c_shell_successWithoutWarningAndError); +} + control { execute(tc_t2j_one()); execute(tc_t2j_two()); execute(tc_t2j_three()); execute(tc_t2j_general_types()); + execute(tc_t2j_main_asn()); + execute(tc_t2j_mini_ranap()); } } diff --git a/regression_test/ttcn2json/f_ext_import_schema.cc b/regression_test/ttcn2json/f_ext_import_schema.cc new file mode 100644 index 000000000..053208333 --- /dev/null +++ b/regression_test/ttcn2json/f_ext_import_schema.cc @@ -0,0 +1,456 @@ +/****************************************************************************** + * Copyright (c) 2000-2015 Ericsson Telecom AB + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + ******************************************************************************/ + +#include "f_ext_import_schema.hh" +#include <stdio.h> +#include <string.h> + +namespace CompareSchemas { + +#define IMPORT_FORMAT_ERROR(cond, comment) \ + if (cond) { \ + TTCN_error("Invalid format for file '%s' (%s). JSON schema could not be imported.", file_name, comment); \ + } + +ElemKey get_elem_key(const char* value, size_t value_len, const char* file_name) +{ + if (4 == value_len && 0 == strncmp(value, "$ref", value_len)) { + return ElemKey::Ref; + } + if (4 == value_len && 0 == strncmp(value, "type", value_len)) { + return ElemKey::Type; + } + if (7 == value_len && 0 == strncmp(value, "subType", value_len)) { + return ElemKey::SubType; + } + if (7 == value_len && 0 == strncmp(value, "pattern", value_len)) { + return ElemKey::Pattern; + } + if (12 == value_len && 0 == strncmp(value, "originalName", value_len)) { + return ElemKey::OriginalName; + } + if (11 == value_len && 0 == strncmp(value, "unusedAlias", value_len)) { + return ElemKey::UnusedAlias; + } + if (20 == value_len && 0 == strncmp(value, "additionalProperties", value_len)) { + return ElemKey::AdditionalProperties; + } + if (10 == value_len && 0 == strncmp(value, "omitAsNull", value_len)) { + return ElemKey::OmitAsNull; + } + if (7 == value_len && 0 == strncmp(value, "default", value_len)) { + return ElemKey::Default; + } + if (8 == value_len && 0 == strncmp(value, "minItems", value_len)) { + return ElemKey::MinItems; + } + if (8 == value_len && 0 == strncmp(value, "maxItems", value_len)) { + return ElemKey::MaxItems; + } + if (4 == value_len && 0 == strncmp(value, "enum", value_len)) { + return ElemKey::Enum; + } + if (13 == value_len && 0 == strncmp(value, "numericValues", value_len)) { + return ElemKey::NumericValues; + } + if (5 == value_len && 0 == strncmp(value, "items", value_len)) { + return ElemKey::Items; + } + if (5 == value_len && 0 == strncmp(value, "anyOf", value_len)) { + return ElemKey::AnyOf; + } + if (8 == value_len && 0 == strncmp(value, "required", value_len)) { + return ElemKey::Required; + } + if (10 == value_len && 0 == strncmp(value, "fieldOrder", value_len)) { + return ElemKey::FieldOrder; + } + if (10 == value_len && 0 == strncmp(value, "properties", value_len)) { + return ElemKey::Properties; + } + // throw the DTE if it didn't return until now + IMPORT_FORMAT_ERROR(true, "unknown type element key"); +} + +TypeSchema extract_type_schema(JSON_Tokenizer& json, const char* file_name) +{ + json_token_t token = JSON_TOKEN_NONE; + char* value = NULL; + size_t value_len = 0; + + // type schema object start + json.get_next_token(&token, NULL, NULL); + IMPORT_FORMAT_ERROR(JSON_TOKEN_OBJECT_START != token, "missing type object start"); + + // type schema elements + TypeSchema type_schema; + int elem_index = 0; + json.get_next_token(&token, &value, &value_len); + while(JSON_TOKEN_NAME == token) { + type_schema[elem_index].key() = get_elem_key(value, value_len, file_name); + switch(type_schema[elem_index].key()) { + case ElemKey::Ref: + case ElemKey::Type: + case ElemKey::SubType: + case ElemKey::Pattern: + case ElemKey::OriginalName: + case ElemKey::UnusedAlias: + case ElemKey::MinItems: + case ElemKey::MaxItems: + case ElemKey::AdditionalProperties: + case ElemKey::OmitAsNull: + case ElemKey::Default: { + // string or boolean value + json.get_next_token(&token, &value, &value_len); + switch (token) { + case JSON_TOKEN_STRING: + case JSON_TOKEN_NUMBER: { + CHARSTRING str_val(value_len, value); + type_schema[elem_index].val().strVal() = str_val; + break; } + case JSON_TOKEN_LITERAL_FALSE: + type_schema[elem_index].val().boolVal() = FALSE; + break; + case JSON_TOKEN_LITERAL_TRUE: + type_schema[elem_index].val().boolVal() = TRUE; + break; + default: + IMPORT_FORMAT_ERROR(JSON_TOKEN_LITERAL_FALSE != token, "string or boolean value expected"); + } + break; } + + case ElemKey::Enum: + case ElemKey::NumericValues: + case ElemKey::Required: + case ElemKey::FieldOrder: { + // string array value + json.get_next_token(&token, NULL, NULL); + IMPORT_FORMAT_ERROR(JSON_TOKEN_ARRAY_START != token, "missing string array start"); + json.get_next_token(&token, &value, &value_len); + int string_index = 0; + while (JSON_TOKEN_STRING == token || JSON_TOKEN_NUMBER == token) { + CHARSTRING str_val(value_len, value); + type_schema[elem_index].val().strArrayVal()[string_index] = str_val; + + // next string + ++string_index; + json.get_next_token(&token, &value, &value_len); + } + + // string array end + IMPORT_FORMAT_ERROR(JSON_TOKEN_ARRAY_END != token, "missing string array end"); + break; } + + case ElemKey::Items: { + // type schema value + type_schema[elem_index].val().typeVal() = extract_type_schema(json, file_name); + break; } + + case ElemKey::AnyOf: { + // type schema array value + json.get_next_token(&token, NULL, NULL); + IMPORT_FORMAT_ERROR(JSON_TOKEN_ARRAY_START != token, "missing type array start"); + int type_index = 0; + size_t buf_pos = json.get_buf_pos(); + json.get_next_token(&token, NULL, NULL); + while (JSON_TOKEN_OBJECT_START == token) { + // revert this extraction, the type schema extractor will read the "{" again + json.set_buf_pos(buf_pos); + type_schema[elem_index].val().typeArrayVal()[type_index] = extract_type_schema(json, file_name); + + // next type schema + ++type_index; + buf_pos = json.get_buf_pos(); + json.get_next_token(&token, NULL, NULL); + } + + // type schema array end + IMPORT_FORMAT_ERROR(JSON_TOKEN_ARRAY_END != token, "missing type array end"); + break; } + + case ElemKey::Properties: { + // field set value + json.get_next_token(&token, NULL, NULL); + IMPORT_FORMAT_ERROR(JSON_TOKEN_OBJECT_START != token, "missing field set start"); + int field_index = 0; + json.get_next_token(&token, &value, &value_len); + while(JSON_TOKEN_NAME == token) { + // store field name and schema + CHARSTRING field_name(value_len, value); + type_schema[elem_index].val().fieldSetVal()[field_index].fieldName() = field_name; + type_schema[elem_index].val().fieldSetVal()[field_index].schema() = extract_type_schema(json, file_name); + + // next field + ++field_index; + json.get_next_token(&token, &value, &value_len); + } + + // field set value end + IMPORT_FORMAT_ERROR(JSON_TOKEN_OBJECT_END != token, "missing field set end"); + break; } + default: + break; + } + + // next schema element + ++elem_index; + json.get_next_token(&token, &value, &value_len); + } + + // type schema object end + IMPORT_FORMAT_ERROR(JSON_TOKEN_OBJECT_END != token, "missing type object end"); + return type_schema; +} + +EncDecData extract_enc_dec_data(JSON_Tokenizer& json, const char* file_name) +{ + // initialize (error behavior and printing data might not appear in the schema) + json_token_t token = JSON_TOKEN_NONE; + char* value = NULL; + size_t value_len = 0; + EncDecData data; + data.eb() = OMIT_VALUE; + data.printing() = OMIT_VALUE; + + // enc/dec data start + json.get_next_token(&token, NULL, NULL); + IMPORT_FORMAT_ERROR(JSON_TOKEN_OBJECT_START != token, "missing enc/dec data start"); + json.get_next_token(&token, &value, &value_len); + while(JSON_TOKEN_NAME == token) { + if (9 == value_len && 0 == strncmp(value, "prototype", value_len)) { + // prototype (string array) + json.get_next_token(&token, NULL, NULL); + IMPORT_FORMAT_ERROR(JSON_TOKEN_ARRAY_START != token, "missing prototype array start"); + json.get_next_token(&token, &value, &value_len); + int pt_index = 0; + while(JSON_TOKEN_STRING == token) { + CHARSTRING pt_str(value_len, value); + data.prototype()[pt_index] = pt_str; + + // next prototype element + ++pt_index; + json.get_next_token(&token, &value, &value_len); + } + + // prototype end + IMPORT_FORMAT_ERROR(JSON_TOKEN_ARRAY_END != token, "missing prototype array end"); + } + else if (13 == value_len && 0 == strncmp(value, "errorBehavior", value_len)) { + // error behavior (object) + json.get_next_token(&token, NULL, NULL); + IMPORT_FORMAT_ERROR(JSON_TOKEN_OBJECT_START != token, "missing error behavior start"); + json.get_next_token(&token, &value, &value_len); + int eb_index = 0; + while(JSON_TOKEN_NAME == token) { + // store the key-value pair + CHARSTRING error_type(value_len, value); + json.get_next_token(&token, &value, &value_len); + IMPORT_FORMAT_ERROR(JSON_TOKEN_STRING != token, "expected error behavior string"); + CHARSTRING error_behavior(value_len, value); + data.eb()()[eb_index].errorType() = error_type; + data.eb()()[eb_index].errorBehavior() = error_behavior; + + // next pair + ++eb_index; + json.get_next_token(&token, &value, &value_len); + } + + // error behavior end + IMPORT_FORMAT_ERROR(JSON_TOKEN_OBJECT_END != token, "missing error behavior end"); + } + else if (8 == value_len && 0 == strncmp(value, "printing", value_len)) { + json.get_next_token(&token, &value, &value_len); + IMPORT_FORMAT_ERROR(JSON_TOKEN_STRING != token, "expected printing string"); + CHARSTRING printing_str(value_len, value); + data.printing()() = printing_str; + } + else { + // invalid key + IMPORT_FORMAT_ERROR(true, "invalid enc/dec data key"); + } + + // next key-value pair + json.get_next_token(&token, &value, &value_len); + } + + // enc/dec data end + IMPORT_FORMAT_ERROR(JSON_TOKEN_OBJECT_END != token, "missing enc/dec data end"); + return data; +} + +RefSchema extract_ref_schema(JSON_Tokenizer& json, const char* file_name) +{ + // initialize (set optional fields to "omit") + json_token_t token = JSON_TOKEN_NONE; + char* value = NULL; + size_t value_len = 0; + RefSchema ref_schema; + ref_schema.enc() = OMIT_VALUE; + ref_schema.dec() = OMIT_VALUE; + + // read reference data + json.get_next_token(&token, &value, &value_len); + while(JSON_TOKEN_NAME == token) { + if (4 == value_len && 0 == strncmp(value, "$ref", value_len)) { + // reference + json.get_next_token(&token, &value, &value_len); + IMPORT_FORMAT_ERROR(JSON_TOKEN_STRING != token, "missing reference string"); + CHARSTRING ref_str(value_len, value); + ref_schema.ref() = ref_str; + } + else if (8 == value_len && 0 == strncmp(value, "encoding", value_len)) { + // encoding function + ref_schema.enc()() = extract_enc_dec_data(json, file_name); + } + else if (8 == value_len && 0 == strncmp(value, "decoding", value_len)) { + // encoding function + ref_schema.dec()() = extract_enc_dec_data(json, file_name); + } + else { + // invalid key + IMPORT_FORMAT_ERROR(true, "invalid reference/function data key"); + } + + // next key-value pair + json.get_next_token(&token, &value, &value_len); + } + + // reference & function info end + IMPORT_FORMAT_ERROR(JSON_TOKEN_OBJECT_END != token, "missing reference/function data end"); + return ref_schema; +} + +void f__ext__import__schema(const CHARSTRING& file, JsonSchema& schema) +{ + // need a null-terminated string for fopen + char* file_name = mcopystrn((const char*)file, file.lengthof()); + FILE* fp = fopen(file_name, "r"); + try { + if (NULL == fp) { + TTCN_error("Could not open file '%s' for reading. JSON schema could not be imported.", file_name); + } + + // get the file size + fseek(fp, 0, SEEK_END); + int file_size = ftell(fp); + rewind(fp); + + // read the entire file into a character buffer + char* buffer = (char*)Malloc(file_size); + fread(buffer, 1, file_size, fp); + fclose(fp); + + // initialize a JSON tokenizer with the buffer + JSON_Tokenizer json(buffer, file_size); + Free(buffer); + + // extract tokens and store the schema in the JsonSchema parameter + // throw a DTE if the file format is invalid + json_token_t token = JSON_TOKEN_NONE; + char* value = NULL; + size_t value_len = 0; + + // top level object + json.get_next_token(&token, NULL, NULL); + IMPORT_FORMAT_ERROR(JSON_TOKEN_OBJECT_START != token, "missing top level object start"); + + // definitions + json.get_next_token(&token, &value, &value_len); + IMPORT_FORMAT_ERROR(JSON_TOKEN_NAME != token || value_len != 11 || + 0 != strncmp(value, "definitions", value_len), "missing definitions key"); + + // module list + json.get_next_token(&token, NULL, NULL); + IMPORT_FORMAT_ERROR(JSON_TOKEN_OBJECT_START != token, "missing module list start"); + json.get_next_token(&token, &value, &value_len); + int type_index = 0; + while (JSON_TOKEN_NAME == token) { + // extract module name, it will be inserted later + CHARSTRING module_name(value_len, value); + + // type list + json.get_next_token(&token, NULL, NULL); + IMPORT_FORMAT_ERROR(JSON_TOKEN_OBJECT_START != token, "missing type list start"); + json.get_next_token(&token, &value, &value_len); + while (JSON_TOKEN_NAME == token) { + // extract type name + CHARSTRING type_name(value_len, value); + + // extract type schema + TypeSchema type_schema = extract_type_schema(json, file_name); + + // store definition data + schema.defs()[type_index].moduleName() = module_name; + schema.defs()[type_index].typeName() = type_name; + schema.defs()[type_index].schema() = type_schema; + + // next type + ++type_index; + json.get_next_token(&token, &value, &value_len); + } + + // end of type list + IMPORT_FORMAT_ERROR(JSON_TOKEN_OBJECT_END != token, "missing type list end"); + + // next module + json.get_next_token(&token, &value, &value_len); + } + + // end of module list + IMPORT_FORMAT_ERROR(JSON_TOKEN_OBJECT_END != token, "missing module list end"); + + if (0 == type_index) { + // no definitions, don't leave the field unbound + schema.defs().set_size(0); + } + + // top level anyOf + json.get_next_token(&token, &value, &value_len); + IMPORT_FORMAT_ERROR(JSON_TOKEN_NAME != token || value_len != 5 || + 0 != strncmp(value, "anyOf", value_len), "missing anyOf key"); + + // reference & function info array + json.get_next_token(&token, NULL, NULL); + IMPORT_FORMAT_ERROR(JSON_TOKEN_ARRAY_START != token, "missing reference/function list start"); + json.get_next_token(&token, NULL, NULL); + int ref_index = 0; + while (JSON_TOKEN_OBJECT_START == token) { + + // extract reference schema + schema.refs()[ref_index] = extract_ref_schema(json, file_name); + + // next reference + ++ref_index; + json.get_next_token(&token, NULL, NULL); + } + + // end of reference & function info array + IMPORT_FORMAT_ERROR(JSON_TOKEN_ARRAY_END != token, "missing reference/function list end"); + + if (0 == ref_index) { + // no references, don't leave the field unbound + schema.refs().set_size(0); + } + + // end of top level object + json.get_next_token(&token, NULL, NULL); + IMPORT_FORMAT_ERROR(JSON_TOKEN_OBJECT_END != token, "missing top level object end"); + + // end of the schema + json.get_next_token(&token, NULL, NULL); + IMPORT_FORMAT_ERROR(JSON_TOKEN_NONE != token, "expected end of file"); + } + catch (...) { + Free(file_name); + throw; + } + Free(file_name); +} + +} + diff --git a/regression_test/ttcn2json/f_ext_import_schema.hh b/regression_test/ttcn2json/f_ext_import_schema.hh new file mode 100644 index 000000000..7ab618d9f --- /dev/null +++ b/regression_test/ttcn2json/f_ext_import_schema.hh @@ -0,0 +1,27 @@ +/****************************************************************************** + * Copyright (c) 2000-2015 Ericsson Telecom AB + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + ******************************************************************************/ + +#ifndef f_ext_import_schema_HH +#define f_ext_import_schema_HH + +#include "CompareSchemas.hh" + +namespace CompareSchemas { + +/** Imports a JSON schema from a given file to the specified container. + * Throws a Dynamic Testcase Error on failure. + * + * @param file source file name + * @param schema JSON schema container (defined in CompareSchemas.ttcn) + */ +extern void f__ext__import__schema(const CHARSTRING& file, JsonSchema& schema); + +} + +#endif + diff --git a/regression_test/ttcn2json/one_e.json b/regression_test/ttcn2json/one_e.json index f8827455e..da16123a4 100644 --- a/regression_test/ttcn2json/one_e.json +++ b/regression_test/ttcn2json/one_e.json @@ -27,6 +27,11 @@ "Short", "Medium", "Tall" + ], + "numericValues" : [ + 0, + 1, + 2 ] }, "Rec" : { @@ -59,6 +64,7 @@ "properties" : { "os" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" }, "buul" : { @@ -147,6 +153,7 @@ "properties" : { "bytes" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" } }, @@ -162,6 +169,11 @@ "Thin", "Medium", "Wide" + ], + "numericValues" : [ + 0, + 1, + 2 ] }, "anytype" : { @@ -195,6 +207,7 @@ "properties" : { "bitstring" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" } }, @@ -212,6 +225,7 @@ "subType" : "record of", "items" : { "type" : "string", + "subType" : "bitstring", "pattern" : "^[01]*$" } }, @@ -239,6 +253,7 @@ "subType" : "record of", "items" : { "type" : "string", + "subType" : "hexstring", "pattern" : "^[0-9A-Fa-f]*$" } }, @@ -261,6 +276,7 @@ "subType" : "set of", "items" : { "type" : "string", + "subType" : "octetstring", "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" } }, @@ -322,6 +338,11 @@ "Small", "Medium", "Large" + ], + "numericValues" : [ + 0, + 1, + 2 ] }, "filled" : { @@ -429,6 +450,109 @@ } }, "Zero" : { + "SeqOfInt" : { + "type" : "array", + "subType" : "record of", + "items" : { + "type" : "integer" + } + }, + "SeqProduct" : { + "type" : "object", + "subType" : "record", + "properties" : { + "name" : { + "type" : "string", + "subType" : "universal charstring" + }, + "price" : { + "anyOf" : [ + { + "type" : "number" + }, + { + "enum" : [ + "not_a_number", + "infinity", + "-infinity" + ] + } + ] + }, + "id" : { + "anyOf" : [ + { + "type" : "null" + }, + { + "type" : "string", + "subType" : "octetstring", + "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" + } + ], + "omitAsNull" : false + }, + "available" : { + "type" : "boolean" + } + }, + "additionalProperties" : false, + "fieldOrder" : [ + "name", + "price", + "id", + "available" + ], + "required" : [ + "name", + "price", + "available" + ] + }, + "Number" : { + "anyOf" : [ + { + "type" : "object", + "properties" : { + "decimal" : { + "type" : "integer" + } + }, + "additionalProperties" : false, + "required" : [ + "decimal" + ] + }, + { + "type" : "object", + "properties" : { + "binary" : { + "type" : "string", + "subType" : "bitstring", + "pattern" : "^[01]*$" + } + }, + "additionalProperties" : false, + "required" : [ + "binary" + ] + }, + { + "type" : "object", + "properties" : { + "hexadecimal" : { + "type" : "string", + "subType" : "octetstring", + "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" + } + }, + "additionalProperties" : false, + "required" : [ + "hexadecimal" + ] + } + ] + }, "AnyString" : { "anyOf" : [ { @@ -576,37 +700,12 @@ } ] }, - "Big_Choice" : { - "anyOf" : [ - { - "type" : "object", - "properties" : { - "numbers" : { - "type" : "array", - "subType" : "set of", - "items" : { - "$ref" : "#/definitions/Zero/Number" - } - } - }, - "additionalProperties" : false, - "required" : [ - "numbers" - ] - }, - { - "type" : "object", - "properties" : { - "strings" : { - "$ref" : "#/definitions/Zero/ManyStrings" - } - }, - "additionalProperties" : false, - "required" : [ - "strings" - ] - } - ] + "ManyStrings" : { + "type" : "array", + "subType" : "record of", + "items" : { + "$ref" : "#/definitions/Zero/AnyString" + } }, "Big_Set" : { "type" : "object", @@ -631,6 +730,12 @@ "blue", "green", "yellow" + ], + "numericValues" : [ + 0, + 1, + 2, + 3 ] } }, @@ -648,55 +753,52 @@ "color" ] }, - "ManyStrings" : { - "type" : "array", - "subType" : "record of", - "items" : { - "$ref" : "#/definitions/Zero/AnyString" - } - }, - "Number" : { + "Big_Choice" : { "anyOf" : [ { "type" : "object", "properties" : { - "decimal" : { - "type" : "integer" - } - }, - "additionalProperties" : false, - "required" : [ - "decimal" - ] - }, - { - "type" : "object", - "properties" : { - "binary" : { - "type" : "string", - "pattern" : "^[01]*$" + "numbers" : { + "type" : "array", + "subType" : "set of", + "items" : { + "$ref" : "#/definitions/Zero/Number" + } } }, "additionalProperties" : false, "required" : [ - "binary" + "numbers" ] }, { "type" : "object", "properties" : { - "hexadecimal" : { - "type" : "string", - "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" + "strings" : { + "$ref" : "#/definitions/Zero/ManyStrings" } }, "additionalProperties" : false, "required" : [ - "hexadecimal" + "strings" ] } ] }, + "Season" : { + "enum" : [ + "spring", + "summer", + "fall", + "winter" + ], + "numericValues" : [ + 1, + 2, + 3, + 4 + ] + }, "SelectionType" : { "type" : "array", "subType" : "set of", @@ -704,63 +806,18 @@ "$ref" : "#/definitions/Zero/Number" } }, - "SeqOfInt" : { - "type" : "array", - "subType" : "record of", - "items" : { - "type" : "integer" - } + "NullType" : { + "type" : "null" }, - "SeqProduct" : { - "type" : "object", - "subType" : "record", - "properties" : { - "name" : { - "type" : "string", - "subType" : "universal charstring" - }, - "price" : { - "anyOf" : [ - { - "type" : "number" - }, - { - "enum" : [ - "not_a_number", - "infinity", - "-infinity" - ] - } - ] - }, - "id" : { - "anyOf" : [ - { - "type" : "null" - }, - { - "type" : "string", - "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" - } - ], - "omitAsNull" : false - }, - "available" : { - "type" : "boolean" - } - }, - "additionalProperties" : false, - "fieldOrder" : [ - "name", - "price", - "id", - "available" - ], - "required" : [ - "name", - "price", - "available" - ] + "ObjIdType" : { + "type" : "string", + "subType" : "objid", + "pattern" : "^[0-2][.][1-3]?[0-9]([.][0-9]|([1-9][0-9]+))*$" + }, + "RelObjIdType" : { + "type" : "string", + "subType" : "objid", + "pattern" : "^[0-2][.][1-3]?[0-9]([.][0-9]|([1-9][0-9]+))*$" } } }, diff --git a/regression_test/ttcn2json/three_e.json b/regression_test/ttcn2json/three_e.json new file mode 100644 index 000000000..52268badc --- /dev/null +++ b/regression_test/ttcn2json/three_e.json @@ -0,0 +1,866 @@ +{ + "definitions" : { + "one" : { + "HasAny" : { + "type" : "object", + "subType" : "record", + "properties" : { + "num" : { + "type" : "integer" + }, + "at" : { + "$ref" : "#/definitions/one/anytype" + } + }, + "additionalProperties" : false, + "fieldOrder" : [ + "num", + "at" + ], + "required" : [ + "num", + "at" + ] + }, + "Height" : { + "enum" : [ + "Short", + "Medium", + "Tall" + ], + "numericValues" : [ + 0, + 1, + 2 + ] + }, + "Rec" : { + "type" : "object", + "subType" : "record", + "properties" : { + "num" : { + "type" : "integer", + "default" : 0 + }, + "str" : { + "type" : "string", + "subType" : "universal charstring", + "default" : "empty" + } + }, + "additionalProperties" : false, + "fieldOrder" : [ + "num", + "str" + ], + "required" : [ + "num", + "str" + ] + }, + "Set" : { + "type" : "object", + "subType" : "set", + "properties" : { + "os" : { + "type" : "string", + "subType" : "octetstring", + "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" + }, + "buul" : { + "anyOf" : [ + { + "type" : "null" + }, + { + "type" : "boolean" + } + ], + "omitAsNull" : true + }, + "verd" : { + "anyOf" : [ + { + "type" : "null" + }, + { + "enum" : [ + "none", + "pass", + "inconc", + "fail", + "error" + ] + } + ], + "omitAsNull" : false + }, + "numbr" : { + "anyOf" : [ + { + "type" : "number" + }, + { + "enum" : [ + "not_a_number", + "infinity", + "-infinity" + ] + } + ], + "default" : "-infinity" + } + }, + "additionalProperties" : false, + "fieldOrder" : [ + "os", + "buul", + "verd", + "numbr" + ], + "required" : [ + "os", + "numbr" + ] + }, + "Uni" : { + "anyOf" : [ + { + "type" : "object", + "properties" : { + "numbr" : { + "anyOf" : [ + { + "type" : "number" + }, + { + "enum" : [ + "not_a_number", + "infinity", + "-infinity" + ] + } + ] + } + }, + "additionalProperties" : false, + "required" : [ + "numbr" + ] + }, + { + "type" : "object", + "properties" : { + "bytes" : { + "type" : "string", + "subType" : "octetstring", + "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" + } + }, + "additionalProperties" : false, + "required" : [ + "bytes" + ] + } + ] + }, + "Width" : { + "enum" : [ + "Thin", + "Medium", + "Wide" + ], + "numericValues" : [ + 0, + 1, + 2 + ] + }, + "anytype" : { + "anyOf" : [ + { + "type" : "object", + "properties" : { + "integer" : { + "type" : "integer" + } + }, + "additionalProperties" : false, + "required" : [ + "integer" + ] + }, + { + "type" : "object", + "properties" : { + "boolean" : { + "type" : "boolean" + } + }, + "additionalProperties" : false, + "required" : [ + "boolean" + ] + }, + { + "type" : "object", + "properties" : { + "bitstring" : { + "type" : "string", + "subType" : "bitstring", + "pattern" : "^[01]*$" + } + }, + "additionalProperties" : false, + "required" : [ + "bitstring" + ] + } + ] + } + }, + "two" : { + "Ints" : { + "type" : "array", + "subType" : "record of", + "items" : { + "type" : "integer" + } + }, + "PosInt" : { + "type" : "integer" + } + }, + "three" : { + "Barrels" : { + "type" : "object", + "subType" : "set", + "properties" : { + "numBarrels" : { + "type" : "integer" + }, + "barrelType" : { + "type" : "object", + "subType" : "record", + "properties" : { + "size" : { + "enum" : [ + "Small", + "Medium", + "Large" + ], + "numericValues" : [ + 0, + 1, + 2 + ] + }, + "filled" : { + "type" : "boolean" + } + }, + "additionalProperties" : false, + "fieldOrder" : [ + "size", + "filled" + ], + "required" : [ + "size", + "filled" + ] + } + }, + "additionalProperties" : false, + "fieldOrder" : [ + "numBarrels", + "barrelType" + ], + "required" : [ + "numBarrels", + "barrelType" + ] + }, + "Nums" : { + "type" : "array", + "subType" : "set of", + "items" : { + "type" : "object", + "subType" : "record", + "properties" : { + "number" : { + "originalName" : "num", + "type" : "integer" + } + }, + "additionalProperties" : false, + "required" : [ + "number" + ] + } + }, + "Numz" : { + "type" : "object", + "subType" : "record", + "properties" : { + "nums" : { + "$ref" : "#/definitions/three/Nums" + } + }, + "additionalProperties" : false, + "required" : [ + "nums" + ] + }, + "Rex" : { + "type" : "array", + "subType" : "record of", + "items" : { + "$ref" : "#/definitions/one/Rec" + } + }, + "Stuff" : { + "type" : "array", + "subType" : "record of", + "items" : { + "$ref" : "#/definitions/three/Thing" + } + }, + "Thing" : { + "anyOf" : [ + { + "originalName" : "b", + "type" : "boolean" + }, + { + "originalName" : "i", + "unusedAlias" : "int", + "type" : "integer" + }, + { + "originalName" : "cs", + "unusedAlias" : "str", + "type" : "string", + "subType" : "charstring" + }, + { + "originalName" : "rec", + "type" : "object", + "subType" : "record", + "properties" : { + "num" : { + "type" : "integer" + } + }, + "additionalProperties" : false, + "required" : [ + "num" + ] + } + ] + } + }, + "Zero" : { + "AnyString" : { + "anyOf" : [ + { + "type" : "object", + "properties" : { + "generalstr" : { + "type" : "string", + "subType" : "universal charstring" + } + }, + "additionalProperties" : false, + "required" : [ + "generalstr" + ] + }, + { + "type" : "object", + "properties" : { + "numericstr" : { + "type" : "string", + "subType" : "charstring" + } + }, + "additionalProperties" : false, + "required" : [ + "numericstr" + ] + }, + { + "type" : "object", + "properties" : { + "utf8str" : { + "type" : "string", + "subType" : "universal charstring" + } + }, + "additionalProperties" : false, + "required" : [ + "utf8str" + ] + }, + { + "type" : "object", + "properties" : { + "printablestr" : { + "type" : "string", + "subType" : "charstring" + } + }, + "additionalProperties" : false, + "required" : [ + "printablestr" + ] + }, + { + "type" : "object", + "properties" : { + "universalstr" : { + "type" : "string", + "subType" : "universal charstring" + } + }, + "additionalProperties" : false, + "required" : [ + "universalstr" + ] + }, + { + "type" : "object", + "properties" : { + "bmpstr" : { + "type" : "string", + "subType" : "universal charstring" + } + }, + "additionalProperties" : false, + "required" : [ + "bmpstr" + ] + }, + { + "type" : "object", + "properties" : { + "graphicstr" : { + "type" : "string", + "subType" : "universal charstring" + } + }, + "additionalProperties" : false, + "required" : [ + "graphicstr" + ] + }, + { + "type" : "object", + "properties" : { + "ia5str" : { + "type" : "string", + "subType" : "charstring" + } + }, + "additionalProperties" : false, + "required" : [ + "ia5str" + ] + }, + { + "type" : "object", + "properties" : { + "teletexstr" : { + "type" : "string", + "subType" : "universal charstring" + } + }, + "additionalProperties" : false, + "required" : [ + "teletexstr" + ] + }, + { + "type" : "object", + "properties" : { + "videotexstr" : { + "type" : "string", + "subType" : "universal charstring" + } + }, + "additionalProperties" : false, + "required" : [ + "videotexstr" + ] + }, + { + "type" : "object", + "properties" : { + "visiblestr" : { + "type" : "string", + "subType" : "charstring" + } + }, + "additionalProperties" : false, + "required" : [ + "visiblestr" + ] + } + ] + }, + "Big_Choice" : { + "anyOf" : [ + { + "type" : "object", + "properties" : { + "numbers" : { + "type" : "array", + "subType" : "set of", + "items" : { + "$ref" : "#/definitions/Zero/Number" + } + } + }, + "additionalProperties" : false, + "required" : [ + "numbers" + ] + }, + { + "type" : "object", + "properties" : { + "strings" : { + "$ref" : "#/definitions/Zero/ManyStrings" + } + }, + "additionalProperties" : false, + "required" : [ + "strings" + ] + } + ] + }, + "Big_Set" : { + "type" : "object", + "subType" : "set", + "properties" : { + "product" : { + "$ref" : "#/definitions/Zero/SeqProduct" + }, + "numbers" : { + "type" : "array", + "subType" : "set of", + "items" : { + "$ref" : "#/definitions/Zero/Number" + } + }, + "strings" : { + "$ref" : "#/definitions/Zero/ManyStrings" + }, + "color" : { + "enum" : [ + "red", + "blue", + "green", + "yellow" + ], + "numericValues" : [ + 0, + 1, + 2, + 3 + ] + } + }, + "additionalProperties" : false, + "fieldOrder" : [ + "product", + "numbers", + "strings", + "color" + ], + "required" : [ + "product", + "numbers", + "strings", + "color" + ] + }, + "ManyStrings" : { + "type" : "array", + "subType" : "record of", + "items" : { + "$ref" : "#/definitions/Zero/AnyString" + } + }, + "NullType" : { + "type" : "null" + }, + "Number" : { + "anyOf" : [ + { + "type" : "object", + "properties" : { + "decimal" : { + "type" : "integer" + } + }, + "additionalProperties" : false, + "required" : [ + "decimal" + ] + }, + { + "type" : "object", + "properties" : { + "binary" : { + "type" : "string", + "subType" : "bitstring", + "pattern" : "^[01]*$" + } + }, + "additionalProperties" : false, + "required" : [ + "binary" + ] + }, + { + "type" : "object", + "properties" : { + "hexadecimal" : { + "type" : "string", + "subType" : "octetstring", + "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" + } + }, + "additionalProperties" : false, + "required" : [ + "hexadecimal" + ] + } + ] + }, + "ObjIdType" : { + "type" : "string", + "subType" : "objid", + "pattern" : "^[0-2][.][1-3]?[0-9]([.][0-9]|([1-9][0-9]+))*$" + }, + "RelObjIdType" : { + "type" : "string", + "subType" : "objid", + "pattern" : "^[0-2][.][1-3]?[0-9]([.][0-9]|([1-9][0-9]+))*$" + }, + "Season" : { + "enum" : [ + "spring", + "summer", + "fall", + "winter" + ], + "numericValues" : [ + 1, + 2, + 3, + 4 + ] + }, + "SelectionType" : { + "type" : "array", + "subType" : "set of", + "items" : { + "$ref" : "#/definitions/Zero/Number" + } + }, + "SeqOfInt" : { + "type" : "array", + "subType" : "record of", + "items" : { + "type" : "integer" + } + }, + "SeqProduct" : { + "type" : "object", + "subType" : "record", + "properties" : { + "name" : { + "type" : "string", + "subType" : "universal charstring" + }, + "price" : { + "anyOf" : [ + { + "type" : "number" + }, + { + "enum" : [ + "not_a_number", + "infinity", + "-infinity" + ] + } + ] + }, + "id" : { + "anyOf" : [ + { + "type" : "null" + }, + { + "type" : "string", + "subType" : "octetstring", + "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" + } + ], + "omitAsNull" : false + }, + "available" : { + "type" : "boolean" + } + }, + "additionalProperties" : false, + "fieldOrder" : [ + "name", + "price", + "id", + "available" + ], + "required" : [ + "name", + "price", + "available" + ] + } + } + }, + "anyOf" : [ + { + "$ref" : "#/definitions/two/Ints", + "decoding" : { + "prototype" : [ + "fast", + "f_dec_ints", + "os", + "x" + ] + }, + "encoding" : { + "prototype" : [ + "fast", + "f_enc_ints", + "eents", + "octus" + ], + "printing" : "pretty" + } + }, + { + "$ref" : "#/definitions/one/Rec", + "decoding" : { + "prototype" : [ + "convert", + "f_dec_rec", + "octie" + ], + "errorBehavior" : { + "ALL" : "WARNING", + "INVAL_MSG" : "ERROR" + } + }, + "encoding" : { + "prototype" : [ + "convert", + "f_enc_rec", + "x" + ] + } + }, + { + "$ref" : "#/definitions/one/Set" + }, + { + "$ref" : "#/definitions/one/Uni" + }, + { + "$ref" : "#/definitions/one/HasAny" + }, + { + "$ref" : "#/definitions/one/Height" + }, + { + "$ref" : "#/definitions/one/Width" + }, + { + "$ref" : "#/definitions/one/anytype" + }, + { + "$ref" : "#/definitions/three/Thing" + }, + { + "$ref" : "#/definitions/three/Stuff" + }, + { + "$ref" : "#/definitions/three/Barrels" + }, + { + "$ref" : "#/definitions/two/PosInt" + }, + { + "$ref" : "#/definitions/Zero/SeqOfInt" + }, + { + "$ref" : "#/definitions/Zero/SeqProduct" + }, + { + "$ref" : "#/definitions/Zero/Number" + }, + { + "$ref" : "#/definitions/three/Nums" + }, + { + "$ref" : "#/definitions/three/Numz" + }, + { + "$ref" : "#/definitions/three/Rex" + }, + { + "$ref" : "#/definitions/Zero/AnyString" + }, + { + "$ref" : "#/definitions/Zero/ManyStrings" + }, + { + "$ref" : "#/definitions/Zero/Big_Set", + "decoding" : { + "prototype" : [ + "convert", + "f_dec_bigset", + "os" + ] + }, + "encoding" : { + "prototype" : [ + "convert", + "f_enc_bigset", + "x" + ] + } + }, + { + "$ref" : "#/definitions/Zero/Big_Choice" + }, + { + "$ref" : "#/definitions/Zero/Season" + }, + { + "$ref" : "#/definitions/Zero/SelectionType" + }, + { + "$ref" : "#/definitions/Zero/NullType" + }, + { + "$ref" : "#/definitions/Zero/ObjIdType" + }, + { + "$ref" : "#/definitions/Zero/RelObjIdType" + } + ] +} diff --git a/regression_test/ttcn2json/two.ttcn b/regression_test/ttcn2json/two.ttcn index e54a5cbd3..21eb94e5a 100644 --- a/regression_test/ttcn2json/two.ttcn +++ b/regression_test/ttcn2json/two.ttcn @@ -7,7 +7,7 @@ ******************************************************************************/ module two { - type record of integer Ints; + type record of integer Ints with { encode "JSON" }; type set of universal charstring Strings; @@ -34,4 +34,4 @@ module two { //type record of integer Rec; -} with { encode "JSON" } +} diff --git a/regression_test/ttcn2json/two_e.json b/regression_test/ttcn2json/two_e.json new file mode 100644 index 000000000..27c91bddf --- /dev/null +++ b/regression_test/ttcn2json/two_e.json @@ -0,0 +1,794 @@ +{ + "definitions" : { + "one" : { + "HasAny" : { + "type" : "object", + "subType" : "record", + "properties" : { + "num" : { + "type" : "integer" + }, + "at" : { + "$ref" : "#/definitions/one/anytype" + } + }, + "additionalProperties" : false, + "fieldOrder" : [ + "num", + "at" + ], + "required" : [ + "num", + "at" + ] + }, + "Height" : { + "enum" : [ + "Short", + "Medium", + "Tall" + ], + "numericValues" : [ + 0, + 1, + 2 + ] + }, + "Rec" : { + "type" : "object", + "subType" : "record", + "properties" : { + "num" : { + "type" : "integer", + "default" : 0 + }, + "str" : { + "type" : "string", + "subType" : "universal charstring", + "default" : "empty" + } + }, + "additionalProperties" : false, + "fieldOrder" : [ + "num", + "str" + ], + "required" : [ + "num", + "str" + ] + }, + "Set" : { + "type" : "object", + "subType" : "set", + "properties" : { + "os" : { + "type" : "string", + "subType" : "octetstring", + "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" + }, + "buul" : { + "anyOf" : [ + { + "type" : "null" + }, + { + "type" : "boolean" + } + ], + "omitAsNull" : true + }, + "verd" : { + "anyOf" : [ + { + "type" : "null" + }, + { + "enum" : [ + "none", + "pass", + "inconc", + "fail", + "error" + ] + } + ], + "omitAsNull" : false + }, + "numbr" : { + "anyOf" : [ + { + "type" : "number" + }, + { + "enum" : [ + "not_a_number", + "infinity", + "-infinity" + ] + } + ], + "default" : "-infinity" + } + }, + "additionalProperties" : false, + "fieldOrder" : [ + "os", + "buul", + "verd", + "numbr" + ], + "required" : [ + "os", + "numbr" + ] + }, + "Uni" : { + "anyOf" : [ + { + "type" : "object", + "properties" : { + "numbr" : { + "anyOf" : [ + { + "type" : "number" + }, + { + "enum" : [ + "not_a_number", + "infinity", + "-infinity" + ] + } + ] + } + }, + "additionalProperties" : false, + "required" : [ + "numbr" + ] + }, + { + "type" : "object", + "properties" : { + "bytes" : { + "type" : "string", + "subType" : "octetstring", + "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" + } + }, + "additionalProperties" : false, + "required" : [ + "bytes" + ] + } + ] + }, + "Width" : { + "enum" : [ + "Thin", + "Medium", + "Wide" + ], + "numericValues" : [ + 0, + 1, + 2 + ] + }, + "anytype" : { + "anyOf" : [ + { + "type" : "object", + "properties" : { + "integer" : { + "type" : "integer" + } + }, + "additionalProperties" : false, + "required" : [ + "integer" + ] + }, + { + "type" : "object", + "properties" : { + "boolean" : { + "type" : "boolean" + } + }, + "additionalProperties" : false, + "required" : [ + "boolean" + ] + }, + { + "type" : "object", + "properties" : { + "bitstring" : { + "type" : "string", + "subType" : "bitstring", + "pattern" : "^[01]*$" + } + }, + "additionalProperties" : false, + "required" : [ + "bitstring" + ] + } + ] + } + }, + "two" : { + "Ints" : { + "type" : "array", + "subType" : "record of", + "items" : { + "type" : "integer" + } + }, + "PosInt" : { + "type" : "integer" + } + }, + "three" : { + "Barrels" : { + "type" : "object", + "subType" : "set", + "properties" : { + "numBarrels" : { + "type" : "integer" + }, + "barrelType" : { + "type" : "object", + "subType" : "record", + "properties" : { + "size" : { + "enum" : [ + "Small", + "Medium", + "Large" + ], + "numericValues" : [ + 0, + 1, + 2 + ] + }, + "filled" : { + "type" : "boolean" + } + }, + "additionalProperties" : false, + "fieldOrder" : [ + "size", + "filled" + ], + "required" : [ + "size", + "filled" + ] + } + }, + "additionalProperties" : false, + "fieldOrder" : [ + "numBarrels", + "barrelType" + ], + "required" : [ + "numBarrels", + "barrelType" + ] + }, + "Nums" : { + "type" : "array", + "subType" : "set of", + "items" : { + "type" : "object", + "subType" : "record", + "properties" : { + "number" : { + "originalName" : "num", + "type" : "integer" + } + }, + "additionalProperties" : false, + "required" : [ + "number" + ] + } + }, + "Numz" : { + "type" : "object", + "subType" : "record", + "properties" : { + "nums" : { + "$ref" : "#/definitions/three/Nums" + } + }, + "additionalProperties" : false, + "required" : [ + "nums" + ] + }, + "Rex" : { + "type" : "array", + "subType" : "record of", + "items" : { + "$ref" : "#/definitions/one/Rec" + } + }, + "Stuff" : { + "type" : "array", + "subType" : "record of", + "items" : { + "$ref" : "#/definitions/three/Thing" + } + }, + "Thing" : { + "anyOf" : [ + { + "originalName" : "b", + "type" : "boolean" + }, + { + "originalName" : "i", + "unusedAlias" : "int", + "type" : "integer" + }, + { + "originalName" : "cs", + "unusedAlias" : "str", + "type" : "string", + "subType" : "charstring" + }, + { + "originalName" : "rec", + "type" : "object", + "subType" : "record", + "properties" : { + "num" : { + "type" : "integer" + } + }, + "additionalProperties" : false, + "required" : [ + "num" + ] + } + ] + } + }, + "Zero" : { + "AnyString" : { + "anyOf" : [ + { + "type" : "object", + "properties" : { + "generalstr" : { + "type" : "string", + "subType" : "universal charstring" + } + }, + "additionalProperties" : false, + "required" : [ + "generalstr" + ] + }, + { + "type" : "object", + "properties" : { + "numericstr" : { + "type" : "string", + "subType" : "charstring" + } + }, + "additionalProperties" : false, + "required" : [ + "numericstr" + ] + }, + { + "type" : "object", + "properties" : { + "utf8str" : { + "type" : "string", + "subType" : "universal charstring" + } + }, + "additionalProperties" : false, + "required" : [ + "utf8str" + ] + }, + { + "type" : "object", + "properties" : { + "printablestr" : { + "type" : "string", + "subType" : "charstring" + } + }, + "additionalProperties" : false, + "required" : [ + "printablestr" + ] + }, + { + "type" : "object", + "properties" : { + "universalstr" : { + "type" : "string", + "subType" : "universal charstring" + } + }, + "additionalProperties" : false, + "required" : [ + "universalstr" + ] + }, + { + "type" : "object", + "properties" : { + "bmpstr" : { + "type" : "string", + "subType" : "universal charstring" + } + }, + "additionalProperties" : false, + "required" : [ + "bmpstr" + ] + }, + { + "type" : "object", + "properties" : { + "graphicstr" : { + "type" : "string", + "subType" : "universal charstring" + } + }, + "additionalProperties" : false, + "required" : [ + "graphicstr" + ] + }, + { + "type" : "object", + "properties" : { + "ia5str" : { + "type" : "string", + "subType" : "charstring" + } + }, + "additionalProperties" : false, + "required" : [ + "ia5str" + ] + }, + { + "type" : "object", + "properties" : { + "teletexstr" : { + "type" : "string", + "subType" : "universal charstring" + } + }, + "additionalProperties" : false, + "required" : [ + "teletexstr" + ] + }, + { + "type" : "object", + "properties" : { + "videotexstr" : { + "type" : "string", + "subType" : "universal charstring" + } + }, + "additionalProperties" : false, + "required" : [ + "videotexstr" + ] + }, + { + "type" : "object", + "properties" : { + "visiblestr" : { + "type" : "string", + "subType" : "charstring" + } + }, + "additionalProperties" : false, + "required" : [ + "visiblestr" + ] + } + ] + }, + "Big_Choice" : { + "anyOf" : [ + { + "type" : "object", + "properties" : { + "numbers" : { + "type" : "array", + "subType" : "set of", + "items" : { + "$ref" : "#/definitions/Zero/Number" + } + } + }, + "additionalProperties" : false, + "required" : [ + "numbers" + ] + }, + { + "type" : "object", + "properties" : { + "strings" : { + "$ref" : "#/definitions/Zero/ManyStrings" + } + }, + "additionalProperties" : false, + "required" : [ + "strings" + ] + } + ] + }, + "Big_Set" : { + "type" : "object", + "subType" : "set", + "properties" : { + "product" : { + "$ref" : "#/definitions/Zero/SeqProduct" + }, + "numbers" : { + "type" : "array", + "subType" : "set of", + "items" : { + "$ref" : "#/definitions/Zero/Number" + } + }, + "strings" : { + "$ref" : "#/definitions/Zero/ManyStrings" + }, + "color" : { + "enum" : [ + "red", + "blue", + "green", + "yellow" + ], + "numericValues" : [ + 0, + 1, + 2, + 3 + ] + } + }, + "additionalProperties" : false, + "fieldOrder" : [ + "product", + "numbers", + "strings", + "color" + ], + "required" : [ + "product", + "numbers", + "strings", + "color" + ] + }, + "ManyStrings" : { + "type" : "array", + "subType" : "record of", + "items" : { + "$ref" : "#/definitions/Zero/AnyString" + } + }, + "NullType" : { + "type" : "null" + }, + "Number" : { + "anyOf" : [ + { + "type" : "object", + "properties" : { + "decimal" : { + "type" : "integer" + } + }, + "additionalProperties" : false, + "required" : [ + "decimal" + ] + }, + { + "type" : "object", + "properties" : { + "binary" : { + "type" : "string", + "subType" : "bitstring", + "pattern" : "^[01]*$" + } + }, + "additionalProperties" : false, + "required" : [ + "binary" + ] + }, + { + "type" : "object", + "properties" : { + "hexadecimal" : { + "type" : "string", + "subType" : "octetstring", + "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" + } + }, + "additionalProperties" : false, + "required" : [ + "hexadecimal" + ] + } + ] + }, + "ObjIdType" : { + "type" : "string", + "subType" : "objid", + "pattern" : "^[0-2][.][1-3]?[0-9]([.][0-9]|([1-9][0-9]+))*$" + }, + "RelObjIdType" : { + "type" : "string", + "subType" : "objid", + "pattern" : "^[0-2][.][1-3]?[0-9]([.][0-9]|([1-9][0-9]+))*$" + }, + "Season" : { + "enum" : [ + "spring", + "summer", + "fall", + "winter" + ], + "numericValues" : [ + 1, + 2, + 3, + 4 + ] + }, + "SelectionType" : { + "type" : "array", + "subType" : "set of", + "items" : { + "$ref" : "#/definitions/Zero/Number" + } + }, + "SeqOfInt" : { + "type" : "array", + "subType" : "record of", + "items" : { + "type" : "integer" + } + }, + "SeqProduct" : { + "type" : "object", + "subType" : "record", + "properties" : { + "name" : { + "type" : "string", + "subType" : "universal charstring" + }, + "price" : { + "anyOf" : [ + { + "type" : "number" + }, + { + "enum" : [ + "not_a_number", + "infinity", + "-infinity" + ] + } + ] + }, + "id" : { + "anyOf" : [ + { + "type" : "null" + }, + { + "type" : "string", + "subType" : "octetstring", + "pattern" : "^([0-9A-Fa-f][0-9A-Fa-f])*$" + } + ], + "omitAsNull" : false + }, + "available" : { + "type" : "boolean" + } + }, + "additionalProperties" : false, + "fieldOrder" : [ + "name", + "price", + "id", + "available" + ], + "required" : [ + "name", + "price", + "available" + ] + } + } + }, + "anyOf" : [ + { + "$ref" : "#/definitions/two/Ints", + "decoding" : { + "prototype" : [ + "fast", + "f_dec_ints", + "os", + "x" + ] + }, + "encoding" : { + "prototype" : [ + "fast", + "f_enc_ints", + "eents", + "octus" + ], + "printing" : "pretty" + } + }, + { + "$ref" : "#/definitions/one/Rec", + "decoding" : { + "prototype" : [ + "convert", + "f_dec_rec", + "octie" + ], + "errorBehavior" : { + "ALL" : "WARNING", + "INVAL_MSG" : "ERROR" + } + }, + "encoding" : { + "prototype" : [ + "convert", + "f_enc_rec", + "x" + ] + } + }, + { + "$ref" : "#/definitions/Zero/Big_Set", + "decoding" : { + "prototype" : [ + "convert", + "f_dec_bigset", + "os" + ] + }, + "encoding" : { + "prototype" : [ + "convert", + "f_enc_bigset", + "x" + ] + } + } + ] +} diff --git a/regression_test/ttcn2json/zero.asn b/regression_test/ttcn2json/zero.asn index 1ab9eecd8..aaa7e04d3 100644 --- a/regression_test/ttcn2json/zero.asn +++ b/regression_test/ttcn2json/zero.asn @@ -61,15 +61,20 @@ Big-Choice ::= CHOICE { strings ManyStrings } +Season ::= ENUMERATED { + spring (1), summer (2), fall (3), winter (4) +} + SelectionType ::= numbers < Big-Choice --- non-encodable types NullType ::= NULL ObjIdType ::= OBJECT IDENTIFIER RelObjIdType ::= RELATIVE-OID +-- non-encodable types + EmbPdvType ::= EMBEDDED PDV ExtType ::= EXTERNAL diff --git a/titan_executor_api/doc/Titan_Executor_API_User_Guide.doc b/titan_executor_api/doc/Titan_Executor_API_User_Guide.doc index efa789f6eb597a366d8ddc7b7e0c52e1ced4811e..62c5615b969dfc39c458f69bc1d57249f37923e2 100755 GIT binary patch delta 3929 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 delta 3670 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 HKlc0+b2I6x diff --git a/usrguide/Makefile b/usrguide/Makefile index be02514ee..00c44cc52 100644 --- a/usrguide/Makefile +++ b/usrguide/Makefile @@ -12,13 +12,26 @@ include ../Makefile.cfg .SUFFIXES: .tex .labels .dvi .ps .pdf +DOC2PDF_JAR := ../../titan_playground/jar/doc2pdf.jar +WARNING_TXT := warning.txt TITAN_DOCS := apiguide.doc userguide.doc installationguide.doc referenceguide.doc releasenotes.doc - TITAN_PDFS := $(TITAN_DOCS:.doc=.pdf) ifeq ($(GEN_PDF), yes) -install: $(TITAN_PDFS) +# Install with error handling: Tries to create PDFs and copy the available documents to $(DOCDIR). +# On success (PDF files are successfully created), the PDF files are copied to the $(DOCDIR) directory. +# On failure (if doc2pdf.jar is not available or install_pdf exits with error, so PDFs are not created), the DOC files are copied to the $(DOCDIR) directory instead of the PDF files. +install: + { make test_doc2pdf_jar && make install_pdf; } || make install_error_handling + +# Checks if $(DOC2PDF_JAR) is present, and exit with error if not. +test_doc2pdf_jar: + @{ test -f $(DOC2PDF_JAR) && echo "$(DOC2PDF_JAR) is present .. OK"; } || { echo "ERROR: $(DOC2PDF_JAR) is missing" && false; }; + +# Install PDFs normal case: PDFs are created and copied to the $(DOCDIR) directory. +# PDF creation may fail if doc2pdf.jar fails, which can happen for example if the server, that converts from DOC to PDF, is not available. In this case the target exits with error. +install_pdf: $(TITAN_PDFS) ifdef MINGW $(info Skipped ${CURDIR} for MinGW) else @@ -26,12 +39,28 @@ else cp $(TITAN_PDFS) $(DOCDIR) endif +# Copies DOC files to $(DOCDIR) instead of the PDF files, because PDF creation failed. Also a $(WARNING_TXT) is created +install_error_handling: + @echo "Error handling: DOC files are copied to $(DOCDIR) instead of PDF files" +ifdef MINGW +$(info Skipped ${CURDIR} for MinGW) +else + mkdir -p $(DOCDIR) + cp $(TITAN_DOCS) $(DOCDIR) + @echo "Creating $(WARNING_TXT)" + @echo "DOC files are copied to $(DOCDIR) instead of PDF files." >$(WARNING_TXT) + @echo "It is because $(DOC2PDF_JAR) is missing or failed, which can happen for example if the server, that converts from DOC to PDF, is not available." >>$(WARNING_TXT) + cp $(WARNING_TXT) $(DOCDIR) +endif + +# Converts DOC to PDF +# $@ : target name, for example: apiguide.pdf +# $(basename $@) : target name without extension, for example: apiguide %.pdf : %.doc - @for doc in $(TITAN_DOCS:.doc=); do \ - java -jar ../../titan_playground/jar/doc2pdf.jar $(addsuffix .doc, $$doc) $(addsuffix .pdf, $$doc) || exit; \ - done + @java -jar $(DOC2PDF_JAR) $(basename $@).doc $@ || { echo "ERROR: doc2pdf.jar failed with $(basename $@).doc" && false; } else +# GEN_PDF == no install: endif @@ -45,3 +74,4 @@ clean: distclean:clean dep: + diff --git a/usrguide/PRI.doc b/usrguide/PRI.doc new file mode 100644 index 0000000000000000000000000000000000000000..b0e48bf0a226c2435a81cbb3459a2fb80adc7e5d GIT binary patch literal 83456 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
+%C-dwcUK5hL66`@Z6l29iLFWx3tIJ9Z5HJ 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 Z%E&U4O8c=wd92m>p7<&w#mYaafuCsz%m4rY literal 0 HcmV?d00001 diff --git a/usrguide/apiguide.doc b/usrguide/apiguide.doc index b70d90274337724b9b0e26c81278a91ffe4de781..6d9e0e61f2044c2b981cb6ec4afec09665d603e6 100644 GIT binary patch delta 19845 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 delta 21627 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 diff --git a/usrguide/installationguide.doc b/usrguide/installationguide.doc index f199061fb04c7cc41cd4a6ee2de78afc59154334..d530d55c31271dabbe32808e08cdfc5737fad0cb 100644 GIT binary patch delta 13338 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 delta 12912 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 diff --git a/usrguide/referenceguide.doc b/usrguide/referenceguide.doc index 3703a434d4b0828f64206b6a18b15c000c2df8a3..4bc7ce3308253a4c88c9c24b94c0ebee8361d7cd 100644 GIT binary patch delta 242689 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 E1%x$ZV*mgE delta 197941 zcmcfK2Urx>0_gDp#O$gls8|qnu`7!7V(%^XUQtw3l%j$?x*8LEUv=y)7<(^k@4a_o z_bRqTMMNbU%ln_5on>iWZ{GVJe7|M(%$YN1PMb5c1B{*!JbHAe8Rd)Qmn5lOc3#An zqa<}=*@ne0U%!5pB>7|i{K3YMpYpf2nPuy0w<_MzP}H`Vb0a6|UZ{<Ud-4y`k4}=b z%+@e7OFl!mt+&2dYg1y9`1w<aBpu^zjqZ{(fuE=NDZZ?KnxmV-*(<x1B-b9Mx2b;4 zBWOF}FC5t207?4AIVD~-Ut3ACm!uNoCB4+Nj3f=*BuQu3pvq<?p|n3ew@T91K9cm% z#YXy6Sd#7qa@4sb$<D`CA}Pt9pW^F#ewH9!wIEw*E1SHooZVKsML<~+SV@`W$)+Cb zz54Qi()se}S(%f)7vrbMh4{KxUzB;uPqDG}mzsq7Q#~3rj(C5CBrdR>FM;_wE9s^E zDfZ*voN`K=P}=vR7_7hYbvET)Ztkfq?xE&3eWaAVw*5hphJCV;I%kz@dTJZ#Yi3sx zRCBIYv}c8B`?8e3q-@9@)o_m{Hq!enl62kHR+?g!lLT*DDKGDBsqiZNG*vu5L+os& z2ki4q6=gpqT5_c3_XTXEED{+IIjP%7<iyr4C8nCVS_HLo+DhxGQuQd+pK4jE@6FX| zSe7ME@su#-K-BkYJ@S*LP%>-B4mQ$0u~@8<8YS&d^?=fbr@S|~{;<SbJ<gQi)O$`J zZmB@`V(C{Z8;c&R%OOd%x@~K$S(ruR8R!?_?d9ohNXStpm-<H6xsT2!udh6&w5H$> zN(3K6J%^%d1fL8d_!?$AlvE@5W)Q*8@XWzWjo_C-1b;(=oPlbF{0)a4imGn{44ZOR z&S}nFfU>D!OR<9L`apwAt^jp?VEXkzhB3K3)b&B>)_Zvx?&qrNsHE@ZsjT<%v^sn* zFGFL;z#q&p42e12%)9pTHf(pSqHgM)(WX8Iol_|_hPmXtysZ=WH4Jttp(f~SXzHX> z-}o8MIMq|PHJ6!}b-j4`8*1dX?BCzK|5Pyo4C`}ynh)N~TzK+wcTFLsX1xLpIr5ZM z*P9E^dVP=~G*5YRy?L1n&&zPxT`hfYPs8Cn#my1C)zTByW6rp@S259=JbbkV-Oj=W zhq8`pWG^MZ-iDCkmejlr!}9v85zGaeDuR#Ue%=b^0`m4Tw8*QLmbb5=igN{ZQ*#sa zHe9Y?N!!mb-`PXm)Xy-$*|Mp>A=$aSy2jsdF=b7Fp;f+eYNF=i^OkMOXk3)?^A0p@ z$mgR*FqdDd2tfwN{FZE)3y^GC3ed;X5RpI7oPv+J0DY{=#K+5UJ%4pIg1OLq3}d|1 z1M~4V)G1J3jbJXcR1tg(dkd&}@G&>SR1tg)1qynb3&6+M@VbCnG(LWY;RS1{X`9=i zk9GF_4KE7TR3n(1V5$fKhAu9p%q`4E?Y`ZLyQsShG;DM6GdC6=a|!xdw_%?kLxDox z>MqPh=xbE~zMh8Rg*?p>e9cAZXEj9ldKqpN@-pwk*Ib13`;^Av>uspw>gl9(abLA3 zry2!(eGH3TEs0pVvh{9!4PRZo)I`ip(96%ys<-?48A1w|RimhV+TVJ#@%1<CE$pdg zR_)XQ)|m}3xE86T#xNJDSE?9+hVezz3iS;%1Q$_<EZ-o*h@v&rZPgAPU{#uao`x4i z1I;n~)E*rmj?-Mkex@$%@8M;bQ6aCPzs^yOtd^`Pvblc!ybW7)jnx=x$p%>+j-QXg z!!6KUCVpzc23Z%IpRYl7YoI2gmMn=_x{;rs!LgX1nuxhzy*;f9*3aKCxR|?|h`C@H zzZiZhDHZP*AjYZy4{vR!#?9*2Z`ibc7i}J0^P2VRwyaxE*R^$24_`H+dF=8`mCHaw ziQ*O19jJo=ouNX(AoF%X$_{+Bo$A!B*RW~b%+gl}3Loo^;O}X;THMW?zQ4I<7z9(! zh5lZKk|oNjG1LJzRSa)~zJ$BEocz@h*4Mh6{Cy0!OSqZq+TUCs-iDbjYM1r*HB>06 zword{sP(m~Qhz_gw32FV_^Y*%s#p8_8{U?zq-I2|4PWc>^bas}Emc!J8g=xw?)m<K zhRdY_%q`77P(JLXDW(j}{y~PI(k0Yw)#9Z0S<W>9o`z|q)#ebOmS(CLUWPwQmo=vz z;AJ>lQtd?n47p`WscXFDh2H9Z1AGh%%ebp+e5}{_8j{PDGS4Cc<OSZE;!0Kn{0vRY zdYelkKrJkP>q$a@zhO&RwXg!z!t%E+tN;dua%$rXPz%f7s*3~!8itoEZZ47lwRxtB z5oEYfu8bN(Ei~&Gfu4ra?rNb0s)a`GEa&?`)8G)q`CdN1;)hah8F!#SwQUAix4b}a z!y9+C(gM}SX+5w7`WWh$_cxbSpxQPAtb0kIuVG_(brcR%TW9Jh3>FpYtEs3Z9$;OZ zf&PXG6@t_#YKfbpIGSd~fu_;I%Tr8kmK7~zuJgbELyK~1?+FYP{oTt;D<@w3A)leA zhoc%R&~VyaZB2nehLs*_YvN7HnjlZZCyz$vZFpm~#>+6IVqJ4p1zAedYAguyHoUCZ z-h2c>YGDRimv@klVX&t<@&>7;nL3KE;l5`LH3v*jE2_B;@-sB|vU=0R(=9+5<%0Z8 zNA06+7}+zdM`(1$O&~}u)Sy&Z3NR#kl~i-BHsjP$0uA-O)s`Nlw&NhHt{p^ydY4oS zM{UPe=NwK9hJU<ED7)c}c{C65-R9{NdR8yRNCTy=lE0*rDoIs&9f4kwkL7(isk|w~ z%M#*c4)L~x6x4Z2o>D<wEkeTBx<6@#O3{cUeVsH?a^PpE6v3KsDa5p_lUlJxuk1d+ zl2jRU2EMhsC=v=I5hY_OSuG~jlxj(}xf>yNS)QHh{@b^n2+9$s?9e-1!l`#?ecWE= zqaG=h&GZ<RLkwh3N(omdrueSN_ne(JdF{Q}Shwx#S6f@Xxo{d%aM2uL2tRvJa2{;j zkoTf^qj?=7MN!24co!-4=6wjUdYHm`TEb#@uVb4&Y%i)bilPtab%==3TUWPrtA@JT zEu$;x^5`0LXkNEv<AzOt9N*a1#@N`_c6$YJcf@y`r|nKpJBPM%<0Km=xx_fT+48<| zcEx4K@phGS42lRH7}ldz%)qe7-g4x4yCTN<<LzeJWYdL2_S6lE42z01)|+UTY-{W` z#cqa8ftWs_x;~*pbv?s+hs8we28Q+@7#bZK86yv$W;f1QZMxkeJB?}6kjP=O&15?l zV@`wJm?HAPt#)nXH(Tw>*yxOZY`5END^E7s$;MW@?DE;V>&iq$h7Z%l4C@~nts4>+ z(?{2+RkNnL(8wN9J;|0XWMHT+JS;jUv}ajk*dDu3n=H+UFT1_8%VW&3&#q!VC(|yQ z)oxw4wXRj`mP~`>gBR_p$jk29Im=Tn+vSvvSL{j{uU)nCvMJuGzc^N18LzVCb*%<P zaQwP5-YnM(2@ltm@nNZ*T;{r+XJI9x8cB)3%CN|o(1F?IF>maOXeo`>t!p=};3F@; zZdc8wmHgnkUEZ=vs<X>yuUJv1ei=maX@c6xg>Tq}$^C7!xN1nLW~-(iUjII!0D0>( zyTUnB?bXMqzhM_w*uhjj(V^j?Jz~P5<jA*n6^(1&+WFc9w`RXol_+{$ShOxAd`QT! zXlge)hB6uy7TqVLdw8g>*TAR<r7=Y7x`*}%85A9=i|VBlEg&)^B2-r<GD;U28roCW zD{7!FL}!Q|)V(z+&X&8~qy@ZvXE*7%VNB6-#*rtojQv5Lu`kEnofopW{*W`gab*7i z16xMN3>q@D{V=)w^(-Z|opcr2>LPVr9OO>dv$#5YczEatYNLyciVXe9l+P|YdCK)H z9gX#FWU+TJE`F4yU_lRhkWMN?uMqu23|l%=h|<qOc-ND#9`u<AdRe%9@=F$Xy}#tg zw-3six@Hrih_0%3$0)j6O4sX7cnsaP5`Er_SDoalYbrI9TC>zjY9lr0yP4FI_jRQ@ zQemBrU5U{%nlyWxmOR+f+q7jnhPaklrKXGqO=Y()S@M^4;3la^Q%SL*R8Q)_y9`n= ze*K&!)J9)d8cMp#NE~X~vY{!r!x$O{vE?B4D+)m!IHDM{V>p5+Q?XQ#+Op2yG(svd zMDbBDe5cKWD3P9on)0k<S*kA=|B@w-Y+KkqZ?l1>@)GBTo~HD=vu`oPseAq(OG&mV zY@bITO(Oj*Cm?YsJxx{Angh^L$05?-REHNqxEN`bdKM#Y7>6RZ(wRof-lnYmmqKZ) z^Y`)4i5_7rZezbFi}9}3KF(Gj6VoHor)xw=ztCP`;i0`lBSm`*>Cv-S@9@SE{aZ#4 z(RCppR1C#RZxC;P)QQNZHBoe@fj?Q^HWzPc-b89<j+DNEvoglCGBQN|=x?7tYZsm9 z2yz<-`+E7K20EnAQ-#6C%?|dH9F&u{IJ+oED@s5)hloZPiGh@ks4k_f`kO*U?-1vx zVT6XsPJ{D1>%~b*X%*sCEcY;VEYT*#d_c4oaY72A;QO#%v@8!oTASX93`CnwQZa1T zhj*e=ib@;EwqkAS6PuW8L=jWzF{G>K?LeZX<T{MiqDzEu##EYi6mh~yOw1re&lfSo zu9PEJcA}g&)vd&Fsz<D3L8Kr$W(CsHasOVNc?U|>q#tzBPa;76TF5@O03&0hE_A3e zEQ$(bAdMP0ti0T;k9~n!L&7+7bPv__4-e_VAjk<KN*B{7Bqk-IhpriC&VfV1qC?9w zY?_AJ=xENpJ$1zG9x9L2*cXzgb+OkJ^w8BBrt2BnD`Zf345={qiiX56yR(S>ANIy< zCG3mX*p=7C$nGWWf3@ji++5OrtgQ$z`j;WVrlx$MtbGGHrw3zW`EvHrHra+m=^{d7 z`b71Nmb?1d=QAF5xA)It?CfQ~!N!=)$3A-&n`onRfPDu$IjWMqPM%ZA{(?<Uxo2hj zI`Z;7_N9#HE89P`lk3&8|6_dHF80W3Y}@6B*r	bu|-gvo?&>MGfpJKFMflv}vFj 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®-?VkvS^?eF66 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%0D( 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 EH?rI)UH||9 diff --git a/usrguide/releasenotes.doc b/usrguide/releasenotes.doc index 6c6bbe792a2814057c443484bacef348924447f1..b9c5b49bcaf02c1f4c612b5cadf5d8d2506adab0 100644 GIT binary patch delta 109346 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 delta 112394 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 ANB{r; diff --git a/usrguide/userguide.doc b/usrguide/userguide.doc index a31a339b25655fee18a81f70e7e97a58270f2d4f..da7dd72a28d15a2719d0a32bc9680a8633b60cb2 100644 GIT binary patch delta 10915 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 MsYAX05`Wb4e?ay<9RL6T delta 11260 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 -- GitLab