diff --git a/core/config_process.l b/core/config_process.l index bf2acbd460fc7b973cd5ad9bb7b4d86457d39593..7f3265ae6bdcbc7d2f96c90c209a8696a16db818 100644 --- a/core/config_process.l +++ b/core/config_process.l @@ -34,6 +34,7 @@ #include <deque> #include <string> +#include <math.h> #include "../common/cfg_process_utils.hh" #include "../common/Path2.hh" @@ -90,7 +91,7 @@ LINECOMMENT ("//"|"#")[^\r\n]*{NEWLINE} NUMBER 0|([1-9][0-9]*) -FLOAT [+-]?({NUMBER}\.[0-9]+)|((({NUMBER}(\.[0-9]+)?)|(\.[0-9]+))[Ee][+-]?{NUMBER}) +FLOAT [+-]?({NUMBER}\.[0-9]+)|((({NUMBER}(\.[0-9]+)?)|(\.[0-9]+))[Ee][+-]?{NUMBER})|infinity|not_a_number BIN 0|1 BITSTRING '{BIN}*'B @@ -330,7 +331,15 @@ TTCNSTRINGPARSING_COMPONENT "$#&&&(#TTCNSTRINGPARSING_COMPONENT$#&&^#% " } {FLOAT} { - yylval.float_val = atof(yytext); + if (!strcmp(yytext, "not_a_number")) { +#ifdef NAN + yylval.float_val = NAN; +#else + yylval.float_val = INFINITY + (-INFINITY); +#endif + } else { + yylval.float_val = atof(yytext); + } if (YY_START == SC_MODULE_PARAMETERS || YY_START == SC_CHAR_KEYWORD) { // return a different token for module parameters so it doesn't conflict with references return MPFloat; diff --git a/mctr2/cli/config_read.l b/mctr2/cli/config_read.l index 18b8de8af3ee69f7a3f8c9df8c821cc543f45e34..cc70a5fa6468105d25b6de4929e089728272f203 100644 --- a/mctr2/cli/config_read.l +++ b/mctr2/cli/config_read.l @@ -35,6 +35,7 @@ #include <deque> #include <string> +#include <math.h> #include <openssl/crypto.h> #include <openssl/bn.h> @@ -89,7 +90,7 @@ LINECOMMENT ("//"|"#")[^\r\n]*{NEWLINE} NUMBER 0|([1-9][0-9]*) -FLOAT [+-]?({NUMBER}\.[0-9]+)|((({NUMBER}(\.[0-9]+)?)|(\.[0-9]+))[Ee][+-]?{NUMBER}) +FLOAT [+-]?({NUMBER}\.[0-9]+)|((({NUMBER}(\.[0-9]+)?)|(\.[0-9]+))[Ee][+-]?{NUMBER})|infinity|not_a_number BIN 0|1 BITSTRING '{BIN}*'B @@ -360,7 +361,15 @@ UID [uU][+]?[0-9A-Fa-f]{1,8} } {FLOAT} { - yylval.float_val = atof(yytext); + if (!strcmp(yytext, "not_a_number")) { +#ifdef NAN + yylval.float_val = NAN; +#else + yylval.float_val = INFINITY + (-INFINITY); +#endif + } else { + yylval.float_val = atof(yytext); + } if (YY_START == SC_MODULE_PARAMETERS || YY_START == SC_CHAR_KEYWORD) { RETURN(MPFloat); } diff --git a/regression_test/cfgFile/module_parameters/Makefile b/regression_test/cfgFile/module_parameters/Makefile index c07ff498eb0c5e80a89983add1b4817ae7bd312e..ba46e6111413999df15357ecdffa3c3ad03dacb2 100644 --- a/regression_test/cfgFile/module_parameters/Makefile +++ b/regression_test/cfgFile/module_parameters/Makefile @@ -16,7 +16,7 @@ include $(TOPDIR)/Makefile.regression unexport ABS_SRC unexport SRCDIR -DIRS := assignment concat +DIRS := assignment concat special_values ifdef RT2 DIRS += references nested endif diff --git a/regression_test/cfgFile/module_parameters/special_values/Makefile b/regression_test/cfgFile/module_parameters/special_values/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..07863c8a6df98f84744966e8600eac2d87662afa --- /dev/null +++ b/regression_test/cfgFile/module_parameters/special_values/Makefile @@ -0,0 +1,65 @@ +############################################################################## +# Copyright (c) 2000-2016 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 +# +# Contributors: +# Szabo, Bence Janos +# +############################################################################## +TOPDIR := ../../../ +include $(TOPDIR)/Makefile.regression + +FILES := SpecialValues.ttcn SpecialValues.cfg +RUNNABLE := SpecialValues +CFG := SpecialValues.cfg +DIR_SINGLE := dir_single_mode +DIR_PARALLEL := dir_parallel_mode +GENERATED_DIRS := $(DIR_SINGLE) $(DIR_PARALLEL) + +COVERAGE_FLAG := +ifeq ($(COVERAGE), yes) + COVERAGE_FLAG += -C +endif + +ifdef DYN +ifeq ($(PLATFORM), WIN32) + export PATH+=:$(TTCN3_DIR)/lib:$(ABS_SRC)/$(DIR_SINGLE):$(ABS_SRC)/$(DIR_PARALLEL): +else + export LD_LIBRARY_PATH+=:$(ABS_SRC)/$(DIR_SINGLE):$(ABS_SRC)/$(DIR_PARALLEL): +endif +endif + +MAKE_PROG := $(MAKE) + +# List of fake targets: +.PHONY: all clean run run_single run_parallel runall + +all: $(GENERATED_DIRS) + +dir_single_mode: + mkdir $@ + cd $@ && for file in $(FILES); do ln -s ../$$file || exit; done + cd $@ && $(TTCN3_DIR)/bin/ttcn3_makefilegen $(COVERAGE_FLAG) $(SPLIT_FLAG) $(RT2_FLAG) -s ./* && $(MAKE_PROG) + +dir_parallel_mode: + mkdir $@ + cd $@ && for file in $(FILES); do ln -s ../$$file || exit; done + cd $@ && $(TTCN3_DIR)/bin/ttcn3_makefilegen $(COVERAGE_FLAG) $(SPLIT_FLAG) $(RT2_FLAG) ./* && $(MAKE_PROG) + +run: $(GENERATED_DIRS) + cd $(DIR_SINGLE) && ./$(RUNNABLE) $(CFG) + cd $(DIR_PARALLEL) && $(TTCN3_DIR)/bin/ttcn3_start $(RUNNABLE) $(CFG) + +# To run all tests, possibly in parallel +run_single: $(DIR_SINGLE) + cd $(DIR_SINGLE) && ./$(RUNNABLE) $(CFG) +run_parallel: $(DIR_PARALLEL) + cd $(DIR_PARALLEL) && $(TTCN3_DIR)/bin/ttcn3_start $(RUNNABLE) $(CFG) +runall: run_single run_parallel + +clean distclean: + rm -rf $(GENERATED_DIRS) + diff --git a/regression_test/cfgFile/module_parameters/special_values/SpecialValues.cfg b/regression_test/cfgFile/module_parameters/special_values/SpecialValues.cfg new file mode 100644 index 0000000000000000000000000000000000000000..c28d3724ced0c25bb61d4db59de09fdebae36af6 --- /dev/null +++ b/regression_test/cfgFile/module_parameters/special_values/SpecialValues.cfg @@ -0,0 +1,71 @@ +############################################################################### +# Copyright (c) 2000-2016 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 +# +# Contributors: +# Bence Janos Szabo +# +############################################################################### +[MODULE_PARAMETERS] + +inf1 := infinity; +inf2 := infinity + 1.0; +inf3 := infinity - 1.0; +inf4 := 1.0 + infinity; +inf5 := infinity * 2.0; +inf6 := infinity / 2.0; +inf7 := 2.0 * infinity; +inf8 := infinity + infinity; +inf9 := infinity - -infinity; +inf10 := infinity * infinity; +inf11 := -infinity * -1.0; +inf12 := -infinity * -infinity; + +neginf1 := -infinity; +neginf2 := -infinity + 1.0; +neginf3 := -infinity - 1.0; +neginf4 := 1.0 + -infinity; +neginf5 := 1.0 - infinity; +neginf6 := -infinity * 2.0; +neginf7 := -infinity / 2.0; +neginf8 := 2.0 * -infinity; +neginf9 := -infinity + -infinity; +neginf10 := -infinity * infinity; +neginf11 := infinity * -infinity; +neginf12 := infinity * -1.0; + +zero1 := 2.0 / infinity; +zero2 := 2.0 / -infinity; + +nan1 := not_a_number; +nan2 := not_a_number + 1.0; +nan3 := not_a_number - 1.0; +nan4 := 1.0 + not_a_number; +nan5 := 1.0 - not_a_number; +nan6 := not_a_number * 2.0; +nan7 := not_a_number / 2.0; +nan8 := 2.0 * not_a_number; +nan9 := 2.0 / not_a_number; +nan10 := not_a_number + not_a_number; +nan11 := not_a_number - not_a_number; +nan12 := not_a_number * not_a_number; +nan13 := not_a_number / not_a_number; +nan14 := infinity / infinity; +nan15 := -infinity / infinity; +nan16 := infinity / -infinity; +nan17 := -infinity / -infinity; +nan18 := not_a_number + infinity; +nan19 := not_a_number - infinity; +nan20 := not_a_number * infinity; +nan21 := not_a_number / infinity; +nan22 := not_a_number + -infinity; +nan23 := not_a_number - -infinity; +nan24 := not_a_number * -infinity; +nan25 := not_a_number / -infinity; + + +[EXECUTE] +SpecialValues.control diff --git a/regression_test/cfgFile/module_parameters/special_values/SpecialValues.ttcn b/regression_test/cfgFile/module_parameters/special_values/SpecialValues.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..ec2281ca8f43e8ce0b680b27ad762797277d5c1b --- /dev/null +++ b/regression_test/cfgFile/module_parameters/special_values/SpecialValues.ttcn @@ -0,0 +1,253 @@ +/****************************************************************************** + * Copyright (c) 2000-2016 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 + * + * Contributors: + * Szabo, Bence Janos + * + ******************************************************************************/ +module SpecialValues { + +type component EmptyCT {} + +modulepar float inf1, inf2, inf3, inf4, inf5, inf6, inf7, inf8, inf9, inf10, inf11, inf12; + +modulepar float neginf1, neginf2, neginf3, neginf4, neginf5, neginf6, neginf7, neginf8, neginf9, neginf10, neginf11, neginf12; + +modulepar float zero1, zero2; + +modulepar float nan1, nan2, nan3, nan4, nan5, nan6, nan7, nan8, nan9, nan10, nan11, nan12, nan13, nan14, nan15, nan16, nan17, nan18, nan19, nan20, nan21, nan22, nan23, nan24, nan25; + + +testcase tc_moduleparam_inf() runs on EmptyCT { + if (inf1 != infinity) { + setverdict(fail, match(inf1, infinity)); + } + + if (inf2 != infinity) { + setverdict(fail, match(inf2, infinity)); + } + + if (inf3 != infinity) { + setverdict(fail, match(inf3, infinity)); + } + + if (inf4 != infinity) { + setverdict(fail, match(inf4, infinity)); + } + + if (inf5 != infinity) { + setverdict(fail, match(inf5, infinity)); + } + + if (inf6 != infinity) { + setverdict(fail, match(inf6, infinity)); + } + + if (inf7 != infinity) { + setverdict(fail, match(inf7, infinity)); + } + + if (inf8 != infinity) { + setverdict(fail, match(inf8, infinity)); + } + + if (inf9 != infinity) { + setverdict(fail, match(inf9, infinity)); + } + + if (inf10 != infinity) { + setverdict(fail, match(inf10, infinity)); + } + + if (inf11 != infinity) { + setverdict(fail, match(inf11, infinity)); + } + + if (inf12 != infinity) { + setverdict(fail, match(inf12, infinity)); + } + + setverdict(pass); +} + +testcase tc_moduleparam_neginf() runs on EmptyCT { + if (neginf1 != -infinity) { + setverdict(fail, match(neginf1, -infinity)); + } + + if (neginf2 != -infinity) { + setverdict(fail, match(neginf2, -infinity)); + } + + if (neginf3 != -infinity) { + setverdict(fail, match(neginf3, -infinity)); + } + + if (neginf4 != -infinity) { + setverdict(fail, match(neginf4, -infinity)); + } + + if (neginf5 != -infinity) { + setverdict(fail, match(neginf5, -infinity)); + } + + if (neginf6 != -infinity) { + setverdict(fail, match(neginf6, -infinity)); + } + + if (neginf7 != -infinity) { + setverdict(fail, match(neginf7, -infinity)); + } + + if (neginf8 != -infinity) { + setverdict(fail, match(neginf8, -infinity)); + } + + if (neginf9 != -infinity) { + setverdict(fail, match(neginf9, -infinity)); + } + + if (neginf10 != -infinity) { + setverdict(fail, match(neginf10, -infinity)); + } + + if (neginf11 != -infinity) { + setverdict(fail, match(neginf11, -infinity)); + } + + if (neginf12 != -infinity) { + setverdict(fail, match(neginf12, -infinity)); + } + + setverdict(pass); +} + +testcase tc_moduleparam_zero() runs on EmptyCT { + if (zero1 != 0.000000) { + setverdict(fail, match(zero1, 0.000000)); + } + + if (zero2 != -0.000000) { + setverdict(fail, match(zero2, -0.000000)); + } + + setverdict(pass); +} + +testcase tc_moduleparam_nan() runs on EmptyCT { + if (nan1 != not_a_number) { + setverdict(fail, match(nan1, not_a_number)); + } + + if (nan2 != not_a_number) { + setverdict(fail, match(nan2, not_a_number)); + } + + if (nan3 != not_a_number) { + setverdict(fail, match(nan3, not_a_number)); + } + + if (nan4 != not_a_number) { + setverdict(fail, match(nan4, not_a_number)); + } + + if (nan5 != not_a_number) { + setverdict(fail, match(nan5, not_a_number)); + } + + if (nan6 != not_a_number) { + setverdict(fail, match(nan6, not_a_number)); + } + + if (nan7 != not_a_number) { + setverdict(fail, match(nan7, not_a_number)); + } + + if (nan8 != not_a_number) { + setverdict(fail, match(nan8, not_a_number)); + } + + if (nan9 != not_a_number) { + setverdict(fail, match(nan9, not_a_number)); + } + + if (nan10 != not_a_number) { + setverdict(fail, match(nan10, not_a_number)); + } + + if (nan11 != not_a_number) { + setverdict(fail, match(nan11, not_a_number)); + } + + if (nan12 != not_a_number) { + setverdict(fail, match(nan12, not_a_number)); + } + + if (nan13 != not_a_number) { + setverdict(fail, match(nan13, not_a_number)); + } + + if (nan14 != not_a_number) { + setverdict(fail, match(nan14, not_a_number)); + } + + if (nan15 != not_a_number) { + setverdict(fail, match(nan15, not_a_number)); + } + + if (nan16 != not_a_number) { + setverdict(fail, match(nan16, not_a_number)); + } + + if (nan17 != not_a_number) { + setverdict(fail, match(nan17, not_a_number)); + } + + if (nan18 != not_a_number) { + setverdict(fail, match(nan18, not_a_number)); + } + + if (nan19 != not_a_number) { + setverdict(fail, match(nan19, not_a_number)); + } + + if (nan20 != not_a_number) { + setverdict(fail, match(nan20, not_a_number)); + } + + if (nan21 != not_a_number) { + setverdict(fail, match(nan21, not_a_number)); + } + + if (nan22 != not_a_number) { + setverdict(fail, match(nan22, not_a_number)); + } + + if (nan23 != not_a_number) { + setverdict(fail, match(nan23, not_a_number)); + } + + if (nan24 != not_a_number) { + setverdict(fail, match(nan24, not_a_number)); + } + + if (nan25 != not_a_number) { + setverdict(fail, match(nan25, not_a_number)); + } + setverdict(pass); + +} + + +control { + execute(tc_moduleparam_inf()); + execute(tc_moduleparam_neginf()); + execute(tc_moduleparam_zero()); + execute(tc_moduleparam_nan()); +} + +}