diff options
author | kennykb <kennykb@noemail.net> | 2005-05-10 18:33:37 (GMT) |
---|---|---|
committer | kennykb <kennykb@noemail.net> | 2005-05-10 18:33:37 (GMT) |
commit | 12f35b8171c95899a2a2a30542cec622fc022868 (patch) | |
tree | 2f108341f2c542f48532e6057d79bfa551a4245f | |
parent | b4e4f618035fce9c41fdbdb94a781e6e33d02427 (diff) | |
download | tcl-12f35b8171c95899a2a2a30542cec622fc022868.zip tcl-12f35b8171c95899a2a2a30542cec622fc022868.tar.gz tcl-12f35b8171c95899a2a2a30542cec622fc022868.tar.bz2 |
Merged kennykb-numerics-branch back to the head; TIPs 132 and 232
FossilOrigin-Name: 1cc2336920c70c6b9f7825b88dec87fc223f2c4e
225 files changed, 11351 insertions, 2328 deletions
@@ -1,8 +1,49 @@ +2005-05-10 Kevin Kenny <kennykb@acm.org> + + Merged all changes on kennykb-numerics-branch back into the + HEAD. TIP's 132 and 232 are now Final. + +2005-05-10 Kevin Kenny <kennykb@acm.org> + + [kennykb-numerics-branch] Merged changes from HEAD. + 2005-05-10 Miguel Sofer <msofer@users.sf.net> * generic/tclExecute.c (ExponLong, ExponWide): fixed special case 'i**0' for i>0 [Bug 1198892] +2005-05-09 Kevin B. Kenny <kennykb@acm.org> + + [kennykb-numerics-branch] + * win/tclWin32Dll.c (TclpCheckStackSpace, TclWinCPUID): + Reworked structured event handling to function even + with -fomit-frame-pointers. + +2005-05-08 Kevin B. Kenny <kennykb@acm.org> + + [kennykb-numerics-branch] + * generic/tclStrToD.c: Made code more portable by finding a + workaround for MSVC's 'volatile' issue that + does not require conditional compilation. + * win/tclWin32Dll.c (TclWinCPUID): Removed structured event + handling from the GCC code + since (a) bad code is generated + by the instruction scheduling + with -O2, and (b) it's not + needed on any reasonably modern + CPU. + +2005-05-07 Kevin B. Kenny <kennykb@acm.org> + + [kennykb-numerics-branch] + * generic/tclEvent.c: Moved initialization of tclStrToD.c's + * generic/tclInt.h: static constants into a procedure called + * generic/tclStrToD.c: from TclInitSubsystems to avoid double + checked locking protocol. Cleaned up + an issue where MSVC ignored the 'volatile' + specifier, causing incorrect comparison + of an underflowed number against zero. + 2005-05-06 Jeff Hobbs <jeffh@ActiveState.com> * unix/tcl.m4, unix/configure: correct Solaris 10 (5.10) check and @@ -10,6 +51,10 @@ 2005-05-05 Kevin B. Kenny <kennykb@acm.org> + [kennykb-numerics-branch] Merged with HEAD. + +2005-05-05 Kevin B. Kenny <kennykb@acm.org> + * win/tclWinThrd.c: Corrected a compilation error on the --enable-threads configuration. @@ -102,6 +147,33 @@ * doc/open.n: "BINARY" in "access" argument to [open]. * tests/ioCmd.test: +2005-04-26 Kevin B. Kenny <kennykb@users.sourceforge.net> + + * generic/tclBinary.c (FormatNumber): + Dredge the NaN out of the internal representation if + Tcl_GetDoubleFromObj returns TCL_ERROR on a NaN. + + * generic/tclObj.c (Tcl_GetDoubleFromObj): + Restored silent overflow/underflow behaviour that the merge + of 2004-04-25 messed up. Thanks to Don Porter for calling + attention to this bug. Also removed an uninitialised memory + reference in this function that valgrind caught. Also changed + to return TCL_ERROR on a pure NaN. + + * generic/tclStrToD.c (RefineResult): + Added a test for the initial approximation being HUGE_VAL; + this test avoids EDOM being returned from ldexp on some platforms + on input values exceeding the floating point range. + + * tests/expr.test (expr-29.*, expr-30.*): + Added further tests of overflow/underflow on input conversions. + +2005-04-25 Kevin B. Kenny <kennykb@users.sourceforge.net> + + [kennykb-numerics-branch] Merged with HEAD. + + * doc/CrtMathFunc.n: Revised documentation for TIP 232 + 2005-04-25 Daniel Steffen <das@users.sourceforge.net> * compat/string.h: fixed memchr() protoype for __APPLE__ so that we @@ -230,6 +302,12 @@ if this change causes trouble, but it seems more sensible to let Tcl's "on-demand" shimmering rule, and not try to pre-guess things. +2005-04-20 Kevin B. Kenny <kennykb@acm.org> + + [kennykb-numerics-branch] + * doc/expr.n: + * doc/mathfunc.n (new file): Revised documentation for TIP 232 + 2005-04-20 Don Porter <dgp@users.sourceforge.net> * generic/tclGet.c (Tcl_GetInt): Corrected error that did not @@ -383,6 +461,15 @@ Tcl 8.5 (on which it was dependent anyway). Also added a [package require] line to formalize the relationship. +2005-04-11 Kevin Kenny <kennykb@users.sf.net> + + [kennykb-numerics-branch] Merged with HEAD. Updated to libtommath 0.35. + + * generic/tclBasic.c: Attempted to repeat changes that applied + to tclExecute.c in Miguel Sofer's commit of 2005-04-01, together + with (possibly) a few more uses of his new object creation macros. + Also plugged a memory leak in TclObjInvoke. [Bug 1180368] + 2005-04-10 Kevin Kenny <kennykb@acm.org> * library/tzdata/America/Montevideo: @@ -559,6 +646,29 @@ * unix/tcl.m4: Updated the OpenBSD configuration and regenerated * unix/configure: the configure script. +2005-03-15 Kevin B. Kenny <kennykb@acm.org> + + [kennykb-numerics-branch] Merged with HEAD. + + * generic/tclBasic.c (many): + * generic/tclCompExpr.c (CompileMathFuncCall): + * generic/tclCompile.h: + * generic/tclExecute.c (many): + * generic/tclParseExpr.c (ParsePrimaryExpr): + * tests/compExpr-old.test: + * tests/compExpr.test: + * tests/compile.test: + * tests/expr-old.test: + * tests/expr.test: + * tests/for.test: + * tests/parseExpr.test: + Initial implementation of TIP #232. + + * generic/tclObj.c (Tcl_DbNewBignumObj): Fixed typo that broke + --enable-symbols=mem build + * tests/binary.test (binary-40.3, binary-40.6): Corrected tests + to allow NaN(7ffffffffffff). + 2005-03-14 Miguel Sofer <msofer@users.sf.net> * generic/tclExecute.c: fixed INST_PUSH1's debugging code (wrong @@ -583,6 +693,30 @@ into private. Should be used only by internal workings of execution traces. +2005-03-09 Kevin B. Kenny <kennykb@acm.org> + + [kennykb-numerics-branch] Merged from HEAD. + + * doc/PrintDbl.3: + * doc/tclVars.n: Documented new semantics for tcl_precision. + * generic/tclExecute.c (Tcl_ExecuteByteCode): Removed the check + for division-by-zero on IEEE-754 machines. + * generic/tclUtil.c (Tcl_PrintDouble): Corrected bug where numbers + in the range [1e-4 .. 1.) were printed incorrectly. + * tests/compExpr-old.test (compExpr-old-11.13): Revised test + case for division by zero + * tests/expr-old.test (expr-34.11, expr-34.12): Revised test + cases for overflow in pow() to deal with infinities. + * tests/expr.test (expr-11.13, expr-29.1, expr-29.2): Revised + test case for division by zero and for underflow on input + conversions. + * tests/parseExpr.test (parseExpr-16.11): Revised test case for + overflow on input conversion. + * tests/string.test (string-6.38 deleted): Removed test case + for underflow on input conversion, which is no longer an error. + * tests/util.test (util-10.*): Added test case for the bug in + tclUtil.c. + 2005-03-08 Jeff Hobbs <jeffh@ActiveState.com> * win/makefile.vc: clarify necessary defined vars that can come @@ -598,6 +732,82 @@ fixed the peephole opt in INST_POP so that it is not used when TCL_COMPILE_DEBUG is defined. +2005-03-04 Kevin B. Kenny <kennykb@acm.org> + + [kennykb-numerics-branch] + + * generic/tclCmdMZ.c: Changed [scan] to treat out-of-range + floating point values as infinities and zeroes. + * generic/tclExecute.c: Changed [expr] to be permissive about + infinities, allowing them to propagate. + * generic/tclGet.c: Changed Tcl_GetDouble to be permissive about + over/underflow. + * generic/tclObj.c: Changed SetDoubleFromAny to be permissive + about over/underflow. + * generic/tclParseExpr.c: Made [expr] permissive about input + numbers out of range. + +2005-03-03 Kevin B. Kenny <kennykb@acm.org> + + [kennykb-numerics-branch] + + * generic/tclInt.h: + * generic/tclStrToD.c (Tcl_DoubleDigits, TclFormatNaN): + * generic/tclUtil.c (Tcl_PrintDouble): + Changed the signature of TclDoubleDigits so that it + accepts a pointer to the signum of the argument, and + returns the signum via that pointer. Added very + hacky code to handle IEEE signed zeroes in Tcl_DoubleDigits. + (It can't be done other than as a hack until C9x; + C89 simply doesn't deal with the concept of -0.0). + Added output conversion of tagged NaN values. + * generic/tclBinary.c (FormatNumber): + Changed to allow [binary format] to handle NaN. + * tests/binary.test (binary-60.1): + Added a quick-n-dirty test to make sure that NaN's + can be scanned and formatted. + * generic/tclParseExpr.c (GetLexeme, ParseMaxDoubleLength): + Modified so that tagged NaN (e.g., NaN(DEADBEEF)) can + be recognized. + +2005-03-02 Kevin B. Kenny <kennykb@acm.org> + + [kennykb-numerics-branch] Merged with HEAD as of 2005-02-23. + + * generic/tclExecute.c: + Broadened test for NaN to work on Windows. + * generic/tclInt.h: + * generic/tclStrToD.c (Tcl_DoubleDigits): + * generic/tclUtil.c (Tcl_PrintDouble, TclPrecTraceProc): + Added Tcl_DoubleDigits to format 'double' numbers + with the minimum number of significant digits to + yield correct rounding. Modified tcl_precision to + accept 0 as a precision (meaning "minimum digits"), and + made 0 the default. [TIP #132] + * generic/tclObj.c: + Made NaN's throw an error in Tcl_GetDoubleFromObj. + * unix/Makefile.in: + * win/Makefile.in: + * win/makefile.vc: + Added libtommath/bn_mp_init_set.c to the build. + * libtommath/tommath.h (mp_iseven): + Fixed a bug that caused zero to test 'odd'. + * generic/tommath.h: + Regenerated. + * tests/binary.test: + * tests/expr-old.test: + * tests/expr.test: + * tests/scan.test: + Corrected a number of tests that depended on + tcl_precision, and removed the {eformat} condition + from tests that no longer require it. + * tests/util.test: + Corrected a number of tests that depended on + tcl_precision, and removed the {eformat} condition + from tests that no longer require it. Added a series + of tests for correct rounding in Tcl_PrintDouble. [TIP + #132]. + 2005-03-01 David N. Welton <davidw@dedasys.com> * doc/CrtSlave.3: Changed to Tcl_Object to Tcl_Obj in the man @@ -659,6 +869,17 @@ * doc/CrtChannel.3: Typo: return->returns. +2005-02-06 Kevin B. Kenny <kennykb@acm.org> + + [kennykb-numerics-branch] + + * generic/tclStrToD.c (TclStrToD, SafeLdExp): + Added code to manage the FPU precision on gcc+x86. + Enabled fast conversion of floats with small exponents + now that precision is correct. + * tests/expr.test: Corrected test for the smallest representible + value to the right IEEE values. + 2005-02-06 David N. Welton <davidw@dedasys.com> * doc/Thread.3: One-word grammar fix. @@ -673,6 +894,18 @@ * generic/tclPathObj.c: Cleaned up typo in comment. +2005-02-03 Kevin B. Kenny <kennykb@acm.org> + + [kennykb-numerics-branch] + + * generic/tclStrToD.c (TclStrToD, RefineResult, SafeLdExp): + Added code to ensure that 'ldexp' is never called with + a value that will underflow. + * tests/expr.test: Added tests for the smallest representible + value, and rounding between it and zero. (The tests reflect + current behaviour; plan is to change the specification of + Tcl so that input conversion of doubles underflows silently.) + 2005-02-02 Mo DeJong <mdejong@users.sourceforge.net> * generic/tclProc.c (TclInitCompiledLocals): @@ -684,6 +917,35 @@ down a crash in Itcl, that crash is fixed by Itcl patch 1115085. +2005-02-01 Kevin B. Kenny <kennykb@acm.org> + + [kennykb-numerics-branch] Merged with HEAD as of today. + + * generic/tclInt.decls: + Changed numbers of new stubs to resolve a conflict. + * generic/tclInt.h: + Added new TclStrToD routine that replaces the native + 'strtod' thro + ughout Tcl. + * generic/tclCmdMZ (Tcl_StringObjCmd): + * generic/tclGet.c (Tcl_GetDouble): + * generic/tclObj.c (SetBooleanFromAny, SetDoubleFromAny): + * generic/tclParseExpr.c (GetLexeme): + * generic/tclScan.c (Tcl_ScanObjCmd): + Replaced all uses of the native 'strtod' with a TclStrToD + routine that performs correct rounding and handles denormals. + * generic/tclStrToD.c: (new file) + New scanning function for extracting 'double' from a string + that rounds correctly, and handles denormals and infinities. + * unix/Makefile.in: + * win/Makefile.in: + * win/makefile.vc: + Added tclStrToD.c and the tommath routines that support it. + + These changes represent a partial implementation of TIP #132. + Output conversion of floating point numbers, and proper handling + of infinities within expressions, still need to be addressed. + 2005-02-01 Don Porter <dgp@users.sourceforge.net> * generic/tclExecute.c (TclCompEvalObj): Removed stray statement @@ -780,6 +1042,87 @@ * doc/FileSystem.3: Add missing ARGUMENTS section definitions for arguments to Tcl_FSLink. [Bug 1106272] +2005-01-21 Kevin B. Kenny <kennykb@acm.org> + + [kennykb-numerics-branch] + + * unix/Makefile.in: Updated Makefile to build libtommath on + Unix as well as Windows. [Bug 1106865] + + * generic/tclTestObj.c (TestbignumobjCmd): + Silenced a compiler warning about a mismatched 'const'. + +2005-01-20 Kevin B. Kenny <kennykb@acm.org> + + [kennykb-numerics-branch] Development checkpoint. + + * compat/strtoll.c: Reverted to HEAD. + * compat/strtoull.c: + * doc/Ensemble.3: + * generic/tclBasic.c: + * generic/tclCmdIL.c: + * generic/tclNamesp.c: + * generic/tclPathObj.c: + * generic/tclPort.h: + * unix/configure: + * unix/configure.in: + * unix/tcl.m4: + * win/configure: + * win/configure.in: + * win/rules.vc: + * win/tcl.m4: + + * generic/tcl.h: Added declarations for bignum types, and + for a 'bignumValue' in the Tcl_Obj structure. + * generic/tclInt.h: Added declarations of interface procedures + for memory allocation in libtommath. + + * generic/tcl.decls: Added new interface to bignum objects. + * generic/tclInt.decls: Added internal stubs for bignum routines + used by the test code in tclTestObj.c. + + * generic/tclDecls/h: Regen. + * generic/tclIntDecls.h: + * generic/tclStubInit.h: + + * tools/fix_tommath_h.tcl: (New file) Script to edit + libtommath/tommath.h and produce + generic/tommath.h so that storage + classes, allocation routines, and + data types conform to Tcl's + conventions. + * generic/tommath.h: (New file) Generated by the above. + + * generic/tclTomMath.h: (New file) Additional declarations + to be included in tommath.h when building + Tcl. + + * generic/tclTomMathInterface.c: (New file) Small 'glue' routines + adapting tommath's API to Tcl. + + * libtommath/bn_fast_s_mp_mul_digs.c: + * libtommath/bn_mp_mul_d.c: + * libtommath/bn_mp_read_radix.c: + * libtommath/tommath.h: Applied suggested changes from Tom St + Denis that correct an off-by-one error in single-digit + multiplication (leading to a pointer smash if uncorrected) and + change the string argument to 'mp_read_radix' from 'char*' to + 'const char*'. + + * libtommath/bn_mp_radix_size.c: + Local patch to ensure that sufficient memory is requested + even if the number has a single digit. + + * libtommath/bn_mp_read_radix.c: + Local patch to return MP_VAL if the input string contains + an invalid character. + + * generic/tclObj.c: Added accessor functions for bignums. + * generic/tclTestObj.c: Added a 'testbignumobj' command to + exercise the accessor functions for bignums. + + * win/Makefile.in: Added rules for making libtommath. + 2005-01-19 Donal K. Fellows <donal.k.fellows@man.ac.uk> TIP#235 IMPLEMENTATION @@ -5,7 +5,7 @@ README: Tcl You can get any source release of Tcl from the file distributions link at the above URL. -RCS: @(#) $Id: README,v 1.54 2004/12/10 23:00:30 dkf Exp $ +RCS: @(#) $Id: README,v 1.55 2005/05/10 18:33:52 kennykb Exp $ Contents -------- @@ -1,6 +1,6 @@ Recent user-visible changes to Tcl: -RCS: @(#) $Id: changes,v 1.94 2004/12/06 22:41:10 dgp Exp $ +RCS: @(#) $Id: changes,v 1.95 2005/05/10 18:33:53 kennykb Exp $ 1. No more [command1] [command2] construct for grouping multiple commands on a single command line. diff --git a/compat/string.h b/compat/string.h index 78f58bc..128b458 100644 --- a/compat/string.h +++ b/compat/string.h @@ -9,7 +9,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: string.h,v 1.6 2005/04/26 00:45:01 das Exp $ + * RCS: @(#) $Id: string.h,v 1.7 2005/05/10 18:33:53 kennykb Exp $ */ #ifndef _STRING diff --git a/compat/strstr.c b/compat/strstr.c index 151e3f3..015d61b 100644 --- a/compat/strstr.c +++ b/compat/strstr.c @@ -9,7 +9,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: strstr.c,v 1.5 2005/04/12 18:32:41 kennykb Exp $ + * RCS: @(#) $Id: strstr.c,v 1.6 2005/05/10 18:33:54 kennykb Exp $ */ #include "tcl.h" diff --git a/compat/strtoll.c b/compat/strtoll.c index 7d10eb4..50edd41 100644 --- a/compat/strtoll.c +++ b/compat/strtoll.c @@ -9,7 +9,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: strtoll.c,v 1.7 2004/04/06 22:25:48 dgp Exp $ + * RCS: @(#) $Id: strtoll.c,v 1.8 2005/05/10 18:33:54 kennykb Exp $ */ #include "tclInt.h" diff --git a/compat/strtoull.c b/compat/strtoull.c index f46e78f..027c593 100644 --- a/compat/strtoull.c +++ b/compat/strtoull.c @@ -9,7 +9,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: strtoull.c,v 1.7 2004/04/06 22:25:48 dgp Exp $ + * RCS: @(#) $Id: strtoull.c,v 1.8 2005/05/10 18:33:54 kennykb Exp $ */ #include "tclInt.h" diff --git a/doc/Async.3 b/doc/Async.3 index 46ab9eb..4be3aa6 100644 --- a/doc/Async.3 +++ b/doc/Async.3 @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: Async.3,v 1.8 2004/12/09 09:19:50 dkf Exp $ +'\" RCS: @(#) $Id: Async.3,v 1.9 2005/05/10 18:33:54 kennykb Exp $ '\" .so man.macros .TH Tcl_AsyncCreate 3 7.0 Tcl "Tcl Library Procedures" diff --git a/doc/Backslash.3 b/doc/Backslash.3 index 0b1fa21..57b73e9 100644 --- a/doc/Backslash.3 +++ b/doc/Backslash.3 @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: Backslash.3,v 1.6 2005/04/06 20:55:19 dkf Exp $ +'\" RCS: @(#) $Id: Backslash.3,v 1.7 2005/05/10 18:33:54 kennykb Exp $ '\" .so man.macros .TH Tcl_Backslash 3 "8.1" Tcl "Tcl Library Procedures" diff --git a/doc/BoolObj.3 b/doc/BoolObj.3 index f586621..ec6a3c9 100644 --- a/doc/BoolObj.3 +++ b/doc/BoolObj.3 @@ -4,7 +4,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: BoolObj.3,v 1.6 2005/04/22 15:46:51 dgp Exp $ +'\" RCS: @(#) $Id: BoolObj.3,v 1.7 2005/05/10 18:33:54 kennykb Exp $ '\" .so man.macros .TH Tcl_BooleanObj 3 8.0 Tcl "Tcl Library Procedures" diff --git a/doc/Concat.3 b/doc/Concat.3 index ebf59de..d4ba689 100644 --- a/doc/Concat.3 +++ b/doc/Concat.3 @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: Concat.3,v 1.8 2005/04/06 20:55:20 dkf Exp $ +'\" RCS: @(#) $Id: Concat.3,v 1.9 2005/05/10 18:33:54 kennykb Exp $ '\" .so man.macros .TH Tcl_Concat 3 7.5 Tcl "Tcl Library Procedures" diff --git a/doc/CrtChannel.3 b/doc/CrtChannel.3 index 1f9f5f1..d4f3a20 100644 --- a/doc/CrtChannel.3 +++ b/doc/CrtChannel.3 @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: CrtChannel.3,v 1.28 2005/04/06 20:55:20 dkf Exp $ +'\" RCS: @(#) $Id: CrtChannel.3,v 1.29 2005/05/10 18:33:54 kennykb Exp $ .so man.macros .TH Tcl_CreateChannel 3 8.4 Tcl "Tcl Library Procedures" .BS diff --git a/doc/CrtCommand.3 b/doc/CrtCommand.3 index fd67638..c4e042a 100644 --- a/doc/CrtCommand.3 +++ b/doc/CrtCommand.3 @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: CrtCommand.3,v 1.11 2005/04/06 20:55:20 dkf Exp $ +'\" RCS: @(#) $Id: CrtCommand.3,v 1.12 2005/05/10 18:33:54 kennykb Exp $ '\" .so man.macros .TH Tcl_CreateCommand 3 "" Tcl "Tcl Library Procedures" diff --git a/doc/CrtFileHdlr.3 b/doc/CrtFileHdlr.3 index 042fb5f..9f504e6 100644 --- a/doc/CrtFileHdlr.3 +++ b/doc/CrtFileHdlr.3 @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: CrtFileHdlr.3,v 1.4 2005/04/06 20:55:20 dkf Exp $ +'\" RCS: @(#) $Id: CrtFileHdlr.3,v 1.5 2005/05/10 18:33:54 kennykb Exp $ '\" .so man.macros .TH Tcl_CreateFileHandler 3 8.0 Tcl "Tcl Library Procedures" diff --git a/doc/CrtMathFnc.3 b/doc/CrtMathFnc.3 index 1337ea8..db5a27e 100644 --- a/doc/CrtMathFnc.3 +++ b/doc/CrtMathFnc.3 @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: CrtMathFnc.3,v 1.12 2005/04/06 20:55:20 dkf Exp $ +'\" RCS: @(#) $Id: CrtMathFnc.3,v 1.13 2005/05/10 18:33:54 kennykb Exp $ '\" .so man.macros .TH Tcl_CreateMathFunc 3 8.4 Tcl "Tcl Library Procedures" @@ -64,11 +64,19 @@ passing to \fITcl_StringMatch\fR), or NULL to not apply any filter. .PP Tcl allows a number of mathematical functions to be used in expressions, such as \fBsin\fR, \fBcos\fR, and \fBhypot\fR. -\fBTcl_CreateMathFunc\fR allows applications to add additional functions +These functions are represented by commands in the namespace, +\fBtcl::mathfunc\fR. The \fBTcl_CreateMathFunc\fR function is +an obsolete way for applications to add additional functions to those already provided by Tcl or to replace existing functions. +It should not be used by new applications, which should create +math functions using \fBTcl_CreateObjCommand\fR to create a command +in the \fBtcl::mathfunc\fR namespace. +.PP +In the \fBTcl_CreateMathFunc\fR interface, \fIName\fR is the name of the function as it will appear in expressions. -If \fIname\fR doesn't already exist as a function then a new function -is created. If it does exist, then the existing function is replaced. +If \fIname\fR doesn't already exist in the \fB::tcl::mathfunc\fR +namespace, then a new command is created in that namespace. +If \fIname\fR does exist, then the existing function is replaced. \fINumArgs\fR and \fIargTypes\fR describe the arguments to the function. Each entry in the \fIargTypes\fR array must be one of \fBTCL_INT\fR, \fBTCL_DOUBLE\fR, \fBTCL_WIDE_INT\fR, @@ -130,10 +138,14 @@ result. If an error did not occur, the array reference placed in the variable pointed to by \fIargTypesPtr\fR is newly allocated, and should be released by passing it to \fBTcl_Free\fR. Some functions (the -standard set implemented in the core) are implemented directly at the -bytecode level; attempting to retrieve values for them causes a NULL -to be stored in the variable pointed to by \fIprocPtr\fR and the -variable pointed to by \fIclientDataPtr\fR will not be modified. +standard set implemented in the core, and those defined by placing +commands in the \fBtcl::mathfunc\fR namespace) do not have +argument type information; attempting to retrieve values for +them causes a NULL to be stored in the variable pointed to by +\fIprocPtr\fR and the variable pointed to by \fIclientDataPtr\fR +will not be modified. The variable pointed to by \fInumArgsPointer\fR +will contain -1, and no argument types will be stored in the variable +pointed to by \fIargTypesPointer\fR. .PP \fBTcl_ListMathFuncs\fR returns a Tcl object containing a list of all the math functions defined in the interpreter whose name matches @@ -145,4 +157,4 @@ object will have a reference count of zero. expression, mathematical function .SH "SEE ALSO" -expr(n), info(n), Tcl_Free(3), Tcl_NewListObj(3) +expr(n), info(n), Tcl_CreateObjCommand(3), Tcl_Free(3), Tcl_NewListObj(3) diff --git a/doc/CrtObjCmd.3 b/doc/CrtObjCmd.3 index 14ba0a5..490ca94 100644 --- a/doc/CrtObjCmd.3 +++ b/doc/CrtObjCmd.3 @@ -4,7 +4,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: CrtObjCmd.3,v 1.12 2005/04/06 20:55:21 dkf Exp $ +'\" RCS: @(#) $Id: CrtObjCmd.3,v 1.13 2005/05/10 18:33:54 kennykb Exp $ '\" .so man.macros .TH Tcl_CreateObjCommand 3 8.0 Tcl "Tcl Library Procedures" diff --git a/doc/CrtSlave.3 b/doc/CrtSlave.3 index b201a7a..1ee41b0 100644 --- a/doc/CrtSlave.3 +++ b/doc/CrtSlave.3 @@ -4,7 +4,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: CrtSlave.3,v 1.15 2005/03/01 22:51:55 davidw Exp $ +'\" RCS: @(#) $Id: CrtSlave.3,v 1.16 2005/05/10 18:33:54 kennykb Exp $ '\" .so man.macros .TH Tcl_CreateSlave 3 7.6 Tcl "Tcl Library Procedures" diff --git a/doc/DString.3 b/doc/DString.3 index 5caa3ee..8c44bb2 100644 --- a/doc/DString.3 +++ b/doc/DString.3 @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: DString.3,v 1.12 2005/05/03 18:07:41 dgp Exp $ +'\" RCS: @(#) $Id: DString.3,v 1.13 2005/05/10 18:33:54 kennykb Exp $ '\" .so man.macros .TH Tcl_DString 3 7.4 Tcl "Tcl Library Procedures" diff --git a/doc/Ensemble.3 b/doc/Ensemble.3 index fad3851..b98c36c 100644 --- a/doc/Ensemble.3 +++ b/doc/Ensemble.3 @@ -4,7 +4,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: Ensemble.3,v 1.1 2005/01/19 23:15:26 dkf Exp $ +'\" RCS: @(#) $Id: Ensemble.3,v 1.2 2005/05/10 18:33:55 kennykb Exp $ '\" '\" This documents the C API introduced in TIP#235 '\" diff --git a/doc/Environment.3 b/doc/Environment.3 index e11f32d..16efd84 100644 --- a/doc/Environment.3 +++ b/doc/Environment.3 @@ -4,7 +4,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: Environment.3,v 1.5 2005/05/03 18:07:42 dgp Exp $ +'\" RCS: @(#) $Id: Environment.3,v 1.6 2005/05/10 18:33:55 kennykb Exp $ '\" .so man.macros .TH Tcl_PutEnv 3 "7.5" Tcl "Tcl Library Procedures" @@ -6,7 +6,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: Eval.3,v 1.20 2005/05/03 18:07:42 dgp Exp $ +'\" RCS: @(#) $Id: Eval.3,v 1.21 2005/05/10 18:33:55 kennykb Exp $ '\" .so man.macros .TH Tcl_Eval 3 8.1 Tcl "Tcl Library Procedures" diff --git a/doc/ExprLong.3 b/doc/ExprLong.3 index 9199dd7..0600330 100644 --- a/doc/ExprLong.3 +++ b/doc/ExprLong.3 @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: ExprLong.3,v 1.10 2005/05/03 18:07:42 dgp Exp $ +'\" RCS: @(#) $Id: ExprLong.3,v 1.11 2005/05/10 18:33:55 kennykb Exp $ '\" .so man.macros .TH Tcl_ExprLong 3 7.0 Tcl "Tcl Library Procedures" diff --git a/doc/ExprLongObj.3 b/doc/ExprLongObj.3 index b7a2caa..82aabe7 100644 --- a/doc/ExprLongObj.3 +++ b/doc/ExprLongObj.3 @@ -4,7 +4,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: ExprLongObj.3,v 1.4 2005/05/03 18:07:42 dgp Exp $ +'\" RCS: @(#) $Id: ExprLongObj.3,v 1.5 2005/05/10 18:33:55 kennykb Exp $ '\" .so man.macros .TH Tcl_ExprLongObj 3 8.0 Tcl "Tcl Library Procedures" diff --git a/doc/FileSystem.3 b/doc/FileSystem.3 index 8456331..cdac36e 100644 --- a/doc/FileSystem.3 +++ b/doc/FileSystem.3 @@ -4,7 +4,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: FileSystem.3,v 1.53 2005/03/30 13:25:54 dkf Exp $ +'\" RCS: @(#) $Id: FileSystem.3,v 1.54 2005/05/10 18:33:55 kennykb Exp $ '\" .so man.macros .TH Filesystem 3 8.4 Tcl "Tcl Library Procedures" diff --git a/doc/GetIndex.3 b/doc/GetIndex.3 index 7428549..f476ea5 100644 --- a/doc/GetIndex.3 +++ b/doc/GetIndex.3 @@ -4,7 +4,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: GetIndex.3,v 1.17 2005/04/06 20:55:21 dkf Exp $ +'\" RCS: @(#) $Id: GetIndex.3,v 1.18 2005/05/10 18:33:56 kennykb Exp $ '\" .so man.macros .TH Tcl_GetIndexFromObj 3 8.1 Tcl "Tcl Library Procedures" diff --git a/doc/GetInt.3 b/doc/GetInt.3 index e33eac6..83cd2d6 100644 --- a/doc/GetInt.3 +++ b/doc/GetInt.3 @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: GetInt.3,v 1.9 2005/05/03 18:07:42 dgp Exp $ +'\" RCS: @(#) $Id: GetInt.3,v 1.10 2005/05/10 18:33:56 kennykb Exp $ '\" .so man.macros .TH Tcl_GetInt 3 "" Tcl "Tcl Library Procedures" diff --git a/doc/GetOpnFl.3 b/doc/GetOpnFl.3 index 5982460..7524aeb 100644 --- a/doc/GetOpnFl.3 +++ b/doc/GetOpnFl.3 @@ -4,7 +4,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: GetOpnFl.3,v 1.10 2005/05/03 18:07:42 dgp Exp $ +'\" RCS: @(#) $Id: GetOpnFl.3,v 1.11 2005/05/10 18:33:56 kennykb Exp $ .so man.macros .TH Tcl_GetOpenFile 3 8.0 Tcl "Tcl Library Procedures" .BS diff --git a/doc/IntObj.3 b/doc/IntObj.3 index 966a8ed..3bdac48 100644 --- a/doc/IntObj.3 +++ b/doc/IntObj.3 @@ -4,7 +4,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: IntObj.3,v 1.7 2005/04/06 20:55:21 dkf Exp $ +'\" RCS: @(#) $Id: IntObj.3,v 1.8 2005/05/10 18:33:56 kennykb Exp $ '\" .so man.macros .TH Tcl_IntObj 3 8.0 Tcl "Tcl Library Procedures" diff --git a/doc/Interp.3 b/doc/Interp.3 index 108c654..c61ae40 100644 --- a/doc/Interp.3 +++ b/doc/Interp.3 @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: Interp.3,v 1.8 2005/04/06 20:55:21 dkf Exp $ +'\" RCS: @(#) $Id: Interp.3,v 1.9 2005/05/10 18:33:56 kennykb Exp $ '\" .so man.macros .TH Tcl_Interp 3 7.5 Tcl "Tcl Library Procedures" diff --git a/doc/LinkVar.3 b/doc/LinkVar.3 index c1ee6ab..5d8a2e3 100644 --- a/doc/LinkVar.3 +++ b/doc/LinkVar.3 @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: LinkVar.3,v 1.10 2005/04/06 20:55:21 dkf Exp $ +'\" RCS: @(#) $Id: LinkVar.3,v 1.11 2005/05/10 18:33:56 kennykb Exp $ '\" .so man.macros .TH Tcl_LinkVar 3 7.5 Tcl "Tcl Library Procedures" diff --git a/doc/ListObj.3 b/doc/ListObj.3 index 8ec698f..a17ab66 100644 --- a/doc/ListObj.3 +++ b/doc/ListObj.3 @@ -4,7 +4,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: ListObj.3,v 1.9 2005/04/02 02:08:29 msofer Exp $ +'\" RCS: @(#) $Id: ListObj.3,v 1.10 2005/05/10 18:33:56 kennykb Exp $ '\" .so man.macros .TH Tcl_ListObj 3 8.0 Tcl "Tcl Library Procedures" diff --git a/doc/Notifier.3 b/doc/Notifier.3 index c57a189..7776610 100644 --- a/doc/Notifier.3 +++ b/doc/Notifier.3 @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: Notifier.3,v 1.14 2005/04/06 20:55:21 dkf Exp $ +'\" RCS: @(#) $Id: Notifier.3,v 1.15 2005/05/10 18:33:56 kennykb Exp $ '\" .so man.macros .TH Notifier 3 8.1 Tcl "Tcl Library Procedures" diff --git a/doc/Object.3 b/doc/Object.3 index bfcc5c0..8f8c9ef 100644 --- a/doc/Object.3 +++ b/doc/Object.3 @@ -4,7 +4,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: Object.3,v 1.11 2005/04/06 20:55:21 dkf Exp $ +'\" RCS: @(#) $Id: Object.3,v 1.12 2005/05/10 18:33:56 kennykb Exp $ '\" .so man.macros .TH Tcl_Obj 3 8.1 Tcl "Tcl Library Procedures" diff --git a/doc/OpenFileChnl.3 b/doc/OpenFileChnl.3 index 9f0f8d8..73494ce 100644 --- a/doc/OpenFileChnl.3 +++ b/doc/OpenFileChnl.3 @@ -4,7 +4,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: OpenFileChnl.3,v 1.30 2005/04/06 20:55:21 dkf Exp $ +'\" RCS: @(#) $Id: OpenFileChnl.3,v 1.31 2005/05/10 18:33:56 kennykb Exp $ .so man.macros .TH Tcl_OpenFileChannel 3 8.3 Tcl "Tcl Library Procedures" .BS diff --git a/doc/OpenTcp.3 b/doc/OpenTcp.3 index a3aa360..f5b733d 100644 --- a/doc/OpenTcp.3 +++ b/doc/OpenTcp.3 @@ -4,7 +4,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: OpenTcp.3,v 1.9 2005/04/06 20:55:21 dkf Exp $ +'\" RCS: @(#) $Id: OpenTcp.3,v 1.10 2005/05/10 18:33:57 kennykb Exp $ .so man.macros .TH Tcl_OpenTcpClient 3 8.0 Tcl "Tcl Library Procedures" .BS diff --git a/doc/ParseCmd.3 b/doc/ParseCmd.3 index 9265cae..783ffb1 100644 --- a/doc/ParseCmd.3 +++ b/doc/ParseCmd.3 @@ -4,7 +4,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: ParseCmd.3,v 1.20 2005/05/03 18:07:43 dgp Exp $ +'\" RCS: @(#) $Id: ParseCmd.3,v 1.21 2005/05/10 18:33:57 kennykb Exp $ '\" .so man.macros .TH Tcl_ParseCommand 3 8.3 Tcl "Tcl Library Procedures" diff --git a/doc/PrintDbl.3 b/doc/PrintDbl.3 index 9261451..4588126 100644 --- a/doc/PrintDbl.3 +++ b/doc/PrintDbl.3 @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: PrintDbl.3,v 1.6 2005/04/06 20:55:22 dkf Exp $ +'\" RCS: @(#) $Id: PrintDbl.3,v 1.7 2005/05/10 18:33:57 kennykb Exp $ '\" .so man.macros .TH Tcl_PrintDouble 3 8.0 Tcl "Tcl Library Procedures" @@ -40,6 +40,15 @@ special twist: the string is guaranteed to contain either a ``.'' or an ``e'' so that it doesn't look like an integer. Where \fB%g\fR would generate an integer with no decimal point, \fBTcl_PrintDouble\fR adds ``.0''. +.VS 8.5 +.PP +If the \fBtcl_precision\fR value is non-zero, the result will have +precisely that many digits of significance. If the value is zero +(the default), the result will have the fewest digits needed to +represent the number in such a way that \fBTcl_NewDoubleObj\fR +will generate the same number when presented with the given string. +IEEE semantics of rounding to even apply to the conversion. +.VE .SH KEYWORDS conversion, double-precision, floating-point, string diff --git a/doc/RegExp.3 b/doc/RegExp.3 index ce4c7d9..48cbd65 100644 --- a/doc/RegExp.3 +++ b/doc/RegExp.3 @@ -6,7 +6,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: RegExp.3,v 1.22 2005/05/03 18:07:43 dgp Exp $ +'\" RCS: @(#) $Id: RegExp.3,v 1.23 2005/05/10 18:33:57 kennykb Exp $ '\" .so man.macros .TH Tcl_RegExpMatch 3 8.1 Tcl "Tcl Library Procedures" diff --git a/doc/SaveResult.3 b/doc/SaveResult.3 index c397152..a8af63e 100644 --- a/doc/SaveResult.3 +++ b/doc/SaveResult.3 @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: SaveResult.3,v 1.6 2005/04/06 20:55:22 dkf Exp $ +'\" RCS: @(#) $Id: SaveResult.3,v 1.7 2005/05/10 18:33:57 kennykb Exp $ '\" .so man.macros .TH Tcl_SaveResult 3 8.1 Tcl "Tcl Library Procedures" diff --git a/doc/SetResult.3 b/doc/SetResult.3 index 70812d0..ad1261c 100644 --- a/doc/SetResult.3 +++ b/doc/SetResult.3 @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: SetResult.3,v 1.12 2005/05/03 18:07:43 dgp Exp $ +'\" RCS: @(#) $Id: SetResult.3,v 1.13 2005/05/10 18:33:57 kennykb Exp $ '\" .so man.macros .TH Tcl_SetResult 3 8.0 Tcl "Tcl Library Procedures" diff --git a/doc/StrMatch.3 b/doc/StrMatch.3 index 75fa308..e09a2d6 100644 --- a/doc/StrMatch.3 +++ b/doc/StrMatch.3 @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: StrMatch.3,v 1.8 2005/05/03 18:07:44 dgp Exp $ +'\" RCS: @(#) $Id: StrMatch.3,v 1.9 2005/05/10 18:33:57 kennykb Exp $ '\" .so man.macros .TH Tcl_StringMatch 3 8.1 Tcl "Tcl Library Procedures" diff --git a/doc/StringObj.3 b/doc/StringObj.3 index 002a1e5..c16e9cc 100644 --- a/doc/StringObj.3 +++ b/doc/StringObj.3 @@ -4,7 +4,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: StringObj.3,v 1.18 2005/04/06 20:55:22 dkf Exp $ +'\" RCS: @(#) $Id: StringObj.3,v 1.19 2005/05/10 18:33:57 kennykb Exp $ '\" .so man.macros .TH Tcl_StringObj 3 8.1 Tcl "Tcl Library Procedures" diff --git a/doc/Thread.3 b/doc/Thread.3 index de0b0e3..7a236b8 100644 --- a/doc/Thread.3 +++ b/doc/Thread.3 @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: Thread.3,v 1.23 2005/02/06 22:14:26 davidw Exp $ +'\" RCS: @(#) $Id: Thread.3,v 1.24 2005/05/10 18:33:57 kennykb Exp $ '\" .so man.macros .TH Threads 3 "8.1" Tcl "Tcl Library Procedures" diff --git a/doc/TraceVar.3 b/doc/TraceVar.3 index 19fad3b..a659f03 100644 --- a/doc/TraceVar.3 +++ b/doc/TraceVar.3 @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: TraceVar.3,v 1.14 2005/04/06 20:55:22 dkf Exp $ +'\" RCS: @(#) $Id: TraceVar.3,v 1.15 2005/05/10 18:33:57 kennykb Exp $ '\" .so man.macros .TH Tcl_TraceVar 3 7.4 Tcl "Tcl Library Procedures" @@ -4,7 +4,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: Utf.3,v 1.22 2005/05/03 18:07:44 dgp Exp $ +'\" RCS: @(#) $Id: Utf.3,v 1.23 2005/05/10 18:33:58 kennykb Exp $ '\" .so man.macros .TH Utf 3 "8.1" Tcl "Tcl Library Procedures" diff --git a/doc/array.n b/doc/array.n index c7cc26b..1a39b7b 100644 --- a/doc/array.n +++ b/doc/array.n @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: array.n,v 1.14 2005/04/06 20:55:22 dkf Exp $ +'\" RCS: @(#) $Id: array.n,v 1.15 2005/05/10 18:33:59 kennykb Exp $ '\" .so man.macros .TH array n 8.3 Tcl "Tcl Built-In Commands" diff --git a/doc/binary.n b/doc/binary.n index ab98224..f2b7155 100644 --- a/doc/binary.n +++ b/doc/binary.n @@ -4,7 +4,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: binary.n,v 1.25 2005/02/10 09:33:01 dkf Exp $ +'\" RCS: @(#) $Id: binary.n,v 1.26 2005/05/10 18:33:59 kennykb Exp $ '\" .so man.macros .TH binary n 8.0 Tcl "Tcl Built-In Commands" diff --git a/doc/close.n b/doc/close.n index 0263e47..23aae91 100644 --- a/doc/close.n +++ b/doc/close.n @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: close.n,v 1.9 2005/04/06 20:55:22 dkf Exp $ +'\" RCS: @(#) $Id: close.n,v 1.10 2005/05/10 18:33:59 kennykb Exp $ '\" .so man.macros .TH close n 7.5 Tcl "Tcl Built-In Commands" diff --git a/doc/error.n b/doc/error.n index 2a4fdba..20bdbfe 100644 --- a/doc/error.n +++ b/doc/error.n @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: error.n,v 1.8 2004/12/07 00:00:57 hobbs Exp $ +'\" RCS: @(#) $Id: error.n,v 1.9 2005/05/10 18:33:59 kennykb Exp $ '\" .so man.macros .TH error n "" Tcl "Tcl Built-In Commands" @@ -1,11 +1,12 @@ '\" '\" Copyright (c) 1993 The Regents of the University of California. '\" Copyright (c) 1994-2000 Sun Microsystems, Inc. +.\" Copyright (c) 2005 by Kevin B. Kenny <kennykb@acm.org>. All rights reserved '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: expr.n,v 1.18 2004/10/27 09:36:58 dkf Exp $ +'\" RCS: @(#) $Id: expr.n,v 1.19 2005/05/10 18:33:59 kennykb Exp $ '\" .so man.macros .TH expr n 8.5 Tcl "Tcl Built-In Commands" @@ -84,8 +85,8 @@ The command will be executed and its result will be used as the operand. .IP [7] As a mathematical function whose arguments have any of the above -forms for operands, such as \fBsin($x)\fR. See below for a list of defined -functions. +forms for operands, such as \fBsin($x)\fR. See MATH FUNCTIONS below for +a discussion of how mathematical functions are handled. .LP Where the above substitutions occur (e.g. inside quoted strings), they are performed by the expression's instructions. @@ -211,131 +212,24 @@ the Tcl parser will evaluate both \fB[a]\fR and \fB[b]\fR before invoking the \fBexpr\fR command. .SS "MATH FUNCTIONS" .PP -Tcl supports the following mathematical functions in expressions, all -of which work solely with floating-point numbers unless otherwise noted: -.DS -.ta 3c 6c 9c -\fBabs\fR \fBcosh\fR \fBlog\fR \fBsqrt\fR -\fBacos\fR \fBdouble\fR \fBlog10\fR \fBsrand\fR -\fBasin\fR \fBexp\fR \fBpow\fR \fBtan\fR -\fBatan\fR \fBfloor\fR \fBrand\fR \fBtanh\fR -\fBatan2\fR \fBfmod\fR \fBround\fR \fBwide\fR -\fBceil\fR \fBhypot\fR \fBsin\fR -\fBcos\fR \fBint\fR \fBsinh\fR -.DE -.PP -.TP -\fBabs(\fIarg\fB)\fR -Returns the absolute value of \fIarg\fR. \fIArg\fR may be either -integer or floating-point, and the result is returned in the same form. -.TP -\fBacos(\fIarg\fB)\fR -Returns the arc cosine of \fIarg\fR, in the range [\fI0\fR,\fIpi\fR] -radians. \fIArg\fR should be in the range [\fI-1\fR,\fI1\fR]. -.TP -\fBasin(\fIarg\fB)\fR -Returns the arc sine of \fIarg\fR, in the range [\fI-pi/2\fR,\fIpi/2\fR] -radians. \fIArg\fR should be in the range [\fI-1\fR,\fI1\fR]. -.TP -\fBatan(\fIarg\fB)\fR -Returns the arc tangent of \fIarg\fR, in the range [\fI-pi/2\fR,\fIpi/2\fR] -radians. -.TP -\fBatan2(\fIy, x\fB)\fR -Returns the arc tangent of \fIy\fR/\fIx\fR, in the range [\fI-pi\fR,\fIpi\fR] -radians. \fIx\fR and \fIy\fR cannot both be 0. If \fIx\fR is greater -than \fI0\fR, this is equivalent to \fBatan(\fIy/x\fB)\fR. -.TP -\fBceil(\fIarg\fB)\fR -Returns the smallest integral floating-point value (i.e. with a zero -fractional part) not less than \fIarg\fR. -.TP -\fBcos(\fIarg\fB)\fR -Returns the cosine of \fIarg\fR, measured in radians. -.TP -\fBcosh(\fIarg\fB)\fR -Returns the hyperbolic cosine of \fIarg\fR. If the result would cause -an overflow, an error is returned. -.TP -\fBdouble(\fIarg\fB)\fR -If \fIarg\fR is a floating-point value, returns \fIarg\fR, otherwise converts -\fIarg\fR to floating-point and returns the converted value. -.TP -\fBexp(\fIarg\fB)\fR -Returns the exponential of \fIarg\fR, defined as \fIe\fR**\fIarg\fR. -If the result would cause an overflow, an error is returned. -.TP -\fBfloor(\fIarg\fB)\fR -Returns the largest integral floating-point value (i.e. with a zero -fractional part) not greater than \fIarg\fR. -.TP -\fBfmod(\fIx, y\fB)\fR -Returns the floating-point remainder of the division of \fIx\fR by -\fIy\fR. If \fIy\fR is 0, an error is returned. -.TP -\fBhypot(\fIx, y\fB)\fR -Computes the length of the hypotenuse of a right-angled triangle -\fBsqrt(\fIx\fR*\fIx\fR+\fIy\fR*\fIy\fB)\fR. -.TP -\fBint(\fIarg\fB)\fR -If \fIarg\fR is an integer value of the same width as the machine -word, returns \fIarg\fR, otherwise -converts \fIarg\fR to an integer (of the same size as a machine word, -i.e. 32-bits on 32-bit systems, and 64-bits on 64-bit systems) by -truncation and returns the converted value. -.TP -\fBlog(\fIarg\fB)\fR -Returns the natural logarithm of \fIarg\fR. \fIArg\fR must be a -positive value. -.TP -\fBlog10(\fIarg\fB)\fR -Returns the base 10 logarithm of \fIarg\fR. \fIArg\fR must be a -positive value. -.TP -\fBpow(\fIx, y\fB)\fR -Computes the value of \fIx\fR raised to the power \fIy\fR. If \fIx\fR -is negative, \fIy\fR must be an integer value. -.TP -\fBrand()\fR -Returns a pseudo-random floating-point value in the range (\fI0\fR,\fI1\fR). -The generator algorithm is a simple linear congruential generator that -is not cryptographically secure. Each result from \fBrand\fR completely -determines all future results from subsequent calls to \fBrand\fR, so -\fBrand\fR should not be used to generate a sequence of secrets, such as -one-time passwords. The seed of the generator is initialized from the -internal clock of the machine or may be set with the \fBsrand\fR function. -.TP -\fBround(\fIarg\fB)\fR -If \fIarg\fR is an integer value, returns \fIarg\fR, otherwise converts -\fIarg\fR to integer by rounding and returns the converted value. -.TP -\fBsin(\fIarg\fB)\fR -Returns the sine of \fIarg\fR, measured in radians. -.TP -\fBsinh(\fIarg\fB)\fR -Returns the hyperbolic sine of \fIarg\fR. If the result would cause -an overflow, an error is returned. -.TP -\fBsqrt(\fIarg\fB)\fR -Returns the square root of \fIarg\fR. \fIArg\fR must be non-negative. -.TP -\fBsrand(\fIarg\fB)\fR -The \fIarg\fR, which must be an integer, is used to reset the seed for -the random number generator of \fBrand\fR. Returns the first random -number (see \fBrand()\fR) from that seed. Each interpreter has its own seed. -.TP -\fBtan(\fIarg\fB)\fR -Returns the tangent of \fIarg\fR, measured in radians. -.TP -\fBtanh(\fIarg\fB)\fR -Returns the hyperbolic tangent of \fIarg\fR. -.TP -\fBwide(\fIarg\fB)\fR -Converts \fIarg\fR to an integer value at least 64-bits wide (by sign-extension -if \fIarg\fR is a 32-bit number) if it is not one already. +When the expression parser encounters a mathematical function +such as \fBsin($x)\fR, it replaces it with a call to an ordinary +Tcl function in the \fBtcl::mathfunc\fR namespace. The processing +of an expression such as: +.CS +\fBexpr {sin($x+$y)}\fR +.CE +is the same in every way as the processing of: +.CS +\fBexpr {[tcl::mathfunc::sin [expr {$x+$y}]]} +.CE +The executor will search for \fBtcl::mathfunc::sin\fR using the +usual rules for resolving functions in namespaces. Either +\fB::tcl::mathfunc::sin\fR or \fB[namespace current]::tcl::mathfunc::sin\fR +will satisfy the request. .PP -In addition to these predefined functions, applications may -define additional functions using \fBTcl_CreateMathFunc\fR(). +See the \fBmathfunc(n)\fR manual page for the math functions that are +available by default. .SS "TYPES, OVERFLOW, AND PRECISION" .PP All internal computations involving integers are done with the C type @@ -430,7 +324,7 @@ each time the expression is executed. Define a procedure that computes an "interesting" mathematical function: .CS -proc calc {x y} { +proc tcl::mathfunc::calc {x y} { \fBexpr\fR { ($x**2 - $y**2) / exp($x**2 + $y**2) } } .CE @@ -470,7 +364,14 @@ set randNum [\fBexpr\fR { int(100 * rand()) }] .CE .SH "SEE ALSO" -array(n), for(n), if(n), string(n), Tcl(n), while(n) +array(n), for(n), if(n), mathfunc(n), namespace(n), proc(n), string(n), Tcl(n), while(n) .SH KEYWORDS arithmetic, boolean, compare, expression, fuzzy comparison + +.SH COPYRIGHT +Copyright (c) 1993 The Regents of the University of California. +.br +Copyright (c) 1994-2000 Sun Microsystems Incorporated. +.br +Copyright (c) 2005 by Kevin B. Kenny <kennykb@acm.org>. All rights reserved. diff --git a/doc/fblocked.n b/doc/fblocked.n index 16d9913..5b5efac 100644 --- a/doc/fblocked.n +++ b/doc/fblocked.n @@ -4,7 +4,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: fblocked.n,v 1.7 2005/04/06 20:55:22 dkf Exp $ +'\" RCS: @(#) $Id: fblocked.n,v 1.8 2005/05/10 18:33:59 kennykb Exp $ .so man.macros .TH fblocked n 7.5 Tcl "Tcl Built-In Commands" .BS diff --git a/doc/fconfigure.n b/doc/fconfigure.n index a550c0e..10e5fb1 100644 --- a/doc/fconfigure.n +++ b/doc/fconfigure.n @@ -4,7 +4,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: fconfigure.n,v 1.12 2005/04/13 10:53:44 dkf Exp $ +'\" RCS: @(#) $Id: fconfigure.n,v 1.13 2005/05/10 18:33:59 kennykb Exp $ '\" .so man.macros .TH fconfigure n 8.3 Tcl "Tcl Built-In Commands" diff --git a/doc/fcopy.n b/doc/fcopy.n index a97950b..de74d3c 100644 --- a/doc/fcopy.n +++ b/doc/fcopy.n @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: fcopy.n,v 1.5 2005/04/13 11:06:27 dkf Exp $ +'\" RCS: @(#) $Id: fcopy.n,v 1.6 2005/05/10 18:33:59 kennykb Exp $ '\" .so man.macros .TH fcopy n 8.0 Tcl "Tcl Built-In Commands" @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: file.n,v 1.39 2005/04/06 20:55:22 dkf Exp $ +'\" RCS: @(#) $Id: file.n,v 1.40 2005/05/10 18:33:59 kennykb Exp $ '\" .so man.macros .TH file n 8.3 Tcl "Tcl Built-In Commands" diff --git a/doc/fileevent.n b/doc/fileevent.n index 4245219..62ce6b4 100644 --- a/doc/fileevent.n +++ b/doc/fileevent.n @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: fileevent.n,v 1.8 2005/04/06 20:55:22 dkf Exp $ +'\" RCS: @(#) $Id: fileevent.n,v 1.9 2005/05/10 18:34:00 kennykb Exp $ '\" .so man.macros .TH fileevent n 7.5 Tcl "Tcl Built-In Commands" diff --git a/doc/flush.n b/doc/flush.n index e72db21..8ee4870 100644 --- a/doc/flush.n +++ b/doc/flush.n @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: flush.n,v 1.7 2005/04/06 20:55:22 dkf Exp $ +'\" RCS: @(#) $Id: flush.n,v 1.8 2005/05/10 18:34:00 kennykb Exp $ '\" .so man.macros .TH flush n 7.5 Tcl "Tcl Built-In Commands" diff --git a/doc/foreach.n b/doc/foreach.n index 62a46d1..3398b17 100644 --- a/doc/foreach.n +++ b/doc/foreach.n @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: foreach.n,v 1.6 2004/12/07 20:47:16 dkf Exp $ +'\" RCS: @(#) $Id: foreach.n,v 1.7 2005/05/10 18:34:00 kennykb Exp $ '\" .so man.macros .TH foreach n "" Tcl "Tcl Built-In Commands" diff --git a/doc/format.n b/doc/format.n index 4bdb5c6..846e832 100644 --- a/doc/format.n +++ b/doc/format.n @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: format.n,v 1.11 2005/04/06 20:55:22 dkf Exp $ +'\" RCS: @(#) $Id: format.n,v 1.12 2005/05/10 18:34:00 kennykb Exp $ '\" .so man.macros .TH format n 8.1 Tcl "Tcl Built-In Commands" @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: gets.n,v 1.7 2005/04/06 20:55:22 dkf Exp $ +'\" RCS: @(#) $Id: gets.n,v 1.8 2005/05/10 18:34:00 kennykb Exp $ '\" .so man.macros .TH gets n 7.5 Tcl "Tcl Built-In Commands" @@ -7,7 +7,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: info.n,v 1.15 2005/04/06 20:55:22 dkf Exp $ +'\" RCS: @(#) $Id: info.n,v 1.16 2005/05/10 18:34:00 kennykb Exp $ '\" .so man.macros .TH info n 8.4 Tcl "Tcl Built-In Commands" diff --git a/doc/interp.n b/doc/interp.n index 7f69948..c426bfc 100644 --- a/doc/interp.n +++ b/doc/interp.n @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: interp.n,v 1.23 2005/04/06 20:55:23 dkf Exp $ +'\" RCS: @(#) $Id: interp.n,v 1.24 2005/05/10 18:34:00 kennykb Exp $ '\" .so man.macros .TH interp n 7.6 Tcl "Tcl Built-In Commands" diff --git a/doc/lappend.n b/doc/lappend.n index 4a5da12..38c52e5 100644 --- a/doc/lappend.n +++ b/doc/lappend.n @@ -6,7 +6,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: lappend.n,v 1.10 2005/04/06 20:55:23 dkf Exp $ +'\" RCS: @(#) $Id: lappend.n,v 1.11 2005/05/10 18:34:00 kennykb Exp $ '\" .so man.macros .TH lappend n "" Tcl "Tcl Built-In Commands" diff --git a/doc/lindex.n b/doc/lindex.n index d3b85b2..10981c1 100644 --- a/doc/lindex.n +++ b/doc/lindex.n @@ -6,7 +6,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: lindex.n,v 1.10 2005/04/29 20:49:43 dgp Exp $ +'\" RCS: @(#) $Id: lindex.n,v 1.11 2005/05/10 18:34:00 kennykb Exp $ '\" .so man.macros .TH lindex n 8.4 Tcl "Tcl Built-In Commands" diff --git a/doc/linsert.n b/doc/linsert.n index d563650..d6384d2 100644 --- a/doc/linsert.n +++ b/doc/linsert.n @@ -6,7 +6,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: linsert.n,v 1.12 2005/04/29 20:49:43 dgp Exp $ +'\" RCS: @(#) $Id: linsert.n,v 1.13 2005/05/10 18:34:00 kennykb Exp $ '\" .so man.macros .TH linsert n 8.2 Tcl "Tcl Built-In Commands" diff --git a/doc/llength.n b/doc/llength.n index d485073..201d50e 100644 --- a/doc/llength.n +++ b/doc/llength.n @@ -6,7 +6,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: llength.n,v 1.9 2005/04/06 20:55:23 dkf Exp $ +'\" RCS: @(#) $Id: llength.n,v 1.10 2005/05/10 18:34:00 kennykb Exp $ '\" .so man.macros .TH llength n "" Tcl "Tcl Built-In Commands" @@ -4,7 +4,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: load.n,v 1.13 2005/04/06 20:55:23 dkf Exp $ +'\" RCS: @(#) $Id: load.n,v 1.14 2005/05/10 18:34:00 kennykb Exp $ '\" .so man.macros .TH load n 7.5 Tcl "Tcl Built-In Commands" diff --git a/doc/lrange.n b/doc/lrange.n index 974947a..cb01071 100644 --- a/doc/lrange.n +++ b/doc/lrange.n @@ -6,7 +6,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: lrange.n,v 1.11 2005/04/29 20:49:43 dgp Exp $ +'\" RCS: @(#) $Id: lrange.n,v 1.12 2005/05/10 18:34:01 kennykb Exp $ '\" .so man.macros .TH lrange n 7.4 Tcl "Tcl Built-In Commands" diff --git a/doc/lreplace.n b/doc/lreplace.n index f9f12e2..4c9f8c9 100644 --- a/doc/lreplace.n +++ b/doc/lreplace.n @@ -6,7 +6,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: lreplace.n,v 1.12 2005/04/29 20:49:43 dgp Exp $ +'\" RCS: @(#) $Id: lreplace.n,v 1.13 2005/05/10 18:34:01 kennykb Exp $ '\" .so man.macros .TH lreplace n 7.4 Tcl "Tcl Built-In Commands" diff --git a/doc/lsearch.n b/doc/lsearch.n index ffac227..823be5e 100644 --- a/doc/lsearch.n +++ b/doc/lsearch.n @@ -7,7 +7,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: lsearch.n,v 1.23 2005/04/29 20:49:43 dgp Exp $ +'\" RCS: @(#) $Id: lsearch.n,v 1.24 2005/05/10 18:34:01 kennykb Exp $ '\" .so man.macros .TH lsearch n 8.5 Tcl "Tcl Built-In Commands" @@ -4,7 +4,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: lset.n,v 1.8 2005/04/29 20:49:43 dgp Exp $ +'\" RCS: @(#) $Id: lset.n,v 1.9 2005/05/10 18:34:02 kennykb Exp $ '\" .so man.macros .TH lset n 8.4 Tcl "Tcl Built-In Commands" diff --git a/doc/lsort.n b/doc/lsort.n index f1b29d4..a921745 100644 --- a/doc/lsort.n +++ b/doc/lsort.n @@ -7,7 +7,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: lsort.n,v 1.19 2005/04/29 20:49:43 dgp Exp $ +'\" RCS: @(#) $Id: lsort.n,v 1.20 2005/05/10 18:34:02 kennykb Exp $ '\" .so man.macros .TH lsort n 8.3 Tcl "Tcl Built-In Commands" diff --git a/doc/mathfunc.n b/doc/mathfunc.n new file mode 100644 index 0000000..dfa4cb6 --- /dev/null +++ b/doc/mathfunc.n @@ -0,0 +1,221 @@ +.\" +'\" Copyright (c) 1993 The Regents of the University of California. +'\" Copyright (c) 1994-2000 Sun Microsystems, Inc. +'\" Copyright (c) 2005 by Kevin B. Kenny <kennykb@acm.org>. All rights reserved +'\" +'\" See the file "license.terms" for information on usage and redistribution +'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. +'\" +'\" RCS: @(#) $Id: mathfunc.n,v 1.2 2005/05/10 18:34:02 kennykb Exp $ +'\" +.so man.macros +.TH mathfunc n 8.5 Tcl "Tcl Mathematical Functions" +.BS +'\" Note: do not modify the .SH NAME line immediately below! +.SH NAME +expr \- Evaluate an expression +.SH SYNOPSIS +package require \fBTcl 8.5\fR +.sp +\fB::tcl::mathfunc::abs\fR \fIarg\fR +.br +\fB::tcl::mathfunc::acos\fR \fIarg\fR +.br +\fB::tcl::mathfunc::asin\fR \fIarg\fR +.br +\fB::tcl::mathfunc::atan\fR \fIarg\fR +.br +\fB::tcl::mathfunc::atan2\fR \fIy\fR \fIx\fR +.br +\fB::tcl::mathfunc::ceil\fR \fIarg\fR +.br +\fB::tcl::mathfunc::cos\fR \fIarg\fR +.br +\fB::tcl::mathfunc::cosh\fR \fIarg\fR +.br +\fB::tcl::mathfunc::double\fR \fIarg\fR +.br +\fB::tcl::mathfunc::exp\fR \fIarg\fR +.br +\fB::tcl::mathfunc::floor\fR \fIarg\fR +.br +\fB::tcl::mathfunc::fmod\fR \fIx\fR \fIy\fR +.br +\fB::tcl::mathfunc::hypot\fR \fIx\fR \fIy\fR +.br +\fB::tcl::mathfunc::int\fR \fIarg\fR +.br +\fB::tcl::mathfunc::log\fR \fIarg\fR +.br +\fB::tcl::mathfunc::log10\fR \fIarg\fR +.br +\fB::tcl::mathfunc::pow\fR \fIx\fR \fIy\fR +.br +\fB::tcl::mathfunc::rand\fR +.br +\fB::tcl::mathfunc::round\fR \fIarg\fR +.br +\fB::tcl::mathfunc::sin\fR \fIarg\fR +.br +\fB::tcl::mathfunc::sinh\fR \fIarg\fR +.br +\fB::tcl::mathfunc::sqrt\fR \fIarg\fR +.br +\fB::tcl::mathfunc::srand\fR \fIarg\fR +.br +\fB::tcl::mathfunc::tan\fR \fIarg\fR +.br +\fB::tcl::mathfunc::tanh\fR \fIarg\fR +.br +\fB::tcl::mathfunc::wide\fR \fIarg\fR +.sp +.BE +.SH "DESCRIPTION" +.PP +The \fBexpr\fR command handles mathematical functions of the form +\fBsin($x)\fR or \fBatan2($y,$x)\fR by converting them to calls of the +form \fB[tcl::math::sin [expr {$x}]]\fR or +\fB[tcl::math::atan2 [expr {$y}] [expr {$x}]]\fR. +A number of math functions are available by default within the +namespace \fB::tcl::mathfunc\fR; these functions are also available +for code apart from \fBexpr\fR, by invoking the given commands +directly. +.PP +Tcl supports the following mathematical functions in expressions, all +of which work solely with floating-point numbers unless otherwise noted: +.DS +.ta 3c 6c 9c +\fBabs\fR \fBcosh\fR \fBlog\fR \fBsqrt\fR +\fBacos\fR \fBdouble\fR \fBlog10\fR \fBsrand\fR +\fBasin\fR \fBexp\fR \fBpow\fR \fBtan\fR +\fBatan\fR \fBfloor\fR \fBrand\fR \fBtanh\fR +\fBatan2\fR \fBfmod\fR \fBround\fR \fBwide\fR +\fBceil\fR \fBhypot\fR \fBsin\fR +\fBcos\fR \fBint\fR \fBsinh\fR +.DE +.PP +.TP +\fBabs(\fIarg\fB)\fR +Returns the absolute value of \fIarg\fR. \fIArg\fR may be either +integer or floating-point, and the result is returned in the same form. +.TP +\fBacos(\fIarg\fB)\fR +Returns the arc cosine of \fIarg\fR, in the range [\fI0\fR,\fIpi\fR] +radians. \fIArg\fR should be in the range [\fI-1\fR,\fI1\fR]. +.TP +\fBasin(\fIarg\fB)\fR +Returns the arc sine of \fIarg\fR, in the range [\fI-pi/2\fR,\fIpi/2\fR] +radians. \fIArg\fR should be in the range [\fI-1\fR,\fI1\fR]. +.TP +\fBatan(\fIarg\fB)\fR +Returns the arc tangent of \fIarg\fR, in the range [\fI-pi/2\fR,\fIpi/2\fR] +radians. +.TP +\fBatan2(\fIy, x\fB)\fR +Returns the arc tangent of \fIy\fR/\fIx\fR, in the range [\fI-pi\fR,\fIpi\fR] +radians. \fIx\fR and \fIy\fR cannot both be 0. If \fIx\fR is greater +than \fI0\fR, this is equivalent to \fBatan(\fIy/x\fB)\fR. +.TP +\fBceil(\fIarg\fB)\fR +Returns the smallest integral floating-point value (i.e. with a zero +fractional part) not less than \fIarg\fR. +.TP +\fBcos(\fIarg\fB)\fR +Returns the cosine of \fIarg\fR, measured in radians. +.TP +\fBcosh(\fIarg\fB)\fR +Returns the hyperbolic cosine of \fIarg\fR. If the result would cause +an overflow, an error is returned. +.TP +\fBdouble(\fIarg\fB)\fR +If \fIarg\fR is a floating-point value, returns \fIarg\fR, otherwise converts +\fIarg\fR to floating-point and returns the converted value. +.TP +\fBexp(\fIarg\fB)\fR +Returns the exponential of \fIarg\fR, defined as \fIe\fR**\fIarg\fR. +If the result would cause an overflow, an error is returned. +.TP +\fBfloor(\fIarg\fB)\fR +Returns the largest integral floating-point value (i.e. with a zero +fractional part) not greater than \fIarg\fR. +.TP +\fBfmod(\fIx, y\fB)\fR +Returns the floating-point remainder of the division of \fIx\fR by +\fIy\fR. If \fIy\fR is 0, an error is returned. +.TP +\fBhypot(\fIx, y\fB)\fR +Computes the length of the hypotenuse of a right-angled triangle +\fBsqrt(\fIx\fR*\fIx\fR+\fIy\fR*\fIy\fB)\fR. +.TP +\fBint(\fIarg\fB)\fR +If \fIarg\fR is an integer value of the same width as the machine +word, returns \fIarg\fR, otherwise +converts \fIarg\fR to an integer (of the same size as a machine word, +i.e. 32-bits on 32-bit systems, and 64-bits on 64-bit systems) by +truncation and returns the converted value. +.TP +\fBlog(\fIarg\fB)\fR +Returns the natural logarithm of \fIarg\fR. \fIArg\fR must be a +positive value. +.TP +\fBlog10(\fIarg\fB)\fR +Returns the base 10 logarithm of \fIarg\fR. \fIArg\fR must be a +positive value. +.TP +\fBpow(\fIx, y\fB)\fR +Computes the value of \fIx\fR raised to the power \fIy\fR. If \fIx\fR +is negative, \fIy\fR must be an integer value. +.TP +\fBrand()\fR +Returns a pseudo-random floating-point value in the range (\fI0\fR,\fI1\fR). +The generator algorithm is a simple linear congruential generator that +is not cryptographically secure. Each result from \fBrand\fR completely +determines all future results from subsequent calls to \fBrand\fR, so +\fBrand\fR should not be used to generate a sequence of secrets, such as +one-time passwords. The seed of the generator is initialized from the +internal clock of the machine or may be set with the \fBsrand\fR function. +.TP +\fBround(\fIarg\fB)\fR +If \fIarg\fR is an integer value, returns \fIarg\fR, otherwise converts +\fIarg\fR to integer by rounding and returns the converted value. +.TP +\fBsin(\fIarg\fB)\fR +Returns the sine of \fIarg\fR, measured in radians. +.TP +\fBsinh(\fIarg\fB)\fR +Returns the hyperbolic sine of \fIarg\fR. If the result would cause +an overflow, an error is returned. +.TP +\fBsqrt(\fIarg\fB)\fR +Returns the square root of \fIarg\fR. \fIArg\fR must be non-negative. +.TP +\fBsrand(\fIarg\fB)\fR +The \fIarg\fR, which must be an integer, is used to reset the seed for +the random number generator of \fBrand\fR. Returns the first random +number (see \fBrand()\fR) from that seed. Each interpreter has its own seed. +.TP +\fBtan(\fIarg\fB)\fR +Returns the tangent of \fIarg\fR, measured in radians. +.TP +\fBtanh(\fIarg\fB)\fR +Returns the hyperbolic tangent of \fIarg\fR. +.TP +\fBwide(\fIarg\fB)\fR +Converts \fIarg\fR to an integer value at least 64-bits wide (by sign-extension +if \fIarg\fR is a 32-bit number) if it is not one already. +.PP +In addition to these predefined functions, applications may +define additional functions by using \fBproc\fR (or any other method, +such as \fBinterp alias\fR or \fBTcl_CreateObjCommand\fR) to define +new commands in the \fBtcl::mathfunc\fR namespace. In addition, an +obsolete interface named \fBTcl_CreateMathFunc\fR() is available to +extensions that are written in C. The latter interface is not recommended +for new implementations.. +.SH "SEE ALSO" +expr(n), namespace(n) +.SH "COPYRIGHT" +Copyright (c) 1993 The Regents of the University of California. +.br +Copyright (c) 1994-2000 Sun Microsystems Incorporated. +.br +Copyright (c) 2005 by Kevin B. Kenny <kennykb@acm.org>. All rights reserved.
\ No newline at end of file @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: open.n,v 1.24 2005/04/27 18:48:24 dgp Exp $ +'\" RCS: @(#) $Id: open.n,v 1.25 2005/05/10 18:34:02 kennykb Exp $ '\" .so man.macros .TH open n 8.3 Tcl "Tcl Built-In Commands" diff --git a/doc/pkgMkIndex.n b/doc/pkgMkIndex.n index 2a46f6a..28b3a2f 100644 --- a/doc/pkgMkIndex.n +++ b/doc/pkgMkIndex.n @@ -4,7 +4,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: pkgMkIndex.n,v 1.16 2005/04/06 20:55:23 dkf Exp $ +'\" RCS: @(#) $Id: pkgMkIndex.n,v 1.17 2005/05/10 18:34:02 kennykb Exp $ '\" .so man.macros .TH pkg_mkIndex n 8.3 Tcl "Tcl Built-In Commands" @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: puts.n,v 1.9 2005/04/06 20:55:23 dkf Exp $ +'\" RCS: @(#) $Id: puts.n,v 1.10 2005/05/10 18:34:02 kennykb Exp $ '\" .so man.macros .TH puts n 7.5 Tcl "Tcl Built-In Commands" diff --git a/doc/re_syntax.n b/doc/re_syntax.n index de584c0..c3a06cc 100644 --- a/doc/re_syntax.n +++ b/doc/re_syntax.n @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: re_syntax.n,v 1.7 2005/04/06 09:34:04 dkf Exp $ +'\" RCS: @(#) $Id: re_syntax.n,v 1.8 2005/05/10 18:34:02 kennykb Exp $ '\" .so man.macros .TH re_syntax n "8.1" Tcl "Tcl Built-In Commands" @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: read.n,v 1.10 2005/04/06 20:55:23 dkf Exp $ +'\" RCS: @(#) $Id: read.n,v 1.11 2005/05/10 18:34:02 kennykb Exp $ '\" .so man.macros .TH read n 8.1 Tcl "Tcl Built-In Commands" diff --git a/doc/regexp.n b/doc/regexp.n index 9567824..3e4ecce 100644 --- a/doc/regexp.n +++ b/doc/regexp.n @@ -4,7 +4,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: regexp.n,v 1.18 2005/04/29 20:49:43 dgp Exp $ +'\" RCS: @(#) $Id: regexp.n,v 1.19 2005/05/10 18:34:02 kennykb Exp $ '\" .so man.macros .TH regexp n 8.3 Tcl "Tcl Built-In Commands" diff --git a/doc/registry.n b/doc/registry.n index b885fa1..d1cb370 100644 --- a/doc/registry.n +++ b/doc/registry.n @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: registry.n,v 1.13 2005/04/06 20:55:24 dkf Exp $ +'\" RCS: @(#) $Id: registry.n,v 1.14 2005/05/10 18:34:03 kennykb Exp $ '\" .so man.macros .TH registry n 1.1 registry "Tcl Bundled Packages" diff --git a/doc/regsub.n b/doc/regsub.n index 259f2a5..53b8dd4 100644 --- a/doc/regsub.n +++ b/doc/regsub.n @@ -6,7 +6,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: regsub.n,v 1.14 2005/04/29 20:49:43 dgp Exp $ +'\" RCS: @(#) $Id: regsub.n,v 1.15 2005/05/10 18:34:03 kennykb Exp $ '\" .so man.macros .TH regsub n 8.3 Tcl "Tcl Built-In Commands" @@ -6,7 +6,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: scan.n,v 1.13 2005/04/06 20:55:24 dkf Exp $ +'\" RCS: @(#) $Id: scan.n,v 1.14 2005/05/10 18:34:03 kennykb Exp $ '\" .so man.macros .TH scan n 8.4 Tcl "Tcl Built-In Commands" @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: seek.n,v 1.8 2005/04/06 20:55:24 dkf Exp $ +'\" RCS: @(#) $Id: seek.n,v 1.9 2005/05/10 18:34:03 kennykb Exp $ '\" .so man.macros .TH seek n 8.1 Tcl "Tcl Built-In Commands" diff --git a/doc/string.n b/doc/string.n index 3fe9678..8d2296d 100644 --- a/doc/string.n +++ b/doc/string.n @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: string.n,v 1.27 2005/04/29 20:49:43 dgp Exp $ +'\" RCS: @(#) $Id: string.n,v 1.28 2005/05/10 18:34:03 kennykb Exp $ '\" .so man.macros .TH string n 8.1 Tcl "Tcl Built-In Commands" diff --git a/doc/subst.n b/doc/subst.n index 1bc058b..46572a8 100644 --- a/doc/subst.n +++ b/doc/subst.n @@ -6,7 +6,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: subst.n,v 1.7 2005/04/06 20:55:24 dkf Exp $ +'\" RCS: @(#) $Id: subst.n,v 1.8 2005/05/10 18:34:03 kennykb Exp $ '\" .so man.macros .TH subst n 7.4 Tcl "Tcl Built-In Commands" diff --git a/doc/tclvars.n b/doc/tclvars.n index 6ffb6a0..627fb6f 100644 --- a/doc/tclvars.n +++ b/doc/tclvars.n @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: tclvars.n,v 1.21 2005/04/06 20:55:24 dkf Exp $ +'\" RCS: @(#) $Id: tclvars.n,v 1.22 2005/05/10 18:34:03 kennykb Exp $ '\" .so man.macros .TH tclvars n 8.0 Tcl "Tcl Built-In Commands" @@ -242,7 +242,20 @@ is same as the result of evaluating \fIsizeof(long)\fR in C.) \fBtcl_precision\fR This variable controls the number of digits to generate when converting floating-point values to strings. It defaults -to 12. +.VS 8.5 +to 0. \fIApplications should not change this value;\fR it is +provided for compatibility with legacy code. +.PP +The default value of 0 is special, meaning that Tcl should +convert numbers using as few digits as possible while still +distinguishing any floating point number from its nearest +neighbours. It differs from using an arbitrarily high value +for \fItcl_precision\fR in that an inexact number like \fI1.4\fR +will convert as \fI1.4\fR rather than \fI1.3999999999999999\fR +even though the latter is nearer to the exact value of the +binary number. +.VE 8.5 +.PP 17 digits is ``perfect'' for IEEE floating-point in that it allows double-precision values to be converted to strings and back to binary with no loss of information. However, using 17 digits prevents @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: tell.n,v 1.8 2005/04/06 20:55:24 dkf Exp $ +'\" RCS: @(#) $Id: tell.n,v 1.9 2005/05/10 18:34:03 kennykb Exp $ '\" .so man.macros .TH tell n 8.1 Tcl "Tcl Built-In Commands" diff --git a/doc/unload.n b/doc/unload.n index bd66df6..8a2e51c 100644 --- a/doc/unload.n +++ b/doc/unload.n @@ -4,7 +4,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: unload.n,v 1.7 2005/04/06 20:55:24 dkf Exp $ +'\" RCS: @(#) $Id: unload.n,v 1.8 2005/05/10 18:34:03 kennykb Exp $ '\" .so man.macros .TH unload n 8.5 Tcl "Tcl Built-In Commands" diff --git a/doc/unset.n b/doc/unset.n index 53c91c1..036429f 100644 --- a/doc/unset.n +++ b/doc/unset.n @@ -6,7 +6,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: unset.n,v 1.9 2005/04/06 20:55:24 dkf Exp $ +'\" RCS: @(#) $Id: unset.n,v 1.10 2005/05/10 18:34:03 kennykb Exp $ '\" .so man.macros .TH unset n 8.4 Tcl "Tcl Built-In Commands" diff --git a/doc/upvar.n b/doc/upvar.n index 28048e7..acce716 100644 --- a/doc/upvar.n +++ b/doc/upvar.n @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: upvar.n,v 1.11 2005/04/06 20:55:24 dkf Exp $ +'\" RCS: @(#) $Id: upvar.n,v 1.12 2005/05/10 18:34:03 kennykb Exp $ '\" .so man.macros .TH upvar n "" Tcl "Tcl Built-In Commands" diff --git a/doc/variable.n b/doc/variable.n index 080dc44..fa99930 100644 --- a/doc/variable.n +++ b/doc/variable.n @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: variable.n,v 1.7 2005/02/16 18:52:24 msofer Exp $ +'\" RCS: @(#) $Id: variable.n,v 1.8 2005/05/10 18:34:04 kennykb Exp $ '\" .so man.macros .TH variable n 8.0 Tcl "Tcl Built-In Commands" diff --git a/generic/tcl.decls b/generic/tcl.decls index 4ad45ab..82219aa 100644 --- a/generic/tcl.decls +++ b/generic/tcl.decls @@ -11,7 +11,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: tcl.decls,v 1.110 2005/05/03 18:07:44 dgp Exp $ +# RCS: @(#) $Id: tcl.decls,v 1.111 2005/05/10 18:34:04 kennykb Exp $ library tcl @@ -1989,6 +1989,21 @@ declare 554 generic { Tcl_DriverThreadActionProc *Tcl_ChannelThreadActionProc(Tcl_ChannelType *chanTypePtr) } +# TIP #237: + +declare 555 generic { + Tcl_Obj* Tcl_NewBignumObj( mp_int* value ) +} +declare 556 generic { + Tcl_Obj* Tcl_DbNewBignumObj( mp_int* value, CONST char* file, int line ) +} +declare 557 generic { + void Tcl_SetBignumObj( Tcl_Obj* obj, mp_int* value ) +} +declare 558 generic { + int Tcl_GetBignumFromObj( Tcl_Interp* interp, Tcl_Obj* obj, mp_int* value ) +} + ############################################################################## # Define the platform specific public Tcl interface. These functions are diff --git a/generic/tcl.h b/generic/tcl.h index 97e6d25..bdb8e10 100644 --- a/generic/tcl.h +++ b/generic/tcl.h @@ -13,7 +13,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tcl.h,v 1.197 2005/03/10 22:10:38 dgp Exp $ + * RCS: @(#) $Id: tcl.h,v 1.198 2005/05/10 18:34:05 kennykb Exp $ */ #ifndef _TCL @@ -768,6 +768,12 @@ typedef struct Tcl_Obj { VOID *ptr1; VOID *ptr2; } twoPtrValue; + struct { /* - internal rep as a wide int, + * tightly packed fields */ + VOID *digits; /* Pointer to digits */ + unsigned long misc; /* Alloc, used, and signum packed + * into a single word */ + } bignumValue; } internalRep; } Tcl_Obj; @@ -809,6 +815,8 @@ int Tcl_IsShared _ANSI_ARGS_((Tcl_Obj *objPtr)); */ #ifdef TCL_MEM_DEBUG +# define Tcl_NewBignumObj(val) \ + Tcl_DbNewBignumObj(val, __FILE__, __LINE__) # define Tcl_NewBooleanObj(val) \ Tcl_DbNewBooleanObj(val, __FILE__, __LINE__) # define Tcl_NewByteArrayObj(bytes, len) \ @@ -2292,6 +2300,15 @@ typedef void (Tcl_LimitHandlerProc) _ANSI_ARGS_((ClientData clientData, typedef void (Tcl_LimitHandlerDeleteProc) _ANSI_ARGS_((ClientData clientData)); +#ifndef MP_INT_DECLARED +typedef struct mp_int mp_int; +#define MP_INT_DECLARED +#endif +#ifndef MP_DIGIT_DECLARED +typedef unsigned long mp_digit; +#define MP_DIGIT_DECLARED +#endif + #ifndef TCL_NO_DEPRECATED /* diff --git a/generic/tclBasic.c b/generic/tclBasic.c index 9783367..2ec1776 100644 --- a/generic/tclBasic.c +++ b/generic/tclBasic.c @@ -13,11 +13,27 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclBasic.c,v 1.150 2005/05/05 18:37:55 dgp Exp $ + * RCS: @(#) $Id: tclBasic.c,v 1.151 2005/05/10 18:34:06 kennykb Exp $ */ #include "tclInt.h" #include "tclCompile.h" +#include <float.h> +#ifndef TCL_NO_MATH +#include <math.h> +#endif + +/* + * The following structure defines the client data for a math function + * registered with Tcl_CreateMathFunc + */ + +typedef struct OldMathFuncData { + Tcl_MathProc* proc; /* Handler procedure */ + int numArgs; /* Number of args expected */ + Tcl_ValueType* argTypes; /* Types of the args */ + ClientData clientData; /* Client data for the handler function */ +} OldMathFuncData; /* * Static procedures in this file: @@ -30,6 +46,106 @@ static void DeleteInterpProc _ANSI_ARGS_((Tcl_Interp *interp)); static void ProcessUnexpectedResult _ANSI_ARGS_(( Tcl_Interp *interp, int returnCode)); +static int OldMathFuncProc _ANSI_ARGS_((ClientData clientData, + Tcl_Interp* interp, + int argc, + Tcl_Obj *CONST *objv )); + +static void OldMathFuncDeleteProc _ANSI_ARGS_((ClientData)); + +static int ExprAbsFunc _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, + int argc, + Tcl_Obj *CONST *objv)); +static int ExprBinaryFunc _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, + int argc, + Tcl_Obj *CONST *objv)); +static int ExprDoubleFunc _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, + int argc, + Tcl_Obj *CONST *objv)); +static int ExprIntFunc _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, + int argc, + Tcl_Obj *CONST *objv)); +static int ExprRandFunc _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, + int argc, + Tcl_Obj *CONST *objv)); +static int ExprRoundFunc _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, + int argc, + Tcl_Obj *CONST *objv)); +static int ExprSrandFunc _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, + int argc, + Tcl_Obj *CONST *objv)); +static int ExprUnaryFunc _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, + int argc, + Tcl_Obj *CONST *objv)); +static int ExprWideFunc _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, + int argc, + Tcl_Obj *CONST *objv)); +static int VerifyExprObjType _ANSI_ARGS_((Tcl_Interp *interp, + Tcl_Obj *objPtr)); + +static void MathFuncWrongNumArgs + _ANSI_ARGS_((Tcl_Interp* interp, + int expected, + int actual, + Tcl_Obj *CONST *objv )); + +#ifndef TCL_WIDE_INT_IS_LONG +/* + * Extract a double value from a general numeric object. + */ +#define GET_DOUBLE_VALUE(doubleVar, objPtr, typePtr) \ + if ((typePtr) == &tclIntType) { \ + (doubleVar) = (double) (objPtr)->internalRep.longValue; \ + } else if ((typePtr) == &tclWideIntType) { \ + (doubleVar) = Tcl_WideAsDouble((objPtr)->internalRep.wideValue);\ + } else { \ + (doubleVar) = (objPtr)->internalRep.doubleValue; \ + } +#else /* TCL_WIDE_INT_IS_LONG */ +#define GET_DOUBLE_VALUE(doubleVar, objPtr, typePtr) \ + if (((typePtr) == &tclIntType) || ((typePtr) == &tclWideIntType)) { \ + (doubleVar) = (double) (objPtr)->internalRep.longValue; \ + } else { \ + (doubleVar) = (objPtr)->internalRep.doubleValue; \ + } +#endif /* TCL_WIDE_INT_IS_LONG */ +#define GET_WIDE_OR_INT(resultVar, objPtr, longVar, wideVar) \ + (resultVar) = Tcl_GetWideIntFromObj((Tcl_Interp *) NULL, (objPtr), \ + &(wideVar)); \ + if ((resultVar) == TCL_OK && (wideVar) >= Tcl_LongAsWide(LONG_MIN) \ + && (wideVar) <= Tcl_LongAsWide(LONG_MAX)) { \ + (objPtr)->typePtr = &tclIntType; \ + (objPtr)->internalRep.longValue = (longVar) \ + = Tcl_WideAsLong(wideVar); \ + } +#define IS_INTEGER_TYPE(typePtr) \ + ((typePtr) == &tclIntType || (typePtr) == &tclWideIntType) +#define IS_NUMERIC_TYPE(typePtr) \ + (IS_INTEGER_TYPE(typePtr) || (typePtr) == &tclDoubleType) + +/* + * Macros for testing floating-point values for certain special cases. Test + * for not-a-number by comparing a value against itself; test for infinity + * by comparing against the largest floating-point value. + */ + +#ifdef _MSC_VER +#define IS_NAN(f) (_isnan((f))) +#define IS_INF(f) ( ! (_finite((f)))) +#else +#define IS_NAN(f) ((f) != (f)) +#define IS_INF(f) ( (f) > DBL_MAX || (f) < -DBL_MAX ) +#endif + extern TclStubs tclStubs; /* @@ -144,6 +260,55 @@ static CmdInfo builtInCmds[] = { {NULL, (Tcl_ObjCmdProc *) NULL, (CompileProc *) NULL, 0} }; +/* + * Math functions + */ + +typedef struct { + CONST char* name; /* Name of the function */ + Tcl_ObjCmdProc* objCmdProc; /* Procedure that evaluates the function */ + ClientData clientData; /* Client data for the procedure */ +} BuiltinFuncDef; +BuiltinFuncDef BuiltinFuncTable[] = { + { "::tcl::mathfunc::abs", ExprAbsFunc, NULL }, +#ifndef TCL_NO_MATH + { "::tcl::mathfunc::acos", ExprUnaryFunc, (ClientData) acos }, + { "::tcl::mathfunc::asin", ExprUnaryFunc, (ClientData) asin }, + { "::tcl::mathfunc::atan", ExprUnaryFunc, (ClientData) atan }, + { "::tcl::mathfunc::atan2", ExprBinaryFunc, (ClientData) atan2 }, + { "::tcl::mathfunc::ceil", ExprUnaryFunc, (ClientData) ceil }, + { "::tcl::mathfunc::cos", ExprUnaryFunc, (ClientData) cos }, + { "::tcl::mathfunc::cosh", ExprUnaryFunc, (ClientData) cosh }, +#endif + { "::tcl::mathfunc::double",ExprDoubleFunc, NULL }, +#ifndef TCL_NO_MATH + { "::tcl::mathfunc::exp", ExprUnaryFunc, (ClientData) exp }, + { "::tcl::mathfunc::floor", ExprUnaryFunc, (ClientData) floor }, + { "::tcl::mathfunc::fmod", ExprBinaryFunc, (ClientData) fmod }, + { "::tcl::mathfunc::hypot", ExprBinaryFunc, (ClientData) hypot }, +#endif + { "::tcl::mathfunc::int", ExprIntFunc, NULL }, +#ifndef TCL_NO_MATH + { "::tcl::mathfunc::log", ExprUnaryFunc, (ClientData) log }, + { "::tcl::mathfunc::log10", ExprUnaryFunc, (ClientData) log10 }, + { "::tcl::mathfunc::pow", ExprBinaryFunc, (ClientData) pow }, +#endif + { "::tcl::mathfunc::rand", ExprRandFunc, NULL }, + { "::tcl::mathfunc::round", ExprRoundFunc, NULL }, +#ifndef TCL_NO_MATH + { "::tcl::mathfunc::sin", ExprUnaryFunc, (ClientData) sin }, + { "::tcl::mathfunc::sinh", ExprUnaryFunc, (ClientData) sinh }, + { "::tcl::mathfunc::sqrt", ExprUnaryFunc, (ClientData) sqrt }, +#endif + { "::tcl::mathfunc::srand", ExprSrandFunc, NULL }, +#ifndef TCL_NO_MATH + { "::tcl::mathfunc::tan", ExprUnaryFunc, (ClientData) tan }, + { "::tcl::mathfunc::tanh", ExprUnaryFunc, (ClientData) tanh }, +#endif + { "::tcl::mathfunc::wide", ExprWideFunc, NULL }, + { NULL, NULL, NULL } +}; + /* *---------------------------------------------------------------------- @@ -170,10 +335,9 @@ Tcl_CreateInterp() Interp *iPtr; Tcl_Interp *interp; Command *cmdPtr; - BuiltinFunc *builtinFuncPtr; - MathFunc *mathFuncPtr; - Tcl_HashEntry *hPtr; + BuiltinFuncDef *builtinFuncPtr; const CmdInfo *cmdInfoPtr; + Tcl_Namespace* mathfuncNSPtr; int i; union { char c[sizeof(short)]; @@ -213,7 +377,6 @@ Tcl_CreateInterp() iPtr->globalNsPtr = NULL; iPtr->hiddenCmdTablePtr = NULL; iPtr->interpInfo = NULL; - Tcl_InitHashTable(&iPtr->mathFuncTable, TCL_STRING_KEYS); iPtr->numLevels = 0; iPtr->maxNestingDepth = MAX_NESTING_DEPTH; @@ -223,10 +386,10 @@ Tcl_CreateInterp() iPtr->returnOpts = NULL; iPtr->errorInfo = NULL; - iPtr->eiVar = Tcl_NewStringObj("errorInfo", -1); + iPtr->eiVar = Tcl_NewStringObj( "errorInfo", -1 ); Tcl_IncrRefCount(iPtr->eiVar); iPtr->errorCode = NULL; - iPtr->ecVar = Tcl_NewStringObj("errorCode", -1); + iPtr->ecVar = Tcl_NewStringObj( "errorCode", -1 ); Tcl_IncrRefCount(iPtr->ecVar); iPtr->returnLevel = 0; iPtr->returnCode = TCL_OK; @@ -399,6 +562,11 @@ Tcl_CreateInterp() TclClockOldscanObjCmd, (ClientData) NULL, (Tcl_CmdDeleteProc*) NULL ); + /* + * Register the built-in functions + */ + + /* Register the default [interp bgerror] handler. */ Tcl_CreateObjCommand( interp, "::tcl::Bgerror", @@ -413,21 +581,25 @@ Tcl_CreateInterp() * Register the builtin math functions. */ + mathfuncNSPtr = Tcl_CreateNamespace( interp, "::tcl::mathfunc", + (ClientData) NULL, + (Tcl_NamespaceDeleteProc*) NULL ); + if ( mathfuncNSPtr == NULL ) { + Tcl_Panic( "Can't create math function namespace" ); + } i = 0; - for (builtinFuncPtr = tclBuiltinFuncTable; builtinFuncPtr->name != NULL; - builtinFuncPtr++) { - Tcl_CreateMathFunc((Tcl_Interp *) iPtr, builtinFuncPtr->name, - builtinFuncPtr->numArgs, builtinFuncPtr->argTypes, - (Tcl_MathProc *) NULL, (ClientData) 0); - hPtr = Tcl_FindHashEntry(&iPtr->mathFuncTable, - builtinFuncPtr->name); - if (hPtr == NULL) { - Tcl_Panic("Tcl_CreateInterp: Tcl_CreateMathFunc incorrectly registered '%s'", builtinFuncPtr->name); - return NULL; + for ( ; ; ) { + CONST char* tail; + builtinFuncPtr = &(BuiltinFuncTable[ i++ ]); + if ( builtinFuncPtr->name == NULL ) { + break; } - mathFuncPtr = (MathFunc *) Tcl_GetHashValue(hPtr); - mathFuncPtr->builtinFuncIndex = i; - i++; + Tcl_CreateObjCommand( interp, builtinFuncPtr->name, + builtinFuncPtr->objCmdProc, + builtinFuncPtr->clientData, + (Tcl_CmdDeleteProc*) NULL ); + tail = builtinFuncPtr->name + strlen( "::tcl::mathfunc::" ); + Tcl_Export( interp, mathfuncNSPtr, tail, 0 ); } /* @@ -936,16 +1108,6 @@ DeleteInterpProc(interp) Tcl_DeleteHashTable(hTablePtr); ckfree((char *) hTablePtr); } - /* - * Tear down the math function table. - */ - - for (hPtr = Tcl_FirstHashEntry(&iPtr->mathFuncTable, &search); - hPtr != NULL; - hPtr = Tcl_NextHashEntry(&search)) { - ckfree((char *) Tcl_GetHashValue(hPtr)); - } - Tcl_DeleteHashTable(&iPtr->mathFuncTable); /* * Invoke deletion callbacks; note that a callback can create new @@ -2675,52 +2837,176 @@ Tcl_CreateMathFunc(interp, name, numArgs, argTypes, proc, clientData) ClientData clientData; /* Additional value to pass to the * function. */ { - Interp *iPtr = (Interp *) interp; - Tcl_HashEntry *hPtr; - MathFunc *mathFuncPtr; - int new, i; - hPtr = Tcl_CreateHashEntry(&iPtr->mathFuncTable, name, &new); - if (new) { - Tcl_SetHashValue(hPtr, ckalloc(sizeof(MathFunc))); + Tcl_DString bigName; + + OldMathFuncData* data + = (OldMathFuncData*) Tcl_Alloc( sizeof ( OldMathFuncData ) ); + + if ( numArgs > MAX_MATH_ARGS ) { + Tcl_Panic( "attempt to create a math function with too many args" ); } - mathFuncPtr = (MathFunc *) Tcl_GetHashValue(hPtr); - if (!new) { - if (mathFuncPtr->builtinFuncIndex >= 0) { - /* - * We are redefining a builtin math function. Invalidate the - * interpreter's existing code by incrementing its - * compileEpoch member. This field is checked in Tcl_EvalObj - * and ObjInterpProc, and code whose compilation epoch doesn't - * match is recompiled. Newly compiled code will no longer - * treat the function as builtin. - */ + data->proc = proc; + data->numArgs = numArgs; + data->argTypes + = (Tcl_ValueType*) Tcl_Alloc( numArgs * sizeof( Tcl_ValueType ) ); + memcpy( data->argTypes, argTypes, numArgs * sizeof( Tcl_ValueType ) ); + data->clientData = clientData; - iPtr->compileEpoch++; - } else { - /* - * A non-builtin function is being redefined. We must invalidate - * existing code if the number of arguments has changed. This - * is because existing code was compiled assuming that number. - */ + Tcl_DStringInit( &bigName ); + Tcl_DStringAppend( &bigName, "::tcl::mathfunc::", -1 ); + Tcl_DStringAppend( &bigName, name, -1 ); - if (numArgs != mathFuncPtr->numArgs) { - iPtr->compileEpoch++; + Tcl_CreateObjCommand( interp, Tcl_DStringValue( &bigName ), + OldMathFuncProc, (ClientData) data, + OldMathFuncDeleteProc ); + Tcl_DStringFree( &bigName ); +} + +/* + *---------------------------------------------------------------------- + * + * OldMathFuncProc -- + * + * Dispatch to a math function created with Tcl_CreateMathFunc + * + * Results: + * Returns a standard Tcl result. + * + * Side effects: + * Whatever the math function does. + * + *---------------------------------------------------------------------- + */ + +static int +OldMathFuncProc( clientData, interp, objc, objv ) + ClientData clientData; /* Ponter to OldMathFuncData describing + * the function being called */ + Tcl_Interp* interp; /* Tcl interpreter */ + int objc; /* Actual parameter count */ + Tcl_Obj *CONST *objv; /* Parameter vector */ +{ + Tcl_Obj* valuePtr; + OldMathFuncData* dataPtr = (OldMathFuncData*) clientData; + Tcl_Value args[MAX_MATH_ARGS]; + Tcl_Value funcResult; + int result; + int i, j, k; + double d; + + /* Check argument count */ + + if ( objc != dataPtr->numArgs + 1 ) { + MathFuncWrongNumArgs( interp, dataPtr->numArgs+1, objc, objv ); + return TCL_ERROR; + } + + /* Convert arguments from Tcl_Obj's to Tcl_Value's */ + + for ( j = 1, k = 0; j < objc; ++j, ++k ) { + valuePtr = objv[j]; + if (VerifyExprObjType(interp, valuePtr) != TCL_OK) { + return TCL_ERROR; + } + + /* + * Copy the object's numeric value to the argument record, + * converting it if necessary. + */ + + if (valuePtr->typePtr == &tclIntType) { + i = valuePtr->internalRep.longValue; + if (dataPtr->argTypes[k] == TCL_DOUBLE) { + args[k].type = TCL_DOUBLE; + args[k].doubleValue = i; + } else if (dataPtr->argTypes[k] == TCL_WIDE_INT) { + args[k].type = TCL_WIDE_INT; + args[k].wideValue = Tcl_LongAsWide(i); + } else { + args[k].type = TCL_INT; + args[k].intValue = i; + } + } else if (valuePtr->typePtr == &tclWideIntType) { + Tcl_WideInt w; + TclGetWide(w,valuePtr); + if (dataPtr->argTypes[k] == TCL_DOUBLE) { + args[k].type = TCL_DOUBLE; + args[k].doubleValue = Tcl_WideAsDouble(w); + } else if (dataPtr->argTypes[k] == TCL_INT) { + args[k].type = TCL_INT; + args[k].intValue = Tcl_WideAsLong(w); + } else { + args[k].type = TCL_WIDE_INT; + args[k].wideValue = w; + } + } else { + d = valuePtr->internalRep.doubleValue; + if (dataPtr->argTypes[k] == TCL_INT) { + args[k].type = TCL_INT; + args[k].intValue = (long) d; + } else if (dataPtr->argTypes[k] == TCL_WIDE_INT) { + args[k].type = TCL_WIDE_INT; + args[k].wideValue = Tcl_DoubleAsWide(d); + } else { + args[k].type = TCL_DOUBLE; + args[k].doubleValue = d; } } } - - mathFuncPtr->builtinFuncIndex = -1; /* can't be a builtin function */ - if (numArgs > MAX_MATH_ARGS) { - numArgs = MAX_MATH_ARGS; + + /* Call the function */ + + result = (*dataPtr->proc)(dataPtr->clientData, interp, args, + &funcResult); + if (result != TCL_OK) { + return result; } - mathFuncPtr->numArgs = numArgs; - for (i = 0; i < numArgs; i++) { - mathFuncPtr->argTypes[i] = argTypes[i]; + + /* Return the result of the call */ + + if (funcResult.type == TCL_INT) { + TclNewLongObj(valuePtr, funcResult.intValue); + } else if (funcResult.type == TCL_WIDE_INT) { + TclNewWideIntObj(valuePtr, funcResult.wideValue); + } else { + d = funcResult.doubleValue; + if (IS_NAN(d) || IS_INF(d)) { + TclExprFloatError(interp, d); + return TCL_ERROR; + } + TclNewDoubleObj(valuePtr, d); } - mathFuncPtr->proc = proc; - mathFuncPtr->clientData = clientData; + Tcl_SetObjResult( interp, valuePtr ); + return TCL_OK; + +} + +/* + *---------------------------------------------------------------------- + * + * OldMathFuncDeleteProc -- + * + * Cleans up after deleting a math function registered with + * Tcl_CreateMathFunc + * + * Results: + * None. + * + * Side effects: + * Frees allocated memory. + * + *---------------------------------------------------------------------- + */ + +static void +OldMathFuncDeleteProc( clientData ) + ClientData clientData; +{ + OldMathFuncData* dataPtr = (OldMathFuncData*) clientData; + Tcl_Free( (VOID*) dataPtr->argTypes ); + Tcl_Free( (VOID*) dataPtr ); } /* @@ -2757,39 +3043,51 @@ Tcl_GetMathFuncInfo(interp, name, numArgsPtr, argTypesPtr, procPtr, Tcl_MathProc **procPtr; ClientData *clientDataPtr; { - Interp *iPtr = (Interp *) interp; - Tcl_HashEntry *hPtr; - MathFunc *mathFuncPtr; - Tcl_ValueType *argTypes; - int i,numArgs; - hPtr = Tcl_FindHashEntry(&iPtr->mathFuncTable, name); - if (hPtr == NULL) { - Tcl_AppendResult(interp, "math function \"", name, - "\" not known in this interpreter", (char *) NULL); - return TCL_ERROR; - } - mathFuncPtr = (MathFunc *) Tcl_GetHashValue(hPtr); + Tcl_Obj* cmdNameObj; + Command* cmdPtr; - *numArgsPtr = numArgs = mathFuncPtr->numArgs; - if (numArgs == 0) { - /* Avoid doing zero-sized allocs... */ - numArgs = 1; - } - *argTypesPtr = argTypes = - (Tcl_ValueType *)ckalloc(numArgs * sizeof(Tcl_ValueType)); - for (i = 0; i < mathFuncPtr->numArgs; i++) { - argTypes[i] = mathFuncPtr->argTypes[i]; + /* Get the command that implements the math function */ + + cmdNameObj = Tcl_NewStringObj( "tcl::mathfunc::", -1 ); + Tcl_AppendToObj( cmdNameObj, name, -1 ); + Tcl_IncrRefCount( cmdNameObj ); + cmdPtr = (Command*) Tcl_GetCommandFromObj( interp, cmdNameObj ); + Tcl_DecrRefCount( cmdNameObj ); + + /* Report unknown functions */ + + if ( cmdPtr == NULL ) { + Tcl_Obj* message; + message = Tcl_NewStringObj( "unknown math function \"", -1 ); + Tcl_AppendToObj( message, name, -1 ); + Tcl_AppendToObj( message, "\"", 1 ); + *numArgsPtr = -1; *argTypesPtr = NULL; + *procPtr = NULL; + *clientDataPtr = NULL; + return TCL_ERROR; } + + /* + * Retrieve function info for user defined functions; return + * dummy information for builtins. + */ - if (mathFuncPtr->builtinFuncIndex == -1) { - *procPtr = (Tcl_MathProc *) NULL; + if ( cmdPtr->objProc == &OldMathFuncProc ) { + OldMathFuncData* dataPtr = (OldMathFuncData*) cmdPtr->clientData; + *procPtr = dataPtr->proc; + *numArgsPtr = dataPtr->numArgs; + *argTypesPtr = dataPtr->argTypes; + *clientDataPtr = dataPtr->clientData; } else { - *procPtr = mathFuncPtr->proc; - *clientDataPtr = mathFuncPtr->clientData; + *procPtr = NULL; + *numArgsPtr = -1; + *argTypesPtr = NULL; + *procPtr = NULL; + *clientDataPtr = NULL; } - return TCL_OK; + } /* @@ -2816,33 +3114,42 @@ Tcl_ListMathFuncs(interp, pattern) Tcl_Interp *interp; CONST char *pattern; { - Interp *iPtr = (Interp *) interp; - Tcl_Obj *resultList = Tcl_NewObj(); - register Tcl_HashEntry *hPtr; - Tcl_HashSearch hSearch; - CONST char *name; - - if ((pattern != NULL) && TclMatchIsTrivial(pattern)) { - if ((Tcl_FindHashEntry(&iPtr->mathFuncTable, pattern) != NULL) - && (Tcl_ListObjAppendElement(interp, resultList, - Tcl_NewStringObj(pattern,-1)) != TCL_OK)) { - goto error; - } - return resultList; - } - for (hPtr = Tcl_FirstHashEntry(&iPtr->mathFuncTable, &hSearch); - hPtr != NULL; hPtr = Tcl_NextHashEntry(&hSearch)) { - name = Tcl_GetHashKey(&iPtr->mathFuncTable, hPtr); - if ((pattern == NULL || Tcl_StringMatch(name, pattern)) && - /* I don't expect this to fail, but... */ - Tcl_ListObjAppendElement(interp, resultList, - Tcl_NewStringObj(name,-1)) != TCL_OK) { -error: - Tcl_DecrRefCount(resultList); - return NULL; + Namespace* globalNsPtr = (Namespace*) Tcl_GetGlobalNamespace( interp ); + Namespace* nsPtr; + Namespace* dummy1NsPtr; + Namespace* dummy2NsPtr; + CONST char* dummyNamePtr; + Tcl_Obj* result = Tcl_NewObj(); + Tcl_HashEntry* cmdHashEntry; + Tcl_HashSearch cmdHashSearch; + CONST char* cmdNamePtr; + + TclGetNamespaceForQualName( interp, "::tcl::mathfunc", + globalNsPtr, + TCL_FIND_ONLY_NS | TCL_GLOBAL_ONLY, + &nsPtr, &dummy1NsPtr, &dummy2NsPtr, + &dummyNamePtr ); + + if ( nsPtr != NULL ) { + if ((pattern != NULL) && TclMatchIsTrivial(pattern)) { + if (Tcl_FindHashEntry(&nsPtr->cmdTable, pattern) != NULL) { + Tcl_ListObjAppendElement(NULL, result, + Tcl_NewStringObj(pattern,-1)); + } + } else { + for ( cmdHashEntry = + Tcl_FirstHashEntry( &nsPtr->cmdTable, &cmdHashSearch ); + cmdHashEntry != NULL; + cmdHashEntry = Tcl_NextHashEntry( &cmdHashSearch ) ) { + cmdNamePtr = Tcl_GetHashKey( &nsPtr->cmdTable, cmdHashEntry ); + if (pattern == NULL || Tcl_StringMatch(cmdNamePtr, pattern)) { + Tcl_ListObjAppendElement( NULL, result, + Tcl_NewStringObj( cmdNamePtr, -1 ) ); + } + } } } - return resultList; + return result; } /* @@ -3000,7 +3307,7 @@ TclEvalObjvInternal(interp, objc, objv, command, length, flags) for (i = objc-1; i >= 0; i--) { newObjv[i+1] = objv[i]; } - newObjv[0] = Tcl_NewStringObj("::unknown", -1); + newObjv[0] = Tcl_NewStringObj( "::unknown", -1); Tcl_IncrRefCount(newObjv[0]); cmdPtr = (Command *) Tcl_GetCommandFromObj(interp, newObjv[0]); if (cmdPtr == NULL) { @@ -3483,9 +3790,10 @@ Tcl_EvalEx(interp, script, numBytes, flags) objv[objectsUsed], &numElements); if (code == TCL_ERROR) { /* Attempt to expand a non-list */ - Tcl_Obj *msg = - Tcl_NewStringObj("\n (expanding word ", -1); - Tcl_Obj *wordNum = Tcl_NewIntObj(objectsUsed); + Tcl_Obj *msg; + Tcl_Obj *wordNum; + msg = Tcl_NewStringObj("\n (expanding word ", -1); + TclNewIntObj( wordNum, objectsUsed ); Tcl_IncrRefCount(wordNum); Tcl_IncrRefCount(msg); Tcl_AppendObjToObj(msg, wordNum); @@ -4299,8 +4607,9 @@ TclObjInvoke(interp, objc, objv, flags) && ((iPtr->flags & ERR_ALREADY_LOGGED) == 0)) { int length; Tcl_Obj *command = Tcl_NewListObj(objc, objv); - CONST char* cmdString = Tcl_GetStringFromObj(command, &length); - + CONST char* cmdString; + Tcl_IncrRefCount( command ); + cmdString = Tcl_GetStringFromObj(command, &length); Tcl_LogCommandInfo(interp, cmdString, cmdString, length); Tcl_DecrRefCount(command); iPtr->flags &= ~ERR_ALREADY_LOGGED; @@ -4701,4 +5010,642 @@ Tcl_GetVersion(majorV, minorV, patchLevelV, type) *type = TCL_RELEASE_LEVEL; } } - + +/* + *---------------------------------------------------------------------- + * + * Math Functions -- + * + * This page contains the procedures that implement all of the + * built-in math functions for expressions. + * + * Results: + * Each procedure returns TCL_OK if it succeeds and pushes an + * Tcl object holding the result. If it fails it returns TCL_ERROR + * and leaves an error message in the interpreter's result. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + +static int +ExprUnaryFunc(clientData, interp, objc, objv) + ClientData clientData; /* Contains the address of a procedure that + * takes one double argument and returns a + * double result. */ + Tcl_Interp *interp; /* The interpreter in which to execute the + * function. */ + int objc; /* Actual parameter count */ + Tcl_Obj *CONST *objv; /* Actual parameter list */ +{ + double d, dResult; + Tcl_Obj* oResult; + + double (*func) _ANSI_ARGS_((double)) = + (double (*)_ANSI_ARGS_((double))) clientData; + + /* + * Convert the function's argument to a double if necessary. + */ + + if ( objc != 2 ) { + MathFuncWrongNumArgs( interp, 2, objc, objv ); + } else if ( Tcl_GetDoubleFromObj( interp, objv[1], &d ) == TCL_OK ) { + + /* Evaluate the function */ + + dResult = (*func)(d); + if ((errno != 0 ) || IS_NAN(dResult)) { + if ( errno != ERANGE || ( dResult != 0.0 && !IS_INF(dResult) )) { + TclExprFloatError(interp, dResult); + return TCL_ERROR; + } + } + TclNewDoubleObj( oResult, dResult ); + Tcl_SetObjResult( interp, oResult ); + return TCL_OK; + } + + return TCL_ERROR; +} + +static int +ExprBinaryFunc( clientData, interp, objc, objv ) + ClientData clientData; /* Contains the address of a procedure that + * takes two double arguments and + * returns a double result. */ + Tcl_Interp *interp; /* The interpreter in which to execute the + * function. */ + int objc; /* Actual parameter count */ + Tcl_Obj *CONST *objv; /* Parameter vector */ +{ + double d1, d2, dResult; + Tcl_Obj* oResult; + + double (*func) _ANSI_ARGS_((double, double)) + = (double (*)_ANSI_ARGS_((double, double))) clientData; + + /* + * Convert the function's two arguments to doubles if necessary. + */ + + if ( objc != 3 ) { + MathFuncWrongNumArgs( interp, 3, objc, objv ); + } else if ( Tcl_GetDoubleFromObj( interp, objv[1], &d1 ) == TCL_OK + && Tcl_GetDoubleFromObj( interp, objv[2], &d2 ) == TCL_OK ) { + + /* Evaluate the function */ + + errno = 0; + dResult = (*func)(d1, d2); + if ((errno != 0) || IS_NAN(dResult)) { + if ( errno != ERANGE || ( dResult != 0.0 && !IS_INF( dResult ) ) ) { + TclExprFloatError(interp, dResult); + return TCL_ERROR; + } + } + TclNewDoubleObj( oResult, dResult ); + Tcl_SetObjResult( interp, oResult ); + return TCL_OK; + } + + return TCL_ERROR; + +} + +static int +ExprAbsFunc( clientData, interp, objc, objv ) + ClientData clientData; /* Ignored. */ + Tcl_Interp *interp; /* The interpreter in which to execute the + * function. */ + int objc; /* Actual parameter count */ + Tcl_Obj *CONST *objv; /* Parameter vector */ +{ + register Tcl_Obj *valuePtr; + long i, iResult; + double d, dResult; + Tcl_Obj* oResult; + + if ( objc != 2 ) { + MathFuncWrongNumArgs( interp, 2, objc, objv ); + return TCL_ERROR; + } + valuePtr = objv[1]; + + if (VerifyExprObjType(interp, valuePtr) != TCL_OK) { + return TCL_ERROR; + } + + /* + * Derive the absolute value according to the arg type. + */ + if (valuePtr->typePtr == &tclIntType) { + i = valuePtr->internalRep.longValue; + if (i < 0) { + iResult = -i; + if (iResult < 0) { + /* FIXME: This should promote to wide! */ + Tcl_SetObjResult(interp, Tcl_NewStringObj( + "integer value too large to represent", -1)); + Tcl_SetErrorCode(interp, "ARITH", "IOVERFLOW", + "integer value too large to represent", (char *) NULL); + return TCL_ERROR; + } + } else { + iResult = i; + } + TclNewLongObj( oResult, iResult ); + Tcl_SetObjResult( interp, oResult ); + } else if (valuePtr->typePtr == &tclWideIntType) { + Tcl_WideInt wResult, w; + TclGetWide(w,valuePtr); + if (w < (Tcl_WideInt)0) { + wResult = -w; + if (wResult < 0) { + Tcl_SetObjResult(interp, Tcl_NewStringObj( + "integer value too large to represent", -1)); + Tcl_SetErrorCode(interp, "ARITH", "IOVERFLOW", + "integer value too large to represent", (char *) NULL); + return TCL_ERROR; + } + } else { + wResult = w; + } + TclNewWideIntObj( oResult, wResult ); + Tcl_SetObjResult( interp, oResult ); + } else { + d = valuePtr->internalRep.doubleValue; + if (d < 0.0) { + dResult = -d; + } else { + dResult = d; + } + if (IS_NAN(dResult)) { + TclExprFloatError(interp, dResult); + return TCL_ERROR; + } + TclNewDoubleObj( oResult, dResult ); + Tcl_SetObjResult( interp, oResult ); + } + + return TCL_OK; +} + +static int +ExprDoubleFunc(clientData, interp, objc, objv ) + ClientData clientData; /* Ignored. */ + Tcl_Interp *interp; /* The interpreter in which to execute the + * function. */ + int objc; /* Actual parameter count */ + Tcl_Obj *CONST *objv; /* Actual parameter vector */ +{ + Tcl_Obj* valuePtr; + double dResult; + Tcl_Obj* oResult; + + /* + * Check parameter type + */ + + if ( objc != 2 ) { + MathFuncWrongNumArgs( interp, 2, objc, objv ); + } else { + valuePtr = objv[1]; + if ( VerifyExprObjType( interp, valuePtr ) == TCL_OK ) { + GET_DOUBLE_VALUE( dResult, valuePtr, valuePtr->typePtr ); + TclNewDoubleObj( oResult, dResult ); + Tcl_SetObjResult( interp, oResult ); + return TCL_OK; + } + } + + return TCL_ERROR; +} + +static int +ExprIntFunc(clientData, interp, objc, objv) + ClientData clientData; /* Ignored. */ + Tcl_Interp *interp; /* The interpreter in which to execute the + * function. */ + int objc; /* Actual parameter count */ + Tcl_Obj *CONST *objv; /* Actual parameter vector */ +{ + + register Tcl_Obj *valuePtr; + long iResult; + double d; + Tcl_Obj* oResult; + + if ( objc != 2 ) { + MathFuncWrongNumArgs( interp, 2, objc, objv ); + } else { + valuePtr = objv[1]; + if (VerifyExprObjType(interp, valuePtr) == TCL_OK) { + if (valuePtr->typePtr == &tclIntType) { + iResult = valuePtr->internalRep.longValue; + } else if (valuePtr->typePtr == &tclWideIntType) { + TclGetLongFromWide(iResult,valuePtr); + } else { + d = valuePtr->internalRep.doubleValue; + if (d < 0.0) { + if (d < (double) (long) LONG_MIN) { + tooLarge: + Tcl_SetObjResult(interp, Tcl_NewStringObj( + "integer value too large to represent", -1)); + Tcl_SetErrorCode(interp, "ARITH", "IOVERFLOW", + "integer value too large to represent", + (char *) NULL); + return TCL_ERROR; + } + } else { + if (d > (double) LONG_MAX) { + goto tooLarge; + } + } + if (IS_NAN(d) || IS_INF(d)) { + TclExprFloatError(interp, d); + return TCL_ERROR; + } + iResult = (long) d; + } + TclNewIntObj( oResult, iResult ); + Tcl_SetObjResult( interp, oResult ); + return TCL_OK; + } + } + return TCL_ERROR; +} + +static int +ExprWideFunc(clientData, interp, objc, objv) + ClientData clientData; /* Ignored. */ + Tcl_Interp *interp; /* The interpreter in which to execute the + * function. */ + int objc; /* Actual parameter count */ + Tcl_Obj *CONST *objv; /* Actual parameter vector */ +{ + + register Tcl_Obj *valuePtr; + Tcl_WideInt wResult; + double d; + Tcl_Obj* oResult; + + if ( objc != 2 ) { + MathFuncWrongNumArgs( interp, 2, objc, objv ); + } else { + valuePtr = objv[1]; + if (VerifyExprObjType(interp, valuePtr) == TCL_OK) { + if (valuePtr->typePtr == &tclIntType) { + wResult = valuePtr->internalRep.longValue; + } else if (valuePtr->typePtr == &tclWideIntType) { + wResult = valuePtr->internalRep.wideValue; + } else { + d = valuePtr->internalRep.doubleValue; + if (d < 0.0) { + if (d < Tcl_WideAsDouble( LLONG_MIN ) ) { + tooLarge: + Tcl_SetObjResult(interp, Tcl_NewStringObj( + "integer value too large to represent", -1)); + Tcl_SetErrorCode(interp, "ARITH", "IOVERFLOW", + "integer value too large to represent", + (char *) NULL); + return TCL_ERROR; + } + } else { + if (d > Tcl_WideAsDouble( LLONG_MAX ) ) { + goto tooLarge; + } + } + if (IS_NAN(d) || IS_INF(d)) { + TclExprFloatError(interp, d); + return TCL_ERROR; + } + wResult = (Tcl_WideInt) d; + } + TclNewWideIntObj( oResult, wResult ); + Tcl_SetObjResult( interp, oResult ); + return TCL_OK; + } + } + return TCL_ERROR; +} + +static int +ExprRandFunc(clientData, interp, objc, objv) + ClientData clientData; /* Ignored. */ + Tcl_Interp *interp; /* The interpreter in which to execute the + * function. */ + int objc; /* Actual parameter count */ + Tcl_Obj *CONST *objv; /* Actual parameter vector */ +{ + Interp *iPtr = (Interp *) interp; + double dResult; + long tmp; /* Algorithm assumes at least 32 bits. + * Only long guarantees that. See below. */ + Tcl_Obj* oResult; + + if ( objc != 1 ) { + MathFuncWrongNumArgs( interp, 1, objc, objv ); + return TCL_ERROR; + } + + if (!(iPtr->flags & RAND_SEED_INITIALIZED)) { + iPtr->flags |= RAND_SEED_INITIALIZED; + + /* + * Take into consideration the thread this interp is running in order + * to insure different seeds in different threads (bug #416643) + */ + + iPtr->randSeed = TclpGetClicks() + ((long)Tcl_GetCurrentThread()<<12); + + /* + * Make sure 1 <= randSeed <= (2^31) - 2. See below. + */ + + iPtr->randSeed &= (unsigned long) 0x7fffffff; + if ((iPtr->randSeed == 0) || (iPtr->randSeed == 0x7fffffff)) { + iPtr->randSeed ^= 123459876; + } + } + + /* + * Generate the random number using the linear congruential + * generator defined by the following recurrence: + * seed = ( IA * seed ) mod IM + * where IA is 16807 and IM is (2^31) - 1. The recurrence maps + * a seed in the range [1, IM - 1] to a new seed in that same range. + * The recurrence maps IM to 0, and maps 0 back to 0, so those two + * values must not be allowed as initial values of seed. + * + * In order to avoid potential problems with integer overflow, the + * recurrence is implemented in terms of additional constants + * IQ and IR such that + * IM = IA*IQ + IR + * None of the operations in the implementation overflows a 32-bit + * signed integer, and the C type long is guaranteed to be at least + * 32 bits wide. + * + * For more details on how this algorithm works, refer to the following + * papers: + * + * S.K. Park & K.W. Miller, "Random number generators: good ones + * are hard to find," Comm ACM 31(10):1192-1201, Oct 1988 + * + * W.H. Press & S.A. Teukolsky, "Portable random number + * generators," Computers in Physics 6(5):522-524, Sep/Oct 1992. + */ + +#define RAND_IA 16807 +#define RAND_IM 2147483647 +#define RAND_IQ 127773 +#define RAND_IR 2836 +#define RAND_MASK 123459876 + + tmp = iPtr->randSeed/RAND_IQ; + iPtr->randSeed = RAND_IA*(iPtr->randSeed - tmp*RAND_IQ) - RAND_IR*tmp; + if (iPtr->randSeed < 0) { + iPtr->randSeed += RAND_IM; + } + + /* + * Since the recurrence keeps seed values in the range [1, RAND_IM - 1], + * dividing by RAND_IM yields a double in the range (0, 1). + */ + + dResult = iPtr->randSeed * (1.0/RAND_IM); + + /* + * Push a Tcl object with the result. + */ + + TclNewDoubleObj( oResult, dResult ); + Tcl_SetObjResult( interp, oResult ); + return TCL_OK; +} + +static int +ExprRoundFunc(clientData, interp, objc, objv) + ClientData clientData; /* Ignored. */ + Tcl_Interp *interp; /* The interpreter in which to execute the + * function. */ + int objc; /* Actual parameter count */ + Tcl_Obj *CONST *objv; /* Parameter vector */ +{ + Tcl_Obj *valuePtr, *resPtr; + double d, a, f; + + /* Check the argument count. */ + + if ( objc != 2 ) { + MathFuncWrongNumArgs( interp, 1, objc, objv ); + return TCL_ERROR; + } + valuePtr = objv[1]; + + /* Coerce the argument to a number. Integers are already rounded. */ + + if (VerifyExprObjType(interp, valuePtr) != TCL_OK) { + return TCL_ERROR; + } + if ((valuePtr->typePtr == &tclIntType) || + (valuePtr->typePtr == &tclWideIntType)) { + return TCL_OK; + } + GET_DOUBLE_VALUE( d, valuePtr, valuePtr->typePtr ); + + /* + * Round the number to the nearest integer. I'd like to use rint() + * or nearbyint(), but they are far from universal. + */ + + a = fabs( d ); + if ( a < Tcl_WideAsDouble( LLONG_MAX ) + 0.5 ) { + d = valuePtr->internalRep.doubleValue; + f = floor( d ); + d -= f; + if ( d > 0.5 || ( d == 0.5 && fmod( f, 2.0 ) != 0.0 ) ) { + f = f + 1.0; + } + if ( f >= (double) LONG_MIN && f <= (double) LONG_MAX ) { + TclNewLongObj( resPtr, (long) f ); + } else { + TclNewWideIntObj( resPtr, Tcl_DoubleAsWide( f ) ); + } + Tcl_SetObjResult( interp, resPtr ); + return TCL_OK; + } + + /* + * Error return: result cannot be represented as an integer. + */ + + Tcl_SetObjResult(interp, Tcl_NewStringObj( + "integer value too large to represent", -1)); + Tcl_SetErrorCode(interp, "ARITH", "IOVERFLOW", + "integer value too large to represent", + (char *) NULL); + + return TCL_ERROR; + +} + +static int +ExprSrandFunc(clientData, interp, objc, objv) + ClientData clientData; /* Ignored. */ + Tcl_Interp *interp; /* The interpreter in which to execute the + * function. */ + int objc; /* Actual parameter count */ + Tcl_Obj *CONST *objv; /* Parameter vector */ +{ + Interp *iPtr = (Interp *) interp; + Tcl_Obj *valuePtr; + long i = 0; /* Initialized to avoid compiler warning. */ + + /* + * Convert argument and use it to reset the seed. + */ + + if (objc != 2 ) { + MathFuncWrongNumArgs( interp, 2, objc, objv ); + return TCL_ERROR; + } + valuePtr = objv[1]; + + if (VerifyExprObjType(interp, valuePtr) != TCL_OK) { + return TCL_ERROR; + } + + if ( Tcl_GetLongFromObj( NULL, valuePtr, &i ) != TCL_OK ) { + /* + * At this point, the only other possible type is double + */ + Tcl_SetObjResult(interp, Tcl_NewStringObj( + "can't use floating-point value as argument to srand", -1)); + return TCL_ERROR; + } + + /* + * Reset the seed. Make sure 1 <= randSeed <= 2^31 - 2. + * See comments in ExprRandFunc() for more details. + */ + + iPtr->flags |= RAND_SEED_INITIALIZED; + iPtr->randSeed = i; + iPtr->randSeed &= (unsigned long) 0x7fffffff; + if ((iPtr->randSeed == 0) || (iPtr->randSeed == 0x7fffffff)) { + iPtr->randSeed ^= 123459876; + } + + /* + * To avoid duplicating the random number generation code we simply + * clean up our state and call the real random number function. That + * function will always succeed. + */ + + return ExprRandFunc(clientData, interp, 1, objv); + +} + +/* + *---------------------------------------------------------------------- + * + * VerifyExprObjType -- + * + * This procedure is called by the math functions to verify that + * the object is either an int or double, coercing it if necessary. + * If an error occurs during conversion, an error message is left + * in the interpreter's result unless "interp" is NULL. + * + * Results: + * TCL_OK if it was int or double, TCL_ERROR otherwise + * + * Side effects: + * objPtr is ensured to be of tclIntType, tclWideIntType or + * tclDoubleType. + * + *---------------------------------------------------------------------- + */ + +static int +VerifyExprObjType(interp, objPtr) + Tcl_Interp *interp; /* The interpreter in which to execute the + * function. */ + Tcl_Obj *objPtr; /* Points to the object to type check. */ +{ + if (IS_NUMERIC_TYPE(objPtr->typePtr)) { + return TCL_OK; + } else { + int length, result = TCL_OK; + char *s = Tcl_GetStringFromObj(objPtr, &length); + + if (TclLooksLikeInt(s, length)) { + long i; /* Set but never used, needed in GET_WIDE_OR_INT */ + Tcl_WideInt w; + GET_WIDE_OR_INT(result, objPtr, i, w); + } else { + double d; + result = Tcl_GetDoubleFromObj((Tcl_Interp *) NULL, objPtr, &d); + } + if ((result != TCL_OK) && (interp != NULL)) { + if (TclCheckBadOctal((Tcl_Interp *) NULL, s)) { + Tcl_SetObjResult(interp, Tcl_NewStringObj( + "argument to math function was an invalid octal number", + -1)); + } else { + Tcl_SetObjResult(interp, Tcl_NewStringObj( + "argument to math function didn't have numeric value", + -1)); + } + } + return result; + } +} + +/* + *---------------------------------------------------------------------- + * + * MathFuncWrongNumArgs -- + * + * Generate an error message when a math function presents the + * wrong number of arguments + * + * Results: + * None. + * + * Side effects: + * An error message is stored in the interpreter result + * + *---------------------------------------------------------------------- + */ + +static void +MathFuncWrongNumArgs( interp, expected, found, objv ) + Tcl_Interp* interp; /* Tcl interpreter */ + int expected; /* Formal parameter count */ + int found; /* Actual parameter count */ + Tcl_Obj *CONST *objv; /* Actual parameter vector */ +{ + Tcl_Obj* errorMessage; + CONST char* name = Tcl_GetString( objv[0] ); + CONST char* tail = name + strlen( name ); + while ( tail > name+1 ) { + --tail; + if ( *tail == ':' && tail[-1] == ':' ) { + name = tail+1; + break; + } + } + errorMessage = Tcl_NewStringObj( "too ", -1 ); + if ( found < expected ) { + Tcl_AppendToObj( errorMessage, "few", -1 ); + } else { + Tcl_AppendToObj( errorMessage, "many", -1 ); + } + Tcl_AppendToObj( errorMessage, " arguments for math function \"", -1 ); + Tcl_AppendToObj( errorMessage, name, -1 ); + Tcl_AppendToObj( errorMessage, "\"", -1 ); + Tcl_SetObjResult( interp, errorMessage ); +} diff --git a/generic/tclBinary.c b/generic/tclBinary.c index 1b613d8..706d1f0 100644 --- a/generic/tclBinary.c +++ b/generic/tclBinary.c @@ -10,7 +10,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclBinary.c,v 1.21 2004/10/06 05:52:21 dgp Exp $ + * RCS: @(#) $Id: tclBinary.c,v 1.22 2005/05/10 18:34:07 kennykb Exp $ */ #include "tclInt.h" @@ -1605,10 +1605,15 @@ FormatNumber(interp, type, src, cursorPtr) case 'Q': /* * Double-precision floating point values. + * Tcl_GetDoubleFromObj returns TCL_ERROR for NaN, but + * we can check by comparing the object's type pointer. */ if (Tcl_GetDoubleFromObj(interp, src, &dvalue) != TCL_OK) { - return TCL_ERROR; + if ( src->typePtr != &tclDoubleType ) { + return TCL_ERROR; + } + dvalue = src->internalRep.doubleValue; } CopyNumber(&dvalue, *cursorPtr, sizeof(double), type); *cursorPtr += sizeof(double); @@ -1619,10 +1624,14 @@ FormatNumber(interp, type, src, cursorPtr) case 'R': /* * Single-precision floating point values. + * Tcl_GetDoubleFromObj returns TCL_ERROR for NaN, but + * we can check by comparing the object's type pointer. */ if (Tcl_GetDoubleFromObj(interp, src, &dvalue) != TCL_OK) { - return TCL_ERROR; + if ( src->typePtr != &tclDoubleType ) { + return TCL_ERROR; + } } /* diff --git a/generic/tclCmdAH.c b/generic/tclCmdAH.c index eb57690..c3037bc 100644 --- a/generic/tclCmdAH.c +++ b/generic/tclCmdAH.c @@ -11,7 +11,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclCmdAH.c,v 1.60 2005/04/19 16:32:55 dgp Exp $ + * RCS: @(#) $Id: tclCmdAH.c,v 1.61 2005/05/10 18:34:08 kennykb Exp $ */ #include "tclInt.h" diff --git a/generic/tclCmdIL.c b/generic/tclCmdIL.c index 3b61959..7f67180 100644 --- a/generic/tclCmdIL.c +++ b/generic/tclCmdIL.c @@ -15,7 +15,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclCmdIL.c,v 1.73 2005/05/05 18:37:56 dgp Exp $ + * RCS: @(#) $Id: tclCmdIL.c,v 1.74 2005/05/10 18:34:08 kennykb Exp $ */ #include "tclInt.h" diff --git a/generic/tclCmdMZ.c b/generic/tclCmdMZ.c index 18da3f4..aee76d3 100644 --- a/generic/tclCmdMZ.c +++ b/generic/tclCmdMZ.c @@ -15,7 +15,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclCmdMZ.c,v 1.117 2005/04/29 20:49:43 dgp Exp $ + * RCS: @(#) $Id: tclCmdMZ.c,v 1.118 2005/05/10 18:34:08 kennykb Exp $ */ #include "tclInt.h" @@ -1536,17 +1536,8 @@ Tcl_StringObjCmd(dummy, interp, objc, objv) } } errno = 0; - strtod(string1, &stop); /* INTL: Tcl source. */ - if (errno == ERANGE) { - /* - * if (errno == ERANGE), then it was an over/underflow - * problem, but in this method, we only want to know - * yes or no, so bad flow returns 0 (false) and sets - * the failVarObj to the string length. - */ - result = 0; - failat = -1; - } else if (stop == string1) { + TclStrToD(string1, (CONST char **) &stop); /* INTL: Tcl source. */ + if (stop == string1) { /* * In this case, nothing like a number was found */ diff --git a/generic/tclCompCmds.c b/generic/tclCompCmds.c index bd0c4b7..da77439 100644 --- a/generic/tclCompCmds.c +++ b/generic/tclCompCmds.c @@ -11,7 +11,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclCompCmds.c,v 1.67 2005/05/05 18:37:57 dgp Exp $ + * RCS: @(#) $Id: tclCompCmds.c,v 1.68 2005/05/10 18:34:09 kennykb Exp $ */ #include "tclInt.h" diff --git a/generic/tclCompExpr.c b/generic/tclCompExpr.c index e25160d..e378ef6 100644 --- a/generic/tclCompExpr.c +++ b/generic/tclCompExpr.c @@ -9,7 +9,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclCompExpr.c,v 1.25 2004/10/08 15:39:52 dkf Exp $ + * RCS: @(#) $Id: tclCompExpr.c,v 1.26 2005/05/10 18:34:11 kennykb Exp $ */ #include "tclInt.h" @@ -828,95 +828,54 @@ CompileMathFuncCall(exprTokenPtr, funcName, infoPtr, envPtr, endPtrPtr) * just after the last token in the * subexpression is stored here. */ { - Tcl_Interp *interp = infoPtr->interp; - Interp *iPtr = (Interp *) interp; - MathFunc *mathFuncPtr; - Tcl_HashEntry *hPtr; + Tcl_DString cmdName; + int objIndex; Tcl_Token *tokenPtr, *afterSubexprPtr; - int code, i; - - /* - * Look up the MathFunc record for the function. - */ - - code = TCL_OK; - hPtr = Tcl_FindHashEntry(&iPtr->mathFuncTable, funcName); - if (hPtr == NULL) { - Tcl_AppendResult(interp, "unknown math function \"", funcName, - "\"", (char *) NULL); - code = TCL_ERROR; - goto done; - } - mathFuncPtr = (MathFunc *) Tcl_GetHashValue(hPtr); - + int argCount; + int code = TCL_OK; + /* - * If not a builtin function, push an object with the function's name. + * Prepend "tcl::mathfunc::" to the function name, to produce the + * name of a command that evaluates the function. Push that + * command name on the stack, in a literal registered to the + * namespace so that resolution can be cached. */ - if (mathFuncPtr->builtinFuncIndex < 0) { - TclEmitPush(TclRegisterNewLiteral(envPtr, funcName, -1), envPtr); - } + Tcl_DStringInit( &cmdName ); + Tcl_DStringAppend( &cmdName, "tcl::mathfunc::", -1 ); + Tcl_DStringAppend( &cmdName, funcName, -1 ); + objIndex = TclRegisterNewNSLiteral( envPtr, + Tcl_DStringValue( &cmdName ), + Tcl_DStringLength( &cmdName ) ); + TclEmitPush( objIndex, envPtr ); + Tcl_DStringFree( &cmdName ); /* * Compile any arguments for the function. */ + argCount = 1; tokenPtr = exprTokenPtr+2; afterSubexprPtr = exprTokenPtr + (exprTokenPtr->numComponents + 1); - if (mathFuncPtr->numArgs > 0) { - for (i = 0; i < mathFuncPtr->numArgs; i++) { - if (tokenPtr == afterSubexprPtr) { - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "too few arguments for math function", -1)); - code = TCL_ERROR; - goto done; - } - code = CompileSubExpr(tokenPtr, infoPtr, envPtr); - if (code != TCL_OK) { - goto done; - } - tokenPtr += (tokenPtr->numComponents + 1); + while (tokenPtr != afterSubexprPtr) { + ++argCount; + code = CompileSubExpr(tokenPtr, infoPtr, envPtr); + if (code != TCL_OK) { + return code; } - if (tokenPtr != afterSubexprPtr) { - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "too many arguments for math function", -1)); - code = TCL_ERROR; - goto done; - } - } else if (tokenPtr != afterSubexprPtr) { - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "too many arguments for math function", -1)); - code = TCL_ERROR; - goto done; + tokenPtr += (tokenPtr->numComponents + 1); } - /* - * Compile the call on the math function. Note that the "objc" argument - * count for non-builtin functions is incremented by 1 to include the - * function name itself. - */ + /* Invoke the function */ - if (mathFuncPtr->builtinFuncIndex >= 0) { /* a builtin function */ - /* - * Adjust the current stack depth by the number of arguments - * of the builtin function. This cannot be handled by the - * TclEmitInstInt1 macro as the number of arguments is not - * passed as an operand. - */ - - if (envPtr->maxStackDepth < envPtr->currStackDepth) { - envPtr->maxStackDepth = envPtr->currStackDepth; - } - TclEmitInstInt1(INST_CALL_BUILTIN_FUNC1, - mathFuncPtr->builtinFuncIndex, envPtr); - envPtr->currStackDepth -= mathFuncPtr->numArgs; + if ( argCount < 255 ) { + TclEmitInstInt1( INST_INVOKE_STK1, argCount, envPtr ); } else { - TclEmitInstInt1(INST_CALL_FUNC1, (mathFuncPtr->numArgs+1), envPtr); + TclEmitInstInt4( INST_INVOKE_STK4, argCount, envPtr ); } - *endPtrPtr = afterSubexprPtr; - done: - return code; + *endPtrPtr = afterSubexprPtr; + return TCL_OK; } /* diff --git a/generic/tclCompile.c b/generic/tclCompile.c index 47b6831..f67fea6 100644 --- a/generic/tclCompile.c +++ b/generic/tclCompile.c @@ -11,7 +11,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclCompile.c,v 1.84 2005/05/05 15:32:20 dgp Exp $ + * RCS: @(#) $Id: tclCompile.c,v 1.85 2005/05/10 18:34:11 kennykb Exp $ */ #include "tclInt.h" diff --git a/generic/tclCompile.h b/generic/tclCompile.h index 896b385..ab34f81 100644 --- a/generic/tclCompile.h +++ b/generic/tclCompile.h @@ -8,7 +8,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclCompile.h,v 1.54 2005/03/25 00:35:03 dgp Exp $ + * RCS: @(#) $Id: tclCompile.h,v 1.55 2005/05/10 18:34:27 kennykb Exp $ */ #ifndef _TCLCOMPILATION @@ -591,64 +591,6 @@ typedef struct InstructionDesc { MODULE_SCOPE InstructionDesc tclInstructionTable[]; /* - * Definitions of the values of the INST_CALL_BUILTIN_FUNC instruction's - * operand byte. Each value denotes a builtin Tcl math function. These - * values must correspond to the entries in the tclBuiltinFuncTable array - * below and to the values stored in the tclInt.h MathFunc structure's - * builtinFuncIndex field. - */ - -#define BUILTIN_FUNC_ACOS 0 -#define BUILTIN_FUNC_ASIN 1 -#define BUILTIN_FUNC_ATAN 2 -#define BUILTIN_FUNC_ATAN2 3 -#define BUILTIN_FUNC_CEIL 4 -#define BUILTIN_FUNC_COS 5 -#define BUILTIN_FUNC_COSH 6 -#define BUILTIN_FUNC_EXP 7 -#define BUILTIN_FUNC_FLOOR 8 -#define BUILTIN_FUNC_FMOD 9 -#define BUILTIN_FUNC_HYPOT 10 -#define BUILTIN_FUNC_LOG 11 -#define BUILTIN_FUNC_LOG10 12 -#define BUILTIN_FUNC_POW 13 -#define BUILTIN_FUNC_SIN 14 -#define BUILTIN_FUNC_SINH 15 -#define BUILTIN_FUNC_SQRT 16 -#define BUILTIN_FUNC_TAN 17 -#define BUILTIN_FUNC_TANH 18 -#define BUILTIN_FUNC_ABS 19 -#define BUILTIN_FUNC_DOUBLE 20 -#define BUILTIN_FUNC_INT 21 -#define BUILTIN_FUNC_RAND 22 -#define BUILTIN_FUNC_ROUND 23 -#define BUILTIN_FUNC_SRAND 24 -#define BUILTIN_FUNC_WIDE 25 - -#define LAST_BUILTIN_FUNC 25 - -/* - * Table describing the built-in math functions. Entries in this table are - * indexed by the values of the INST_CALL_BUILTIN_FUNC instruction's - * operand byte. - */ - -typedef int (CallBuiltinFuncProc) _ANSI_ARGS_((Tcl_Interp *interp, - Tcl_Obj **tosPtr, ClientData clientData)); - -typedef struct { - char *name; /* Name of function. */ - int numArgs; /* Number of arguments for function. */ - Tcl_ValueType argTypes[MAX_MATH_ARGS]; - /* Acceptable types for each argument. */ - CallBuiltinFuncProc *proc; /* Procedure implementing this function. */ - ClientData clientData; /* Additional argument to pass to the - * function when invoking it. */ -} BuiltinFunc; - -MODULE_SCOPE BuiltinFunc tclBuiltinFuncTable[]; - -/* * Compilation of some Tcl constructs such as if commands and the logical or * (||) and logical and (&&) operators in expressions requires the * generation of forward jumps. Since the PC target of these jumps isn't diff --git a/generic/tclConfig.c b/generic/tclConfig.c index 4172fdb..f9c6dda 100644 --- a/generic/tclConfig.c +++ b/generic/tclConfig.c @@ -9,7 +9,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclConfig.c,v 1.7 2005/04/02 02:08:32 msofer Exp $ + * RCS: @(#) $Id: tclConfig.c,v 1.8 2005/05/10 18:34:28 kennykb Exp $ */ #include "tclInt.h" diff --git a/generic/tclDecls.h b/generic/tclDecls.h index 0ec588f..7ab10d3 100644 --- a/generic/tclDecls.h +++ b/generic/tclDecls.h @@ -8,7 +8,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclDecls.h,v 1.112 2005/05/03 18:07:47 dgp Exp $ + * RCS: @(#) $Id: tclDecls.h,v 1.113 2005/05/10 18:34:28 kennykb Exp $ */ #ifndef _TCLDECLS @@ -3461,6 +3461,29 @@ EXTERN void Tcl_QueryTimeProc _ANSI_ARGS_(( EXTERN Tcl_DriverThreadActionProc * Tcl_ChannelThreadActionProc _ANSI_ARGS_(( Tcl_ChannelType * chanTypePtr)); #endif +#ifndef Tcl_NewBignumObj_TCL_DECLARED +#define Tcl_NewBignumObj_TCL_DECLARED +/* 555 */ +EXTERN Tcl_Obj* Tcl_NewBignumObj _ANSI_ARGS_((mp_int* value)); +#endif +#ifndef Tcl_DbNewBignumObj_TCL_DECLARED +#define Tcl_DbNewBignumObj_TCL_DECLARED +/* 556 */ +EXTERN Tcl_Obj* Tcl_DbNewBignumObj _ANSI_ARGS_((mp_int* value, + CONST char* file, int line)); +#endif +#ifndef Tcl_SetBignumObj_TCL_DECLARED +#define Tcl_SetBignumObj_TCL_DECLARED +/* 557 */ +EXTERN void Tcl_SetBignumObj _ANSI_ARGS_((Tcl_Obj* obj, + mp_int* value)); +#endif +#ifndef Tcl_GetBignumFromObj_TCL_DECLARED +#define Tcl_GetBignumFromObj_TCL_DECLARED +/* 558 */ +EXTERN int Tcl_GetBignumFromObj _ANSI_ARGS_((Tcl_Interp* interp, + Tcl_Obj* obj, mp_int* value)); +#endif typedef struct TclStubHooks { struct TclPlatStubs *tclPlatStubs; @@ -4057,6 +4080,10 @@ typedef struct TclStubs { void (*tcl_SetTimeProc) _ANSI_ARGS_((Tcl_GetTimeProc* getProc, Tcl_ScaleTimeProc* scaleProc, ClientData clientData)); /* 552 */ void (*tcl_QueryTimeProc) _ANSI_ARGS_((Tcl_GetTimeProc** getProc, Tcl_ScaleTimeProc** scaleProc, ClientData* clientData)); /* 553 */ Tcl_DriverThreadActionProc * (*tcl_ChannelThreadActionProc) _ANSI_ARGS_((Tcl_ChannelType * chanTypePtr)); /* 554 */ + Tcl_Obj* (*tcl_NewBignumObj) _ANSI_ARGS_((mp_int* value)); /* 555 */ + Tcl_Obj* (*tcl_DbNewBignumObj) _ANSI_ARGS_((mp_int* value, CONST char* file, int line)); /* 556 */ + void (*tcl_SetBignumObj) _ANSI_ARGS_((Tcl_Obj* obj, mp_int* value)); /* 557 */ + int (*tcl_GetBignumFromObj) _ANSI_ARGS_((Tcl_Interp* interp, Tcl_Obj* obj, mp_int* value)); /* 558 */ } TclStubs; #ifdef __cplusplus @@ -6317,6 +6344,22 @@ extern TclStubs *tclStubsPtr; #define Tcl_ChannelThreadActionProc \ (tclStubsPtr->tcl_ChannelThreadActionProc) /* 554 */ #endif +#ifndef Tcl_NewBignumObj +#define Tcl_NewBignumObj \ + (tclStubsPtr->tcl_NewBignumObj) /* 555 */ +#endif +#ifndef Tcl_DbNewBignumObj +#define Tcl_DbNewBignumObj \ + (tclStubsPtr->tcl_DbNewBignumObj) /* 556 */ +#endif +#ifndef Tcl_SetBignumObj +#define Tcl_SetBignumObj \ + (tclStubsPtr->tcl_SetBignumObj) /* 557 */ +#endif +#ifndef Tcl_GetBignumFromObj +#define Tcl_GetBignumFromObj \ + (tclStubsPtr->tcl_GetBignumFromObj) /* 558 */ +#endif #endif /* defined(USE_TCL_STUBS) && !defined(USE_TCL_STUB_PROCS) */ diff --git a/generic/tclDictObj.c b/generic/tclDictObj.c index 1dc87d4..5c40825 100644 --- a/generic/tclDictObj.c +++ b/generic/tclDictObj.c @@ -9,7 +9,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclDictObj.c,v 1.30 2005/05/05 18:37:58 dgp Exp $ + * RCS: @(#) $Id: tclDictObj.c,v 1.31 2005/05/10 18:34:34 kennykb Exp $ */ #include "tclInt.h" diff --git a/generic/tclEncoding.c b/generic/tclEncoding.c index 13c517b..646713d 100644 --- a/generic/tclEncoding.c +++ b/generic/tclEncoding.c @@ -8,7 +8,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclEncoding.c,v 1.34 2005/04/12 20:28:46 dgp Exp $ + * RCS: @(#) $Id: tclEncoding.c,v 1.35 2005/05/10 18:34:34 kennykb Exp $ */ #include "tclInt.h" diff --git a/generic/tclEnv.c b/generic/tclEnv.c index e4d7b23..4ceb4fb 100644 --- a/generic/tclEnv.c +++ b/generic/tclEnv.c @@ -12,7 +12,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclEnv.c,v 1.23 2005/05/03 18:08:17 dgp Exp $ + * RCS: @(#) $Id: tclEnv.c,v 1.24 2005/05/10 18:34:34 kennykb Exp $ */ #include "tclInt.h" diff --git a/generic/tclEvent.c b/generic/tclEvent.c index 8d4533ec..6e2a4df 100644 --- a/generic/tclEvent.c +++ b/generic/tclEvent.c @@ -12,7 +12,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclEvent.c,v 1.56 2004/12/16 19:36:17 dkf Exp $ + * RCS: @(#) $Id: tclEvent.c,v 1.57 2005/05/10 18:34:35 kennykb Exp $ */ #include "tclInt.h" @@ -798,6 +798,8 @@ TclInitSubsystems() #endif TclpInitPlatform(); /* creates signal handler(s) */ + TclInitDoubleConversion(); /* initializes constants for + * converting to/from double */ TclInitObjSubsystem(); /* register obj types, create mutexes */ TclInitIOSubsystem(); /* inits a tsd key (noop) */ TclInitEncodingSubsystem(); /* process wide encoding init */ @@ -938,6 +940,10 @@ Tcl_Finalize() TclFinalizeLoad(); TclResetFilesystem(); + + /* Now we can free constants for conversions to/from double */ + + TclFinalizeDoubleConversion(); /* * There shouldn't be any malloc'ed memory after this. diff --git a/generic/tclExecute.c b/generic/tclExecute.c index ad91579..3333c79 100644 --- a/generic/tclExecute.c +++ b/generic/tclExecute.c @@ -11,7 +11,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclExecute.c,v 1.187 2005/05/10 10:02:16 msofer Exp $ + * RCS: @(#) $Id: tclExecute.c,v 1.188 2005/05/10 18:34:35 kennykb Exp $ */ #include "tclInt.h" @@ -20,6 +20,18 @@ #ifndef TCL_NO_MATH # include <math.h> #endif +#include <float.h> + +/* + * Hack to determine whether we may expect IEEE floating point. + * The hack is formally incorrect in that non-IEEE platforms might + * have the same precision and range, but VAX, IBM, and Cray do not; + * are there any other floating point units that we might care about? + */ + +#if ( FLT_RADIX == 2 ) && ( DBL_MANT_DIG == 53 ) && ( DBL_MAX_EXP == 1024 ) +#define IEEE_FLOATING_POINT +#endif /* * The stuff below is a bit of a hack so that this file can be used @@ -136,8 +148,13 @@ long tclObjsShared[TCL_MAX_SHARED_OBJ_STATS] = { 0, 0, 0, 0, 0 }; * by comparing against the largest floating-point value. */ -#define IS_NAN(v) ((v) != (v)) -#define IS_INF(v) (((v) > DBL_MAX) || ((v) < -DBL_MAX)) +#ifdef _MSC_VER +#define IS_NAN(f) (_isnan((f))) +#define IS_INF(f) ( ! (_finite((f)))) +#else +#define IS_NAN(f) ((f) != (f)) +#define IS_INF(f) ( (f) > DBL_MAX || (f) < -DBL_MAX ) +#endif /* * The new macro for ending an instruction; note that a @@ -345,26 +362,6 @@ long tclObjsShared[TCL_MAX_SHARED_OBJ_STATS] = { 0, 0, 0, 0, 0 }; static int TclExecuteByteCode _ANSI_ARGS_((Tcl_Interp *interp, ByteCode *codePtr)); -static int ExprAbsFunc _ANSI_ARGS_((Tcl_Interp *interp, - Tcl_Obj **tosPtr, ClientData clientData)); -static int ExprBinaryFunc _ANSI_ARGS_((Tcl_Interp *interp, - Tcl_Obj **tosPtr, ClientData clientData)); -static int ExprCallMathFunc _ANSI_ARGS_((Tcl_Interp *interp, - int objc, Tcl_Obj **objv)); -static int ExprDoubleFunc _ANSI_ARGS_((Tcl_Interp *interp, - Tcl_Obj **tosPtr, ClientData clientData)); -static int ExprIntFunc _ANSI_ARGS_((Tcl_Interp *interp, - Tcl_Obj **tosPtr, ClientData clientData)); -static int ExprRandFunc _ANSI_ARGS_((Tcl_Interp *interp, - Tcl_Obj **tosPtr, ClientData clientData)); -static int ExprRoundFunc _ANSI_ARGS_((Tcl_Interp *interp, - Tcl_Obj **tosPtr, ClientData clientData)); -static int ExprSrandFunc _ANSI_ARGS_((Tcl_Interp *interp, - Tcl_Obj **tosPtr, ClientData clientData)); -static int ExprUnaryFunc _ANSI_ARGS_((Tcl_Interp *interp, - Tcl_Obj **tosPtr, ClientData clientData)); -static int ExprWideFunc _ANSI_ARGS_((Tcl_Interp *interp, - Tcl_Obj **tosPtr, ClientData clientData)); #ifdef TCL_COMPILE_STATS static int EvalStatsCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int objc, @@ -391,50 +388,11 @@ static void ValidatePcAndStackTop _ANSI_ARGS_(( int stackTop, int stackLowerBound, int checkStack)); #endif /* TCL_COMPILE_DEBUG */ -static int VerifyExprObjType _ANSI_ARGS_((Tcl_Interp *interp, - Tcl_Obj *objPtr)); static Tcl_WideInt ExponWide _ANSI_ARGS_((Tcl_WideInt w, Tcl_WideInt w2, int *errExpon)); static long ExponLong _ANSI_ARGS_((long i, long i2, int *errExpon)); -/* - * Table describing the built-in math functions. Entries in this table are - * indexed by the values of the INST_CALL_BUILTIN_FUNC instruction's - * operand byte. - */ - -BuiltinFunc tclBuiltinFuncTable[] = { -#ifndef TCL_NO_MATH - {"acos", 1, {TCL_DOUBLE}, ExprUnaryFunc, (ClientData) acos}, - {"asin", 1, {TCL_DOUBLE}, ExprUnaryFunc, (ClientData) asin}, - {"atan", 1, {TCL_DOUBLE}, ExprUnaryFunc, (ClientData) atan}, - {"atan2", 2, {TCL_DOUBLE, TCL_DOUBLE}, ExprBinaryFunc, (ClientData) atan2}, - {"ceil", 1, {TCL_DOUBLE}, ExprUnaryFunc, (ClientData) ceil}, - {"cos", 1, {TCL_DOUBLE}, ExprUnaryFunc, (ClientData) cos}, - {"cosh", 1, {TCL_DOUBLE}, ExprUnaryFunc, (ClientData) cosh}, - {"exp", 1, {TCL_DOUBLE}, ExprUnaryFunc, (ClientData) exp}, - {"floor", 1, {TCL_DOUBLE}, ExprUnaryFunc, (ClientData) floor}, - {"fmod", 2, {TCL_DOUBLE, TCL_DOUBLE}, ExprBinaryFunc, (ClientData) fmod}, - {"hypot", 2, {TCL_DOUBLE, TCL_DOUBLE}, ExprBinaryFunc, (ClientData) hypot}, - {"log", 1, {TCL_DOUBLE}, ExprUnaryFunc, (ClientData) log}, - {"log10", 1, {TCL_DOUBLE}, ExprUnaryFunc, (ClientData) log10}, - {"pow", 2, {TCL_DOUBLE, TCL_DOUBLE}, ExprBinaryFunc, (ClientData) pow}, - {"sin", 1, {TCL_DOUBLE}, ExprUnaryFunc, (ClientData) sin}, - {"sinh", 1, {TCL_DOUBLE}, ExprUnaryFunc, (ClientData) sinh}, - {"sqrt", 1, {TCL_DOUBLE}, ExprUnaryFunc, (ClientData) sqrt}, - {"tan", 1, {TCL_DOUBLE}, ExprUnaryFunc, (ClientData) tan}, - {"tanh", 1, {TCL_DOUBLE}, ExprUnaryFunc, (ClientData) tanh}, -#endif - {"abs", 1, {TCL_EITHER}, ExprAbsFunc, 0}, - {"double", 1, {TCL_EITHER}, ExprDoubleFunc, 0}, - {"int", 1, {TCL_EITHER}, ExprIntFunc, 0}, - {"rand", 0, {TCL_EITHER}, ExprRandFunc, 0}, /* NOTE: rand takes no args. */ - {"round", 1, {TCL_EITHER}, ExprRoundFunc, 0}, - {"srand", 1, {TCL_INT}, ExprSrandFunc, 0}, - {"wide", 1, {TCL_EITHER}, ExprWideFunc, 0}, - {0}, -}; /* *---------------------------------------------------------------------- @@ -4023,10 +3981,18 @@ TclExecuteByteCode(interp, codePtr) dResult = d1 * d2; break; case INST_DIV: +#ifndef IEEE_FLOATING_POINT if (d2 == 0.0) { TRACE(("%.6g %.6g => DIVIDE BY ZERO\n", d1, d2)); goto divideByZero; } +#endif + /* + * We presume that we are running with zero-divide + * unmasked if we're on an IEEE box. Otherwise, + * this statement might cause demons to fly out + * our noses. + */ dResult = d1 / d2; break; case INST_EXPON: @@ -4042,7 +4008,7 @@ TclExecuteByteCode(interp, codePtr) * Check now for IEEE floating-point error. */ - if (IS_NAN(dResult) || IS_INF(dResult)) { + if (IS_NAN(dResult)) { TRACE(("%.20s %.20s => IEEE FLOATING PT ERROR\n", O2S(valuePtr), O2S(value2Ptr))); TclExprFloatError(interp, dResult); @@ -4430,53 +4396,13 @@ TclExecuteByteCode(interp, codePtr) case INST_CALL_BUILTIN_FUNC1: { - int opnd; - BuiltinFunc *mathFuncPtr; - - /* - * Call one of the built-in Tcl math functions. - */ - - opnd = TclGetUInt1AtPtr(pc+1); - if ((opnd < 0) || (opnd > LAST_BUILTIN_FUNC)) { - TRACE(("UNRECOGNIZED BUILTIN FUNC CODE %d\n", opnd)); - Tcl_Panic("TclExecuteByteCode: unrecognized builtin function code %d", opnd); - } - mathFuncPtr = &(tclBuiltinFuncTable[opnd]); - result = (*mathFuncPtr->proc)(interp, tosPtr, - mathFuncPtr->clientData); - if (result != TCL_OK) { - goto checkForCatch; - } - tosPtr -= (mathFuncPtr->numArgs - 1); - TRACE_WITH_OBJ(("%d => ", opnd), *tosPtr); + Tcl_Panic("TclExecuteByteCode: obsolete INST_CALL_BUILTIN_FUNC1 found"); } - NEXT_INST_F(2, 0, 0); case INST_CALL_FUNC1: { - /* - * Call a non-builtin Tcl math function previously - * registered by a call to Tcl_CreateMathFunc. - */ - - int objc; /* Number of arguments. The function name - * is the 0-th argument. */ - Tcl_Obj **objv; /* The array of arguments. The function - * name is objv[0]. */ - - objc = TclGetUInt1AtPtr(pc+1); - objv = (tosPtr - (objc-1)); /* "objv[0]" */ - DECACHE_STACK_INFO(); - result = ExprCallMathFunc(interp, objc, objv); - CACHE_STACK_INFO(); - if (result != TCL_OK) { - goto checkForCatch; - } - tosPtr = objv; - TRACE_WITH_OBJ(("%d => ", objc), *tosPtr); + Tcl_Panic("TclExecuteByteCode: obsolete INST_CALL_FUNC1 found"); } - NEXT_INST_F(2, 0, 0); case INST_TRY_CVT_TO_NUMERIC: { @@ -4569,7 +4495,7 @@ TclExecuteByteCode(interp, codePtr) if (tPtr == &tclDoubleType) { d = objResultPtr->internalRep.doubleValue; - if (IS_NAN(d) || IS_INF(d)) { + if (IS_NAN(d)) { TRACE(("\"%.20s\" => IEEE FLOATING PT ERROR\n", O2S(objResultPtr))); TclExprFloatError(interp, d); @@ -5594,765 +5520,6 @@ GetOpcodeName(pc) /* *---------------------------------------------------------------------- * - * VerifyExprObjType -- - * - * This procedure is called by the math functions to verify that - * the object is either an int or double, coercing it if necessary. - * If an error occurs during conversion, an error message is left - * in the interpreter's result unless "interp" is NULL. - * - * Results: - * TCL_OK if it was int or double, TCL_ERROR otherwise - * - * Side effects: - * objPtr is ensured to be of tclIntType, tclWideIntType or - * tclDoubleType. - * - *---------------------------------------------------------------------- - */ - -static int -VerifyExprObjType(interp, objPtr) - Tcl_Interp *interp; /* The interpreter in which to execute the - * function. */ - Tcl_Obj *objPtr; /* Points to the object to type check. */ -{ - if (IS_NUMERIC_TYPE(objPtr->typePtr)) { - return TCL_OK; - } else { - int length, result = TCL_OK; - char *s = Tcl_GetStringFromObj(objPtr, &length); - - if (TclLooksLikeInt(s, length)) { - long i; /* Set but never used, needed in GET_WIDE_OR_INT */ - Tcl_WideInt w; - GET_WIDE_OR_INT(result, objPtr, i, w); - } else { - double d; - result = Tcl_GetDoubleFromObj((Tcl_Interp *) NULL, objPtr, &d); - } - if ((result != TCL_OK) && (interp != NULL)) { - if (TclCheckBadOctal((Tcl_Interp *) NULL, s)) { - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "argument to math function was an invalid octal number", - -1)); - } else { - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "argument to math function didn't have numeric value", - -1)); - } - } - return result; - } -} - -/* - *---------------------------------------------------------------------- - * - * Math Functions -- - * - * This page contains the procedures that implement all of the - * built-in math functions for expressions. - * - * Results: - * Each procedure returns TCL_OK if it succeeds and pushes an - * Tcl object holding the result. If it fails it returns TCL_ERROR - * and leaves an error message in the interpreter's result. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -static int -ExprUnaryFunc(interp, tosPtr, clientData) - Tcl_Interp *interp; /* The interpreter in which to execute the - * function. */ - Tcl_Obj **tosPtr; /* Points to top of evaluation stack. */ - ClientData clientData; /* Contains the address of a procedure that - * takes one double argument and returns a - * double result. */ -{ - register Tcl_Obj *valuePtr, *resPtr; - double d, dResult; - - double (*func) _ANSI_ARGS_((double)) = - (double (*)_ANSI_ARGS_((double))) clientData; - - /* - * Pop the function's argument from the evaluation stack. Convert it - * to a double if necessary. - */ - - valuePtr = POP_OBJECT(); - - if (VerifyExprObjType(interp, valuePtr) != TCL_OK) { - return TCL_ERROR; - } - - GET_DOUBLE_VALUE(d, valuePtr, valuePtr->typePtr); - - errno = 0; - dResult = (*func)(d); - if ((errno != 0) || IS_NAN(dResult) || IS_INF(dResult)) { - TclExprFloatError(interp, dResult); - return TCL_ERROR; - } - - /* - * Push a Tcl object holding the result. - */ - - TclNewDoubleObj(resPtr, dResult); - PUSH_OBJECT(resPtr); - TclDecrRefCount(valuePtr); - return TCL_OK; -} - -static int -ExprBinaryFunc(interp, tosPtr, clientData) - Tcl_Interp *interp; /* The interpreter in which to execute the - * function. */ - Tcl_Obj **tosPtr; /* Points to top of evaluation stack. */ - ClientData clientData; /* Contains the address of a procedure that - * takes two double arguments and - * returns a double result. */ -{ - register Tcl_Obj *valuePtr, *value2Ptr, *resPtr; - double d1, d2, dResult; - - double (*func) _ANSI_ARGS_((double, double)) - = (double (*)_ANSI_ARGS_((double, double))) clientData; - - /* - * Pop the function's two arguments from the evaluation stack. Convert - * them to doubles if necessary. - */ - - value2Ptr = POP_OBJECT(); - valuePtr = POP_OBJECT(); - - if ((VerifyExprObjType(interp, valuePtr) != TCL_OK) || - (VerifyExprObjType(interp, value2Ptr) != TCL_OK)) { - return TCL_ERROR; - } - - GET_DOUBLE_VALUE(d1, valuePtr, valuePtr->typePtr); - GET_DOUBLE_VALUE(d2, value2Ptr, value2Ptr->typePtr); - - errno = 0; - dResult = (*func)(d1, d2); - if ((errno != 0) || IS_NAN(dResult) || IS_INF(dResult)) { - TclExprFloatError(interp, dResult); - return TCL_ERROR; - } - - /* - * Push a Tcl object holding the result. - */ - - TclNewDoubleObj(resPtr, dResult); - PUSH_OBJECT(resPtr); - TclDecrRefCount(valuePtr); - TclDecrRefCount(value2Ptr); - return TCL_OK; -} - -static int -ExprAbsFunc(interp, tosPtr, clientData) - Tcl_Interp *interp; /* The interpreter in which to execute the - * function. */ - Tcl_Obj **tosPtr; /* Points to top of evaluation stack. */ - ClientData clientData; /* Ignored. */ -{ - register Tcl_Obj *valuePtr, *resPtr; - long i, iResult; - double d, dResult; - - /* - * Pop the argument from the evaluation stack. - */ - - valuePtr = POP_OBJECT(); - - if (VerifyExprObjType(interp, valuePtr) != TCL_OK) { - return TCL_ERROR; - } - - /* - * Push a Tcl object with the result. - */ - if (valuePtr->typePtr == &tclIntType) { - i = valuePtr->internalRep.longValue; - if (i < 0) { - iResult = -i; - if (iResult < 0) { - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "integer value too large to represent", -1)); - Tcl_SetErrorCode(interp, "ARITH", "IOVERFLOW", - "integer value too large to represent", (char *) NULL); - return TCL_ERROR; - } - } else { - iResult = i; - } - TclNewLongObj(resPtr, iResult); - PUSH_OBJECT(resPtr); - } else if (valuePtr->typePtr == &tclWideIntType) { - Tcl_WideInt wResult, w; - TclGetWide(w,valuePtr); - if (w < W0) { - wResult = -w; - if (wResult < 0) { - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "integer value too large to represent", -1)); - Tcl_SetErrorCode(interp, "ARITH", "IOVERFLOW", - "integer value too large to represent", (char *) NULL); - return TCL_ERROR; - } - } else { - wResult = w; - } - TclNewWideIntObj(resPtr, wResult); - PUSH_OBJECT(resPtr); - } else { - d = valuePtr->internalRep.doubleValue; - if (d < 0.0) { - dResult = -d; - } else { - dResult = d; - } - if (IS_NAN(dResult) || IS_INF(dResult)) { - TclExprFloatError(interp, dResult); - return TCL_ERROR; - } - TclNewDoubleObj(resPtr, dResult); - PUSH_OBJECT(resPtr); - } - - TclDecrRefCount(valuePtr); - return TCL_OK; -} - -static int -ExprDoubleFunc(interp, tosPtr, clientData) - Tcl_Interp *interp; /* The interpreter in which to execute the - * function. */ - Tcl_Obj **tosPtr; /* Points to top of evaluation stack. */ - ClientData clientData; /* Ignored. */ -{ - register Tcl_Obj *valuePtr, *resPtr; - double dResult; - - /* - * Pop the argument from the evaluation stack. - */ - - valuePtr = POP_OBJECT(); - - if (VerifyExprObjType(interp, valuePtr) != TCL_OK) { - return TCL_ERROR; - } - - GET_DOUBLE_VALUE(dResult, valuePtr, valuePtr->typePtr); - - /* - * Push a Tcl object with the result. - */ - - TclNewDoubleObj(resPtr, dResult); - PUSH_OBJECT(resPtr); - - TclDecrRefCount(valuePtr); - return TCL_OK; -} - -static int -ExprIntFunc(interp, tosPtr, clientData) - Tcl_Interp *interp; /* The interpreter in which to execute the - * function. */ - Tcl_Obj **tosPtr; /* Points to top of evaluation stack. */ - ClientData clientData; /* Ignored. */ -{ - register Tcl_Obj *valuePtr, *resPtr; - long iResult; - double d; - - /* - * Pop the argument from the evaluation stack. - */ - - valuePtr = POP_OBJECT(); - - if (VerifyExprObjType(interp, valuePtr) != TCL_OK) { - return TCL_ERROR; - } - - if (valuePtr->typePtr == &tclIntType) { - iResult = valuePtr->internalRep.longValue; - } else if (valuePtr->typePtr == &tclWideIntType) { - TclGetLongFromWide(iResult,valuePtr); - } else { - d = valuePtr->internalRep.doubleValue; - if (d < 0.0) { - if (d < (double) (long) LONG_MIN) { - tooLarge: - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "integer value too large to represent", -1)); - Tcl_SetErrorCode(interp, "ARITH", "IOVERFLOW", - "integer value too large to represent", (char *) NULL); - return TCL_ERROR; - } - } else { - if (d > (double) LONG_MAX) { - goto tooLarge; - } - } - if (IS_NAN(d) || IS_INF(d)) { - TclExprFloatError(interp, d); - return TCL_ERROR; - } - iResult = (long) d; - } - - /* - * Push a Tcl object with the result. - */ - - TclNewLongObj(resPtr, iResult); - PUSH_OBJECT(resPtr); - TclDecrRefCount(valuePtr); - return TCL_OK; -} - -static int -ExprWideFunc(interp, tosPtr, clientData) - Tcl_Interp *interp; /* The interpreter in which to execute the - * function. */ - Tcl_Obj **tosPtr; /* Points to top of evaluation stack. */ - ClientData clientData; /* Ignored. */ -{ - register Tcl_Obj *valuePtr, *resPtr; - Tcl_WideInt wResult; - double d; - - /* - * Pop the argument from the evaluation stack. - */ - - valuePtr = POP_OBJECT(); - - if (VerifyExprObjType(interp, valuePtr) != TCL_OK) { - return TCL_ERROR; - } - - if (valuePtr->typePtr == &tclWideIntType) { - TclGetWide(wResult,valuePtr); - } else if (valuePtr->typePtr == &tclIntType) { - wResult = Tcl_LongAsWide(valuePtr->internalRep.longValue); - } else { - d = valuePtr->internalRep.doubleValue; - if (d < 0.0) { - if (d < Tcl_WideAsDouble(LLONG_MIN)) { - tooLarge: - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "integer value too large to represent", -1)); - Tcl_SetErrorCode(interp, "ARITH", "IOVERFLOW", - "integer value too large to represent", (char *) NULL); - return TCL_ERROR; - } - } else { - if (d > Tcl_WideAsDouble(LLONG_MAX)) { - goto tooLarge; - } - } - if (IS_NAN(d) || IS_INF(d)) { - TclExprFloatError(interp, d); - return TCL_ERROR; - } - wResult = Tcl_DoubleAsWide(d); - } - - /* - * Push a Tcl object with the result. - */ - - TclNewWideIntObj(resPtr, wResult); - PUSH_OBJECT(resPtr); - TclDecrRefCount(valuePtr); - return TCL_OK; -} - -static int -ExprRandFunc(interp, tosPtr, clientData) - Tcl_Interp *interp; /* The interpreter in which to execute the - * function. */ - Tcl_Obj **tosPtr; /* Points to top of evaluation stack. */ - ClientData clientData; /* Ignored. */ -{ - Interp *iPtr = (Interp *) interp; - double dResult; - long tmp; /* Algorithm assumes at least 32 bits. - * Only long guarantees that. See below. */ - Tcl_Obj *resPtr; - - if (!(iPtr->flags & RAND_SEED_INITIALIZED)) { - iPtr->flags |= RAND_SEED_INITIALIZED; - - /* - * Take into consideration the thread this interp is running in order - * to insure different seeds in different threads (bug #416643) - */ - - iPtr->randSeed = TclpGetClicks() + ((long)Tcl_GetCurrentThread()<<12); - - /* - * Make sure 1 <= randSeed <= (2^31) - 2. See below. - */ - - iPtr->randSeed &= (unsigned long) 0x7fffffff; - if ((iPtr->randSeed == 0) || (iPtr->randSeed == 0x7fffffff)) { - iPtr->randSeed ^= 123459876; - } - } - - /* - * Generate the random number using the linear congruential - * generator defined by the following recurrence: - * seed = ( IA * seed ) mod IM - * where IA is 16807 and IM is (2^31) - 1. The recurrence maps - * a seed in the range [1, IM - 1] to a new seed in that same range. - * The recurrence maps IM to 0, and maps 0 back to 0, so those two - * values must not be allowed as initial values of seed. - * - * In order to avoid potential problems with integer overflow, the - * recurrence is implemented in terms of additional constants - * IQ and IR such that - * IM = IA*IQ + IR - * None of the operations in the implementation overflows a 32-bit - * signed integer, and the C type long is guaranteed to be at least - * 32 bits wide. - * - * For more details on how this algorithm works, refer to the following - * papers: - * - * S.K. Park & K.W. Miller, "Random number generators: good ones - * are hard to find," Comm ACM 31(10):1192-1201, Oct 1988 - * - * W.H. Press & S.A. Teukolsky, "Portable random number - * generators," Computers in Physics 6(5):522-524, Sep/Oct 1992. - */ - -#define RAND_IA 16807 -#define RAND_IM 2147483647 -#define RAND_IQ 127773 -#define RAND_IR 2836 -#define RAND_MASK 123459876 - - tmp = iPtr->randSeed/RAND_IQ; - iPtr->randSeed = RAND_IA*(iPtr->randSeed - tmp*RAND_IQ) - RAND_IR*tmp; - if (iPtr->randSeed < 0) { - iPtr->randSeed += RAND_IM; - } - - /* - * Since the recurrence keeps seed values in the range [1, RAND_IM - 1], - * dividing by RAND_IM yields a double in the range (0, 1). - */ - - dResult = iPtr->randSeed * (1.0/RAND_IM); - - /* - * Push a Tcl object with the result. - */ - - TclNewDoubleObj(resPtr, dResult); - PUSH_OBJECT(resPtr); - return TCL_OK; -} - -static int -ExprRoundFunc(interp, tosPtr, clientData) - Tcl_Interp *interp; /* The interpreter in which to execute the - * function. */ - Tcl_Obj **tosPtr; /* Points to top of evaluation stack. */ - ClientData clientData; /* Ignored. */ -{ - Tcl_Obj *valuePtr, *resPtr; - double d; - - /* - * Pop the argument from the evaluation stack. - */ - - valuePtr = POP_OBJECT(); - - if (VerifyExprObjType(interp, valuePtr) != TCL_OK) { - return TCL_ERROR; - } - - if ((valuePtr->typePtr == &tclIntType) || - (valuePtr->typePtr == &tclWideIntType)) { - return TCL_OK; - } - - d = valuePtr->internalRep.doubleValue; - if (d < 0.0) { - if (d <= Tcl_WideAsDouble(LLONG_MIN)-0.5) { - goto tooLarge; - } else if (d <= (((double) (long) LONG_MIN) - 0.5)) { - TclNewWideIntObj(resPtr, Tcl_DoubleAsWide(d - 0.5)); - } else { - TclNewLongObj(resPtr, (long) (d - 0.5)); - } - } else { - if (d >= Tcl_WideAsDouble(LLONG_MAX)+0.5) { - goto tooLarge; - } else if (d >= (((double) LONG_MAX + 0.5))) { - TclNewWideIntObj(resPtr, Tcl_DoubleAsWide(d + 0.5)); - } else { - TclNewLongObj(resPtr, (long) (d + 0.5)); - } - } - - /* - * Free the argument Tcl_Obj and push the result object. - */ - - TclDecrRefCount(valuePtr); - PUSH_OBJECT(resPtr); - return TCL_OK; - - /* - * Error return: result cannot be represented as an integer. - */ - - tooLarge: - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "integer value too large to represent", -1)); - Tcl_SetErrorCode(interp, "ARITH", "IOVERFLOW", - "integer value too large to represent", - (char *) NULL); - return TCL_ERROR; -} - -static int -ExprSrandFunc(interp, tosPtr, clientData) - Tcl_Interp *interp; /* The interpreter in which to execute the - * function. */ - Tcl_Obj **tosPtr; /* Points to top of evaluation stack. */ - ClientData clientData; /* Ignored. */ -{ - Interp *iPtr = (Interp *) interp; - Tcl_Obj *valuePtr; - long i = 0; /* Initialized to avoid compiler warning. */ - - /* - * Pop the argument from the evaluation stack. Use the value - * to reset the random number seed. - */ - - valuePtr = POP_OBJECT(); - - if (VerifyExprObjType(interp, valuePtr) != TCL_OK) { - return TCL_ERROR; - } - - if (Tcl_GetLongFromObj(NULL, valuePtr, &i) != TCL_OK) { - /* - * At this point, the only other possible type is double - */ - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "can't use floating-point value as argument to srand", -1)); - return TCL_ERROR; - } - - /* - * Reset the seed. Make sure 1 <= randSeed <= 2^31 - 2. - * See comments in ExprRandFunc() for more details. - */ - - iPtr->flags |= RAND_SEED_INITIALIZED; - iPtr->randSeed = i; - iPtr->randSeed &= (unsigned long) 0x7fffffff; - if ((iPtr->randSeed == 0) || (iPtr->randSeed == 0x7fffffff)) { - iPtr->randSeed ^= 123459876; - } - - /* - * To avoid duplicating the random number generation code we simply - * clean up our state and call the real random number function. That - * function will always succeed. - */ - - TclDecrRefCount(valuePtr); - ExprRandFunc(interp, tosPtr, clientData); - return TCL_OK; -} - -/* - *---------------------------------------------------------------------- - * - * ExprCallMathFunc -- - * - * This procedure is invoked to call a non-builtin math function - * during the execution of an expression. - * - * Results: - * TCL_OK is returned if all went well and the function's value - * was computed successfully. If an error occurred, TCL_ERROR - * is returned and an error message is left in the interpreter's - * result. After a successful return this procedure pops its - * objc arguments and pushes a Tcl object holding the result. - * - * Side effects: - * None, unless the called math function has side effects. - * - *---------------------------------------------------------------------- - */ - -static int -ExprCallMathFunc(interp, objc, objv) - Tcl_Interp *interp; /* The interpreter in which to execute the - * function. */ - int objc; /* Number of arguments. The function name is - * the 0-th argument. */ - Tcl_Obj **objv; /* The array of arguments. The function name - * is objv[0]. */ -{ - Interp *iPtr = (Interp *) interp; - char *funcName; - Tcl_HashEntry *hPtr; - MathFunc *mathFuncPtr; /* Information about math function. */ - Tcl_Value args[MAX_MATH_ARGS]; /* Arguments for function call. */ - Tcl_Value funcResult; /* Result of function call as Tcl_Value. */ - register Tcl_Obj *valuePtr; - long i; - double d; - int j, k, result; - - Tcl_ResetResult(interp); - - /* - * Look up the MathFunc record for the function. - */ - - funcName = TclGetString(objv[0]); - hPtr = Tcl_FindHashEntry(&iPtr->mathFuncTable, funcName); - if (hPtr == NULL) { - Tcl_AppendResult(interp, "unknown math function \"", funcName, - "\"", (char *) NULL); - return TCL_ERROR; - } - mathFuncPtr = (MathFunc *) Tcl_GetHashValue(hPtr); - if (mathFuncPtr->numArgs != (objc-1)) { - Tcl_Panic("ExprCallMathFunc: expected number of args %d != actual number %d", - mathFuncPtr->numArgs, objc); - return TCL_ERROR; - } - - /* - * Collect the arguments for the function, if there are any, into the - * array "args". Note that args[0] will have the Tcl_Value that - * corresponds to objv[1]. - */ - - for (j = 1, k = 0; j < objc; j++, k++) { - valuePtr = objv[j]; - - if (VerifyExprObjType(interp, valuePtr) != TCL_OK) { - return TCL_ERROR; - } - - /* - * Copy the object's numeric value to the argument record, - * converting it if necessary. - */ - - if (valuePtr->typePtr == &tclIntType) { - i = valuePtr->internalRep.longValue; - if (mathFuncPtr->argTypes[k] == TCL_DOUBLE) { - args[k].type = TCL_DOUBLE; - args[k].doubleValue = i; - } else if (mathFuncPtr->argTypes[k] == TCL_WIDE_INT) { - args[k].type = TCL_WIDE_INT; - args[k].wideValue = Tcl_LongAsWide(i); - } else { - args[k].type = TCL_INT; - args[k].intValue = i; - } - } else if (valuePtr->typePtr == &tclWideIntType) { - Tcl_WideInt w; - TclGetWide(w,valuePtr); - if (mathFuncPtr->argTypes[k] == TCL_DOUBLE) { - args[k].type = TCL_DOUBLE; - args[k].doubleValue = Tcl_WideAsDouble(w); - } else if (mathFuncPtr->argTypes[k] == TCL_INT) { - args[k].type = TCL_INT; - args[k].intValue = Tcl_WideAsLong(w); - } else { - args[k].type = TCL_WIDE_INT; - args[k].wideValue = w; - } - } else { - d = valuePtr->internalRep.doubleValue; - if (mathFuncPtr->argTypes[k] == TCL_INT) { - args[k].type = TCL_INT; - args[k].intValue = (long) d; - } else if (mathFuncPtr->argTypes[k] == TCL_WIDE_INT) { - args[k].type = TCL_WIDE_INT; - args[k].wideValue = Tcl_DoubleAsWide(d); - } else { - args[k].type = TCL_DOUBLE; - args[k].doubleValue = d; - } - } - } - - /* - * Invoke the function and copy its result back into valuePtr. - */ - - result = (*mathFuncPtr->proc)(mathFuncPtr->clientData, interp, args, - &funcResult); - if (result != TCL_OK) { - return result; - } - - /* - * Pop the objc top stack elements and decrement their ref counts. - */ - - for (k = 0; k < objc; k++) { - valuePtr = objv[k]; - TclDecrRefCount(valuePtr); - } - - /* - * Push the call's object result. - */ - - if (funcResult.type == TCL_INT) { - TclNewLongObj(objv[0], funcResult.intValue); - } else if (funcResult.type == TCL_WIDE_INT) { - TclNewWideIntObj(objv[0], funcResult.wideValue); - } else { - d = funcResult.doubleValue; - if (IS_NAN(d) || IS_INF(d)) { - TclExprFloatError(interp, d); - return TCL_ERROR; - } - TclNewDoubleObj(objv[0], d); - } - Tcl_IncrRefCount(objv[0]); - - return result; -} - -/* - *---------------------------------------------------------------------- - * * TclExprFloatError -- * * This procedure is called when an error occurs during a diff --git a/generic/tclFCmd.c b/generic/tclFCmd.c index 024526e..f8606e5 100644 --- a/generic/tclFCmd.c +++ b/generic/tclFCmd.c @@ -9,7 +9,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclFCmd.c,v 1.31 2005/01/14 18:56:32 vincentdarley Exp $ + * RCS: @(#) $Id: tclFCmd.c,v 1.32 2005/05/10 18:34:37 kennykb Exp $ */ #include "tclInt.h" diff --git a/generic/tclFileName.c b/generic/tclFileName.c index bde0071..5bfad99 100644 --- a/generic/tclFileName.c +++ b/generic/tclFileName.c @@ -10,7 +10,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclFileName.c,v 1.68 2005/04/20 15:13:39 kennykb Exp $ + * RCS: @(#) $Id: tclFileName.c,v 1.69 2005/05/10 18:34:38 kennykb Exp $ */ #include "tclInt.h" diff --git a/generic/tclGet.c b/generic/tclGet.c index 1804088..be3d942 100644 --- a/generic/tclGet.c +++ b/generic/tclGet.c @@ -11,7 +11,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclGet.c,v 1.14 2005/05/03 18:08:18 dgp Exp $ + * RCS: @(#) $Id: tclGet.c,v 1.15 2005/05/10 18:34:38 kennykb Exp $ */ #include "tclInt.h" diff --git a/generic/tclGetDate.y b/generic/tclGetDate.y index 0be34be..800c04b 100644 --- a/generic/tclGetDate.y +++ b/generic/tclGetDate.y @@ -11,7 +11,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclGetDate.y,v 1.26 2004/12/29 20:57:27 kennykb Exp $ + * RCS: @(#) $Id: tclGetDate.y,v 1.27 2005/05/10 18:34:38 kennykb Exp $ */ %{ diff --git a/generic/tclIO.c b/generic/tclIO.c index e94264a..ee37035 100644 --- a/generic/tclIO.c +++ b/generic/tclIO.c @@ -10,7 +10,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclIO.c,v 1.85 2005/05/05 18:37:58 dgp Exp $ + * RCS: @(#) $Id: tclIO.c,v 1.86 2005/05/10 18:34:38 kennykb Exp $ */ #include "tclInt.h" diff --git a/generic/tclIOCmd.c b/generic/tclIOCmd.c index fc14619..abd789c 100644 --- a/generic/tclIOCmd.c +++ b/generic/tclIOCmd.c @@ -8,7 +8,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclIOCmd.c,v 1.23 2005/04/27 18:48:25 dgp Exp $ + * RCS: @(#) $Id: tclIOCmd.c,v 1.24 2005/05/10 18:34:40 kennykb Exp $ */ #include "tclInt.h" diff --git a/generic/tclIOUtil.c b/generic/tclIOUtil.c index 17d6efa..f94a3c8 100644 --- a/generic/tclIOUtil.c +++ b/generic/tclIOUtil.c @@ -17,7 +17,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclIOUtil.c,v 1.117 2005/04/27 18:48:25 dgp Exp $ + * RCS: @(#) $Id: tclIOUtil.c,v 1.118 2005/05/10 18:34:40 kennykb Exp $ */ #include "tclInt.h" diff --git a/generic/tclInt.decls b/generic/tclInt.decls index a997c25..c457741 100644 --- a/generic/tclInt.decls +++ b/generic/tclInt.decls @@ -12,7 +12,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: tclInt.decls,v 1.87 2005/05/05 18:38:00 dgp Exp $ +# RCS: @(#) $Id: tclInt.decls,v 1.88 2005/05/10 18:34:41 kennykb Exp $ library tcl @@ -874,6 +874,23 @@ declare 218 generic { void TclPopStackFrame(Tcl_Interp *interp) } +# Entries in tommath needed only by tcltest + +declare 219 generic { + int TclBN_mp_div_d(mp_int *a, mp_digit b, mp_int *c, mp_digit *d) +} +declare 220 generic { + int TclBN_mp_mul_d(mp_int *a, mp_digit b, mp_int *c) +} +declare 221 generic { + void TclBN_mp_clear(mp_int *a) +} +declare 222 generic { + int TclBN_mp_init(mp_int *a) +} +declare 223 generic { + int TclBN_mp_read_radix(mp_int *a, const char *str, int radix) +} ############################################################################## diff --git a/generic/tclInt.h b/generic/tclInt.h index 6af07ff..0a05edb 100644 --- a/generic/tclInt.h +++ b/generic/tclInt.h @@ -12,7 +12,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclInt.h,v 1.228 2005/05/05 18:38:01 dgp Exp $ + * RCS: @(#) $Id: tclInt.h,v 1.229 2005/05/10 18:34:42 kennykb Exp $ */ #ifndef _TCLINT @@ -1852,10 +1852,14 @@ MODULE_SCOPE void TclAppendObjToErrorInfo _ANSI_ARGS_(( Tcl_Interp *interp, Tcl_Obj *objPtr)); MODULE_SCOPE int TclArraySet _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *arrayNameObj, Tcl_Obj *arrayElemObj)); +MODULE_SCOPE double TclBignumToDouble _ANSI_ARGS_((mp_int* bignum)); MODULE_SCOPE int TclCheckBadOctal _ANSI_ARGS_((Tcl_Interp *interp, CONST char *value)); MODULE_SCOPE void TclCleanupLiteralTable _ANSI_ARGS_(( Tcl_Interp* interp, LiteralTable* tablePtr)); +MODULE_SCOPE int TclDoubleDigits _ANSI_ARGS_((char* buf, + double value, + int* signum)); MODULE_SCOPE void TclExpandTokenArray _ANSI_ARGS_(( Tcl_Parse *parsePtr)); MODULE_SCOPE int TclFileAttrsCmd _ANSI_ARGS_((Tcl_Interp *interp, @@ -1871,6 +1875,7 @@ MODULE_SCOPE int TclFileRenameCmd _ANSI_ARGS_((Tcl_Interp *interp, MODULE_SCOPE void TclFinalizeAllocSubsystem _ANSI_ARGS_((void)); MODULE_SCOPE void TclFinalizeCompExecEnv _ANSI_ARGS_((void)); MODULE_SCOPE void TclFinalizeCompilation _ANSI_ARGS_((void)); +MODULE_SCOPE void TclFinalizeDoubleConversion _ANSI_ARGS_((void)); MODULE_SCOPE void TclFinalizeEncodingSubsystem _ANSI_ARGS_((void)); MODULE_SCOPE void TclFinalizeEnvironment _ANSI_ARGS_((void)); MODULE_SCOPE void TclFinalizeExecution _ANSI_ARGS_((void)); @@ -1884,6 +1889,7 @@ MODULE_SCOPE void TclFinalizeAsync _ANSI_ARGS_((void)); MODULE_SCOPE void TclFinalizeSynchronization _ANSI_ARGS_((void)); MODULE_SCOPE void TclFinalizeLock _ANSI_ARGS_((void)); MODULE_SCOPE void TclFinalizeThreadData _ANSI_ARGS_((void)); +MODULE_SCOPE void TclFormatNaN _ANSI_ARGS_((double value, char* buffer)); MODULE_SCOPE int TclFSFileAttrIndex _ANSI_ARGS_((Tcl_Obj *pathPtr, CONST char *attributeName, int *indexPtr)); MODULE_SCOPE Tcl_Obj * TclGetBgErrorHandler _ANSI_ARGS_((Tcl_Interp *interp)); @@ -1902,6 +1908,7 @@ MODULE_SCOPE int TclGlob _ANSI_ARGS_((Tcl_Interp *interp, int globFlags, Tcl_GlobTypeData* types)); MODULE_SCOPE void TclInitAlloc _ANSI_ARGS_((void)); MODULE_SCOPE void TclInitDbCkalloc _ANSI_ARGS_((void)); +MODULE_SCOPE void TclInitDoubleConversion _ANSI_ARGS_((void)); MODULE_SCOPE void TclInitEmbeddedConfigurationInformation _ANSI_ARGS_((Tcl_Interp *interp)); MODULE_SCOPE void TclInitEncodingSubsystem _ANSI_ARGS_((void)); @@ -2048,6 +2055,8 @@ MODULE_SCOPE void TclSetProcessGlobalValue _ANSI_ARGS_ (( Tcl_Encoding encoding)); MODULE_SCOPE VOID TclSignalExitThread _ANSI_ARGS_((Tcl_ThreadId id, int result)); +MODULE_SCOPE double TclStrToD _ANSI_ARGS_((CONST char* string, + CONST char** endPtr)); MODULE_SCOPE int TclSubstTokens _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Token *tokenPtr, int count, int *tokensLeftPtr)); @@ -2717,6 +2726,20 @@ MODULE_SCOPE void TclDbInitNewObj _ANSI_ARGS_((Tcl_Obj *objPtr)); } /* + *---------------------------------------------------------------------- + * + * Core procedures added to libtommath for bignum manipulation. + * + *---------------------------------------------------------------------- + */ + +MODULE_SCOPE void* TclBNAlloc( size_t nBytes ); +MODULE_SCOPE void* TclBNRealloc( void* oldBlock, size_t newNBytes ); +MODULE_SCOPE void TclBNFree( void* block ); +MODULE_SCOPE void TclBNInitBignumFromLong( mp_int* bignum, long initVal ); + + +/* *---------------------------------------------------------------- * Macro used by the Tcl core to check whether a pattern has * any characters special to [string match]. diff --git a/generic/tclIntDecls.h b/generic/tclIntDecls.h index 6972a28..7364d0f 100644 --- a/generic/tclIntDecls.h +++ b/generic/tclIntDecls.h @@ -11,7 +11,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclIntDecls.h,v 1.78 2005/05/05 18:38:02 dgp Exp $ + * RCS: @(#) $Id: tclIntDecls.h,v 1.79 2005/05/10 18:34:42 kennykb Exp $ */ #ifndef _TCLINTDECLS @@ -1128,6 +1128,34 @@ EXTERN int TclPushStackFrame _ANSI_ARGS_((Tcl_Interp * interp, /* 218 */ EXTERN void TclPopStackFrame _ANSI_ARGS_((Tcl_Interp * interp)); #endif +#ifndef TclBN_mp_div_d_TCL_DECLARED +#define TclBN_mp_div_d_TCL_DECLARED +/* 219 */ +EXTERN int TclBN_mp_div_d _ANSI_ARGS_((mp_int * a, mp_digit b, + mp_int * c, mp_digit * d)); +#endif +#ifndef TclBN_mp_mul_d_TCL_DECLARED +#define TclBN_mp_mul_d_TCL_DECLARED +/* 220 */ +EXTERN int TclBN_mp_mul_d _ANSI_ARGS_((mp_int * a, mp_digit b, + mp_int * c)); +#endif +#ifndef TclBN_mp_clear_TCL_DECLARED +#define TclBN_mp_clear_TCL_DECLARED +/* 221 */ +EXTERN void TclBN_mp_clear _ANSI_ARGS_((mp_int * a)); +#endif +#ifndef TclBN_mp_init_TCL_DECLARED +#define TclBN_mp_init_TCL_DECLARED +/* 222 */ +EXTERN int TclBN_mp_init _ANSI_ARGS_((mp_int * a)); +#endif +#ifndef TclBN_mp_read_radix_TCL_DECLARED +#define TclBN_mp_read_radix_TCL_DECLARED +/* 223 */ +EXTERN int TclBN_mp_read_radix _ANSI_ARGS_((mp_int * a, + const char * str, int radix)); +#endif typedef struct TclIntStubs { int magic; @@ -1367,6 +1395,11 @@ typedef struct TclIntStubs { void (*tclStackFree) _ANSI_ARGS_((Tcl_Interp * interp)); /* 216 */ int (*tclPushStackFrame) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_CallFrame ** framePtrPtr, Tcl_Namespace * namespacePtr, int isProcCallFrame)); /* 217 */ void (*tclPopStackFrame) _ANSI_ARGS_((Tcl_Interp * interp)); /* 218 */ + int (*tclBN_mp_div_d) _ANSI_ARGS_((mp_int * a, mp_digit b, mp_int * c, mp_digit * d)); /* 219 */ + int (*tclBN_mp_mul_d) _ANSI_ARGS_((mp_int * a, mp_digit b, mp_int * c)); /* 220 */ + void (*tclBN_mp_clear) _ANSI_ARGS_((mp_int * a)); /* 221 */ + int (*tclBN_mp_init) _ANSI_ARGS_((mp_int * a)); /* 222 */ + int (*tclBN_mp_read_radix) _ANSI_ARGS_((mp_int * a, const char * str, int radix)); /* 223 */ } TclIntStubs; #ifdef __cplusplus @@ -2121,6 +2154,26 @@ extern TclIntStubs *tclIntStubsPtr; #define TclPopStackFrame \ (tclIntStubsPtr->tclPopStackFrame) /* 218 */ #endif +#ifndef TclBN_mp_div_d +#define TclBN_mp_div_d \ + (tclIntStubsPtr->tclBN_mp_div_d) /* 219 */ +#endif +#ifndef TclBN_mp_mul_d +#define TclBN_mp_mul_d \ + (tclIntStubsPtr->tclBN_mp_mul_d) /* 220 */ +#endif +#ifndef TclBN_mp_clear +#define TclBN_mp_clear \ + (tclIntStubsPtr->tclBN_mp_clear) /* 221 */ +#endif +#ifndef TclBN_mp_init +#define TclBN_mp_init \ + (tclIntStubsPtr->tclBN_mp_init) /* 222 */ +#endif +#ifndef TclBN_mp_read_radix +#define TclBN_mp_read_radix \ + (tclIntStubsPtr->tclBN_mp_read_radix) /* 223 */ +#endif #endif /* defined(USE_TCL_STUBS) && !defined(USE_TCL_STUB_PROCS) */ diff --git a/generic/tclInterp.c b/generic/tclInterp.c index 74d4006..f6cc8dc 100644 --- a/generic/tclInterp.c +++ b/generic/tclInterp.c @@ -10,7 +10,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclInterp.c,v 1.58 2005/04/19 16:32:56 dgp Exp $ + * RCS: @(#) $Id: tclInterp.c,v 1.59 2005/05/10 18:34:44 kennykb Exp $ */ #include "tclInt.h" diff --git a/generic/tclListObj.c b/generic/tclListObj.c index 47bcccf..aa793f4 100644 --- a/generic/tclListObj.c +++ b/generic/tclListObj.c @@ -11,7 +11,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclListObj.c,v 1.22 2005/04/09 11:09:58 das Exp $ + * RCS: @(#) $Id: tclListObj.c,v 1.23 2005/05/10 18:34:44 kennykb Exp $ */ #include "tclInt.h" diff --git a/generic/tclLiteral.c b/generic/tclLiteral.c index e55814e..962856e 100644 --- a/generic/tclLiteral.c +++ b/generic/tclLiteral.c @@ -13,7 +13,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclLiteral.c,v 1.23 2005/04/25 02:08:33 dgp Exp $ + * RCS: @(#) $Id: tclLiteral.c,v 1.24 2005/05/10 18:34:44 kennykb Exp $ */ #include "tclInt.h" diff --git a/generic/tclNamesp.c b/generic/tclNamesp.c index 5cd013e..27f5603 100644 --- a/generic/tclNamesp.c +++ b/generic/tclNamesp.c @@ -21,7 +21,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclNamesp.c,v 1.73 2005/05/05 18:38:04 dgp Exp $ + * RCS: @(#) $Id: tclNamesp.c,v 1.74 2005/05/10 18:34:45 kennykb Exp $ */ #include "tclInt.h" diff --git a/generic/tclNotify.c b/generic/tclNotify.c index 4a343aa..d025c2c 100644 --- a/generic/tclNotify.c +++ b/generic/tclNotify.c @@ -14,7 +14,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclNotify.c,v 1.17 2005/04/26 00:45:01 das Exp $ + * RCS: @(#) $Id: tclNotify.c,v 1.18 2005/05/10 18:34:46 kennykb Exp $ */ #include "tclInt.h" diff --git a/generic/tclObj.c b/generic/tclObj.c index 1b25e16..5f5cfb2 100644 --- a/generic/tclObj.c +++ b/generic/tclObj.c @@ -7,15 +7,28 @@ * Copyright (c) 1995-1997 Sun Microsystems, Inc. * Copyright (c) 1999 by Scriptics Corporation. * Copyright (c) 2001 by ActiveState Corporation. + * Copyright (c) 2005 by Kevin B. Kenny. All rights reserved. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclObj.c,v 1.82 2005/04/25 02:08:34 dgp Exp $ + * RCS: @(#) $Id: tclObj.c,v 1.83 2005/05/10 18:34:46 kennykb Exp $ */ #include "tclInt.h" +#include "tommath.h" #include "tclCompile.h" +#include <float.h> + +/* + * Define test for NaN + */ + +#ifdef _MSC_VER +#define IS_NAN(f) _isnan((f)) +#else +#define IS_NAN(f) ((f) != (f)) +#endif /* * Table of all object types. @@ -136,6 +149,28 @@ Tcl_ThreadDataKey pendingObjDataKey; /* + * Macros to pack/unpack a bignum's fields in a Tcl_Obj internal rep + */ + +#define PACK_BIGNUM( bignum, objPtr ) \ + do { \ + (objPtr)->internalRep.bignumValue.digits = (void*) (bignum).dp; \ + (objPtr)->internalRep.bignumValue.misc = ( \ + ( (bignum).sign << 30 ) \ + | ( (bignum).alloc << 15 ) \ + | ( (bignum).used ) ); \ + } while ( 0 ) + +#define UNPACK_BIGNUM( objPtr, bignum ) \ + do { \ + (bignum).dp = (mp_digit*) (objPtr)->internalRep.bignumValue.digits; \ + (bignum).sign = (objPtr)->internalRep.bignumValue.misc >> 30; \ + (bignum).alloc = ( (objPtr)->internalRep.bignumValue.misc >> 15 ) \ + & 0x7fff; \ + (bignum).used = (objPtr)->internalRep.bignumValue.misc & 0x7fff; \ + } while ( 0 ) + +/* * Prototypes for procedures defined later in this file: */ @@ -157,6 +192,13 @@ static int SetWideIntFromAny _ANSI_ARGS_((Tcl_Interp *interp, static void UpdateStringOfWideInt _ANSI_ARGS_((Tcl_Obj *objPtr)); #endif +static void FreeBignum _ANSI_ARGS_(( Tcl_Obj *objPtr )); +static void DupBignum _ANSI_ARGS_(( Tcl_Obj *objPtr, + Tcl_Obj *copyPtr )); +static void UpdateStringOfBignum _ANSI_ARGS_(( Tcl_Obj *objPtr )); +static int SetBignumFromAny _ANSI_ARGS_(( Tcl_Interp* interp, + Tcl_Obj* objPtr )); + /* * Prototypes for the array hash key methods. */ @@ -226,6 +268,14 @@ Tcl_ObjType tclWideIntType = { SetWideIntFromAny /* setFromAnyProc */ }; +Tcl_ObjType tclBignumType = { + "bignum", /* name */ + FreeBignum, /* freeIntRepProc */ + DupBignum, /* dupIntRepProc */ + UpdateStringOfBignum, /* updateStringProc */ + SetBignumFromAny /* setFromAnyProc */ +}; + /* * The structure below defines the Tcl obj hash key type. */ @@ -331,6 +381,7 @@ TclInitObjSubsystem() Tcl_RegisterObjType(&tclEndOffsetType); Tcl_RegisterObjType(&tclIntType); Tcl_RegisterObjType(&tclWideIntType); + Tcl_RegisterObjType( &tclBignumType ); Tcl_RegisterObjType(&tclStringType); Tcl_RegisterObjType(&tclListType); Tcl_RegisterObjType(&tclDictType); @@ -1670,22 +1721,29 @@ Tcl_GetDoubleFromObj(interp, objPtr, dblPtr) { register int result; - if (objPtr->typePtr == &tclDoubleType) { - *dblPtr = objPtr->internalRep.doubleValue; - return TCL_OK; - } else if (objPtr->typePtr == &tclIntType) { + if (objPtr->typePtr == &tclIntType) { *dblPtr = objPtr->internalRep.longValue; return TCL_OK; } else if (objPtr->typePtr == &tclWideIntType) { *dblPtr = (double) objPtr->internalRep.wideValue; return TCL_OK; + } else if (objPtr->typePtr != &tclDoubleType) { + result = SetDoubleFromAny(interp, objPtr); + if ( result != TCL_OK ) { + return TCL_ERROR; + } } - - result = SetDoubleFromAny(interp, objPtr); - if (result == TCL_OK) { - *dblPtr = objPtr->internalRep.doubleValue; + if ( IS_NAN( objPtr->internalRep.doubleValue ) ) { + if ( interp != NULL ) { + Tcl_SetObjResult + ( interp, + Tcl_NewStringObj( "floating point value is Not a Number", + -1 ) ); + } + return TCL_ERROR; } - return result; + *dblPtr = objPtr->internalRep.doubleValue; + return TCL_OK; } /* @@ -1713,7 +1771,7 @@ SetDoubleFromAny(interp, objPtr) Tcl_Interp *interp; /* Used for error reporting if not NULL. */ register Tcl_Obj *objPtr; /* The object to convert. */ { - char *string, *end; + CONST char *string, *end; double newDouble; int length; @@ -1730,7 +1788,7 @@ SetDoubleFromAny(interp, objPtr) */ errno = 0; - newDouble = strtod(string, &end); + newDouble = TclStrToD(string, &end); if (end == string) { badDouble: if (interp != NULL) { @@ -1755,7 +1813,7 @@ SetDoubleFromAny(interp, objPtr) goto badDouble; } - if (errno != 0) { + if (errno != 0 && errno != ERANGE) { if (interp != NULL) { TclExprFloatError(interp, newDouble); } @@ -2715,6 +2773,390 @@ Tcl_GetWideIntFromObj(interp, objPtr, wideIntPtr) /* *---------------------------------------------------------------------- * + * FreeBignum -- + * + * This procedure frees the internal rep of a bignum. + * + * Results: + * None. + * + *---------------------------------------------------------------------- + */ + +static void +FreeBignum( Tcl_Obj* objPtr ) +{ + mp_int toFree; /* Bignum to free */ + UNPACK_BIGNUM( objPtr, toFree ); + mp_clear( &toFree ); +} + +/* + *---------------------------------------------------------------------- + * + * DupBignum -- + * + * This procedure duplicates the internal rep of a bignum. + * + * Results: + * None. + * + * Side effects: + * The destination object receies a copy of the source object + * + *---------------------------------------------------------------------- + */ + +static void +DupBignum( srcPtr, copyPtr ) + Tcl_Obj* srcPtr; + Tcl_Obj* copyPtr; +{ + mp_int bignumVal; + mp_int bignumCopy; + copyPtr->typePtr = &tclBignumType; + UNPACK_BIGNUM( srcPtr, bignumVal ); + if ( mp_init_copy( &bignumCopy, &bignumVal ) != MP_OKAY ) { + Tcl_Panic( "initialization failure in DupBignum" ); + } + PACK_BIGNUM( bignumVal, copyPtr ); +} + +/* + *---------------------------------------------------------------------- + * + * SetBignumFromAny -- + * + * This procedure interprets a Tcl_Obj as a bignum and sets + * the internal representation accordingly. + * + * Results: + * Returns a standard Tcl status. If conversion fails, an + * error message is left in the interpreter result. + * + * Side effects: + * The bignum internal representation is packed into the object. + * + *---------------------------------------------------------------------- + */ + +static int +SetBignumFromAny( interp, objPtr ) + Tcl_Interp* interp; + Tcl_Obj* objPtr; +{ + CONST char* stringVal; + CONST char* p; + int length; + int signum = MP_ZPOS; + int radix = 10; + int status; + mp_int bignumVal; + + if ( objPtr->typePtr == &tclIntType ) { + + /* + * If the number already contains an integer, simply widen it to + * a bignum. + */ + + TclBNInitBignumFromLong( &bignumVal, objPtr->internalRep.longValue ); + } else { + + /* + * The number doesn't contain an integer. Convert its string rep + * to a bignum, handling 0XXX and 0xXXX notation + */ + + stringVal = Tcl_GetStringFromObj( objPtr, &length ); + p = stringVal; + + /* + * Pull off the signum + */ + + if ( *p == '+' ) { + ++p; + } else if ( *p == '-' ) { + ++p; + signum = MP_NEG; + } + + /* + * Handle octal and hexadecimal + */ + + if ( *p == '0' ) { + ++p; + if ( *p == 'x' || *p == 'X' ) { + ++p; + radix = 16; + } else { + --p; + radix = 8; + } + } + + /* Convert the value */ + + if ( mp_init( &bignumVal ) != MP_OKAY ) { + Tcl_Panic( "initialization failure in SetBignumFromAny" ); + } + status = mp_read_radix( &bignumVal, p, radix ); + switch ( status ) { + case MP_MEM: + Tcl_Panic( "out of memory in SetBignumFromAny" ); + case MP_OKAY: + break; + default: + { + if ( interp != NULL ) { + Tcl_Obj* msg + = Tcl_NewStringObj( "expected integer but got \"", + -1 ); + TclAppendLimitedToObj( msg, stringVal, length, 50, "" ); + Tcl_AppendToObj( msg, "\"", -1 ); + Tcl_SetObjResult( interp, msg ); + TclCheckBadOctal( interp, stringVal ); + } + mp_clear( &bignumVal ); + return TCL_ERROR; + } + } + + /* Conversion to bignum succeeded. Make sure that everything fits. */ + + if ( bignumVal.alloc > 0x7fff ) { + Tcl_Obj* msg + = Tcl_NewStringObj( "integer value too large to represent", -1 ); + Tcl_SetObjResult( interp, msg ); + mp_clear( &bignumVal ); + return TCL_ERROR; + } + } + + /* + * Conversion succeeded. Clean up the old internal rep and + * store the new one. + */ + + TclFreeIntRep( objPtr ); + bignumVal.sign = signum; + PACK_BIGNUM( bignumVal, objPtr ); + objPtr->typePtr = &tclBignumType; + return TCL_OK; +} + +/* + *---------------------------------------------------------------------- + * + * UpdateStringOfBignum -- + * + * This procedure updates the string representation of a bignum + * object. + * + * Results: + * None. + * + * Side effects: + * The object's string is set to whatever results from the bignum- + * to-string conversion. + * + * The object's existing string representation is NOT freed; memory + * will leak if the string rep is still valid at the time this procedure + * is called. + */ + +void +UpdateStringOfBignum( Tcl_Obj* objPtr ) +{ + mp_int bignumVal; + int size; + int status; + char* stringVal; + UNPACK_BIGNUM( objPtr, bignumVal ); + status = mp_radix_size( &bignumVal, 10, &size ); + if ( status != MP_OKAY ) { + Tcl_Panic( "radix size failure in UpdateStringOfBignum" ); + } + stringVal = Tcl_Alloc( (size_t) size ); + status = mp_toradix_n( &bignumVal, stringVal, 10, size ); + if ( status != MP_OKAY ) { + Tcl_Panic( "conversion failure in UpdateStringOfBignum" ); + } + objPtr->bytes = stringVal; + objPtr->length = size - 1; /* size includes a trailing null byte */ +} + +/* + *---------------------------------------------------------------------- + * + * Tcl_NewBignumObj -- + * + * Creates an initializes a bignum object. + * + * Results: + * Returns the newly created object. + * + * Side effects: + * The bignum value is cleared, since ownership has transferred + * to Tcl. + * + *---------------------------------------------------------------------- + */ + +#ifdef TCL_MEM_DEBUG +#undef Tcl_NewBignumObj +Tcl_Obj* +Tcl_NewBignumObj( mp_int* bignumValue ) +{ + return Tcl_DbNewBignumObj( bignumValue, "unknown", 0 ); +} +#else +Tcl_Obj * +Tcl_NewBignumObj( mp_int* bignumValue ) +{ + Tcl_Obj* objPtr; + TclNewObj( objPtr ); + PACK_BIGNUM( *bignumValue, objPtr ); + objPtr->typePtr=&tclBignumType; + objPtr->bytes = NULL; + + /* Clear with mp_init; mp_clear would overwrite the digit array. */ + + mp_init( bignumValue ); + + return objPtr; +} +#endif + +/* + *---------------------------------------------------------------------- + * + * Tcl_DbNewBignumObj -- + * + * This procedure is normally called when debugging: that is, when + * TCL_MEM_DEBUG is defined. It constructs a bignum object, recording + * the creation point so that [memory active] can report it. + * + * Results: + * Returns the newly created object. + * + * Side effects: + * The bignum value is cleared, since ownership has transferred + * to Tcl. + * + *---------------------------------------------------------------------- + */ + +#ifdef TCL_MEM_DEBUG +Tcl_Obj* +Tcl_DbNewBignumObj( mp_int* bignumValue, CONST char* file, int line ) +{ + Tcl_Obj* objPtr; + TclDbNewObj( objPtr, file, line ); + objPtr->bytes = NULL; + PACK_BIGNUM( *bignumValue, objPtr ); + objPtr->typePtr=&tclBignumType; + objPtr->bytes = NULL; + + /* Clear with mp_init; mp_clear would overwrite the digit array. */ + + mp_init( bignumValue ); + + return objPtr; +} +#else +Tcl_Obj* +Tcl_DbNewBignumObj( mp_int* bignumValue, CONST char* file, int line ) +{ + return Tcl_NewBignumObj( bignumValue ); +} +#endif + +/* + *---------------------------------------------------------------------- + * + * Tcl_GetBignumFromObj -- + * + * This procedure retrieves a 'bignum' value from a Tcl object, + * converting the object if necessary. + * + * Results: + * Returns TCL_OK if the conversion is successful, TCL_ERROR otherwise. + * + * Side effects: + * A copy of bignum is stored in *bignumValue, which is expected + * to be uninitialized or cleared. If conversion fails, an + * the 'interp' argument is not NULL, an error message is stored + * in the interpreter result. + * + * It is expected that the caller will NOT have invoked mp_init on the + * bignum value before passing it in. The raw value of the object is + * returned, and Tcl owns that memory, so the caller should NOT invoke + * mp_clear afterwards. + * + *---------------------------------------------------------------------- + */ + +int +Tcl_GetBignumFromObj( Tcl_Interp* interp, + /* Tcl interpreter for error reporting */ + Tcl_Obj* objPtr, + /* Object to read */ + mp_int* bignumValue ) + /* Returned bignum value. */ +{ + mp_int temp; + if ( objPtr -> typePtr != &tclBignumType ) { + if ( SetBignumFromAny( interp, objPtr ) != TCL_OK ) { + return TCL_ERROR; + } + } + UNPACK_BIGNUM( objPtr, temp ); + mp_init_copy( bignumValue, &temp ); + return TCL_OK; +} + +/* + *---------------------------------------------------------------------- + * + * Tcl_SetBignumObj -- + * + * This procedure sets the value of a Tcl_Obj to a large integer. + * + * Results: + * None. + * + * Side effects: + * Object value is stored. The bignum value is cleared, since + * ownership has transferred to Tcl. + * + *---------------------------------------------------------------------- + */ + +void +Tcl_SetBignumObj( Tcl_Obj* objPtr, + /* Object to set */ + mp_int* bignumValue ) + /* Value to store */ +{ + if ( Tcl_IsShared( objPtr ) ) { + Tcl_Panic( "Tcl_SetBignumObj called with shared object" ); + } + TclFreeIntRep( objPtr ); + objPtr->typePtr = &tclBignumType; + PACK_BIGNUM( *bignumValue, objPtr ); + Tcl_InvalidateStringRep( objPtr ); + + /* Clear the value with mp_init; mp_clear overwrites the digit array. */ + + mp_init( bignumValue ); +} + +/* + *---------------------------------------------------------------------- + * * Tcl_DbIncrRefCount -- * * This procedure is normally called when debugging: i.e., when diff --git a/generic/tclParse.c b/generic/tclParse.c index 9700f93..fbf1d65 100644 --- a/generic/tclParse.c +++ b/generic/tclParse.c @@ -13,7 +13,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclParse.c,v 1.41 2005/05/03 18:08:18 dgp Exp $ + * RCS: @(#) $Id: tclParse.c,v 1.42 2005/05/10 18:34:46 kennykb Exp $ */ #include "tclInt.h" diff --git a/generic/tclParseExpr.c b/generic/tclParseExpr.c index 61860f6..c6a478e 100644 --- a/generic/tclParseExpr.c +++ b/generic/tclParseExpr.c @@ -13,7 +13,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclParseExpr.c,v 1.24 2005/05/03 18:08:19 dgp Exp $ + * RCS: @(#) $Id: tclParseExpr.c,v 1.25 2005/05/10 18:34:47 kennykb Exp $ */ #include "tclInt.h" @@ -1451,43 +1451,32 @@ ParsePrimaryExpr(infoPtr) return code; } if (infoPtr->lexeme != OPEN_PAREN) { - /* - * Guess what kind of error we have by trying to tell - * whether we have a function or variable name here. - * Alas, this makes the parser more tightly bound with the - * rest of the interpreter, but that is the only way to - * give a sensible message here. Still, it is not too - * serious as this is only done when generating an error. - */ - Interp *iPtr = (Interp *) infoPtr->parsePtr->interp; - Tcl_DString functionName; - Tcl_HashEntry *hPtr; /* - * Look up the name as a function name. We need a writable - * copy (DString) so we can terminate it with a NULL for - * the benefit of Tcl_FindHashEntry which operates on - * NULL-terminated string keys. + * Either there's a math function without a (, or a + * variable name without a '$'. */ - Tcl_DStringInit(&functionName); - hPtr = Tcl_FindHashEntry(&iPtr->mathFuncTable, - Tcl_DStringAppend(&functionName, tokenPtr->start, - tokenPtr->size)); - Tcl_DStringFree(&functionName); - /* - * Assume that we have an attempted variable reference - * unless we've got a function name, as the set of - * potential function names is typically much smaller. - */ - if (hPtr != NULL) { - LogSyntaxError(infoPtr, - "expected parenthesis enclosing function arguments"); - } else { - LogSyntaxError(infoPtr, - "variable references require preceding $"); - } + Tcl_Obj* errMsg + = Tcl_NewStringObj( "syntax error in expression \"", -1 ); + TclAppendLimitedToObj( errMsg, + infoPtr->originalExpr, + (int) (infoPtr->lastChar + - infoPtr->originalExpr ), + 63, + NULL ); + Tcl_AppendToObj( errMsg, "\": the word \"", -1 ); + Tcl_AppendToObj( errMsg, tokenPtr->start, tokenPtr->size ); + Tcl_AppendToObj( errMsg, + "\" requires a preceding $ if it's a variable ", + -1 ); + Tcl_AppendToObj( errMsg, + "or function arguments if it's a function", -1 ); + Tcl_SetObjResult( infoPtr->parsePtr->interp, errMsg ); + infoPtr->parsePtr->errorType = TCL_PARSE_SYNTAX; + infoPtr->parsePtr->term = infoPtr->start; return TCL_ERROR; + } code = GetLexeme(infoPtr); /* skip over '(' */ if (code != TCL_OK) { @@ -1666,23 +1655,17 @@ GetLexeme(infoPtr) * so we can set an terminating NULL to keep strtod from * scanning too far. */ - char *startPtr, *termPtr; + char *startPtr; + CONST char *termPtr; double doubleValue; Tcl_DString toParse; errno = 0; Tcl_DStringInit(&toParse); startPtr = Tcl_DStringAppend(&toParse, src, length); - doubleValue = strtod(startPtr, &termPtr); + doubleValue = TclStrToD(startPtr, &termPtr); Tcl_DStringFree(&toParse); if (termPtr != startPtr) { - if (errno != 0) { - if (interp != NULL) { - TclExprFloatError(interp, doubleValue); - } - parsePtr->errorType = TCL_PARSE_BAD_NUMBER; - return TCL_ERROR; - } /* * startPtr was the start of a valid double, copied @@ -2077,7 +2060,7 @@ ParseMaxDoubleLength(string, end) case 'C': case 'D': case 'E': case 'F': case 'I': case 'N': case 'P': case 'X': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'i': case 'n': case 'p': case 'x': - case '.': case '+': case '-': + case '.': case '+': case '-': case '(': case ' ': case ')': p++; break; default: diff --git a/generic/tclPathObj.c b/generic/tclPathObj.c index 5a57477..08491cc 100644 --- a/generic/tclPathObj.c +++ b/generic/tclPathObj.c @@ -10,7 +10,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclPathObj.c,v 1.40 2005/02/05 09:15:42 davidw Exp $ + * RCS: @(#) $Id: tclPathObj.c,v 1.41 2005/05/10 18:34:47 kennykb Exp $ */ #include "tclInt.h" diff --git a/generic/tclPort.h b/generic/tclPort.h index 730ab76..ad98823 100644 --- a/generic/tclPort.h +++ b/generic/tclPort.h @@ -10,7 +10,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclPort.h,v 1.14 2005/01/05 10:31:02 dkf Exp $ + * RCS: @(#) $Id: tclPort.h,v 1.15 2005/05/10 18:34:47 kennykb Exp $ */ #ifndef _TCLPORT diff --git a/generic/tclProc.c b/generic/tclProc.c index 4d9e7e0..a87caa7 100644 --- a/generic/tclProc.c +++ b/generic/tclProc.c @@ -10,7 +10,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclProc.c,v 1.73 2005/02/02 23:09:06 mdejong Exp $ + * RCS: @(#) $Id: tclProc.c,v 1.74 2005/05/10 18:34:47 kennykb Exp $ */ #include "tclInt.h" diff --git a/generic/tclRegexp.c b/generic/tclRegexp.c index 25c30dc..dfc7236 100644 --- a/generic/tclRegexp.c +++ b/generic/tclRegexp.c @@ -10,7 +10,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclRegexp.c,v 1.18 2005/05/03 18:08:19 dgp Exp $ + * RCS: @(#) $Id: tclRegexp.c,v 1.19 2005/05/10 18:34:48 kennykb Exp $ */ #include "tclInt.h" diff --git a/generic/tclResult.c b/generic/tclResult.c index bf00083..770d7cb 100644 --- a/generic/tclResult.c +++ b/generic/tclResult.c @@ -8,7 +8,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclResult.c,v 1.24 2005/05/03 18:08:20 dgp Exp $ + * RCS: @(#) $Id: tclResult.c,v 1.25 2005/05/10 18:34:48 kennykb Exp $ */ #include "tclInt.h" diff --git a/generic/tclScan.c b/generic/tclScan.c index 624910c..2e4bf18 100644 --- a/generic/tclScan.c +++ b/generic/tclScan.c @@ -8,7 +8,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclScan.c,v 1.16 2004/10/06 15:59:25 dgp Exp $ + * RCS: @(#) $Id: tclScan.c,v 1.17 2005/05/10 18:34:49 kennykb Exp $ */ #include "tclInt.h" @@ -1144,7 +1144,7 @@ Tcl_ScanObjCmd(dummy, interp, objc, objv) if (!(flags & SCAN_SUPPRESS)) { double dvalue; *end = '\0'; - dvalue = strtod(buf, NULL); + dvalue = TclStrToD(buf, NULL); objPtr = Tcl_NewDoubleObj(dvalue); Tcl_IncrRefCount(objPtr); objs[objIndex++] = objPtr; diff --git a/generic/tclStrToD.c b/generic/tclStrToD.c new file mode 100755 index 0000000..2d622a7 --- /dev/null +++ b/generic/tclStrToD.c @@ -0,0 +1,1361 @@ +/* + *---------------------------------------------------------------------- + * + * tclStrToD.c -- + * + * This file contains a TclStrToD procedure that handles conversion + * of string to double, with correct rounding even where extended + * precision is needed to achieve that. It also contains a + * TclDoubleDigits procedure that handles conversion of double + * to string (at least the significand), and several utility functions + * for interconverting 'double' and the integer types. + * + * Copyright (c) 2005 by Kevin B. Kenny. All rights reserved. + * + * See the file "license.terms" for information on usage and redistribution + * of this file, and for a DISCLAIMER OF ALL WARRANTIES. + * + * RCS: @(#) $Id: tclStrToD.c,v 1.2 2005/05/10 18:34:49 kennykb Exp $ + * + *---------------------------------------------------------------------- + */ + +#include <tclInt.h> +#include <stdio.h> +#include <stdlib.h> +#include <float.h> +#include <limits.h> +#include <math.h> +#include <ctype.h> +#include <tommath.h> + +/* + * The stuff below is a bit of a hack so that this file can be used in + * environments that include no UNIX, i.e. no errno: just arrange to use + * the errno from tclExecute.c here. + */ + +#ifdef TCL_GENERIC_ONLY +#define NO_ERRNO_H +#endif + +#ifdef NO_ERRNO_H +extern int errno; /* Use errno from tclExecute.c. */ +#define ERANGE 34 +#endif + +#if ( FLT_RADIX == 2 ) && ( DBL_MANT_DIG == 53 ) && ( DBL_MAX_EXP == 1024 ) +#define IEEE_FLOATING_POINT +#endif + +/* + * gcc on x86 needs access to rounding controls. It is tempting to + * include fpu_control.h, but that file exists only on Linux; it is + * missing on Cygwin and MinGW. + */ + +#if defined(__GNUC__) && defined(__i386) +typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__HI__))); +#define _FPU_GETCW(cw) __asm__ ("fnstcw %0" : "=m" (*&cw)) +#define _FPU_SETCW(cw) __asm__ ("fldcw %0" : : "m" (*&cw)) +#endif + +/* The powers of ten that can be represented exactly as IEEE754 doubles. */ + +#define MAXPOW 22 +static double pow10 [MAXPOW+1]; + +static int mmaxpow; /* Largest power of ten that can be + * represented exactly in a 'double'. */ + +/* Inexact higher powers of ten */ + +static CONST double pow_10_2_n [] = { + 1.0, + 100.0, + 10000.0, + 1.0e+8, + 1.0e+16, + 1.0e+32, + 1.0e+64, + 1.0e+128, + 1.0e+256 +}; + +/* Logarithm of the floating point radix. */ + +static int log2FLT_RADIX; + +/* Number of bits in a double's significand */ + +static int mantBits; + +/* Table of powers of 5**(2**n), up to 5**256 */ + +static mp_int pow5[9]; + +/* The smallest representable double */ + +static double tiny; + +/* The maximum number of digits to the left of the decimal point of a + * double. */ + +static int maxDigits; + +/* The maximum number of digits to the right of the decimal point in a + * double. */ + +static int minDigits; + +/* Number of mp_digit's needed to hold the significand of a double */ + +static int mantDIGIT; + +/* Static functions defined in this file */ + +static double RefineResult _ANSI_ARGS_((double approx, CONST char* start, + int nDigits, long exponent)); +static double ParseNaN _ANSI_ARGS_(( int signum, CONST char** end )); +static double SafeLdExp _ANSI_ARGS_(( double fraction, int exponent )); + +/* + *---------------------------------------------------------------------- + * + * TclStrToD -- + * + * Scans a double from a string. + * + * Results: + * Returns the scanned number. In the case of underflow, returns + * an appropriately signed zero; in the case of overflow, returns + * an appropriately signed HUGE_VAL. + * + * Side effects: + * Stores a pointer to the end of the scanned number in '*endPtr', + * if endPtr is not NULL. If '*endPtr' is equal to 's' on return from + * this function, it indicates that the input string could not be + * recognized as a number. + * In the case of underflow or overflow, 'errno' is set to ERANGE. + * + *------------------------------------------------------------------------ + */ + +double +TclStrToD( CONST char* s, + /* String to scan */ + CONST char ** endPtr ) + /* Pointer to the end of the scanned number */ +{ + + CONST char* p = s; + CONST char* startOfSignificand = NULL; + /* Start of the significand in the + * string */ + int signum = 0; /* Sign of the significand */ + double exactSignificand = 0.0; + /* Significand, represented exactly + * as a floating-point number */ + int seenDigit = 0; /* Flag == 1 if a digit has been seen */ + int nSigDigs = 0; /* Number of significant digits presented */ + int nDigitsAfterDp = 0; /* Number of digits after the decimal point */ + int nTrailZero = 0; /* Number of trailing zeros in the + * significand */ + long exponent = 0; /* Exponent */ + int seenDp = 0; /* Flag == 1 if decimal point has been seen */ + + char c; /* One character extracted from the input */ + + /* + * v must be 'volatile double' on gc-ix86 to force correct rounding + * to IEEE double and not Intel double-extended. + */ + + volatile double v; /* Scanned value */ + int machexp; /* Exponent of the machine rep of the + * scanned value */ + int expt2; /* Exponent for computing first + * approximation to the true value */ + int i, j; + + /* + * With gcc on x86, the floating point rounding mode is double-extended. + * This causes the result of double-precision calculations to be rounded + * twice: once to the precision of double-extended and then again to the + * precision of double. Double-rounding introduces gratuitous errors of + * 1 ulp, so we need to change rounding mode to 53-bits. + */ + +#if defined(__GNUC__) && defined(__i386) + fpu_control_t roundTo53Bits = 0x027f; + fpu_control_t oldRoundingMode; + _FPU_GETCW( oldRoundingMode ); + _FPU_SETCW( roundTo53Bits ); +#endif + + /* Discard leading whitespace */ + + while ( isspace( *p ) ) { + ++p; + } + + /* Determine the sign of the significand */ + + switch( *p ) { + case '-': + signum = 1; + /* FALLTHROUGH */ + case '+': + ++p; + } + + /* Discard leading zeroes */ + + while ( *p == '0' ) { + seenDigit = 1; + ++p; + } + + /* + * Scan digits from the significand. Simultaneously, keep track + * of the number of digits after the decimal point. Maintain + * a pointer to the start of the significand. Keep "exactSignificand" + * equal to the conversion of the DBL_DIG most significant digits. + */ + + for ( ; ; ) { + c = *p; + if ( c == '.' && !seenDp ) { + seenDp = 1; + ++p; + } else if ( isdigit(c) ) { + if ( c == '0' ) { + if ( startOfSignificand != NULL ) { + ++nTrailZero; + } + } else { + if ( startOfSignificand == NULL ) { + startOfSignificand = p; + } else if ( nTrailZero ) { + if ( nTrailZero + nSigDigs < DBL_DIG ) { + exactSignificand *= pow10[ nTrailZero ]; + } else if ( nSigDigs < DBL_DIG ) { + exactSignificand *= pow10[ DBL_DIG - nSigDigs ]; + } + nSigDigs += nTrailZero; + } + if ( nSigDigs < DBL_DIG ) { + exactSignificand = 10. * exactSignificand + (c - '0'); + } + ++nSigDigs; + nTrailZero = 0; + } + if ( seenDp ) { + ++nDigitsAfterDp; + } + seenDigit = 1; + ++p; + } else { + break; + } + } + + /* + * At this point, we've scanned the significand, and p points + * to the character beyond it. "startOfSignificand" is the first + * non-zero character in the significand. "nSigDigs" is the number + * of significant digits of the significand, not including any + * trailing zeroes. "exactSignificand" is a floating point number + * that represents, without loss of precision, the first + * min(DBL_DIG,n) digits of the significand. "nDigitsAfterDp" + * is the number of digits after the decimal point, again excluding + * trailing zeroes. + * + * Now scan 'E' format + */ + + exponent = 0; + if ( seenDigit && ( *p == 'e' || *p == 'E' ) ) { + CONST char* stringSave = p; + ++p; + c = *p; + if ( isdigit( c ) || c == '+' || c == '-' ) { + errno = 0; + exponent = strtol( p, (char**)&p, 10 ); + if ( errno == ERANGE ) { + if ( exponent > 0 ) { + v = HUGE_VAL; + } else { + v = 0.0; + } + *endPtr = p; + goto returnValue; + } + } + if ( p == stringSave + 1 ) { + p = stringSave; + exponent = 0; + } + } + exponent = exponent + nTrailZero - nDigitsAfterDp; + + /* + * If we come here with no significant digits, we might still be + * looking at Inf or NaN. Go parse them. + */ + + if ( !seenDigit ) { + + /* Test for Inf */ + + if ( c == 'I' || c == 'i' ) { + + if ( ( p[1] == 'N' || p[1] == 'n' ) + && ( p[2] == 'F' || p[2] == 'f' ) ) { + p += 3; + if ( ( p[0] == 'I' || p[0] == 'i' ) + && ( p[1] == 'N' || p[1] == 'n' ) + && ( p[2] == 'I' || p[2] == 'i' ) + && ( p[3] == 'T' || p[3] == 't' ) + && ( p[4] == 'Y' || p[1] == 'y' ) ) { + p += 5; + } + errno = ERANGE; + v = HUGE_VAL; + if ( endPtr != NULL ) { + *endPtr = p; + } + goto returnValue; + } + + +#ifdef IEEE_FLOATING_POINT + + /* IEEE floating point supports NaN */ + + } else if ( (c == 'N' || c == 'n' ) + && ( sizeof(Tcl_WideUInt) == sizeof( double ) ) ) { + + if ( ( p[1] == 'A' || p[1] == 'a' ) + && ( p[2] == 'N' || p[2] == 'n' ) ) { + p += 3; + + if ( endPtr != NULL ) { + *endPtr = p; + } + + /* Restore FPU mode word */ + +#if defined(__GNUC__) && defined(__i386) + _FPU_SETCW( oldRoundingMode ); +#endif + return ParseNaN( signum, endPtr ); + + } +#endif + + } + + goto error; + } + + /* + * We've successfully scanned; update the end-of-element pointer. + */ + + if ( endPtr != NULL ) { + *endPtr = p; + } + + /* Test for zero. */ + + if ( nSigDigs == 0 ) { + v = 0.0; + goto returnValue; + } + + /* + * The easy cases are where we have an exact significand and + * the exponent is small enough that we can compute the value + * with only one roundoff. In addition to the cases where we + * can multiply or divide an exact-integer significand by an + * exact-integer power of 10, there is also David Gay's case + * where we can scale the significand by a power of 10 (still + * keeping it exact) and then multiply by an exact power of 10. + * The last case enables combinations like 83e25 that would + * otherwise require high precision arithmetic. + */ + + if ( nSigDigs <= DBL_DIG ) { + if ( exponent >= 0 ) { + if ( exponent <= mmaxpow ) { + v = exactSignificand * pow10[ exponent ]; + goto returnValue; + } else { + int diff = DBL_DIG - nSigDigs; + if ( exponent - diff <= mmaxpow ) { + volatile double factor = exactSignificand * pow10[ diff ]; + v = factor * pow10[ exponent - diff ]; + goto returnValue; + } + } + } else { + if ( exponent >= -mmaxpow ) { + v = exactSignificand / pow10[ -exponent ]; + goto returnValue; + } + } + } + + /* + * We don't have one of the easy cases, so we can't compute the + * scanned number exactly, and have to do it in multiple precision. + * Begin by testing for obvious overflows and underflows. + */ + + if ( nSigDigs + exponent - 1 > maxDigits ) { + v = HUGE_VAL; + errno = ERANGE; + goto returnValue; + } + if ( nSigDigs + exponent - 1 < minDigits ) { + errno = ERANGE; + v = 0.; + goto returnValue; + } + + /* + * Nothing exceeds the boundaries of the tables, at least. + * Compute an approximate value for the number, with + * no possibility of overflow because we manage the exponent + * separately. + */ + + if ( nSigDigs > DBL_DIG ) { + expt2 = exponent + nSigDigs - DBL_DIG; + } else { + expt2 = exponent; + } + v = frexp( exactSignificand, &machexp ); + if ( expt2 > 0 ) { + v = frexp( v * pow10[ expt2 & 0xf ], &j ); + machexp += j; + for ( i = 4; i < 9; ++i ) { + if ( expt2 & ( 1 << i ) ) { + v = frexp( v * pow_10_2_n[ i ], &j ); + machexp += j; + } + } + } else { + v = frexp( v / pow10[ (-expt2) & 0xf ], &j ); + machexp += j; + for ( i = 4; i < 9; ++i ) { + if ( (-expt2) & ( 1 << i ) ) { + v = frexp( v / pow_10_2_n[ i ], &j ); + machexp += j; + } + } + } + + /* + * A first approximation is that the result will be v * 2 ** machexp. + * v is greater than or equal to 0.5 and less than 1. + * If machexp > DBL_MAX_EXP * log2(FLT_RADIX), there is an overflow. + * Constrain the result to the smallest representible number to avoid + * premature underflow. + */ + + if ( machexp > DBL_MAX_EXP * log2FLT_RADIX ) { + v = HUGE_VAL; + errno = ERANGE; + goto returnValue; + } + + v = SafeLdExp( v, machexp ); + if ( v < tiny ) { + v = tiny; + } + + /* We have a first approximation in v. Now we need to refine it. */ + + v = RefineResult( v, startOfSignificand, nSigDigs, exponent ); + + /* In a very few cases, a second iteration is needed. e.g., 457e-102 */ + + v = RefineResult( v, startOfSignificand, nSigDigs, exponent ); + + /* Handle underflow */ + + returnValue: + if ( nSigDigs != 0 && v == 0.0 ) { + errno = ERANGE; + } + + /* Return a number with correct sign */ + + if ( signum ) { + v = -v; + } + + /* Restore FPU mode word */ + +#if defined(__GNUC__) && defined(__i386) + _FPU_SETCW( oldRoundingMode ); +#endif + + return v; + + /* Come here on an invalid input */ + + error: + if ( endPtr != NULL ) { + *endPtr = s; + } + + /* Restore FPU mode word */ + +#if defined(__GNUC__) && defined(__i386) + _FPU_SETCW( oldRoundingMode ); +#endif + return 0.0; + +} + +/* + *---------------------------------------------------------------------- + * + * RefineResult -- + * + * Given a poor approximation to a floating point number, returns + * a better one (The better approximation is correct to within + * 1 ulp, and is entirely correct if the poor approximation is + * correct to 1 ulp.) + * + * Results: + * Returns the improved result. + * + *---------------------------------------------------------------------- + */ + +static double +RefineResult( double approxResult, + /* Approximate result of conversion */ + CONST char* sigStart, + /* Pointer to start of significand in + * input string. */ + int nSigDigs, /* Number of significant digits */ + long exponent ) /* Power of ten to multiply by significand */ +{ + + int M2, M5; /* Powers of 2 and of 5 needed to put + * the decimal and binary numbers over + * a common denominator. */ + double significand; /* Sigificand of the binary number */ + int binExponent; /* Exponent of the binary number */ + + int msb; /* Most significant bit position of an + * intermediate result */ + int nDigits; /* Number of mp_digit's in an intermediate + * result */ + mp_int twoMv; /* Approx binary value expressed as an + * exact integer scaled by the multiplier 2M */ + mp_int twoMd; /* Exact decimal value expressed as an + * exact integer scaled by the multiplier 2M */ + int scale; /* Scale factor for M */ + int multiplier; /* Power of two to scale M */ + double num, den; /* Numerator and denominator of the + * correction term */ + double quot; /* Correction term */ + double minincr; /* Lower bound on the absolute value + * of the correction term. */ + int i; + CONST char* p; + + /* + * The first approximation is always low. If we find that + * it's HUGE_VAL, we're done. + */ + + if ( approxResult == HUGE_VAL ) { + return approxResult; + } + + /* + * Find a common denominator for the decimal and binary fractions. + * The common denominator will be 2**M2 + 5**M5. + */ + + significand = frexp( approxResult, &binExponent ); + i = mantBits - binExponent; + if ( i < 0 ) { + M2 = 0; + } else { + M2 = i; + } + if ( exponent > 0 ) { + M5 = 0; + } else { + M5 = -exponent; + if ( (M5-1) > M2 ) { + M2 = M5-1; + } + } + + /* + * The floating point number is significand*2**binExponent. + * The 2**-1 bit of the significand (the most significant) + * corresponds to the 2**(binExponent+M2 + 1) bit of 2*M2*v. + * Allocate enough digits to hold that quantity, then + * convert the significand to a large integer, scaled + * appropriately. Then multiply by the appropriate power of 5. + */ + + msb = binExponent + M2; /* 1008 */ + nDigits = msb / DIGIT_BIT + 1; + mp_init_size( &twoMv, nDigits ); + i = ( msb % DIGIT_BIT + 1 ); + twoMv.used = nDigits; + significand *= SafeLdExp( 1.0, i ); + while ( -- nDigits >= 0 ) { + twoMv.dp[nDigits] = (mp_digit) significand; + significand -= (mp_digit) significand; + significand = SafeLdExp( significand, DIGIT_BIT ); + } + for ( i = 0; i <= 8; ++i ) { + if ( M5 & ( 1 << i ) ) { + mp_mul( &twoMv, pow5+i, &twoMv ); + } + } + + /* + * Collect the decimal significand as a high precision integer. + * The least significant bit corresponds to bit M2+exponent+1 + * so it will need to be shifted left by that many bits after + * being multiplied by 5**(M5+exponent). + */ + + mp_init( &twoMd ); mp_zero( &twoMd ); + i = nSigDigs; + for ( p = sigStart ; ; ++p ) { + char c = *p; + if ( isdigit( c ) ) { + mp_mul_d( &twoMd, (unsigned) 10, &twoMd ); + mp_add_d( &twoMd, (unsigned) (c - '0'), &twoMd ); + --i; + if ( i == 0 ) break; + } + } + for ( i = 0; i <= 8; ++i ) { + if ( (M5+exponent) & ( 1 << i ) ) { + mp_mul( &twoMd, pow5+i, &twoMd ); + } + } + mp_mul_2d( &twoMd, M2+exponent+1, &twoMd ); + mp_sub( &twoMd, &twoMv, &twoMd ); + + /* + * The result, 2Mv-2Md, needs to be divided by 2M to yield a correction + * term. Because 2M may well overflow a double, we need to scale the + * denominator by a factor of 2**binExponent-mantBits + */ + + scale = binExponent - mantBits - 1; + + mp_set( &twoMv, 1 ); + for ( i = 0; i <= 8; ++i ) { + if ( M5 & ( 1 << i ) ) { + mp_mul( &twoMv, pow5+i, &twoMv ); + } + } + multiplier = M2 + scale + 1; + if ( multiplier > 0 ) { + mp_mul_2d( &twoMv, multiplier, &twoMv ); + } else if ( multiplier < 0 ) { + mp_div_2d( &twoMv, -multiplier, &twoMv, NULL ); + } + + /* + * If the result is less than unity, the error is less than 1/2 unit + * in the last place, so there's no correction to make. + */ + + if ( mp_cmp_mag( &twoMd, &twoMv ) == MP_LT ) { + return approxResult; + } + + /* + * Convert the numerator and denominator of the corrector term + * accurately to floating point numbers. + */ + + num = TclBignumToDouble( &twoMd ); + den = TclBignumToDouble( &twoMv ); + + quot = SafeLdExp( num/den, scale ); + minincr = SafeLdExp( 1.0, binExponent - mantBits ); + + if ( quot < 0. && quot > -minincr ) { + quot = -minincr; + } else if ( quot > 0. && quot < minincr ) { + quot = minincr; + } + + mp_clear( &twoMd ); + mp_clear( &twoMv ); + + + return approxResult + quot; +} + +/* + *---------------------------------------------------------------------- + * + * ParseNaN -- + * + * Parses a "not a number" from an input string, and returns the + * double precision NaN corresponding to it. + * + * Side effects: + * Advances endPtr to follow any (hex) in the input string. + * + * If the NaN is followed by a left paren, a string of spaes + * and hexadecimal digits, and a right paren, endPtr is advanced + * to follow it. + * + * The string of hexadecimal digits is OR'ed into the resulting + * NaN, and the signum is set as well. Note that a signalling NaN + * is never returned. + * + *---------------------------------------------------------------------- + */ + +double +ParseNaN( int signum, /* Flag == 1 if minus sign has been + * seen in front of NaN */ + CONST char** endPtr ) + /* Pointer-to-pointer to char following "NaN" + * in the input string */ +{ + CONST char* p = *endPtr; + char c; + union { + Tcl_WideUInt iv; + double dv; + } theNaN; + + /* Scan off a hex number in parentheses. Embedded blanks are ok. */ + + theNaN.iv = 0; + if ( *p == '(' ) { + ++p; + for ( ; ; ) { + c = *p++; + if ( isspace(c) ) { + continue; + } else if ( c == ')' ) { + *endPtr = p; + break; + } else if ( isdigit(c) ) { + c -= '0'; + } else if ( c >= 'A' && c <= 'F' ) { + c = c - 'A' + 10; + } else if ( c >= 'a' && c <= 'f' ) { + c = c - 'a' + 10; + } else { + theNaN.iv = ( ((Tcl_WideUInt) 0x7ff8) << 48 ) + | ( ((Tcl_WideUInt) signum) << 63 ); + return theNaN.dv; + } + theNaN.iv = (theNaN.iv << 4) | c; + } + } + + /* + * Mask the hex number down to the least significant 51 bits. + */ + + theNaN.iv &= ( ((Tcl_WideUInt) 1) << 51 ) - 1; + if ( signum ) { + theNaN.iv |= ((Tcl_WideUInt) 0xfff8) << 48; + } else { + theNaN.iv |= ((Tcl_WideUInt) 0x7ff8) << 48; + } + + *endPtr = p; + return theNaN.dv; +} + +/* + *---------------------------------------------------------------------- + * + * TclDoubleDigits -- + * + * Converts a double to a string of digits. + * + * Results: + * Returns the position of the character in the string + * after which the decimal point should appear. Since + * the string contains only significant digits, the + * position may be less than zero or greater than the + * length of the string. + * + * Side effects: + * Stores the digits in the given buffer and sets 'signum' + * according to the sign of the number. + * + *---------------------------------------------------------------------- + */ + +int +TclDoubleDigits( char * strPtr, /* Buffer in which to store the result, + * must have at least 18 chars */ + double v, /* Number to convert. Must be + * finite, and not NaN */ + int *signum ) /* Output: 1 if the number is negative. + * Should handle -0 correctly on the + * IEEE architecture. */ +{ + + double f; /* Significand of v */ + + int e; /* Power of FLT_RADIX that satisfies + * v = f * FLT_RADIX**e */ + + + int low_ok; + int high_ok; + + mp_int r; /* Scaled significand */ + mp_int s; /* Divisor such that v = r / s */ + mp_int mplus; /* Scaled epsilon: (r + 2* mplus) == + * v(+) where v(+) is the floating point + * successor of v. */ + mp_int mminus; /* Scaled epsilon: (r - 2*mminus ) == + * v(-) where v(-) is the floating point + * predecessor of v. */ + mp_int temp; + + int rfac2 = 0; /* Powers of 2 and 5 by which large */ + int rfac5 = 0; /* integers should be scaled */ + int sfac2 = 0; + int sfac5 = 0; + int mplusfac2 = 0; + int mminusfac2 = 0; + + double a; + char c; + int i, k, n; + + /* + * Take the absolute value of the number, and report the number's + * sign. Take special steps to preserve signed zeroes in IEEE floating + * point. (We can't use fpclassify, because that's a C9x feature and + * we still have to build on C89 compilers.) + */ + +#ifndef IEEE_FLOATING_POINT + if ( v >= 0.0 ) { + *signum = 0; + } else { + *signum = 1; + v = -v; + } +#else + union { + Tcl_WideUInt iv; + double dv; + } bitwhack; + bitwhack.dv = v; + if ( bitwhack.iv & ( (Tcl_WideUInt) 1 << 63 ) ) { + *signum = 1; + bitwhack.iv &= ~( (Tcl_WideUInt) 1 << 63 ); + v = bitwhack.dv; + } else { + *signum = 0; + } +#endif + + /* Handle zero specially */ + + if ( v == 0.0 ) { + *strPtr++ = '0'; + *strPtr++ = '\0'; + return 1; + } + + /* + * Develop f and e such that v = f * FLT_RADIX**e, with + * 1.0/FLT_RADIX <= f < 1. + */ + + f = frexp( v, &e ); + n = e % log2FLT_RADIX; + if ( n > 0 ) { + n -= log2FLT_RADIX; + e += 1; + } + f *= ldexp( 1.0, n ); + e = ( e - n ) / log2FLT_RADIX; + if ( f == 1.0 ) { + f = 1.0 / FLT_RADIX; + e += 1; + } + + /* + * If the original number was denormalized, adjust e and f to be + * denormal as well. + */ + + if ( e < DBL_MIN_EXP ) { + n = mantBits + ( e - DBL_MIN_EXP ) * log2FLT_RADIX; + f = ldexp( f, ( e - DBL_MIN_EXP ) * log2FLT_RADIX ); + e = DBL_MIN_EXP; + n = ( n + DIGIT_BIT - 1 ) / DIGIT_BIT; + } else { + n = mantDIGIT; + } + + /* + * Now extract the base-2**DIGIT_BIT digits of f into a multi-precision + * integer r. Preserve the invariant v = r * 2**rfac2 * FLT_RADIX**e + * by adjusting e. + */ + + a = f; + n = mantDIGIT; + mp_init_size( &r, n ); + r.used = n; + r.sign = MP_ZPOS; + i = ( mantBits % DIGIT_BIT ); + if ( i == 0 ) { + i = DIGIT_BIT; + } + while ( n > 0 ) { + a *= ldexp( 1.0, i ); + i = DIGIT_BIT; + r.dp[--n] = (mp_digit) a; + a -= (mp_digit) a; + } + e -= DBL_MANT_DIG; + + low_ok = high_ok = ( mp_iseven( &r ) ); + + /* + * We are going to want to develop integers r, s, mplus, and mminus + * such that v = r / s, v(+)-v / 2 = mplus / s; v-v(-) / 2 = mminus / s + * and then scale either s or r, mplus, mminus by an appropriate + * power of ten. + * + * We actually do this by keeping track of the powers of 2 and 5 + * by which f is multiplied to yield v and by which 1 is multiplied + * to yield s, mplus, and mminus. + */ + + if ( e >= 0 ) { + + int bits = e * log2FLT_RADIX; + + if ( f != 1.0 / FLT_RADIX ) { + + /* Normal case, m+ and m- are both FLT_RADIX**e */ + + rfac2 += bits + 1; + sfac2 = 1; + mplusfac2 = bits; + mminusfac2 = bits; + + } else { + + /* + * If f is equal to the smallest significand, then we need another + * factor of FLT_RADIX in s to cope with stepping to + * the next smaller exponent when going to e's predecessor. + */ + + rfac2 += bits + log2FLT_RADIX - 1; + sfac2 = 1 + log2FLT_RADIX; + mplusfac2 = bits + log2FLT_RADIX; + mminusfac2 = bits; + + } + + } else { + + /* v has digits after the binary point */ + + if ( e <= DBL_MIN_EXP - DBL_MANT_DIG + || f != 1.0 / FLT_RADIX ) { + + /* + * Either f isn't the smallest significand or e is + * the smallest exponent. mplus and mminus will both be 1. + */ + + rfac2 += 1; + sfac2 = 1 - e * log2FLT_RADIX; + mplusfac2 = 0; + mminusfac2 = 0; + + } else { + + /* + * f is the smallest significand, but e is not the smallest + * exponent. We need to scale by FLT_RADIX again to cope + * with the fact that v's predecessor has a smaller exponent. + */ + + rfac2 += 1 + log2FLT_RADIX; + sfac2 = 1 + log2FLT_RADIX * ( 1 - e ); + mplusfac2 = FLT_RADIX; + mminusfac2 = 0; + + } + } + + /* + * Estimate the highest power of ten that will be + * needed to hold the result. + */ + + k = (int) ceil( log( v ) / log( 10. ) ); + if ( k >= 0 ) { + sfac2 += k; + sfac5 = k; + } else { + rfac2 -= k; + mplusfac2 -= k; + mminusfac2 -= k; + rfac5 = -k; + } + + /* + * Scale r, s, mplus, mminus by the appropriate powers of 2 and 5. + */ + + mp_init_set( &mplus, 1 ); + for ( i = 0; i <= 8; ++i ) { + if ( rfac5 & ( 1 << i ) ) { + mp_mul( &mplus, pow5+i, &mplus ); + } + } + mp_mul( &r, &mplus, &r ); + mp_mul_2d( &r, rfac2, &r ); + mp_init_copy( &mminus, &mplus ); + mp_mul_2d( &mplus, mplusfac2, &mplus ); + mp_mul_2d( &mminus, mminusfac2, &mminus ); + mp_init_set( &s, 1 ); + for ( i = 0; i <= 8; ++i ) { + if ( sfac5 & ( 1 << i ) ) { + mp_mul( &s, pow5+i, &s ); + } + } + mp_mul_2d( &s, sfac2, &s ); + + /* + * It is possible for k to be off by one because we used an + * inexact logarithm. + */ + + mp_init( &temp ); + mp_add( &r, &mplus, &temp ); + i = mp_cmp_mag( &temp, &s ); + if ( i > 0 || ( high_ok && i == 0 ) ) { + mp_mul_d( &s, 10, &s ); + ++k; + } else { + mp_mul_d( &temp, 10, &temp ); + i = mp_cmp_mag( &temp, &s ); + if ( i < 0 || ( high_ok && i == 0 ) ) { + mp_mul_d( &r, 10, &r ); + mp_mul_d( &mplus, 10, &mplus ); + mp_mul_d( &mminus, 10, &mminus ); + --k; + } + } + + /* + * At this point, k contains the power of ten by which we're + * scaling the result. r/s is at least 1/10 and strictly less + * than ten, and v = r/s * 10**k. mplus and mminus give the + * rounding limits. + */ + + for ( ; ; ) { + int tc1, tc2; + mp_mul_d( &r, 10, &r ); + mp_div( &r, &s, &temp, &r ); /* temp = 10r / s; r = 10r mod s */ + i = temp.dp[0]; + mp_mul_d( &mplus, 10, &mplus ); + mp_mul_d( &mminus, 10, &mminus ); + tc1 = mp_cmp_mag( &r, &mminus ); + if ( low_ok ) { + tc1 = ( tc1 <= 0 ); + } else { + tc1 = ( tc1 < 0 ); + } + mp_add( &r, &mplus, &temp ); + tc2 = mp_cmp_mag( &temp, &s ); + if ( high_ok ) { + tc2 = ( tc2 >= 0 ); + } else { + tc2= ( tc2 > 0 ); + } + if ( ! tc1 ) { + if ( !tc2 ) { + *strPtr++ = '0' + i; + } else { + c = (char) (i + '1'); + break; + } + } else { + if ( !tc2 ) { + c = (char) (i + '0'); + } else { + mp_mul_2d( &r, 1, &r ); + n = mp_cmp_mag( &r, &s ); + if ( n < 0 ) { + c = (char) (i + '0'); + } else { + c = (char) (i + '1'); + } + } + break; + } + }; + *strPtr++ = c; + *strPtr++ = '\0'; + + /* Free memory */ + + mp_clear_multi( &r, &s, &mplus, &mminus, &temp, NULL ); + return k; + +} + +/* + *---------------------------------------------------------------------- + * + * TclInitDoubleConversion -- + * + * Initializes constants that are needed for conversions to and + * from 'double' + * + * Results: + * None. + * + * Side effects: + * The log base 2 of the floating point radix, the number of + * bits in a double mantissa, and a table of the powers of five + * and ten are computed and stored. + * + *---------------------------------------------------------------------- + */ + +void +TclInitDoubleConversion( void ) +{ + int i; + int x; + double d; + if ( frexp( (double) FLT_RADIX, &log2FLT_RADIX ) != 0.5 ) { + Tcl_Panic( "This code doesn't work on a decimal machine!" ); + } + --log2FLT_RADIX; + mantBits = DBL_MANT_DIG * log2FLT_RADIX; + d = 1.0; + x = (int) (DBL_MANT_DIG * log((double) FLT_RADIX) / log( 5.0 )); + if ( x < MAXPOW ) { + mmaxpow = x; + } else { + mmaxpow = MAXPOW; + } + for ( i = 0; i <= mmaxpow; ++i ) { + pow10[i] = d; + d *= 10.0; + } + for ( i = 0; i < 9; ++i ) { + mp_init( pow5 + i ); + } + mp_set( pow5, 5 ); + for ( i = 0; i < 8; ++i ) { + mp_sqr( pow5+i, pow5+i+1 ); + } + tiny = SafeLdExp( 1.0, DBL_MIN_EXP * log2FLT_RADIX - mantBits ); + maxDigits = (int) ((DBL_MAX_EXP * log((double) FLT_RADIX) + + 0.5 * log(10.)) + / log( 10. )); + minDigits = (int) floor ( ( DBL_MIN_EXP - DBL_MANT_DIG ) + * log( (double) FLT_RADIX ) / log( 10. ) ); + mantDIGIT = ( mantBits + DIGIT_BIT - 1 ) / DIGIT_BIT; +} + +/* + *---------------------------------------------------------------------- + * + * TclFinalizeDoubleConversion -- + * + * Cleans up this file on exit. + * + * Results: + * None + * + * Side effects: + * Memory allocated by TclInitDoubleConversion is freed. + * + *---------------------------------------------------------------------- + */ + +void +TclFinalizeDoubleConversion() +{ + int i; + for ( i = 0; i < 9; ++i ) { + mp_clear( pow5 + i ); + } +} + +/* + *---------------------------------------------------------------------- + * + * TclBignumToDouble -- + * + * Convert an arbitrary-precision integer to a native floating + * point number. + * + * Results: + * Returns the converted number. Sets errno to ERANGE if the + * number is too large to convert. + * + *---------------------------------------------------------------------- + */ + +double +TclBignumToDouble( mp_int* a ) + /* Integer to convert */ +{ + mp_int b; + int bits; + int shift; + int i; + double r; + + /* Determine how many bits we need, and extract that many from + * the input. Round to nearest unit in the last place. */ + + bits = mp_count_bits( a ); + if ( bits > DBL_MAX_EXP * log2FLT_RADIX ) { + errno = ERANGE; + return HUGE_VAL; + } + shift = mantBits + 1 - bits; + mp_init( &b ); + if ( shift > 0 ) { + mp_mul_2d( a, shift, &b ); + } else if ( shift < 0 ) { + mp_div_2d( a, -shift, &b, NULL ); + } else { + mp_copy( a, &b ); + } + mp_add_d( &b, 1, &b ); + mp_div_2d( &b, 1, &b, NULL ); + + /* Accumulate the result, one mp_digit at a time */ + + r = 0.0; + for ( i = b.used-1; i >= 0; --i ) { + r = ldexp( r, DIGIT_BIT ) + b.dp[i]; + } + mp_clear( &b ); + + /* Scale the result to the correct number of bits. */ + + r = ldexp( r, bits - mantBits ); + + /* Return the result with the appropriate sign. */ + + if ( a->sign == MP_ZPOS ) { + return r; + } else { + return -r; + } +} + +/* + *---------------------------------------------------------------------- + * + * SafeLdExp -- + * + * Do an 'ldexp' operation, but handle denormals gracefully. + * + * Results: + * Returns the appropriately scaled value. + * + * On some platforms, 'ldexp' fails when presented with a number + * too small to represent as a normalized double. This routine + * does 'ldexp' in two steps for those numbers, to return correctly + * denormalized values. + * + *---------------------------------------------------------------------- + */ + +static double +SafeLdExp( double fract, int expt ) +{ + int minexpt = DBL_MIN_EXP * log2FLT_RADIX; + volatile double a, b, retval; + if ( expt < minexpt ) { + a = ldexp( fract, expt - mantBits - minexpt ); + b = ldexp( 1.0, mantBits + minexpt ); + retval = a * b; + } else { + retval = ldexp( fract, expt ); + } + return retval; +} + +/* + *---------------------------------------------------------------------- + * + * TclFormatNaN -- + * + * Makes the string representation of a "Not a Number" + * + * Results: + * None. + * + * Side effects: + * Stores the string representation in the supplied buffer, + * which must be at least TCL_DOUBLE_SPACE characters. + * + *---------------------------------------------------------------------- + */ + +void +TclFormatNaN( double value, /* The Not-a-Number to format */ + char* buffer ) /* String representation */ +{ +#ifndef IEEE_FLOATING_POINT + strcpy( buffer, "NaN" ); + return; +#else + + union { + double dv; + Tcl_WideUInt iv; + } bitwhack; + + bitwhack.dv = value; + if ( bitwhack.iv & ((Tcl_WideUInt) 1 << 63 ) ) { + bitwhack.iv &= ~ ((Tcl_WideUInt) 1 << 63 ); + *buffer++ = '-'; + } + *buffer++ = 'N'; *buffer++ = 'a'; *buffer++ = 'N'; + bitwhack.iv &= (((Tcl_WideUInt) 1) << 51) - 1; + if ( bitwhack.iv != 0 ) { + sprintf( buffer, "(%" TCL_LL_MODIFIER "x)", bitwhack.iv ); + } else { + *buffer = '\0'; + } + +#endif +} diff --git a/generic/tclStringObj.c b/generic/tclStringObj.c index 9d01456..0e8c1f1 100644 --- a/generic/tclStringObj.c +++ b/generic/tclStringObj.c @@ -33,7 +33,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclStringObj.c,v 1.36 2005/04/01 15:17:26 msofer Exp $ */ + * RCS: @(#) $Id: tclStringObj.c,v 1.37 2005/05/10 18:34:49 kennykb Exp $ */ #include "tclInt.h" diff --git a/generic/tclStubInit.c b/generic/tclStubInit.c index 020f1ab..8240c9c 100644 --- a/generic/tclStubInit.c +++ b/generic/tclStubInit.c @@ -8,7 +8,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclStubInit.c,v 1.115 2005/05/05 18:38:04 dgp Exp $ + * RCS: @(#) $Id: tclStubInit.c,v 1.116 2005/05/10 18:34:49 kennykb Exp $ */ #include "tclInt.h" @@ -303,6 +303,11 @@ TclIntStubs tclIntStubs = { TclStackFree, /* 216 */ TclPushStackFrame, /* 217 */ TclPopStackFrame, /* 218 */ + TclBN_mp_div_d, /* 219 */ + TclBN_mp_mul_d, /* 220 */ + TclBN_mp_clear, /* 221 */ + TclBN_mp_init, /* 222 */ + TclBN_mp_read_radix, /* 223 */ }; TclIntPlatStubs tclIntPlatStubs = { @@ -971,6 +976,10 @@ TclStubs tclStubs = { Tcl_SetTimeProc, /* 552 */ Tcl_QueryTimeProc, /* 553 */ Tcl_ChannelThreadActionProc, /* 554 */ + Tcl_NewBignumObj, /* 555 */ + Tcl_DbNewBignumObj, /* 556 */ + Tcl_SetBignumObj, /* 557 */ + Tcl_GetBignumFromObj, /* 558 */ }; /* !END!: Do not edit above this line. */ diff --git a/generic/tclTest.c b/generic/tclTest.c index cb3a314..68b8963 100644 --- a/generic/tclTest.c +++ b/generic/tclTest.c @@ -14,7 +14,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclTest.c,v 1.88 2005/01/28 13:38:57 dkf Exp $ + * RCS: @(#) $Id: tclTest.c,v 1.89 2005/05/10 18:34:50 kennykb Exp $ */ #define TCL_TEST diff --git a/generic/tclTestObj.c b/generic/tclTestObj.c index 5c45d70..9e29ed1 100644 --- a/generic/tclTestObj.c +++ b/generic/tclTestObj.c @@ -8,14 +8,16 @@ * * Copyright (c) 1995-1998 Sun Microsystems, Inc. * Copyright (c) 1999 by Scriptics Corporation. + * Copyright (c) 2005 by Kevin B. Kenny. All rights reserved. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclTestObj.c,v 1.12 2002/12/04 13:09:24 vincentdarley Exp $ + * RCS: @(#) $Id: tclTestObj.c,v 1.13 2005/05/10 18:34:50 kennykb Exp $ */ #include "tclInt.h" +#include "tommath.h" /* * An array of Tcl_Obj pointers used in the commands that operate on or get @@ -37,6 +39,9 @@ static int GetVariableIndex _ANSI_ARGS_((Tcl_Interp *interp, static void SetVarToObj _ANSI_ARGS_((int varIndex, Tcl_Obj *objPtr)); int TclObjTest_Init _ANSI_ARGS_((Tcl_Interp *interp)); +static int TestbignumobjCmd _ANSI_ARGS_((ClientData dummy, + Tcl_Interp *interp, int objc, + Tcl_Obj *CONST objv[])); static int TestbooleanobjCmd _ANSI_ARGS_((ClientData dummy, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])); @@ -95,6 +100,8 @@ TclObjTest_Init(interp) varPtr[i] = NULL; } + Tcl_CreateObjCommand( interp, "testbignumobj", TestbignumobjCmd, + (ClientData) 0, (Tcl_CmdDeleteProc*) NULL ); Tcl_CreateObjCommand(interp, "testbooleanobj", TestbooleanobjCmd, (ClientData) 0, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateObjCommand(interp, "testconvertobj", TestconvertobjCmd, @@ -115,6 +122,169 @@ TclObjTest_Init(interp) /* *---------------------------------------------------------------------- * + * TestbignumobjCmd -- + * + * This procedure implmenets the "testbignumobj" command. It is used + * to exercise the bignum Tcl object type implementation. + * + * Results: + * Returns a standard Tcl object result. + * + * Side effects: + * Creates and frees bignum objects; converts objects to have bignum + * type. + * + *---------------------------------------------------------------------- + */ + +static int +TestbignumobjCmd( clientData, interp, objc, objv ) + ClientData clientData; /* unused */ + Tcl_Interp* interp; /* Tcl interpreter */ + int objc; /* Argument count */ + Tcl_Obj* CONST objv[]; /* Argument vector */ +{ + + const char * subcmds[] = { + "set", "get", "mult10", "div10", + NULL + }; + enum options { + BIGNUM_SET, BIGNUM_GET, BIGNUM_MULT10, BIGNUM_DIV10 + }; + + int index; + int varIndex; + char* string; + mp_int bignumValue, newValue; + + if ( objc < 3 ) { + Tcl_WrongNumArgs( interp, 1, objv, "option ?arg?..." ); + return TCL_ERROR; + } + if ( Tcl_GetIndexFromObj( interp, objv[1], subcmds, "option", 0, &index ) + != TCL_OK ) { + return TCL_ERROR; + } + string = Tcl_GetString( objv[ 2 ] ); + if ( GetVariableIndex( interp, string, &varIndex ) != TCL_OK ) { + return TCL_ERROR; + } + + switch ( index ) + { + case BIGNUM_SET: + if ( objc != 4 ) { + Tcl_WrongNumArgs( interp, 2, objv, "var value" ); + } + string = Tcl_GetString( objv[3] ); + if ( mp_init( &bignumValue ) != MP_OKAY ) { + Tcl_SetObjResult( interp, + Tcl_NewStringObj( "error in mp_init", -1 ) ); + return TCL_ERROR; + } + if ( mp_read_radix( &bignumValue, string, 10 ) + != MP_OKAY ) { + mp_clear( &bignumValue ); + Tcl_SetObjResult( interp, + Tcl_NewStringObj( "error in mp_read_radix", + -1 ) ); + return TCL_ERROR; + } + + /* + * If the object currently bound to the variable with index + * varIndex has ref count 1 (i.e. the object is unshared) we can + * modify that object directly. Otherwise, if RC>1 (i.e. the + * object is shared), we must create a new object to modify/set and + * decrement the old formerly-shared object's ref count. This is + * "copy on write". + */ + + if ((varPtr[varIndex] != NULL) + && !Tcl_IsShared(varPtr[varIndex])) { + Tcl_SetBignumObj(varPtr[varIndex], &bignumValue ); + } else { + SetVarToObj(varIndex, Tcl_NewBignumObj(&bignumValue)); + } + break; + + case BIGNUM_GET: + if ( objc != 3 ) { + Tcl_WrongNumArgs( interp, 2, objv, "varIndex" ); + return TCL_ERROR; + } + if ( CheckIfVarUnset( interp, varIndex ) ) { + return TCL_ERROR; + } + break; + + case BIGNUM_MULT10: + if ( objc != 3 ) { + Tcl_WrongNumArgs( interp, 2, objv, "varIndex" ); + return TCL_ERROR; + } + if ( CheckIfVarUnset( interp, varIndex ) ) { + return TCL_ERROR; + } + if ( Tcl_GetBignumFromObj( interp, varPtr[varIndex], + &bignumValue ) != TCL_OK ) { + return TCL_ERROR; + } + if ( mp_init( &newValue ) != MP_OKAY + || ( mp_mul_d( &bignumValue, 10, &newValue ) != MP_OKAY ) ) { + mp_clear( &bignumValue ); + mp_clear( &newValue ); + Tcl_SetObjResult( interp, + Tcl_NewStringObj( "error in mp_mul_d", + -1 ) ); + return TCL_ERROR; + } + mp_clear( &bignumValue ); + if ( !Tcl_IsShared( varPtr[varIndex] ) ) { + Tcl_SetBignumObj( varPtr[varIndex], &newValue ); + } else { + SetVarToObj( varIndex, Tcl_NewBignumObj( &newValue ) ); + } + break; + + case BIGNUM_DIV10: + if ( objc != 3 ) { + Tcl_WrongNumArgs( interp, 2, objv, "varIndex" ); + return TCL_ERROR; + } + if ( CheckIfVarUnset( interp, varIndex ) ) { + return TCL_ERROR; + } + if ( Tcl_GetBignumFromObj( interp, varPtr[varIndex], + &bignumValue ) != TCL_OK ) { + return TCL_ERROR; + } + if ( mp_init( &newValue ) != MP_OKAY + || ( mp_div_d( &bignumValue, 10, &newValue, NULL ) + != MP_OKAY ) ) { + mp_clear( &bignumValue ); + mp_clear( &newValue ); + Tcl_SetObjResult( interp, + Tcl_NewStringObj( "error in mp_div_d", + -1 ) ); + return TCL_ERROR; + } + mp_clear( &bignumValue ); + if ( !Tcl_IsShared( varPtr[varIndex] ) ) { + Tcl_SetBignumObj( varPtr[varIndex], &newValue ); + } else { + SetVarToObj( varIndex, Tcl_NewBignumObj( &newValue ) ); + } + } + + Tcl_SetObjResult( interp, varPtr[varIndex] ); + return TCL_OK; +} + +/* + *---------------------------------------------------------------------- + * * TestbooleanobjCmd -- * * This procedure implements the "testbooleanobj" command. It is used diff --git a/generic/tclThread.c b/generic/tclThread.c index 6fc558c..2afc284 100644 --- a/generic/tclThread.c +++ b/generic/tclThread.c @@ -9,7 +9,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclThread.c,v 1.10 2005/02/03 13:31:10 dkf Exp $ + * RCS: @(#) $Id: tclThread.c,v 1.11 2005/05/10 18:34:50 kennykb Exp $ */ #include "tclInt.h" diff --git a/generic/tclThreadAlloc.c b/generic/tclThreadAlloc.c index 0e8c087..c03cc9e 100755 --- a/generic/tclThreadAlloc.c +++ b/generic/tclThreadAlloc.c @@ -11,7 +11,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclThreadAlloc.c,v 1.15 2005/04/16 08:00:17 vasiljevic Exp $ + * RCS: @(#) $Id: tclThreadAlloc.c,v 1.16 2005/05/10 18:34:50 kennykb Exp $ */ #include "tclInt.h" diff --git a/generic/tclThreadTest.c b/generic/tclThreadTest.c index 7b2ac56..299a5aa 100644 --- a/generic/tclThreadTest.c +++ b/generic/tclThreadTest.c @@ -11,7 +11,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclThreadTest.c,v 1.18 2005/03/25 00:35:03 dgp Exp $ + * RCS: @(#) $Id: tclThreadTest.c,v 1.19 2005/05/10 18:34:50 kennykb Exp $ */ #include "tclInt.h" diff --git a/generic/tclTimer.c b/generic/tclTimer.c index 14cdd27..a8728f4 100644 --- a/generic/tclTimer.c +++ b/generic/tclTimer.c @@ -9,7 +9,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclTimer.c,v 1.14 2005/03/23 22:09:28 dgp Exp $ + * RCS: @(#) $Id: tclTimer.c,v 1.15 2005/05/10 18:34:51 kennykb Exp $ */ #include "tclInt.h" diff --git a/generic/tclTomMath.h b/generic/tclTomMath.h new file mode 100644 index 0000000..4ffbea2 --- /dev/null +++ b/generic/tclTomMath.h @@ -0,0 +1,109 @@ +/* + * tclTomMath.h -- + * + * Interface information that comes in at the head of + * <tommath.h> to adapt the API to Tcl's linkage conventions. + * + * Copyright (c) 2005 by Kevin B. Kenny. All rights reserved. + * + * See the file "license.terms" for information on usage and redistribution + * of this file, and for a DISCLAIMER OF ALL WARRANTIES. + * + * RCS: @(#) $Id: tclTomMath.h,v 1.2 2005/05/10 18:34:51 kennykb Exp $ + */ + +#ifndef TCLTOMMATH_H +#define TCLTOMMATH_H 1 + +#include <tcl.h> +#include <stdlib.h> + + +/* Define TOMMATH_DLLIMPORT and TOMMATH_DLLEXPORT to suit the compiler */ + +#ifdef STATIC_BUILD +# define TOMMATH_DLLIMPORT +# define TOMMATH_DLLEXPORT +#else +# if (defined(__WIN32__) && (defined(_MSC_VER) || (__BORLANDC__ >= 0x0550) || defined(__LCC__) || defined(__WATCOMC__) || (defined(__GNUC__) && defined(__declspec)))) +# define TOMMATH_DLLIMPORT __declspec(dllimport) +# define TOMMATH_DLLEXPORT __declspec(dllexport) +# else +# define TOMMATH_DLLIMPORT +# define TOMMATH_DLLEXPORT +# endif +#endif + +/* Define TOMMATH_STORAGE_CLASS according to the build options. */ + +#undef TOMMATH_STORAGE_CLASS +#ifdef BUILD_tcl +# define TOMMATH_STORAGE_CLASS TOMMATH_DLLEXPORT +#else +# ifdef USE_TCL_STUBS +# define TOMMATH_STORAGE_CLASS +# else +# define TOMMATH_STORAGE_CLASS TOMMATH_DLLIMPORT +# endif +#endif + +/* Define custom memory allocation for libtommath */ + +#define XMALLOC(x) TclBNAlloc(x) +#define XFREE(x) TclBNFree(x) +#define XREALLOC(x,n) TclBNRealloc(x,n) +#define XCALLOC(n,x) TclBNCalloc(n,x) +void* TclBNAlloc( size_t ); +void* TclBNRealloc( void*, size_t ); +void TclBNFree( void* ); +void* TclBNCalloc( size_t, size_t ); + +/* Rename all global symboles in libtommath to avoid linkage conflicts */ + +#define KARATSUBA_MUL_CUTOFF TclBNKaratsubaMulCutoff +#define KARATSUBA_SQR_CUTOFF TclBNKaratsubaSqrCutoff +#define TOOM_MUL_CUTOFF TclBNToomMulCutoff +#define TOOM_SQR_CUTOFF TclBNToomSqrCutoff + +#define mp_s_rmap TclBNMpSRmap + +#define bn_reverse TclBN_reverse +#define fast_s_mp_mul_digs TclBN_fast_s_mp_mul_digs +#define mp_add TclBN_mp_add +#define mp_clamp TclBN_mp_clamp +#define mp_clear TclBN_mp_clear +#define mp_clear_multi TclBN_mp_clear_multi +#define mp_cmp TclBN_mp_cmp +#define mp_cmp_mag TclBN_mp_cmp_mag +#define mp_copy TclBN_mp_copy +#define mp_count_bits TclBN_mp_count_bits +#define mp_div TclBN_mp_div +#define mp_div_d TclBN_mp_div_d +#define mp_div_2 TclBN_mp_div_2 +#define mp_div_2d TclBN_mp_div_2d +#define mp_div_3 TclBN_mp_div_3 +#define mp_exch TclBN_mp_exch +#define mp_grow TclBN_mp_grow +#define mp_init TclBN_mp_init +#define mp_init_copy TclBN_mp_init_copy +#define mp_init_multi TclBN_mp_init_multi +#define mp_init_size TclBN_mp_init_size +#define mp_karatsuba_mul TclBN_mp_karatsuba_mul +#define mp_lshd TclBN_mp_lshd +#define mp_mod_2d TclBN_mp_mod_2d +#define mp_mul TclBN_mp_mul +#define mp_mul_2 TclBN_mp_mul_2 +#define mp_mul_2d TclBN_mp_mul_2d +#define mp_mul_d TclBN_mp_mul_d +#define mp_radix_size TclBN_mp_radix_size +#define mp_read_radix TclBN_mp_read_radix +#define mp_rshd TclBN_mp_rshd +#define mp_sub TclBN_mp_sub +#define mp_toom_mul TclBN_mp_toom_mul +#define mp_toradix_n TclBN_mp_toradix_n +#define mp_zero TclBN_mp_zero +#define s_mp_add TclBN_s_mp_add +#define s_mp_mul_digs TclBN_s_mp_mul_digs +#define s_mp_sub TclBN_s_mp_sub + +#endif diff --git a/generic/tclTomMathInterface.c b/generic/tclTomMathInterface.c new file mode 100644 index 0000000..89537b9 --- /dev/null +++ b/generic/tclTomMathInterface.c @@ -0,0 +1,143 @@ +/* + *---------------------------------------------------------------------- + * + * tclTomMathInterface.c -- + * + * This file contains procedures that are used as a 'glue' + * layer between Tcl and libtommath. + * + * Copyright (c) 2005 by Kevin B. Kenny. All rights reserved. + * + * See the file "license.terms" for information on usage and redistribution + * of this file, and for a DISCLAIMER OF ALL WARRANTIES. + * + * RCS: @(#) $Id: tclTomMathInterface.c,v 1.2 2005/05/10 18:34:51 kennykb Exp $ + */ + +#include "tclInt.h" +#include "tommath.h" +#include <limits.h> + +/* + *---------------------------------------------------------------------- + * + * TclBNAlloc -- + * + * Allocate memory for libtommath. + * + * Results: + * Returns a pointer to the allocated block. + * + * This procedure is a wrapper around Tcl_Alloc, needed because of + * a mismatched type signature between Tcl_Alloc and malloc. + * + *---------------------------------------------------------------------- + */ + +extern void * +TclBNAlloc( size_t x ) +{ + return (void*) Tcl_Alloc( (unsigned int) x ); +} + +/* + *---------------------------------------------------------------------- + * + * TclBNAlloc -- + * + * Change the size of an allocated block of memory in libtommath + * + * Results: + * Returns a pointer to the allocated block. + * + * This procedure is a wrapper around Tcl_Realloc, needed because of + * a mismatched type signature between Tcl_Realloc and realloc. + * + *---------------------------------------------------------------------- + */ + +extern void * +TclBNRealloc( void* p, size_t s ) +{ + return (void*) Tcl_Realloc( (char*) p, (unsigned int) s ); +} + +/* + *---------------------------------------------------------------------- + * + * TclBNFree -- + * + * Free allocated memory in libtommath. + * + * Results: + * None. + * + * Side effects: + * Memory is freed. + * + * This function is simply a wrapper around Tcl_Free, needed in + * libtommath because of a type mismatch between free and Tcl_Free. + * + *---------------------------------------------------------------------- + */ + +extern void +TclBNFree( void* p ) +{ + Tcl_Free( (char*) p); +} + +/* + *---------------------------------------------------------------------- + * + * TclBNInitBignumFromLong -- + * + * Allocate and initialize a 'bignum' from a native 'long'. + * + * Results: + * None. + * + * Side effects: + * The 'bignum' is constructed. + * + *---------------------------------------------------------------------- + */ + +extern void +TclBNInitBignumFromLong( mp_int* a, long initVal ) +{ + + int status; + unsigned long v; + mp_digit* p; + + /* + * Allocate enough memory to hold the largest possible long + */ + + status = mp_init_size( a, ( ( CHAR_BIT * sizeof( long ) + DIGIT_BIT - 1 ) + / DIGIT_BIT ) ); + if ( status != MP_OKAY ) { + Tcl_Panic( "initialization failure in TclBNInitBignumFromLong" ); + } + + /* Convert arg to sign and magnitude */ + + if ( initVal < 0 ) { + a->sign = MP_NEG; + v = -initVal; + } else { + a->sign = MP_ZPOS; + v = initVal; + } + + /* Store the magnitude in the bignum. */ + + p = a->dp; + while ( v ) { + *p++ = (mp_digit) ( v & MP_MASK ); + v >>= MP_DIGIT_BIT; + } + a->used = p - a->dp; + +} diff --git a/generic/tclTrace.c b/generic/tclTrace.c index f717c8d..3a15ac8 100644 --- a/generic/tclTrace.c +++ b/generic/tclTrace.c @@ -11,7 +11,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclTrace.c,v 1.22 2005/03/10 22:10:38 dgp Exp $ + * RCS: @(#) $Id: tclTrace.c,v 1.23 2005/05/10 18:34:51 kennykb Exp $ */ #include "tclInt.h" diff --git a/generic/tclUtf.c b/generic/tclUtf.c index d3ac7e1..7a5494a 100644 --- a/generic/tclUtf.c +++ b/generic/tclUtf.c @@ -8,7 +8,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclUtf.c,v 1.33 2005/05/03 18:08:20 dgp Exp $ + * RCS: @(#) $Id: tclUtf.c,v 1.34 2005/05/10 18:34:51 kennykb Exp $ */ #include "tclInt.h" diff --git a/generic/tclUtil.c b/generic/tclUtil.c index 869169a..278380d 100644 --- a/generic/tclUtil.c +++ b/generic/tclUtil.c @@ -11,10 +11,32 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclUtil.c,v 1.58 2005/05/05 18:38:06 dgp Exp $ + * RCS: @(#) $Id: tclUtil.c,v 1.59 2005/05/10 18:34:52 kennykb Exp $ */ #include "tclInt.h" +#include <float.h> +#include <math.h> + +/* + * Define test for NaN + */ + +#ifdef _MSC_VER +#define IS_NAN(f) (_isnan((f))) +#else +#define IS_NAN(f) ((f) != (f)) +#endif + +/* + * Define test for Inf + */ + +#ifdef _MSC_VER +#define IS_INF(f) ( ! (_finite((f)))) +#else +#define IS_INF(f) ( (f) > DBL_MAX || (f) < -DBL_MAX ) +#endif /* * The absolute pathname of the executable in which this Tcl library @@ -56,12 +78,9 @@ static ProcessGlobalValue executableName = {0, 0, NULL, NULL, NULL, NULL, NULL}; * TclPrecTraceProc. */ -static char precisionString[10] = "12"; - /* The string value of all the tcl_precision - * variables. */ -static char precisionFormat[10] = "%.12g"; - /* The format string actually used in calls - * to sprintf. */ +static int precision = 0; /* Precision of floating point conversions, + * in the range 0-17 inclusive. */ + TCL_DECLARE_MUTEX(precisionMutex) /* @@ -1879,33 +1898,125 @@ Tcl_PrintDouble(interp, value, dst) * characters. */ { char *p, c; + int prec; + int exp; + int signum; + char buffer[TCL_DOUBLE_SPACE]; Tcl_UniChar ch; Tcl_MutexLock(&precisionMutex); - sprintf(dst, precisionFormat, value); + prec = precision; Tcl_MutexUnlock(&precisionMutex); /* - * If the ASCII result looks like an integer, add ".0" so that it - * doesn't look like an integer anymore. This prevents floating-point - * values from being converted to integers unintentionally. - * Check for ASCII specifically to speed up the function. + * If prec == 0, then use TclDoubleDigits to develop a decimal + * significand and exponent, then format it in E or F format as + * appropriate. If prec != 0, use the native sprintf and then + * add a trailing ".0" if there is no decimal point in the rep. */ - for (p = dst; *p != 0; ) { - if (UCHAR(*p) < 0x80) { - c = *p++; - } else { - p += Tcl_UtfToUniChar(p, &ch); - c = UCHAR(ch); + if ( prec == 0 ) { + + /* Handle NaN */ + + if ( IS_NAN( value ) ) { + TclFormatNaN( value, dst ); + return; } - if ((c == '.') || isalpha(UCHAR(c))) { /* INTL: ISO only. */ + + /* Handle infinities */ + + if ( IS_INF( value ) ) { + if ( value < 0 ) { + strcpy( dst, "-Inf" ); + } else { + strcpy( dst, "Inf" ); + } return; } + + /* Ordinary (normal and denormal) values */ + + exp = TclDoubleDigits( buffer, value, &signum ); + if ( signum ) { + *dst++ = '-'; + } + prec = strlen( buffer ); + p = buffer; + if ( exp < -3 || exp > 17 ) { + + /* E format for numbers < 1e-3 or >= 1e17 */ + + *dst++ = *p++; + c = *p; + if ( c != '\0' ) { + *dst++ = '.'; + while ( c != '\0' ) { + *dst++ = c; + c = *++p; + } + } + sprintf( dst, "e%+d", exp-1 ); + } else { + + /* F format for others */ + + if ( exp <= 0 ) { + *dst++ = '0'; + } + c = *p; + while ( exp-- > 0 ) { + if ( c != '\0' ) { + *dst++ = c; + c = *++p; + } else { + *dst++ = '0'; + } + } + *dst++ = '.'; + if ( c == '\0' ) { + *dst++ = '0'; + } else { + while ( ++exp < 0 ) { + *dst++ = '0'; + } + while ( c != '\0' ) { + *dst++ = c; + c = *++p; + } + } + *dst++ = '\0'; + } + + } else { + + /* tcl_precision is supplied, pass it to the native sprintf */ + + sprintf( dst, "%.*g", prec, value ); + + /* + * If the ASCII result looks like an integer, add ".0" so that it + * doesn't look like an integer anymore. This prevents floating-point + * values from being converted to integers unintentionally. + * Check for ASCII specifically to speed up the function. + */ + + for (p = dst; *p != 0; ) { + if (UCHAR(*p) < 0x80) { + c = *p++; + } else { + p += Tcl_UtfToUniChar(p, &ch); + c = UCHAR(ch); + } + if ((c == '.') || isalpha(UCHAR(c))) { /* INTL: ISO only. */ + return; + } + } + p[0] = '.'; + p[1] = '0'; + p[2] = 0; + } - p[0] = '.'; - p[1] = '0'; - p[2] = 0; } /* @@ -1937,8 +2048,7 @@ TclPrecTraceProc(clientData, interp, name1, name2, flags) CONST char *name2; /* Second part of variable name. */ int flags; /* Information about what happened. */ { - CONST char *value; - char *end; + Tcl_Obj* value; int prec; /* @@ -1961,11 +2071,11 @@ TclPrecTraceProc(clientData, interp, name1, name2, flags) * out of date. */ - Tcl_MutexLock(&precisionMutex); if (flags & TCL_TRACE_READS) { - Tcl_SetVar2(interp, name1, name2, precisionString, - flags & TCL_GLOBAL_ONLY); + Tcl_MutexLock(&precisionMutex); + Tcl_SetVar2Ex( interp, name1, name2, Tcl_NewIntObj( precision ), + flags & TCL_GLOBAL_ONLY ); Tcl_MutexUnlock(&precisionMutex); return (char *) NULL; } @@ -1978,25 +2088,21 @@ TclPrecTraceProc(clientData, interp, name1, name2, flags) */ if (Tcl_IsSafe(interp)) { - Tcl_SetVar2(interp, name1, name2, precisionString, - flags & TCL_GLOBAL_ONLY); + Tcl_MutexLock(&precisionMutex); + Tcl_SetVar2Ex( interp, name1, name2, Tcl_NewIntObj( precision ), + flags & TCL_GLOBAL_ONLY ); Tcl_MutexUnlock(&precisionMutex); return "can't modify precision from a safe interpreter"; } - value = Tcl_GetVar2(interp, name1, name2, flags & TCL_GLOBAL_ONLY); - if (value == NULL) { - value = ""; - } - prec = strtoul(value, &end, 10); - if ((prec <= 0) || (prec > TCL_MAX_PREC) || (prec > 100) || - (end == value) || (*end != 0)) { - Tcl_SetVar2(interp, name1, name2, precisionString, - flags & TCL_GLOBAL_ONLY); - Tcl_MutexUnlock(&precisionMutex); + value = Tcl_GetVar2Ex(interp, name1, name2, flags & TCL_GLOBAL_ONLY); + if ( value == NULL + || Tcl_GetIntFromObj( (Tcl_Interp*) NULL, value, &prec ) != TCL_OK + || prec < 0 + || prec > TCL_MAX_PREC ) { return "improper value for precision"; } - TclFormatInt(precisionString, prec); - sprintf(precisionFormat, "%%.%dg", prec); + Tcl_MutexLock( &precisionMutex ); + precision = prec; Tcl_MutexUnlock(&precisionMutex); return (char *) NULL; } diff --git a/generic/tclVar.c b/generic/tclVar.c index 314f958..6cdedc9 100644 --- a/generic/tclVar.c +++ b/generic/tclVar.c @@ -15,7 +15,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclVar.c,v 1.105 2005/05/05 18:38:06 dgp Exp $ + * RCS: @(#) $Id: tclVar.c,v 1.106 2005/05/10 18:34:52 kennykb Exp $ */ #include "tclInt.h" diff --git a/generic/tommath.h b/generic/tommath.h new file mode 100644 index 0000000..a9983a4 --- /dev/null +++ b/generic/tommath.h @@ -0,0 +1,591 @@ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ +#ifndef BN_H_ +#define BN_H_ + +#ifdef TCL_TOMMATH +#include <tclTomMath.h> +#endif +#ifndef TOMMATH_STORAGE_CLASS +#define TOMMATH_STORAGE_CLASS extern +#endif + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <ctype.h> +#include <limits.h> + +#include <tommath_class.h> + +#undef MIN +#define MIN(x,y) ((x)<(y)?(x):(y)) +#undef MAX +#define MAX(x,y) ((x)>(y)?(x):(y)) + +#ifdef __cplusplus +extern "C" { + +/* C++ compilers don't like assigning void * to mp_digit * */ +#define OPT_CAST(x) (x *) + +#else + +/* C on the other hand doesn't care */ +#define OPT_CAST(x) + +#endif + + +/* detect 64-bit mode if possible */ +#if defined(__x86_64__) + #if !(defined(MP_64BIT) && defined(MP_16BIT) && defined(MP_8BIT)) + #define MP_64BIT + #endif +#endif + +/* some default configurations. + * + * A "mp_digit" must be able to hold DIGIT_BIT + 1 bits + * A "mp_word" must be able to hold 2*DIGIT_BIT + 1 bits + * + * At the very least a mp_digit must be able to hold 7 bits + * [any size beyond that is ok provided it doesn't overflow the data type] + */ +#ifdef MP_8BIT +#ifndef MP_DIGIT_DECLARED + typedef unsigned char mp_digit; +#define MP_DIGIT_DECLARED +#endif + typedef unsigned short mp_word; +#elif defined(MP_16BIT) +#ifndef MP_DIGIT_DECLARED + typedef unsigned short mp_digit; +#define MP_DIGIT_DECLARED +#endif + typedef unsigned long mp_word; +#elif defined(MP_64BIT) + /* for GCC only on supported platforms */ +#ifndef CRYPT + typedef unsigned long long ulong64; + typedef signed long long long64; +#endif + +#ifndef MP_DIGIT_DECLARED + typedef unsigned long mp_digit; +#define MP_DIGIT_DECLARED +#endif + typedef unsigned long mp_word __attribute__ ((mode(TI))); + + #define DIGIT_BIT 60 +#else + /* this is the default case, 28-bit digits */ + + /* this is to make porting into LibTomCrypt easier :-) */ +#ifndef CRYPT + #if defined(_MSC_VER) || defined(__BORLANDC__) + typedef unsigned __int64 ulong64; + typedef signed __int64 long64; + #else + typedef unsigned long long ulong64; + typedef signed long long long64; + #endif +#endif + +#ifndef MP_DIGIT_DECLARED + typedef unsigned long mp_digit; +#define MP_DIGIT_DECLARED +#endif + typedef ulong64 mp_word; + +#ifdef MP_31BIT + /* this is an extension that uses 31-bit digits */ + #define DIGIT_BIT 31 +#else + /* default case is 28-bit digits, defines MP_28BIT as a handy macro to test */ + #define DIGIT_BIT 28 + #define MP_28BIT +#endif +#endif + +/* define heap macros */ +#ifndef CRYPT + /* default to libc stuff */ + #ifndef XMALLOC + #define XMALLOC malloc + #define XFREE free + #define XREALLOC realloc + #define XCALLOC calloc + #else + /* prototypes for our heap functions */ + extern void *XMALLOC(size_t n); + extern void *REALLOC(void *p, size_t n); + extern void *XCALLOC(size_t n, size_t s); + extern void XFREE(void *p); + #endif +#endif + + +/* otherwise the bits per digit is calculated automatically from the size of a mp_digit */ +#ifndef DIGIT_BIT + #define DIGIT_BIT ((int)((CHAR_BIT * sizeof(mp_digit) - 1))) /* bits per digit */ +#endif + +#define MP_DIGIT_BIT DIGIT_BIT +#define MP_MASK ((((mp_digit)1)<<((mp_digit)DIGIT_BIT))-((mp_digit)1)) +#define MP_DIGIT_MAX MP_MASK + +/* equalities */ +#define MP_LT -1 /* less than */ +#define MP_EQ 0 /* equal to */ +#define MP_GT 1 /* greater than */ + +#define MP_ZPOS 0 /* positive integer */ +#define MP_NEG 1 /* negative */ + +#define MP_OKAY 0 /* ok result */ +#define MP_MEM -2 /* out of mem */ +#define MP_VAL -3 /* invalid input */ +#define MP_RANGE MP_VAL + +#define MP_YES 1 /* yes response */ +#define MP_NO 0 /* no response */ + +/* Primality generation flags */ +#define LTM_PRIME_BBS 0x0001 /* BBS style prime */ +#define LTM_PRIME_SAFE 0x0002 /* Safe prime (p-1)/2 == prime */ +#define LTM_PRIME_2MSB_OFF 0x0004 /* force 2nd MSB to 0 */ +#define LTM_PRIME_2MSB_ON 0x0008 /* force 2nd MSB to 1 */ + +typedef int mp_err; + +/* you'll have to tune these... */ +extern int KARATSUBA_MUL_CUTOFF, + KARATSUBA_SQR_CUTOFF, + TOOM_MUL_CUTOFF, + TOOM_SQR_CUTOFF; + +/* define this to use lower memory usage routines (exptmods mostly) */ +/* #define MP_LOW_MEM */ + +/* default precision */ +#ifndef MP_PREC + #ifndef MP_LOW_MEM + #define MP_PREC 64 /* default digits of precision */ + #else + #define MP_PREC 8 /* default digits of precision */ + #endif +#endif + +/* size of comba arrays, should be at least 2 * 2**(BITS_PER_WORD - BITS_PER_DIGIT*2) */ +#define MP_WARRAY (1 << (sizeof(mp_word) * CHAR_BIT - 2 * DIGIT_BIT + 1)) + +/* the infamous mp_int structure */ +#ifndef MP_INT_DECLARED +#define MP_INT_DECLARED +typedef struct mp_int mp_int; +#endif +struct mp_int { + int used, alloc, sign; + mp_digit *dp; +}; + +/* callback for mp_prime_random, should fill dst with random bytes and return how many read [upto len] */ +typedef int ltm_prime_callback(unsigned char *dst, int len, void *dat); + + +#define USED(m) ((m)->used) +#define DIGIT(m,k) ((m)->dp[(k)]) +#define SIGN(m) ((m)->sign) + +/* error code to char* string */ +TOMMATH_STORAGE_CLASS char *mp_error_to_string(int code); + +/* ---> init and deinit bignum functions <--- */ +/* init a bignum */ +TOMMATH_STORAGE_CLASS int mp_init(mp_int *a); + +/* free a bignum */ +TOMMATH_STORAGE_CLASS void mp_clear(mp_int *a); + +/* init a null terminated series of arguments */ +TOMMATH_STORAGE_CLASS int mp_init_multi(mp_int *mp, ...); + +/* clear a null terminated series of arguments */ +TOMMATH_STORAGE_CLASS void mp_clear_multi(mp_int *mp, ...); + +/* exchange two ints */ +TOMMATH_STORAGE_CLASS void mp_exch(mp_int *a, mp_int *b); + +/* shrink ram required for a bignum */ +TOMMATH_STORAGE_CLASS int mp_shrink(mp_int *a); + +/* grow an int to a given size */ +TOMMATH_STORAGE_CLASS int mp_grow(mp_int *a, int size); + +/* init to a given number of digits */ +TOMMATH_STORAGE_CLASS int mp_init_size(mp_int *a, int size); + +/* ---> Basic Manipulations <--- */ +#define mp_iszero(a) (((a)->used == 0) ? MP_YES : MP_NO) +#define mp_iseven(a) (((a)->used == 0 || (((a)->dp[0] & 1) == 0)) ? MP_YES : MP_NO) +#define mp_isodd(a) (((a)->used > 0 && (((a)->dp[0] & 1) == 1)) ? MP_YES : MP_NO) + +/* set to zero */ +TOMMATH_STORAGE_CLASS void mp_zero(mp_int *a); + +/* set to a digit */ +TOMMATH_STORAGE_CLASS void mp_set(mp_int *a, mp_digit b); + +/* set a 32-bit const */ +TOMMATH_STORAGE_CLASS int mp_set_int(mp_int *a, unsigned long b); + +/* get a 32-bit value */ +unsigned long mp_get_int(mp_int * a); + +/* initialize and set a digit */ +TOMMATH_STORAGE_CLASS int mp_init_set (mp_int * a, mp_digit b); + +/* initialize and set 32-bit value */ +TOMMATH_STORAGE_CLASS int mp_init_set_int (mp_int * a, unsigned long b); + +/* copy, b = a */ +TOMMATH_STORAGE_CLASS int mp_copy(mp_int *a, mp_int *b); + +/* inits and copies, a = b */ +TOMMATH_STORAGE_CLASS int mp_init_copy(mp_int *a, mp_int *b); + +/* trim unused digits */ +TOMMATH_STORAGE_CLASS void mp_clamp(mp_int *a); + +/* ---> digit manipulation <--- */ + +/* right shift by "b" digits */ +TOMMATH_STORAGE_CLASS void mp_rshd(mp_int *a, int b); + +/* left shift by "b" digits */ +TOMMATH_STORAGE_CLASS int mp_lshd(mp_int *a, int b); + +/* c = a / 2**b */ +TOMMATH_STORAGE_CLASS int mp_div_2d(mp_int *a, int b, mp_int *c, mp_int *d); + +/* b = a/2 */ +TOMMATH_STORAGE_CLASS int mp_div_2(mp_int *a, mp_int *b); + +/* c = a * 2**b */ +TOMMATH_STORAGE_CLASS int mp_mul_2d(mp_int *a, int b, mp_int *c); + +/* b = a*2 */ +TOMMATH_STORAGE_CLASS int mp_mul_2(mp_int *a, mp_int *b); + +/* c = a mod 2**d */ +TOMMATH_STORAGE_CLASS int mp_mod_2d(mp_int *a, int b, mp_int *c); + +/* computes a = 2**b */ +TOMMATH_STORAGE_CLASS int mp_2expt(mp_int *a, int b); + +/* Counts the number of lsbs which are zero before the first zero bit */ +TOMMATH_STORAGE_CLASS int mp_cnt_lsb(mp_int *a); + +/* I Love Earth! */ + +/* makes a pseudo-random int of a given size */ +TOMMATH_STORAGE_CLASS int mp_rand(mp_int *a, int digits); + +/* ---> binary operations <--- */ +/* c = a XOR b */ +TOMMATH_STORAGE_CLASS int mp_xor(mp_int *a, mp_int *b, mp_int *c); + +/* c = a OR b */ +TOMMATH_STORAGE_CLASS int mp_or(mp_int *a, mp_int *b, mp_int *c); + +/* c = a AND b */ +TOMMATH_STORAGE_CLASS int mp_and(mp_int *a, mp_int *b, mp_int *c); + +/* ---> Basic arithmetic <--- */ + +/* b = -a */ +TOMMATH_STORAGE_CLASS int mp_neg(mp_int *a, mp_int *b); + +/* b = |a| */ +TOMMATH_STORAGE_CLASS int mp_abs(mp_int *a, mp_int *b); + +/* compare a to b */ +TOMMATH_STORAGE_CLASS int mp_cmp(mp_int *a, mp_int *b); + +/* compare |a| to |b| */ +TOMMATH_STORAGE_CLASS int mp_cmp_mag(mp_int *a, mp_int *b); + +/* c = a + b */ +TOMMATH_STORAGE_CLASS int mp_add(mp_int *a, mp_int *b, mp_int *c); + +/* c = a - b */ +TOMMATH_STORAGE_CLASS int mp_sub(mp_int *a, mp_int *b, mp_int *c); + +/* c = a * b */ +TOMMATH_STORAGE_CLASS int mp_mul(mp_int *a, mp_int *b, mp_int *c); + +/* b = a*a */ +TOMMATH_STORAGE_CLASS int mp_sqr(mp_int *a, mp_int *b); + +/* a/b => cb + d == a */ +TOMMATH_STORAGE_CLASS int mp_div(mp_int *a, mp_int *b, mp_int *c, mp_int *d); + +/* c = a mod b, 0 <= c < b */ +TOMMATH_STORAGE_CLASS int mp_mod(mp_int *a, mp_int *b, mp_int *c); + +/* ---> single digit functions <--- */ + +/* compare against a single digit */ +TOMMATH_STORAGE_CLASS int mp_cmp_d(mp_int *a, mp_digit b); + +/* c = a + b */ +TOMMATH_STORAGE_CLASS int mp_add_d(mp_int *a, mp_digit b, mp_int *c); + +/* c = a - b */ +TOMMATH_STORAGE_CLASS int mp_sub_d(mp_int *a, mp_digit b, mp_int *c); + +/* c = a * b */ +TOMMATH_STORAGE_CLASS int mp_mul_d(mp_int *a, mp_digit b, mp_int *c); + +/* a/b => cb + d == a */ +TOMMATH_STORAGE_CLASS int mp_div_d(mp_int *a, mp_digit b, mp_int *c, mp_digit *d); + +/* a/3 => 3c + d == a */ +TOMMATH_STORAGE_CLASS int mp_div_3(mp_int *a, mp_int *c, mp_digit *d); + +/* c = a**b */ +TOMMATH_STORAGE_CLASS int mp_expt_d(mp_int *a, mp_digit b, mp_int *c); + +/* c = a mod b, 0 <= c < b */ +TOMMATH_STORAGE_CLASS int mp_mod_d(mp_int *a, mp_digit b, mp_digit *c); + +/* ---> number theory <--- */ + +/* d = a + b (mod c) */ +TOMMATH_STORAGE_CLASS int mp_addmod(mp_int *a, mp_int *b, mp_int *c, mp_int *d); + +/* d = a - b (mod c) */ +TOMMATH_STORAGE_CLASS int mp_submod(mp_int *a, mp_int *b, mp_int *c, mp_int *d); + +/* d = a * b (mod c) */ +TOMMATH_STORAGE_CLASS int mp_mulmod(mp_int *a, mp_int *b, mp_int *c, mp_int *d); + +/* c = a * a (mod b) */ +TOMMATH_STORAGE_CLASS int mp_sqrmod(mp_int *a, mp_int *b, mp_int *c); + +/* c = 1/a (mod b) */ +TOMMATH_STORAGE_CLASS int mp_invmod(mp_int *a, mp_int *b, mp_int *c); + +/* c = (a, b) */ +TOMMATH_STORAGE_CLASS int mp_gcd(mp_int *a, mp_int *b, mp_int *c); + +/* produces value such that U1*a + U2*b = U3 */ +TOMMATH_STORAGE_CLASS int mp_exteuclid(mp_int *a, mp_int *b, mp_int *U1, mp_int *U2, mp_int *U3); + +/* c = [a, b] or (a*b)/(a, b) */ +TOMMATH_STORAGE_CLASS int mp_lcm(mp_int *a, mp_int *b, mp_int *c); + +/* finds one of the b'th root of a, such that |c|**b <= |a| + * + * returns error if a < 0 and b is even + */ +TOMMATH_STORAGE_CLASS int mp_n_root(mp_int *a, mp_digit b, mp_int *c); + +/* special sqrt algo */ +TOMMATH_STORAGE_CLASS int mp_sqrt(mp_int *arg, mp_int *ret); + +/* is number a square? */ +TOMMATH_STORAGE_CLASS int mp_is_square(mp_int *arg, int *ret); + +/* computes the jacobi c = (a | n) (or Legendre if b is prime) */ +TOMMATH_STORAGE_CLASS int mp_jacobi(mp_int *a, mp_int *n, int *c); + +/* used to setup the Barrett reduction for a given modulus b */ +TOMMATH_STORAGE_CLASS int mp_reduce_setup(mp_int *a, mp_int *b); + +/* Barrett Reduction, computes a (mod b) with a precomputed value c + * + * Assumes that 0 < a <= b*b, note if 0 > a > -(b*b) then you can merely + * compute the reduction as -1 * mp_reduce(mp_abs(a)) [pseudo code]. + */ +TOMMATH_STORAGE_CLASS int mp_reduce(mp_int *a, mp_int *b, mp_int *c); + +/* setups the montgomery reduction */ +TOMMATH_STORAGE_CLASS int mp_montgomery_setup(mp_int *a, mp_digit *mp); + +/* computes a = B**n mod b without division or multiplication useful for + * normalizing numbers in a Montgomery system. + */ +TOMMATH_STORAGE_CLASS int mp_montgomery_calc_normalization(mp_int *a, mp_int *b); + +/* computes x/R == x (mod N) via Montgomery Reduction */ +TOMMATH_STORAGE_CLASS int mp_montgomery_reduce(mp_int *a, mp_int *m, mp_digit mp); + +/* returns 1 if a is a valid DR modulus */ +TOMMATH_STORAGE_CLASS int mp_dr_is_modulus(mp_int *a); + +/* sets the value of "d" required for mp_dr_reduce */ +TOMMATH_STORAGE_CLASS void mp_dr_setup(mp_int *a, mp_digit *d); + +/* reduces a modulo b using the Diminished Radix method */ +TOMMATH_STORAGE_CLASS int mp_dr_reduce(mp_int *a, mp_int *b, mp_digit mp); + +/* returns true if a can be reduced with mp_reduce_2k */ +TOMMATH_STORAGE_CLASS int mp_reduce_is_2k(mp_int *a); + +/* determines k value for 2k reduction */ +TOMMATH_STORAGE_CLASS int mp_reduce_2k_setup(mp_int *a, mp_digit *d); + +/* reduces a modulo b where b is of the form 2**p - k [0 <= a] */ +TOMMATH_STORAGE_CLASS int mp_reduce_2k(mp_int *a, mp_int *n, mp_digit d); + +/* d = a**b (mod c) */ +TOMMATH_STORAGE_CLASS int mp_exptmod(mp_int *a, mp_int *b, mp_int *c, mp_int *d); + +/* ---> Primes <--- */ + +/* number of primes */ +#ifdef MP_8BIT + #define PRIME_SIZE 31 +#else + #define PRIME_SIZE 256 +#endif + +/* table of first PRIME_SIZE primes */ +extern const mp_digit ltm_prime_tab[]; + +/* result=1 if a is divisible by one of the first PRIME_SIZE primes */ +TOMMATH_STORAGE_CLASS int mp_prime_is_divisible(mp_int *a, int *result); + +/* performs one Fermat test of "a" using base "b". + * Sets result to 0 if composite or 1 if probable prime + */ +TOMMATH_STORAGE_CLASS int mp_prime_fermat(mp_int *a, mp_int *b, int *result); + +/* performs one Miller-Rabin test of "a" using base "b". + * Sets result to 0 if composite or 1 if probable prime + */ +TOMMATH_STORAGE_CLASS int mp_prime_miller_rabin(mp_int *a, mp_int *b, int *result); + +/* This gives [for a given bit size] the number of trials required + * such that Miller-Rabin gives a prob of failure lower than 2^-96 + */ +TOMMATH_STORAGE_CLASS int mp_prime_rabin_miller_trials(int size); + +/* performs t rounds of Miller-Rabin on "a" using the first + * t prime bases. Also performs an initial sieve of trial + * division. Determines if "a" is prime with probability + * of error no more than (1/4)**t. + * + * Sets result to 1 if probably prime, 0 otherwise + */ +TOMMATH_STORAGE_CLASS int mp_prime_is_prime(mp_int *a, int t, int *result); + +/* finds the next prime after the number "a" using "t" trials + * of Miller-Rabin. + * + * bbs_style = 1 means the prime must be congruent to 3 mod 4 + */ +TOMMATH_STORAGE_CLASS int mp_prime_next_prime(mp_int *a, int t, int bbs_style); + +/* makes a truly random prime of a given size (bytes), + * call with bbs = 1 if you want it to be congruent to 3 mod 4 + * + * You have to supply a callback which fills in a buffer with random bytes. "dat" is a parameter you can + * have passed to the callback (e.g. a state or something). This function doesn't use "dat" itself + * so it can be NULL + * + * The prime generated will be larger than 2^(8*size). + */ +#define mp_prime_random(a, t, size, bbs, cb, dat) mp_prime_random_ex(a, t, ((size) * 8) + 1, (bbs==1)?LTM_PRIME_BBS:0, cb, dat) + +/* makes a truly random prime of a given size (bits), + * + * Flags are as follows: + * + * LTM_PRIME_BBS - make prime congruent to 3 mod 4 + * LTM_PRIME_SAFE - make sure (p-1)/2 is prime as well (implies LTM_PRIME_BBS) + * LTM_PRIME_2MSB_OFF - make the 2nd highest bit zero + * LTM_PRIME_2MSB_ON - make the 2nd highest bit one + * + * You have to supply a callback which fills in a buffer with random bytes. "dat" is a parameter you can + * have passed to the callback (e.g. a state or something). This function doesn't use "dat" itself + * so it can be NULL + * + */ +TOMMATH_STORAGE_CLASS int mp_prime_random_ex(mp_int *a, int t, int size, int flags, ltm_prime_callback cb, void *dat); + +/* ---> radix conversion <--- */ +TOMMATH_STORAGE_CLASS int mp_count_bits(mp_int *a); + +TOMMATH_STORAGE_CLASS int mp_unsigned_bin_size(mp_int *a); +TOMMATH_STORAGE_CLASS int mp_read_unsigned_bin(mp_int *a, unsigned char *b, int c); +TOMMATH_STORAGE_CLASS int mp_to_unsigned_bin(mp_int *a, unsigned char *b); + +TOMMATH_STORAGE_CLASS int mp_signed_bin_size(mp_int *a); +TOMMATH_STORAGE_CLASS int mp_read_signed_bin(mp_int *a, unsigned char *b, int c); +TOMMATH_STORAGE_CLASS int mp_to_signed_bin(mp_int *a, unsigned char *b); + +TOMMATH_STORAGE_CLASS int mp_read_radix(mp_int *a, const char *str, int radix); +TOMMATH_STORAGE_CLASS int mp_toradix(mp_int *a, char *str, int radix); +TOMMATH_STORAGE_CLASS int mp_toradix_n(mp_int * a, char *str, int radix, int maxlen); +TOMMATH_STORAGE_CLASS int mp_radix_size(mp_int *a, int radix, int *size); + +TOMMATH_STORAGE_CLASS int mp_fread(mp_int *a, int radix, FILE *stream); +TOMMATH_STORAGE_CLASS int mp_fwrite(mp_int *a, int radix, FILE *stream); + +#define mp_read_raw(mp, str, len) mp_read_signed_bin((mp), (str), (len)) +#define mp_raw_size(mp) mp_signed_bin_size(mp) +#define mp_toraw(mp, str) mp_to_signed_bin((mp), (str)) +#define mp_read_mag(mp, str, len) mp_read_unsigned_bin((mp), (str), (len)) +#define mp_mag_size(mp) mp_unsigned_bin_size(mp) +#define mp_tomag(mp, str) mp_to_unsigned_bin((mp), (str)) + +#define mp_tobinary(M, S) mp_toradix((M), (S), 2) +#define mp_tooctal(M, S) mp_toradix((M), (S), 8) +#define mp_todecimal(M, S) mp_toradix((M), (S), 10) +#define mp_tohex(M, S) mp_toradix((M), (S), 16) + +/* lowlevel functions, do not call! */ +TOMMATH_STORAGE_CLASS int s_mp_add(mp_int *a, mp_int *b, mp_int *c); +TOMMATH_STORAGE_CLASS int s_mp_sub(mp_int *a, mp_int *b, mp_int *c); +#define s_mp_mul(a, b, c) s_mp_mul_digs(a, b, c, (a)->used + (b)->used + 1) +TOMMATH_STORAGE_CLASS int fast_s_mp_mul_digs(mp_int *a, mp_int *b, mp_int *c, int digs); +TOMMATH_STORAGE_CLASS int s_mp_mul_digs(mp_int *a, mp_int *b, mp_int *c, int digs); +TOMMATH_STORAGE_CLASS int fast_s_mp_mul_high_digs(mp_int *a, mp_int *b, mp_int *c, int digs); +TOMMATH_STORAGE_CLASS int s_mp_mul_high_digs(mp_int *a, mp_int *b, mp_int *c, int digs); +TOMMATH_STORAGE_CLASS int fast_s_mp_sqr(mp_int *a, mp_int *b); +TOMMATH_STORAGE_CLASS int s_mp_sqr(mp_int *a, mp_int *b); +TOMMATH_STORAGE_CLASS int mp_karatsuba_mul(mp_int *a, mp_int *b, mp_int *c); +TOMMATH_STORAGE_CLASS int mp_toom_mul(mp_int *a, mp_int *b, mp_int *c); +TOMMATH_STORAGE_CLASS int mp_karatsuba_sqr(mp_int *a, mp_int *b); +TOMMATH_STORAGE_CLASS int mp_toom_sqr(mp_int *a, mp_int *b); +TOMMATH_STORAGE_CLASS int fast_mp_invmod(mp_int *a, mp_int *b, mp_int *c); +TOMMATH_STORAGE_CLASS int mp_invmod_slow (mp_int * a, mp_int * b, mp_int * c); +TOMMATH_STORAGE_CLASS int fast_mp_montgomery_reduce(mp_int *a, mp_int *m, mp_digit mp); +TOMMATH_STORAGE_CLASS int mp_exptmod_fast(mp_int *G, mp_int *X, mp_int *P, mp_int *Y, int mode); +TOMMATH_STORAGE_CLASS int s_mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y); +TOMMATH_STORAGE_CLASS void bn_reverse(unsigned char *s, int len); + +extern const char *mp_s_rmap; + +#ifdef __cplusplus + } +#endif + +#endif + + diff --git a/library/auto.tcl b/library/auto.tcl index f77b866..f512552 100644 --- a/library/auto.tcl +++ b/library/auto.tcl @@ -3,7 +3,7 @@ # utility procs formerly in init.tcl dealing with auto execution # of commands and can be auto loaded themselves. # -# RCS: @(#) $Id: auto.tcl,v 1.23 2005/01/25 17:04:20 dgp Exp $ +# RCS: @(#) $Id: auto.tcl,v 1.24 2005/05/10 18:34:53 kennykb Exp $ # # Copyright (c) 1991-1993 The Regents of the University of California. # Copyright (c) 1994-1998 Sun Microsystems, Inc. diff --git a/library/clock.tcl b/library/clock.tcl index ec97d2d..61a80d2 100644 --- a/library/clock.tcl +++ b/library/clock.tcl @@ -13,7 +13,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: clock.tcl,v 1.15 2005/04/19 15:11:07 kennykb Exp $ +# RCS: @(#) $Id: clock.tcl,v 1.16 2005/05/10 18:34:54 kennykb Exp $ # #---------------------------------------------------------------------- diff --git a/library/http/http.tcl b/library/http/http.tcl index d6484cc..c3454c4 100644 --- a/library/http/http.tcl +++ b/library/http/http.tcl @@ -9,7 +9,7 @@ # See the file "license.terms" for information on usage and # redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: http.tcl,v 1.50 2005/01/06 15:15:42 dkf Exp $ +# RCS: @(#) $Id: http.tcl,v 1.51 2005/05/10 18:34:54 kennykb Exp $ # Rough version history: # 1.0 Old http_get interface diff --git a/library/init.tcl b/library/init.tcl index ff845fc..4e167af 100644 --- a/library/init.tcl +++ b/library/init.tcl @@ -3,7 +3,7 @@ # Default system startup file for Tcl-based applications. Defines # "unknown" procedure and auto-load facilities. # -# RCS: @(#) $Id: init.tcl,v 1.74 2005/04/28 05:32:01 dgp Exp $ +# RCS: @(#) $Id: init.tcl,v 1.75 2005/05/10 18:34:54 kennykb Exp $ # # Copyright (c) 1991-1993 The Regents of the University of California. # Copyright (c) 1994-1996 Sun Microsystems, Inc. diff --git a/library/tcltest/tcltest.tcl b/library/tcltest/tcltest.tcl index 0dd21f7..0e7f549 100644 --- a/library/tcltest/tcltest.tcl +++ b/library/tcltest/tcltest.tcl @@ -16,7 +16,7 @@ # Contributions from Don Porter, NIST, 2002. (not subject to US copyright) # All rights reserved. # -# RCS: @(#) $Id: tcltest.tcl,v 1.94 2005/02/24 18:05:42 dgp Exp $ +# RCS: @(#) $Id: tcltest.tcl,v 1.95 2005/05/10 18:34:54 kennykb Exp $ package require Tcl 8.3 ;# uses [glob -directory] namespace eval tcltest { diff --git a/macosx/README b/macosx/README index fadf7c4..18a0968 100644 --- a/macosx/README +++ b/macosx/README @@ -1,7 +1,7 @@ Tcl MacOSX README ----------------- -RCS: @(#) $Id: README,v 1.3 2005/04/09 15:38:29 das Exp $ +RCS: @(#) $Id: README,v 1.4 2005/05/10 18:34:56 kennykb Exp $ This is the README file for the Mac OS X native version of Tcl (framework build). diff --git a/tests/appendComp.test b/tests/appendComp.test index a9b5713..c946d35 100644 --- a/tests/appendComp.test +++ b/tests/appendComp.test @@ -11,7 +11,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: appendComp.test,v 1.8 2005/05/05 15:32:20 dgp Exp $ +# RCS: @(#) $Id: appendComp.test,v 1.9 2005/05/10 18:34:56 kennykb Exp $ if {[lsearch [namespace children] ::tcltest] == -1} { package require tcltest 2 diff --git a/tests/basic.test b/tests/basic.test index 005b458..2dc628d 100644 --- a/tests/basic.test +++ b/tests/basic.test @@ -15,7 +15,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: basic.test,v 1.39 2005/03/18 15:51:00 dgp Exp $ +# RCS: @(#) $Id: basic.test,v 1.40 2005/05/10 18:34:56 kennykb Exp $ # package require tcltest 2 diff --git a/tests/binary.test b/tests/binary.test index a611eb2..047f80f 100644 --- a/tests/binary.test +++ b/tests/binary.test @@ -10,7 +10,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: binary.test,v 1.18 2004/06/23 15:36:55 dkf Exp $ +# RCS: @(#) $Id: binary.test,v 1.19 2005/05/10 18:34:56 kennykb Exp $ if {[lsearch [namespace children] ::tcltest] == -1} { package require tcltest @@ -1071,27 +1071,27 @@ test binary-31.1 {Tcl_BinaryObjCmd: scan} { test binary-31.2 {Tcl_BinaryObjCmd: scan} bigEndian { catch {unset arg1} list [binary scan \x3f\xcc\xcc\xcd\x40\x59\x99\x9a f* arg1] $arg1 -} {1 {1.60000002384 3.40000009537}} +} {1 {1.600000023841858 3.4000000953674316}} test binary-31.3 {Tcl_BinaryObjCmd: scan} littleEndian { catch {unset arg1} list [binary scan \xcd\xcc\xcc\x3f\x9a\x99\x59\x40 f* arg1] $arg1 -} {1 {1.60000002384 3.40000009537}} +} {1 {1.600000023841858 3.4000000953674316}} test binary-31.4 {Tcl_BinaryObjCmd: scan} bigEndian { catch {unset arg1} list [binary scan \x3f\xcc\xcc\xcd\x40\x59\x99\x9a f arg1] $arg1 -} {1 1.60000002384} +} {1 1.600000023841858} test binary-31.5 {Tcl_BinaryObjCmd: scan} littleEndian { catch {unset arg1} list [binary scan \xcd\xcc\xcc\x3f\x9a\x99\x59\x40 f arg1] $arg1 -} {1 1.60000002384} +} {1 1.600000023841858} test binary-31.6 {Tcl_BinaryObjCmd: scan} bigEndian { catch {unset arg1} list [binary scan \x3f\xcc\xcc\xcd f1 arg1] $arg1 -} {1 1.60000002384} +} {1 1.600000023841858} test binary-31.7 {Tcl_BinaryObjCmd: scan} littleEndian { catch {unset arg1} list [binary scan \xcd\xcc\xcc\x3f f1 arg1] $arg1 -} {1 1.60000002384} +} {1 1.600000023841858} test binary-31.8 {Tcl_BinaryObjCmd: scan} bigEndian { catch {unset arg1} list [binary scan \x3f\xcc\xcc\xcd f0 arg1] $arg1 @@ -1103,11 +1103,11 @@ test binary-31.9 {Tcl_BinaryObjCmd: scan} littleEndian { test binary-31.10 {Tcl_BinaryObjCmd: scan} bigEndian { catch {unset arg1} list [binary scan \x3f\xcc\xcc\xcd\x40\x59\x99\x9a f2 arg1] $arg1 -} {1 {1.60000002384 3.40000009537}} +} {1 {1.600000023841858 3.4000000953674316}} test binary-31.11 {Tcl_BinaryObjCmd: scan} littleEndian { catch {unset arg1} list [binary scan \xcd\xcc\xcc\x3f\x9a\x99\x59\x40 f2 arg1] $arg1 -} {1 {1.60000002384 3.40000009537}} +} {1 {1.600000023841858 3.4000000953674316}} test binary-31.12 {Tcl_BinaryObjCmd: scan} { catch {unset arg1} set arg1 foo @@ -1123,13 +1123,13 @@ test binary-31.14 {Tcl_BinaryObjCmd: scan} bigEndian { set arg1 foo set arg2 bar list [binary scan \x3f\xcc\xcc\xcd\x40\x59\x99\x9a\x05 f2c* arg1 arg2] $arg1 $arg2 -} {2 {1.60000002384 3.40000009537} 5} +} {2 {1.600000023841858 3.4000000953674316} 5} test binary-31.15 {Tcl_BinaryObjCmd: scan} littleEndian { catch {unset arg1 arg2} set arg1 foo set arg2 bar list [binary scan \xcd\xcc\xcc\x3f\x9a\x99\x59\x40\x05 f2c* arg1 arg2] $arg1 $arg2 -} {2 {1.60000002384 3.40000009537} 5} +} {2 {1.600000023841858 3.4000000953674316} 5} test binary-32.1 {Tcl_BinaryObjCmd: scan} { list [catch {binary scan abc d} msg] $msg @@ -1391,12 +1391,8 @@ test binary-40.1 {ScanNumber: floating point overflow} {nonPortable bigEndian} { test binary-40.3 {ScanNumber: floating point overflow} {littleEndian win} { catch {unset arg1} set result [binary scan \xff\xff\xff\xff f1 arg1] - if {[string equal $arg1 -1.\#QNAN] || [string equal $arg1 -NAN]} { - lappend result success - } else { - lappend result failure $arg1 - } -} {1 success} + lappend result [regexp -nocase NaN $arg1] +} {1 1} test binary-40.4 {ScanNumber: floating point overflow} {nonPortable bigEndian} { catch {unset arg1} list [binary scan \xff\xff\xff\xff\xff\xff\xff\xff d1 arg1] $arg1 @@ -1404,12 +1400,8 @@ test binary-40.4 {ScanNumber: floating point overflow} {nonPortable bigEndian} { test binary-40.6 {ScanNumber: floating point overflow} {littleEndian win} { catch {unset arg1} set result [binary scan \xff\xff\xff\xff\xff\xff\xff\xff d1 arg1] - if {[string equal $arg1 -1.\#QNAN] || [string equal $arg1 -NAN]} { - lappend result success - } else { - lappend result failure $arg1 - } -} {1 success} + lappend result [regexp -nocase NaN $arg1] +} {1 1} test binary-41.1 {ScanNumber: word alignment} { catch {unset arg1; unset arg2} @@ -1430,11 +1422,11 @@ test binary-41.4 {ScanNumber: word alignment} { test binary-41.5 {ScanNumber: word alignment} bigEndian { catch {unset arg1; unset arg2} list [binary scan \x01\x3f\xcc\xcc\xcd c1f1 arg1 arg2] $arg1 $arg2 -} {2 1 1.60000002384} +} {2 1 1.600000023841858} test binary-41.6 {ScanNumber: word alignment} littleEndian { catch {unset arg1; unset arg2} list [binary scan \x01\xcd\xcc\xcc\x3f c1f1 arg1 arg2] $arg1 $arg2 -} {2 1 1.60000002384} +} {2 1 1.600000023841858} test binary-41.7 {ScanNumber: word alignment} bigEndian { catch {unset arg1; unset arg2} list [binary scan \x01\x3f\xf9\x99\x99\x99\x99\x99\x9a c1d1 arg1 arg2] $arg1 $arg2 @@ -2033,27 +2025,27 @@ test binary-59.1 {Tcl_BinaryObjCmd: scan} { test binary-59.2 {Tcl_BinaryObjCmd: scan} bigEndian { catch {unset arg1} list [binary scan \x3f\xcc\xcc\xcd\x40\x59\x99\x9a R* arg1] $arg1 -} {1 {1.60000002384 3.40000009537}} +} {1 {1.600000023841858 3.4000000953674316}} test binary-59.3 {Tcl_BinaryObjCmd: scan} littleEndian { catch {unset arg1} list [binary scan \xcd\xcc\xcc\x3f\x9a\x99\x59\x40 r* arg1] $arg1 -} {1 {1.60000002384 3.40000009537}} +} {1 {1.600000023841858 3.4000000953674316}} test binary-59.4 {Tcl_BinaryObjCmd: scan} bigEndian { catch {unset arg1} list [binary scan \x3f\xcc\xcc\xcd\x40\x59\x99\x9a R arg1] $arg1 -} {1 1.60000002384} +} {1 1.600000023841858} test binary-59.5 {Tcl_BinaryObjCmd: scan} littleEndian { catch {unset arg1} list [binary scan \xcd\xcc\xcc\x3f\x9a\x99\x59\x40 r arg1] $arg1 -} {1 1.60000002384} +} {1 1.600000023841858} test binary-59.6 {Tcl_BinaryObjCmd: scan} bigEndian { catch {unset arg1} list [binary scan \x3f\xcc\xcc\xcd R1 arg1] $arg1 -} {1 1.60000002384} +} {1 1.600000023841858} test binary-59.7 {Tcl_BinaryObjCmd: scan} littleEndian { catch {unset arg1} list [binary scan \xcd\xcc\xcc\x3f r1 arg1] $arg1 -} {1 1.60000002384} +} {1 1.600000023841858} test binary-59.8 {Tcl_BinaryObjCmd: scan} bigEndian { catch {unset arg1} list [binary scan \x3f\xcc\xcc\xcd R0 arg1] $arg1 @@ -2065,11 +2057,11 @@ test binary-59.9 {Tcl_BinaryObjCmd: scan} littleEndian { test binary-59.10 {Tcl_BinaryObjCmd: scan} bigEndian { catch {unset arg1} list [binary scan \x3f\xcc\xcc\xcd\x40\x59\x99\x9a R2 arg1] $arg1 -} {1 {1.60000002384 3.40000009537}} +} {1 {1.600000023841858 3.4000000953674316}} test binary-59.11 {Tcl_BinaryObjCmd: scan} littleEndian { catch {unset arg1} list [binary scan \xcd\xcc\xcc\x3f\x9a\x99\x59\x40 r2 arg1] $arg1 -} {1 {1.60000002384 3.40000009537}} +} {1 {1.600000023841858 3.4000000953674316}} test binary-59.12 {Tcl_BinaryObjCmd: scan} { catch {unset arg1} set arg1 foo @@ -2085,13 +2077,19 @@ test binary-59.14 {Tcl_BinaryObjCmd: scan} bigEndian { set arg1 foo set arg2 bar list [binary scan \x3f\xcc\xcc\xcd\x40\x59\x99\x9a\x05 R2c* arg1 arg2] $arg1 $arg2 -} {2 {1.60000002384 3.40000009537} 5} +} {2 {1.600000023841858 3.4000000953674316} 5} test binary-59.15 {Tcl_BinaryObjCmd: scan} littleEndian { catch {unset arg1 arg2} set arg1 foo set arg2 bar list [binary scan \xcd\xcc\xcc\x3f\x9a\x99\x59\x40\x05 r2c* arg1 arg2] $arg1 $arg2 -} {2 {1.60000002384 3.40000009537} 5} +} {2 {1.600000023841858 3.4000000953674316} 5} + +test binary-60.1 {[binary format] with NaN} { + binary scan [binary format dqQfrR NaN NaN NaN NaN NaN NaN] dqQfrR \ + v1 v2 v3 v4 v5 v6 + list $v1 $v2 $v3 $v4 $v5 $v6 +} {NaN NaN NaN NaN NaN NaN} # cleanup ::tcltest::cleanupTests diff --git a/tests/clock.test b/tests/clock.test index 7c2673d..4981d96 100644 --- a/tests/clock.test +++ b/tests/clock.test @@ -11,7 +11,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: clock.test,v 1.54 2005/04/19 15:11:08 kennykb Exp $ +# RCS: @(#) $Id: clock.test,v 1.55 2005/05/10 18:34:56 kennykb Exp $ if {[lsearch [namespace children] ::tcltest] == -1} { package require tcltest 2 diff --git a/tests/cmdIL.test b/tests/cmdIL.test index 443dd78..644111e 100644 --- a/tests/cmdIL.test +++ b/tests/cmdIL.test @@ -8,7 +8,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: cmdIL.test,v 1.24 2005/04/29 20:49:44 dgp Exp $ +# RCS: @(#) $Id: cmdIL.test,v 1.25 2005/05/10 18:35:01 kennykb Exp $ if {[lsearch [namespace children] ::tcltest] == -1} { package require tcltest 2 diff --git a/tests/compExpr-old.test b/tests/compExpr-old.test index c770729..6ac7ff1 100644 --- a/tests/compExpr-old.test +++ b/tests/compExpr-old.test @@ -12,7 +12,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: compExpr-old.test,v 1.11 2004/10/31 18:46:55 dkf Exp $ +# RCS: @(#) $Id: compExpr-old.test,v 1.12 2005/05/10 18:35:17 kennykb Exp $ if {[lsearch [namespace children] ::tcltest] == -1} { package require tcltest 2 @@ -25,6 +25,64 @@ if {([catch {expr T1()} msg] == 1) && ($msg == {unknown math function "T1"})} { testConstraint testmathfunctions 1 } +# Big test for correct ordering of data in [expr] + +proc testIEEE {} { + variable ieeeValues + binary scan [binary format dd -1.0 1.0] c* c + switch -exact -- $c { + {0 0 0 0 0 0 -16 -65 0 0 0 0 0 0 -16 63} { + # little endian + binary scan \x00\x00\x00\x00\x00\x00\xf0\xff d \ + ieeeValues(-Infinity) + binary scan \x00\x00\x00\x00\x00\x00\xf0\xbf d \ + ieeeValues(-Normal) + binary scan \x00\x00\x00\x00\x00\x00\x08\x80 d \ + ieeeValues(-Subnormal) + binary scan \x00\x00\x00\x00\x00\x00\x00\x80 d \ + ieeeValues(-0) + binary scan \x00\x00\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(+0) + binary scan \x00\x00\x00\x00\x00\x00\x08\x00 d \ + ieeeValues(+Subnormal) + binary scan \x00\x00\x00\x00\x00\x00\xf0\x3f d \ + ieeeValues(+Normal) + binary scan \x00\x00\x00\x00\x00\x00\xf0\x7f d \ + ieeeValues(+Infinity) + binary scan \x00\x00\x00\x00\x00\x00\xf8\x7f d \ + ieeeValues(NaN) + set ieeeValues(littleEndian) 1 + return 1 + } + {-65 -16 0 0 0 0 0 0 63 -16 0 0 0 0 0 0} { + binary scan \xff\xf0\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(-Infinity) + binary scan \xbf\xf0\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(-Normal) + binary scan \x80\x08\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(-Subnormal) + binary scan \x80\x00\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(-0) + binary scan \x00\x00\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(+0) + binary scan \x00\x08\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(+Subnormal) + binary scan \x3f\xf0\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(+Normal) + binary scan \x7f\xf0\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(+Infinity) + binary scan \x7f\xf8\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(NaN) + set ieeeValues(littleEndian) 0 + return 1 + } + default { + return 0 + } + } +} +::tcltest::testConstraint ieeeFloatingPoint [testIEEE] + # procedures used below proc put_hello_char {c} { @@ -143,10 +201,11 @@ test compExpr-old-2.4 {TclCompileExpr: numeric expr string rep == formatted int } 1 test compExpr-old-3.1 {CompileCondExpr: just lor expr} {expr 3||0} 1 -test compExpr-old-3.2 {CompileCondExpr: error in lor expr} { +test compExpr-old-3.2 {CompileCondExpr: error in lor expr} -body { catch {expr x||3} msg set msg -} {syntax error in expression "x||3": variable references require preceding $} +} -match glob \ + -result {syntax error in expression "x||3": * preceding $*} test compExpr-old-3.3 {CompileCondExpr: test true arm} {expr 3>2?44:66} 44 test compExpr-old-3.4 {CompileCondExpr: error compiling true arm} { catch {expr 3>2?2***3:66} msg @@ -169,10 +228,10 @@ test compExpr-old-3.8 {CompileCondExpr: long arms & nested cond exprs} {nonPorta catch {unset xxx} test compExpr-old-4.1 {CompileLorExpr: just land expr} {expr 1.3&&3.3} 1 -test compExpr-old-4.2 {CompileLorExpr: error in land expr} { +test compExpr-old-4.2 {CompileLorExpr: error in land expr} -body { catch {expr x&&3} msg set msg -} {syntax error in expression "x&&3": variable references require preceding $} +} -match glob -result {syntax error in expression "x&&3": * preceding $*} test compExpr-old-4.3 {CompileLorExpr: simple lor exprs} {expr 0||1.0} 1 test compExpr-old-4.4 {CompileLorExpr: simple lor exprs} {expr 3.0||0.0} 1 test compExpr-old-4.5 {CompileLorExpr: simple lor exprs} {expr 0||0||1} 1 @@ -194,10 +253,10 @@ test compExpr-old-4.9 {CompileLorExpr: long lor arm} { } 1 test compExpr-old-5.1 {CompileLandExpr: just bitor expr} {expr 7|0x13} 23 -test compExpr-old-5.2 {CompileLandExpr: error in bitor expr} { +test compExpr-old-5.2 {CompileLandExpr: error in bitor expr} -body { catch {expr x|3} msg set msg -} {syntax error in expression "x|3": variable references require preceding $} +} -match glob -result {syntax error in expression "x|3": * preceding $*} test compExpr-old-5.3 {CompileLandExpr: simple land exprs} {expr 0&&1.0} 0 test compExpr-old-5.4 {CompileLandExpr: simple land exprs} {expr 0&&0} 0 test compExpr-old-5.5 {CompileLandExpr: simple land exprs} {expr 3.0&&1.2} 1 @@ -220,10 +279,10 @@ test compExpr-old-5.10 {CompileLandExpr: long land arms} { } 1 test compExpr-old-6.1 {CompileBitXorExpr: just bitand expr} {expr 7&0x13} 3 -test compExpr-old-6.2 {CompileBitXorExpr: error in bitand expr} { +test compExpr-old-6.2 {CompileBitXorExpr: error in bitand expr} -body { catch {expr x|3} msg set msg -} {syntax error in expression "x|3": variable references require preceding $} +} -match glob -result {syntax error in expression "x|3": * preceding $*} test compExpr-old-6.3 {CompileBitXorExpr: simple bitxor exprs} {expr 7^0x13} 20 test compExpr-old-6.4 {CompileBitXorExpr: simple bitxor exprs} {expr 3^0x10} 19 test compExpr-old-6.5 {CompileBitXorExpr: simple bitxor exprs} {expr 0^7} 7 @@ -232,10 +291,10 @@ test compExpr-old-6.7 {CompileBitXorExpr: error compiling bitxor arm} { catch {expr 2***3|6} msg set msg } {syntax error in expression "2***3|6": unexpected operator *} -test compExpr-old-6.8 {CompileBitXorExpr: error compiling bitxor arm} { +test compExpr-old-6.8 {CompileBitXorExpr: error compiling bitxor arm} -body { catch {expr 2^x} msg set msg -} {syntax error in expression "2^x": variable references require preceding $} +} -match glob -result {syntax error in expression "2^x": * preceding $*} test compExpr-old-6.9 {CompileBitXorExpr: runtime error in bitxor arm} { list [catch {expr {24.0^3}} msg] $msg } {1 {can't use floating-point value as operand of "^"}} @@ -247,10 +306,10 @@ test compExpr-old-7.1 {CompileBitAndExpr: just equality expr} {expr 3==2} 0 test compExpr-old-7.2 {CompileBitAndExpr: just equality expr} {expr 2.0==2} 1 test compExpr-old-7.3 {CompileBitAndExpr: just equality expr} {expr 3.2!=2.2} 1 test compExpr-old-7.4 {CompileBitAndExpr: just equality expr} {expr {"abc" == "abd"}} 0 -test compExpr-old-7.5 {CompileBitAndExpr: error in equality expr} { +test compExpr-old-7.5 {CompileBitAndExpr: error in equality expr} -body { catch {expr x==3} msg set msg -} {syntax error in expression "x==3": variable references require preceding $} +} -match glob -result {syntax error in expression "x==3": * preceding $*} test compExpr-old-7.6 {CompileBitAndExpr: simple bitand exprs} {expr 7&0x13} 3 test compExpr-old-7.7 {CompileBitAndExpr: simple bitand exprs} {expr 0xf2&0x53} 82 test compExpr-old-7.8 {CompileBitAndExpr: simple bitand exprs} {expr 3&6} 2 @@ -259,10 +318,10 @@ test compExpr-old-7.10 {CompileBitAndExpr: error compiling bitand arm} { catch {expr 2***3&6} msg set msg } {syntax error in expression "2***3&6": unexpected operator *} -test compExpr-old-7.11 {CompileBitAndExpr: error compiling bitand arm} { +test compExpr-old-7.11 {CompileBitAndExpr: error compiling bitand arm} -body { catch {expr 2&x} msg set msg -} {syntax error in expression "2&x": variable references require preceding $} +} -match glob -result {syntax error in expression "2&x": * preceding $*} test compExpr-old-7.12 {CompileBitAndExpr: runtime error in bitand arm} { list [catch {expr {24.0&3}} msg] $msg } {1 {can't use floating-point value as operand of "&"}} @@ -274,10 +333,10 @@ test compExpr-old-8.1 {CompileEqualityExpr: just relational expr} {expr 3>=2} 1 test compExpr-old-8.2 {CompileEqualityExpr: just relational expr} {expr 2<=2.1} 1 test compExpr-old-8.3 {CompileEqualityExpr: just relational expr} {expr 3.2>"2.2"} 1 test compExpr-old-8.4 {CompileEqualityExpr: just relational expr} {expr {"0y"<"0x12"}} 0 -test compExpr-old-8.5 {CompileEqualityExpr: error in relational expr} { +test compExpr-old-8.5 {CompileEqualityExpr: error in relational expr} -body { catch {expr x>3} msg set msg -} {syntax error in expression "x>3": variable references require preceding $} +} -match glob -result {syntax error in expression "x>3": * preceding $*} test compExpr-old-8.6 {CompileEqualityExpr: simple equality exprs} {expr 7==0x13} 0 test compExpr-old-8.7 {CompileEqualityExpr: simple equality exprs} {expr -0xf2!=0x53} 1 test compExpr-old-8.8 {CompileEqualityExpr: simple equality exprs} {expr {"12398712938788234-1298379" != ""}} 1 @@ -286,10 +345,10 @@ test compExpr-old-8.10 {CompileEqualityExpr: error compiling equality arm} { catch {expr 2***3==6} msg set msg } {syntax error in expression "2***3==6": unexpected operator *} -test compExpr-old-8.11 {CompileEqualityExpr: error compiling equality arm} { +test compExpr-old-8.11 {CompileEqualityExpr: error compiling equality arm} -body { catch {expr 2!=x} msg set msg -} {syntax error in expression "2!=x": variable references require preceding $} +} -match glob -result {syntax error in expression "2!=x": * preceding $*} test compExpr-old-9.1 {CompileRelationalExpr: just shift expr} {expr 3<<2} 12 @@ -309,39 +368,39 @@ if {int(0x80000000) > 0} { expr {1<<31} } -2147483648 } -test compExpr-old-9.6 {CompileRelationalExpr: error in shift expr} { +test compExpr-old-9.6 {CompileRelationalExpr: error in shift expr} -body { catch {expr x>>3} msg set msg -} {syntax error in expression "x>>3": variable references require preceding $} +} -match glob -result {syntax error in expression "x>>3": * preceding $*} test compExpr-old-9.7 {CompileRelationalExpr: simple relational exprs} {expr 0xff>=+0x3} 1 test compExpr-old-9.8 {CompileRelationalExpr: simple relational exprs} {expr -0xf2<0x3} 1 test compExpr-old-9.9 {CompileRelationalExpr: error compiling relational arm} { catch {expr 2***3>6} msg set msg } {syntax error in expression "2***3>6": unexpected operator *} -test compExpr-old-9.10 {CompileRelationalExpr: error compiling relational arm} { +test compExpr-old-9.10 {CompileRelationalExpr: error compiling relational arm} -body { catch {expr 2<x} msg set msg -} {syntax error in expression "2<x": variable references require preceding $} +} -match glob -result {syntax error in expression "2<x": * preceding $*} test compExpr-old-10.1 {CompileShiftExpr: just add expr} {expr 4+-2} 2 test compExpr-old-10.2 {CompileShiftExpr: just add expr} {expr 0xff-2} 253 test compExpr-old-10.3 {CompileShiftExpr: just add expr} {expr -1--2} 1 test compExpr-old-10.4 {CompileShiftExpr: just add expr} {expr 1-0123} -82 -test compExpr-old-10.5 {CompileShiftExpr: error in add expr} { +test compExpr-old-10.5 {CompileShiftExpr: error in add expr} -body { catch {expr x+3} msg set msg -} {syntax error in expression "x+3": variable references require preceding $} +} -match glob -result {syntax error in expression "x+3": * preceding $*} test compExpr-old-10.6 {CompileShiftExpr: simple shift exprs} {expr 0xff>>0x3} 31 test compExpr-old-10.7 {CompileShiftExpr: simple shift exprs} {expr -0xf2<<0x3} -1936 test compExpr-old-10.8 {CompileShiftExpr: error compiling shift arm} { catch {expr 2***3>>6} msg set msg } {syntax error in expression "2***3>>6": unexpected operator *} -test compExpr-old-10.9 {CompileShiftExpr: error compiling shift arm} { +test compExpr-old-10.9 {CompileShiftExpr: error compiling shift arm} -body { catch {expr 2<<x} msg set msg -} {syntax error in expression "2<<x": variable references require preceding $} +} -match glob -result {syntax error in expression "2<<x": * preceding $*} test compExpr-old-10.10 {CompileShiftExpr: runtime error} { list [catch {expr {24.0>>43}} msg] $msg } {1 {can't use floating-point value as operand of ">>"}} @@ -353,20 +412,20 @@ test compExpr-old-11.1 {CompileAddExpr: just multiply expr} {expr 4*-2} -8 test compExpr-old-11.2 {CompileAddExpr: just multiply expr} {expr 0xff%2} 1 test compExpr-old-11.3 {CompileAddExpr: just multiply expr} {expr -1/2} -1 test compExpr-old-11.4 {CompileAddExpr: just multiply expr} {expr 7891%0123} 6 -test compExpr-old-11.5 {CompileAddExpr: error in multiply expr} { +test compExpr-old-11.5 {CompileAddExpr: error in multiply expr} -body { catch {expr x*3} msg set msg -} {syntax error in expression "x*3": variable references require preceding $} +} -match glob -result {syntax error in expression "x*3": * preceding $*} test compExpr-old-11.6 {CompileAddExpr: simple add exprs} {expr 0xff++0x3} 258 test compExpr-old-11.7 {CompileAddExpr: simple add exprs} {expr -0xf2--0x3} -239 test compExpr-old-11.8 {CompileAddExpr: error compiling add arm} { catch {expr 2***3+6} msg set msg } {syntax error in expression "2***3+6": unexpected operator *} -test compExpr-old-11.9 {CompileAddExpr: error compiling add arm} { +test compExpr-old-11.9 {CompileAddExpr: error compiling add arm} -body { catch {expr 2-x} msg set msg -} {syntax error in expression "2-x": variable references require preceding $} +} -match glob -result {syntax error in expression "2-x": * preceding $*} test compExpr-old-11.10 {CompileAddExpr: runtime error} { list [catch {expr {24.0+"xx"}} msg] $msg } {1 {can't use non-numeric string as operand of "+"}} @@ -376,7 +435,10 @@ test compExpr-old-11.11 {CompileAddExpr: runtime error} { test compExpr-old-11.12 {CompileAddExpr: runtime error} { list [catch {expr {3/0}} msg] $msg } {1 {divide by zero}} -test compExpr-old-11.13 {CompileAddExpr: runtime error} { +test compExpr-old-11.13a {CompileAddExpr: runtime error} ieeeFloatingPoint { + list [catch {expr {2.3/0.0}} msg] $msg +} {0 Inf} +test compExpr-old-11.13b {CompileAddExpr: runtime error} !ieeeFloatingPoint { list [catch {expr {2.3/0.0}} msg] $msg } {1 {divide by zero}} @@ -384,20 +446,20 @@ test compExpr-old-12.1 {CompileMultiplyExpr: just unary expr} {expr ~4} -5 test compExpr-old-12.2 {CompileMultiplyExpr: just unary expr} {expr --5} 5 test compExpr-old-12.3 {CompileMultiplyExpr: just unary expr} {expr !27} 0 test compExpr-old-12.4 {CompileMultiplyExpr: just unary expr} {expr ~0xff00ff} -16711936 -test compExpr-old-12.5 {CompileMultiplyExpr: error in unary expr} { +test compExpr-old-12.5 {CompileMultiplyExpr: error in unary expr} -body { catch {expr ~x} msg set msg -} {syntax error in expression "~x": variable references require preceding $} +} -match glob -result {syntax error in expression "~x": * preceding $*} test compExpr-old-12.6 {CompileMultiplyExpr: simple multiply exprs} {expr 0xff*0x3} 765 test compExpr-old-12.7 {CompileMultiplyExpr: simple multiply exprs} {expr -0xf2%-0x3} -2 test compExpr-old-12.8 {CompileMultiplyExpr: error compiling multiply arm} { catch {expr 2*3%%6} msg set msg } {syntax error in expression "2*3%%6": unexpected operator %} -test compExpr-old-12.9 {CompileMultiplyExpr: error compiling multiply arm} { +test compExpr-old-12.9 {CompileMultiplyExpr: error compiling multiply arm} -body { catch {expr 2*x} msg set msg -} {syntax error in expression "2*x": variable references require preceding $} +} -match glob -result {syntax error in expression "2*x": * preceding $*} test compExpr-old-12.10 {CompileMultiplyExpr: runtime error} { list [catch {expr {24.0*"xx"}} msg] $msg } {1 {can't use non-numeric string as operand of "*"}} @@ -412,10 +474,10 @@ test compExpr-old-13.4 {CompileUnaryExpr: unary exprs} {expr !2} 0 test compExpr-old-13.5 {CompileUnaryExpr: unary exprs} {expr +--+-62.0} -62.0 test compExpr-old-13.6 {CompileUnaryExpr: unary exprs} {expr !0.0} 1 test compExpr-old-13.7 {CompileUnaryExpr: unary exprs} {expr !0xef} 0 -test compExpr-old-13.8 {CompileUnaryExpr: error compiling unary expr} { +test compExpr-old-13.8 {CompileUnaryExpr: error compiling unary expr} -body { catch {expr ~x} msg set msg -} {syntax error in expression "~x": variable references require preceding $} +} -match glob -result {syntax error in expression "~x": * preceding $*} test compExpr-old-13.9 {CompileUnaryExpr: error compiling unary expr} { catch {expr !1.x} msg set msg @@ -529,7 +591,7 @@ test compExpr-old-14.26 {CompilePrimaryExpr: math function primary} { test compExpr-old-14.27 {CompilePrimaryExpr: error in math function primary} -body { catch {expr sinh::(2.0)} msg set errorInfo -} -match glob -result {syntax error in expression "sinh::(2.0)": expected parenthesis enclosing function arguments +} -match glob -result {syntax error in expression "sinh::(2.0)": * function arguments* while *ing "expr sinh::(2.0)"} test compExpr-old-14.28 {CompilePrimaryExpr: subexpression primary} { @@ -561,31 +623,31 @@ test compExpr-old-14.32 {CompilePrimaryExpr: unexpected token} -body { test compExpr-old-15.1 {CompileMathFuncCall: missing parenthesis} -body { catch {expr sinh2.0)} msg set errorInfo -} -match glob -result {syntax error in expression "sinh2.0)": variable references require preceding $ +} -match glob -result {syntax error in expression "sinh2.0)": * preceding $* while *ing "expr sinh2.0)"} test compExpr-old-15.2 {CompileMathFuncCall: unknown math function} -body { catch {expr whazzathuh(1)} msg set errorInfo -} -match glob -result {unknown math function "whazzathuh" +} -match glob -result {* "*whazzathuh" while *ing "expr whazzathuh(1)"} test compExpr-old-15.3 {CompileMathFuncCall: too many arguments} -body { catch {expr sin(1,2,3)} msg set errorInfo -} -match glob -result {too many arguments for math function +} -match glob -result {too many arguments for math function* while *ing "expr sin(1,2,3)"} test compExpr-old-15.4 {CompileMathFuncCall: ')' found before last required arg} -body { catch {expr sin()} msg set errorInfo -} -match glob -result {too few arguments for math function +} -match glob -result {too few arguments for math function* while *ing "expr sin()"} test compExpr-old-15.5 {CompileMathFuncCall: too few arguments} -body { catch {expr pow(1)} msg set errorInfo -} -match glob -result {too few arguments for math function +} -match glob -result {too few arguments for math function* while *ing "expr pow(1)"} test compExpr-old-15.6 {CompileMathFuncCall: missing ')'} -body { diff --git a/tests/compExpr.test b/tests/compExpr.test index eec796e..42e5cd5 100644 --- a/tests/compExpr.test +++ b/tests/compExpr.test @@ -8,7 +8,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: compExpr.test,v 1.8 2004/09/26 16:36:05 msofer Exp $ +# RCS: @(#) $Id: compExpr.test,v 1.9 2005/05/10 18:35:17 kennykb Exp $ if {[lsearch [namespace children] ::tcltest] == -1} { package require tcltest @@ -29,9 +29,10 @@ test compExpr-1.1 {TclCompileExpr procedure, successful expr parse and compile} test compExpr-1.2 {TclCompileExpr procedure, error parsing expr} { list [catch {expr 1+2+} msg] $msg } {1 {syntax error in expression "1+2+": premature end of expression}} -test compExpr-1.3 {TclCompileExpr procedure, error compiling expr} { +test compExpr-1.3 {TclCompileExpr procedure, error compiling expr} -body { list [catch {expr "foo(123)"} msg] $msg -} {1 {unknown math function "foo"}} +} -match glob -result {1 {* "*foo"}} + test compExpr-1.4 {TclCompileExpr procedure, expr has no operators} { set a {000123} expr {$a} @@ -94,9 +95,9 @@ test compExpr-2.14 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, op found test compExpr-2.15 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, math function found} { format %.6g [expr {sin(2.0)}] } 0.909297 -test compExpr-2.16 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, math function not found} { +test compExpr-2.16 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, math function not found} -body { list [catch {expr {fred(2.0)}} msg] $msg -} {1 {unknown math function "fred"}} +} -match glob -result {1 {* "*fred"}} test compExpr-2.17 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, normal operator} { expr {4*2} } 8 @@ -289,30 +290,30 @@ test compExpr-4.9 {CompileCondExpr procedure, error in "false" clause} { test compExpr-5.1 {CompileMathFuncCall procedure, math function found} { format %.6g [expr atan2(1.0, 2.0)] } 0.463648 -test compExpr-5.2 {CompileMathFuncCall procedure, math function not found} { +test compExpr-5.2 {CompileMathFuncCall procedure, math function not found} -body { list [catch {expr {do_it()}} msg] $msg -} {1 {unknown math function "do_it"}} +} -match glob -result {1 {* "*do_it"}} test compExpr-5.3 {CompileMathFuncCall: call registered math function} testmathfunctions { expr 3*T1()-1 } 368 test compExpr-5.4 {CompileMathFuncCall: call registered math function} testmathfunctions { expr T2()*3 } 1035 -test compExpr-5.5 {CompileMathFuncCall procedure, too few arguments} { +test compExpr-5.5 {CompileMathFuncCall procedure, too few arguments} -body { list [catch {expr {atan2(1.0)}} msg] $msg -} {1 {too few arguments for math function}} +} -match glob -result {1 {too few arguments for math function*}} test compExpr-5.6 {CompileMathFuncCall procedure, complex argument} { format %.6g [expr pow(2.1, 27.5-(24.4*(5%2)))] } 9.97424 test compExpr-5.7 {CompileMathFuncCall procedure, error in argument} { list [catch {expr {sinh(2.*)}} msg] $msg } {1 {syntax error in expression "sinh(2.*)": unexpected close parenthesis}} -test compExpr-5.8 {CompileMathFuncCall procedure, too many arguments} { +test compExpr-5.8 {CompileMathFuncCall procedure, too many arguments} -body { list [catch {expr {sinh(2.0, 3.0)}} msg] $msg -} {1 {too many arguments for math function}} -test compExpr-5.9 {CompileMathFuncCall procedure, too many arguments} { +} -match glob -result {1 {too many arguments for math function*}} +test compExpr-5.9 {CompileMathFuncCall procedure, too many arguments} -body { list [catch {expr {0 <= rand(5.2)}} msg] $msg -} {1 {too many arguments for math function}} +} -match glob -result {1 {too many arguments for math function*}} test compExpr-6.1 {LogSyntaxError procedure, error in expr longer than 60 chars} { list [catch {expr {(+0123456)*(+0123456)*(+0123456)*(+0123456)*(+0123456)*(+0123456)*(+0123456)/} -1 foo 3} msg] $msg diff --git a/tests/compile.test b/tests/compile.test index 4cdc3be..1c774c4 100644 --- a/tests/compile.test +++ b/tests/compile.test @@ -11,7 +11,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: compile.test,v 1.37 2005/04/29 20:49:44 dgp Exp $ +# RCS: @(#) $Id: compile.test,v 1.38 2005/05/10 18:35:18 kennykb Exp $ package require tcltest 2 namespace import -force ::tcltest::* @@ -257,14 +257,14 @@ test compile-11.6 {Tcl_Append*: ensure Tcl_ResetResult is used properly} { proc p {} { set r [list foobar] ; incr foo bogus } list [catch {p} msg] $msg } {1 {expected integer but got "bogus"}} -test compile-11.7 {Tcl_Append*: ensure Tcl_ResetResult is used properly} { +test compile-11.7 {Tcl_Append*: ensure Tcl_ResetResult is used properly} -body { proc p {} { set r [list foobar] ; expr !a } list [catch {p} msg] $msg -} {1 {syntax error in expression "!a": variable references require preceding $}} -test compile-11.8 {Tcl_Append*: ensure Tcl_ResetResult is used properly} { +} -match glob -result {1 {syntax error in expression "!a": * preceding $*}} +test compile-11.8 {Tcl_Append*: ensure Tcl_ResetResult is used properly} -body { proc p {} { set r [list foobar] ; expr {!a} } list [catch {p} msg] $msg -} {1 {syntax error in expression "!a": variable references require preceding $}} +} -match glob -result {1 {syntax error in expression "!a": * preceding $*}} test compile-11.9 {Tcl_Append*: ensure Tcl_ResetResult is used properly} { proc p {} { set r [list foobar] ; llength "\{" } list [catch {p} msg] $msg @@ -320,7 +320,7 @@ test compile-12.3 {check for a buffer overrun} -body { crash } -returnCodes error -cleanup { rename crash {} -} -result {syntax error in expression "a+2": variable references require preceding $} +} -match glob -result {syntax error in expression "a+2": * preceding $*} test compile-12.4 {TclCleanupLiteralTable segfault} -body { # Tcl Bug 1001997 # Here, we're trying to test a case that causes a crash in diff --git a/tests/encoding.test b/tests/encoding.test index b62b604..dc4fd8c 100644 --- a/tests/encoding.test +++ b/tests/encoding.test @@ -8,7 +8,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: encoding.test,v 1.22 2005/04/15 22:41:44 dgp Exp $ +# RCS: @(#) $Id: encoding.test,v 1.23 2005/05/10 18:35:18 kennykb Exp $ package require tcltest 2 namespace import -force ::tcltest::* diff --git a/tests/expr-old.test b/tests/expr-old.test index 5690a14..4853e8a 100644 --- a/tests/expr-old.test +++ b/tests/expr-old.test @@ -13,7 +13,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: expr-old.test,v 1.24 2005/05/02 21:46:00 dgp Exp $ +# RCS: @(#) $Id: expr-old.test,v 1.25 2005/05/10 18:35:19 kennykb Exp $ if {[lsearch [namespace children] ::tcltest] == -1} { package require tcltest 2.1 @@ -26,6 +26,64 @@ if {([catch {expr T1()} msg] == 1) && ($msg == {unknown math function "T1"})} { testConstraint testmathfunctions 1 } +# Big test for correct ordering of data in [expr] + +proc testIEEE {} { + variable ieeeValues + binary scan [binary format dd -1.0 1.0] c* c + switch -exact -- $c { + {0 0 0 0 0 0 -16 -65 0 0 0 0 0 0 -16 63} { + # little endian + binary scan \x00\x00\x00\x00\x00\x00\xf0\xff d \ + ieeeValues(-Infinity) + binary scan \x00\x00\x00\x00\x00\x00\xf0\xbf d \ + ieeeValues(-Normal) + binary scan \x00\x00\x00\x00\x00\x00\x08\x80 d \ + ieeeValues(-Subnormal) + binary scan \x00\x00\x00\x00\x00\x00\x00\x80 d \ + ieeeValues(-0) + binary scan \x00\x00\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(+0) + binary scan \x00\x00\x00\x00\x00\x00\x08\x00 d \ + ieeeValues(+Subnormal) + binary scan \x00\x00\x00\x00\x00\x00\xf0\x3f d \ + ieeeValues(+Normal) + binary scan \x00\x00\x00\x00\x00\x00\xf0\x7f d \ + ieeeValues(+Infinity) + binary scan \x00\x00\x00\x00\x00\x00\xf8\x7f d \ + ieeeValues(NaN) + set ieeeValues(littleEndian) 1 + return 1 + } + {-65 -16 0 0 0 0 0 0 63 -16 0 0 0 0 0 0} { + binary scan \xff\xf0\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(-Infinity) + binary scan \xbf\xf0\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(-Normal) + binary scan \x80\x08\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(-Subnormal) + binary scan \x80\x00\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(-0) + binary scan \x00\x00\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(+0) + binary scan \x00\x08\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(+Subnormal) + binary scan \x3f\xf0\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(+Normal) + binary scan \x7f\xf0\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(+Infinity) + binary scan \x7f\xf8\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(NaN) + set ieeeValues(littleEndian) 0 + return 1 + } + default { + return 0 + } + } +} +::tcltest::testConstraint ieeeFloatingPoint [testIEEE] + # First, test all of the integer operators individually. test expr-old-1.1 {integer operators} {expr -4} -4 @@ -91,7 +149,7 @@ test expr-old-1.53 {integer operators} { # automatic conversion to integers where needed. test expr-old-2.1 {floating-point operators} {expr -4.2} -4.2 -test expr-old-2.2 {floating-point operators} {expr -(1.1+4.2)} -5.3 +test expr-old-2.2 {floating-point operators} {expr -(1.125+4.25)} -5.375 test expr-old-2.3 {floating-point operators} {expr +5.7} 5.7 test expr-old-2.4 {floating-point operators} {expr +--+-62.0} -62.0 test expr-old-2.5 {floating-point operators} {expr !2.1} 0 @@ -428,7 +486,7 @@ test expr-old-25.15 {type conversions} {expr {24.1 > "24.1a"}} 0 test expr-old-25.16 {type conversions} {expr 2+2.5} 4.5 test expr-old-25.17 {type conversions} {expr 2+2.5} 4.5 test expr-old-25.18 {type conversions} {expr 2.0e2} 200.0 -test expr-old-25.19 {type conversions} {eformat} {expr 2.0e15} 2e+15 +test expr-old-25.19 {type conversions} {expr 2.0e15} 2000000000000000.0 test expr-old-25.20 {type conversions} {expr 10.0} 10.0 # Various error conditions. @@ -462,36 +520,39 @@ test expr-old-26.8 {error conditions} { test expr-old-26.9 {error conditions} { list [catch {expr 2%0} msg] $msg $errorCode } {1 {divide by zero} {ARITH DIVZERO {divide by zero}}} -test expr-old-26.10 {error conditions} { +test expr-old-26.10a {error conditions} !ieeeFloatingPoint { list [catch {expr 2.0/0.0} msg] $msg $errorCode } {1 {divide by zero} {ARITH DIVZERO {divide by zero}}} +test expr-old-26.10b {error conditions} ieeeFloatingPoint { + list [catch {expr 2.0/0.0} msg] $msg +} {0 Inf} test expr-old-26.11 {error conditions} { list [catch {expr 2#} msg] $msg } {1 {syntax error in expression "2#": extra tokens at end of expression}} -test expr-old-26.12 {error conditions} { +test expr-old-26.12 {error conditions} -body { list [catch {expr a.b} msg] $msg -} {1 {syntax error in expression "a.b": variable references require preceding $}} +} -match glob -result {1 {syntax error in expression "a.b": * preceding $*}} test expr-old-26.13 {error conditions} { list [catch {expr {"a"/"b"}} msg] $msg } {1 {can't use non-numeric string as operand of "/"}} test expr-old-26.14 {error conditions} { list [catch {expr 2:3} msg] $msg } {1 {syntax error in expression "2:3": extra tokens at end of expression}} -test expr-old-26.15 {error conditions} { +test expr-old-26.15 {error conditions} -body { list [catch {expr a@b} msg] $msg -} {1 {syntax error in expression "a@b": variable references require preceding $}} +} -match glob -result {1 {syntax error in expression "a@b": * preceding $*}} test expr-old-26.16 {error conditions} { list [catch {expr a[b} msg] $msg } {1 {missing close-bracket}} -test expr-old-26.17 {error conditions} { +test expr-old-26.17 {error conditions} -body { list [catch {expr a`b} msg] $msg -} {1 {syntax error in expression "a`b": variable references require preceding $}} +} -match glob -result {1 {syntax error in expression "a`b": * preceding $*}} test expr-old-26.18 {error conditions} { list [catch {expr \"a\"\{b} msg] $msg } {1 syntax\ error\ in\ expression\ \"\"a\"\{b\":\ extra\ tokens\ at\ end\ of\ expression} -test expr-old-26.19 {error conditions} { +test expr-old-26.19 {error conditions} -body { list [catch {expr a} msg] $msg -} {1 {syntax error in expression "a": variable references require preceding $}} +} -match glob -result {1 {syntax error in expression "a": * preceding $*}} test expr-old-26.20 {error conditions} { list [catch expr msg] $msg } {1 {wrong # args: should be "expr arg ?arg ...?"}} @@ -539,12 +600,12 @@ test expr-old-27.10 {cancelled evaluation} { set x -1.0 list [catch {expr {($x > 0) ? round(log($x)) : 0}} msg] $msg } {0 0} -test expr-old-27.11 {cancelled evaluation} { +test expr-old-27.11 {cancelled evaluation} -body { list [catch {expr {0 && foo}} msg] $msg -} {1 {syntax error in expression "0 && foo": variable references require preceding $}} -test expr-old-27.12 {cancelled evaluation} { +} -match glob -result {1 {syntax error in expression "0 && foo": * preceding $*}} +test expr-old-27.12 {cancelled evaluation} -body { list [catch {expr {0 ? 1 : foo}} msg] $msg -} {1 {syntax error in expression "0 ? 1 : foo": variable references require preceding $}} +} -match glob -result {1 {syntax error in expression "0 ? 1 : foo": * preceding $*}} # Tcl_ExprBool as used in "if" statements @@ -799,12 +860,12 @@ test expr-old-32.44 {math functions in expressions} testmathfunctions { test expr-old-32.45 {math functions in expressions} { expr (0 <= rand()) && (rand() < 1) } {1} -test expr-old-32.46 {math functions in expressions} { +test expr-old-32.46 {math functions in expressions} -body { list [catch {expr rand(24)} msg] $msg -} {1 {too many arguments for math function}} -test expr-old-32.47 {math functions in expressions} { +} -match glob -result {1 {too many arguments for math function*}} +test expr-old-32.47 {math functions in expressions} -body { list [catch {expr srand()} msg] $msg -} {1 {too few arguments for math function}} +} -match glob -result {1 {too few arguments for math function*}} test expr-old-32.48 {math functions in expressions} { list [catch {expr srand(3.79)} msg] $msg } {1 {can't use floating-point value as argument to srand}} @@ -841,15 +902,15 @@ test expr-old-33.4 {conversions and fancy args to math functions} { format %.6g [expr cos(acos(0.1))] } 0.1 -test expr-old-34.1 {errors in math functions} { +test expr-old-34.1 {errors in math functions} -body { list [catch {expr func_2(1.0)} msg] $msg -} {1 {unknown math function "func_2"}} -test expr-old-34.2 {errors in math functions} { +} -match glob -result {1 {* "*func_2"}} +test expr-old-34.2 {errors in math functions} -body { list [catch {expr func|(1.0)} msg] $msg -} {1 {syntax error in expression "func|(1.0)": variable references require preceding $}} +} -match glob -result {1 {syntax error in expression "func|(1.0)": * preceding $*}} test expr-old-34.3 {errors in math functions} { list [catch {expr {hypot("a b", 2.0)}} msg] $msg -} {1 {argument to math function didn't have numeric value}} +} {1 {expected floating-point number but got "a b"}} test expr-old-34.4 {errors in math functions} { list [catch {expr hypot(1.0 2.0)} msg] $msg } {1 {syntax error in expression "hypot(1.0 2.0)": missing close parenthesis at end of function call}} @@ -859,24 +920,30 @@ test expr-old-34.5 {errors in math functions} { test expr-old-34.6 {errors in math functions} { list [catch {expr hypot(1.0 ,} msg] $msg } {1 {syntax error in expression "hypot(1.0 ,": premature end of expression}} -test expr-old-34.7 {errors in math functions} { +test expr-old-34.7 {errors in math functions} -body { list [catch {expr hypot(1.0)} msg] $msg -} {1 {too few arguments for math function}} -test expr-old-34.8 {errors in math functions} { +} -match glob -result {1 {too few arguments for math function*}} +test expr-old-34.8 {errors in math functions} -body { list [catch {expr hypot(1.0, 2.0, 3.0)} msg] $msg -} {1 {too many arguments for math function}} +} -match glob -result {1 {too many arguments for math function*}} test expr-old-34.9 {errors in math functions} { list [catch {expr acos(-2.0)} msg] $msg $errorCode } {1 {domain error: argument not in valid range} {ARITH DOMAIN {domain error: argument not in valid range}}} test expr-old-34.10 {errors in math functions} {nonPortable} { list [catch {expr pow(-3, 1000001)} msg] $msg $errorCode } {1 {floating-point value too large to represent} {ARITH OVERFLOW {floating-point value too large to represent}}} -test expr-old-34.11 {errors in math functions} { +test expr-old-34.11a {errors in math functions} !ieeeFloatingPoint { list [catch {expr pow(3, 1000001)} msg] $msg $errorCode } {1 {floating-point value too large to represent} {ARITH OVERFLOW {floating-point value too large to represent}}} -test expr-old-34.12 {errors in math functions} { +test expr-old-34.11b {errors in math functions} ieeeFloatingPoint { + list [catch {expr pow(3, 1000001)} msg] $msg +} {0 Inf} +test expr-old-34.12a {errors in math functions} !ieeeFloatingPoint { list [catch {expr -14.0*exp(100000)} msg] $msg $errorCode } {1 {floating-point value too large to represent} {ARITH OVERFLOW {floating-point value too large to represent}}} +test expr-old-34.12b {errors in math functions} ieeeFloatingPoint { + list [catch {expr -14.0*exp(100000)} msg] $msg +} {0 -Inf} test expr-old-34.13 {errors in math functions} { list [catch {expr int(1.0e30)} msg] $msg $errorCode } {1 {integer value too large to represent} {ARITH IOVERFLOW {integer value too large to represent}}} @@ -889,9 +956,10 @@ test expr-old-34.15 {errors in math functions} { test expr-old-34.16 {errors in math functions} { list [catch {expr round(-1.0e30)} msg] $msg $errorCode } {1 {integer value too large to represent} {ARITH IOVERFLOW {integer value too large to represent}}} -test expr-old-34.17 {errors in math functions} testmathfunctions { - list [catch {expr T1(4)} msg] $msg -} {1 {too many arguments for math function}} +test expr-old-34.17 {errors in math functions} -constraints testmathfunctions \ + -body { + list [catch {expr T1(4)} msg] $msg + } -match glob -result {1 {too many arguments for math function*}} test expr-old-36.1 {ExprLooksLikeInt procedure} -body { expr 0289 diff --git a/tests/expr.test b/tests/expr.test index f7195af..5992421 100644 --- a/tests/expr.test +++ b/tests/expr.test @@ -10,7 +10,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: expr.test,v 1.31 2005/05/10 10:02:18 msofer Exp $ +# RCS: @(#) $Id: expr.test,v 1.32 2005/05/10 18:35:19 kennykb Exp $ if {[lsearch [namespace children] ::tcltest] == -1} { package require tcltest @@ -66,6 +66,64 @@ proc do_twelve_days {} { string length $xxx } +# Big test for correct ordering of data in [expr] + +proc testIEEE {} { + variable ieeeValues + binary scan [binary format dd -1.0 1.0] c* c + switch -exact -- $c { + {0 0 0 0 0 0 -16 -65 0 0 0 0 0 0 -16 63} { + # little endian + binary scan \x00\x00\x00\x00\x00\x00\xf0\xff d \ + ieeeValues(-Infinity) + binary scan \x00\x00\x00\x00\x00\x00\xf0\xbf d \ + ieeeValues(-Normal) + binary scan \x00\x00\x00\x00\x00\x00\x08\x80 d \ + ieeeValues(-Subnormal) + binary scan \x00\x00\x00\x00\x00\x00\x00\x80 d \ + ieeeValues(-0) + binary scan \x00\x00\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(+0) + binary scan \x00\x00\x00\x00\x00\x00\x08\x00 d \ + ieeeValues(+Subnormal) + binary scan \x00\x00\x00\x00\x00\x00\xf0\x3f d \ + ieeeValues(+Normal) + binary scan \x00\x00\x00\x00\x00\x00\xf0\x7f d \ + ieeeValues(+Infinity) + binary scan \x00\x00\x00\x00\x00\x00\xf8\x7f d \ + ieeeValues(NaN) + set ieeeValues(littleEndian) 1 + return 1 + } + {-65 -16 0 0 0 0 0 0 63 -16 0 0 0 0 0 0} { + binary scan \xff\xf0\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(-Infinity) + binary scan \xbf\xf0\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(-Normal) + binary scan \x80\x08\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(-Subnormal) + binary scan \x80\x00\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(-0) + binary scan \x00\x00\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(+0) + binary scan \x00\x08\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(+Subnormal) + binary scan \x3f\xf0\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(+Normal) + binary scan \x7f\xf0\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(+Infinity) + binary scan \x7f\xf8\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(NaN) + set ieeeValues(littleEndian) 0 + return 1 + } + default { + return 0 + } + } +} +::tcltest::testConstraint ieeeFloatingPoint [testIEEE] + # start of tests catch {unset a b i x} @@ -144,10 +202,10 @@ test expr-2.4 {TclCompileExpr: numeric expr string rep == formatted int rep} { } 1 test expr-3.1 {CompileCondExpr: just lor expr} {expr 3||0} 1 -test expr-3.2 {CompileCondExpr: error in lor expr} { +test expr-3.2 {CompileCondExpr: error in lor expr} -body { catch {expr x||3} msg set msg -} {syntax error in expression "x||3": variable references require preceding $} +} -match glob -result {syntax error in expression "x||3": * preceding $*} test expr-3.3 {CompileCondExpr: test true arm} {expr 3>2?44:66} 44 test expr-3.4 {CompileCondExpr: error compiling true arm} { catch {expr 3>2?2***3:66} msg @@ -170,10 +228,10 @@ test expr-3.8 {CompileCondExpr: long arms & nested cond exprs} {unix nonPortable catch {unset xxx} test expr-4.1 {CompileLorExpr: just land expr} {expr 1.3&&3.3} 1 -test expr-4.2 {CompileLorExpr: error in land expr} { +test expr-4.2 {CompileLorExpr: error in land expr} -body { catch {expr x&&3} msg set msg -} {syntax error in expression "x&&3": variable references require preceding $} +} -match glob -result {syntax error in expression "x&&3": *preceding $*} test expr-4.3 {CompileLorExpr: simple lor exprs} {expr 0||1.0} 1 test expr-4.4 {CompileLorExpr: simple lor exprs} {expr 3.0||0.0} 1 test expr-4.5 {CompileLorExpr: simple lor exprs} {expr 0||0||1} 1 @@ -195,10 +253,10 @@ test expr-4.9 {CompileLorExpr: long lor arm} { } 1 test expr-5.1 {CompileLandExpr: just bitor expr} {expr 7|0x13} 23 -test expr-5.2 {CompileLandExpr: error in bitor expr} { +test expr-5.2 {CompileLandExpr: error in bitor expr} -body { catch {expr x|3} msg set msg -} {syntax error in expression "x|3": variable references require preceding $} +} -match glob -result {syntax error in expression "x|3": * preceding $*} test expr-5.3 {CompileLandExpr: simple land exprs} {expr 0&&1.0} 0 test expr-5.4 {CompileLandExpr: simple land exprs} {expr 0&&0} 0 test expr-5.5 {CompileLandExpr: simple land exprs} {expr 3.0&&1.2} 1 @@ -221,10 +279,10 @@ test expr-5.10 {CompileLandExpr: long land arms} { } 1 test expr-6.1 {CompileBitXorExpr: just bitand expr} {expr 7&0x13} 3 -test expr-6.2 {CompileBitXorExpr: error in bitand expr} { +test expr-6.2 {CompileBitXorExpr: error in bitand expr} -body { catch {expr x|3} msg set msg -} {syntax error in expression "x|3": variable references require preceding $} +} -match glob -result {syntax error in expression "x|3": * preceding $*} test expr-6.3 {CompileBitXorExpr: simple bitxor exprs} {expr 7^0x13} 20 test expr-6.4 {CompileBitXorExpr: simple bitxor exprs} {expr 3^0x10} 19 test expr-6.5 {CompileBitXorExpr: simple bitxor exprs} {expr 0^7} 7 @@ -233,10 +291,10 @@ test expr-6.7 {CompileBitXorExpr: error compiling bitxor arm} { catch {expr 2***3|6} msg set msg } {syntax error in expression "2***3|6": unexpected operator *} -test expr-6.8 {CompileBitXorExpr: error compiling bitxor arm} { +test expr-6.8 {CompileBitXorExpr: error compiling bitxor arm} -body { catch {expr 2^x} msg set msg -} {syntax error in expression "2^x": variable references require preceding $} +} -match glob -result {syntax error in expression "2^x": * preceding $**} test expr-6.9 {CompileBitXorExpr: runtime error in bitxor arm} { list [catch {expr {24.0^3}} msg] $msg } {1 {can't use floating-point value as operand of "^"}} @@ -248,10 +306,10 @@ test expr-7.1 {CompileBitAndExpr: just equality expr} {expr 3==2} 0 test expr-7.2 {CompileBitAndExpr: just equality expr} {expr 2.0==2} 1 test expr-7.3 {CompileBitAndExpr: just equality expr} {expr 3.2!=2.2} 1 test expr-7.4 {CompileBitAndExpr: just equality expr} {expr {"abc" == "abd"}} 0 -test expr-7.5 {CompileBitAndExpr: error in equality expr} { +test expr-7.5 {CompileBitAndExpr: error in equality expr} -body { catch {expr x==3} msg set msg -} {syntax error in expression "x==3": variable references require preceding $} +} -match glob -result {syntax error in expression "x==3": * preceding $*} test expr-7.6 {CompileBitAndExpr: simple bitand exprs} {expr 7&0x13} 3 test expr-7.7 {CompileBitAndExpr: simple bitand exprs} {expr 0xf2&0x53} 82 test expr-7.8 {CompileBitAndExpr: simple bitand exprs} {expr 3&6} 2 @@ -260,10 +318,10 @@ test expr-7.10 {CompileBitAndExpr: error compiling bitand arm} { catch {expr 2***3&6} msg set msg } {syntax error in expression "2***3&6": unexpected operator *} -test expr-7.11 {CompileBitAndExpr: error compiling bitand arm} { +test expr-7.11 {CompileBitAndExpr: error compiling bitand arm} -body { catch {expr 2&x} msg set msg -} {syntax error in expression "2&x": variable references require preceding $} +} -match glob -result {syntax error in expression "2&x": * preceding $*} test expr-7.12 {CompileBitAndExpr: runtime error in bitand arm} { list [catch {expr {24.0&3}} msg] $msg } {1 {can't use floating-point value as operand of "&"}} @@ -272,19 +330,19 @@ test expr-7.13 {CompileBitAndExpr: runtime error in bitand arm} { } {1 {can't use non-numeric string as operand of "&"}} test expr-7.14 {CompileBitAndExpr: equality expr} {expr 3eq2} 0 test expr-7.18 {CompileBitAndExpr: equality expr} {expr {"abc" eq "abd"}} 0 -test expr-7.20 {CompileBitAndExpr: error in equality expr} { +test expr-7.20 {CompileBitAndExpr: error in equality expr} -body { catch {expr xne3} msg set msg -} {syntax error in expression "xne3": variable references require preceding $} +} -match glob -result {syntax error in expression "xne3": * preceding $*} test expr-8.1 {CompileEqualityExpr: just relational expr} {expr 3>=2} 1 test expr-8.2 {CompileEqualityExpr: just relational expr} {expr 2<=2.1} 1 test expr-8.3 {CompileEqualityExpr: just relational expr} {expr 3.2>"2.2"} 1 test expr-8.4 {CompileEqualityExpr: just relational expr} {expr {"0y"<"0x12"}} 0 -test expr-8.5 {CompileEqualityExpr: error in relational expr} { +test expr-8.5 {CompileEqualityExpr: error in relational expr} -body { catch {expr x>3} msg set msg -} {syntax error in expression "x>3": variable references require preceding $} +} -match glob -result {syntax error in expression "x>3": * preceding $*} test expr-8.6 {CompileEqualityExpr: simple equality exprs} {expr 7==0x13} 0 test expr-8.7 {CompileEqualityExpr: simple equality exprs} {expr -0xf2!=0x53} 1 test expr-8.8 {CompileEqualityExpr: simple equality exprs} {expr {"12398712938788234-1298379" != ""}} 1 @@ -293,10 +351,10 @@ test expr-8.10 {CompileEqualityExpr: error compiling equality arm} { catch {expr 2***3==6} msg set msg } {syntax error in expression "2***3==6": unexpected operator *} -test expr-8.11 {CompileEqualityExpr: error compiling equality arm} { +test expr-8.11 {CompileEqualityExpr: error compiling equality arm} -body { catch {expr 2!=x} msg set msg -} {syntax error in expression "2!=x": variable references require preceding $} +} -match glob -result {syntax error in expression "2!=x": * preceding $*} test expr-8.12 {CompileBitAndExpr: equality expr} {expr {"a"eq"a"}} 1 test expr-8.13 {CompileBitAndExpr: equality expr} {expr {"\374" eq "ü"}} 1 test expr-8.14 {CompileBitAndExpr: equality expr} {expr 3eq2} 0 @@ -305,15 +363,15 @@ test expr-8.16 {CompileBitAndExpr: equality expr} {expr 3.2ne2.2} 1 test expr-8.17 {CompileBitAndExpr: equality expr} {expr 01eq1} 0 test expr-8.18 {CompileBitAndExpr: equality expr} {expr {"abc" eq "abd"}} 0 test expr-8.19 {CompileBitAndExpr: equality expr} {expr {"abc" ne "abd"}} 1 -test expr-8.20 {CompileBitAndExpr: error in equality expr} { +test expr-8.20 {CompileBitAndExpr: error in equality expr} -body { catch {expr x ne3} msg set msg -} {syntax error in expression "x ne3": variable references require preceding $} -test expr-8.21 {CompileBitAndExpr: error in equality expr} { +} -match glob -result {syntax error in expression "x ne3": * preceding $*} +test expr-8.21 {CompileBitAndExpr: error in equality expr} -body { # These should be ""ed to avoid the error catch {expr a eq b} msg set msg -} {syntax error in expression "a eq b": variable references require preceding $} +} -match glob -result {syntax error in expression "a eq b": * preceding $*} test expr-8.22 {CompileBitAndExpr: error in equality expr} { catch {expr {false eqfalse}} msg set msg @@ -340,39 +398,39 @@ if {0x80000000 > 0} { expr {1<<31} } -2147483648 } -test expr-9.6 {CompileRelationalExpr: error in shift expr} { +test expr-9.6 {CompileRelationalExpr: error in shift expr} -body { catch {expr x>>3} msg set msg -} {syntax error in expression "x>>3": variable references require preceding $} +} -match glob -result {syntax error in expression "x>>3": * preceding $*} test expr-9.7 {CompileRelationalExpr: simple relational exprs} {expr 0xff>=+0x3} 1 test expr-9.8 {CompileRelationalExpr: simple relational exprs} {expr -0xf2<0x3} 1 test expr-9.9 {CompileRelationalExpr: error compiling relational arm} { catch {expr 2***3>6} msg set msg } {syntax error in expression "2***3>6": unexpected operator *} -test expr-9.10 {CompileRelationalExpr: error compiling relational arm} { +test expr-9.10 {CompileRelationalExpr: error compiling relational arm} -body { catch {expr 2<x} msg set msg -} {syntax error in expression "2<x": variable references require preceding $} +} -match glob -result {syntax error in expression "2<x": * preceding $*} test expr-10.1 {CompileShiftExpr: just add expr} {expr 4+-2} 2 test expr-10.2 {CompileShiftExpr: just add expr} {expr 0xff-2} 253 test expr-10.3 {CompileShiftExpr: just add expr} {expr -1--2} 1 test expr-10.4 {CompileShiftExpr: just add expr} {expr 1-0123} -82 -test expr-10.5 {CompileShiftExpr: error in add expr} { +test expr-10.5 {CompileShiftExpr: error in add expr} -body { catch {expr x+3} msg set msg -} {syntax error in expression "x+3": variable references require preceding $} +} -match glob -result {syntax error in expression "x+3": * preceding $*} test expr-10.6 {CompileShiftExpr: simple shift exprs} {expr 0xff>>0x3} 31 test expr-10.7 {CompileShiftExpr: simple shift exprs} {expr -0xf2<<0x3} -1936 test expr-10.8 {CompileShiftExpr: error compiling shift arm} { catch {expr 2***3>>6} msg set msg } {syntax error in expression "2***3>>6": unexpected operator *} -test expr-10.9 {CompileShiftExpr: error compiling shift arm} { +test expr-10.9 {CompileShiftExpr: error compiling shift arm} -body { catch {expr 2<<x} msg set msg -} {syntax error in expression "2<<x": variable references require preceding $} +} -match glob -result {syntax error in expression "2<<x": * preceding $*} test expr-10.10 {CompileShiftExpr: runtime error} { list [catch {expr {24.0>>43}} msg] $msg } {1 {can't use floating-point value as operand of ">>"}} @@ -384,20 +442,20 @@ test expr-11.1 {CompileAddExpr: just multiply expr} {expr 4*-2} -8 test expr-11.2 {CompileAddExpr: just multiply expr} {expr 0xff%2} 1 test expr-11.3 {CompileAddExpr: just multiply expr} {expr -1/2} -1 test expr-11.4 {CompileAddExpr: just multiply expr} {expr 7891%0123} 6 -test expr-11.5 {CompileAddExpr: error in multiply expr} { +test expr-11.5 {CompileAddExpr: error in multiply expr} -body { catch {expr x*3} msg set msg -} {syntax error in expression "x*3": variable references require preceding $} +} -match glob -result {syntax error in expression "x*3": * preceding $*} test expr-11.6 {CompileAddExpr: simple add exprs} {expr 0xff++0x3} 258 test expr-11.7 {CompileAddExpr: simple add exprs} {expr -0xf2--0x3} -239 test expr-11.8 {CompileAddExpr: error compiling add arm} { catch {expr 2***3+6} msg set msg } {syntax error in expression "2***3+6": unexpected operator *} -test expr-11.9 {CompileAddExpr: error compiling add arm} { +test expr-11.9 {CompileAddExpr: error compiling add arm} -body { catch {expr 2-x} msg set msg -} {syntax error in expression "2-x": variable references require preceding $} +} -match glob -result {syntax error in expression "2-x": * preceding $*} test expr-11.10 {CompileAddExpr: runtime error} { list [catch {expr {24.0+"xx"}} msg] $msg } {1 {can't use non-numeric string as operand of "+"}} @@ -407,28 +465,31 @@ test expr-11.11 {CompileAddExpr: runtime error} { test expr-11.12 {CompileAddExpr: runtime error} { list [catch {expr {3/0}} msg] $msg } {1 {divide by zero}} -test expr-11.13 {CompileAddExpr: runtime error} { +test expr-11.13a {CompileAddExpr: runtime error} !ieeeFloatingPoint { list [catch {expr {2.3/0.0}} msg] $msg } {1 {divide by zero}} +test expr-11.13b {CompileAddExpr: runtime error} ieeeFloatingPoint { + list [catch {expr {2.3/0.0}} msg] $msg +} {0 Inf} test expr-12.1 {CompileMultiplyExpr: just unary expr} {expr ~4} -5 test expr-12.2 {CompileMultiplyExpr: just unary expr} {expr --5} 5 test expr-12.3 {CompileMultiplyExpr: just unary expr} {expr !27} 0 test expr-12.4 {CompileMultiplyExpr: just unary expr} {expr ~0xff00ff} -16711936 -test expr-12.5 {CompileMultiplyExpr: error in unary expr} { +test expr-12.5 {CompileMultiplyExpr: error in unary expr} -body { catch {expr ~x} msg set msg -} {syntax error in expression "~x": variable references require preceding $} +} -match glob -result {syntax error in expression "~x": * preceding $*} test expr-12.6 {CompileMultiplyExpr: simple multiply exprs} {expr 0xff*0x3} 765 test expr-12.7 {CompileMultiplyExpr: simple multiply exprs} {expr -0xf2%-0x3} -2 test expr-12.8 {CompileMultiplyExpr: error compiling multiply arm} { catch {expr 2*3%%6} msg set msg } {syntax error in expression "2*3%%6": unexpected operator %} -test expr-12.9 {CompileMultiplyExpr: error compiling multiply arm} { +test expr-12.9 {CompileMultiplyExpr: error compiling multiply arm} -body { catch {expr 2*x} msg set msg -} {syntax error in expression "2*x": variable references require preceding $} +} -match glob -result {syntax error in expression "2*x": * preceding $*} test expr-12.10 {CompileMultiplyExpr: runtime error} { list [catch {expr {24.0*"xx"}} msg] $msg } {1 {can't use non-numeric string as operand of "*"}} @@ -443,10 +504,10 @@ test expr-13.4 {CompileUnaryExpr: unary exprs} {expr !2} 0 test expr-13.5 {CompileUnaryExpr: unary exprs} {expr +--+-62.0} -62.0 test expr-13.6 {CompileUnaryExpr: unary exprs} {expr !0.0} 1 test expr-13.7 {CompileUnaryExpr: unary exprs} {expr !0xef} 0 -test expr-13.8 {CompileUnaryExpr: error compiling unary expr} { +test expr-13.8 {CompileUnaryExpr: error compiling unary expr} -body { catch {expr ~x} msg set msg -} {syntax error in expression "~x": variable references require preceding $} +} -match glob -result {syntax error in expression "~x": * preceding $*} test expr-13.9 {CompileUnaryExpr: error compiling unary expr} { catch {expr !1.x} msg set msg @@ -565,7 +626,7 @@ test expr-14.26 {CompilePrimaryExpr: math function primary} { test expr-14.27 {CompilePrimaryExpr: error in math function primary} -body { catch {expr sinh::(2.0)} msg set errorInfo -} -match glob -result {syntax error in expression "sinh::(2.0)": expected parenthesis enclosing function arguments +} -match glob -result {syntax error in expression "sinh::(2.0)": * function arguments* while *ing "expr sinh::(2.0)"} test expr-14.28 {CompilePrimaryExpr: subexpression primary} { @@ -597,31 +658,31 @@ test expr-14.32 {CompilePrimaryExpr: unexpected token} -body { test expr-15.1 {CompileMathFuncCall: missing parenthesis} -body { catch {expr sinh2.0)} msg set errorInfo -} -match glob -result {syntax error in expression "sinh2.0)": variable references require preceding $ +} -match glob -result {syntax error in expression "sinh2.0)": * preceding $* while *ing "expr sinh2.0)"} test expr-15.2 {CompileMathFuncCall: unknown math function} -body { catch {expr whazzathuh(1)} msg set errorInfo -} -match glob -result {unknown math function "whazzathuh" +} -match glob -result {* "*whazzathuh" while *ing "expr whazzathuh(1)"} test expr-15.3 {CompileMathFuncCall: too many arguments} -body { catch {expr sin(1,2,3)} msg set errorInfo -} -match glob -result {too many arguments for math function +} -match glob -result {too many arguments for math function* while *ing "expr sin(1,2,3)"} test expr-15.4 {CompileMathFuncCall: ')' found before last required arg} -body { catch {expr sin()} msg set errorInfo -} -match glob -result {too few arguments for math function +} -match glob -result {too few arguments for math function* while *ing "expr sin()"} test expr-15.5 {CompileMathFuncCall: too few arguments} -body { catch {expr pow(1)} msg set errorInfo -} -match glob -result {too few arguments for math function +} -match glob -result {too few arguments for math function* while *ing "expr pow(1)"} test expr-15.6 {CompileMathFuncCall: missing ')'} -body { @@ -820,19 +881,19 @@ test expr-23.1 {CompileExponentialExpr: just exponential expr} {expr 4**2} 16 test expr-23.2 {CompileExponentialExpr: just exponential expr} {expr 0xff**2} 65025 test expr-23.3 {CompileExponentialExpr: just exponential expr} {expr -1**2} 1 test expr-23.4 {CompileExponentialExpr: just exponential expr} {expr 18**07} 612220032 -test expr-23.5 {CompileExponentialExpr: error in exponential expr} { +test expr-23.5 {CompileExponentialExpr: error in exponential expr} -body { catch {expr x**3} msg set msg -} {syntax error in expression "x**3": variable references require preceding $} +} -match glob -result {syntax error in expression "x**3": * preceding $*} test expr-23.6 {CompileExponentialExpr: simple expo exprs} {expr 0xff**0x3} 16581375 test expr-23.7 {CompileExponentialExpr: error compiling expo arm} { catch {expr (-3-)**6} msg set msg } {syntax error in expression "(-3-)**6": unexpected close parenthesis} -test expr-23.8 {CompileExponentialExpr: error compiling expo arm} { +test expr-23.8 {CompileExponentialExpr: error compiling expo arm} -body { catch {expr 2**x} msg set msg -} {syntax error in expression "2**x": variable references require preceding $} +} -match glob -result {syntax error in expression "2**x": * preceding $*} test expr-23.9 {CompileExponentialExpr: runtime error} { list [catch {expr {24.0**"xx"}} msg] $msg } {1 {can't use non-numeric string as operand of "**"}} @@ -900,9 +961,4233 @@ test expr-26.5 {'ni' operator} {expr {"" ni {a b c ""}}} 0 test expr-26.6 {'ni' operator} {expr {"" ni "a b c"}} 1 test expr-26.7 {'ni' operator} {expr {"" ni ""}} 1 +foreach op {< <= == != > >=} { + proc test$op {a b} [list expr "\$a $op \$b"] + +} + +test expr-27.1 {expr - correct ordering - not compiled} ieeeFloatingPoint { + set problems {} + # Ordering should be: -Infinity < -Normal < Subnormal < -0 + # < +0 < +Subnormal < +Normal < +Infinity + # with equality within each class. + set names { + -Infinity -Normal -Subnormal -0 +0 +Subnormal +Normal +Infinity + } + set weights { + -3 -2 -1 0 0 1 2 3 + } + foreach name1 $names weight1 $weights { + foreach name2 $names weight2 $weights { + foreach op {< <= == != >= >} { + set shouldBe [expr "$weight1 $op $weight2"] + set is [expr "\$ieeeValues($name1) $op \$ieeeValues($name2)"] + if { $is != $shouldBe } { + append problems $name1 { } $op { } $name2 \ + ":result is " $is ", should be $shouldBe" \n + } + } + } + } + set problems +} {} + +test expr-27.2 {expr - correct ordering - compiled} ieeeFloatingPoint { + set problems {} + # Ordering should be: -Infinity < -Normal < Subnormal < -0 + # < +0 < +Subnormal < +Normal < +Infinity + # with equality within each class. + set names { + -Infinity -Normal -Subnormal -0 +0 +Subnormal +Normal +Infinity + } + set weights { + -3 -2 -1 0 0 1 2 3 + } + foreach name1 $names weight1 $weights { + foreach name2 $names weight2 $weights { + foreach op {< <= == != >= >} { + set shouldBe [expr "$weight1 $op $weight2"] + set is [test$op $ieeeValues($name1) $ieeeValues($name2)] + if { $is != $shouldBe } { + append problems $name1 { } $op { } $name2 \ + ":result is " $is ", should be $shouldBe" \n + } + } + } + } + set problems +} {} + +test expr-27.3 {expr - NaN is unordered - not compiled} { + set problems {} + set names { + -Infinity -Normal -Subnormal -0 +0 +Subnormal +Normal +Infinity NaN + } + foreach name1 $names { + foreach op {< <= == != >= >} sb {0 0 0 1 0 0} { + if "(\$ieeeValues($name1) $op \$ieeeValues(NaN)) != $sb " { + append problems $name1 { } $op { } NaN \ + ": result is 1, should be $sb" \n + } + if "(\$ieeeValues(NaN) $op \$ieeeValues($name1)) != $sb" { + append problems NaN { } $op { } $name1 \ + ": result is 1, should be $sb" \n + } + } + } + set problems +} {} + +test expr-27.4 {expr - NaN is unordered - compiled} { + set problems {} + set names { + -Infinity -Normal -Subnormal -0 +0 +Subnormal +Normal +Infinity NaN + } + foreach name1 $names { + foreach op {< <= == != >= >} sb {0 0 0 1 0 0} { + if { [test$op $ieeeValues($name1) $ieeeValues(NaN)] != $sb } { + append problems $ieeeValues($name1) { } $op { } $ieeeValues(NaN) \ + ": result is 1, should be $sb" \n + } + if { [test$op $ieeeValues(NaN) $ieeeValues($name1)] != $sb } { + append problems NaN { } $op { } $ieeeValues($name1) \ + ": result is 1, should be $sb" \n + } + } + } + set problems +} {} + +proc convertToDouble { x } { + variable ieeeValues + binary scan [binary format d $x] c* bytes + set result 0x + if { $ieeeValues(littleEndian) } { + for { set i 7 } { $i >= 0 } { incr i -1 } { + append result [format %02x [expr { [lindex $bytes $i] & 0xff }]] + } + } else { + foreach byte $bytes { + append result [format %02x [expr { $byte & 0xff }]] + } + } + return $result +} + +test expr-28.1 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d ALL 0 E0 OK 00000000000000 E-1023 + convertToDouble 0E0 +} 0x0000000000000000 +test expr-28.2 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d ALL -0 E0 OK -0000000000000 E-1023 + convertToDouble -0E0 +} 0x8000000000000000 +test expr-28.3 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d ALL 1 E0 OK 10000000000000 E0 + convertToDouble 1E0 +} 0x3ff0000000000000 +test expr-28.4 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d ALL 15 E-1 OK 18000000000000 E0 + convertToDouble 15E-1 +} 0x3ff8000000000000 +test expr-28.5 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d ALL 125 E-2 OK 14000000000000 E0 + convertToDouble 125E-2 +} 0x3ff4000000000000 +test expr-28.6 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d ALL 1125 E-3 OK 12000000000000 E0 + convertToDouble 1125E-3 +} 0x3ff2000000000000 +test expr-28.7 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d ALL 10625 E-4 OK 11000000000000 E0 + convertToDouble 10625E-4 +} 0x3ff1000000000000 +test expr-28.8 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d ALL 103125 E-5 OK 10800000000000 E0 + convertToDouble 103125E-5 +} 0x3ff0800000000000 +test expr-28.9 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d ALL 1015625 E-6 OK 10400000000000 E0 + convertToDouble 1015625E-6 +} 0x3ff0400000000000 +test expr-28.10 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d ALL 10078125 E-7 OK 10200000000000 E0 + convertToDouble 10078125E-7 +} 0x3ff0200000000000 +test expr-28.11 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d ALL 100390625 E-8 OK 10100000000000 E0 + convertToDouble 100390625E-8 +} 0x3ff0100000000000 +test expr-28.12 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee ALL 1001953125 E-9 OK 10080000000000 E0 + convertToDouble 1001953125E-9 +} 0x3ff0080000000000 +test expr-28.13 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee ALL 10009765625 E-10 OK 10040000000000 E0 + convertToDouble 10009765625E-10 +} 0x3ff0040000000000 +test expr-28.14 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee ALL 100048828125 E-11 OK 10020000000000 E0 + convertToDouble 100048828125E-11 +} 0x3ff0020000000000 +test expr-28.15 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee ALL 1000244140625 E-12 OK 10010000000000 E0 + convertToDouble 1000244140625E-12 +} 0x3ff0010000000000 +test expr-28.16 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee ALL 10001220703125 E-13 OK 10008000000000 E0 + convertToDouble 10001220703125E-13 +} 0x3ff0008000000000 +test expr-28.17 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee ALL 100006103515625 E-14 OK 10004000000000 E0 + convertToDouble 100006103515625E-14 +} 0x3ff0004000000000 +test expr-28.18 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee ALL 1000030517578125 E-15 OK 10002000000000 E0 + convertToDouble 1000030517578125E-15 +} 0x3ff0002000000000 +test expr-28.19 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee ALL 10000152587890625 E-16 OK 10001000000000 E0 + convertToDouble 10000152587890625E-16 +} 0x3ff0001000000000 +test expr-28.20 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +8 E153 x 1317e5ef3ab327_0000000001& E511 + convertToDouble +8E153 +} 0x5fe317e5ef3ab327 +test expr-28.21 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -1 E153 x -1317e5ef3ab327_0000000001& E508 + convertToDouble -1E153 +} 0xdfb317e5ef3ab327 +test expr-28.22 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +9 E306 x 19a2028368022e_00000000001& E1019 + convertToDouble +9E306 +} 0x7fa9a2028368022e +test expr-28.23 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -2 E153 x -1317e5ef3ab327_0000000001& E509 + convertToDouble -2E153 +} 0xdfc317e5ef3ab327 +test expr-28.24 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +7 E-304 x 1eb8e84fa0b278_00000000001& E-1008 + convertToDouble +7E-304 +} 0x00feb8e84fa0b278 +test expr-28.25 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -3 E-49 x -1c0f92a6276c9d_000000001& E-162 + convertToDouble -3E-49 +} 0xb5dc0f92a6276c9d +test expr-28.26 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +7 E-303 x 13339131c46f8b_00000000001& E-1004 + convertToDouble +7E-303 +} 0x0133339131c46f8b +test expr-28.27 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -6 E-49 x -1c0f92a6276c9d_000000001& E-161 + convertToDouble -6E-49 +} 0xb5ec0f92a6276c9d +test expr-28.28 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +9 E43 x 102498ea6df0c3_11111111110& E146 + convertToDouble +9E43 +} 0x49102498ea6df0c4 +test expr-28.29 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -9 E44 x -142dbf25096cf4_1111111110& E149 + convertToDouble -9E44 +} 0xc9442dbf25096cf5 +test expr-28.30 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +8 E303 x 1754e31cd072d9_1111111110& E1009 + convertToDouble +8E303 +} 0x7f0754e31cd072da +test expr-28.31 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -1 E303 x -1754e31cd072d9_1111111110& E1006 + convertToDouble -1E303 +} 0xfed754e31cd072da +test expr-28.32 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +7 E-287 x 1551603777f798_111111110& E-951 + convertToDouble +7E-287 +} 0x048551603777f799 +test expr-28.33 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -2 E-204 x -1410d9f9b2f7f2_11111110& E-677 + convertToDouble -2E-204 +} 0x95a410d9f9b2f7f3 +test expr-28.34 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +2 E-205 x 100d7b2e28c65b_11111110& E-680 + convertToDouble +2E-205 +} 0x15700d7b2e28c65c +test expr-28.35 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -9 E-47 x -10711fed5b19a3_11111110& E-153 + convertToDouble -9E-47 +} 0xb660711fed5b19a4 +test expr-28.36 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +34 E195 x 1d1c26db7d0dae_000000000001& E652 + convertToDouble +34E195 +} 0x68bd1c26db7d0dae +test expr-28.37 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -68 E195 x -1d1c26db7d0dae_000000000001& E653 + convertToDouble -68E195 +} 0xe8cd1c26db7d0dae +test expr-28.38 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +85 E194 x 1d1c26db7d0dae_000000000001& E650 + convertToDouble +85E194 +} 0x689d1c26db7d0dae +test expr-28.39 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -67 E97 x -139ac1ce2cc95f_000000000001& E328 + convertToDouble -67E97 +} 0xd4739ac1ce2cc95f +test expr-28.40 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +93 E-234 x 127b2e4f210075_0000000000000001& E-771 + convertToDouble +93E-234 +} 0x0fc27b2e4f210075 +test expr-28.41 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -19 E-87 x -12e5f5dfa4fe9d_00000000000001& E-285 + convertToDouble -19E-87 +} 0xae22e5f5dfa4fe9d +test expr-28.42 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +38 E-87 x 12e5f5dfa4fe9d_00000000000001& E-284 + convertToDouble +38E-87 +} 0x2e32e5f5dfa4fe9d +test expr-28.43 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -38 E-88 x -1e3cbc9907fdc8_00000000000001& E-288 + convertToDouble -38E-88 +} 0xadfe3cbc9907fdc8 +test expr-28.44 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -69 E220 x -1e8aa8823a5db3_11111111110& E736 + convertToDouble -69E220 +} 0xedfe8aa8823a5db4 +test expr-28.45 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +18 E43 x 102498ea6df0c3_11111111110& E147 + convertToDouble +18E43 +} 0x49202498ea6df0c4 +test expr-28.46 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -36 E43 x -102498ea6df0c3_11111111110& E148 + convertToDouble -36E43 +} 0xc9302498ea6df0c4 +test expr-28.47 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +61 E-99 x 10ad836f269a16_11111111111110& E-323 + convertToDouble +61E-99 +} 0x2bc0ad836f269a17 +test expr-28.48 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -43 E-92 x -1c0794d9d40e95_111111111111110& E-301 + convertToDouble -43E-92 +} 0xad2c0794d9d40e96 +test expr-28.49 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +86 E-92 x 1c0794d9d40e95_111111111111110& E-300 + convertToDouble +86E-92 +} 0x2d3c0794d9d40e96 +test expr-28.50 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -51 E-74 x -1cd5bee57763e5_1111111111111110& E-241 + convertToDouble -51E-74 +} 0xb0ecd5bee57763e6 +test expr-28.51 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +283 E85 x 16c309024bab4b_00000000000000001& E290 + convertToDouble +283E85 +} 0x5216c309024bab4b +test expr-28.52 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -566 E85 x -16c309024bab4b_00000000000000001& E291 + convertToDouble -566E85 +} 0xd226c309024bab4b +test expr-28.53 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +589 E187 x 1526be9c22eb17_00000000000000001& E630 + convertToDouble +589E187 +} 0x675526be9c22eb17 +test expr-28.54 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -839 E143 x -1ae03f245703e2_000000000000001& E484 + convertToDouble -839E143 +} 0xde3ae03f245703e2 +test expr-28.55 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -744 E-234 x -127b2e4f210075_0000000000000001& E-768 + convertToDouble -744E-234 +} 0x8ff27b2e4f210075 +test expr-28.56 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +930 E-235 x 127b2e4f210075_0000000000000001& E-771 + convertToDouble +930E-235 +} 0x0fc27b2e4f210075 +test expr-28.57 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -186 E-234 x -127b2e4f210075_0000000000000001& E-770 + convertToDouble -186E-234 +} 0x8fd27b2e4f210075 +test expr-28.58 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +604 E175 x 17d93193f78fc5_1111111111111111110& E590 + convertToDouble +604E175 +} 0x64d7d93193f78fc6 +test expr-28.59 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -302 E175 x -17d93193f78fc5_1111111111111111110& E589 + convertToDouble -302E175 +} 0xe4c7d93193f78fc6 +test expr-28.60 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +755 E174 x 17d93193f78fc5_1111111111111111110& E587 + convertToDouble +755E174 +} 0x64a7d93193f78fc6 +test expr-28.61 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -151 E175 x -17d93193f78fc5_1111111111111111110& E588 + convertToDouble -151E175 +} 0xe4b7d93193f78fc6 +test expr-28.62 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +662 E-213 x 1bdb90e62a8cbc_1111111111111110& E-699 + convertToDouble +662E-213 +} 0x144bdb90e62a8cbd +test expr-28.63 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -408 E-74 x -1cd5bee57763e5_1111111111111110& E-238 + convertToDouble -408E-74 +} 0xb11cd5bee57763e6 +test expr-28.64 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +510 E-75 x 1cd5bee57763e5_1111111111111110& E-241 + convertToDouble +510E-75 +} 0x30ecd5bee57763e6 +test expr-28.65 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +6782 E55 x 159bd3ad46e346_0000000000000000001& E195 + convertToDouble +6782E55 +} 0x4c259bd3ad46e346 +test expr-28.66 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -2309 E92 x -1bac6f7d64d119_000000000000000001& E316 + convertToDouble -2309E92 +} 0xd3bbac6f7d64d119 +test expr-28.67 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +7963 E34 x 1df4170f0fdecc_00000000000000000001& E125 + convertToDouble +7963E34 +} 0x47cdf4170f0fdecc +test expr-28.68 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -3391 E55 x -159bd3ad46e346_0000000000000000001& E194 + convertToDouble -3391E55 +} 0xcc159bd3ad46e346 +test expr-28.69 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +7903 E-96 x 107c2d27a5b989_0000000000000000001& E-306 + convertToDouble +7903E-96 +} 0x2cd07c2d27a5b989 +test expr-28.70 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -7611 E-226 x -119b8744033457_0000000000000000001& E-738 + convertToDouble -7611E-226 +} 0x91d19b8744033457 +test expr-28.71 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +4907 E-196 x 11e90a8711440f_000000000000000001& E-639 + convertToDouble +4907E-196 +} 0x1801e90a8711440f +test expr-28.72 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -5547 E-311 x -13f190452a29f4_000000000000000001& E-1021 + convertToDouble -5547E-311 +} 0x8023f190452a29f4 +test expr-28.73 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +5311 E241 x 1f1ce3c887c25f_11111111111111111110& E812 + convertToDouble +5311E241 +} 0x72bf1ce3c887c260 +test expr-28.74 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -5311 E243 x -184e91f4aa0fda_11111111111111111110& E819 + convertToDouble -5311E243 +} 0xf3284e91f4aa0fdb +test expr-28.75 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +5311 E242 x 13720e5d54d97b_11111111111111111110& E816 + convertToDouble +5311E242 +} 0x72f3720e5d54d97c +test expr-28.76 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +9269 E-45 x 19d69455a53bd8_111111111111111111110& E-137 + convertToDouble +9269E-45 +} 0x3769d69455a53bd9 +test expr-28.77 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -8559 E-289 x -104a81d35952fe_11111111111111111110& E-947 + convertToDouble -8559E-289 +} 0x84c04a81d35952ff +test expr-28.78 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +8699 E-276 x 12d2df246ecd2c_1111111111111111111110& E-904 + convertToDouble +8699E-276 +} 0x0772d2df246ecd2d +test expr-28.79 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -8085 E-64 x -14c98fce16152d_1111111111111111110& E-200 + convertToDouble -8085E-64 +} 0xb374c98fce16152e +test expr-28.80 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +74819 E201 x 1dd455061eb3f1_0000000000000000000001& E683 + convertToDouble +74819E201 +} 0x6aadd455061eb3f1 +test expr-28.81 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -82081 E41 x -170105df3d47cb_000000000000000000000000001& E152 + convertToDouble -82081E41 +} 0xc9770105df3d47cb +test expr-28.82 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +51881 E37 x 17d2950dc76da4_000000000000000000001& E138 + convertToDouble +51881E37 +} 0x4897d2950dc76da4 +test expr-28.83 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -55061 E157 x -1394fc0f33536c_000000000000000000001& E537 + convertToDouble -55061E157 +} 0xe18394fc0f33536c +test expr-28.84 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +77402 E-215 x 10492a4a8a37fd_0000000000000000000000001& E-698 + convertToDouble +77402E-215 +} 0x1450492a4a8a37fd +test expr-28.85 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -33891 E-92 x -1592f9932c06bd_00000000000000000000001& E-291 + convertToDouble -33891E-92 +} 0xadc592f9932c06bd +test expr-28.86 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +38701 E-215 x 10492a4a8a37fd_0000000000000000000000001& E-699 + convertToDouble +38701E-215 +} 0x1440492a4a8a37fd +test expr-28.87 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -82139 E-76 x -1d0681489839d5_00000000000000000000001& E-237 + convertToDouble -82139E-76 +} 0xb12d0681489839d5 +test expr-28.88 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +75859 E25 x 132645e1ba93ef_11111111111111111111110& E99 + convertToDouble +75859E25 +} 0x46232645e1ba93f0 +test expr-28.89 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +89509 E140 x 16f02bee68670c_1111111111111111111110& E481 + convertToDouble +89509E140 +} 0x5e06f02bee68670d +test expr-28.90 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -57533 E287 x -1272ed2307f569_1111111111111111111110& E969 + convertToDouble -57533E287 +} 0xfc8272ed2307f56a +test expr-28.91 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +46073 E-32 x 12405b773fbdf2_11111111111111111111110& E-91 + convertToDouble +46073E-32 +} 0x3a42405b773fbdf3 +test expr-28.92 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -92146 E-32 x -12405b773fbdf2_11111111111111111111110& E-90 + convertToDouble -92146E-32 +} 0xba52405b773fbdf3 +test expr-28.93 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +83771 E-74 x 17206bfc4ccabd_11111111111111111111110& E-230 + convertToDouble +83771E-74 +} 0x3197206bfc4ccabe +test expr-28.94 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -34796 E-276 x -12d2df246ecd2c_1111111111111111111110& E-902 + convertToDouble -34796E-276 +} 0x8792d2df246ecd2d +test expr-28.95 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +584169 E229 x 1d657059dc79aa_00000000000000000000000000001& E779 + convertToDouble +584169E229 +} 0x70ad657059dc79aa +test expr-28.96 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +164162 E41 x 170105df3d47cb_000000000000000000000000001& E153 + convertToDouble +164162E41 +} 0x49870105df3d47cb +test expr-28.97 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -328324 E41 x -170105df3d47cb_000000000000000000000000001& E154 + convertToDouble -328324E41 +} 0xc9970105df3d47cb +test expr-28.98 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +209901 E-11 x 119b96f36ec68b_00000000000000000000000001& E-19 + convertToDouble +209901E-11 +} 0x3ec19b96f36ec68b +test expr-28.99 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -419802 E-11 x -119b96f36ec68b_00000000000000000000000001& E-18 + convertToDouble -419802E-11 +} 0xbed19b96f36ec68b +test expr-28.100 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +940189 E-112 x 1b99d6240c1a28_00000000000000000000000001& E-353 + convertToDouble +940189E-112 +} 0x29eb99d6240c1a28 +test expr-28.101 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -892771 E-213 x -125818c7294f27_0000000000000000000000000001& E-688 + convertToDouble -892771E-213 +} 0x94f25818c7294f27 +test expr-28.102 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +757803 E120 x 11e968b555bb80_11111111111111111111111111110& E418 + convertToDouble +757803E120 +} 0x5a11e968b555bb81 +test expr-28.103 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -252601 E120 x -17e1e0f1c7a4ab_11111111111111111111111111110& E416 + convertToDouble -252601E120 +} 0xd9f7e1e0f1c7a4ac +test expr-28.104 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +252601 E121 x 1dda592e398dd6_1111111111111111111111111110& E419 + convertToDouble +252601E121 +} 0x5a2dda592e398dd7 +test expr-28.105 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -505202 E120 x -17e1e0f1c7a4ab_11111111111111111111111111110& E417 + convertToDouble -505202E120 +} 0xda07e1e0f1c7a4ac +test expr-28.106 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +970811 E-264 x 1dda6b965c9629_11111111111111111111111110& E-858 + convertToDouble +970811E-264 +} 0x0a5dda6b965c962a +test expr-28.107 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -654839 E-60 x -100e7db3b3f241_111111111111111111111111110& E-180 + convertToDouble -654839E-60 +} 0xb4b00e7db3b3f242 +test expr-28.108 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +289767 E-178 x 1caad28f23a100_11111111111111111111111110& E-574 + convertToDouble +289767E-178 +} 0x1c1caad28f23a101 +test expr-28.109 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -579534 E-178 x -1caad28f23a100_11111111111111111111111110& E-573 + convertToDouble -579534E-178 +} 0x9c2caad28f23a101 +test expr-28.110 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -8823691 E130 x -1e597c0b94b7ae_00000000000000000000000000000001& E454 + convertToDouble -8823691E130 +} 0xdc5e597c0b94b7ae +test expr-28.111 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +9346704 E229 x 1d657059dc79aa_00000000000000000000000000001& E783 + convertToDouble +9346704E229 +} 0x70ed657059dc79aa +test expr-28.112 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -1168338 E229 x -1d657059dc79aa_00000000000000000000000000001& E780 + convertToDouble -1168338E229 +} 0xf0bd657059dc79aa +test expr-28.113 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -6063369 E-136 x -1ae6148e3902b3_000000000000000000000000000001& E-430 + convertToDouble -6063369E-136 +} 0xa51ae6148e3902b3 +test expr-28.114 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +3865421 E-225 x 15d4fe53afec65_00000000000000000000000000001& E-726 + convertToDouble +3865421E-225 +} 0x1295d4fe53afec65 +test expr-28.115 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -5783893 E-127 x -17e5902ce0e151_000000000000000000000000000000001& E-400 + convertToDouble -5783893E-127 +} 0xa6f7e5902ce0e151 +test expr-28.116 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +2572231 E223 x 10f73be1dff9ac_111111111111111111111111111110& E762 + convertToDouble +2572231E223 +} 0x6f90f73be1dff9ad +test expr-28.117 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -5144462 E223 x -10f73be1dff9ac_111111111111111111111111111110& E763 + convertToDouble -5144462E223 +} 0xefa0f73be1dff9ad +test expr-28.118 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +1817623 E109 x 1d85f96f3fe659_11111111111111111111111111110& E382 + convertToDouble +1817623E109 +} 0x57dd85f96f3fe65a +test expr-28.119 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +6431543 E-97 x 14f6493f34a0bc_11111111111111111111111111110& E-300 + convertToDouble +6431543E-97 +} 0x2d34f6493f34a0bd +test expr-28.120 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -5444097 E-21 x -18849dd33c95ae_11111111111111111111111111110& E-48 + convertToDouble -5444097E-21 +} 0xbcf8849dd33c95af +test expr-28.121 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +8076999 E-121 x 1fd332f7e2e3b2_11111111111111111111111111110& E-380 + convertToDouble +8076999E-121 +} 0x283fd332f7e2e3b3 +test expr-28.122 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -9997649 E-270 x -1425e9d29e558d_1111111111111111111111111110& E-874 + convertToDouble -9997649E-270 +} 0x895425e9d29e558e +test expr-28.123 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +50609263 E157 x 1193aff1f1c8e3_000000000000000000000000000000001& E547 + convertToDouble +50609263E157 +} 0x622193aff1f1c8e3 +test expr-28.124 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +70589528 E130 x 1e597c0b94b7ae_00000000000000000000000000000001& E457 + convertToDouble +70589528E130 +} 0x5c8e597c0b94b7ae +test expr-28.125 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -88236910 E129 x -1e597c0b94b7ae_00000000000000000000000000000001& E454 + convertToDouble -88236910E129 +} 0xdc5e597c0b94b7ae +test expr-28.126 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +87575437 E-310 x 1805c19e680456_0000000000000000000000000000000000001& E-1004 + convertToDouble +87575437E-310 +} 0x013805c19e680456 +test expr-28.127 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -23135572 E-127 x -17e5902ce0e151_000000000000000000000000000000001& E-398 + convertToDouble -23135572E-127 +} 0xa717e5902ce0e151 +test expr-28.128 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +85900881 E177 x 14375b2214e1b4_111111111111111111111111111111110& E614 + convertToDouble +85900881E177 +} 0x6654375b2214e1b5 +test expr-28.129 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -84863171 E113 x -1a4a8e56474b8b_111111111111111111111111111111110& E401 + convertToDouble -84863171E113 +} 0xd90a4a8e56474b8c +test expr-28.130 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +68761586 E232 x 1a662c350f37f2_1111111111111111111111111111110& E796 + convertToDouble +68761586E232 +} 0x71ba662c350f37f3 +test expr-28.131 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -50464069 E286 x -1948dd06de561e_1111111111111111111111111111110& E975 + convertToDouble -50464069E286 +} 0xfce948dd06de561f +test expr-28.132 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +27869147 E-248 x 1dbbac6f83a820_111111111111111111111111111111111110& E-800 + convertToDouble +27869147E-248 +} 0x0dfdbbac6f83a821 +test expr-28.133 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -55738294 E-248 x -1dbbac6f83a820_111111111111111111111111111111111110& E-799 + convertToDouble -55738294E-248 +} 0x8e0dbbac6f83a821 +test expr-28.134 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +70176353 E-53 x 100683a21de854_1111111111111111111111111111111110& E-150 + convertToDouble +70176353E-53 +} 0x36900683a21de855 +test expr-28.135 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -80555086 E-32 x -1f29ca0ff893b0_111111111111111111111111111111110& E-81 + convertToDouble -80555086E-32 +} 0xbaef29ca0ff893b1 +test expr-28.136 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -491080654 E121 x -1c569e968e0944_00000000000000000000000000000000000000001& E430 + convertToDouble -491080654E121 +} 0xdadc569e968e0944 +test expr-28.137 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +526250918 E287 x 14997a298b2f2e_0000000000000000000000000000000000001& E982 + convertToDouble +526250918E287 +} 0x7d54997a298b2f2e +test expr-28.138 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -245540327 E121 x -1c569e968e0944_00000000000000000000000000000000000000001& E429 + convertToDouble -245540327E121 +} 0xdacc569e968e0944 +test expr-28.139 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -175150874 E-310 x -1805c19e680456_0000000000000000000000000000000000001& E-1003 + convertToDouble -175150874E-310 +} 0x814805c19e680456 +test expr-28.140 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +350301748 E-310 x 1805c19e680456_0000000000000000000000000000000000001& E-1002 + convertToDouble +350301748E-310 +} 0x015805c19e680456 +test expr-28.141 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -437877185 E-311 x -1805c19e680456_0000000000000000000000000000000000001& E-1005 + convertToDouble -437877185E-311 +} 0x812805c19e680456 +test expr-28.142 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +458117166 E52 x 16ce94febdc7a4_1111111111111111111111111111111111110& E201 + convertToDouble +458117166E52 +} 0x4c86ce94febdc7a5 +test expr-28.143 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -916234332 E52 x -16ce94febdc7a4_1111111111111111111111111111111111110& E202 + convertToDouble -916234332E52 +} 0xcc96ce94febdc7a5 +test expr-28.144 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +229058583 E52 x 16ce94febdc7a4_1111111111111111111111111111111111110& E200 + convertToDouble +229058583E52 +} 0x4c76ce94febdc7a5 +test expr-28.145 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -525789935 E98 x -16ecdc2a58fc64_11111111111111111111111111111111110& E354 + convertToDouble -525789935E98 +} 0xd616ecdc2a58fc65 +test expr-28.146 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +282926897 E-227 x 1ff5a70d3d2fee_1111111111111111111111111111111111110& E-727 + convertToDouble +282926897E-227 +} 0x128ff5a70d3d2fef +test expr-28.147 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -565853794 E-227 x -1ff5a70d3d2fee_1111111111111111111111111111111111110& E-726 + convertToDouble -565853794E-227 +} 0x929ff5a70d3d2fef +test expr-28.148 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +667284113 E-240 x 109355f8050c01_111111111111111111111111111111111110& E-768 + convertToDouble +667284113E-240 +} 0x0ff09355f8050c02 +test expr-28.149 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -971212611 E-126 x -1397d3c9745d2e_111111111111111111111111111111111111110& E-389 + convertToDouble -971212611E-126 +} 0xa7a397d3c9745d2f +test expr-28.150 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +9981396317 E-182 x 18afe10a2a66aa_0000000000000000000000000000000000000001& E-572 + convertToDouble +9981396317E-182 +} 0x1c38afe10a2a66aa +test expr-28.151 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -5035231965 E-156 x -101891fc4717fd_00000000000000000000000000000000000001& E-486 + convertToDouble -5035231965E-156 +} 0xa1901891fc4717fd +test expr-28.152 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +8336960483 E-153 x 1a06a1024b95e1_000000000000000000000000000000000000001& E-476 + convertToDouble +8336960483E-153 +} 0x223a06a1024b95e1 +test expr-28.153 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -8056371144 E-155 x -101891fc4717fd_00000000000000000000000000000000000001& E-482 + convertToDouble -8056371144E-155 +} 0xa1d01891fc4717fd +test expr-28.154 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +6418488827 E79 x 1021f14ed7b3f9_11111111111111111111111111111111111111110& E295 + convertToDouble +6418488827E79 +} 0x526021f14ed7b3fa +test expr-28.155 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -3981006983 E252 x -102ebaf189d5f1_1111111111111111111111111111111111111110& E869 + convertToDouble -3981006983E252 +} 0xf6402ebaf189d5f2 +test expr-28.156 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +7962013966 E252 x 102ebaf189d5f1_1111111111111111111111111111111111111110& E870 + convertToDouble +7962013966E252 +} 0x76502ebaf189d5f2 +test expr-28.157 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -4713898551 E261 x -11d8813536e0df_11111111111111111111111111111111111110& E899 + convertToDouble -4713898551E261 +} 0xf821d8813536e0e0 +test expr-28.158 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +8715380633 E-58 x 14614c3219891e_11111111111111111111111111111111111111110& E-160 + convertToDouble +8715380633E-58 +} 0x35f4614c3219891f +test expr-28.159 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -9078555839 E-109 x -1fc575867314ed_111111111111111111111111111111111111111111110& E-330 + convertToDouble -9078555839E-109 +} 0xab5fc575867314ee +test expr-28.160 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +9712126110 E-127 x 1397d3c9745d2e_111111111111111111111111111111111111110& E-389 + convertToDouble +9712126110E-127 +} 0x27a397d3c9745d2f +test expr-28.161 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +42333842451 E201 x 10189a26df575f_000000000000000000000000000000000000000000001& E703 + convertToDouble +42333842451E201 +} 0x6be0189a26df575f +test expr-28.162 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -84667684902 E201 x -10189a26df575f_000000000000000000000000000000000000000000001& E704 + convertToDouble -84667684902E201 +} 0xebf0189a26df575f +test expr-28.163 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +23792120709 E-315 x 10b517dc5d3212_00000000000000000000000000000000000000001& E-1012 + convertToDouble +23792120709E-315 +} 0x00b0b517dc5d3212 +test expr-28.164 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -78564021519 E-227 x -1155515fd37265_00000000000000000000000000000000000000000001& E-718 + convertToDouble -78564021519E-227 +} 0x931155515fd37265 +test expr-28.165 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +71812054883 E-188 x 1747b46d78c6fe_00000000000000000000000000000000000000001& E-589 + convertToDouble +71812054883E-188 +} 0x1b2747b46d78c6fe +test expr-28.166 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -30311163631 E-116 x -163ef6f560afe7_00000000000000000000000000000000000000001& E-351 + convertToDouble -30311163631E-116 +} 0xaa063ef6f560afe7 +test expr-28.167 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +71803914657 E292 x 10c0c44cdc2c05_11111111111111111111111111111111111111111110& E1006 + convertToDouble +71803914657E292 +} 0x7ed0c0c44cdc2c06 +test expr-28.168 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +36314223356 E-109 x 1fc575867314ed_111111111111111111111111111111111111111111110& E-328 + convertToDouble +36314223356E-109 +} 0x2b7fc575867314ee +test expr-28.169 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +18157111678 E-109 x 1fc575867314ed_111111111111111111111111111111111111111111110& E-329 + convertToDouble +18157111678E-109 +} 0x2b6fc575867314ee +test expr-28.170 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -45392779195 E-110 x -1fc575867314ed_111111111111111111111111111111111111111111110& E-331 + convertToDouble -45392779195E-110 +} 0xab4fc575867314ee +test expr-28.171 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +778380362293 E218 x 19ab8261990292_0000000000000000000000000000000000000000000000000001& E763 + convertToDouble +778380362293E218 +} 0x6fa9ab8261990292 +test expr-28.172 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -685763015669 E280 x -15fd7aa44d9477_000000000000000000000000000000000000000000000001& E969 + convertToDouble -685763015669E280 +} 0xfc85fd7aa44d9477 +test expr-28.173 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +952918668151 E70 x 14177a9915fbf8_00000000000000000000000000000000000000000000001& E272 + convertToDouble +952918668151E70 +} 0x50f4177a9915fbf8 +test expr-28.174 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -548357443505 E32 x -13abde2775e9b5_0000000000000000000000000000000000000000000001& E145 + convertToDouble -548357443505E32 +} 0xc903abde2775e9b5 +test expr-28.175 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +384865004907 E-285 x 1aa65b58639e69_00000000000000000000000000000000000000000000001& E-909 + convertToDouble +384865004907E-285 +} 0x072aa65b58639e69 +test expr-28.176 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -769730009814 E-285 x -1aa65b58639e69_00000000000000000000000000000000000000000000001& E-908 + convertToDouble -769730009814E-285 +} 0x873aa65b58639e69 +test expr-28.177 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +697015418417 E-93 x 152847dad80453_0000000000000000000000000000000000000000000001& E-270 + convertToDouble +697015418417E-93 +} 0x2f152847dad80453 +test expr-28.178 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -915654049301 E-28 x -1a645598d05989_0000000000000000000000000000000000000000000001& E-54 + convertToDouble -915654049301E-28 +} 0xbc9a645598d05989 +test expr-28.179 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +178548656339 E169 x 1b89d67c5b6d24_111111111111111111111111111111111111111111110& E598 + convertToDouble +178548656339E169 +} 0x655b89d67c5b6d25 +test expr-28.180 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -742522891517 E259 x -1c1c352fc3c308_11111111111111111111111111111111111111111111110& E899 + convertToDouble -742522891517E259 +} 0xf82c1c352fc3c309 +test expr-28.181 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +742522891517 E258 x 167cf7596968d3_11111111111111111111111111111111111111111111110& E896 + convertToDouble +742522891517E258 +} 0x77f67cf7596968d4 +test expr-28.182 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -357097312678 E169 x -1b89d67c5b6d24_111111111111111111111111111111111111111111110& E599 + convertToDouble -357097312678E169 +} 0xe56b89d67c5b6d25 +test expr-28.183 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -3113521449172 E218 x -19ab8261990292_0000000000000000000000000000000000000000000000000001& E765 + convertToDouble -3113521449172E218 +} 0xefc9ab8261990292 +test expr-28.184 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +3891901811465 E217 x 19ab8261990292_0000000000000000000000000000000000000000000000000001& E762 + convertToDouble +3891901811465E217 +} 0x6f99ab8261990292 +test expr-28.185 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -1556760724586 E218 x -19ab8261990292_0000000000000000000000000000000000000000000000000001& E764 + convertToDouble -1556760724586E218 +} 0xefb9ab8261990292 +test expr-28.186 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +9997878507563 E-195 x 153db2fea1ea31_0000000000000000000000000000000000000000000000001& E-605 + convertToDouble +9997878507563E-195 +} 0x1a253db2fea1ea31 +test expr-28.187 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -7247563029154 E-319 x -10493f056e9ef3_0000000000000000000000000000000000000000000000001& E-1017 + convertToDouble -7247563029154E-319 +} 0x8060493f056e9ef3 +test expr-28.188 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +3623781514577 E-319 x 10493f056e9ef3_0000000000000000000000000000000000000000000000001& E-1018 + convertToDouble +3623781514577E-319 +} 0x0050493f056e9ef3 +test expr-28.189 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -3092446298323 E-200 x -113918353bbc47_0000000000000000000000000000000000000000000000001& E-623 + convertToDouble -3092446298323E-200 +} 0x99013918353bbc47 +test expr-28.190 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +6363857920591 E145 x 128a61cf9483b6_1111111111111111111111111111111111111111111111111110& E524 + convertToDouble +6363857920591E145 +} 0x60b28a61cf9483b7 +test expr-28.191 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -8233559360849 E94 x -11f324d11d4861_1111111111111111111111111111111111111111111111110& E355 + convertToDouble -8233559360849E94 +} 0xd621f324d11d4862 +test expr-28.192 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +2689845954547 E49 x 10bd2bfd34f98a_1111111111111111111111111111111111111111111111110& E204 + convertToDouble +2689845954547E49 +} 0x4cb0bd2bfd34f98b +test expr-28.193 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -5379691909094 E49 x -10bd2bfd34f98a_1111111111111111111111111111111111111111111111110& E205 + convertToDouble -5379691909094E49 +} 0xccc0bd2bfd34f98b +test expr-28.194 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +5560322501926 E-301 x 15acc2053064c1_11111111111111111111111111111111111111111111111110& E-958 + convertToDouble +5560322501926E-301 +} 0x0415acc2053064c2 +test expr-28.195 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -7812878489261 E-179 x -126dae7bbeda74_11111111111111111111111111111111111111111111111111110& E-552 + convertToDouble -7812878489261E-179 +} 0x9d726dae7bbeda75 +test expr-28.196 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +8439398533053 E-256 x 170cc285f2d209_1111111111111111111111111111111111111111111111110& E-808 + convertToDouble +8439398533053E-256 +} 0x0d770cc285f2d20a +test expr-28.197 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -2780161250963 E-301 x -15acc2053064c1_11111111111111111111111111111111111111111111111110& E-959 + convertToDouble -2780161250963E-301 +} 0x8405acc2053064c2 +test expr-28.198 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -87605699161665 E155 x -12920f96e7f9ef_00000000000000000000000000000000000000000000000000001& E561 + convertToDouble -87605699161665E155 +} 0xe302920f96e7f9ef +test expr-28.199 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -17521139832333 E156 x -12920f96e7f9ef_00000000000000000000000000000000000000000000000000001& E562 + convertToDouble -17521139832333E156 +} 0xe312920f96e7f9ef +test expr-28.200 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -88218101363513 E-170 x -18395688592faf_0000000000000000000000000000000000000000000000000001& E-519 + convertToDouble -88218101363513E-170 +} 0x9f88395688592faf +test expr-28.201 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +38639244311627 E-115 x 114ef3e205c817_0000000000000000000000000000000000000000000000000001& E-337 + convertToDouble +38639244311627E-115 +} 0x2ae14ef3e205c817 +test expr-28.202 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +35593959807306 E261 x 1072f3819c1320_11111111111111111111111111111111111111111111111111110& E912 + convertToDouble +35593959807306E261 +} 0x78f072f3819c1321 +test expr-28.203 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -53390939710959 E260 x -13bd243521b08d_11111111111111111111111111111111111111111111111111110& E909 + convertToDouble -53390939710959E260 +} 0xf8c3bd243521b08e +test expr-28.204 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +71187919614612 E261 x 1072f3819c1320_11111111111111111111111111111111111111111111111111110& E913 + convertToDouble +71187919614612E261 +} 0x790072f3819c1321 +test expr-28.205 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -88984899518265 E260 x -1072f3819c1320_11111111111111111111111111111111111111111111111111110& E910 + convertToDouble -88984899518265E260 +} 0xf8d072f3819c1321 +test expr-28.206 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +77003665618895 E-73 x 18bf7e7fa6f029_111111111111111111111111111111111111111111111111111111110& E-197 + convertToDouble +77003665618895E-73 +} 0x33a8bf7e7fa6f02a +test expr-28.207 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -15400733123779 E-72 x -18bf7e7fa6f029_111111111111111111111111111111111111111111111111111111110& E-196 + convertToDouble -15400733123779E-72 +} 0xb3b8bf7e7fa6f02a +test expr-28.208 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +61602932495116 E-72 x 18bf7e7fa6f029_111111111111111111111111111111111111111111111111111111110& E-194 + convertToDouble +61602932495116E-72 +} 0x33d8bf7e7fa6f02a +test expr-28.209 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -30801466247558 E-72 x -18bf7e7fa6f029_111111111111111111111111111111111111111111111111111111110& E-195 + convertToDouble -30801466247558E-72 +} 0xb3c8bf7e7fa6f02a +test expr-28.210 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +834735494917063 E-300 x 1fc6c26f899dd1_0000000000000000000000000000000000000000000000000000000001& E-948 + convertToDouble +834735494917063E-300 +} 0x04bfc6c26f899dd1 +test expr-28.211 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -589795149206434 E-151 x -15f2df5e675a0f_0000000000000000000000000000000000000000000000000000000001& E-453 + convertToDouble -589795149206434E-151 +} 0xa3a5f2df5e675a0f +test expr-28.212 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +475603213226859 E-42 x 12d73088f4050a_000000000000000000000000000000000000000000000000000000001& E-91 + convertToDouble +475603213226859E-42 +} 0x3a42d73088f4050a +test expr-28.213 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -294897574603217 E-151 x -15f2df5e675a0f_0000000000000000000000000000000000000000000000000000000001& E-454 + convertToDouble -294897574603217E-151 +} 0xa395f2df5e675a0f +test expr-28.214 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +850813008001913 E93 x 172f7a1831ad70_11111111111111111111111111111111111111111111111111111110& E358 + convertToDouble +850813008001913E93 +} 0x56572f7a1831ad71 +test expr-28.215 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -203449172043339 E185 x -1102b47e4af987_11111111111111111111111111111111111111111111111111111110& E662 + convertToDouble -203449172043339E185 +} 0xe95102b47e4af988 +test expr-28.216 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +406898344086678 E185 x 1102b47e4af987_11111111111111111111111111111111111111111111111111111110& E663 + convertToDouble +406898344086678E185 +} 0x696102b47e4af988 +test expr-28.217 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -813796688173356 E185 x -1102b47e4af987_11111111111111111111111111111111111111111111111111111110& E664 + convertToDouble -813796688173356E185 +} 0xe97102b47e4af988 +test expr-28.218 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +6045338514609393 E244 x 1f746182e6cd5d_00000000000000000000000000000000000000000000000000000000001& E862 + convertToDouble +6045338514609393E244 +} 0x75df746182e6cd5d +test expr-28.219 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -5145963778954906 E142 x -1dfc11fbf46087_00000000000000000000000000000000000000000000000000000000001& E523 + convertToDouble -5145963778954906E142 +} 0xe0adfc11fbf46087 +test expr-28.220 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +2572981889477453 E142 x 1dfc11fbf46087_00000000000000000000000000000000000000000000000000000000001& E522 + convertToDouble +2572981889477453E142 +} 0x609dfc11fbf46087 +test expr-28.221 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -6965949469487146 E74 x -15e2c10ad970b0_0000000000000000000000000000000000000000000000000000000001& E298 + convertToDouble -6965949469487146E74 +} 0xd295e2c10ad970b0 +test expr-28.222 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +6182410494241627 E-119 x 11b96458445d07_0000000000000000000000000000000000000000000000000000000000001& E-343 + convertToDouble +6182410494241627E-119 +} 0x2a81b96458445d07 +test expr-28.223 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -8510309498186985 E-277 x -1acc46749dccfe_000000000000000000000000000000000000000000000000000000000001& E-868 + convertToDouble -8510309498186985E-277 +} 0x89bacc46749dccfe +test expr-28.224 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +6647704637273331 E-212 x 13e07d2c0cb1e9_0000000000000000000000000000000000000000000000000000000000001& E-652 + convertToDouble +6647704637273331E-212 +} 0x1733e07d2c0cb1e9 +test expr-28.225 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -2215901545757777 E-212 x -1a80a6e566428c_000000000000000000000000000000000000000000000000000000000001& E-654 + convertToDouble -2215901545757777E-212 +} 0x971a80a6e566428c +test expr-28.226 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +3771476185376383 E276 x 183010aba78a53_111111111111111111111111111111111111111111111111111111111110& E968 + convertToDouble +3771476185376383E276 +} 0x7c783010aba78a54 +test expr-28.227 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -3729901848043846 E212 x -1f7d6721f7f143_111111111111111111111111111111111111111111111111111111111110& E755 + convertToDouble -3729901848043846E212 +} 0xef2f7d6721f7f144 +test expr-28.228 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +3771476185376383 E277 x 1e3c14d6916ce8_111111111111111111111111111111111111111111111111111111111110& E971 + convertToDouble +3771476185376383E277 +} 0x7cae3c14d6916ce9 +test expr-28.229 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -9977830465649166 E119 x -15f6de9d5d6b5a_111111111111111111111111111111111111111111111111111111111110& E448 + convertToDouble -9977830465649166E119 +} 0xdbf5f6de9d5d6b5b +test expr-28.230 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +8439928496349319 E-142 x 12483a0f125699_111111111111111111111111111111111111111111111111111111111110& E-419 + convertToDouble +8439928496349319E-142 +} 0x25c2483a0f12569a +test expr-28.231 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -8204230082070882 E-59 x -1d460f4fca1d36_1111111111111111111111111111111111111111111111111111111110& E-144 + convertToDouble -8204230082070882E-59 +} 0xb6fd460f4fca1d37 +test expr-28.232 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +8853686434843997 E-244 x 157a340eb5d4f0_11111111111111111111111111111111111111111111111111111111110& E-758 + convertToDouble +8853686434843997E-244 +} 0x10957a340eb5d4f1 +test expr-28.233 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -5553274272288559 E-104 x -1c47d20a19d1ed_1111111111111111111111111111111111111111111111111111111110& E-294 + convertToDouble -5553274272288559E-104 +} 0xad9c47d20a19d1ee +test expr-28.234 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +36149023611096162 E144 x 1491daad0ba280_0000000000000000000000000000000000000000000000000000000000000001& E533 + convertToDouble +36149023611096162E144 +} 0x614491daad0ba280 +test expr-28.235 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -36149023611096162 E147 x -14166f8cfd5cb1_0000000000000000000000000000000000000000000000000000000000000001& E543 + convertToDouble -36149023611096162E147 +} 0xe1e4166f8cfd5cb1 +test expr-28.236 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +18074511805548081 E146 x 1011f2d73116f4_0000000000000000000000000000000000000000000000000000000000000001& E539 + convertToDouble +18074511805548081E146 +} 0x61a011f2d73116f4 +test expr-28.237 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -18074511805548081 E147 x -14166f8cfd5cb1_0000000000000000000000000000000000000000000000000000000000000001& E542 + convertToDouble -18074511805548081E147 +} 0xe1d4166f8cfd5cb1 +test expr-28.238 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +97338774138954421 E-290 x 10d9b828199006_0000000000000000000000000000000000000000000000000000000000000001& E-907 + convertToDouble +97338774138954421E-290 +} 0x0740d9b828199006 +test expr-28.239 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -88133809804950961 E-308 x -119710dc581911_000000000000000000000000000000000000000000000000000000000000001& E-967 + convertToDouble -88133809804950961E-308 +} 0x83819710dc581911 +test expr-28.240 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +94080055902682397 E-243 x 11d467e94b856e_0000000000000000000000000000000000000000000000000000000000000001& E-751 + convertToDouble +94080055902682397E-243 +} 0x1101d467e94b856e +test expr-28.241 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -24691002732654881 E-115 x -159a2783ce70ab_000000000000000000000000000000000000000000000000000000000000001& E-328 + convertToDouble -24691002732654881E-115 +} 0xab759a2783ce70ab +test expr-28.242 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +52306490527514614 E49 x 13de005bd620de_111111111111111111111111111111111111111111111111111111111111111110& E218 + convertToDouble +52306490527514614E49 +} 0x4d93de005bd620df +test expr-28.243 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -26153245263757307 E49 x -13de005bd620de_111111111111111111111111111111111111111111111111111111111111111110& E217 + convertToDouble -26153245263757307E49 +} 0xcd83de005bd620df +test expr-28.244 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +55188692254193604 E165 x 1a999ddec72ac9_11111111111111111111111111111111111111111111111111111111111110& E603 + convertToDouble +55188692254193604E165 +} 0x65aa999ddec72aca +test expr-28.245 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -68985865317742005 E164 x -1a999ddec72ac9_11111111111111111111111111111111111111111111111111111111111110& E600 + convertToDouble -68985865317742005E164 +} 0xe57a999ddec72aca +test expr-28.246 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +27176258005319167 E-261 x 17c0747bd76fa0_11111111111111111111111111111111111111111111111111111111111111110& E-813 + convertToDouble +27176258005319167E-261 +} 0x0d27c0747bd76fa1 +test expr-28.247 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -73169230107256116 E-248 x -122cea327fa99c_1111111111111111111111111111111111111111111111111111111111110& E-768 + convertToDouble -73169230107256116E-248 +} 0x8ff22cea327fa99d +test expr-28.248 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +91461537634070145 E-249 x 122cea327fa99c_1111111111111111111111111111111111111111111111111111111111110& E-771 + convertToDouble +91461537634070145E-249 +} 0x0fc22cea327fa99d +test expr-28.249 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -54352516010638334 E-261 x -17c0747bd76fa0_11111111111111111111111111111111111111111111111111111111111111110& E-812 + convertToDouble -54352516010638334E-261 +} 0x8d37c0747bd76fa1 +test expr-28.250 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +586144289638535878 E280 x 11eccbd6f62709_0000000000000000000000000000000000000000000000000000000000000000001& E989 + convertToDouble +586144289638535878E280 +} 0x7dc1eccbd6f62709 +test expr-28.251 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -601117006785295431 E245 x -1e8b3525b3737e_000000000000000000000000000000000000000000000000000000000000000001& E872 + convertToDouble -601117006785295431E245 +} 0xf67e8b3525b3737e +test expr-28.252 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +293072144819267939 E280 x 11eccbd6f62709_0000000000000000000000000000000000000000000000000000000000000000001& E988 + convertToDouble +293072144819267939E280 +} 0x7db1eccbd6f62709 +test expr-28.253 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -953184713238516652 E272 x -138fd93f1f5342_00000000000000000000000000000000000000000000000000000000000000001& E963 + convertToDouble -953184713238516652E272 +} 0xfc238fd93f1f5342 +test expr-28.254 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +902042358290366539 E-281 x 122dc01ca1cb8c_0000000000000000000000000000000000000000000000000000000000000000001& E-874 + convertToDouble +902042358290366539E-281 +} 0x09522dc01ca1cb8c +test expr-28.255 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -557035730189854663 E-294 x -13bfac6bc4767b_00000000000000000000000000000000000000000000000000000000000000000001& E-918 + convertToDouble -557035730189854663E-294 +} 0x8693bfac6bc4767b +test expr-28.256 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +902042358290366539 E-280 x 16b93023ca3e6f_0000000000000000000000000000000000000000000000000000000000000000001& E-871 + convertToDouble +902042358290366539E-280 +} 0x0986b93023ca3e6f +test expr-28.257 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -354944100507554393 E-238 x -19a91cece6ad07_000000000000000000000000000000000000000000000000000000000000000001& E-733 + convertToDouble -354944100507554393E-238 +} 0x9229a91cece6ad07 +test expr-28.258 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +272104041512242479 E199 x 1f92bacb3cb40b_11111111111111111111111111111111111111111111111111111111111111111111110& E718 + convertToDouble +272104041512242479E199 +} 0x6cdf92bacb3cb40c +test expr-28.259 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -816312124536727437 E199 x -17ae0c186d8708_11111111111111111111111111111111111111111111111111111111111111111111110& E720 + convertToDouble -816312124536727437E199 +} 0xecf7ae0c186d8709 +test expr-28.260 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +544208083024484958 E199 x 1f92bacb3cb40b_11111111111111111111111111111111111111111111111111111111111111111111110& E719 + convertToDouble +544208083024484958E199 +} 0x6cef92bacb3cb40c +test expr-28.261 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -792644927852378159 E78 x -17bff336d8ff05_111111111111111111111111111111111111111111111111111111111111111111110& E318 + convertToDouble -792644927852378159E78 +} 0xd3d7bff336d8ff06 +test expr-28.262 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -679406450132979175 E-263 x -17c0747bd76fa0_11111111111111111111111111111111111111111111111111111111111111110& E-815 + convertToDouble -679406450132979175E-263 +} 0x8d07c0747bd76fa1 +test expr-28.263 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +543525160106383340 E-262 x 17c0747bd76fa0_11111111111111111111111111111111111111111111111111111111111111110& E-812 + convertToDouble +543525160106383340E-262 +} 0x0d37c0747bd76fa1 +test expr-28.264 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +7400253695682920196 E215 x 1dca94e3990085_00000000000000000000000000000000000000000000000000000000000000000000001& E776 + convertToDouble +7400253695682920196E215 +} 0x707dca94e3990085 +test expr-28.265 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -1850063423920730049 E215 x -1dca94e3990085_00000000000000000000000000000000000000000000000000000000000000000000001& E774 + convertToDouble -1850063423920730049E215 +} 0xf05dca94e3990085 +test expr-28.266 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +3700126847841460098 E215 x 1dca94e3990085_00000000000000000000000000000000000000000000000000000000000000000000001& E775 + convertToDouble +3700126847841460098E215 +} 0x706dca94e3990085 +test expr-28.267 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -9250317119603650245 E214 x -1dca94e3990085_00000000000000000000000000000000000000000000000000000000000000000000001& E773 + convertToDouble -9250317119603650245E214 +} 0xf04dca94e3990085 +test expr-28.268 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +8396094300569779681 E-252 x 1ab223efcee35a_0000000000000000000000000000000000000000000000000000000000000000000000001& E-775 + convertToDouble +8396094300569779681E-252 +} 0x0f8ab223efcee35a +test expr-28.269 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -3507665085003296281 E-75 x -160499b881ea50_00000000000000000000000000000000000000000000000000000000000000000000001& E-188 + convertToDouble -3507665085003296281E-75 +} 0xb4360499b881ea50 +test expr-28.270 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +7015330170006592562 E-75 x 160499b881ea50_00000000000000000000000000000000000000000000000000000000000000000000001& E-187 + convertToDouble +7015330170006592562E-75 +} 0x34460499b881ea50 +test expr-28.271 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -7015330170006592562 E-74 x -1b85c026a264e4_00000000000000000000000000000000000000000000000000000000000000000000001& E-184 + convertToDouble -7015330170006592562E-74 +} 0xb47b85c026a264e4 +test expr-28.272 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +7185620434951919351 E205 x 18d92d2bcc7a80_1111111111111111111111111111111111111111111111111111111111111111111111110& E743 + convertToDouble +7185620434951919351E205 +} 0x6e68d92d2bcc7a81 +test expr-28.273 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -1360520207561212395 E198 x -1f92bacb3cb40b_11111111111111111111111111111111111111111111111111111111111111111111110& E717 + convertToDouble -1360520207561212395E198 +} 0xeccf92bacb3cb40c +test expr-28.274 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +2178999185345151731 E-184 x 19b2c4d2a82335_1111111111111111111111111111111111111111111111111111111111111111111110& E-551 + convertToDouble +2178999185345151731E-184 +} 0x1d89b2c4d2a82336 +test expr-28.275 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -8691089486201567102 E-218 x -1a9c42e5b6d89e_1111111111111111111111111111111111111111111111111111111111111111111110& E-662 + convertToDouble -8691089486201567102E-218 +} 0x969a9c42e5b6d89f +test expr-28.276 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +4345544743100783551 E-218 x 1a9c42e5b6d89e_1111111111111111111111111111111111111111111111111111111111111111111110& E-663 + convertToDouble +4345544743100783551E-218 +} 0x168a9c42e5b6d89f +test expr-28.277 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -4357998370690303462 E-184 x -19b2c4d2a82335_1111111111111111111111111111111111111111111111111111111111111111111110& E-550 + convertToDouble -4357998370690303462E-184 +} 0x9d99b2c4d2a82336 +test expr-28.278 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +59825267349106892461 E177 x 199c476d7868df_000000000000000000000000000000000000000000000000000000000000000000000001& E653 + convertToDouble +59825267349106892461E177 +} 0x68c99c476d7868df +test expr-28.279 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -62259110684423957791 E47 x -1d8f2cfc20d6e8_0000000000000000000000000000000000000000000000000000000000000000000000001& E221 + convertToDouble -62259110684423957791E47 +} 0xcdcd8f2cfc20d6e8 +test expr-28.280 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +58380168477038565599 E265 x 1f686e9efbe48d_00000000000000000000000000000000000000000000000000000000000000000000000001& E945 + convertToDouble +58380168477038565599E265 +} 0x7b0f686e9efbe48d +test expr-28.281 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -62259110684423957791 E48 x -12797c1d948651_0000000000000000000000000000000000000000000000000000000000000000000000001& E225 + convertToDouble -62259110684423957791E48 +} 0xce02797c1d948651 +test expr-28.282 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -33584377202279118724 E-252 x -1ab223efcee35a_0000000000000000000000000000000000000000000000000000000000000000000000001& E-773 + convertToDouble -33584377202279118724E-252 +} 0x8faab223efcee35a +test expr-28.283 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -57484963479615354808 E205 x -18d92d2bcc7a80_1111111111111111111111111111111111111111111111111111111111111111111111110& E746 + convertToDouble -57484963479615354808E205 +} 0xee98d92d2bcc7a81 +test expr-28.284 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +71856204349519193510 E204 x 18d92d2bcc7a80_1111111111111111111111111111111111111111111111111111111111111111111111110& E743 + convertToDouble +71856204349519193510E204 +} 0x6e68d92d2bcc7a81 +test expr-28.285 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -14371240869903838702 E205 x -18d92d2bcc7a80_1111111111111111111111111111111111111111111111111111111111111111111111110& E744 + convertToDouble -14371240869903838702E205 +} 0xee78d92d2bcc7a81 +test expr-28.286 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +36992084760177624177 E-318 x 18c5f9551c2f99_111111111111111111111111111111111111111111111111111111111111111111111110& E-992 + convertToDouble +36992084760177624177E-318 +} 0x01f8c5f9551c2f9a +test expr-28.287 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -73984169520355248354 E-318 x -18c5f9551c2f99_111111111111111111111111111111111111111111111111111111111111111111111110& E-991 + convertToDouble -73984169520355248354E-318 +} 0x8208c5f9551c2f9a +test expr-28.288 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +99257763227713890244 E-115 x 15338a554b9ce0_11111111111111111111111111111111111111111111111111111111111111111111110& E-316 + convertToDouble +99257763227713890244E-115 +} 0x2c35338a554b9ce1 +test expr-28.289 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -87336362425182547697 E-280 x -1130304e7d9c32_11111111111111111111111111111111111111111111111111111111111111111111110& E-864 + convertToDouble -87336362425182547697E-280 +} 0x89f130304e7d9c33 +test expr-28.290 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +7 E289 x 1cbb547777a284_10000000001& E962 + convertToDouble +7E289 +} 0x7c1cbb547777a285 +test expr-28.291 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -3 E153 x -1ca3d8e6d80cba_100000001& E509 + convertToDouble -3E153 +} 0xdfcca3d8e6d80cbb +test expr-28.292 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +6 E153 x 1ca3d8e6d80cba_100000001& E510 + convertToDouble +6E153 +} 0x5fdca3d8e6d80cbb +test expr-28.293 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -5 E243 x -176ec98994f488_10000001& E809 + convertToDouble -5E243 +} 0xf2876ec98994f489 +test expr-28.294 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +7 E-161 x 1f7e0db3799aa2_10000000001& E-533 + convertToDouble +7E-161 +} 0x1eaf7e0db3799aa3 +test expr-28.295 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -7 E-172 x -15a4337446ef2a_1000000001& E-569 + convertToDouble -7E-172 +} 0x9c65a4337446ef2b +test expr-28.296 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +8 E-63 x 1a53fc9631d10c_10000001& E-207 + convertToDouble +8E-63 +} 0x330a53fc9631d10d +test expr-28.297 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -7 E-113 x -158c47e6eea282_10000001& E-373 + convertToDouble -7E-113 +} 0xa8a58c47e6eea283 +test expr-28.298 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +8 E126 x 17a2ecc414a03f_0111111111110& E421 + convertToDouble +8E126 +} 0x5a47a2ecc414a03f +test expr-28.299 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -4 E126 x -17a2ecc414a03f_0111111111110& E420 + convertToDouble -4E126 +} 0xda37a2ecc414a03f +test expr-28.300 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +5 E125 x 17a2ecc414a03f_0111111111110& E417 + convertToDouble +5E125 +} 0x5a07a2ecc414a03f +test expr-28.301 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -1 E126 x -17a2ecc414a03f_0111111111110& E418 + convertToDouble -1E126 +} 0xda17a2ecc414a03f +test expr-28.302 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +8 E-163 x 1708d0f84d3de7_011111110& E-539 + convertToDouble +8E-163 +} 0x1e4708d0f84d3de7 +test expr-28.303 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -1 E-163 x -1708d0f84d3de7_011111110& E-542 + convertToDouble -1E-163 +} 0x9e1708d0f84d3de7 +test expr-28.304 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +2 E-163 x 1708d0f84d3de7_011111110& E-541 + convertToDouble +2E-163 +} 0x1e2708d0f84d3de7 +test expr-28.305 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -4 E-163 x -1708d0f84d3de7_011111110& E-540 + convertToDouble -4E-163 +} 0x9e3708d0f84d3de7 +test expr-28.306 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +51 E195 x 15d51d249dca42_1000000000001& E653 + convertToDouble +51E195 +} 0x68c5d51d249dca43 +test expr-28.307 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -37 E46 x -1033d7eca0adee_100000000000001& E158 + convertToDouble -37E46 +} 0xc9d033d7eca0adef +test expr-28.308 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +74 E46 x 1033d7eca0adee_100000000000001& E159 + convertToDouble +74E46 +} 0x49e033d7eca0adef +test expr-28.309 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -56 E289 x -1cbb547777a284_10000000001& E965 + convertToDouble -56E289 +} 0xfc4cbb547777a285 +test expr-28.310 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +69 E-145 x 158a41b31c9a9a_100000000001& E-476 + convertToDouble +69E-145 +} 0x22358a41b31c9a9b +test expr-28.311 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -70 E-162 x -1f7e0db3799aa2_10000000001& E-533 + convertToDouble -70E-162 +} 0x9eaf7e0db3799aa3 +test expr-28.312 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +56 E-161 x 1f7e0db3799aa2_10000000001& E-530 + convertToDouble +56E-161 +} 0x1edf7e0db3799aa3 +test expr-28.313 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -21 E-303 x -1ccd59caa6a750_10000000001& E-1003 + convertToDouble -21E-303 +} 0x814ccd59caa6a751 +test expr-28.314 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +34 E-276 x 12d5a4350d30ff_011111111110& E-912 + convertToDouble +34E-276 +} 0x06f2d5a4350d30ff +test expr-28.315 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -68 E-276 x -12d5a4350d30ff_011111111110& E-911 + convertToDouble -68E-276 +} 0x8702d5a4350d30ff +test expr-28.316 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +85 E-277 x 12d5a4350d30ff_011111111110& E-914 + convertToDouble +85E-277 +} 0x06d2d5a4350d30ff +test expr-28.317 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -87 E-274 x -12d36cf48e7abd_011111111111110& E-904 + convertToDouble -87E-274 +} 0x8772d36cf48e7abd +test expr-28.318 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +829 E102 x 17221a79cdd1d8_1000000000000001& E348 + convertToDouble +829E102 +} 0x55b7221a79cdd1d9 +test expr-28.319 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -623 E100 x -1640a62f3a83de_10000000000000000001& E341 + convertToDouble -623E100 +} 0xd54640a62f3a83df +test expr-28.320 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +723 E-162 x 145457ee24abd2_1000000000000001& E-529 + convertToDouble +723E-162 +} 0x1ee45457ee24abd3 +test expr-28.321 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -457 E-102 x -1ffc81bc29f02a_100000000000000001& E-331 + convertToDouble -457E-102 +} 0xab4ffc81bc29f02b +test expr-28.322 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +914 E-102 x 1ffc81bc29f02a_100000000000000001& E-330 + convertToDouble +914E-102 +} 0x2b5ffc81bc29f02b +test expr-28.323 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -323 E-135 x -1d589ae4d70218_10000000000001& E-441 + convertToDouble -323E-135 +} 0xa46d589ae4d70219 +test expr-28.324 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +151 E176 x 1dcf7df8f573b7_0111111111111111110& E591 + convertToDouble +151E176 +} 0x64edcf7df8f573b7 +test expr-28.325 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -302 E176 x -1dcf7df8f573b7_0111111111111111110& E592 + convertToDouble -302E176 +} 0xe4fdcf7df8f573b7 +test expr-28.326 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +921 E90 x 1c420a45fd70ff_0111111111111110& E308 + convertToDouble +921E90 +} 0x533c420a45fd70ff +test expr-28.327 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -604 E176 x -1dcf7df8f573b7_0111111111111111110& E593 + convertToDouble -604E176 +} 0xe50dcf7df8f573b7 +test expr-28.328 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +823 E-206 x 14a48933c208ad_0111111111111110& E-675 + convertToDouble +823E-206 +} 0x15c4a48933c208ad +test expr-28.329 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -463 E-114 x -11d0c83f6378a5_011111111111110& E-370 + convertToDouble -463E-114 +} 0xa8d1d0c83f6378a5 +test expr-28.330 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +348 E-274 x 12d36cf48e7abd_011111111111110& E-902 + convertToDouble +348E-274 +} 0x0792d36cf48e7abd +test expr-28.331 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +9968 E100 x 1640a62f3a83de_10000000000000000001& E345 + convertToDouble +9968E100 +} 0x558640a62f3a83df +test expr-28.332 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -6230 E99 x -1640a62f3a83de_10000000000000000001& E341 + convertToDouble -6230E99 +} 0xd54640a62f3a83df +test expr-28.333 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +1246 E100 x 1640a62f3a83de_10000000000000000001& E342 + convertToDouble +1246E100 +} 0x555640a62f3a83df +test expr-28.334 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +6676 E-296 x 15519ac5142aaa_1000000000000000000001& E-971 + convertToDouble +6676E-296 +} 0x0345519ac5142aab +test expr-28.335 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -8345 E-297 x -15519ac5142aaa_1000000000000000000001& E-974 + convertToDouble -8345E-297 +} 0x8315519ac5142aab +test expr-28.336 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +1669 E-296 x 15519ac5142aaa_1000000000000000000001& E-973 + convertToDouble +1669E-296 +} 0x0325519ac5142aab +test expr-28.337 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -3338 E-296 x -15519ac5142aaa_1000000000000000000001& E-972 + convertToDouble -3338E-296 +} 0x8335519ac5142aab +test expr-28.338 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +3257 E58 x 1444b34a6fb3eb_01111111111111111110& E204 + convertToDouble +3257E58 +} 0x4cb444b34a6fb3eb +test expr-28.339 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -6514 E58 x -1444b34a6fb3eb_01111111111111111110& E205 + convertToDouble -6514E58 +} 0xccc444b34a6fb3eb +test expr-28.340 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +2416 E176 x 1dcf7df8f573b7_0111111111111111110& E595 + convertToDouble +2416E176 +} 0x652dcf7df8f573b7 +test expr-28.341 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +8085 E-63 x 19fbf3c19b9a79_0111111111111111110& E-197 + convertToDouble +8085E-63 +} 0x33a9fbf3c19b9a79 +test expr-28.342 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -3234 E-62 x -19fbf3c19b9a79_0111111111111111110& E-195 + convertToDouble -3234E-62 +} 0xb3c9fbf3c19b9a79 +test expr-28.343 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +1617 E-62 x 19fbf3c19b9a79_0111111111111111110& E-196 + convertToDouble +1617E-62 +} 0x33b9fbf3c19b9a79 +test expr-28.344 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -6468 E-62 x -19fbf3c19b9a79_0111111111111111110& E-194 + convertToDouble -6468E-62 +} 0xb3d9fbf3c19b9a79 +test expr-28.345 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +53418 E111 x 15b1051df943a8_1000000000000000000001& E384 + convertToDouble +53418E111 +} 0x57f5b1051df943a9 +test expr-28.346 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -60513 E160 x -15043b64e56c72_1000000000000000000001& E547 + convertToDouble -60513E160 +} 0xe225043b64e56c73 +test expr-28.347 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +26709 E111 x 15b1051df943a8_1000000000000000000001& E383 + convertToDouble +26709E111 +} 0x57e5b1051df943a9 +test expr-28.348 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -99447 E166 x -10782189b336ae_1000000000000000000001& E568 + convertToDouble -99447E166 +} 0xe370782189b336af +test expr-28.349 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +12549 E48 x 10c52fe6dc6a1b_011111111111111111111110& E173 + convertToDouble +12549E48 +} 0x4ac0c52fe6dc6a1b +test expr-28.350 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -25098 E48 x -10c52fe6dc6a1b_011111111111111111111110& E174 + convertToDouble -25098E48 +} 0xcad0c52fe6dc6a1b +test expr-28.351 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +50196 E48 x 10c52fe6dc6a1b_011111111111111111111110& E175 + convertToDouble +50196E48 +} 0x4ae0c52fe6dc6a1b +test expr-28.352 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -62745 E47 x -10c52fe6dc6a1b_011111111111111111111110& E172 + convertToDouble -62745E47 +} 0xcab0c52fe6dc6a1b +test expr-28.353 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +83771 E-73 x 1ce886fb5ffd6d_0111111111111111111110& E-227 + convertToDouble +83771E-73 +} 0x31cce886fb5ffd6d +test expr-28.354 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -97451 E-167 x -1c0f220fb1c70d_01111111111111111111110& E-539 + convertToDouble -97451E-167 +} 0x9e4c0f220fb1c70d +test expr-28.355 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +86637 E-203 x 10943edb4e81db_0111111111111111111110& E-658 + convertToDouble +86637E-203 +} 0x16d0943edb4e81db +test expr-28.356 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -75569 E-254 x -15a462d91c6ab3_0111111111111111111111111110& E-828 + convertToDouble -75569E-254 +} 0x8c35a462d91c6ab3 +test expr-28.357 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +473806 E83 x 17d15bf3186080_1000000000000000000000001& E294 + convertToDouble +473806E83 +} 0x5257d15bf3186081 +test expr-28.358 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -947612 E83 x -17d15bf3186080_1000000000000000000000001& E295 + convertToDouble -947612E83 +} 0xd267d15bf3186081 +test expr-28.359 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +292369 E76 x 18a85eb277e644_100000000000000000000000001& E270 + convertToDouble +292369E76 +} 0x50d8a85eb277e645 +test expr-28.360 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -584738 E76 x -18a85eb277e644_100000000000000000000000001& E271 + convertToDouble -584738E76 +} 0xd0e8a85eb277e645 +test expr-28.361 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +933587 E-140 x 1b248728b9c116_100000000000000000000000001& E-446 + convertToDouble +933587E-140 +} 0x241b248728b9c117 +test expr-28.362 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -720919 E-14 x -1ef696965cbf04_10000000000000000000000001& E-28 + convertToDouble -720919E-14 +} 0xbe3ef696965cbf05 +test expr-28.363 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +535001 E-149 x 10b38e07c745ae_1000000000000000000000001& E-476 + convertToDouble +535001E-149 +} 0x2230b38e07c745af +test expr-28.364 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -890521 E-235 x -114828ee39c852_1000000000000000000000001& E-761 + convertToDouble -890521E-235 +} 0x90614828ee39c853 +test expr-28.365 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +548057 E81 x 11a1d9135cca53_0111111111111111111111110& E288 + convertToDouble +548057E81 +} 0x51f1a1d9135cca53 +test expr-28.366 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -706181 E88 x -1b156ac4c2d1e5_0111111111111111111111110& E311 + convertToDouble -706181E88 +} 0xd36b156ac4c2d1e5 +test expr-28.367 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +820997 E106 x 1b4f8b64fa125d_0111111111111111111111110& E371 + convertToDouble +820997E106 +} 0x572b4f8b64fa125d +test expr-28.368 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -320681 E63 x -17ca18a876c5ef_0111111111111111111111110& E227 + convertToDouble -320681E63 +} 0xce27ca18a876c5ef +test expr-28.369 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +928609 E-261 x 1be2dd66200bef_011111111111111111111111111110& E-848 + convertToDouble +928609E-261 +} 0x0afbe2dd66200bef +test expr-28.370 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -302276 E-254 x -15a462d91c6ab3_0111111111111111111111111110& E-826 + convertToDouble -302276E-254 +} 0x8c55a462d91c6ab3 +test expr-28.371 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +151138 E-254 x 15a462d91c6ab3_0111111111111111111111111110& E-827 + convertToDouble +151138E-254 +} 0x0c45a462d91c6ab3 +test expr-28.372 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +4691773 E45 x 19147b9330eaae_1000000000000000000000000001& E171 + convertToDouble +4691773E45 +} 0x4aa9147b9330eaaf +test expr-28.373 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -9383546 E45 x -19147b9330eaae_1000000000000000000000000001& E172 + convertToDouble -9383546E45 +} 0xcab9147b9330eaaf +test expr-28.374 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +3059949 E-243 x 13ecf22ea07862_10000000000000000000000000001& E-786 + convertToDouble +3059949E-243 +} 0x0ed3ecf22ea07863 +test expr-28.375 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -6119898 E-243 x -13ecf22ea07862_10000000000000000000000000001& E-785 + convertToDouble -6119898E-243 +} 0x8ee3ecf22ea07863 +test expr-28.376 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +5356626 E-213 x 1b84252abdf6ba_100000000000000000000000001& E-686 + convertToDouble +5356626E-213 +} 0x151b84252abdf6bb +test expr-28.377 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -4877378 E-199 x -11cd5cd90cb200_100000000000000000000000001& E-639 + convertToDouble -4877378E-199 +} 0x9801cd5cd90cb201 +test expr-28.378 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +7716693 E223 x 1972d9d2cff683_01111111111111111111111111110& E763 + convertToDouble +7716693E223 +} 0x6fa972d9d2cff683 +test expr-28.379 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -5452869 E109 x -16247b136fecc3_01111111111111111111111111110& E384 + convertToDouble -5452869E109 +} 0xd7f6247b136fecc3 +test expr-28.380 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +4590831 E156 x 14689b4a5fa201_011111111111111111111111111110& E540 + convertToDouble +4590831E156 +} 0x61b4689b4a5fa201 +test expr-28.381 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -9181662 E156 x -14689b4a5fa201_011111111111111111111111111110& E541 + convertToDouble -9181662E156 +} 0xe1c4689b4a5fa201 +test expr-28.382 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -3714436 E-261 x -1be2dd66200bef_011111111111111111111111111110& E-846 + convertToDouble -3714436E-261 +} 0x8b1be2dd66200bef +test expr-28.383 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +4643045 E-262 x 1be2dd66200bef_011111111111111111111111111110& E-849 + convertToDouble +4643045E-262 +} 0x0aebe2dd66200bef +test expr-28.384 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -7428872 E-261 x -1be2dd66200bef_011111111111111111111111111110& E-845 + convertToDouble -7428872E-261 +} 0x8b2be2dd66200bef +test expr-28.385 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +52942146 E130 x 16c31d08af89c2_10000000000000000000000000000001& E457 + convertToDouble +52942146E130 +} 0x5c86c31d08af89c3 +test expr-28.386 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -27966061 E145 x -155bcf72fd10f8_1000000000000000000000000000000001& E506 + convertToDouble -27966061E145 +} 0xdf955bcf72fd10f9 +test expr-28.387 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +26471073 E130 x 16c31d08af89c2_10000000000000000000000000000001& E456 + convertToDouble +26471073E130 +} 0x5c76c31d08af89c3 +test expr-28.388 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -55932122 E145 x -155bcf72fd10f8_1000000000000000000000000000000001& E507 + convertToDouble -55932122E145 +} 0xdfa55bcf72fd10f9 +test expr-28.389 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +95412548 E-99 x 18e0bfb98864c8_100000000000000000000000000000001& E-303 + convertToDouble +95412548E-99 +} 0x2d08e0bfb98864c9 +test expr-28.390 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -47706274 E-99 x -18e0bfb98864c8_100000000000000000000000000000001& E-304 + convertToDouble -47706274E-99 +} 0xacf8e0bfb98864c9 +test expr-28.391 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +23853137 E-99 x 18e0bfb98864c8_100000000000000000000000000000001& E-305 + convertToDouble +23853137E-99 +} 0x2ce8e0bfb98864c9 +test expr-28.392 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -78493654 E-301 x -140d76077b648e_10000000000000000000000000000001& E-974 + convertToDouble -78493654E-301 +} 0x83140d76077b648f +test expr-28.393 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +65346417 E29 x 13aa1ad778f23b_0111111111111111111111111111110& E122 + convertToDouble +65346417E29 +} 0x4793aa1ad778f23b +test expr-28.394 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -51083099 E167 x -14a75eb58df47b_0111111111111111111111111111110& E580 + convertToDouble -51083099E167 +} 0xe434a75eb58df47b +test expr-28.395 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +89396333 E264 x 1526f061ca9053_0111111111111111111111111111111110& E903 + convertToDouble +89396333E264 +} 0x786526f061ca9053 +test expr-28.396 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -84863171 E114 x -106e98f5ec8f37_0111111111111111111111111111111110& E405 + convertToDouble -84863171E114 +} 0xd9406e98f5ec8f37 +test expr-28.397 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +59540836 E-251 x 10430c2d075c07_011111111111111111111111111111110& E-808 + convertToDouble +59540836E-251 +} 0x0d70430c2d075c07 +test expr-28.398 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -74426045 E-252 x -10430c2d075c07_011111111111111111111111111111110& E-811 + convertToDouble -74426045E-252 +} 0x8d40430c2d075c07 +test expr-28.399 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +14885209 E-251 x 10430c2d075c07_011111111111111111111111111111110& E-810 + convertToDouble +14885209E-251 +} 0x0d50430c2d075c07 +test expr-28.400 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -29770418 E-251 x -10430c2d075c07_011111111111111111111111111111110& E-809 + convertToDouble -29770418E-251 +} 0x8d60430c2d075c07 +test expr-28.401 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +982161308 E122 x 11b6231e18c5ca_100000000000000000000000000000000000000001& E435 + convertToDouble +982161308E122 +} 0x5b21b6231e18c5cb +test expr-28.402 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -245540327 E122 x -11b6231e18c5ca_100000000000000000000000000000000000000001& E433 + convertToDouble -245540327E122 +} 0xdb01b6231e18c5cb +test expr-28.403 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +491080654 E122 x 11b6231e18c5ca_100000000000000000000000000000000000000001& E434 + convertToDouble +491080654E122 +} 0x5b11b6231e18c5cb +test expr-28.404 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +525452622 E-310 x 12045136ce0340_1000000000000000000000000000000000001& E-1001 + convertToDouble +525452622E-310 +} 0x0162045136ce0341 +test expr-28.405 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -771837113 E-134 x -14e61f991c4ed0_100000000000000000000000000000000001& E-416 + convertToDouble -771837113E-134 +} 0xa5f4e61f991c4ed1 +test expr-28.406 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +820858081 E-150 x 14050669985a86_10000000000000000000000000000000001& E-469 + convertToDouble +820858081E-150 +} 0x22a4050669985a87 +test expr-28.407 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -262726311 E-310 x -12045136ce0340_1000000000000000000000000000000000001& E-1002 + convertToDouble -262726311E-310 +} 0x8152045136ce0341 +test expr-28.408 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +923091487 E209 x 10bc60e6896717_011111111111111111111111111111111110& E724 + convertToDouble +923091487E209 +} 0x6d30bc60e6896717 +test expr-28.409 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -653777767 E273 x -120223f2b3a881_0111111111111111111111111111111111111110& E936 + convertToDouble -653777767E273 +} 0xfa720223f2b3a881 +test expr-28.410 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +842116236 E-53 x 1809c5732cdc7f_0111111111111111111111111111111110& E-147 + convertToDouble +842116236E-53 +} 0x36c809c5732cdc7f +test expr-28.411 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -741111169 E-202 x -15a3e1d1b73099_01111111111111111111111111111111110& E-642 + convertToDouble -741111169E-202 +} 0x97d5a3e1d1b73099 +test expr-28.412 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +839507247 E-284 x 129a1effc50859_0111111111111111111111111111111110& E-914 + convertToDouble +839507247E-284 +} 0x06d29a1effc50859 +test expr-28.413 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -951487269 E-264 x -1c92befccb5f59_0111111111111111111111111111111110& E-848 + convertToDouble -951487269E-264 +} 0x8afc92befccb5f59 +test expr-28.414 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -9821613080 E121 x -11b6231e18c5ca_100000000000000000000000000000000000000001& E435 + convertToDouble -9821613080E121 +} 0xdb21b6231e18c5cb +test expr-28.415 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +6677856011 E-31 x 193a6d11077292_100000000000000000000000000000000000001& E-71 + convertToDouble +6677856011E-31 +} 0x3b893a6d11077293 +test expr-28.416 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -3573796826 E-266 x -112be2041a79fc_100000000000000000000000000000000000001& E-852 + convertToDouble -3573796826E-266 +} 0x8ab12be2041a79fd +test expr-28.417 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +7147593652 E-266 x 112be2041a79fc_100000000000000000000000000000000000001& E-851 + convertToDouble +7147593652E-266 +} 0x0ac12be2041a79fd +test expr-28.418 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -9981396317 E-181 x -1edbd94cb50054_100000000000000000000000000000000000001& E-569 + convertToDouble -9981396317E-181 +} 0x9c6edbd94cb50055 +test expr-28.419 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +3268888835 E272 x 120223f2b3a881_0111111111111111111111111111111111111110& E935 + convertToDouble +3268888835E272 +} 0x7a620223f2b3a881 +test expr-28.420 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -2615111068 E273 x -120223f2b3a881_0111111111111111111111111111111111111110& E938 + convertToDouble -2615111068E273 +} 0xfa920223f2b3a881 +test expr-28.421 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +1307555534 E273 x 120223f2b3a881_0111111111111111111111111111111111111110& E937 + convertToDouble +1307555534E273 +} 0x7a820223f2b3a881 +test expr-28.422 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +2990671154 E-190 x 13db11ac608107_01111111111111111111111111111111111111110& E-600 + convertToDouble +2990671154E-190 +} 0x1a73db11ac608107 +test expr-28.423 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -1495335577 E-190 x -13db11ac608107_01111111111111111111111111111111111111110& E-601 + convertToDouble -1495335577E-190 +} 0x9a63db11ac608107 +test expr-28.424 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +5981342308 E-190 x 13db11ac608107_01111111111111111111111111111111111111110& E-599 + convertToDouble +5981342308E-190 +} 0x1a83db11ac608107 +test expr-28.425 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -7476677885 E-191 x -13db11ac608107_01111111111111111111111111111111111111110& E-602 + convertToDouble -7476677885E-191 +} 0x9a53db11ac608107 +test expr-28.426 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +82259684194 E-202 x 12c3e72d179606_1000000000000000000000000000000000000000001& E-635 + convertToDouble +82259684194E-202 +} 0x1842c3e72d179607 +test expr-28.427 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -93227267727 E-49 x -1960fe08d5847e_100000000000000000000000000000000000000001& E-127 + convertToDouble -93227267727E-49 +} 0xb80960fe08d5847f +test expr-28.428 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +41129842097 E-202 x 12c3e72d179606_1000000000000000000000000000000000000000001& E-636 + convertToDouble +41129842097E-202 +} 0x1832c3e72d179607 +test expr-28.429 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -47584241418 E-314 x -14e25dd3747e96_10000000000000000000000000000000000000001& E-1008 + convertToDouble -47584241418E-314 +} 0x80f4e25dd3747e97 +test expr-28.430 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -79360293406 E92 x -1c58a00bb31863_01111111111111111111111111111111111111110& E341 + convertToDouble -79360293406E92 +} 0xd54c58a00bb31863 +test expr-28.431 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +57332259349 E225 x 120811f528378b_01111111111111111111111111111111111111110& E783 + convertToDouble +57332259349E225 +} 0x70e20811f528378b +test expr-28.432 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -57202326162 E111 x -1626f1c480545b_01111111111111111111111111111111111111110& E404 + convertToDouble -57202326162E111 +} 0xd93626f1c480545b +test expr-28.433 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +86860597053 E-206 x 103b77d2b969d9_0111111111111111111111111111111111111111110& E-648 + convertToDouble +86860597053E-206 +} 0x17703b77d2b969d9 +test expr-28.434 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -53827010643 E-200 x -132fa69a69bd6d_0111111111111111111111111111111111111111110& E-629 + convertToDouble -53827010643E-200 +} 0x98a32fa69a69bd6d +test expr-28.435 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +53587107423 E-61 x 100a19a3ffd981_011111111111111111111111111111111111111111110& E-167 + convertToDouble +53587107423E-61 +} 0x35800a19a3ffd981 +test expr-28.436 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +635007636765 E200 x 1824e73a4f030e_100000000000000000000000000000000000000000001& E703 + convertToDouble +635007636765E200 +} 0x6be824e73a4f030f +test expr-28.437 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +508006109412 E201 x 1824e73a4f030e_100000000000000000000000000000000000000000001& E706 + convertToDouble +508006109412E201 +} 0x6c1824e73a4f030f +test expr-28.438 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -254003054706 E201 x -1824e73a4f030e_100000000000000000000000000000000000000000001& E705 + convertToDouble -254003054706E201 +} 0xec0824e73a4f030f +test expr-28.439 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +561029718715 E-72 x 1cd96a6972a14a_100000000000000000000000000000000000000000001& E-201 + convertToDouble +561029718715E-72 +} 0x336cd96a6972a14b +test expr-28.440 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -897647549944 E-71 x -1cd96a6972a14a_100000000000000000000000000000000000000000001& E-197 + convertToDouble -897647549944E-71 +} 0xb3acd96a6972a14b +test expr-28.441 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +112205943743 E-71 x 1cd96a6972a14a_100000000000000000000000000000000000000000001& E-200 + convertToDouble +112205943743E-71 +} 0x337cd96a6972a14b +test expr-28.442 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -873947086081 E-236 x -19e117541d04e6_1000000000000000000000000000000000000000000001& E-745 + convertToDouble -873947086081E-236 +} 0x9169e117541d04e7 +test expr-28.443 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +809184709177 E116 x 1de27e59fb0679_011111111111111111111111111111111111111111110& E424 + convertToDouble +809184709177E116 +} 0x5a7de27e59fb0679 +test expr-28.444 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -573112917422 E81 x -11958b36c5102b_01111111111111111111111111111111111111111111110& E308 + convertToDouble -573112917422E81 +} 0xd331958b36c5102b +test expr-28.445 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +286556458711 E81 x 11958b36c5102b_01111111111111111111111111111111111111111111110& E307 + convertToDouble +286556458711E81 +} 0x5321958b36c5102b +test expr-28.446 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +952805821491 E-259 x 1551767ef8a9a3_011111111111111111111111111111111111111111110& E-821 + convertToDouble +952805821491E-259 +} 0x0ca551767ef8a9a3 +test expr-28.447 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -132189992873 E-44 x -1b746cf242410b_011111111111111111111111111111111111111111110& E-110 + convertToDouble -132189992873E-44 +} 0xb91b746cf242410b +test expr-28.448 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -173696038493 E-144 x -1f8fefbb3249d3_011111111111111111111111111111111111111111110& E-442 + convertToDouble -173696038493E-144 +} 0xa45f8fefbb3249d3 +test expr-28.449 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +1831132757599 E-107 x 138e6edd48f2a2_1000000000000000000000000000000000000000000000001& E-315 + convertToDouble +1831132757599E-107 +} 0x2c438e6edd48f2a3 +test expr-28.450 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -9155663787995 E-108 x -138e6edd48f2a2_1000000000000000000000000000000000000000000000001& E-316 + convertToDouble -9155663787995E-108 +} 0xac338e6edd48f2a3 +test expr-28.451 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +7324531030396 E-107 x 138e6edd48f2a2_1000000000000000000000000000000000000000000000001& E-313 + convertToDouble +7324531030396E-107 +} 0x2c638e6edd48f2a3 +test expr-28.452 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -9277338894969 E-200 x -19d5a44fd99a6a_1000000000000000000000000000000000000000000000001& E-622 + convertToDouble -9277338894969E-200 +} 0x9919d5a44fd99a6b +test expr-28.453 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +8188292423973 E287 x 1390273bf8f983_0111111111111111111111111111111111111111111111110& E996 + convertToDouble +8188292423973E287 +} 0x7e3390273bf8f983 +test expr-28.454 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -5672557437938 E59 x -148c2bd60a1523_011111111111111111111111111111111111111111111110& E238 + convertToDouble -5672557437938E59 +} 0xced48c2bd60a1523 +test expr-28.455 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +2836278718969 E59 x 148c2bd60a1523_011111111111111111111111111111111111111111111110& E237 + convertToDouble +2836278718969E59 +} 0x4ec48c2bd60a1523 +test expr-28.456 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -9995153153494 E54 x -17ba37c4fbe993_01111111111111111111111111111111111111111111110& E222 + convertToDouble -9995153153494E54 +} 0xcdd7ba37c4fbe993 +test expr-28.457 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +9224786422069 E-291 x 14ee5d56b32957_011111111111111111111111111111111111111111111111110& E-924 + convertToDouble +9224786422069E-291 +} 0x0634ee5d56b32957 +test expr-28.458 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -3142213164987 E-294 x -1d3409dfbca26f_011111111111111111111111111111111111111111111111110& E-936 + convertToDouble -3142213164987E-294 +} 0x857d3409dfbca26f +test expr-28.459 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +6284426329974 E-294 x 1d3409dfbca26f_011111111111111111111111111111111111111111111111110& E-935 + convertToDouble +6284426329974E-294 +} 0x058d3409dfbca26f +test expr-28.460 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -8340483752889 E-301 x -10419183e44b91_01111111111111111111111111111111111111111111111110& E-957 + convertToDouble -8340483752889E-301 +} 0x8420419183e44b91 +test expr-28.461 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +67039371486466 E89 x 17f203339c9628_10000000000000000000000000000000000000000000000000001& E341 + convertToDouble +67039371486466E89 +} 0x5547f203339c9629 +test expr-28.462 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -62150786615239 E197 x -12e79a035b9714_1000000000000000000000000000000000000000000000000001& E700 + convertToDouble -62150786615239E197 +} 0xebb2e79a035b9715 +test expr-28.463 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +33519685743233 E89 x 17f203339c9628_10000000000000000000000000000000000000000000000000001& E340 + convertToDouble +33519685743233E89 +} 0x5537f203339c9629 +test expr-28.464 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -52563419496999 E156 x -1bdb17625bf6e6_1000000000000000000000000000000000000000000000000001& E563 + convertToDouble -52563419496999E156 +} 0xe32bdb17625bf6e7 +test expr-28.465 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +32599460466991 E-65 x 1f395d4c779d8e_1000000000000000000000000000000000000000000000000001& E-172 + convertToDouble +32599460466991E-65 +} 0x353f395d4c779d8f +test expr-28.466 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -41010988798007 E-133 x -152e1c9e04ee06_100000000000000000000000000000000000000000000000001& E-397 + convertToDouble -41010988798007E-133 +} 0xa7252e1c9e04ee07 +test expr-28.467 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +65198920933982 E-65 x 1f395d4c779d8e_1000000000000000000000000000000000000000000000000001& E-171 + convertToDouble +65198920933982E-65 +} 0x354f395d4c779d8f +test expr-28.468 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -82021977596014 E-133 x -152e1c9e04ee06_100000000000000000000000000000000000000000000000001& E-396 + convertToDouble -82021977596014E-133 +} 0xa7352e1c9e04ee07 +test expr-28.469 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +80527976643809 E61 x 1c7c5aea080a49_0111111111111111111111111111111111111111111111111110& E248 + convertToDouble +80527976643809E61 +} 0x4f7c7c5aea080a49 +test expr-28.470 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -74712611505209 E158 x -1eeebe9ea010f3_011111111111111111111111111111111111111111111111110& E570 + convertToDouble -74712611505209E158 +} 0xe39eeebe9ea010f3 +test expr-28.471 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +53390939710959 E261 x 18ac6d426a1cb1_0111111111111111111111111111111111111111111111111110& E912 + convertToDouble +53390939710959E261 +} 0x78f8ac6d426a1cb1 +test expr-28.472 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -69277302659155 E225 x -1547166a3a2b0f_011111111111111111111111111111111111111111111111110& E793 + convertToDouble -69277302659155E225 +} 0xf18547166a3a2b0f +test expr-28.473 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +46202199371337 E-72 x 128f9edfbd341f_0111111111111111111111111111111111111111111111111111111110& E-194 + convertToDouble +46202199371337E-72 +} 0x33d28f9edfbd341f +test expr-28.474 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -23438635467783 E-179 x -1ba485b99e47af_0111111111111111111111111111111111111111111111111110& E-551 + convertToDouble -23438635467783E-179 +} 0x9d8ba485b99e47af +test expr-28.475 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +41921560615349 E-67 x 19b2a5c4041e4b_0111111111111111111111111111111111111111111111111110& E-178 + convertToDouble +41921560615349E-67 +} 0x34d9b2a5c4041e4b +test expr-28.476 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -92404398742674 E-72 x -128f9edfbd341f_0111111111111111111111111111111111111111111111111111111110& E-193 + convertToDouble -92404398742674E-72 +} 0xb3e28f9edfbd341f +test expr-28.477 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +738545606647197 E124 x 13d8886a766a20_100000000000000000000000000000000000000000000000000001& E461 + convertToDouble +738545606647197E124 +} 0x5cc3d8886a766a21 +test expr-28.478 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -972708181182949 E117 x -15ed1f039cebfe_1000000000000000000000000000000000000000000000000000001& E438 + convertToDouble -972708181182949E117 +} 0xdb55ed1f039cebff +test expr-28.479 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -837992143580825 E87 x -17f203339c9628_10000000000000000000000000000000000000000000000000001& E338 + convertToDouble -837992143580825E87 +} 0xd517f203339c9629 +test expr-28.480 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +609610927149051 E-255 x 104273b18918b0_100000000000000000000000000000000000000000000000000000001& E-798 + convertToDouble +609610927149051E-255 +} 0x0e104273b18918b1 +test expr-28.481 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -475603213226859 E-41 x -178cfcab31064c_10000000000000000000000000000000000000000000000000000001& E-88 + convertToDouble -475603213226859E-41 +} 0xba778cfcab31064d +test expr-28.482 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +563002800671023 E-177 x 1035e7b5183922_10000000000000000000000000000000000000000000000000000001& E-539 + convertToDouble +563002800671023E-177 +} 0x1e4035e7b5183923 +test expr-28.483 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -951206426453718 E-41 x -178cfcab31064c_10000000000000000000000000000000000000000000000000000001& E-87 + convertToDouble -951206426453718E-41 +} 0xba878cfcab31064d +test expr-28.484 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +805416432656519 E202 x 175d226331d039_01111111111111111111111111111111111111111111111111111110& E720 + convertToDouble +805416432656519E202 +} 0x6cf75d226331d039 +test expr-28.485 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -530658674694337 E159 x -112a13daa46fe3_0111111111111111111111111111111111111111111111111111110& E577 + convertToDouble -530658674694337E159 +} 0xe4012a13daa46fe3 +test expr-28.486 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +946574173863918 E208 x 1a2fbffdb7580b_011111111111111111111111111111111111111111111111111110& E740 + convertToDouble +946574173863918E208 +} 0x6e3a2fbffdb7580b +test expr-28.487 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -318329953318553 E113 x -178358811cbc95_011111111111111111111111111111111111111111111111111110& E423 + convertToDouble -318329953318553E113 +} 0xda678358811cbc95 +test expr-28.488 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -462021993713370 E-73 x -128f9edfbd341f_0111111111111111111111111111111111111111111111111111111110& E-194 + convertToDouble -462021993713370E-73 +} 0xb3d28f9edfbd341f +test expr-28.489 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +369617594970696 E-72 x 128f9edfbd341f_0111111111111111111111111111111111111111111111111111111110& E-191 + convertToDouble +369617594970696E-72 +} 0x34028f9edfbd341f +test expr-28.490 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +3666156212014994 E233 x 1a37935f3b71c8_100000000000000000000000000000000000000000000000000000001& E825 + convertToDouble +3666156212014994E233 +} 0x738a37935f3b71c9 +test expr-28.491 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -1833078106007497 E233 x -1a37935f3b71c8_100000000000000000000000000000000000000000000000000000001& E824 + convertToDouble -1833078106007497E233 +} 0xf37a37935f3b71c9 +test expr-28.492 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +8301790508624232 E174 x 1dcfee6690ffc6_100000000000000000000000000000000000000000000000000000001& E630 + convertToDouble +8301790508624232E174 +} 0x675dcfee6690ffc7 +test expr-28.493 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -1037723813578029 E174 x -1dcfee6690ffc6_100000000000000000000000000000000000000000000000000000001& E627 + convertToDouble -1037723813578029E174 +} 0xe72dcfee6690ffc7 +test expr-28.494 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +7297662880581139 E-286 x 18ac8c79e1ff18_1000000000000000000000000000000000000000000000000000000000001& E-898 + convertToDouble +7297662880581139E-286 +} 0x07d8ac8c79e1ff19 +test expr-28.495 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -5106185698912191 E-276 x -141934d77659be_1000000000000000000000000000000000000000000000000000000000001& E-865 + convertToDouble -5106185698912191E-276 +} 0x89e41934d77659bf +test expr-28.496 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +7487252720986826 E-165 x 18823a57adbef8_100000000000000000000000000000000000000000000000000000000000001& E-496 + convertToDouble +7487252720986826E-165 +} 0x20f8823a57adbef9 +test expr-28.497 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -3743626360493413 E-165 x -18823a57adbef8_100000000000000000000000000000000000000000000000000000000000001& E-497 + convertToDouble -3743626360493413E-165 +} 0xa0e8823a57adbef9 +test expr-28.498 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +3773057430100257 E230 x 1ba10d818fdafd_0111111111111111111111111111111111111111111111111111111110& E815 + convertToDouble +3773057430100257E230 +} 0x72eba10d818fdafd +test expr-28.499 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -7546114860200514 E230 x -1ba10d818fdafd_0111111111111111111111111111111111111111111111111111111110& E816 + convertToDouble -7546114860200514E230 +} 0xf2fba10d818fdafd +test expr-28.500 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +4321222892463822 E58 x 18750ea732fdad_011111111111111111111111111111111111111111111111111111110& E244 + convertToDouble +4321222892463822E58 +} 0x4f38750ea732fdad +test expr-28.501 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -7793560217139653 E51 x -1280461b856ec5_0111111111111111111111111111111111111111111111111111111110& E222 + convertToDouble -7793560217139653E51 +} 0xcdd280461b856ec5 +test expr-28.502 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +26525993941010681 E112 x 187dcbf6ad5cf8_10000000000000000000000000000000000000000000000000000000000001& E426 + convertToDouble +26525993941010681E112 +} 0x5a987dcbf6ad5cf9 +test expr-28.503 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -53051987882021362 E112 x -187dcbf6ad5cf8_10000000000000000000000000000000000000000000000000000000000001& E427 + convertToDouble -53051987882021362E112 +} 0xdaa87dcbf6ad5cf9 +test expr-28.504 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +72844871414247907 E77 x 1bf00baf60b70c_100000000000000000000000000000000000000000000000000000000001& E311 + convertToDouble +72844871414247907E77 +} 0x536bf00baf60b70d +test expr-28.505 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -88839359596763261 E105 x -1133b1a33a1108_100000000000000000000000000000000000000000000000000000000001& E405 + convertToDouble -88839359596763261E105 +} 0xd94133b1a33a1109 +test expr-28.506 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +18718131802467065 E-166 x 18823a57adbef8_100000000000000000000000000000000000000000000000000000000000001& E-498 + convertToDouble +18718131802467065E-166 +} 0x20d8823a57adbef9 +test expr-28.507 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -14974505441973652 E-165 x -18823a57adbef8_100000000000000000000000000000000000000000000000000000000000001& E-495 + convertToDouble -14974505441973652E-165 +} 0xa108823a57adbef9 +test expr-28.508 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +73429396004640239 E106 x 11c5cb19ef3451_01111111111111111111111111111111111111111111111111111111111110& E408 + convertToDouble +73429396004640239E106 +} 0x5971c5cb19ef3451 +test expr-28.509 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -58483921078398283 E57 x -108ce499519ce3_0111111111111111111111111111111111111111111111111111111111111110& E245 + convertToDouble -58483921078398283E57 +} 0xcf408ce499519ce3 +test expr-28.510 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +41391519190645203 E165 x 13f33667156017_011111111111111111111111111111111111111111111111111111111111110& E603 + convertToDouble +41391519190645203E165 +} 0x65a3f33667156017 +test expr-28.511 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -82783038381290406 E165 x -13f33667156017_011111111111111111111111111111111111111111111111111111111111110& E604 + convertToDouble -82783038381290406E165 +} 0xe5b3f33667156017 +test expr-28.512 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +58767043776702677 E-163 x 12c92fee3a3867_0111111111111111111111111111111111111111111111111111111111110& E-486 + convertToDouble +58767043776702677E-163 +} 0x2192c92fee3a3867 +test expr-28.513 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -90506231831231999 E-129 x -1bdc4114397ff3_01111111111111111111111111111111111111111111111111111111111110& E-373 + convertToDouble -90506231831231999E-129 +} 0xa8abdc4114397ff3 +test expr-28.514 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +64409240769861689 E-159 x 192238f7987779_011111111111111111111111111111111111111111111111111111111111110& E-473 + convertToDouble +64409240769861689E-159 +} 0x22692238f7987779 +test expr-28.515 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -77305427432277771 E-190 x -1e978b7780b613_0111111111111111111111111111111111111111111111111111111111110& E-576 + convertToDouble -77305427432277771E-190 +} 0x9bfe978b7780b613 +test expr-28.516 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +476592356619258326 E273 x 1873cf8ee72812_10000000000000000000000000000000000000000000000000000000000000001& E965 + convertToDouble +476592356619258326E273 +} 0x7c4873cf8ee72813 +test expr-28.517 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -953184713238516652 E273 x -1873cf8ee72812_10000000000000000000000000000000000000000000000000000000000000001& E966 + convertToDouble -953184713238516652E273 +} 0xfc5873cf8ee72813 +test expr-28.518 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +899810892172646163 E283 x 1adf51fa055e02_100000000000000000000000000000000000000000000000000000000000000000001& E999 + convertToDouble +899810892172646163E283 +} 0x7e6adf51fa055e03 +test expr-28.519 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -929167076892018333 E187 x -1da2c42fce2bc4_10000000000000000000000000000000000000000000000000000000000000000001& E680 + convertToDouble -929167076892018333E187 +} 0xea7da2c42fce2bc5 +test expr-28.520 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +647761278967534239 E-312 x 1a7a2476ec0b3e_10000000000000000000000000000000000000000000000000000000000000001& E-978 + convertToDouble +647761278967534239E-312 +} 0x02da7a2476ec0b3f +test expr-28.521 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -644290479820542942 E-180 x -128d1407dfa832_10000000000000000000000000000000000000000000000000000000000000001& E-539 + convertToDouble -644290479820542942E-180 +} 0x9e428d1407dfa833 +test expr-28.522 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +926145344610700019 E-225 x 1307a67f1f69fe_10000000000000000000000000000000000000000000000000000000000000000001& E-688 + convertToDouble +926145344610700019E-225 +} 0x14f307a67f1f69ff +test expr-28.523 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -958507931896511964 E-246 x -17406753df2f0c_10000000000000000000000000000000000000000000000000000000000000001& E-758 + convertToDouble -958507931896511964E-246 +} 0x9097406753df2f0d +test expr-28.524 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +272104041512242479 E200 x 13bbb4bf05f087_011111111111111111111111111111111111111111111111111111111111111111111110& E722 + convertToDouble +272104041512242479E200 +} 0x6d13bbb4bf05f087 +test expr-28.525 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -792644927852378159 E79 x -1daff0048f3ec7_011111111111111111111111111111111111111111111111111111111111111111110& E321 + convertToDouble -792644927852378159E79 +} 0xd40daff0048f3ec7 +test expr-28.526 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +544208083024484958 E200 x 13bbb4bf05f087_011111111111111111111111111111111111111111111111111111111111111111111110& E723 + convertToDouble +544208083024484958E200 +} 0x6d23bbb4bf05f087 +test expr-28.527 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -929963218616126365 E290 x -108dcc0c505461_01111111111111111111111111111111111111111111111111111111111111110& E1023 + convertToDouble -929963218616126365E290 +} 0xffe08dcc0c505461 +test expr-28.528 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +305574339166810102 E-219 x 17f399fe02c4b9_011111111111111111111111111111111111111111111111111111111111111110& E-670 + convertToDouble +305574339166810102E-219 +} 0x1617f399fe02c4b9 +test expr-28.529 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -152787169583405051 E-219 x -17f399fe02c4b9_011111111111111111111111111111111111111111111111111111111111111110& E-671 + convertToDouble -152787169583405051E-219 +} 0x9607f399fe02c4b9 +test expr-28.530 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +611148678333620204 E-219 x 17f399fe02c4b9_011111111111111111111111111111111111111111111111111111111111111110& E-669 + convertToDouble +611148678333620204E-219 +} 0x1627f399fe02c4b9 +test expr-28.531 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -763935847917025255 E-220 x -17f399fe02c4b9_011111111111111111111111111111111111111111111111111111111111111110& E-672 + convertToDouble -763935847917025255E-220 +} 0x95f7f399fe02c4b9 +test expr-28.532 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +7439550220920798612 E158 x 177fe14f40159a_10000000000000000000000000000000000000000000000000000000000000000000001& E587 + convertToDouble +7439550220920798612E158 +} 0x64a77fe14f40159b +test expr-28.533 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -3719775110460399306 E158 x -177fe14f40159a_10000000000000000000000000000000000000000000000000000000000000000000001& E586 + convertToDouble -3719775110460399306E158 +} 0xe4977fe14f40159b +test expr-28.534 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +9299437776150998265 E157 x 177fe14f40159a_10000000000000000000000000000000000000000000000000000000000000000000001& E584 + convertToDouble +9299437776150998265E157 +} 0x64777fe14f40159b +test expr-28.535 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -7120190517612959703 E120 x -13220dcd5899fc_1000000000000000000000000000000000000000000000000000000000000000000000001& E461 + convertToDouble -7120190517612959703E120 +} 0xdcc3220dcd5899fd +test expr-28.536 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +3507665085003296281 E-73 x 11339818257f0e_100000000000000000000000000000000000000000000000000000000000000000000001& E-181 + convertToDouble +3507665085003296281E-73 +} 0x34a1339818257f0f +test expr-28.537 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -7015330170006592562 E-73 x -11339818257f0e_100000000000000000000000000000000000000000000000000000000000000000000001& E-180 + convertToDouble -7015330170006592562E-73 +} 0xb4b1339818257f0f +test expr-28.538 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -6684428762278255956 E-294 x -1d9f82a1a6b1b8_10000000000000000000000000000000000000000000000000000000000000000001& E-915 + convertToDouble -6684428762278255956E-294 +} 0x86cd9f82a1a6b1b9 +test expr-28.539 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -1088416166048969916 E200 x -13bbb4bf05f087_011111111111111111111111111111111111111111111111111111111111111111111110& E724 + convertToDouble -1088416166048969916E200 +} 0xed33bbb4bf05f087 +test expr-28.540 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -8707329328391759328 E200 x -13bbb4bf05f087_011111111111111111111111111111111111111111111111111111111111111111111110& E727 + convertToDouble -8707329328391759328E200 +} 0xed63bbb4bf05f087 +test expr-28.541 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +4439021781608558002 E-65 x 1038168b71e2c9_01111111111111111111111111111111111111111111111111111111111111111110& E-154 + convertToDouble +4439021781608558002E-65 +} 0x365038168b71e2c9 +test expr-28.542 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -8878043563217116004 E-65 x -1038168b71e2c9_01111111111111111111111111111111111111111111111111111111111111111110& E-153 + convertToDouble -8878043563217116004E-65 +} 0xb66038168b71e2c9 +test expr-28.543 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +2219510890804279001 E-65 x 1038168b71e2c9_01111111111111111111111111111111111111111111111111111111111111111110& E-155 + convertToDouble +2219510890804279001E-65 +} 0x364038168b71e2c9 +test expr-28.544 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +33051223951904955802 E55 x 1762068a24fd54_1000000000000000000000000000000000000000000000000000000000000000000000001& E247 + convertToDouble +33051223951904955802E55 +} 0x4f6762068a24fd55 +test expr-28.545 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -56961524140903677624 E120 x -13220dcd5899fc_1000000000000000000000000000000000000000000000000000000000000000000000001& E464 + convertToDouble -56961524140903677624E120 +} 0xdcf3220dcd5899fd +test expr-28.546 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +71201905176129597030 E119 x 13220dcd5899fc_1000000000000000000000000000000000000000000000000000000000000000000000001& E461 + convertToDouble +71201905176129597030E119 +} 0x5cc3220dcd5899fd +test expr-28.547 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +14030660340013185124 E-73 x 11339818257f0e_100000000000000000000000000000000000000000000000000000000000000000000001& E-179 + convertToDouble +14030660340013185124E-73 +} 0x34c1339818257f0f +test expr-28.548 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -17538325425016481405 E-74 x -11339818257f0e_100000000000000000000000000000000000000000000000000000000000000000000001& E-182 + convertToDouble -17538325425016481405E-74 +} 0xb491339818257f0f +test expr-28.549 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +67536228609141569109 E-133 x 10a1b35cf2a635_01111111111111111111111111111111111111111111111111111111111111111111110& E-376 + convertToDouble +67536228609141569109E-133 +} 0x2870a1b35cf2a635 +test expr-28.550 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -35620497849450218807 E-306 x -15b22082529425_0111111111111111111111111111111111111111111111111111111111111111111111110& E-952 + convertToDouble -35620497849450218807E-306 +} 0x8475b22082529425 +test expr-28.551 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN +66550376797582521751 E-126 x 13897c0ede6c69_01111111111111111111111111111111111111111111111111111111111111111111110& E-353 + convertToDouble +66550376797582521751E-126 +} 0x29e3897c0ede6c69 +test expr-28.552 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b d UN -71240995698900437614 E-306 x -15b22082529425_0111111111111111111111111111111111111111111111111111111111111111111111110& E-951 + convertToDouble -71240995698900437614E-306 +} 0x8485b22082529425 +test expr-28.553 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +3 E24 x 13da329b633647_0001& E81 + convertToDouble +3E24 +} 0x4503da329b633647 +test expr-28.554 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -6 E24 x -13da329b633647_0001& E82 + convertToDouble -6E24 +} 0xc513da329b633647 +test expr-28.555 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +6 E26 x 1f04ef12cb04cf_0001& E88 + convertToDouble +6E26 +} 0x457f04ef12cb04cf +test expr-28.556 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -7 E25 x -1cf389cd46047d_0000001& E85 + convertToDouble -7E25 +} 0xc54cf389cd46047d +test expr-28.557 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +1 E-14 x 16849b86a12b9b_00000001& E-47 + convertToDouble +1E-14 +} 0x3d06849b86a12b9b +test expr-28.558 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -2 E-14 x -16849b86a12b9b_00000001& E-46 + convertToDouble -2E-14 +} 0xbd16849b86a12b9b +test expr-28.559 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +4 E-14 x 16849b86a12b9b_00000001& E-45 + convertToDouble +4E-14 +} 0x3d26849b86a12b9b +test expr-28.560 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -8 E-14 x -16849b86a12b9b_00000001& E-44 + convertToDouble -8E-14 +} 0xbd36849b86a12b9b +test expr-28.561 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +5 E26 x 19d971e4fe8401_1110& E88 + convertToDouble +5E26 +} 0x4579d971e4fe8402 +test expr-28.562 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -8 E27 x -19d971e4fe8401_1110& E92 + convertToDouble -8E27 +} 0xc5b9d971e4fe8402 +test expr-28.563 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +1 E27 x 19d971e4fe8401_1110& E89 + convertToDouble +1E27 +} 0x4589d971e4fe8402 +test expr-28.564 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -4 E27 x -19d971e4fe8401_1110& E91 + convertToDouble -4E27 +} 0xc5a9d971e4fe8402 +test expr-28.565 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +9 E-13 x 1faa7ab552a551_111110& E-41 + convertToDouble +9E-13 +} 0x3d6faa7ab552a552 +test expr-28.566 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -7 E-20 x -14a90ceafff9de_11110& E-64 + convertToDouble -7E-20 +} 0xbbf4a90ceafff9df +test expr-28.567 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +56 E25 x 1cf389cd46047d_0000001& E88 + convertToDouble +56E25 +} 0x457cf389cd46047d +test expr-28.568 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -70 E24 x -1cf389cd46047d_0000001& E85 + convertToDouble -70E24 +} 0xc54cf389cd46047d +test expr-28.569 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +51 E26 x 107a9f01fbda8e_0000001& E92 + convertToDouble +51E26 +} 0x45b07a9f01fbda8e +test expr-28.570 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +71 E-17 x 19949819f693d7_00000000001& E-51 + convertToDouble +71E-17 +} 0x3cc9949819f693d7 +test expr-28.571 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -31 E-5 x -1450efdc9c4da9_00000000001& E-12 + convertToDouble -31E-5 +} 0xbf3450efdc9c4da9 +test expr-28.572 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +62 E-5 x 1450efdc9c4da9_00000000001& E-11 + convertToDouble +62E-5 +} 0x3f4450efdc9c4da9 +test expr-28.573 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -94 E-8 x -1f8a89dc374df5_0000000001& E-21 + convertToDouble -94E-8 +} 0xbeaf8a89dc374df5 +test expr-28.574 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +67 E27 x 1b0fa33bba7231_11111110& E95 + convertToDouble +67E27 +} 0x45eb0fa33bba7232 +test expr-28.575 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -81 E24 x -10c01ab31bb5cb_1111110& E86 + convertToDouble -81E24 +} 0xc550c01ab31bb5cc +test expr-28.576 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +54 E23 x 11ddfa58a6173f_111110& E82 + convertToDouble +54E23 +} 0x4511ddfa58a61740 +test expr-28.577 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -54 E25 x -1bead72a838453_111110& E88 + convertToDouble -54E25 +} 0xc57bead72a838454 +test expr-28.578 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +63 E-22 x 1dc03b8fd70169_11111111110& E-68 + convertToDouble +63E-22 +} 0x3bbdc03b8fd7016a +test expr-28.579 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -63 E-23 x -17ccfc73126787_11111111110& E-71 + convertToDouble -63E-23 +} 0xbb87ccfc73126788 +test expr-28.580 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +43 E-4 x 119ce075f6fd21_111111110& E-8 + convertToDouble +43E-4 +} 0x3f719ce075f6fd22 +test expr-28.581 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -86 E-4 x -119ce075f6fd21_111111110& E-7 + convertToDouble -86E-4 +} 0xbf819ce075f6fd22 +test expr-28.582 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +942 E26 x 1306069e8681f3_00000000001& E96 + convertToDouble +942E26 +} 0x45f306069e8681f3 +test expr-28.583 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -471 E25 x -1e700a973d9cb8_0000000001& E91 + convertToDouble -471E25 +} 0xc5ae700a973d9cb8 +test expr-28.584 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +803 E24 x 14c1cee9cd666b_000000000001& E89 + convertToDouble +803E24 +} 0x4584c1cee9cd666b +test expr-28.585 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -471 E26 x -1306069e8681f3_00000000001& E95 + convertToDouble -471E26 +} 0xc5e306069e8681f3 +test expr-28.586 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -409 E-21 x -1e2dcaa4115622_000000000001& E-62 + convertToDouble -409E-21 +} 0xbc1e2dcaa4115622 +test expr-28.587 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +818 E-21 x 1e2dcaa4115622_000000000001& E-61 + convertToDouble +818E-21 +} 0x3c2e2dcaa4115622 +test expr-28.588 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -867 E-8 x -122eabba029aba_000000000001& E-17 + convertToDouble -867E-8 +} 0xbee22eabba029aba +test expr-28.589 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +538 E27 x 1b297cad9f70b5_1111111111111110& E98 + convertToDouble +538E27 +} 0x461b297cad9f70b6 +test expr-28.590 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -857 E24 x -16272678ba603b_11111111110& E89 + convertToDouble -857E24 +} 0xc586272678ba603c +test expr-28.591 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +269 E27 x 1b297cad9f70b5_1111111111111110& E97 + convertToDouble +269E27 +} 0x460b297cad9f70b6 +test expr-28.592 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -403 E26 x -1046ec1e31dd85_1111111110& E95 + convertToDouble -403E26 +} 0xc5e046ec1e31dd86 +test expr-28.593 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +959 E-7 x 1923bd746a3527_11111111111110& E-14 + convertToDouble +959E-7 +} 0x3f1923bd746a3528 +test expr-28.594 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -959 E-6 x -1f6cacd184c271_1111111111110& E-11 + convertToDouble -959E-6 +} 0xbf4f6cacd184c272 +test expr-28.595 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +373 E-27 x 1cdc06b20ef182_1111111111110& E-82 + convertToDouble +373E-27 +} 0x3adcdc06b20ef183 +test expr-28.596 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -746 E-27 x -1cdc06b20ef182_1111111111110& E-81 + convertToDouble -746E-27 +} 0xbaecdc06b20ef183 +test expr-28.597 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +4069 E24 x 1a4b9887fbfe7a_0000000000001& E91 + convertToDouble +4069E24 +} 0x45aa4b9887fbfe7a +test expr-28.598 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -4069 E23 x -150946d32ffec8_0000000000001& E88 + convertToDouble -4069E23 +} 0xc5750946d32ffec8 +test expr-28.599 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -8138 E24 x -1a4b9887fbfe7a_0000000000001& E92 + convertToDouble -8138E24 +} 0xc5ba4b9887fbfe7a +test expr-28.600 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +8294 E-15 x 123d1b5eb1d778_000000000000000001& E-37 + convertToDouble +8294E-15 +} 0x3da23d1b5eb1d778 +test expr-28.601 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -4147 E-14 x -16cc62365e4d56_00000000000000001& E-35 + convertToDouble -4147E-14 +} 0xbdc6cc62365e4d56 +test expr-28.602 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +4147 E-15 x 123d1b5eb1d778_000000000000000001& E-38 + convertToDouble +4147E-15 +} 0x3d923d1b5eb1d778 +test expr-28.603 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -8294 E-14 x -16cc62365e4d56_00000000000000001& E-34 + convertToDouble -8294E-14 +} 0xbdd6cc62365e4d56 +test expr-28.604 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +538 E27 x 1b297cad9f70b5_1111111111111110& E98 + convertToDouble +538E27 +} 0x461b297cad9f70b6 +test expr-28.605 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -2690 E26 x -1b297cad9f70b5_1111111111111110& E97 + convertToDouble -2690E26 +} 0xc60b297cad9f70b6 +test expr-28.606 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +269 E27 x 1b297cad9f70b5_1111111111111110& E97 + convertToDouble +269E27 +} 0x460b297cad9f70b6 +test expr-28.607 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -2152 E27 x -1b297cad9f70b5_1111111111111110& E100 + convertToDouble -2152E27 +} 0xc63b297cad9f70b6 +test expr-28.608 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +1721 E-17 x 136071dcae4564_111111111111110& E-46 + convertToDouble +1721E-17 +} 0x3d136071dcae4565 +test expr-28.609 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -7979 E-27 x -134ac304747faf_111111111111110& E-77 + convertToDouble -7979E-27 +} 0xbb234ac304747fb0 +test expr-28.610 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +6884 E-17 x 136071dcae4564_111111111111110& E-44 + convertToDouble +6884E-17 +} 0x3d336071dcae4565 +test expr-28.611 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -8605 E-18 x -136071dcae4564_111111111111110& E-47 + convertToDouble -8605E-18 +} 0xbd036071dcae4565 +test expr-28.612 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +82854 E27 x 10570ed9e3cecc_00000000000000001& E106 + convertToDouble +82854E27 +} 0x4690570ed9e3cecc +test expr-28.613 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -55684 E24 x -167d9735144ae3_00000000000000001& E95 + convertToDouble -55684E24 +} 0xc5e67d9735144ae3 +test expr-28.614 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +27842 E24 x 167d9735144ae3_00000000000000001& E94 + convertToDouble +27842E24 +} 0x45d67d9735144ae3 +test expr-28.615 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -48959 E25 x -18b7cd6ca56f85_00000000000000001& E98 + convertToDouble -48959E25 +} 0xc618b7cd6ca56f85 +test expr-28.616 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +81921 E-17 x 1cd2c9a6cdd003_000000000000000000001& E-41 + convertToDouble +81921E-17 +} 0x3d6cd2c9a6cdd003 +test expr-28.617 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -76207 E-8 x -18f8b4dd16f1df_0000000000000000001& E-11 + convertToDouble -76207E-8 +} 0xbf48f8b4dd16f1df +test expr-28.618 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +4147 E-15 x 123d1b5eb1d778_000000000000000001& E-38 + convertToDouble +4147E-15 +} 0x3d923d1b5eb1d778 +test expr-28.619 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -41470 E-16 x -123d1b5eb1d778_000000000000000001& E-38 + convertToDouble -41470E-16 +} 0xbd923d1b5eb1d778 +test expr-28.620 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +89309 E24 x 12092ac5f2019e_1111111111111111110& E96 + convertToDouble +89309E24 +} 0x45f2092ac5f2019f +test expr-28.621 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +75859 E26 x 17efd75a2938eb_1111111111111111111110& E102 + convertToDouble +75859E26 +} 0x4657efd75a2938ec +test expr-28.622 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -75859 E25 x -132645e1ba93ef_1111111111111111111110& E99 + convertToDouble -75859E25 +} 0xc6232645e1ba93f0 +test expr-28.623 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +14257 E-23 x 150a246ecd44f2_1111111111111111110& E-63 + convertToDouble +14257E-23 +} 0x3c050a246ecd44f3 +test expr-28.624 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -28514 E-23 x -150a246ecd44f2_1111111111111111110& E-62 + convertToDouble -28514E-23 +} 0xbc150a246ecd44f3 +test expr-28.625 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +57028 E-23 x 150a246ecd44f2_1111111111111111110& E-61 + convertToDouble +57028E-23 +} 0x3c250a246ecd44f3 +test expr-28.626 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -71285 E-24 x -150a246ecd44f2_1111111111111111110& E-64 + convertToDouble -71285E-24 +} 0xbbf50a246ecd44f3 +test expr-28.627 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +344863 E27 x 1100c873963d6d_00000000000000000001& E108 + convertToDouble +344863E27 +} 0x46b100c873963d6d +test expr-28.628 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -951735 E27 x -17764ad224e24a_000000000000000000001& E109 + convertToDouble -951735E27 +} 0xc6c7764ad224e24a +test expr-28.629 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +200677 E23 x 1035e73135b834_0000000000000000001& E94 + convertToDouble +200677E23 +} 0x45d035e73135b834 +test expr-28.630 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -401354 E24 x -144360fd832641_0000000000000000001& E98 + convertToDouble -401354E24 +} 0xc6144360fd832641 +test expr-28.631 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +839604 E-11 x 119b96f36ec68b_00000000000000000000000001& E-17 + convertToDouble +839604E-11 +} 0x3ee19b96f36ec68b +test expr-28.632 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -209901 E-11 x -119b96f36ec68b_00000000000000000000000001& E-19 + convertToDouble -209901E-11 +} 0xbec19b96f36ec68b +test expr-28.633 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +419802 E-11 x 119b96f36ec68b_00000000000000000000000001& E-18 + convertToDouble +419802E-11 +} 0x3ed19b96f36ec68b +test expr-28.634 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -537734 E-24 x -13d6c1088ae40e_0000000000000000000001& E-61 + convertToDouble -537734E-24 +} 0xbc23d6c1088ae40e +test expr-28.635 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +910308 E26 x 11f3e1839eeab0_11111111111111111111110& E106 + convertToDouble +910308E26 +} 0x4691f3e1839eeab1 +test expr-28.636 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -227577 E26 x -11f3e1839eeab0_11111111111111111111110& E104 + convertToDouble -227577E26 +} 0xc671f3e1839eeab1 +test expr-28.637 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +455154 E26 x 11f3e1839eeab0_11111111111111111111110& E105 + convertToDouble +455154E26 +} 0x4681f3e1839eeab1 +test expr-28.638 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -531013 E25 x -10c17d25834171_11111111111111111111110& E102 + convertToDouble -531013E25 +} 0xc650c17d25834172 +test expr-28.639 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +963019 E-21 x 11592429784914_11111111111111111111110& E-50 + convertToDouble +963019E-21 +} 0x3cd1592429784915 +test expr-28.640 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -519827 E-13 x -1be872a8b30d7c_11111111111111111111110& E-25 + convertToDouble -519827E-13 +} 0xbe6be872a8b30d7d +test expr-28.641 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +623402 E-27 x 178d2c97bde2a0_11111111111111111111110& E-71 + convertToDouble +623402E-27 +} 0x3b878d2c97bde2a1 +test expr-28.642 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -311701 E-27 x -178d2c97bde2a0_11111111111111111111110& E-72 + convertToDouble -311701E-27 +} 0xbb778d2c97bde2a1 +test expr-28.643 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +9613651 E26 x 17b31116270d9b_000000000000000000000001& E109 + convertToDouble +9613651E26 +} 0x46c7b31116270d9b +test expr-28.644 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -9191316 E23 x -1733bfae0801fd_0000000000000000000001& E99 + convertToDouble -9191316E23 +} 0xc62733bfae0801fd +test expr-28.645 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +4595658 E23 x 1733bfae0801fd_0000000000000000000001& E98 + convertToDouble +4595658E23 +} 0x461733bfae0801fd +test expr-28.646 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -2297829 E23 x -1733bfae0801fd_0000000000000000000001& E97 + convertToDouble -2297829E23 +} 0xc60733bfae0801fd +test expr-28.647 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -1679208 E-11 x -119b96f36ec68b_00000000000000000000000001& E-16 + convertToDouble -1679208E-11 +} 0xbef19b96f36ec68b +test expr-28.648 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +3379223 E27 x 14d3794ce2fc25_1111111111111111111111110& E111 + convertToDouble +3379223E27 +} 0x46e4d3794ce2fc26 +test expr-28.649 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -6758446 E27 x -14d3794ce2fc25_1111111111111111111111110& E112 + convertToDouble -6758446E27 +} 0xc6f4d3794ce2fc26 +test expr-28.650 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +5444097 E-21 x 18849dd33c95ae_11111111111111111111111111110& E-48 + convertToDouble +5444097E-21 +} 0x3cf8849dd33c95af +test expr-28.651 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -8399969 E-27 x -13d5783e85fcf7_1111111111111111111111110& E-67 + convertToDouble -8399969E-27 +} 0xbbc3d5783e85fcf8 +test expr-28.652 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +8366487 E-16 x 1cbf3d630403af_1111111111111111111111110& E-31 + convertToDouble +8366487E-16 +} 0x3e0cbf3d630403b0 +test expr-28.653 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -8366487 E-15 x -11f7865de2824d_11111111111111111111111110& E-27 + convertToDouble -8366487E-15 +} 0xbe41f7865de2824e +test expr-28.654 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +65060671 E25 x 1009e7d474572a_0000000000000000000000000001& E109 + convertToDouble +65060671E25 +} 0x46c009e7d474572a +test expr-28.655 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +65212389 E23 x 1493d098d37657_000000000000000000000000001& E102 + convertToDouble +65212389E23 +} 0x465493d098d37657 +test expr-28.656 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +55544957 E-13 x 174c1826f3010c_00000000000000000000000000001& E-18 + convertToDouble +55544957E-13 +} 0x3ed74c1826f3010c +test expr-28.657 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -51040905 E-20 x -11f55b23c8bf2d_0000000000000000000000000001& E-41 + convertToDouble -51040905E-20 +} 0xbd61f55b23c8bf2d +test expr-28.658 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +99585767 E-22 x 166cba8699f0f2_0000000000000000000000000001& E-47 + convertToDouble +99585767E-22 +} 0x3d066cba8699f0f2 +test expr-28.659 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -99585767 E-23 x -11f095387b2728_0000000000000000000000000001& E-50 + convertToDouble -99585767E-23 +} 0xbcd1f095387b2728 +test expr-28.660 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +40978393 E26 x 1941401cca2bfd_1111111111111111111111111110& E111 + convertToDouble +40978393E26 +} 0x46e941401cca2bfe +test expr-28.661 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -67488159 E24 x -1a9e90059d12db_11111111111111111111111111110& E105 + convertToDouble -67488159E24 +} 0xc68a9e90059d12dc +test expr-28.662 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +69005339 E23 x 15c634f6ef1f95_111111111111111111111111110& E102 + convertToDouble +69005339E23 +} 0x4655c634f6ef1f96 +test expr-28.663 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -81956786 E26 x -1941401cca2bfd_1111111111111111111111111110& E112 + convertToDouble -81956786E26 +} 0xc6f941401cca2bfe +test expr-28.664 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -87105552 E-21 x -18849dd33c95ae_11111111111111111111111111110& E-44 + convertToDouble -87105552E-21 +} 0xbd38849dd33c95af +test expr-28.665 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +10888194 E-21 x 18849dd33c95ae_11111111111111111111111111110& E-47 + convertToDouble +10888194E-21 +} 0x3d08849dd33c95af +test expr-28.666 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -21776388 E-21 x -18849dd33c95ae_11111111111111111111111111110& E-46 + convertToDouble -21776388E-21 +} 0xbd18849dd33c95af +test expr-28.667 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +635806667 E27 x 1e9cec176c96f8_000000000000000000000000000000001& E118 + convertToDouble +635806667E27 +} 0x475e9cec176c96f8 +test expr-28.668 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -670026614 E25 x -14a593f89f4194_00000000000000000000000000000001& E112 + convertToDouble -670026614E25 +} 0xc6f4a593f89f4194 +test expr-28.669 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +335013307 E26 x 19cef8f6c711f9_0000000000000000000000000000001& E114 + convertToDouble +335013307E26 +} 0x4719cef8f6c711f9 +test expr-28.670 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -335013307 E25 x -14a593f89f4194_00000000000000000000000000000001& E111 + convertToDouble -335013307E25 +} 0xc6e4a593f89f4194 +test expr-28.671 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +371790617 E-24 x 1aca538c61ba9c_000000000000000000000000000000001& E-52 + convertToDouble +371790617E-24 +} 0x3cbaca538c61ba9c +test expr-28.672 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -371790617 E-25 x -156ea93d1afbb0_0000000000000000000000000000000001& E-55 + convertToDouble -371790617E-25 +} 0xbc856ea93d1afbb0 +test expr-28.673 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +743581234 E-24 x 1aca538c61ba9c_000000000000000000000000000000001& E-51 + convertToDouble +743581234E-24 +} 0x3ccaca538c61ba9c +test expr-28.674 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -743581234 E-25 x -156ea93d1afbb0_0000000000000000000000000000000001& E-54 + convertToDouble -743581234E-25 +} 0xbc956ea93d1afbb0 +test expr-28.675 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +202464477 E24 x 13f6ec0435ce24_111111111111111111111111111110& E107 + convertToDouble +202464477E24 +} 0x46a3f6ec0435ce25 +test expr-28.676 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -404928954 E24 x -13f6ec0435ce24_111111111111111111111111111110& E108 + convertToDouble -404928954E24 +} 0xc6b3f6ec0435ce25 +test expr-28.677 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +997853758 E27 x 1805bfa33b98fa_111111111111111111111111111110& E119 + convertToDouble +997853758E27 +} 0x476805bfa33b98fb +test expr-28.678 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -997853758 E26 x -1337cc829613fb_111111111111111111111111111110& E116 + convertToDouble -997853758E26 +} 0xc73337cc829613fc +test expr-28.679 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +405498418 E-17 x 116a8093df66a6_111111111111111111111111111111110& E-28 + convertToDouble +405498418E-17 +} 0x3e316a8093df66a7 +test expr-28.680 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -582579084 E-14 x -186f653140a658_111111111111111111111111111111110& E-18 + convertToDouble -582579084E-14 +} 0xbed86f653140a659 +test expr-28.681 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +608247627 E-18 x 14e633e4a5ae61_111111111111111111111111111111110& E-31 + convertToDouble +608247627E-18 +} 0x3e04e633e4a5ae62 +test expr-28.682 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -291289542 E-14 x -186f653140a658_111111111111111111111111111111110& E-19 + convertToDouble -291289542E-14 +} 0xbec86f653140a659 +test expr-28.683 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -9537100005 E26 x -16f5b11191713a_000000000000000000000000000000001& E119 + convertToDouble -9537100005E26 +} 0xc766f5b11191713a +test expr-28.684 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +6358066670 E27 x 1322138ea3de5b_000000000000000000000000000000001& E122 + convertToDouble +6358066670E27 +} 0x479322138ea3de5b +test expr-28.685 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -1271613334 E27 x -1e9cec176c96f8_000000000000000000000000000000001& E119 + convertToDouble -1271613334E27 +} 0xc76e9cec176c96f8 +test expr-28.686 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +5229646999 E-16 x 118c3b89731f3d_000000000000000000000000000000000001& E-21 + convertToDouble +5229646999E-16 +} 0x3ea18c3b89731f3d +test expr-28.687 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +5229646999 E-17 x 1c13927584fec8_00000000000000000000000000000000001& E-25 + convertToDouble +5229646999E-17 +} 0x3e6c13927584fec8 +test expr-28.688 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +4429943614 E24 x 1b4d37fa06864a_1111111111111111111111111111111110& E111 + convertToDouble +4429943614E24 +} 0x46eb4d37fa06864b +test expr-28.689 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -8859887228 E24 x -1b4d37fa06864a_1111111111111111111111111111111110& E112 + convertToDouble -8859887228E24 +} 0xc6fb4d37fa06864b +test expr-28.690 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +2214971807 E24 x 1b4d37fa06864a_1111111111111111111111111111111110& E110 + convertToDouble +2214971807E24 +} 0x46db4d37fa06864b +test expr-28.691 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -4176887093 E26 x -141c692c5bd07a_111111111111111111111111111111110& E118 + convertToDouble -4176887093E26 +} 0xc7541c692c5bd07b +test expr-28.692 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +4003495257 E-20 x 16026b2e07ec06_111111111111111111111111111111111110& E-35 + convertToDouble +4003495257E-20 +} 0x3dc6026b2e07ec07 +test expr-28.693 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -4361901637 E-23 x -188e29a9d7c5b8_11111111111111111111111111111111110& E-45 + convertToDouble -4361901637E-23 +} 0xbd288e29a9d7c5b9 +test expr-28.694 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +8723803274 E-23 x 188e29a9d7c5b8_11111111111111111111111111111111110& E-44 + convertToDouble +8723803274E-23 +} 0x3d388e29a9d7c5b9 +test expr-28.695 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -8006990514 E-20 x -16026b2e07ec06_111111111111111111111111111111111110& E-34 + convertToDouble -8006990514E-20 +} 0xbdd6026b2e07ec07 +test expr-28.696 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +72835110098 E27 x 1b65c41711fb6d_0000000000000000000000000000000000001& E125 + convertToDouble +72835110098E27 +} 0x47cb65c41711fb6d +test expr-28.697 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -36417555049 E27 x -1b65c41711fb6d_0000000000000000000000000000000000001& E124 + convertToDouble -36417555049E27 +} 0xc7bb65c41711fb6d +test expr-28.698 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +84279630104 E25 x 144a221b1cf62e_000000000000000000000000000000000001& E119 + convertToDouble +84279630104E25 +} 0x47644a221b1cf62e +test expr-28.699 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -84279630104 E24 x -103b4e7c172b58_000000000000000000000000000000000001& E116 + convertToDouble -84279630104E24 +} 0xc7303b4e7c172b58 +test expr-28.700 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +21206176437 E-27 x 1872f563ae0cc9_0000000000000000000000000000000000001& E-56 + convertToDouble +21206176437E-27 +} 0x3c7872f563ae0cc9 +test expr-28.701 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -66461566917 E-22 x -1d3ae83e4322b3_00000000000000000000000000000000000001& E-38 + convertToDouble -66461566917E-22 +} 0xbd9d3ae83e4322b3 +test expr-28.702 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +64808355539 E-16 x 1b2ebe83265fbf_00000000000000000000000000000000000001& E-18 + convertToDouble +64808355539E-16 +} 0x3edb2ebe83265fbf +test expr-28.703 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -84932679673 E-19 x -123d39339f1bf6_00000000000000000000000000000000000001& E-27 + convertToDouble -84932679673E-19 +} 0xbe423d39339f1bf6 +test expr-28.704 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +65205430094 E26 x 139f3e5d7fd76a_1111111111111111111111111111111111110& E122 + convertToDouble +65205430094E26 +} 0x47939f3e5d7fd76b +test expr-28.705 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -68384463429 E25 x -107684982f634e_1111111111111111111111111111111111111110& E119 + convertToDouble -68384463429E25 +} 0xc7607684982f634f +test expr-28.706 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +32602715047 E26 x 139f3e5d7fd76a_1111111111111111111111111111111111110& E121 + convertToDouble +32602715047E26 +} 0x47839f3e5d7fd76b +test expr-28.707 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -62662203426 E27 x -1792269424688d_111111111111111111111111111111111110& E125 + convertToDouble -62662203426E27 +} 0xc7c792269424688e +test expr-28.708 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +58784444678 E-18 x 1f8f45c64b4682_111111111111111111111111111111111111110& E-25 + convertToDouble +58784444678E-18 +} 0x3e6f8f45c64b4683 +test expr-28.709 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -50980203373 E-21 x -1c06d366394440_11111111111111111111111111111111111111111110& E-35 + convertToDouble -50980203373E-21 +} 0xbdcc06d366394441 +test expr-28.710 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +29392222339 E-18 x 1f8f45c64b4682_111111111111111111111111111111111111110& E-26 + convertToDouble +29392222339E-18 +} 0x3e5f8f45c64b4683 +test expr-28.711 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -75529940323 E-27 x -15c5203c0aad52_1111111111111111111111111111111111111110& E-54 + convertToDouble -75529940323E-27 +} 0xbc95c5203c0aad53 +test expr-28.712 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -937495906299 E26 x -11a1e0ebb6af11_000000000000000000000000000000000000000001& E126 + convertToDouble -937495906299E26 +} 0xc7d1a1e0ebb6af11 +test expr-28.713 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +842642485799 E-20 x 121879decdd7cb_000000000000000000000000000000000000000001& E-27 + convertToDouble +842642485799E-20 +} 0x3e421879decdd7cb +test expr-28.714 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -387824150699 E-23 x -110e8302245571_00000000000000000000000000000000000000001& E-38 + convertToDouble -387824150699E-23 +} 0xbd910e8302245571 +test expr-28.715 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +924948814726 E-27 x 10a992d1fc6ded_00000000000000000000000000000000000000001& E-50 + convertToDouble +924948814726E-27 +} 0x3cd0a992d1fc6ded +test expr-28.716 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -775648301398 E-23 x -110e8302245571_00000000000000000000000000000000000000001& E-37 + convertToDouble -775648301398E-23 +} 0xbda10e8302245571 +test expr-28.717 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +547075707432 E25 x 107684982f634e_1111111111111111111111111111111111111110& E122 + convertToDouble +547075707432E25 +} 0x47907684982f634f +test expr-28.718 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +683844634290 E24 x 107684982f634e_1111111111111111111111111111111111111110& E119 + convertToDouble +683844634290E24 +} 0x47607684982f634f +test expr-28.719 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -136768926858 E25 x -107684982f634e_1111111111111111111111111111111111111110& E120 + convertToDouble -136768926858E25 +} 0xc7707684982f634f +test expr-28.720 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +509802033730 E-22 x 1c06d366394440_11111111111111111111111111111111111111111110& E-35 + convertToDouble +509802033730E-22 +} 0x3dcc06d366394441 +test expr-28.721 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +101960406746 E-21 x 1c06d366394440_11111111111111111111111111111111111111111110& E-34 + convertToDouble +101960406746E-21 +} 0x3ddc06d366394441 +test expr-28.722 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -815683253968 E-21 x -1c06d366394440_11111111111111111111111111111111111111111110& E-31 + convertToDouble -815683253968E-21 +} 0xbe0c06d366394441 +test expr-28.723 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +7344124123524 E24 x 1619b519dd6833_00000000000000000000000000000000000000000001& E122 + convertToDouble +7344124123524E24 +} 0x479619b519dd6833 +test expr-28.724 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -9180155154405 E23 x -1619b519dd6833_00000000000000000000000000000000000000000001& E119 + convertToDouble -9180155154405E23 +} 0xc76619b519dd6833 +test expr-28.725 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +6479463327323 E27 x 130a9b3e9bd05e_00000000000000000000000000000000000000000001& E132 + convertToDouble +6479463327323E27 +} 0x48330a9b3e9bd05e +test expr-28.726 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -1836031030881 E24 x -1619b519dd6833_00000000000000000000000000000000000000000001& E120 + convertToDouble -1836031030881E24 +} 0xc77619b519dd6833 +test expr-28.727 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +4337269293039 E-19 x 1d1b5f354c63d6_00000000000000000000000000000000000000000001& E-22 + convertToDouble +4337269293039E-19 +} 0x3e9d1b5f354c63d6 +test expr-28.728 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -4599163554373 E-23 x -1948bf4d34088d_00000000000000000000000000000000000000000001& E-35 + convertToDouble -4599163554373E-23 +} 0xbdc948bf4d34088d +test expr-28.729 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +9198327108746 E-23 x 1948bf4d34088d_00000000000000000000000000000000000000000001& E-34 + convertToDouble +9198327108746E-23 +} 0x3dd948bf4d34088d +test expr-28.730 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +4812803938347 E27 x 1c4980a4ee94ce_111111111111111111111111111111111111111111110& E131 + convertToDouble +4812803938347E27 +} 0x482c4980a4ee94cf +test expr-28.731 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -8412030890011 E23 x -14405075e52db9_11111111111111111111111111111111111111111110& E119 + convertToDouble -8412030890011E23 +} 0xc764405075e52dba +test expr-28.732 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +9625607876694 E27 x 1c4980a4ee94ce_111111111111111111111111111111111111111111110& E132 + convertToDouble +9625607876694E27 +} 0x483c4980a4ee94cf +test expr-28.733 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -4739968828249 E24 x -1c87140cdf8a1d_1111111111111111111111111111111111111111110& E121 + convertToDouble -4739968828249E24 +} 0xc78c87140cdf8a1e +test expr-28.734 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +9697183891673 E-23 x 1aa7c959b6a666_11111111111111111111111111111111111111111111110& E-34 + convertToDouble +9697183891673E-23 +} 0x3ddaa7c959b6a667 +test expr-28.735 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -7368108517543 E-20 x -13c7535bbd85a1_1111111111111111111111111111111111111111111110& E-24 + convertToDouble -7368108517543E-20 +} 0xbe73c7535bbd85a2 +test expr-28.736 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +51461358161422 E25 x 18326f87d4cae0_0000000000000000000000000000000000000000000000001& E128 + convertToDouble +51461358161422E25 +} 0x47f8326f87d4cae0 +test expr-28.737 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -77192037242133 E26 x -16af488f577e32_0000000000000000000000000000000000000000000000001& E132 + convertToDouble -77192037242133E26 +} 0xc836af488f577e32 +test expr-28.738 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +77192037242133 E25 x 1225d3a5df9828_0000000000000000000000000000000000000000000000001& E129 + convertToDouble +77192037242133E25 +} 0x480225d3a5df9828 +test expr-28.739 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -51461358161422 E27 x -12e767221e3e7f_0000000000000000000000000000000000000000000000001& E135 + convertToDouble -51461358161422E27 +} 0xc862e767221e3e7f +test expr-28.740 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +43999661561541 E-21 x 179f4476d372a3_0000000000000000000000000000000000000000000000001& E-25 + convertToDouble +43999661561541E-21 +} 0x3e679f4476d372a3 +test expr-28.741 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -87999323123082 E-21 x -179f4476d372a3_0000000000000000000000000000000000000000000000001& E-24 + convertToDouble -87999323123082E-21 +} 0xbe779f4476d372a3 +test expr-28.742 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +48374886826137 E-26 x 110538f23350d5_00000000000000000000000000000000000000000000001& E-41 + convertToDouble +48374886826137E-26 +} 0x3d610538f23350d5 +test expr-28.743 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -57684246567111 E-23 x -13d1f5c1b8a912_00000000000000000000000000000000000000000000001& E-31 + convertToDouble -57684246567111E-23 +} 0xbe03d1f5c1b8a912 +test expr-28.744 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +87192805957686 E23 x 1a3d16e55a9664_1111111111111111111111111111111111111111111110& E122 + convertToDouble +87192805957686E23 +} 0x479a3d16e55a9665 +test expr-28.745 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -75108713005913 E24 x -1c40b4baa79655_11111111111111111111111111111111111111111111110& E125 + convertToDouble -75108713005913E24 +} 0xc7cc40b4baa79656 +test expr-28.746 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +64233110587487 E27 x 179873e38669a6_1111111111111111111111111111111111111111111110& E135 + convertToDouble +64233110587487E27 +} 0x48679873e38669a7 +test expr-28.747 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -77577471133384 E-23 x -1aa7c959b6a666_11111111111111111111111111111111111111111111110& E-31 + convertToDouble -77577471133384E-23 +} 0xbe0aa7c959b6a667 +test expr-28.748 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +48485919458365 E-24 x 1aa7c959b6a666_11111111111111111111111111111111111111111111110& E-35 + convertToDouble +48485919458365E-24 +} 0x3dcaa7c959b6a667 +test expr-28.749 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -56908598265713 E-26 x -1405deef4bdef5_111111111111111111111111111111111111111111111110& E-41 + convertToDouble -56908598265713E-26 +} 0xbd6405deef4bdef6 +test expr-28.750 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +589722294620133 E23 x 162ed1b287caef_00000000000000000000000000000000000000000000000001& E125 + convertToDouble +589722294620133E23 +} 0x47c62ed1b287caef +test expr-28.751 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +652835804449289 E-22 x 118640e490b087_0000000000000000000000000000000000000000000000000001& E-24 + convertToDouble +652835804449289E-22 +} 0x3e718640e490b087 +test expr-28.752 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -656415363936202 E-23 x -1c315cfe25d201_00000000000000000000000000000000000000000000000001& E-28 + convertToDouble -656415363936202E-23 +} 0xbe3c315cfe25d201 +test expr-28.753 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +579336749585745 E-25 x 1fd9709d9aeb19_00000000000000000000000000000000000000000000000001& E-35 + convertToDouble +579336749585745E-25 +} 0x3dcfd9709d9aeb19 +test expr-28.754 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -381292764980839 E-26 x -10c4f9921c3f8f_00000000000000000000000000000000000000000000000001& E-38 + convertToDouble -381292764980839E-26 +} 0xbd90c4f9921c3f8f +test expr-28.755 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +965265859649698 E23 x 12279607edcb0c_1111111111111111111111111111111111111111111111110& E126 + convertToDouble +965265859649698E23 +} 0x47d2279607edcb0d +test expr-28.756 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -848925235434882 E27 x -137d88ba4b43e3_1111111111111111111111111111111111111111111111111110& E139 + convertToDouble -848925235434882E27 +} 0xc8a37d88ba4b43e4 +test expr-28.757 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +536177612222491 E23 x 142b33dd3acafd_11111111111111111111111111111111111111111111111110& E125 + convertToDouble +536177612222491E23 +} 0x47c42b33dd3acafe +test expr-28.758 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -424462617717441 E27 x -137d88ba4b43e3_1111111111111111111111111111111111111111111111111110& E138 + convertToDouble -424462617717441E27 +} 0xc8937d88ba4b43e4 +test expr-28.759 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +276009279888989 E-27 x 136c242313c288_111111111111111111111111111111111111111111111111110& E-42 + convertToDouble +276009279888989E-27 +} 0x3d536c242313c289 +test expr-28.760 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -608927158043691 E-26 x -1ac7e909c22f09_11111111111111111111111111111111111111111111111110& E-38 + convertToDouble -608927158043691E-26 +} 0xbd9ac7e909c22f0a +test expr-28.761 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +552018559777978 E-27 x 136c242313c288_111111111111111111111111111111111111111111111111110& E-41 + convertToDouble +552018559777978E-27 +} 0x3d636c242313c289 +test expr-28.762 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -425678377667758 E-22 x -16da7aa49bdcd5_1111111111111111111111111111111111111111111111110& E-25 + convertToDouble -425678377667758E-22 +} 0xbe66da7aa49bdcd6 +test expr-28.763 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +8013702726927119 E26 x 126607f8f1b29e_00000000000000000000000000000000000000000000000000001& E139 + convertToDouble +8013702726927119E26 +} 0x48a26607f8f1b29e +test expr-28.764 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +8862627962362001 E27 x 196f3b0e7787c2_00000000000000000000000000000000000000000000000000001& E142 + convertToDouble +8862627962362001E27 +} 0x48d96f3b0e7787c2 +test expr-28.765 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -5068007907757162 E26 x -17456a27848397_00000000000000000000000000000000000000000000000000001& E138 + convertToDouble -5068007907757162E26 +} 0xc897456a27848397 +test expr-28.766 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -7379714799828406 E-23 x -13cf4d2839e036_00000000000000000000000000000000000000000000000000001& E-24 + convertToDouble -7379714799828406E-23 +} 0xbe73cf4d2839e036 +test expr-28.767 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +4114538064016107 E-27 x 12188eda98010c_0000000000000000000000000000000000000000000000000001& E-38 + convertToDouble +4114538064016107E-27 +} 0x3d92188eda98010c +test expr-28.768 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -3689857399914203 E-23 x -13cf4d2839e036_00000000000000000000000000000000000000000000000000001& E-25 + convertToDouble -3689857399914203E-23 +} 0xbe63cf4d2839e036 +test expr-28.769 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +5575954851815478 E23 x 1a37cfbf2ffdb5_1111111111111111111111111111111111111111111111111110& E128 + convertToDouble +5575954851815478E23 +} 0x47fa37cfbf2ffdb6 +test expr-28.770 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +3395700941739528 E27 x 137d88ba4b43e3_1111111111111111111111111111111111111111111111111110& E141 + convertToDouble +3395700941739528E27 +} 0x48c37d88ba4b43e4 +test expr-28.771 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +4115535777581961 E-23 x 1618596be30fe4_111111111111111111111111111111111111111111111111111110& E-25 + convertToDouble +4115535777581961E-23 +} 0x3e6618596be30fe5 +test expr-28.772 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -8231071555163922 E-23 x -1618596be30fe4_111111111111111111111111111111111111111111111111111110& E-24 + convertToDouble -8231071555163922E-23 +} 0xbe7618596be30fe5 +test expr-28.773 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +6550246696190871 E-26 x 1201538b0f8c69_111111111111111111111111111111111111111111111111111110& E-34 + convertToDouble +6550246696190871E-26 +} 0x3dd201538b0f8c6a +test expr-28.774 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -68083046403986701 E27 x -186c70ba8ba28d_000000000000000000000000000000000000000000000000000000001& E145 + convertToDouble -68083046403986701E27 +} 0xc9086c70ba8ba28d +test expr-28.775 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +43566388595783643 E27 x 1f41e1bf48b03f_111111111111111111111111111111111111111111111111111111110& E144 + convertToDouble +43566388595783643E27 +} 0x48ff41e1bf48b040 +test expr-28.776 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -87132777191567286 E27 x -1f41e1bf48b03f_111111111111111111111111111111111111111111111111111111110& E145 + convertToDouble -87132777191567286E27 +} 0xc90f41e1bf48b040 +test expr-28.777 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +59644881059342141 E25 x 1b6338d9d8ae38_11111111111111111111111111111111111111111111111111111110& E138 + convertToDouble +59644881059342141E25 +} 0x489b6338d9d8ae39 +test expr-28.778 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -83852770718576667 E23 x -18a4619ed6f442_111111111111111111111111111111111111111111111111111111110& E132 + convertToDouble -83852770718576667E23 +} 0xc838a4619ed6f443 +test expr-28.779 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +99482967418206961 E-25 x 155d224bfed7ac_11111111111111111111111111111111111111111111111111111111110& E-27 + convertToDouble +99482967418206961E-25 +} 0x3e455d224bfed7ad +test expr-28.780 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -99482967418206961 E-26 x -11174ea3324623_11111111111111111111111111111111111111111111111111111111110& E-30 + convertToDouble -99482967418206961E-26 +} 0xbe11174ea3324624 +test expr-28.781 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +87446669969994614 E-27 x 1809832942376d_11111111111111111111111111111111111111111111111111111110& E-34 + convertToDouble +87446669969994614E-27 +} 0x3dd809832942376e +test expr-28.782 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -43723334984997307 E-27 x -1809832942376d_11111111111111111111111111111111111111111111111111111110& E-35 + convertToDouble -43723334984997307E-27 +} 0xbdc809832942376e +test expr-28.783 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +5 E24 x 108b2a2c280290_1001& E82 + convertToDouble +5E24 +} 0x45108b2a2c280291 +test expr-28.784 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -8 E25 x -108b2a2c280290_1001& E86 + convertToDouble -8E25 +} 0xc5508b2a2c280291 +test expr-28.785 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +1 E25 x 108b2a2c280290_1001& E83 + convertToDouble +1E25 +} 0x45208b2a2c280291 +test expr-28.786 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -4 E25 x -108b2a2c280290_1001& E85 + convertToDouble -4E25 +} 0xc5408b2a2c280291 +test expr-28.787 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +2 E-5 x 14f8b588e368f0_100001& E-16 + convertToDouble +2E-5 +} 0x3ef4f8b588e368f1 +test expr-28.788 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -5 E-6 x -14f8b588e368f0_100001& E-18 + convertToDouble -5E-6 +} 0xbed4f8b588e368f1 +test expr-28.789 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +4 E-5 x 14f8b588e368f0_100001& E-15 + convertToDouble +4E-5 +} 0x3f04f8b588e368f1 +test expr-28.790 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -3 E-20 x -11b578c96db19a_100001& E-65 + convertToDouble -3E-20 +} 0xbbe1b578c96db19b +test expr-28.791 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +3 E27 x 1363156bbee301_0110& E91 + convertToDouble +3E27 +} 0x45a363156bbee301 +test expr-28.792 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -9 E26 x -1743b34e18439b_010& E89 + convertToDouble -9E26 +} 0xc58743b34e18439b +test expr-28.793 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +7 E25 x 1cf389cd46047d_00& E85 + convertToDouble +7E25 +} 0x454cf389cd46047d +test expr-28.794 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -6 E27 x -1363156bbee301_0110& E92 + convertToDouble -6E27 +} 0xc5b363156bbee301 +test expr-28.795 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +2 E-21 x 12e3b40a0e9b4f_0111110& E-69 + convertToDouble +2E-21 +} 0x3ba2e3b40a0e9b4f +test expr-28.796 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -5 E-22 x -12e3b40a0e9b4f_0111110& E-71 + convertToDouble -5E-22 +} 0xbb82e3b40a0e9b4f +test expr-28.797 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -4 E-21 x -12e3b40a0e9b4f_0111110& E-68 + convertToDouble -4E-21 +} 0xbbb2e3b40a0e9b4f +test expr-28.798 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +87 E25 x 167d2d5406637c_10001& E89 + convertToDouble +87E25 +} 0x45867d2d5406637d +test expr-28.799 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -97 E24 x -140f232256e982_1000000001& E86 + convertToDouble -97E24 +} 0xc5540f232256e983 +test expr-28.800 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +82 E-24 x 18c87154dff6c6_1000000001& E-74 + convertToDouble +82E-24 +} 0x3b58c87154dff6c7 +test expr-28.801 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -41 E-24 x -18c87154dff6c6_1000000001& E-75 + convertToDouble -41E-24 +} 0xbb48c87154dff6c7 +test expr-28.802 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +76 E-23 x 1cb644dc1633c0_10000001& E-71 + convertToDouble +76E-23 +} 0x3b8cb644dc1633c1 +test expr-28.803 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +83 E25 x 15747ab143e353_011111111110& E89 + convertToDouble +83E25 +} 0x4585747ab143e353 +test expr-28.804 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -50 E27 x -1431e0fae6d721_0111110& E95 + convertToDouble -50E27 +} 0xc5e431e0fae6d721 +test expr-28.805 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +25 E27 x 1431e0fae6d721_0111110& E94 + convertToDouble +25E27 +} 0x45d431e0fae6d721 +test expr-28.806 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -99 E27 x -13fe2e171cda19_011110& E96 + convertToDouble -99E27 +} 0xc5f3fe2e171cda19 +test expr-28.807 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +97 E-10 x 14d4a1a3157dc7_011111110& E-27 + convertToDouble +97E-10 +} 0x3e44d4a1a3157dc7 +test expr-28.808 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -57 E-20 x -15077f6f3242e7_011111110& E-61 + convertToDouble -57E-20 +} 0xbc25077f6f3242e7 +test expr-28.809 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +997 E23 x 149e12f51c1a3c_10000000001& E86 + convertToDouble +997E23 +} 0x45549e12f51c1a3d +test expr-28.810 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +776 E24 x 140f232256e982_1000000001& E89 + convertToDouble +776E24 +} 0x45840f232256e983 +test expr-28.811 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -388 E24 x -140f232256e982_1000000001& E88 + convertToDouble -388E24 +} 0xc5740f232256e983 +test expr-28.812 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +521 E-10 x 1bf891c92c0890_100000000001& E-25 + convertToDouble +521E-10 +} 0x3e6bf891c92c0891 +test expr-28.813 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -506 E-26 x -1877fa0260beb2_10000000001& E-78 + convertToDouble -506E-26 +} 0xbb1877fa0260beb3 +test expr-28.814 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +739 E-10 x 13d65e8c76722c_10000000001& E-24 + convertToDouble +739E-10 +} 0x3e73d65e8c76722d +test expr-28.815 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -867 E-7 x -16ba56a8834168_100000000001& E-14 + convertToDouble -867E-7 +} 0xbf16ba56a8834169 +test expr-28.816 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -415 E24 x -15747ab143e353_011111111110& E88 + convertToDouble -415E24 +} 0xc575747ab143e353 +test expr-28.817 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +332 E25 x 15747ab143e353_011111111110& E91 + convertToDouble +332E25 +} 0x45a5747ab143e353 +test expr-28.818 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -664 E25 x -15747ab143e353_011111111110& E92 + convertToDouble -664E25 +} 0xc5b5747ab143e353 +test expr-28.819 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +291 E-13 x 1ffeebfc8b81b5_01111111111110& E-36 + convertToDouble +291E-13 +} 0x3dbffeebfc8b81b5 +test expr-28.820 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -982 E-8 x -14981285e98e79_0111111111110& E-17 + convertToDouble -982E-8 +} 0xbee4981285e98e79 +test expr-28.821 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +582 E-13 x 1ffeebfc8b81b5_01111111111110& E-35 + convertToDouble +582E-13 +} 0x3dcffeebfc8b81b5 +test expr-28.822 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -491 E-8 x -14981285e98e79_0111111111110& E-18 + convertToDouble -491E-8 +} 0xbed4981285e98e79 +test expr-28.823 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +4574 E26 x 1717c1a612f954_100000000001& E98 + convertToDouble +4574E26 +} 0x461717c1a612f955 +test expr-28.824 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -8609 E26 x -15bb6f942546ee_1000000000001& E99 + convertToDouble -8609E26 +} 0xc625bb6f942546ef +test expr-28.825 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +2287 E26 x 1717c1a612f954_100000000001& E97 + convertToDouble +2287E26 +} 0x460717c1a612f955 +test expr-28.826 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -4818 E24 x -1f22b65eb419a0_10000000001& E91 + convertToDouble -4818E24 +} 0xc5af22b65eb419a1 +test expr-28.827 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +6529 E-8 x 111d89a8b5c142_100000000000001& E-14 + convertToDouble +6529E-8 +} 0x3f111d89a8b5c143 +test expr-28.828 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -8151 E-21 x -12cb804b61b898_1000000000000001& E-57 + convertToDouble -8151E-21 +} 0xbc62cb804b61b899 +test expr-28.829 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +1557 E-12 x 1abfc227ab1026_10000000000001& E-30 + convertToDouble +1557E-12 +} 0x3e1abfc227ab1027 +test expr-28.830 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -2573 E-18 x -172cef1ebbca44_10000000000001& E-49 + convertToDouble -2573E-18 +} 0xbce72cef1ebbca45 +test expr-28.831 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +4929 E-16 x 1157a604ed019f_0111111111111110& E-41 + convertToDouble +4929E-16 +} 0x3d6157a604ed019f +test expr-28.832 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -3053 E-22 x -1686f435fe6b6b_011111111111110& E-62 + convertToDouble -3053E-22 +} 0xbc1686f435fe6b6b +test expr-28.833 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +9858 E-16 x 1157a604ed019f_0111111111111110& E-40 + convertToDouble +9858E-16 +} 0x3d7157a604ed019f +test expr-28.834 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -7767 E-11 x -14d971170ed055_011111111111110& E-24 + convertToDouble -7767E-11 +} 0xbe74d971170ed055 +test expr-28.835 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +54339 E26 x 1125782ec15cbe_100000000000000001& E102 + convertToDouble +54339E26 +} 0x465125782ec15cbf +test expr-28.836 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -62409 E25 x -1f822c980d4bb2_100000000000000001& E98 + convertToDouble -62409E25 +} 0xc61f822c980d4bb3 +test expr-28.837 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +32819 E27 x 19e3be885fc16a_100000000000001& E104 + convertToDouble +32819E27 +} 0x4679e3be885fc16b +test expr-28.838 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -89849 E27 x -11b8371b6dda04_1000000000000001& E106 + convertToDouble -89849E27 +} 0xc691b8371b6dda05 +test expr-28.839 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +63876 E-20 x 1703856844bdbe_1000000000000000000001& E-51 + convertToDouble +63876E-20 +} 0x3cc703856844bdbf +test expr-28.840 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -15969 E-20 x -1703856844bdbe_1000000000000000000001& E-53 + convertToDouble -15969E-20 +} 0xbca703856844bdbf +test expr-28.841 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +31938 E-20 x 1703856844bdbe_1000000000000000000001& E-52 + convertToDouble +31938E-20 +} 0x3cb703856844bdbf +test expr-28.842 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -79845 E-21 x -1703856844bdbe_1000000000000000000001& E-54 + convertToDouble -79845E-21 +} 0xbc9703856844bdbf +test expr-28.843 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +89306 E27 x 119cccff237e17_011111111111110& E106 + convertToDouble +89306E27 +} 0x46919cccff237e17 +test expr-28.844 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -25487 E24 x -1496968ba07117_01111111111110& E94 + convertToDouble -25487E24 +} 0xc5d496968ba07117 +test expr-28.845 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +79889 E24 x 10222a1c7e27d3_01111111111110& E96 + convertToDouble +79889E24 +} 0x45f0222a1c7e27d3 +test expr-28.846 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -97379 E26 x -1eba3685911519_011111111111111110& E102 + convertToDouble -97379E26 +} 0xc65eba3685911519 +test expr-28.847 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +81002 E-8 x 1a8af0b45d9531_0111111111111111110& E-11 + convertToDouble +81002E-8 +} 0x3f4a8af0b45d9531 +test expr-28.848 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -43149 E-25 x -146064de6ecbed_011111111111111110& E-68 + convertToDouble -43149E-25 +} 0xbbb46064de6ecbed +test expr-28.849 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +40501 E-8 x 1a8af0b45d9531_0111111111111111110& E-12 + convertToDouble +40501E-8 +} 0x3f3a8af0b45d9531 +test expr-28.850 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -60318 E-10 x -194c988f217e51_011111111111111110& E-18 + convertToDouble -60318E-10 +} 0xbed94c988f217e51 +test expr-28.851 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -648299 E27 x -1ff6af0bf00100_10000000000000000001& E108 + convertToDouble -648299E27 +} 0xc6bff6af0bf00101 +test expr-28.852 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +780649 E24 x 13b4d36f9edd18_10000000000000000001& E99 + convertToDouble +780649E24 +} 0x4623b4d36f9edd19 +test expr-28.853 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +720919 E-14 x 1ef696965cbf04_10000000000000000000000001& E-28 + convertToDouble +720919E-14 +} 0x3e3ef696965cbf05 +test expr-28.854 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -629703 E-11 x -1a69626d2629d0_1000000000000000000000001& E-18 + convertToDouble -629703E-11 +} 0xbeda69626d2629d1 +test expr-28.855 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +557913 E24 x 1c2adb44b394bf_01111111111111111110& E98 + convertToDouble +557913E24 +} 0x461c2adb44b394bf +test expr-28.856 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -847899 E23 x -111f88fb93dce9_011111111111111111110& E96 + convertToDouble -847899E23 +} 0xc5f11f88fb93dce9 +test expr-28.857 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +565445 E27 x 1be0eb55770d4d_0111111111111111110& E108 + convertToDouble +565445E27 +} 0x46bbe0eb55770d4d +test expr-28.858 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -736531 E24 x -1297b853d64ac7_01111111111111111110& E99 + convertToDouble -736531E24 +} 0xc62297b853d64ac7 +test expr-28.859 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +680013 E-19 x 13240293e95c3b_01111111111111111111110& E-44 + convertToDouble +680013E-19 +} 0x3d33240293e95c3b +test expr-28.860 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -529981 E-10 x -1bc948d999ac11_011111111111111111110& E-15 + convertToDouble -529981E-10 +} 0xbf0bc948d999ac11 +test expr-28.861 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +382923 E-23 x 11a8c1c10a1fc5_011111111111111111110& E-58 + convertToDouble +382923E-23 +} 0x3c51a8c1c10a1fc5 +test expr-28.862 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -633614 E-18 x -164b166995a9b7_011111111111111111110& E-41 + convertToDouble -633614E-18 +} 0xbd664b166995a9b7 +test expr-28.863 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +2165479 E27 x 1ab10c016c34b8_100000000000000000000001& E110 + convertToDouble +2165479E27 +} 0x46dab10c016c34b9 +test expr-28.864 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -8661916 E27 x -1ab10c016c34b8_100000000000000000000001& E112 + convertToDouble -8661916E27 +} 0xc6fab10c016c34b9 +test expr-28.865 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +4330958 E27 x 1ab10c016c34b8_100000000000000000000001& E111 + convertToDouble +4330958E27 +} 0x46eab10c016c34b9 +test expr-28.866 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -9391993 E22 x -12f78bec748c98_1000000000000000000001& E96 + convertToDouble -9391993E22 +} 0xc5f2f78bec748c99 +test expr-28.867 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -5767352 E-14 x -1ef696965cbf04_10000000000000000000000001& E-25 + convertToDouble -5767352E-14 +} 0xbe6ef696965cbf05 +test expr-28.868 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +7209190 E-15 x 1ef696965cbf04_10000000000000000000000001& E-28 + convertToDouble +7209190E-15 +} 0x3e3ef696965cbf05 +test expr-28.869 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -1441838 E-14 x -1ef696965cbf04_10000000000000000000000001& E-27 + convertToDouble -1441838E-14 +} 0xbe4ef696965cbf05 +test expr-28.870 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +8478990 E22 x 111f88fb93dce9_011111111111111111110& E96 + convertToDouble +8478990E22 +} 0x45f11f88fb93dce9 +test expr-28.871 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +1473062 E24 x 1297b853d64ac7_01111111111111111110& E100 + convertToDouble +1473062E24 +} 0x463297b853d64ac7 +test expr-28.872 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +8366487 E-14 x 167567f55b22e1_0111111111111111111111110& E-24 + convertToDouble +8366487E-14 +} 0x3e767567f55b22e1 +test expr-28.873 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -8399969 E-25 x -1efd8be1b15b43_011111111111111111111110& E-61 + convertToDouble -8399969E-25 +} 0xbc2efd8be1b15b43 +test expr-28.874 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +9366737 E-12 x 13a4ba87ddc13f_011111111111111111111110& E-17 + convertToDouble +9366737E-12 +} 0x3ee3a4ba87ddc13f +test expr-28.875 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -9406141 E-13 x -1f8fd047c84d49_0111111111111111111111110& E-21 + convertToDouble -9406141E-13 +} 0xbeaf8fd047c84d49 +test expr-28.876 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +65970979 E24 x 1a055dd68f3e3c_1000000000000000000000000001& E105 + convertToDouble +65970979E24 +} 0x468a055dd68f3e3d +test expr-28.877 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -65060671 E26 x -140c61c9916cf4_100000000000000000000000001& E112 + convertToDouble -65060671E26 +} 0xc6f40c61c9916cf5 +test expr-28.878 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +54923002 E27 x 1527d37d8b38ea_10000000000000000000000001& E115 + convertToDouble +54923002E27 +} 0x472527d37d8b38eb +test expr-28.879 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -63846927 E25 x -1f7a9d79dad9b4_10000000000000000000000001& E108 + convertToDouble -63846927E25 +} 0xc6bf7a9d79dad9b5 +test expr-28.880 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +99585767 E-21 x 1c07e928406d2e_100000000000000000000000001& E-44 + convertToDouble +99585767E-21 +} 0x3d3c07e928406d2f +test expr-28.881 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +67488159 E25 x 10a31a03822bc9_011111111111111111111111111110& E109 + convertToDouble +67488159E25 +} 0x46c0a31a03822bc9 +test expr-28.882 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -69005339 E24 x -1b37c234aae77b_011111111111111111111111110& E105 + convertToDouble -69005339E24 +} 0xc68b37c234aae77b +test expr-28.883 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +81956786 E27 x 1f919023fcb6fd_0111111111111111111111111110& E115 + convertToDouble +81956786E27 +} 0x472f919023fcb6fd +test expr-28.884 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -40978393 E27 x -1f919023fcb6fd_0111111111111111111111111110& E114 + convertToDouble -40978393E27 +} 0xc71f919023fcb6fd +test expr-28.885 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +77505754 E-12 x 145152b6f85e09_0111111111111111111111111110& E-14 + convertToDouble +77505754E-12 +} 0x3f145152b6f85e09 +test expr-28.886 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -38752877 E-12 x -145152b6f85e09_0111111111111111111111111110& E-15 + convertToDouble -38752877E-12 +} 0xbf045152b6f85e09 +test expr-28.887 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +82772981 E-15 x 16381dae63505f_0111111111111111111111111111110& E-24 + convertToDouble +82772981E-15 +} 0x3e76381dae63505f +test expr-28.888 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -95593517 E-25 x -160ad862d8537d_0111111111111111111111111110& E-57 + convertToDouble -95593517E-25 +} 0xbc660ad862d8537d +test expr-28.889 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +200036989 E25 x 18a80dedbc575e_10000000000000000000000000001& E110 + convertToDouble +200036989E25 +} 0x46d8a80dedbc575f +test expr-28.890 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -772686455 E27 x -129a0c45ceca7a_1000000000000000000000000000001& E119 + convertToDouble -772686455E27 +} 0xc7629a0c45ceca7b +test expr-28.891 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +859139907 E23 x 10f18c4dd0ffe2_10000000000000000000000000001& E106 + convertToDouble +859139907E23 +} 0x4690f18c4dd0ffe3 +test expr-28.892 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -400073978 E25 x -18a80dedbc575e_10000000000000000000000000001& E111 + convertToDouble -400073978E25 +} 0xc6e8a80dedbc575f +test expr-28.893 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +569014327 E-14 x 17ddbeac19d3b2_100000000000000000000000000001& E-18 + convertToDouble +569014327E-14 +} 0x3ed7ddbeac19d3b3 +test expr-28.894 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -794263862 E-15 x -1aa6acb41dfc52_1000000000000000000000000000001& E-21 + convertToDouble -794263862E-15 +} 0xbeaaa6acb41dfc53 +test expr-28.895 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +397131931 E-15 x 1aa6acb41dfc52_1000000000000000000000000000001& E-22 + convertToDouble +397131931E-15 +} 0x3e9aa6acb41dfc53 +test expr-28.896 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -380398957 E-16 x -146c29d8331024_100000000000000000000000000001& E-25 + convertToDouble -380398957E-16 +} 0xbe646c29d8331025 +test expr-28.897 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +567366773 E27 x 1b5155dd5417f9_0111111111111111111111111111110& E118 + convertToDouble +567366773E27 +} 0x475b5155dd5417f9 +test expr-28.898 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -337440795 E24 x -10a31a03822bc9_011111111111111111111111111110& E108 + convertToDouble -337440795E24 +} 0xc6b0a31a03822bc9 +test expr-28.899 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +134976318 E25 x 10a31a03822bc9_011111111111111111111111111110& E110 + convertToDouble +134976318E25 +} 0x46d0a31a03822bc9 +test expr-28.900 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -269952636 E25 x -10a31a03822bc9_011111111111111111111111111110& E111 + convertToDouble -269952636E25 +} 0xc6e0a31a03822bc9 +test expr-28.901 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +932080597 E-20 x 147f25b4941e5b_0111111111111111111111111111110& E-37 + convertToDouble +932080597E-20 +} 0x3da47f25b4941e5b +test expr-28.902 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -331091924 E-15 x -16381dae63505f_0111111111111111111111111111110& E-22 + convertToDouble -331091924E-15 +} 0xbe96381dae63505f +test expr-28.903 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -413864905 E-16 x -16381dae63505f_0111111111111111111111111111110& E-25 + convertToDouble -413864905E-16 +} 0xbe66381dae63505f +test expr-28.904 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +8539246247 E26 x 148eb7813eaeba_10000000000000000000000000000001& E119 + convertToDouble +8539246247E26 +} 0x47648eb7813eaebb +test expr-28.905 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -5859139791 E26 x -1c35f28719d478_10000000000000000000000000000001& E118 + convertToDouble -5859139791E26 +} 0xc75c35f28719d479 +test expr-28.906 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +6105010149 E24 x 12d000fb2b138a_1000000000000000000000000000000001& E112 + convertToDouble +6105010149E24 +} 0x46f2d000fb2b138b +test expr-28.907 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -3090745820 E27 x -129a0c45ceca7a_1000000000000000000000000000001& E121 + convertToDouble -3090745820E27 +} 0xc7829a0c45ceca7b +test expr-28.908 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +3470877773 E-20 x 1314d381f2c31e_1000000000000000000000000000000001& E-35 + convertToDouble +3470877773E-20 +} 0x3dc314d381f2c31f +test expr-28.909 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -6136309089 E-27 x -1c4c799fab4328_1000000000000000000000000000000001& E-58 + convertToDouble -6136309089E-27 +} 0xbc5c4c799fab4329 +test expr-28.910 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +8917758713 E-19 x 1ea424bda7d7f4_100000000000000000000000000000001& E-31 + convertToDouble +8917758713E-19 +} 0x3e0ea424bda7d7f5 +test expr-28.911 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -6941755546 E-20 x -1314d381f2c31e_1000000000000000000000000000000001& E-34 + convertToDouble -6941755546E-20 +} 0xbdd314d381f2c31f +test expr-28.912 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +9194900535 E25 x 11b56f9c090dfb_011111111111111111111111111111111110& E116 + convertToDouble +9194900535E25 +} 0x4731b56f9c090dfb +test expr-28.913 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -1838980107 E26 x -11b56f9c090dfb_011111111111111111111111111111111110& E117 + convertToDouble -1838980107E26 +} 0xc741b56f9c090dfb +test expr-28.914 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +7355920428 E26 x 11b56f9c090dfb_011111111111111111111111111111111110& E119 + convertToDouble +7355920428E26 +} 0x4761b56f9c090dfb +test expr-28.915 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -3677960214 E26 x -11b56f9c090dfb_011111111111111111111111111111111110& E118 + convertToDouble -3677960214E26 +} 0xc751b56f9c090dfb +test expr-28.916 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +8473634343 E-17 x 16bf0984b232b7_0111111111111111111111111111111110& E-24 + convertToDouble +8473634343E-17 +} 0x3e76bf0984b232b7 +test expr-28.917 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -8870766274 E-16 x -1dc3ee22137269_0111111111111111111111111111111110& E-21 + convertToDouble -8870766274E-16 +} 0xbeadc3ee22137269 +test expr-28.918 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +4435383137 E-16 x 1dc3ee22137269_0111111111111111111111111111111110& E-22 + convertToDouble +4435383137E-16 +} 0x3e9dc3ee22137269 +test expr-28.919 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -9598990129 E-15 x -14216b286031e7_01111111111111111111111111111111110& E-17 + convertToDouble -9598990129E-15 +} 0xbee4216b286031e7 +test expr-28.920 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +71563496764 E26 x 15890d1ef6a0da_10000000000000000000000000000000000001& E122 + convertToDouble +71563496764E26 +} 0x4795890d1ef6a0db +test expr-28.921 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -89454370955 E25 x -15890d1ef6a0da_10000000000000000000000000000000000001& E119 + convertToDouble -89454370955E25 +} 0xc765890d1ef6a0db +test expr-28.922 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +17890874191 E26 x 15890d1ef6a0da_10000000000000000000000000000000000001& E120 + convertToDouble +17890874191E26 +} 0x4775890d1ef6a0db +test expr-28.923 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -35781748382 E26 x -15890d1ef6a0da_10000000000000000000000000000000000001& E121 + convertToDouble -35781748382E26 +} 0xc785890d1ef6a0db +test expr-28.924 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +57973447842 E-19 x 18e63f7cf5313c_1000000000000000000000000000000000000001& E-28 + convertToDouble +57973447842E-19 +} 0x3e38e63f7cf5313d +test expr-28.925 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -28986723921 E-19 x -18e63f7cf5313c_1000000000000000000000000000000000000001& E-29 + convertToDouble -28986723921E-19 +} 0xbe28e63f7cf5313d +test expr-28.926 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +76822711313 E-19 x 107f5f8b3bf818_100000000000000000000000000000000001& E-27 + convertToDouble +76822711313E-19 +} 0x3e407f5f8b3bf819 +test expr-28.927 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -97699466874 E-20 x -10c8de34de806e_10000000000000000000000000000000001& E-30 + convertToDouble -97699466874E-20 +} 0xbe10c8de34de806f +test expr-28.928 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +67748656762 E27 x 197bf5559b31fd_01111111111111111111111111111111111110& E125 + convertToDouble +67748656762E27 +} 0x47c97bf5559b31fd +test expr-28.929 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -19394840991 E24 x -1de1ea791a6e7d_0111111111111111111111111111111111110& E113 + convertToDouble -19394840991E24 +} 0xc70de1ea791a6e7d +test expr-28.930 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +38789681982 E24 x 1de1ea791a6e7d_0111111111111111111111111111111111110& E114 + convertToDouble +38789681982E24 +} 0x471de1ea791a6e7d +test expr-28.931 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -33874328381 E27 x -197bf5559b31fd_01111111111111111111111111111111111110& E124 + convertToDouble -33874328381E27 +} 0xc7b97bf5559b31fd +test expr-28.932 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +54323763886 E-27 x 1f50c5c63e5441_0111111111111111111111111111111111110& E-55 + convertToDouble +54323763886E-27 +} 0x3c8f50c5c63e5441 +test expr-28.933 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -58987193887 E-20 x -14449185a4c829_011111111111111111111111111111111111110& E-31 + convertToDouble -58987193887E-20 +} 0xbe04449185a4c829 +test expr-28.934 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +27161881943 E-27 x 1f50c5c63e5441_0111111111111111111111111111111111110& E-56 + convertToDouble +27161881943E-27 +} 0x3c7f50c5c63e5441 +test expr-28.935 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -93042648033 E-19 x -13fb12dc023fd3_0111111111111111111111111111111111110& E-27 + convertToDouble -93042648033E-19 +} 0xbe43fb12dc023fd3 +test expr-28.936 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +520831059055 E27 x 187d469cb69dd0_10000000000000000000000000000000000000001& E128 + convertToDouble +520831059055E27 +} 0x47f87d469cb69dd1 +test expr-28.937 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -768124264394 E25 x -171d6a019edae8_1000000000000000000000000000000000000001& E122 + convertToDouble -768124264394E25 +} 0xc7971d6a019edae9 +test expr-28.938 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +384062132197 E25 x 171d6a019edae8_1000000000000000000000000000000000000001& E121 + convertToDouble +384062132197E25 +} 0x47871d6a019edae9 +test expr-28.939 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +765337749889 E-25 x 158ad6f5d0a854_100000000000000000000000000000000000000001& E-44 + convertToDouble +765337749889E-25 +} 0x3d358ad6f5d0a855 +test expr-28.940 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +794368912771 E25 x 17e79872f2f7ef_01111111111111111111111111111111111111110& E122 + convertToDouble +794368912771E25 +} 0x4797e79872f2f7ef +test expr-28.941 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -994162090146 E23 x -132598f85e658b_011111111111111111111111111111111111110& E116 + convertToDouble -994162090146E23 +} 0xc7332598f85e658b +test expr-28.942 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +781652779431 E26 x 1d670adf52038f_01111111111111111111111111111111111110& E125 + convertToDouble +781652779431E26 +} 0x47cd670adf52038f +test expr-28.943 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +910077190046 E-26 x 147e3ce1871d79_01111111111111111111111111111111111111110& E-47 + convertToDouble +910077190046E-26 +} 0x3d047e3ce1871d79 +test expr-28.944 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -455038595023 E-26 x -147e3ce1871d79_01111111111111111111111111111111111111110& E-48 + convertToDouble -455038595023E-26 +} 0xbcf47e3ce1871d79 +test expr-28.945 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +471897551096 E-20 x 14449185a4c829_011111111111111111111111111111111111110& E-28 + convertToDouble +471897551096E-20 +} 0x3e34449185a4c829 +test expr-28.946 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -906698409911 E-21 x -1f27674f7d5745_0111111111111111111111111111111111111110& E-31 + convertToDouble -906698409911E-21 +} 0xbe0f27674f7d5745 +test expr-28.947 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +8854128003935 E25 x 10a71b8948faac_100000000000000000000000000000000000000001& E126 + convertToDouble +8854128003935E25 +} 0x47d0a71b8948faad +test expr-28.948 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -8146122716299 E27 x -17f0762ac05654_1000000000000000000000000000000000000000001& E132 + convertToDouble -8146122716299E27 +} 0xc837f0762ac05655 +test expr-28.949 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +7083302403148 E26 x 10a71b8948faac_100000000000000000000000000000000000000001& E129 + convertToDouble +7083302403148E26 +} 0x4800a71b8948faad +test expr-28.950 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -3541651201574 E26 x -10a71b8948faac_100000000000000000000000000000000000000001& E128 + convertToDouble -3541651201574E26 +} 0xc7f0a71b8948faad +test expr-28.951 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +8394920649291 E-25 x 1d8978e8c1cc78_100000000000000000000000000000000000000000001& E-41 + convertToDouble +8394920649291E-25 +} 0x3d6d8978e8c1cc79 +test expr-28.952 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -7657975756753 E-22 x -1a5006d695fef0_1000000000000000000000000000000000000000000001& E-31 + convertToDouble -7657975756753E-22 +} 0xbe0a5006d695fef1 +test expr-28.953 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +5473834002228 E-20 x 1d632e1f745624_100000000000000000000000000000000000000000001& E-25 + convertToDouble +5473834002228E-20 +} 0x3e6d632e1f745625 +test expr-28.954 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -6842292502785 E-21 x -1d632e1f745624_100000000000000000000000000000000000000000001& E-28 + convertToDouble -6842292502785E-21 +} 0xbe3d632e1f745625 +test expr-28.955 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -2109568884597 E25 x -1fbdc386609b13_011111111111111111111111111111111111111110& E123 + convertToDouble -2109568884597E25 +} 0xc7afbdc386609b13 +test expr-28.956 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +8438275538388 E25 x 1fbdc386609b13_011111111111111111111111111111111111111110& E125 + convertToDouble +8438275538388E25 +} 0x47cfbdc386609b13 +test expr-28.957 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -4219137769194 E25 x -1fbdc386609b13_011111111111111111111111111111111111111110& E124 + convertToDouble -4219137769194E25 +} 0xc7bfbdc386609b13 +test expr-28.958 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +3200141789841 E-25 x 1684dcea3829f7_0111111111111111111111111111111111111111110& E-42 + convertToDouble +3200141789841E-25 +} 0x3d5684dcea3829f7 +test expr-28.959 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -8655689322607 E-22 x -1dbd9ff5dc8991_011111111111111111111111111111111111111110& E-31 + convertToDouble -8655689322607E-22 +} 0xbe0dbd9ff5dc8991 +test expr-28.960 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +6400283579682 E-25 x 1684dcea3829f7_0111111111111111111111111111111111111111110& E-41 + convertToDouble +6400283579682E-25 +} 0x3d6684dcea3829f7 +test expr-28.961 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -8837719634493 E-21 x -12fa9676d2585b_011111111111111111111111111111111111111110& E-27 + convertToDouble -8837719634493E-21 +} 0xbe42fa9676d2585b +test expr-28.962 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +19428217075297 E24 x 1d3b7a1d154aba_10000000000000000000000000000000000000000000001& E123 + convertToDouble +19428217075297E24 +} 0x47ad3b7a1d154abb +test expr-28.963 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -38856434150594 E24 x -1d3b7a1d154aba_10000000000000000000000000000000000000000000001& E124 + convertToDouble -38856434150594E24 +} 0xc7bd3b7a1d154abb +test expr-28.964 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +77712868301188 E24 x 1d3b7a1d154aba_10000000000000000000000000000000000000000000001& E125 + convertToDouble +77712868301188E24 +} 0x47cd3b7a1d154abb +test expr-28.965 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -77192037242133 E27 x -1c5b1ab32d5dbe_1000000000000000000000000000000000000000000000001& E135 + convertToDouble -77192037242133E27 +} 0xc86c5b1ab32d5dbf +test expr-28.966 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +76579757567530 E-23 x 1a5006d695fef0_1000000000000000000000000000000000000000000001& E-31 + convertToDouble +76579757567530E-23 +} 0x3e0a5006d695fef1 +test expr-28.967 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +15315951513506 E-22 x 1a5006d695fef0_1000000000000000000000000000000000000000000001& E-30 + convertToDouble +15315951513506E-22 +} 0x3e1a5006d695fef1 +test expr-28.968 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -38289878783765 E-23 x -1a5006d695fef0_1000000000000000000000000000000000000000000001& E-32 + convertToDouble -38289878783765E-23 +} 0xbdfa5006d695fef1 +test expr-28.969 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +49378033925202 E25 x 1737aa2567167b_0111111111111111111111111111111111111111111110& E128 + convertToDouble +49378033925202E25 +} 0x47f737aa2567167b +test expr-28.970 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -50940527102367 E24 x -132964f2944b05_0111111111111111111111111111111111111111111111110& E125 + convertToDouble -50940527102367E24 +} 0xc7c32964f2944b05 +test expr-28.971 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +98756067850404 E25 x 1737aa2567167b_0111111111111111111111111111111111111111111110& E129 + convertToDouble +98756067850404E25 +} 0x480737aa2567167b +test expr-28.972 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -99589397544892 E26 x -1d4446075c4933_0111111111111111111111111111111111111111111110& E132 + convertToDouble -99589397544892E26 +} 0xc83d4446075c4933 +test expr-28.973 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -56908598265713 E-25 x -190756ab1ed6b3_011111111111111111111111111111111111111111111110& E-38 + convertToDouble -56908598265713E-25 +} 0xbd990756ab1ed6b3 +test expr-28.974 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +97470695699657 E-22 x 14ee821710e655_01111111111111111111111111111111111111111111110& E-27 + convertToDouble +97470695699657E-22 +} 0x3e44ee821710e655 +test expr-28.975 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -35851901247343 E-25 x -1f8921657e1581_0111111111111111111111111111111111111111111110& E-39 + convertToDouble -35851901247343E-25 +} 0xbd8f8921657e1581 +test expr-28.976 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +154384074484266 E27 x 1c5b1ab32d5dbe_1000000000000000000000000000000000000000000000001& E136 + convertToDouble +154384074484266E27 +} 0x487c5b1ab32d5dbf +test expr-28.977 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -308768148968532 E27 x -1c5b1ab32d5dbe_1000000000000000000000000000000000000000000000001& E137 + convertToDouble -308768148968532E27 +} 0xc88c5b1ab32d5dbf +test expr-28.978 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +910990389005985 E23 x 112242592ae54a_100000000000000000000000000000000000000000000001& E126 + convertToDouble +910990389005985E23 +} 0x47d12242592ae54b +test expr-28.979 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +271742424169201 E-27 x 131f46bcf7b452_10000000000000000000000000000000000000000000000001& E-42 + convertToDouble +271742424169201E-27 +} 0x3d531f46bcf7b453 +test expr-28.980 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -543484848338402 E-27 x -131f46bcf7b452_10000000000000000000000000000000000000000000000001& E-41 + convertToDouble -543484848338402E-27 +} 0xbd631f46bcf7b453 +test expr-28.981 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +162192083357563 E-26 x 1c887b68658760_1000000000000000000000000000000000000000000000001& E-40 + convertToDouble +162192083357563E-26 +} 0x3d7c887b68658761 +test expr-28.982 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -869254552770081 E-23 x -12aac70665485e_1000000000000000000000000000000000000000000000000001& E-27 + convertToDouble -869254552770081E-23 +} 0xbe42aac70665485f +test expr-28.983 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +664831007626046 E24 x 1f429cb67eb075_011111111111111111111111111111111111111111111111110& E128 + convertToDouble +664831007626046E24 +} 0x47ff429cb67eb075 +test expr-28.984 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -332415503813023 E24 x -1f429cb67eb075_011111111111111111111111111111111111111111111111110& E127 + convertToDouble -332415503813023E24 +} 0xc7ef429cb67eb075 +test expr-28.985 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +943701829041427 E24 x 162fb2e38ee461_01111111111111111111111111111111111111111111111110& E129 + convertToDouble +943701829041427E24 +} 0x48062fb2e38ee461 +test expr-28.986 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -101881054204734 E24 x -132964f2944b05_0111111111111111111111111111111111111111111111110& E126 + convertToDouble -101881054204734E24 +} 0xc7d32964f2944b05 +test expr-28.987 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +828027839666967 E-27 x 1d2236349da3cd_011111111111111111111111111111111111111111111111110& E-41 + convertToDouble +828027839666967E-27 +} 0x3d6d2236349da3cd +test expr-28.988 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -280276135608777 E-27 x -13b901892fd0bf_0111111111111111111111111111111111111111111111110& E-42 + convertToDouble -280276135608777E-27 +} 0xbd53b901892fd0bf +test expr-28.989 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +212839188833879 E-21 x 1c91194dc2d40b_0111111111111111111111111111111111111111111111110& E-23 + convertToDouble +212839188833879E-21 +} 0x3e8c91194dc2d40b +test expr-28.990 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -113817196531426 E-25 x -190756ab1ed6b3_011111111111111111111111111111111111111111111110& E-37 + convertToDouble -113817196531426E-25 +} 0xbda90756ab1ed6b3 +test expr-28.991 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +9711553197796883 E27 x 1bdeec25c0f03e_10000000000000000000000000000000000000000000000000001& E142 + convertToDouble +9711553197796883E27 +} 0x48dbdeec25c0f03f +test expr-28.992 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -2739849386524269 E26 x -19295ade212370_1000000000000000000000000000000000000000000000000001& E137 + convertToDouble -2739849386524269E26 +} 0xc889295ade212371 +test expr-28.993 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +5479698773048538 E26 x 19295ade212370_1000000000000000000000000000000000000000000000000001& E138 + convertToDouble +5479698773048538E26 +} 0x4899295ade212371 +test expr-28.994 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +6124568318523113 E-25 x 150b3a2e0aff14_1000000000000000000000000000000000000000000000000000001& E-31 + convertToDouble +6124568318523113E-25 +} 0x3e050b3a2e0aff15 +test expr-28.995 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -1139777988171071 E-24 x -1394cbee428ea4_10000000000000000000000000000000000000000000000000001& E-30 + convertToDouble -1139777988171071E-24 +} 0xbe1394cbee428ea5 +test expr-28.996 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +6322612303128019 E-27 x 1bcea0ec21e250_1000000000000000000000000000000000000000000000000000001& E-38 + convertToDouble +6322612303128019E-27 +} 0x3d9bcea0ec21e251 +test expr-28.997 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -2955864564844617 E-25 x -1450030e26c6dc_10000000000000000000000000000000000000000000000000001& E-32 + convertToDouble -2955864564844617E-25 +} 0xbdf450030e26c6dd +test expr-28.998 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -9994029144998961 E25 x -125b2b7fed4a61_0111111111111111111111111111111111111111111111111110& E136 + convertToDouble -9994029144998961E25 +} 0xc8725b2b7fed4a61 +test expr-28.999 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -2971238324022087 E27 x -110dd7a301db67_0111111111111111111111111111111111111111111111111110& E141 + convertToDouble -2971238324022087E27 +} 0xc8c10dd7a301db67 +test expr-28.1000 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -1656055679333934 E-27 x -1d2236349da3cd_011111111111111111111111111111111111111111111111110& E-40 + convertToDouble -1656055679333934E-27 +} 0xbd7d2236349da3cd +test expr-28.1001 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -1445488709150234 E-26 x -1fc960c59526c7_0111111111111111111111111111111111111111111111110& E-37 + convertToDouble -1445488709150234E-26 +} 0xbdafc960c59526c7 +test expr-28.1002 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +55824717499885172 E27 x 1406b0cd17fd56_1000000000000000000000000000000000000000000000000000000001& E145 + convertToDouble +55824717499885172E27 +} 0x490406b0cd17fd57 +test expr-28.1003 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -69780896874856465 E26 x -1406b0cd17fd56_1000000000000000000000000000000000000000000000000000000001& E142 + convertToDouble -69780896874856465E26 +} 0xc8d406b0cd17fd57 +test expr-28.1004 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +84161538867545199 E25 x 13529217bdce6c_10000000000000000000000000000000000000000000000000000000001& E139 + convertToDouble +84161538867545199E25 +} 0x48a3529217bdce6d +test expr-28.1005 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -27912358749942586 E27 x -1406b0cd17fd56_1000000000000000000000000000000000000000000000000000000001& E144 + convertToDouble -27912358749942586E27 +} 0xc8f406b0cd17fd57 +test expr-28.1006 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +24711112462926331 E-25 x 153a07f6040d22_100000000000000000000000000000000000000000000000000000001& E-29 + convertToDouble +24711112462926331E-25 +} 0x3e253a07f6040d23 +test expr-28.1007 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -12645224606256038 E-27 x -1bcea0ec21e250_1000000000000000000000000000000000000000000000000000001& E-37 + convertToDouble -12645224606256038E-27 +} 0xbdabcea0ec21e251 +test expr-28.1008 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -12249136637046226 E-25 x -150b3a2e0aff14_1000000000000000000000000000000000000000000000000000001& E-30 + convertToDouble -12249136637046226E-25 +} 0xbe150b3a2e0aff15 +test expr-28.1009 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +74874448287465757 E27 x 1adc21d1d50b09_01111111111111111111111111111111111111111111111111111110& E145 + convertToDouble +74874448287465757E27 +} 0x490adc21d1d50b09 +test expr-28.1010 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -35642836832753303 E24 x -1a2fac2b421f53_0111111111111111111111111111111111111111111111111111110& E134 + convertToDouble -35642836832753303E24 +} 0xc85a2fac2b421f53 +test expr-28.1011 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -71285673665506606 E24 x -1a2fac2b421f53_0111111111111111111111111111111111111111111111111111110& E135 + convertToDouble -71285673665506606E24 +} 0xc86a2fac2b421f53 +test expr-28.1012 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +43723334984997307 E-26 x 1e0be3f392c549_01111111111111111111111111111111111111111111111111111110& E-32 + convertToDouble +43723334984997307E-26 +} 0x3dfe0be3f392c549 +test expr-28.1013 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN +10182419849537963 E-24 x 15ddd831ebbe53_011111111111111111111111111111111111111111111111111110& E-27 + convertToDouble +10182419849537963E-24 +} 0x3e45ddd831ebbe53 +test expr-28.1014 {input floating-point conversion} {ieeeFloatingPoint} { + # Ad2b dieee UN -93501703572661982 E-26 x -10103f97ea6e13_0111111111111111111111111111111111111111111111111110& E-30 + convertToDouble -93501703572661982E-26 +} 0xbe10103f97ea6e13 + +test expr-29.1 {smallest representible number} {ieeeFloatingPoint} { + list [catch {convertToDouble 4.9406564584124654e-324} result] \ + $result \ + [catch {convertToDouble 2.4703282292062327e-324} result] \ + $result \ + [catch {convertToDouble 2.47032822920623e-324} result] \ + $result +} {0 0x0000000000000001 0 0x0000000000000001 0 0x0000000000000000} +test expr-29.2 {smallest representible number} {ieeeFloatingPoint} { + list [catch {convertToDouble -4.9406564584124654e-324} result] \ + $result \ + [catch {convertToDouble -2.4703282292062327e-324} result] \ + $result \ + [catch {convertToDouble -2.47032822920623e-324} result] \ + $result +} {0 0x8000000000000001 0 0x8000000000000001 0 0x8000000000000000} +test expr-29.3 {silent underflow on input conversion} {ieeeFloatingPoint} { + set v ? + list [scan 2.47032822920623e-324 %g v] $v +} {1 0.0} +test expr-29.4 {silent underflow on input conversion} {ieeeFloatingPoint} { + set v ? + list [scan -2.47032822920623e-324 %g v] $v +} {1 -0.0} + +test expr-30.1 {largest representible number} {ieeeFloatingPoint} { + list [catch {convertToDouble 1.7976931348623155e+308} result] \ + $result \ + [catch {convertToDouble 1.7976931348623157e+308} result] \ + $result \ + [catch {convertToDouble 1.7976931348623159e+308} result] \ + $result +} {0 0x7feffffffffffffe 0 0x7fefffffffffffff 0 0x7ff0000000000000} +test expr-30.2 {largest representible number} {ieeeFloatingPoint} { + list [catch {convertToDouble -1.7976931348623155e+308} result] \ + $result \ + [catch {convertToDouble -1.7976931348623157e+308} result] \ + $result \ + [catch {convertToDouble -1.7976931348623159e+308} result] \ + $result +} {0 0xffeffffffffffffe 0 0xffefffffffffffff 0 0xfff0000000000000} +test expr-30.3 {silent overflow on input conversion} {ieeeFloatingPoint} { + set v ? + list [scan 1.7976931348623159e+308 %f v] $v +} {1 Inf} +test expr-30.4 {silent overflow on input conversion} {ieeeFloatingPoint} { + set v ? + list [scan -1.7976931348623159e+308 %f v] $v +} {1 -Inf} + # cleanup if {[info exists a]} { unset a } ::tcltest::cleanupTests return + +# Local Variables: +# mode: tcl +# End: diff --git a/tests/fCmd.test b/tests/fCmd.test index 029c13f..4ba7034 100644 --- a/tests/fCmd.test +++ b/tests/fCmd.test @@ -10,7 +10,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: fCmd.test,v 1.45 2005/01/04 17:05:28 dgp Exp $ +# RCS: @(#) $Id: fCmd.test,v 1.46 2005/05/10 18:35:19 kennykb Exp $ # if {[lsearch [namespace children] ::tcltest] == -1} { diff --git a/tests/for.test b/tests/for.test index c6d7395..0217f78 100644 --- a/tests/for.test +++ b/tests/for.test @@ -9,7 +9,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: for.test,v 1.10 2004/09/26 16:36:06 msofer Exp $ +# RCS: @(#) $Id: for.test,v 1.11 2005/05/10 18:35:20 kennykb Exp $ if {[lsearch [namespace children] ::tcltest] == -1} { package require tcltest 2 @@ -659,10 +659,10 @@ test for-6.6 {Tcl_ForObjCmd: error in initial command} -body { ("for" initial command) invoked from within "$z {set} {$i < 5} {incr i} {body}"}} -test for-6.7 {Tcl_ForObjCmd: error in test expression} { +test for-6.7 {Tcl_ForObjCmd: error in test expression} -match glob -body { set z for list [catch {$z {set i 0} {i < 5} {incr i} {body}} msg] $msg $errorInfo -} {1 {syntax error in expression "i < 5": variable references require preceding $} {syntax error in expression "i < 5": variable references require preceding $ +} -result {1 {syntax error in expression "i < 5": * preceding $*} {syntax error in expression "i < 5": * preceding $* while executing "$z {set i 0} {i < 5} {incr i} {body}"}} test for-6.8 {Tcl_ForObjCmd: test expression is enclosed in quotes} { diff --git a/tests/interp.test b/tests/interp.test index 9308e90..c5568b6 100644 --- a/tests/interp.test +++ b/tests/interp.test @@ -10,7 +10,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: interp.test,v 1.44 2004/12/16 19:36:35 dkf Exp $ +# RCS: @(#) $Id: interp.test,v 1.45 2005/05/10 18:35:20 kennykb Exp $ if {[lsearch [namespace children] ::tcltest] == -1} { package require tcltest 2.1 diff --git a/tests/io.test b/tests/io.test index cb831f8..9d724b8 100644 --- a/tests/io.test +++ b/tests/io.test @@ -12,7 +12,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: io.test,v 1.67 2005/04/14 02:41:34 davygrvy Exp $ +# RCS: @(#) $Id: io.test,v 1.68 2005/05/10 18:35:21 kennykb Exp $ if {[catch {package require tcltest 2}]} { puts stderr "Skipping tests in [info script]. tcltest 2 required." diff --git a/tests/ioCmd.test b/tests/ioCmd.test index 49da62e..fd09bc7 100644 --- a/tests/ioCmd.test +++ b/tests/ioCmd.test @@ -12,7 +12,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: ioCmd.test,v 1.22 2005/04/27 18:48:26 dgp Exp $ +# RCS: @(#) $Id: ioCmd.test,v 1.23 2005/05/10 18:35:22 kennykb Exp $ if {[lsearch [namespace children] ::tcltest] == -1} { package require tcltest diff --git a/tests/iogt.test b/tests/iogt.test index fe2c9fa..9e09270 100644 --- a/tests/iogt.test +++ b/tests/iogt.test @@ -10,7 +10,7 @@ # Copyright (c) 2000 Andreas Kupries. # All rights reserved. # -# RCS: @(#) $Id: iogt.test,v 1.12 2005/04/14 04:43:51 davygrvy Exp $ +# RCS: @(#) $Id: iogt.test,v 1.13 2005/05/10 18:35:22 kennykb Exp $ if {[catch {package require tcltest 2.1}]} { puts stderr "Skipping tests in [info script]. tcltest 2.1 required." diff --git a/tests/lindex.test b/tests/lindex.test index 2e180c2..7fcc24a 100644 --- a/tests/lindex.test +++ b/tests/lindex.test @@ -12,7 +12,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: lindex.test,v 1.12 2005/04/29 20:49:44 dgp Exp $ +# RCS: @(#) $Id: lindex.test,v 1.13 2005/05/10 18:35:22 kennykb Exp $ if {[lsearch [namespace children] ::tcltest] == -1} { package require tcltest diff --git a/tests/linsert.test b/tests/linsert.test index be8ae3d..3419c74 100644 --- a/tests/linsert.test +++ b/tests/linsert.test @@ -11,7 +11,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: linsert.test,v 1.9 2005/04/29 20:49:44 dgp Exp $ +# RCS: @(#) $Id: linsert.test,v 1.10 2005/05/10 18:35:22 kennykb Exp $ if {[lsearch [namespace children] ::tcltest] == -1} { package require tcltest diff --git a/tests/lrange.test b/tests/lrange.test index aaaf81e..29eafb9 100644 --- a/tests/lrange.test +++ b/tests/lrange.test @@ -11,7 +11,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: lrange.test,v 1.8 2005/04/29 20:49:44 dgp Exp $ +# RCS: @(#) $Id: lrange.test,v 1.9 2005/05/10 18:35:22 kennykb Exp $ if {[lsearch [namespace children] ::tcltest] == -1} { package require tcltest diff --git a/tests/lreplace.test b/tests/lreplace.test index 99b236e..6ea1f75 100644 --- a/tests/lreplace.test +++ b/tests/lreplace.test @@ -11,7 +11,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: lreplace.test,v 1.8 2005/04/29 20:49:44 dgp Exp $ +# RCS: @(#) $Id: lreplace.test,v 1.9 2005/05/10 18:35:22 kennykb Exp $ if {[lsearch [namespace children] ::tcltest] == -1} { package require tcltest diff --git a/tests/lsearch.test b/tests/lsearch.test index d509407..ec04689 100644 --- a/tests/lsearch.test +++ b/tests/lsearch.test @@ -11,7 +11,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: lsearch.test,v 1.14 2005/04/29 20:49:44 dgp Exp $ +# RCS: @(#) $Id: lsearch.test,v 1.15 2005/05/10 18:35:22 kennykb Exp $ if {[lsearch [namespace children] ::tcltest] == -1} { package require tcltest diff --git a/tests/msgcat.test b/tests/msgcat.test index 92a7109..06fccf6 100644 --- a/tests/msgcat.test +++ b/tests/msgcat.test @@ -12,7 +12,7 @@ # Note that after running these tests, entries will be left behind in the # message catalogs for locales foo, foo_BAR, and foo_BAR_baz. # -# RCS: @(#) $Id: msgcat.test,v 1.17 2004/12/06 22:49:40 dgp Exp $ +# RCS: @(#) $Id: msgcat.test,v 1.18 2005/05/10 18:35:22 kennykb Exp $ package require Tcl 8.2 if {[catch {package require tcltest 2}]} { diff --git a/tests/obj.test b/tests/obj.test index 8fe6e2b..7ca3e8e 100644 --- a/tests/obj.test +++ b/tests/obj.test @@ -11,7 +11,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: obj.test,v 1.13 2005/04/22 15:47:00 dgp Exp $ +# RCS: @(#) $Id: obj.test,v 1.14 2005/05/10 18:35:22 kennykb Exp $ if {[lsearch [namespace children] ::tcltest] == -1} { package require tcltest diff --git a/tests/parse.test b/tests/parse.test index 192e435..8481a6f 100644 --- a/tests/parse.test +++ b/tests/parse.test @@ -8,7 +8,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: parse.test,v 1.20 2005/03/18 15:51:01 dgp Exp $ +# RCS: @(#) $Id: parse.test,v 1.21 2005/05/10 18:35:22 kennykb Exp $ if {[catch {package require tcltest 2.0.2}]} { puts stderr "Skipping tests in [info script]. tcltest 2.0.2 required." diff --git a/tests/parseExpr.test b/tests/parseExpr.test index b60cee3..2fc4fed 100644 --- a/tests/parseExpr.test +++ b/tests/parseExpr.test @@ -8,7 +8,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: parseExpr.test,v 1.13 2004/06/23 15:36:57 dkf Exp $ +# RCS: @(#) $Id: parseExpr.test,v 1.14 2005/05/10 18:35:22 kennykb Exp $ if {[lsearch [namespace children] ::tcltest] == -1} { package require tcltest 2 @@ -27,6 +27,64 @@ testConstraint testexprparser [llength [info commands testexprparser]] testConstraint wideIntegerUnparsed [expr {-1 == 0xffffffff}] +# Big test for correct ordering of data in [expr] + +proc testIEEE {} { + variable ieeeValues + binary scan [binary format dd -1.0 1.0] c* c + switch -exact -- $c { + {0 0 0 0 0 0 -16 -65 0 0 0 0 0 0 -16 63} { + # little endian + binary scan \x00\x00\x00\x00\x00\x00\xf0\xff d \ + ieeeValues(-Infinity) + binary scan \x00\x00\x00\x00\x00\x00\xf0\xbf d \ + ieeeValues(-Normal) + binary scan \x00\x00\x00\x00\x00\x00\x08\x80 d \ + ieeeValues(-Subnormal) + binary scan \x00\x00\x00\x00\x00\x00\x00\x80 d \ + ieeeValues(-0) + binary scan \x00\x00\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(+0) + binary scan \x00\x00\x00\x00\x00\x00\x08\x00 d \ + ieeeValues(+Subnormal) + binary scan \x00\x00\x00\x00\x00\x00\xf0\x3f d \ + ieeeValues(+Normal) + binary scan \x00\x00\x00\x00\x00\x00\xf0\x7f d \ + ieeeValues(+Infinity) + binary scan \x00\x00\x00\x00\x00\x00\xf8\x7f d \ + ieeeValues(NaN) + set ieeeValues(littleEndian) 1 + return 1 + } + {-65 -16 0 0 0 0 0 0 63 -16 0 0 0 0 0 0} { + binary scan \xff\xf0\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(-Infinity) + binary scan \xbf\xf0\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(-Normal) + binary scan \x80\x08\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(-Subnormal) + binary scan \x80\x00\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(-0) + binary scan \x00\x00\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(+0) + binary scan \x00\x08\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(+Subnormal) + binary scan \x3f\xf0\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(+Normal) + binary scan \x7f\xf0\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(+Infinity) + binary scan \x7f\xf8\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(NaN) + set ieeeValues(littleEndian) 0 + return 1 + } + default { + return 0 + } + } +} +::tcltest::testConstraint ieeeFloatingPoint [testIEEE] + ###################################################################### test parseExpr-1.1 {Tcl_ParseExpr procedure, computing string length} testexprparser { @@ -38,9 +96,11 @@ test parseExpr-1.2 {Tcl_ParseExpr procedure, computing string length} testexprpa test parseExpr-1.3 {Tcl_ParseExpr procedure, error getting initial lexeme} {testexprparser wideIntegerUnparsed} { list [catch {testexprparser {12345678901234567890} -1} msg] $msg } {1 {integer value too large to represent}} -test parseExpr-1.4 {Tcl_ParseExpr procedure, error in conditional expression} testexprparser { - list [catch {testexprparser {foo+} -1} msg] $msg -} {1 {syntax error in expression "foo+": variable references require preceding $}} +test parseExpr-1.4 {Tcl_ParseExpr procedure, error in conditional expression} \ + -constraints testexprparser -body { + list [catch {testexprparser {foo+} -1} msg] $msg + } -match glob \ + -result {1 {syntax error in expression "foo+": *preceding $*}} test parseExpr-1.5 {Tcl_ParseExpr procedure, lexemes after the expression} testexprparser { list [catch {testexprparser {1+2 345} -1} msg] $msg } {1 {syntax error in expression "1+2 345": extra tokens at end of expression}} @@ -48,9 +108,11 @@ test parseExpr-1.5 {Tcl_ParseExpr procedure, lexemes after the expression} teste test parseExpr-2.1 {ParseCondExpr procedure, valid test subexpr} testexprparser { testexprparser {2>3? 1 : 0} -1 } {- {} 0 subexpr {2>3? 1 : 0} 11 operator ? 0 subexpr 2>3 5 operator > 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 subexpr 1 1 text 1 0 subexpr 0 1 text 0 0 {}} -test parseExpr-2.2 {ParseCondExpr procedure, error in test subexpr} testexprparser { - list [catch {testexprparser {0 || foo} -1} msg] $msg -} {1 {syntax error in expression "0 || foo": variable references require preceding $}} +test parseExpr-2.2 {ParseCondExpr procedure, error in test subexpr} \ + -constraints testexprparser -body { + list [catch {testexprparser {0 || foo} -1} msg] $msg + } -match glob \ + -result {1 {syntax error in expression "0 || foo": * preceding $*}} test parseExpr-2.3 {ParseCondExpr procedure, next lexeme isn't "?"} testexprparser { testexprparser {1+2} -1 } {- {} 0 subexpr 1+2 5 operator + 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 {}} @@ -63,25 +125,31 @@ test parseExpr-2.5 {ParseCondExpr procedure, bad lexeme after "?"} {testexprpars test parseExpr-2.6 {ParseCondExpr procedure, valid "then" subexpression} testexprparser { testexprparser {1? 3 : 4} -1 } {- {} 0 subexpr {1? 3 : 4} 7 operator ? 0 subexpr 1 1 text 1 0 subexpr 3 1 text 3 0 subexpr 4 1 text 4 0 {}} -test parseExpr-2.7 {ParseCondExpr procedure, error in "then" subexpression} testexprparser { - list [catch {testexprparser {1? fred : martha} -1} msg] $msg -} {1 {syntax error in expression "1? fred : martha": variable references require preceding $}} +test parseExpr-2.7 {ParseCondExpr procedure, error in "then" subexpression} \ + -constraints testexprparser -body { + list [catch {testexprparser {1? fred : martha} -1} msg] $msg + } -match glob \ + -result {1 {syntax error in expression "1? fred : martha": *preceding $*}} test parseExpr-2.8 {ParseCondExpr procedure, lexeme after "then" subexpr isn't ":"} testexprparser { list [catch {testexprparser {1? 2 martha 3} -1} msg] $msg } {1 {syntax error in expression "1? 2 martha 3": missing colon from ternary conditional}} test parseExpr-2.9 {ParseCondExpr procedure, valid "else" subexpression} testexprparser { testexprparser {27||3? 3 : 4&&9} -1 } {- {} 0 subexpr {27||3? 3 : 4&&9} 15 operator ? 0 subexpr 27||3 5 operator || 0 subexpr 27 1 text 27 0 subexpr 3 1 text 3 0 subexpr 3 1 text 3 0 subexpr 4&&9 5 operator && 0 subexpr 4 1 text 4 0 subexpr 9 1 text 9 0 {}} -test parseExpr-2.10 {ParseCondExpr procedure, error in "else" subexpression} testexprparser { - list [catch {testexprparser {1? 2 : martha} -1} msg] $msg -} {1 {syntax error in expression "1? 2 : martha": variable references require preceding $}} +test parseExpr-2.10 {ParseCondExpr procedure, error in "else" subexpression} \ + -constraints testexprparser -body { + list [catch {testexprparser {1? 2 : martha} -1} msg] $msg + } -match glob \ + -result {1 {syntax error in expression "1? 2 : martha": * preceding $*}} test parseExpr-3.1 {ParseLorExpr procedure, valid logical and subexpr} testexprparser { testexprparser {1&&2 || 3} -1 } {- {} 0 subexpr {1&&2 || 3} 9 operator || 0 subexpr 1&&2 5 operator && 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}} -test parseExpr-3.2 {ParseLorExpr procedure, error in logical and subexpr} testexprparser { - list [catch {testexprparser {1&&foo || 3} -1} msg] $msg -} {1 {syntax error in expression "1&&foo || 3": variable references require preceding $}} +test parseExpr-3.2 {ParseLorExpr procedure, error in logical and subexpr} \ + -constraints testexprparser -body { + list [catch {testexprparser {1&&foo || 3} -1} msg] $msg + } -match glob \ + -result {1 {syntax error in expression "1&&foo || 3": * preceding $*}} test parseExpr-3.3 {ParseLorExpr procedure, next lexeme isn't "||"} testexprparser { testexprparser {1&&2? 1 : 0} -1 } {- {} 0 subexpr {1&&2? 1 : 0} 11 operator ? 0 subexpr 1&&2 5 operator && 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 1 1 text 1 0 subexpr 0 1 text 0 0 {}} @@ -94,16 +162,20 @@ test parseExpr-3.5 {ParseLorExpr procedure, bad lexeme after "||"} {testexprpars test parseExpr-3.6 {ParseLorExpr procedure, valid RHS subexpression} testexprparser { testexprparser {1&&2 || 3 || 4} -1 } {- {} 0 subexpr {1&&2 || 3 || 4} 13 operator || 0 subexpr {1&&2 || 3} 9 operator || 0 subexpr 1&&2 5 operator && 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 subexpr 4 1 text 4 0 {}} -test parseExpr-3.7 {ParseLorExpr procedure, error in RHS subexpression} testexprparser { - list [catch {testexprparser {1&&2 || 3 || martha} -1} msg] $msg -} {1 {syntax error in expression "1&&2 || 3 || martha": variable references require preceding $}} +test parseExpr-3.7 {ParseLorExpr procedure, error in RHS subexpression} \ + -constraints testexprparser -body { + list [catch {testexprparser {1&&2 || 3 || martha} -1} msg] $msg + } -match glob \ + -result {1 {syntax error in expression "1&&2 || 3 || martha": * preceding $*}} test parseExpr-4.1 {ParseLandExpr procedure, valid LHS "|" subexpr} testexprparser { testexprparser {1|2 && 3} -1 } {- {} 0 subexpr {1|2 && 3} 9 operator && 0 subexpr 1|2 5 operator | 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}} -test parseExpr-4.2 {ParseLandExpr procedure, error in LHS "|" subexpr} testexprparser { - list [catch {testexprparser {1&&foo && 3} -1} msg] $msg -} {1 {syntax error in expression "1&&foo && 3": variable references require preceding $}} +test parseExpr-4.2 {ParseLandExpr procedure, error in LHS "|" subexpr} \ + -constraints testexprparser -body { + list [catch {testexprparser {1&&foo && 3} -1} msg] $msg + } -match glob \ + -result {1 {syntax error in expression "1&&foo && 3": * preceding $*}} test parseExpr-4.3 {ParseLandExpr procedure, next lexeme isn't "&&"} testexprparser { testexprparser {1|2? 1 : 0} -1 } {- {} 0 subexpr {1|2? 1 : 0} 11 operator ? 0 subexpr 1|2 5 operator | 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 1 1 text 1 0 subexpr 0 1 text 0 0 {}} @@ -116,16 +188,20 @@ test parseExpr-4.5 {ParseLandExpr procedure, bad lexeme after "&&"} {testexprpar test parseExpr-4.6 {ParseLandExpr procedure, valid RHS subexpression} testexprparser { testexprparser {1|2 && 3 && 4} -1 } {- {} 0 subexpr {1|2 && 3 && 4} 13 operator && 0 subexpr {1|2 && 3} 9 operator && 0 subexpr 1|2 5 operator | 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 subexpr 4 1 text 4 0 {}} -test parseExpr-4.7 {ParseLandExpr procedure, error in RHS subexpression} testexprparser { - list [catch {testexprparser {1|2 && 3 && martha} -1} msg] $msg -} {1 {syntax error in expression "1|2 && 3 && martha": variable references require preceding $}} +test parseExpr-4.7 {ParseLandExpr procedure, error in RHS subexpression} \ + -constraints testexprparser -body { + list [catch {testexprparser {1|2 && 3 && martha} -1} msg] $msg + } -match glob \ + -result {1 {syntax error in expression "1|2 && 3 && martha": * preceding $*}} test parseExpr-5.1 {ParseBitOrExpr procedure, valid LHS "^" subexpr} testexprparser { testexprparser {1^2 | 3} -1 } {- {} 0 subexpr {1^2 | 3} 9 operator | 0 subexpr 1^2 5 operator ^ 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}} -test parseExpr-5.2 {ParseBitOrExpr procedure, error in LHS "^" subexpr} testexprparser { - list [catch {testexprparser {1|foo | 3} -1} msg] $msg -} {1 {syntax error in expression "1|foo | 3": variable references require preceding $}} +test parseExpr-5.2 {ParseBitOrExpr procedure, error in LHS "^" subexpr} \ + -constraints testexprparser -body { + list [catch {testexprparser {1|foo | 3} -1} msg] $msg + } -match glob \ + -result {1 {syntax error in expression "1|foo | 3": * preceding $*}} test parseExpr-5.3 {ParseBitOrExpr procedure, next lexeme isn't "|"} testexprparser { testexprparser {1^2? 1 : 0} -1 } {- {} 0 subexpr {1^2? 1 : 0} 11 operator ? 0 subexpr 1^2 5 operator ^ 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 1 1 text 1 0 subexpr 0 1 text 0 0 {}} @@ -138,16 +214,20 @@ test parseExpr-5.5 {ParseBitOrExpr procedure, bad lexeme after "|"} {testexprpar test parseExpr-5.6 {ParseBitOrExpr procedure, valid RHS subexpression} testexprparser { testexprparser {1^2 | 3 | 4} -1 } {- {} 0 subexpr {1^2 | 3 | 4} 13 operator | 0 subexpr {1^2 | 3} 9 operator | 0 subexpr 1^2 5 operator ^ 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 subexpr 4 1 text 4 0 {}} -test parseExpr-5.7 {ParseBitOrExpr procedure, error in RHS subexpression} testexprparser { - list [catch {testexprparser {1^2 | 3 | martha} -1} msg] $msg -} {1 {syntax error in expression "1^2 | 3 | martha": variable references require preceding $}} +test parseExpr-5.7 {ParseBitOrExpr procedure, error in RHS subexpression} \ + -constraints testexprparser -body { + list [catch {testexprparser {1^2 | 3 | martha} -1} msg] $msg + } -match glob \ + -result {1 {syntax error in expression "1^2 | 3 | martha": * preceding $*}} test parseExpr-6.1 {ParseBitXorExpr procedure, valid LHS "&" subexpr} testexprparser { testexprparser {1&2 ^ 3} -1 } {- {} 0 subexpr {1&2 ^ 3} 9 operator ^ 0 subexpr 1&2 5 operator & 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}} -test parseExpr-6.2 {ParseBitXorExpr procedure, error in LHS "&" subexpr} testexprparser { - list [catch {testexprparser {1^foo ^ 3} -1} msg] $msg -} {1 {syntax error in expression "1^foo ^ 3": variable references require preceding $}} +test parseExpr-6.2 {ParseBitXorExpr procedure, error in LHS "&" subexpr} \ + -constraints testexprparser -body { + list [catch {testexprparser {1^foo ^ 3} -1} msg] $msg + } -match glob \ + -result {1 {syntax error in expression "1^foo ^ 3": * preceding $*}} test parseExpr-6.3 {ParseBitXorExpr procedure, next lexeme isn't "^"} testexprparser { testexprparser {1&2? 1 : 0} -1 } {- {} 0 subexpr {1&2? 1 : 0} 11 operator ? 0 subexpr 1&2 5 operator & 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 1 1 text 1 0 subexpr 0 1 text 0 0 {}} @@ -160,16 +240,20 @@ test parseExpr-6.5 {ParseBitXorExpr procedure, bad lexeme after "^"} {testexprpa test parseExpr-6.6 {ParseBitXorExpr procedure, valid RHS subexpression} testexprparser { testexprparser {1&2 ^ 3 ^ 4} -1 } {- {} 0 subexpr {1&2 ^ 3 ^ 4} 13 operator ^ 0 subexpr {1&2 ^ 3} 9 operator ^ 0 subexpr 1&2 5 operator & 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 subexpr 4 1 text 4 0 {}} -test parseExpr-6.7 {ParseBitXorExpr procedure, error in RHS subexpression} testexprparser { - list [catch {testexprparser {1&2 ^ 3 ^ martha} -1} msg] $msg -} {1 {syntax error in expression "1&2 ^ 3 ^ martha": variable references require preceding $}} +test parseExpr-6.7 {ParseBitXorExpr procedure, error in RHS subexpression} \ + -constraints testexprparser -body { + list [catch {testexprparser {1&2 ^ 3 ^ martha} -1} msg] $msg + } -match glob \ + -result {1 {syntax error in expression "1&2 ^ 3 ^ martha": * preceding $*}} test parseExpr-7.1 {ParseBitAndExpr procedure, valid LHS equality subexpr} testexprparser { testexprparser {1==2 & 3} -1 } {- {} 0 subexpr {1==2 & 3} 9 operator & 0 subexpr 1==2 5 operator == 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}} -test parseExpr-7.2 {ParseBitAndExpr procedure, error in LHS equality subexpr} testexprparser { - list [catch {testexprparser {1!=foo & 3} -1} msg] $msg -} {1 {syntax error in expression "1!=foo & 3": variable references require preceding $}} +test parseExpr-7.2 {ParseBitAndExpr procedure, error in LHS equality subexpr} \ + -constraints testexprparser -body { + list [catch {testexprparser {1!=foo & 3} -1} msg] $msg + } -match glob \ + -result {1 {syntax error in expression "1!=foo & 3": * preceding $*}} test parseExpr-7.3 {ParseBitAndExpr procedure, next lexeme isn't "&"} testexprparser { testexprparser {1==2? 1 : 0} -1 } {- {} 0 subexpr {1==2? 1 : 0} 11 operator ? 0 subexpr 1==2 5 operator == 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 1 1 text 1 0 subexpr 0 1 text 0 0 {}} @@ -182,16 +266,20 @@ test parseExpr-7.5 {ParseBitAndExpr procedure, bad lexeme after "&"} {testexprpa test parseExpr-7.6 {ParseBitAndExpr procedure, valid RHS subexpression} testexprparser { testexprparser {1<2 & 3 & 4} -1 } {- {} 0 subexpr {1<2 & 3 & 4} 13 operator & 0 subexpr {1<2 & 3} 9 operator & 0 subexpr 1<2 5 operator < 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 subexpr 4 1 text 4 0 {}} -test parseExpr-7.7 {ParseBitAndExpr procedure, error in RHS subexpression} testexprparser { - list [catch {testexprparser {1==2 & 3>2 & martha} -1} msg] $msg -} {1 {syntax error in expression "1==2 & 3>2 & martha": variable references require preceding $}} +test parseExpr-7.7 {ParseBitAndExpr procedure, error in RHS subexpression} \ + -constraints testexprparser -body { + list [catch {testexprparser {1==2 & 3>2 & martha} -1} msg] $msg + } -match glob \ + -result {1 {syntax error in expression "1==2 & 3>2 & martha": * preceding $*}} test parseExpr-8.1 {ParseEqualityExpr procedure, valid LHS relational subexpr} testexprparser { testexprparser {1<2 == 3} -1 } {- {} 0 subexpr {1<2 == 3} 9 operator == 0 subexpr 1<2 5 operator < 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}} -test parseExpr-8.2 {ParseEqualityExpr procedure, error in LHS relational subexpr} testexprparser { - list [catch {testexprparser {1>=foo == 3} -1} msg] $msg -} {1 {syntax error in expression "1>=foo == 3": variable references require preceding $}} +test parseExpr-8.2 {ParseEqualityExpr procedure, error in LHS relational subexpr} \ + -constraints testexprparser -body { + list [catch {testexprparser {1>=foo == 3} -1} msg] $msg + } -match glob \ + -result {1 {syntax error in expression "1>=foo == 3": * preceding $*}} test parseExpr-8.3 {ParseEqualityExpr procedure, next lexeme isn't "==" or "!="} testexprparser { testexprparser {1<2? 1 : 0} -1 } {- {} 0 subexpr {1<2? 1 : 0} 11 operator ? 0 subexpr 1<2 5 operator < 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 1 1 text 1 0 subexpr 0 1 text 0 0 {}} @@ -207,16 +295,20 @@ test parseExpr-8.6 {ParseEqualityExpr procedure, bad lexeme after "==" or "!="} test parseExpr-8.7 {ParseEqualityExpr procedure, valid RHS subexpression} testexprparser { testexprparser {1<2 == 3 == 4} -1 } {- {} 0 subexpr {1<2 == 3 == 4} 13 operator == 0 subexpr {1<2 == 3} 9 operator == 0 subexpr 1<2 5 operator < 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 subexpr 4 1 text 4 0 {}} -test parseExpr-8.8 {ParseEqualityExpr procedure, error in RHS subexpression} testexprparser { - list [catch {testexprparser {1<2 == 3 != martha} -1} msg] $msg -} {1 {syntax error in expression "1<2 == 3 != martha": variable references require preceding $}} +test parseExpr-8.8 {ParseEqualityExpr procedure, error in RHS subexpression} \ + -constraints testexprparser -body { + list [catch {testexprparser {1<2 == 3 != martha} -1} msg] $msg + } -match glob \ + -result {1 {syntax error in expression "1<2 == 3 != martha": * preceding $*}} test parseExpr-9.1 {ParseRelationalExpr procedure, valid LHS shift subexpr} testexprparser { testexprparser {1<<2 < 3} -1 } {- {} 0 subexpr {1<<2 < 3} 9 operator < 0 subexpr 1<<2 5 operator << 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}} -test parseExpr-9.2 {ParseRelationalExpr procedure, error in LHS shift subexpr} testexprparser { - list [catch {testexprparser {1>=foo < 3} -1} msg] $msg -} {1 {syntax error in expression "1>=foo < 3": variable references require preceding $}} +test parseExpr-9.2 {ParseRelationalExpr procedure, error in LHS shift subexpr} \ + -constraints testexprparser -body { + list [catch {testexprparser {1>=foo < 3} -1} msg] $msg + } -match glob \ + -result {1 {syntax error in expression "1>=foo < 3": * preceding $*}} test parseExpr-9.3 {ParseRelationalExpr procedure, next lexeme isn't relational op} testexprparser { testexprparser {1<<2? 1 : 0} -1 } {- {} 0 subexpr {1<<2? 1 : 0} 11 operator ? 0 subexpr 1<<2 5 operator << 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 1 1 text 1 0 subexpr 0 1 text 0 0 {}} @@ -238,16 +330,20 @@ test parseExpr-9.8 {ParseRelationalExpr procedure, bad lexeme after relational o test parseExpr-9.9 {ParseRelationalExpr procedure, valid RHS subexpression} testexprparser { testexprparser {1<<2 < 3 < 4} -1 } {- {} 0 subexpr {1<<2 < 3 < 4} 13 operator < 0 subexpr {1<<2 < 3} 9 operator < 0 subexpr 1<<2 5 operator << 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 subexpr 4 1 text 4 0 {}} -test parseExpr-9.10 {ParseRelationalExpr procedure, error in RHS subexpression} testexprparser { - list [catch {testexprparser {1<<2 < 3 > martha} -1} msg] $msg -} {1 {syntax error in expression "1<<2 < 3 > martha": variable references require preceding $}} +test parseExpr-9.10 {ParseRelationalExpr procedure, error in RHS subexpression} \ + -constraints testexprparser -body { + list [catch {testexprparser {1<<2 < 3 > martha} -1} msg] $msg + } -match glob \ + -result {1 {syntax error in expression "1<<2 < 3 > martha": * preceding $*}} test parseExpr-10.1 {ParseShiftExpr procedure, valid LHS add subexpr} testexprparser { testexprparser {1+2 << 3} -1 } {- {} 0 subexpr {1+2 << 3} 9 operator << 0 subexpr 1+2 5 operator + 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}} -test parseExpr-10.2 {ParseShiftExpr procedure, error in LHS add subexpr} testexprparser { - list [catch {testexprparser {1-foo << 3} -1} msg] $msg -} {1 {syntax error in expression "1-foo << 3": variable references require preceding $}} +test parseExpr-10.2 {ParseShiftExpr procedure, error in LHS add subexpr} \ + -constraints testexprparser -body { + list [catch {testexprparser {1-foo << 3} -1} msg] $msg + } -match glob \ + -result {1 {syntax error in expression "1-foo << 3": * preceding $*}} test parseExpr-10.3 {ParseShiftExpr procedure, next lexeme isn't "<<" or ">>"} testexprparser { testexprparser {1+2? 1 : 0} -1 } {- {} 0 subexpr {1+2? 1 : 0} 11 operator ? 0 subexpr 1+2 5 operator + 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 1 1 text 1 0 subexpr 0 1 text 0 0 {}} @@ -263,16 +359,20 @@ test parseExpr-10.6 {ParseShiftExpr procedure, bad lexeme after "<<" or ">>"} {t test parseExpr-10.7 {ParseShiftExpr procedure, valid RHS subexpression} testexprparser { testexprparser {1+2 << 3 << 4} -1 } {- {} 0 subexpr {1+2 << 3 << 4} 13 operator << 0 subexpr {1+2 << 3} 9 operator << 0 subexpr 1+2 5 operator + 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 subexpr 4 1 text 4 0 {}} -test parseExpr-10.8 {ParseShiftExpr procedure, error in RHS subexpression} testexprparser { - list [catch {testexprparser {1+2 << 3 >> martha} -1} msg] $msg -} {1 {syntax error in expression "1+2 << 3 >> martha": variable references require preceding $}} +test parseExpr-10.8 {ParseShiftExpr procedure, error in RHS subexpression} \ + -constraints testexprparser -body { + list [catch {testexprparser {1+2 << 3 >> martha} -1} msg] $msg + } -match glob \ + -result {1 {syntax error in expression "1+2 << 3 >> martha": * preceding $*}} test parseExpr-11.1 {ParseAddExpr procedure, valid LHS multiply subexpr} testexprparser { testexprparser {1*2 + 3} -1 } {- {} 0 subexpr {1*2 + 3} 9 operator + 0 subexpr 1*2 5 operator * 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}} -test parseExpr-11.2 {ParseAddExpr procedure, error in LHS multiply subexpr} testexprparser { - list [catch {testexprparser {1/foo + 3} -1} msg] $msg -} {1 {syntax error in expression "1/foo + 3": variable references require preceding $}} +test parseExpr-11.2 {ParseAddExpr procedure, error in LHS multiply subexpr} \ + -constraints testexprparser -body { + list [catch {testexprparser {1/foo + 3} -1} msg] $msg + } -match glob \ + -result {1 {syntax error in expression "1/foo + 3": * preceding $*}} test parseExpr-11.3 {ParseAddExpr procedure, next lexeme isn't "+" or "-"} testexprparser { testexprparser {1*2? 1 : 0} -1 } {- {} 0 subexpr {1*2? 1 : 0} 11 operator ? 0 subexpr 1*2 5 operator * 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 1 1 text 1 0 subexpr 0 1 text 0 0 {}} @@ -288,16 +388,20 @@ test parseExpr-11.6 {ParseAddExpr procedure, bad lexeme after "+" or "-"} {teste test parseExpr-11.7 {ParseAddExpr procedure, valid RHS subexpression} testexprparser { testexprparser {1*2 + 3 + 4} -1 } {- {} 0 subexpr {1*2 + 3 + 4} 13 operator + 0 subexpr {1*2 + 3} 9 operator + 0 subexpr 1*2 5 operator * 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 subexpr 4 1 text 4 0 {}} -test parseExpr-11.8 {ParseAddExpr procedure, error in RHS subexpression} testexprparser { - list [catch {testexprparser {1*2 + 3 - martha} -1} msg] $msg -} {1 {syntax error in expression "1*2 + 3 - martha": variable references require preceding $}} +test parseExpr-11.8 {ParseAddExpr procedure, error in RHS subexpression} \ + -constraints testexprparser -body { + list [catch {testexprparser {1*2 + 3 - martha} -1} msg] $msg + } -match glob \ + -result {1 {syntax error in expression "1*2 + 3 - martha": * preceding $*}} test parseExpr-12.1 {ParseAddExpr procedure, valid LHS multiply subexpr} testexprparser { testexprparser {1*2 + 3} -1 } {- {} 0 subexpr {1*2 + 3} 9 operator + 0 subexpr 1*2 5 operator * 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 {}} -test parseExpr-12.2 {ParseAddExpr procedure, error in LHS multiply subexpr} testexprparser { - list [catch {testexprparser {1/foo + 3} -1} msg] $msg -} {1 {syntax error in expression "1/foo + 3": variable references require preceding $}} +test parseExpr-12.2 {ParseAddExpr procedure, error in LHS multiply subexpr} \ + -constraints testexprparser -body { + list [catch {testexprparser {1/foo + 3} -1} msg] $msg + } -match glob \ + -result {1 {syntax error in expression "1/foo + 3": * preceding $*}} test parseExpr-12.3 {ParseAddExpr procedure, next lexeme isn't "+" or "-"} testexprparser { testexprparser {1*2? 1 : 0} -1 } {- {} 0 subexpr {1*2? 1 : 0} 11 operator ? 0 subexpr 1*2 5 operator * 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 1 1 text 1 0 subexpr 0 1 text 0 0 {}} @@ -313,9 +417,11 @@ test parseExpr-12.6 {ParseAddExpr procedure, bad lexeme after "+" or "-"} {teste test parseExpr-12.7 {ParseAddExpr procedure, valid RHS subexpression} testexprparser { testexprparser {1*2 + 3 + 4} -1 } {- {} 0 subexpr {1*2 + 3 + 4} 13 operator + 0 subexpr {1*2 + 3} 9 operator + 0 subexpr 1*2 5 operator * 0 subexpr 1 1 text 1 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 subexpr 4 1 text 4 0 {}} -test parseExpr-12.8 {ParseAddExpr procedure, error in RHS subexpression} testexprparser { - list [catch {testexprparser {1*2 + 3 - martha} -1} msg] $msg -} {1 {syntax error in expression "1*2 + 3 - martha": variable references require preceding $}} +test parseExpr-12.8 {ParseAddExpr procedure, error in RHS subexpression} \ + -constraints testexprparser -body { + list [catch {testexprparser {1*2 + 3 - martha} -1} msg] $msg + } -match glob \ + -result {1 {syntax error in expression "1*2 + 3 - martha": * preceding $*}} test parseExpr-13.1 {ParseMultiplyExpr procedure, valid LHS unary subexpr} testexprparser { testexprparser {+2 * 3} -1 @@ -341,9 +447,11 @@ test parseExpr-13.7 {ParseMultiplyExpr procedure, bad lexeme after "*", "/", or test parseExpr-13.8 {ParseMultiplyExpr procedure, valid RHS subexpression} testexprparser { testexprparser {-2 / 3 % 4} -1 } {- {} 0 subexpr {-2 / 3 % 4} 11 operator % 0 subexpr {-2 / 3} 7 operator / 0 subexpr -2 3 operator - 0 subexpr 2 1 text 2 0 subexpr 3 1 text 3 0 subexpr 4 1 text 4 0 {}} -test parseExpr-13.9 {ParseMultiplyExpr procedure, error in RHS subexpression} testexprparser { - list [catch {testexprparser {++2 / 3 * martha} -1} msg] $msg -} {1 {syntax error in expression "++2 / 3 * martha": variable references require preceding $}} +test parseExpr-13.9 {ParseMultiplyExpr procedure, error in RHS subexpression} \ + -constraints testexprparser -body { + list [catch {testexprparser {++2 / 3 * martha} -1} msg] $msg + } -match glob \ + -result {1 {syntax error in expression "++2 / 3 * martha": * preceding $*}} test parseExpr-14.1 {ParseUnaryExpr procedure, first token is unary operator} testexprparser { testexprparser {+2} -1 @@ -452,9 +560,11 @@ test parseExpr-15.22 {ParsePrimaryExpr procedure, primary is function call} test test parseExpr-15.23 {ParsePrimaryExpr procedure, bad lexeme after function name} {testexprparser wideIntegerUnparsed} { list [catch {testexprparser {foo 12345678901234567890 123)} -1} msg] $msg } {1 {integer value too large to represent}} -test parseExpr-15.24 {ParsePrimaryExpr procedure, lexeme after function name isn't "("} testexprparser { - list [catch {testexprparser {foo 27.4 123)} -1} msg] $msg -} {1 {syntax error in expression "foo 27.4 123)": variable references require preceding $}} +test parseExpr-15.24 {ParsePrimaryExpr procedure, lexeme after function name isn't "("} \ + -constraints testexprparser -body { + list [catch {testexprparser {foo 27.4 123)} -1} msg] $msg + } -match glob \ + -result {1 {syntax error in expression "foo 27.4 123)": * preceding $*}} test parseExpr-15.25 {ParsePrimaryExpr procedure, bad lexeme after "("} {testexprparser wideIntegerUnparsed} { list [catch {testexprparser {foo(12345678901234567890)} -1} msg] $msg } {1 {integer value too large to represent}} @@ -525,9 +635,12 @@ test parseExpr-16.9 {GetLexeme procedure, double lexeme} {testexprparser nonPort test parseExpr-16.10 {GetLexeme procedure, double lexeme} {testexprparser nonPortable unix} { testexprparser {NaN} -1 } {- {} 0 subexpr NaN 1 text NaN 0 {}} -test parseExpr-16.11 {GetLexeme procedure, bad double lexeme too big} testexprparser { +test parseExpr-16.11a {GetLexeme procedure, bad double lexeme too big} {testexprparser && !ieeeFloatingPoint} { list [catch {testexprparser {123.e+99999999999999} -1} msg] $msg } {1 {floating-point value too large to represent}} +test parseExpr-16.11b {GetLexeme procedure, bad double lexeme too big} {testexprparser && ieeeFloatingPoint} { + list [catch {testexprparser {123.e+99999999999999} -1} msg] $msg +} {0 {- {} 0 subexpr 123.e+99999999999999 1 text 123.e+99999999999999 0 {}}} test parseExpr-16.12 {GetLexeme procedure, bad double lexeme} testexprparser { list [catch {testexprparser {123.4x56} -1} msg] $msg } {1 {syntax error in expression "123.4x56": extra tokens at end of expression}} diff --git a/tests/regexp.test b/tests/regexp.test index f190298..03efa04 100644 --- a/tests/regexp.test +++ b/tests/regexp.test @@ -11,7 +11,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: regexp.test,v 1.26 2005/04/29 20:49:44 dgp Exp $ +# RCS: @(#) $Id: regexp.test,v 1.27 2005/05/10 18:35:23 kennykb Exp $ if {[lsearch [namespace children] ::tcltest] == -1} { package require tcltest 2 diff --git a/tests/safe.test b/tests/safe.test index e08586b..4def77c 100644 --- a/tests/safe.test +++ b/tests/safe.test @@ -10,7 +10,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: safe.test,v 1.18 2004/12/06 22:41:10 dgp Exp $ +# RCS: @(#) $Id: safe.test,v 1.19 2005/05/10 18:35:23 kennykb Exp $ if {[lsearch [namespace children] ::tcltest] == -1} { package require tcltest diff --git a/tests/scan.test b/tests/scan.test index 94ff998..893a45d 100644 --- a/tests/scan.test +++ b/tests/scan.test @@ -11,7 +11,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: scan.test,v 1.15 2004/08/19 20:59:00 dkf Exp $ +# RCS: @(#) $Id: scan.test,v 1.16 2005/05/10 18:35:23 kennykb Exp $ if {[lsearch [namespace children] ::tcltest] == -1} { package require tcltest 2 @@ -451,10 +451,10 @@ test scan-6.5 {floating-point scanning} { set a {}; set b {}; set c {}; set d {} list [scan "4.6 99999.7 876.43e-1 118" "%f %f %f %e" a b c d] $a $b $c $d } {4 4.6 99999.7 87.643 118.0} -test scan-6.6 {floating-point scanning} {eformat} { +test scan-6.6 {floating-point scanning} { set a {}; set b {}; set c {}; set d {} list [scan "1.2345 697.0e-3 124 .00005" "%f %e %f %e" a b c d] $a $b $c $d -} {4 1.2345 0.697 124.0 5e-05} +} {4 1.2345 0.697 124.0 5e-5} test scan-6.7 {floating-point scanning} { set a {}; set b {}; set c {}; set d {} list [scan "4.6abc" "%f %f %f %f" a b c d] $a $b $c $d diff --git a/tests/string.test b/tests/string.test index c7a9f51..93939df 100644 --- a/tests/string.test +++ b/tests/string.test @@ -12,7 +12,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: string.test,v 1.46 2005/04/29 20:49:44 dgp Exp $ +# RCS: @(#) $Id: string.test,v 1.47 2005/05/10 18:35:24 kennykb Exp $ if {[lsearch [namespace children] ::tcltest] == -1} { package require tcltest @@ -410,10 +410,7 @@ test string-6.37 {string is double, false on int overflow} { # Make it the largest int recognizable, with one more digit for overflow list [string is double -fail var [largest_int]0] $var } {0 -1} -test string-6.38 {string is double, false on underflow} { - catch {unset var} - list [string is double -fail var 123e-9999] $var -} {0 -1} +# string-6.38 removed, underflow on input is no longer an error. test string-6.39 {string is double, false} {nonPortable} { # This test is non-portable because IRIX thinks # that .e1 is a valid double - this is really a bug diff --git a/tests/stringComp.test b/tests/stringComp.test index 6af2be4..2580d0a 100644 --- a/tests/stringComp.test +++ b/tests/stringComp.test @@ -15,7 +15,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: stringComp.test,v 1.9 2005/04/29 20:49:44 dgp Exp $ +# RCS: @(#) $Id: stringComp.test,v 1.10 2005/05/10 18:35:24 kennykb Exp $ if {[lsearch [namespace children] ::tcltest] == -1} { package require tcltest diff --git a/tests/switch.test b/tests/switch.test index da3027f..b06155c 100644 --- a/tests/switch.test +++ b/tests/switch.test @@ -11,7 +11,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: switch.test,v 1.11 2005/04/08 12:47:12 dkf Exp $ +# RCS: @(#) $Id: switch.test,v 1.12 2005/05/10 18:35:24 kennykb Exp $ if {[lsearch [namespace children] ::tcltest] == -1} { package require tcltest diff --git a/tests/tcltest.test b/tests/tcltest.test index ea7bca0..1547a87 100755 --- a/tests/tcltest.test +++ b/tests/tcltest.test @@ -6,7 +6,7 @@ # Copyright (c) 2000 by Ajuba Solutions # All rights reserved. # -# RCS: @(#) $Id: tcltest.test,v 1.51 2005/02/24 22:12:47 dgp Exp $ +# RCS: @(#) $Id: tcltest.test,v 1.52 2005/05/10 18:35:24 kennykb Exp $ # Note that there are several places where the value of # tcltest::currentFailure is stored/reset in the -setup/-cleanup diff --git a/tests/unixInit.test b/tests/unixInit.test index db473df..d2ebbfb 100644 --- a/tests/unixInit.test +++ b/tests/unixInit.test @@ -10,7 +10,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: unixInit.test,v 1.47 2005/04/28 14:24:40 dgp Exp $ +# RCS: @(#) $Id: unixInit.test,v 1.48 2005/05/10 18:35:24 kennykb Exp $ package require tcltest 2.2 namespace import -force ::tcltest::* diff --git a/tests/util.test b/tests/util.test index e097efa..99419c5 100644 --- a/tests/util.test +++ b/tests/util.test @@ -7,13 +7,81 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: util.test,v 1.15 2005/04/29 20:49:45 dgp Exp $ +# RCS: @(#) $Id: util.test,v 1.16 2005/05/10 18:35:25 kennykb Exp $ if {[lsearch [namespace children] ::tcltest] == -1} { package require tcltest namespace import -force ::tcltest::* } +# Big test for correct ordering of data in [expr] + +proc testIEEE {} { + variable ieeeValues + binary scan [binary format dd -1.0 1.0] c* c + switch -exact -- $c { + {0 0 0 0 0 0 -16 -65 0 0 0 0 0 0 -16 63} { + # little endian + binary scan \x00\x00\x00\x00\x00\x00\xf0\xff d \ + ieeeValues(-Infinity) + binary scan \x00\x00\x00\x00\x00\x00\xf0\xbf d \ + ieeeValues(-Normal) + binary scan \x00\x00\x00\x00\x00\x00\x08\x80 d \ + ieeeValues(-Subnormal) + binary scan \x00\x00\x00\x00\x00\x00\x00\x80 d \ + ieeeValues(-0) + binary scan \x00\x00\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(+0) + binary scan \x00\x00\x00\x00\x00\x00\x08\x00 d \ + ieeeValues(+Subnormal) + binary scan \x00\x00\x00\x00\x00\x00\xf0\x3f d \ + ieeeValues(+Normal) + binary scan \x00\x00\x00\x00\x00\x00\xf0\x7f d \ + ieeeValues(+Infinity) + binary scan \x00\x00\x00\x00\x00\x00\xf8\x7f d \ + ieeeValues(NaN) + set ieeeValues(littleEndian) 1 + return 1 + } + {-65 -16 0 0 0 0 0 0 63 -16 0 0 0 0 0 0} { + binary scan \xff\xf0\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(-Infinity) + binary scan \xbf\xf0\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(-Normal) + binary scan \x80\x08\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(-Subnormal) + binary scan \x80\x00\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(-0) + binary scan \x00\x00\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(+0) + binary scan \x00\x08\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(+Subnormal) + binary scan \x3f\xf0\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(+Normal) + binary scan \x7f\xf0\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(+Infinity) + binary scan \x7f\xf8\x00\x00\x00\x00\x00\x00 d \ + ieeeValues(NaN) + set ieeeValues(littleEndian) 0 + return 1 + } + default { + return 0 + } + } +} +::tcltest::testConstraint ieeeFloatingPoint [testIEEE] + +proc convertDouble { x } { + variable ieeeValues + if { $ieeeValues(littleEndian) } { + binary scan [binary format w $x] d result + } else { + binary scan [binary format W $x] d result + } + return $result +} + test util-1.1 {TclFindElement procedure - binary element in middle of list} { lindex {0 foo\x00help 1} 1 } "foo\x00help" @@ -273,42 +341,71 @@ test util-5.51 {Tcl_StringMatch} { Wrapper_Tcl_StringMatch "" "" } 1 -test util-6.1 {Tcl_PrintDouble - using tcl_precision} { +test util-6.1 {Tcl_PrintDouble - using tcl_precision} -setup { + set old_precision $::tcl_precision + set ::tcl_precision 12 +} -body { concat x[expr 1.4] -} {x1.4} -test util-6.2 {Tcl_PrintDouble - using tcl_precision} { +} -cleanup { + set ::tcl_precision $old_precision +} -result {x1.4} +test util-6.2 {Tcl_PrintDouble - using tcl_precision} -setup { + set old_precision $::tcl_precision + set ::tcl_precision 12 +} -body { concat x[expr 1.39999999999] -} {x1.39999999999} -test util-6.3 {Tcl_PrintDouble - using tcl_precision} { +} -cleanup { + set ::tcl_precision $old_precision +} -result {x1.39999999999} +test util-6.3 {Tcl_PrintDouble - using tcl_precision} -setup { + set old_precision $::tcl_precision + set ::tcl_precision 12 +} -body { concat x[expr 1.399999999999] -} {x1.4} -test util-6.4 {Tcl_PrintDouble - using tcl_precision} { - set tcl_precision 5 +} -cleanup { + set ::tcl_precision $old_precision +} -result {x1.4} +test util-6.4 {Tcl_PrintDouble - using tcl_precision} -setup { + set old_precision $::tcl_precision + set ::tcl_precision 5 +} -body { concat x[expr 1.123412341234] -} {x1.1234} -set tcl_precision 12 +} -cleanup { + set tcl_precision $old_precision +} -result {x1.1234} + test util-6.5 {Tcl_PrintDouble - make sure there's a decimal point} { concat x[expr 2.0] } {x2.0} -test util-6.6 {Tcl_PrintDouble - make sure there's a decimal point} {eformat} { +test util-6.6 {Tcl_PrintDouble - make sure there's a decimal point} { concat x[expr 3.0e98] } {x3e+98} -test util-7.1 {TclPrecTraceProc - unset callbacks} { +test util-7.1 {TclPrecTraceProc - unset callbacks} -setup { + set old_precision $::tcl_precision +} -body { set tcl_precision 7 set x $tcl_precision unset tcl_precision list $x $tcl_precision -} {7 7} -test util-7.2 {TclPrecTraceProc - read traces, sharing among interpreters} { +} -cleanup { + set ::tcl_precision $old_precision +} -result {7 7} +test util-7.2 {TclPrecTraceProc - read traces, sharing among interpreters} -setup { + set old_precision $::tcl_precision +} -body { set tcl_precision 12 interp create child set x [child eval set tcl_precision] child eval {set tcl_precision 6} interp delete child list $x $tcl_precision -} {12 6} -test util-7.3 {TclPrecTraceProc - write traces, safe interpreters} { +} -cleanup { + set ::tcl_precision $old_precision +} -result {12 6} +test util-7.3 {TclPrecTraceProc - write traces, safe interpreters} -setup { + set old_precision $::tcl_precision +} -body { set tcl_precision 12 interp create -safe child set x [child eval { @@ -316,13 +413,17 @@ test util-7.3 {TclPrecTraceProc - write traces, safe interpreters} { }] interp delete child list $x $tcl_precision -} {{1 {can't set "tcl_precision": can't modify precision from a safe interpreter}} 12} -test util-7.4 {TclPrecTraceProc - write traces, bogus values} { +} -cleanup { + set ::tcl_precision $old_precision +} -result {{1 {can't set "tcl_precision": can't modify precision from a safe interpreter}} 12} +test util-7.4 {TclPrecTraceProc - write traces, bogus values} -setup { + set old_precision $::tcl_precision +} -body { set tcl_precision 12 list [catch {set tcl_precision abc} msg] $msg $tcl_precision -} {1 {can't set "tcl_precision": improper value for precision} 12} - -set tcl_precision 12 +} -cleanup { + set ::tcl_precision $old_precision +} -result {1 {can't set "tcl_precision": improper value for precision} 12} # This test always succeeded in the C locale anyway... test util-8.1 {TclNeedSpace - correct UTF8 handling} { @@ -571,6 +672,442 @@ test util-9.44 {TclGetIntForIndex} -body { string index a 0+1000000000000 } -returnCodes error -match glob -result * +test util-10.1 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x0000000000000000 +} {0.0} +test util-10.2 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x8000000000000000 +} {-0.0} +test util-10.3 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x7ef754e31cd072da +} {4e+303} +test util-10.4 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xd08afcef51f0fb5f +} {-1e+80} +test util-10.5 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x7ed754e31cd072da +} {1e+303} +test util-10.6 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xfee754e31cd072da +} {-2e+303} +test util-10.7 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x0afe07b27dd78b14 +} {1e-255} +test util-10.8 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x93ae29e9c56687fe +} {-7e-214} +test util-10.9 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x376be03d0bf225c7 +} {1e-41} +test util-10.10 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xa0ca2fe76a3f9475 +} {-1e-150} +test util-10.11 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x7fa9a2028368022e +} {9e+306} +test util-10.12 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xdfc317e5ef3ab327 +} {-2e+153} +test util-10.13 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x5fd317e5ef3ab327 +} {4e+153} +test util-10.14 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xdfe317e5ef3ab327 +} {-8e+153} +test util-10.15 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x00feb8e84fa0b278 +} {7e-304} +test util-10.16 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x8133339131c46f8b +} {-7e-303} +test util-10.17 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x35dc0f92a6276c9d +} {3e-49} +test util-10.18 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xa445ce1f143d7ad2 +} {-6e-134} +test util-10.19 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x2d2c0794d9d40e96 +} {4.3e-91} +test util-10.20 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xad3c0794d9d40e96 +} {-8.6e-91} +test util-10.21 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x30ecd5bee57763e6 +} {5.1e-73} +test util-10.22 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x68ad1c26db7d0dae +} {1.7e+196} +test util-10.23 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xbfa3f7ced916872b +} {-0.039} +test util-10.24 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x64b7d93193f78fc6 +} {1.51e+177} +test util-10.25 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x98ea82a1631eeb30 +} {-1.19e-188} +test util-10.26 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xd216c309024bab4b +} {-2.83e+87} +test util-10.27 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x0dfdbbac6f83a821 +} {2.7869147e-241} +test util-10.28 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xdadc569e968e0944 +} {-4.91080654e+129} +test util-10.29 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x5acc569e968e0944 +} {2.45540327e+129} +test util-10.30 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xab5fc575867314ee +} {-9.078555839e-100} +test util-10.31 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xdabc569e968e0944 +} {-1.227701635e+129} +test util-10.32 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x2b6fc575867314ee +} {1.8157111678e-99} +test util-10.33 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xb3b8bf7e7fa6f02a +} {-1.5400733123779e-59} +test util-10.34 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xcd83de005bd620df +} {-2.6153245263757307e+65} +test util-10.35 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x6cdf92bacb3cb40c +} {2.7210404151224248e+216} +test util-10.36 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xecef92bacb3cb40c +} {-5.4420808302448496e+216} +test util-10.37 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x49342dbf25096cf5 +} {4.5e+44} +test util-10.38 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xd06afcef51f0fb5f +} {-2.5e+79} +test util-10.39 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x49002498ea6df0c4 +} {4.5e+43} +test util-10.40 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xfeb754e31cd072da +} {-2.5e+302} +test util-10.41 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x1d22deac01e2b4f7 +} {2.5e-168} +test util-10.42 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xaccb1df536c13eee +} {-6.5e-93} +test util-10.43 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x3650711fed5b19a4 +} {4.5e-47} +test util-10.44 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xb6848d67e8b1e00d +} {-4.5e-46} +test util-10.45 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x4bac8c574c0c6be7 +} {3.5e+56} +test util-10.46 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xccd756183c147514 +} {-1.5e+62} +test util-10.47 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x4ca2ab469676c410 +} {1.5e+61} +test util-10.48 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xcf5539684e774b48 +} {-1.5e+74} +test util-10.49 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x2e12e5f5dfa4fe9d +} {9.5e-87} +test util-10.50 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x8b9bdc2417bf7787 +} {-9.5e-253} +test util-10.51 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x00eeb8e84fa0b278 +} {3.5e-304} +test util-10.52 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xadde3cbc9907fdc8 +} {-9.5e-88} +test util-10.53 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x2bb0ad836f269a17 +} {3.05e-98} +test util-10.54 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x950b39ae1909c31b +} {-2.65e-207} +test util-10.55 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x1bfb2ab18615fcc6 +} {6.865e-174} +test util-10.56 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x98f3e1f90a573064 +} {-1.785e-188} +test util-10.57 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x5206c309024bab4b +} {1.415e+87} +test util-10.58 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xcc059bd3ad46e346 +} {-1.6955e+58} +test util-10.59 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x47bdf4170f0fdecc +} {3.9815e+37} +test util-10.60 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x59e7e1e0f1c7a4ac +} {1.263005e+125} +test util-10.61 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xda1dda592e398dd7 +} {-1.263005e+126} +test util-10.62 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xdc4e597c0b94b7ae +} {-4.4118455e+136} +test util-10.63 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x5aac569e968e0944 +} {6.138508175e+128} +test util-10.64 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xdabc569e968e0944 +} {-1.227701635e+129} +test util-10.65 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x6ce7ae0c186d8709 +} {4.081560622683637e+216} +test util-10.66 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x44b52d02c7e14af7 +} {1.0000000000000001e+23} +test util-10.67 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xc589d971e4fe8402 +} {-1e+27} +test util-10.68 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x4599d971e4fe8402 +} {2e+27} +test util-10.69 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xc5a9d971e4fe8402 +} {-4e+27} +test util-10.70 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x3e45798ee2308c3a +} {1e-8} +test util-10.71 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xbe55798ee2308c3a +} {-2e-8} +test util-10.72 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x3e65798ee2308c3a +} {4e-8} +test util-10.73 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xbabef2d0f5da7dd9 +} {-1e-25} +test util-10.74 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x44da784379d99db4 +} {5e+23} +test util-10.75 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xc4fa784379d99db4 +} {-2e+24} +test util-10.76 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x4503da329b633647 +} {3e+24} +test util-10.77 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xc54cf389cd46047d +} {-7e+25} +test util-10.78 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x3fc999999999999a +} {0.2} +test util-10.79 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xbfd3333333333333 +} {-0.3} +test util-10.80 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x3cf6849b86a12b9b +} {5e-15} +test util-10.81 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xbd16849b86a12b9b +} {-2e-14} +test util-10.82 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x3b87ccfc73126788 +} {6.3e-22} +test util-10.83 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xbbbdc03b8fd7016a +} {-6.3e-21} +test util-10.84 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x3fa3f7ced916872b +} {0.039} +test util-10.85 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x460b297cad9f70b6 +} {2.69e+29} +test util-10.86 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xc61b297cad9f70b6 +} {-5.38e+29} +test util-10.87 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x3adcdc06b20ef183 +} {3.73e-25} +test util-10.88 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x45fb297cad9f70b6 +} {1.345e+29} +test util-10.89 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xc60b297cad9f70b6 +} {-2.69e+29} +test util-10.90 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xbc050a246ecd44f3 +} {-1.4257e-19} +test util-10.91 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xbec19b96f36ec68b +} {-2.09901e-6} +test util-10.92 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x3dcc06d366394441 +} {5.0980203373e-11} +test util-10.93 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xc79f58ac4db68c90 +} {-1.04166211811e+37} +test util-10.94 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x4569d971e4fe8402 +} {2.5e+26} +test util-10.95 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xc50dc74be914d16b +} {-4.5e+24} +test util-10.96 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x4534adf4b7320335 +} {2.5e+25} +test util-10.97 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xc54ae22487c1042b +} {-6.5e+25} +test util-10.98 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x3c987fe49aab41e0 +} {8.5e-17} +test util-10.99 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xbc2f5c05e4b23fd7 +} {-8.5e-19} +test util-10.100 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x3d5faa7ab552a552 +} {4.5e-13} +test util-10.101 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xbdbb7cdfd9d7bdbb +} {-2.5e-11} +test util-10.102 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x44f3da329b633647 +} {1.5e+24} +test util-10.103 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xc53cf389cd46047d +} {-3.5e+25} +test util-10.104 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x454f04ef12cb04cf +} {7.5e+25} +test util-10.105 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xc55f04ef12cb04cf +} {-1.5e+26} +test util-10.106 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x3fc3333333333333 +} {0.15} +test util-10.107 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xbdb07e1fe91b0b70 +} {-1.5e-11} +test util-10.108 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x3de49da7e361ce4c +} {1.5e-10} +test util-10.109 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xbe19c511dc3a41df +} {-1.5e-9} +test util-10.110 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xc5caa83d74267822 +} {-1.65e+28} +test util-10.111 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x4588f1d5969453de +} {9.65e+26} +test util-10.112 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x3b91d9bd564dcda6 +} {9.45e-22} +test util-10.113 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xbcfa58973ecbede6 +} {-5.85e-15} +test util-10.114 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x45eb297cad9f70b6 +} {6.725e+28} +test util-10.115 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xc5fb297cad9f70b6 +} {-1.345e+29} +test util-10.116 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x3accdc06b20ef183 +} {1.865e-25} +test util-10.117 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xbd036071dcae4565 +} {-8.605e-15} +test util-10.118 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x462cb968d297dde8 +} {1.137885e+30} +test util-10.119 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0xc661f3e1839eeab1 +} {-1.137885e+31} +test util-10.120 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x474e9cec176c96f8 +} {3.179033335e+35} +test util-10.121 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x3dbc06d366394441 +} {2.54901016865e-11} +test util-10.122 {Tcl_PrintDouble - rounding} {ieeeFloatingPoint} { + convertDouble 0x478f58ac4db68c90 +} {5.20831059055e+36} + +test util-11.1 {Tcl_PrintDouble - scaling} { + expr 1.1e-5 +} {1.1e-5} +test util-11.2 {Tcl_PrintDouble - scaling} { + expr 1.1e-4 +} {0.00011} +test util-11.3 {Tcl_PrintDouble - scaling} { + expr 1.1e-3 +} {0.0011} +test util-11.4 {Tcl_PrintDouble - scaling} { + expr 1.1e-2 +} {0.011} +test util-11.5 {Tcl_PrintDouble - scaling} { + expr 1.1e-1 +} {0.11} +test util-11.6 {Tcl_PrintDouble - scaling} { + expr 1.1e0 +} {1.1} +test util-11.7 {Tcl_PrintDouble - scaling} { + expr 1.1e1 +} {11.0} +test util-11.8 {Tcl_PrintDouble - scaling} { + expr 1.1e2 +} {110.0} +test util-11.9 {Tcl_PrintDouble - scaling} { + expr 1.1e3 +} {1100.0} +test util-11.10 {Tcl_PrintDouble - scaling} { + expr 1.1e4 +} {11000.0} +test util-11.11 {Tcl_PrintDouble - scaling} { + expr 1.1e5 +} {110000.0} +test util-11.12 {Tcl_PrintDouble - scaling} { + expr 1.1e6 +} {1100000.0} +test util-11.13 {Tcl_PrintDouble - scaling} { + expr 1.1e7 +} {11000000.0} +test util-11.14 {Tcl_PrintDouble - scaling} { + expr 1.1e8 +} {110000000.0} +test util-11.15 {Tcl_PrintDouble - scaling} { + expr 1.1e9 +} {1100000000.0} +test util-11.16 {Tcl_PrintDouble - scaling} { + expr 1.1e10 +} {11000000000.0} +test util-11.17 {Tcl_PrintDouble - scaling} { + expr 1.1e11 +} {110000000000.0} +test util-11.18 {Tcl_PrintDouble - scaling} { + expr 1.1e12 +} {1100000000000.0} +test util-11.19 {Tcl_PrintDouble - scaling} { + expr 1.1e13 +} {11000000000000.0} +test util-11.20 {Tcl_PrintDouble - scaling} { + expr 1.1e14 +} {110000000000000.0} +test util-11.21 {Tcl_PrintDouble - scaling} { + expr 1.1e15 +} {1100000000000000.0} +test util-11.22 {Tcl_PrintDouble - scaling} { + expr 1.1e16 +} {11000000000000000.0} +test util-11.21 {Tcl_PrintDouble - scaling} { + expr 1.1e17 +} {1.1e+17} # cleanup ::tcltest::cleanupTests diff --git a/tests/winDde.test b/tests/winDde.test index 66e73ed..f59a7f2 100644 --- a/tests/winDde.test +++ b/tests/winDde.test @@ -9,7 +9,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: winDde.test,v 1.27 2005/01/05 10:34:08 patthoyts Exp $ +# RCS: @(#) $Id: winDde.test,v 1.28 2005/05/10 18:35:25 kennykb Exp $ if {[lsearch [namespace children] ::tcltest] == -1} { package require tcltest 2 diff --git a/tests/winFCmd.test b/tests/winFCmd.test index 0872add..51c0726 100644 --- a/tests/winFCmd.test +++ b/tests/winFCmd.test @@ -10,7 +10,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: winFCmd.test,v 1.37 2005/03/15 22:10:30 vincentdarley Exp $ +# RCS: @(#) $Id: winFCmd.test,v 1.38 2005/05/10 18:35:25 kennykb Exp $ # if {[lsearch [namespace children] ::tcltest] == -1} { diff --git a/tools/fix_tommath_h.tcl b/tools/fix_tommath_h.tcl new file mode 100755 index 0000000..92b1f77 --- /dev/null +++ b/tools/fix_tommath_h.tcl @@ -0,0 +1,54 @@ +# fixtommath.tcl -- +# +# Changes to 'tommath.h' to make it conform with Tcl's linking +# conventions. +# +# Copyright (c) 2005 by Kevin B. Kenny. All rights reserved. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# +# RCS: @(#) $Id: fix_tommath_h.tcl,v 1.2 2005/05/10 18:35:25 kennykb Exp $ +# +#---------------------------------------------------------------------- + +set f [open [lindex $argv 0] r] +set data [read $f] +close $f + +foreach line [split $data \n] { + switch -regexp -- $line { + {#define BN_H_} { + puts $line + puts {} + puts "\#ifdef TCL_TOMMATH" + puts "\#include <tclTomMath.h>" + puts "\#endif" + puts "\#ifndef TOMMATH_STORAGE_CLASS" + puts "\#define TOMMATH_STORAGE_CLASS extern" + puts "\#endif" + } + {typedef.*mp_digit;} { + puts "\#ifndef MP_DIGIT_DECLARED" + puts $line + puts "\#define MP_DIGIT_DECLARED" + puts "\#endif" + } + {typedef struct} { + puts "\#ifndef MP_INT_DECLARED" + puts "\#define MP_INT_DECLARED" + puts "typedef struct mp_int mp_int;" + puts "\#endif" + puts "struct mp_int \{" + } + \}\ mp_int\; { + puts "\};" + } + "^(char|int|void)" { + puts "TOMMATH_STORAGE_CLASS $line" + } + default { + puts $line + } + } +}
\ No newline at end of file diff --git a/tools/man2html2.tcl b/tools/man2html2.tcl index b9388cb..14bbab0 100644 --- a/tools/man2html2.tcl +++ b/tools/man2html2.tcl @@ -5,7 +5,7 @@ # # Copyright (c) 1996 by Sun Microsystems, Inc. # -# $Id: man2html2.tcl,v 1.8 2005/04/06 09:52:00 dkf Exp $ +# $Id: man2html2.tcl,v 1.9 2005/05/10 18:35:25 kennykb Exp $ # package require Tcl 8.4 diff --git a/tools/tclZIC.tcl b/tools/tclZIC.tcl index 23e373f..f3750c1 100755 --- a/tools/tclZIC.tcl +++ b/tools/tclZIC.tcl @@ -29,7 +29,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: tclZIC.tcl,v 1.4 2005/04/11 10:02:12 dkf Exp $ +# RCS: @(#) $Id: tclZIC.tcl,v 1.5 2005/05/10 18:35:25 kennykb Exp $ # #---------------------------------------------------------------------- diff --git a/unix/Makefile.in b/unix/Makefile.in index ad3fe35..fa228f2 100644 --- a/unix/Makefile.in +++ b/unix/Makefile.in @@ -5,7 +5,7 @@ # "autoconf" program (constructs like "@foo@" will get replaced in the # actual Makefile. # -# RCS: @(#) $Id: Makefile.in,v 1.164 2005/04/26 00:45:02 das Exp $ +# RCS: @(#) $Id: Makefile.in,v 1.165 2005/05/10 18:35:25 kennykb Exp $ VERSION = @TCL_VERSION@ MAJOR_VERSION = @TCL_MAJOR_VERSION@ @@ -238,6 +238,7 @@ SRC_DIR = @srcdir@ TOP_DIR = $(SRC_DIR)/.. BUILD_DIR = @builddir@ GENERIC_DIR = $(TOP_DIR)/generic +TOMMATH_DIR = $(TOP_DIR)/libtommath COMPAT_DIR = $(TOP_DIR)/compat TOOL_DIR = $(TOP_DIR)/tools UNIX_DIR = $(SRC_DIR) @@ -271,12 +272,12 @@ DDD = ddd CC_SWITCHES = ${CFLAGS} ${CFLAGS_WARNING} ${SHLIB_CFLAGS} \ --I${BUILD_DIR} -I${UNIX_DIR} -I${GENERIC_DIR} \ +-I${BUILD_DIR} -I${UNIX_DIR} -I${GENERIC_DIR} -DTCL_TOMMATH -I${TOMMATH_DIR} \ ${AC_FLAGS} ${MATH_FLAGS} ${GENERIC_FLAGS} ${PROTO_FLAGS} \ ${NO_DEPRECATED_FLAGS} ${ENV_FLAGS} STUB_CC_SWITCHES = ${CFLAGS} ${CFLAGS_WARNING} ${SHLIB_CFLAGS} \ --I${BUILD_DIR} -I${UNIX_DIR} -I${GENERIC_DIR} \ +-I${BUILD_DIR} -I${UNIX_DIR} -I${GENERIC_DIR} -DTCL_TOMMATH -I${TOMMATH_DIR} \ ${AC_FLAGS} ${MATH_FLAGS} ${GENERIC_FLAGS} ${PROTO_FLAGS} ${ENV_FLAGS} LIBS = @TCL_LIBS@ @@ -302,17 +303,37 @@ GENERIC_OBJS = regcomp.o regexec.o regfree.o regerror.o tclAlloc.o \ tclIOGT.o tclIOSock.o tclIOUtil.o tclLink.o tclListObj.o \ tclLiteral.o tclLoad.o tclMain.o tclNamesp.o tclNotify.o \ tclObj.o tclPanic.o tclParse.o tclParseExpr.o tclPathObj.o tclPipe.o \ - tclPkg.o tclPkgConfig.o tclPosixStr.o tclPreserve.o tclProc.o tclRegexp.o \ - tclResolve.o tclResult.o tclScan.o tclStringObj.o tclThread.o \ + tclPkg.o tclPkgConfig.o tclPosixStr.o \ + tclPreserve.o tclProc.o tclRegexp.o \ + tclResolve.o tclResult.o tclScan.o tclStringObj.o \ + tclStrToD.o tclThread.o \ tclThreadAlloc.o tclThreadJoin.o tclThreadStorage.o tclStubInit.o \ - tclStubLib.o tclTimer.o tclTrace.o tclUtf.o tclUtil.o tclVar.o + tclStubLib.o tclTimer.o tclTrace.o tclUtf.o tclUtil.o tclVar.o \ + tclTomMathInterface.o + +TOMMATH_OBJS = bncore.o bn_reverse.o bn_fast_s_mp_mul_digs.o \ + bn_fast_s_mp_sqr.o bn_mp_add.o \ + bn_mp_add_d.o bn_mp_clamp.o bn_mp_clear.o bn_mp_clear_multi.o \ + bn_mp_cmp.o bn_mp_cmp_mag.o bn_mp_copy.o bn_mp_count_bits.o \ + bn_mp_div.o bn_mp_div_d.o bn_mp_div_2.o bn_mp_div_2d.o bn_mp_div_3.o \ + bn_mp_exch.o bn_mp_grow.o bn_mp_init.o bn_mp_init_copy.o \ + bn_mp_init_multi.o bn_mp_init_set.o \ + bn_mp_init_size.o bn_mp_karatsuba_mul.o \ + bn_mp_karatsuba_sqr.o \ + bn_mp_lshd.o bn_mp_mod.o bn_mp_mod_2d.o bn_mp_mul.o bn_mp_mul_2.o \ + bn_mp_mul_2d.o bn_mp_mul_d.o bn_mp_radix_size.o bn_mp_radix_smap.o \ + bn_mp_read_radix.o bn_mp_rshd.o bn_mp_set.o bn_mp_sqr.o \ + bn_mp_sub.o bn_mp_sub_d.o \ + bn_mp_toom_mul.o bn_mp_toom_sqr.o \ + bn_mp_toradix_n.o bn_mp_zero.o bn_s_mp_add.o \ + bn_s_mp_mul_digs.o bn_s_mp_sqr.o bn_s_mp_sub.o STUB_LIB_OBJS = tclStubLib.o ${COMPAT_OBJS} MAC_OSX_OBJS = tclMacOSXBundle.o tclMacOSXFCmd.o -OBJS = ${GENERIC_OBJS} ${UNIX_OBJS} ${NOTIFY_OBJS} ${COMPAT_OBJS} \ - @DL_OBJS@ @PLAT_OBJS@ +OBJS = ${GENERIC_OBJS} ${TOMMATH_OBJS} ${UNIX_OBJS} ${NOTIFY_OBJS} \ + ${COMPAT_OBJS} @DL_OBJS@ @PLAT_OBJS@ TCL_DECLS = \ $(GENERIC_DIR)/tcl.decls \ @@ -389,6 +410,7 @@ GENERIC_SRCS = \ $(GENERIC_DIR)/tclStubInit.c \ $(GENERIC_DIR)/tclStubLib.c \ $(GENERIC_DIR)/tclStringObj.c \ + $(GENERIC_DIR)/tclStrToD.c \ $(GENERIC_DIR)/tclTest.c \ $(GENERIC_DIR)/tclTestObj.c \ $(GENERIC_DIR)/tclTestProcBodyObj.c \ @@ -404,6 +426,58 @@ GENERIC_SRCS = \ STUB_SRCS = \ $(GENERIC_DIR)/tclStubLib.c +TOMMATH_SRCS = \ + $(TOMMATH_DIR)/bncore.c \ + $(TOMMATH_DIR)/bn_reverse.c \ + $(TOMMATH_DIR)/bn_fast_s_mp_mul_digs.c \ + $(TOMMATH_DIR)/bn_fast_s_mp_sqr.c \ + $(TOMMATH_DIR)/bn_mp_add.c \ + $(TOMMATH_DIR)/bn_mp_add_d.c \ + $(TOMMATH_DIR)/bn_mp_clamp.c \ + $(TOMMATH_DIR)/bn_mp_clear.c \ + $(TOMMATH_DIR)/bn_mp_clear_multi.c \ + $(TOMMATH_DIR)/bn_mp_cmp.c \ + $(TOMMATH_DIR)/bn_mp_cmp_mag.c \ + $(TOMMATH_DIR)/bn_mp_copy.c \ + $(TOMMATH_DIR)/bn_mp_count_bits.c \ + $(TOMMATH_DIR)/bn_mp_div.c \ + $(TOMMATH_DIR)/bn_mp_div_d.c \ + $(TOMMATH_DIR)/bn_mp_div_2.c \ + $(TOMMATH_DIR)/bn_mp_div_2d.c \ + $(TOMMATH_DIR)/bn_mp_div_3.c \ + $(TOMMATH_DIR)/bn_mp_exch.c \ + $(TOMMATH_DIR)/bn_mp_grow.c \ + $(TOMMATH_DIR)/bn_mp_init.c \ + $(TOMMATH_DIR)/bn_mp_init_copy.c \ + $(TOMMATH_DIR)/bn_mp_init_multi.c \ + $(TOMMATH_DIR)/bn_mp_init_set.c \ + $(TOMMATH_DIR)/bn_mp_init_size.c \ + $(TOMMATH_DIR)/bn_mp_karatsuba_mul.c \ + $(TOMMATH_DIR)/bn_mp_karatsuba_sqr.c \ + $(TOMMATH_DIR)/bn_mp_lshd.c \ + $(TOMMATH_DIR)/bn_mp_mod.c \ + $(TOMMATH_DIR)/bn_mp_mod_2d.c \ + $(TOMMATH_DIR)/bn_mp_mul.c \ + $(TOMMATH_DIR)/bn_mp_mul_2.c \ + $(TOMMATH_DIR)/bn_mp_mul_2d.c \ + $(TOMMATH_DIR)/bn_mp_mul_d.c \ + $(TOMMATH_DIR)/bn_mp_radix_size.c \ + $(TOMMATH_DIR)/bn_mp_radix_smap.c \ + $(TOMMATH_DIR)/bn_mp_read_radix.c \ + $(TOMMATH_DIR)/bn_mp_rshd.c \ + $(TOMMATH_DIR)/bn_mp_set.c \ + $(TOMMATH_DIR)/bn_mp_sqr.c \ + $(TOMMATH_DIR)/bn_mp_sub.c \ + $(TOMMATH_DIR)/bn_mp_sub_d.c \ + $(TOMMATH_DIR)/bn_mp_toom_mul.c \ + $(TOMMATH_DIR)/bn_mp_toom_sqr.c \ + $(TOMMATH_DIR)/bn_mp_toradix_n.c \ + $(TOMMATH_DIR)/bn_mp_zero.c \ + $(TOMMATH_DIR)/bn_s_mp_add.c \ + $(TOMMATH_DIR)/bn_s_mp_mul_digs.c \ + $(TOMMATH_DIR)/bn_s_mp_sqr.c \ + $(TOMMATH_DIR)/bn_s_mp_sub.c + UNIX_HDRS = \ $(UNIX_DIR)/tclUnixPort.h # $(UNIX_DIR)/tclConfig.h @@ -443,7 +517,9 @@ MAC_OSX_SRCS = \ # files won't compile on the current machine, and they will cause # problems for things like "make depend". -SRCS = $(GENERIC_SRCS) $(UNIX_SRCS) $(NOTIFY_SRCS) $(STUB_SRCS) @PLAT_SRCS@ +SRCS = $(GENERIC_SRCS) $(TOMMATH_SRCS) \ + $(UNIX_SRCS) $(NOTIFY_SRCS) $(STUB_SRCS) \ + @PLAT_SRCS@ all: binaries libraries doc @@ -575,6 +651,15 @@ gendate: # <y.tab.c >$(GENERIC_DIR)/tclDate.c # rm y.tab.c +# The following target generates the file generic/tommath.h. +# It needs to be run (and the results checked) after updating +# to a new release of libtommath. + +gentommath_h: + $(TCL_EXE) "$(TOP_DIR)/tools/fix_tommath_h.tcl" \ + "$(TOMMATH_DIR)/tommath.h" \ + > "$(GENERIC_DIR)/tommath.h" + # The following target generates the shared libraries in dltest/ that # are used for testing; they are included as part of the "tcltest" # target (via the BUILD_DLTEST variable) if dynamic loading is supported @@ -1034,6 +1119,9 @@ tclScan.o: $(GENERIC_DIR)/tclScan.c tclStringObj.o: $(GENERIC_DIR)/tclStringObj.c $(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclStringObj.c +tclStrToD.o: $(GENERIC_DIR)/tclStrToD.c + $(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclStrToD.c + tclStubInit.o: $(GENERIC_DIR)/tclStubInit.c $(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclStubInit.c @@ -1076,6 +1164,159 @@ tclThreadStorage.o: $(GENERIC_DIR)/tclThreadStorage.c tclThreadTest.o: $(GENERIC_DIR)/tclThreadTest.c $(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclThreadTest.c +tclTomMathInterface.o: $(GENERIC_DIR)/tclTomMathInterface.c + $(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclTomMathInterface.c + +bncore.o: $(TOMMATH_DIR)/bncore.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bncore.c + +bn_reverse.o: $(TOMMATH_DIR)/bn_reverse.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_reverse.c + +bn_fast_s_mp_mul_digs.o: $(TOMMATH_DIR)/bn_fast_s_mp_mul_digs.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_fast_s_mp_mul_digs.c + +bn_fast_s_mp_sqr.o: $(TOMMATH_DIR)/bn_fast_s_mp_sqr.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_fast_s_mp_sqr.c + +bn_mp_add.o: $(TOMMATH_DIR)/bn_mp_add.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_add.c + +bn_mp_add_d.o: $(TOMMATH_DIR)/bn_mp_add_d.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_add_d.c + +bn_mp_clamp.o: $(TOMMATH_DIR)/bn_mp_clamp.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_clamp.c + +bn_mp_clear.o: $(TOMMATH_DIR)/bn_mp_clear.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_clear.c + +bn_mp_clear_multi.o: $(TOMMATH_DIR)/bn_mp_clear_multi.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_clear_multi.c + +bn_mp_cmp.o: $(TOMMATH_DIR)/bn_mp_cmp.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_cmp.c + +bn_mp_cmp_mag.o: $(TOMMATH_DIR)/bn_mp_cmp_mag.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_cmp_mag.c + +bn_mp_copy.o: $(TOMMATH_DIR)/bn_mp_copy.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_copy.c + +bn_mp_count_bits.o: $(TOMMATH_DIR)/bn_mp_count_bits.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_count_bits.c + +bn_mp_div.o: $(TOMMATH_DIR)/bn_mp_div.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_div.c + +bn_mp_div_d.o: $(TOMMATH_DIR)/bn_mp_div_d.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_div_d.c + +bn_mp_div_2.o: $(TOMMATH_DIR)/bn_mp_div_2.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_div_2.c + +bn_mp_div_2d.o: $(TOMMATH_DIR)/bn_mp_div_2d.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_div_2d.c + +bn_mp_div_3.o: $(TOMMATH_DIR)/bn_mp_div_3.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_div_3.c + +bn_mp_exch.o: $(TOMMATH_DIR)/bn_mp_exch.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_exch.c + +bn_mp_grow.o: $(TOMMATH_DIR)/bn_mp_grow.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_grow.c + +bn_mp_init.o: $(TOMMATH_DIR)/bn_mp_init.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_init.c + +bn_mp_init_copy.o: $(TOMMATH_DIR)/bn_mp_init_copy.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_init_copy.c + +bn_mp_init_multi.o: $(TOMMATH_DIR)/bn_mp_init_multi.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_init_multi.c + +bn_mp_init_set.o: $(TOMMATH_DIR)/bn_mp_init_set.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_init_set.c + +bn_mp_init_size.o:$(TOMMATH_DIR)/bn_mp_init_size.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_init_size.c + +bn_mp_karatsuba_mul.o: $(TOMMATH_DIR)/bn_mp_karatsuba_mul.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_karatsuba_mul.c + +bn_mp_karatsuba_sqr.o: $(TOMMATH_DIR)/bn_mp_karatsuba_sqr.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_karatsuba_sqr.c + +bn_mp_lshd.o: $(TOMMATH_DIR)/bn_mp_lshd.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_lshd.c + +bn_mp_mod.o: $(TOMMATH_DIR)/bn_mp_mod.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_mod.c + +bn_mp_mod_2d.o: $(TOMMATH_DIR)/bn_mp_mod_2d.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_mod_2d.c + +bn_mp_mul.o: $(TOMMATH_DIR)/bn_mp_mul.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_mul.c + +bn_mp_mul_2.o: $(TOMMATH_DIR)/bn_mp_mul_2.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_mul_2.c + +bn_mp_mul_2d.o: $(TOMMATH_DIR)/bn_mp_mul_2d.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_mul_2d.c + +bn_mp_mul_d.o: $(TOMMATH_DIR)/bn_mp_mul_d.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_mul_d.c + +bn_mp_radix_size.o: $(TOMMATH_DIR)/bn_mp_radix_size.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_radix_size.c + +bn_mp_radix_smap.o: $(TOMMATH_DIR)/bn_mp_radix_smap.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_radix_smap.c + +bn_mp_read_radix.o: $(TOMMATH_DIR)/bn_mp_read_radix.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_read_radix.c + +bn_mp_rshd.o: $(TOMMATH_DIR)/bn_mp_rshd.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_rshd.c + +bn_mp_set.o: $(TOMMATH_DIR)/bn_mp_set.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_set.c + +bn_mp_sqr.o: $(TOMMATH_DIR)/bn_mp_sqr.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_sqr.c + +bn_mp_sub.o: $(TOMMATH_DIR)/bn_mp_sub.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_sub.c + +bn_mp_sub_d.o: $(TOMMATH_DIR)/bn_mp_sub_d.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_sub_d.c + +bn_mp_toom_mul.o: $(TOMMATH_DIR)/bn_mp_toom_mul.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_toom_mul.c + +bn_mp_toom_sqr.o: $(TOMMATH_DIR)/bn_mp_toom_sqr.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_toom_sqr.c + +bn_mp_toradix_n.o: $(TOMMATH_DIR)/bn_mp_toradix_n.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_toradix_n.c + +bn_mp_zero.o: $(TOMMATH_DIR)/bn_mp_zero.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_zero.c + +bn_s_mp_add.o: $(TOMMATH_DIR)/bn_s_mp_add.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_s_mp_add.c + +bn_s_mp_mul_digs.o: $(TOMMATH_DIR)/bn_s_mp_mul_digs.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_s_mp_mul_digs.c + +bn_s_mp_sqr.o: $(TOMMATH_DIR)/bn_s_mp_sqr.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_s_mp_sqr.c + +bn_s_mp_sub.o: $(TOMMATH_DIR)/bn_s_mp_sub.c + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_s_mp_sub.c + tclUnixChan.o: $(UNIX_DIR)/tclUnixChan.c $(CC) -c $(CC_SWITCHES) $(UNIX_DIR)/tclUnixChan.c diff --git a/unix/configure.in b/unix/configure.in index 9cfcbd9..7403e15 100644 --- a/unix/configure.in +++ b/unix/configure.in @@ -3,7 +3,7 @@ dnl This file is an input file used by the GNU "autoconf" program to dnl generate the file "configure", which is run during Tcl installation dnl to configure the system for the local environment. # -# RCS: @(#) $Id: configure.in,v 1.127 2005/01/30 18:38:55 jenglish Exp $ +# RCS: @(#) $Id: configure.in,v 1.128 2005/05/10 18:35:26 kennykb Exp $ AC_INIT([tcl],[8.5]) AC_PREREQ(2.57) diff --git a/unix/dltest/Makefile.in b/unix/dltest/Makefile.in index 9f888e2..92fe4a4 100644 --- a/unix/dltest/Makefile.in +++ b/unix/dltest/Makefile.in @@ -1,7 +1,7 @@ # This Makefile is used to create several test cases for Tcl's load # command. It also illustrates how to take advantage of configuration # exported by Tcl to set up Makefiles for shared libraries. -# RCS: @(#) $Id: Makefile.in,v 1.17 2005/01/10 18:43:39 jenglish Exp $ +# RCS: @(#) $Id: Makefile.in,v 1.18 2005/05/10 18:35:29 kennykb Exp $ CC = @CC@ LIBS = @TCL_BUILD_STUB_LIB_SPEC@ @TCL_LIBS@ diff --git a/unix/tcl.spec b/unix/tcl.spec index ab1ed9e..0c2baf9 100644 --- a/unix/tcl.spec +++ b/unix/tcl.spec @@ -1,4 +1,4 @@ -# $Id: tcl.spec,v 1.21 2004/12/10 23:00:32 dkf Exp $ +# $Id: tcl.spec,v 1.22 2005/05/10 18:35:27 kennykb Exp $ # This file is the basis for a binary Tcl RPM for Linux. %define version 8.5a3 diff --git a/unix/tclConfig.sh.in b/unix/tclConfig.sh.in index 287532e..282263d 100644 --- a/unix/tclConfig.sh.in +++ b/unix/tclConfig.sh.in @@ -9,7 +9,7 @@ # # The information in this file is specific to a single platform. # -# RCS: @(#) $Id: tclConfig.sh.in,v 1.20 2005/01/10 18:43:39 jenglish Exp $ +# RCS: @(#) $Id: tclConfig.sh.in,v 1.21 2005/05/10 18:35:27 kennykb Exp $ # Tcl's version number. TCL_VERSION='@TCL_VERSION@' diff --git a/unix/tclUnixChan.c b/unix/tclUnixChan.c index 57a12d0..b6a5555 100644 --- a/unix/tclUnixChan.c +++ b/unix/tclUnixChan.c @@ -10,7 +10,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclUnixChan.c,v 1.55 2005/05/03 18:08:23 dgp Exp $ + * RCS: @(#) $Id: tclUnixChan.c,v 1.56 2005/05/10 18:35:27 kennykb Exp $ */ #include "tclInt.h" /* Internal definitions for Tcl. */ diff --git a/unix/tclUnixEvent.c b/unix/tclUnixEvent.c index 036c898..2e7cb4e 100644 --- a/unix/tclUnixEvent.c +++ b/unix/tclUnixEvent.c @@ -8,7 +8,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclUnixEvent.c,v 1.6 2005/01/21 22:25:35 andreas_kupries Exp $ + * RCS: @(#) $Id: tclUnixEvent.c,v 1.7 2005/05/10 18:35:27 kennykb Exp $ */ #include "tclInt.h" diff --git a/unix/tclUnixFCmd.c b/unix/tclUnixFCmd.c index 56eb9f7..e9efbfd 100644 --- a/unix/tclUnixFCmd.c +++ b/unix/tclUnixFCmd.c @@ -10,7 +10,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclUnixFCmd.c,v 1.41 2005/01/10 11:16:44 dkf Exp $ + * RCS: @(#) $Id: tclUnixFCmd.c,v 1.42 2005/05/10 18:35:27 kennykb Exp $ * * Portions of this code were derived from NetBSD source code which has * the following copyright notice: diff --git a/unix/tclUnixInit.c b/unix/tclUnixInit.c index 4175d37..1cd06a4 100644 --- a/unix/tclUnixInit.c +++ b/unix/tclUnixInit.c @@ -7,7 +7,7 @@ * Copyright (c) 1999 by Scriptics Corporation. * All rights reserved. * - * RCS: @(#) $Id: tclUnixInit.c,v 1.55 2005/04/13 21:26:15 dgp Exp $ + * RCS: @(#) $Id: tclUnixInit.c,v 1.56 2005/05/10 18:35:27 kennykb Exp $ */ #include "tclInt.h" diff --git a/unix/tclUnixNotfy.c b/unix/tclUnixNotfy.c index 3785e46..32e0e3d 100644 --- a/unix/tclUnixNotfy.c +++ b/unix/tclUnixNotfy.c @@ -11,7 +11,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclUnixNotfy.c,v 1.22 2005/04/30 11:47:19 das Exp $ + * RCS: @(#) $Id: tclUnixNotfy.c,v 1.23 2005/05/10 18:35:28 kennykb Exp $ */ #include "tclInt.h" diff --git a/unix/tclUnixPipe.c b/unix/tclUnixPipe.c index 5880f24..f1353c3 100644 --- a/unix/tclUnixPipe.c +++ b/unix/tclUnixPipe.c @@ -10,7 +10,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclUnixPipe.c,v 1.27 2005/01/27 00:23:32 andreas_kupries Exp $ + * RCS: @(#) $Id: tclUnixPipe.c,v 1.28 2005/05/10 18:35:28 kennykb Exp $ */ #include "tclInt.h" diff --git a/unix/tclUnixPort.h b/unix/tclUnixPort.h index 48588e4..59c9709 100644 --- a/unix/tclUnixPort.h +++ b/unix/tclUnixPort.h @@ -19,7 +19,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclUnixPort.h,v 1.40 2005/01/09 19:31:38 jenglish Exp $ + * RCS: @(#) $Id: tclUnixPort.h,v 1.41 2005/05/10 18:35:28 kennykb Exp $ */ #ifndef _TCLUNIXPORT diff --git a/unix/tclUnixSock.c b/unix/tclUnixSock.c index 566f362..cdd45a5 100644 --- a/unix/tclUnixSock.c +++ b/unix/tclUnixSock.c @@ -8,7 +8,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclUnixSock.c,v 1.10 2005/01/27 00:23:32 andreas_kupries Exp $ + * RCS: @(#) $Id: tclUnixSock.c,v 1.11 2005/05/10 18:35:29 kennykb Exp $ */ #include "tclInt.h" diff --git a/unix/tclUnixTime.c b/unix/tclUnixTime.c index 9c043ee..e51f3fe 100644 --- a/unix/tclUnixTime.c +++ b/unix/tclUnixTime.c @@ -9,7 +9,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclUnixTime.c,v 1.23 2005/01/21 22:25:35 andreas_kupries Exp $ + * RCS: @(#) $Id: tclUnixTime.c,v 1.24 2005/05/10 18:35:29 kennykb Exp $ */ #include "tclInt.h" diff --git a/win/Makefile.in b/win/Makefile.in index ca7b0c2..753681b 100644 --- a/win/Makefile.in +++ b/win/Makefile.in @@ -5,7 +5,7 @@ # "autoconf" program (constructs like "@foo@" will get replaced in the # actual Makefile. # -# RCS: @(#) $Id: Makefile.in,v 1.88 2005/02/24 18:05:43 dgp Exp $ +# RCS: @(#) $Id: Makefile.in,v 1.89 2005/05/10 18:35:29 kennykb Exp $ VERSION = @TCL_VERSION@ @@ -102,6 +102,7 @@ MAN2TCLFLAGS = @MAN2TCLFLAGS@ SRC_DIR = @srcdir@ ROOT_DIR = @srcdir@/.. GENERIC_DIR = @srcdir@/../generic +TOMMATH_DIR = @srcdir@/../libtommath WIN_DIR = @srcdir@ COMPAT_DIR = @srcdir@/../compat @@ -109,6 +110,7 @@ COMPAT_DIR = @srcdir@/../compat CYGPATH = @CYGPATH@ GENERIC_DIR_NATIVE = $(shell $(CYGPATH) '$(GENERIC_DIR)') +TOMMATH_DIR_NATIVE = $(shell $(CYGPATH) '$(TOMMATH_DIR)') WIN_DIR_NATIVE = $(shell $(CYGPATH) '$(WIN_DIR)') ROOT_DIR_NATIVE = $(shell $(CYGPATH) '$(ROOT_DIR)' | sed 's/\\*$$//' ) @@ -156,7 +158,7 @@ MAN2TCL = man2tcl$(EXEEXT) # makefile to look into these paths when resolving .c to .obj # dependencies. -VPATH = $(GENERIC_DIR):$(WIN_DIR):$(COMPAT_DIR) +VPATH = $(GENERIC_DIR):$(TOMMATH_DIR):$(WIN_DIR):$(COMPAT_DIR) AR = @AR@ RANLIB = @RANLIB@ @@ -186,14 +188,16 @@ RM = rm -f COPY = cp CC_SWITCHES = ${CFLAGS} ${CFLAGS_WARNING} ${TCL_SHLIB_CFLAGS} \ --I"${GENERIC_DIR_NATIVE}" -I"${WIN_DIR_NATIVE}" ${AC_FLAGS} \ +-I"${GENERIC_DIR_NATIVE}" -DTCL_TOMMATH -I"${TOMMATH_DIR_NATIVE}" \ +-I"${WIN_DIR_NATIVE}" ${AC_FLAGS} \ ${COMPILE_DEBUG_FLAGS} CC_OBJNAME = @CC_OBJNAME@ CC_EXENAME = @CC_EXENAME@ STUB_CC_SWITCHES = ${CFLAGS} ${CFLAGS_WARNING} ${SHLIB_CFLAGS} \ --I"${GENERIC_DIR_NATIVE}" -I"${WIN_DIR_NATIVE}" ${AC_FLAGS} \ +-I"${GENERIC_DIR_NATIVE}" -DTCL_TOMMATH -I"${TOMMATH_DIR_NATIVE}" \ +-I"${WIN_DIR_NATIVE}" ${AC_FLAGS} \ ${COMPILE_DEBUG_FLAGS} TCLTEST_OBJS = \ @@ -263,6 +267,7 @@ GENERIC_OBJS = \ tclResult.$(OBJEXT) \ tclScan.$(OBJEXT) \ tclStringObj.$(OBJEXT) \ + tclStrToD.$(OBJEXT) \ tclStubInit.$(OBJEXT) \ tclStubLib.$(OBJEXT) \ tclThread.$(OBJEXT) \ @@ -270,11 +275,65 @@ GENERIC_OBJS = \ tclThreadJoin.$(OBJEXT) \ tclThreadStorage.$(OBJEXT) \ tclTimer.$(OBJEXT) \ + tclTomMathInterface.$(OBJEXT) \ tclTrace.$(OBJEXT) \ tclUtf.$(OBJEXT) \ tclUtil.$(OBJEXT) \ tclVar.$(OBJEXT) +TOMMATH_OBJS = \ + bncore.${OBJEXT} \ + bn_reverse.${OBJEXT} \ + bn_fast_s_mp_mul_digs.${OBJEXT} \ + bn_fast_s_mp_sqr.${OBJEXT} \ + bn_mp_add.${OBJEXT} \ + bn_mp_add_d.${OBJEXT} \ + bn_mp_clamp.${OBJEXT} \ + bn_mp_clear.${OBJEXT} \ + bn_mp_clear_multi.${OBJEXT} \ + bn_mp_cmp.${OBJEXT} \ + bn_mp_cmp_mag.${OBJEXT} \ + bn_mp_copy.${OBJEXT} \ + bn_mp_count_bits.${OBJEXT} \ + bn_mp_div.${OBJEXT} \ + bn_mp_div_d.${OBJEXT} \ + bn_mp_div_2.${OBJEXT} \ + bn_mp_div_2d.${OBJEXT} \ + bn_mp_div_3.${OBJEXT} \ + bn_mp_exch.${OBJEXT} \ + bn_mp_grow.${OBJEXT} \ + bn_mp_init.${OBJEXT} \ + bn_mp_init_copy.${OBJEXT} \ + bn_mp_init_multi.${OBJEXT} \ + bn_mp_init_set.${OBJEXT} \ + bn_mp_init_size.${OBJEXT} \ + bn_mp_karatsuba_mul.${OBJEXT} \ + bn_mp_karatsuba_sqr.$(OBJEXT) \ + bn_mp_lshd.${OBJEXT} \ + bn_mp_mod.${OBJEXT} \ + bn_mp_mod_2d.${OBJEXT} \ + bn_mp_mul.${OBJEXT} \ + bn_mp_mul_2.${OBJEXT} \ + bn_mp_mul_2d.${OBJEXT} \ + bn_mp_mul_d.${OBJEXT} \ + bn_mp_radix_size.${OBJEXT} \ + bn_mp_radix_smap.${OBJEXT} \ + bn_mp_read_radix.${OBJEXT} \ + bn_mp_rshd.${OBJEXT} \ + bn_mp_set.${OBJEXT} \ + bn_mp_sqr.${OBJEXT} \ + bn_mp_sub.${OBJEXT} \ + bn_mp_sub_d.${OBJEXT} \ + bn_mp_toom_mul.${OBJEXT} \ + bn_mp_toom_sqr.${OBJEXT} \ + bn_mp_toradix_n.${OBJEXT} \ + bn_mp_zero.${OBJEXT} \ + bn_s_mp_add.${OBJEXT} \ + bn_s_mp_mul_digs.${OBJEXT} \ + bn_s_mp_sqr.${OBJEXT} \ + bn_s_mp_sub.${OBJEXT} + + WIN_OBJS = \ tclWin32Dll.$(OBJEXT) \ tclWinChan.$(OBJEXT) \ @@ -304,7 +363,7 @@ STUB_OBJS = tclStubLib.$(OBJEXT) TCLSH_OBJS = tclAppInit.$(OBJEXT) -TCL_OBJS = ${GENERIC_OBJS} ${WIN_OBJS} ${COMPAT_OBJS} +TCL_OBJS = ${GENERIC_OBJS} $(TOMMATH_OBJS) ${WIN_OBJS} ${COMPAT_OBJS} TCL_DOCS = "$(ROOT_DIR_NATIVE)"/doc/*.[13n] @@ -471,6 +530,15 @@ gendate: --no-lines \ $(GENERIC_DIR)/tclGetDate.y +# The following target generates the file generic/tommath.h. +# It needs to be run (and the results checked) after updating +# to a new release of libtommath. + +gentommath_h: + $(TCL_EXE) "$(ROOT_DIR_NATIVE)\tools\fix_tommath_h.tcl" \ + "$(TOMMATH_DIR_NATIVE)\tommath.h" \ + > "$(GENERIC_DIR_NATIVE)\tommath.h" + install: all install-binaries install-libraries install-doc install-binaries: binaries diff --git a/win/README.binary b/win/README.binary index 16705d7..e1e8449 100644 --- a/win/README.binary +++ b/win/README.binary @@ -1,6 +1,6 @@ Tcl/Tk 8.5 for Windows, Binary Distribution -RCS: @(#) $Id: README.binary,v 1.39 2004/12/10 23:00:32 dkf Exp $ +RCS: @(#) $Id: README.binary,v 1.40 2005/05/10 18:35:30 kennykb Exp $ 1. Introduction --------------- diff --git a/win/configure.in b/win/configure.in index df8d707..3e9b6cc 100644 --- a/win/configure.in +++ b/win/configure.in @@ -3,7 +3,7 @@ # generate the file "configure", which is run during Tcl installation # to configure the system for the local environment. # -# RCS: @(#) $Id: configure.in,v 1.82 2004/12/10 23:00:33 dkf Exp $ +# RCS: @(#) $Id: configure.in,v 1.83 2005/05/10 18:35:30 kennykb Exp $ AC_INIT(../generic/tcl.h) AC_PREREQ(2.57) diff --git a/win/makefile.vc b/win/makefile.vc index b18d51e..fbcf4a1 100644 --- a/win/makefile.vc +++ b/win/makefile.vc @@ -12,7 +12,7 @@ # Copyright (c) 2001-2004 David Gravereaux. # #------------------------------------------------------------------------------ -# RCS: @(#) $Id: makefile.vc,v 1.136 2005/03/08 21:52:35 hobbs Exp $ +# RCS: @(#) $Id: makefile.vc,v 1.137 2005/05/10 18:35:30 kennykb Exp $ #------------------------------------------------------------------------------ # Check to see we are configured to build with MSVC (MSDEVDIR or MSVCDIR) @@ -307,6 +307,7 @@ TCLOBJS = \ $(TMP_DIR)\tclResult.obj \ $(TMP_DIR)\tclScan.obj \ $(TMP_DIR)\tclStringObj.obj \ + $(TMP_DIR)\tclStrToD.obj \ $(TMP_DIR)\tclStubInit.obj \ $(TMP_DIR)\tclStubLib.obj \ $(TMP_DIR)\tclThread.obj \ @@ -314,6 +315,7 @@ TCLOBJS = \ $(TMP_DIR)\tclThreadJoin.obj \ $(TMP_DIR)\tclThreadStorage.obj \ $(TMP_DIR)\tclTimer.obj \ + $(TMP_DIR)\tclTomMathInterface.obj \ $(TMP_DIR)\tclTrace.obj \ $(TMP_DIR)\tclUtf.obj \ $(TMP_DIR)\tclUtil.obj \ @@ -332,6 +334,56 @@ TCLOBJS = \ $(TMP_DIR)\tclWinSock.obj \ $(TMP_DIR)\tclWinThrd.obj \ $(TMP_DIR)\tclWinTime.obj \ + $(TMP_DIR)\bncore.obj \ + $(TMP_DIR)\bn_reverse.obj \ + $(TMP_DIR)\bn_fast_s_mp_mul_digs.obj \ + $(TMP_DIR)\bn_fast_s_mp_sqr.obj \ + $(TMP_DIR)\bn_mp_add.obj \ + $(TMP_DIR)\bn_mp_add_d.obj \ + $(TMP_DIR)\bn_mp_clamp.obj \ + $(TMP_DIR)\bn_mp_clear.obj \ + $(TMP_DIR)\bn_mp_clear_multi.obj \ + $(TMP_DIR)\bn_mp_cmp.obj \ + $(TMP_DIR)\bn_mp_cmp_mag.obj \ + $(TMP_DIR)\bn_mp_copy.obj \ + $(TMP_DIR)\bn_mp_count_bits.obj \ + $(TMP_DIR)\bn_mp_div.obj \ + $(TMP_DIR)\bn_mp_div_d.obj \ + $(TMP_DIR)\bn_mp_div_2.obj \ + $(TMP_DIR)\bn_mp_div_2d.obj \ + $(TMP_DIR)\bn_mp_div_3.obj \ + $(TMP_DIR)\bn_mp_exch.obj \ + $(TMP_DIR)\bn_mp_grow.obj \ + $(TMP_DIR)\bn_mp_init.obj \ + $(TMP_DIR)\bn_mp_init_copy.obj \ + $(TMP_DIR)\bn_mp_init_multi.obj \ + $(TMP_DIR)\bn_mp_init_set.obj \ + $(TMP_DIR)\bn_mp_init_size.obj \ + $(TMP_DIR)\bn_mp_karatsuba_mul.obj \ + $(TMP_DIR)\bn_mp_karatsuba_sqr.obj \ + $(TMP_DIR)\bn_mp_lshd.obj \ + $(TMP_DIR)\bn_mp_mod.obj \ + $(TMP_DIR)\bn_mp_mod_2d.obj \ + $(TMP_DIR)\bn_mp_mul.obj \ + $(TMP_DIR)\bn_mp_mul_2.obj \ + $(TMP_DIR)\bn_mp_mul_2d.obj \ + $(TMP_DIR)\bn_mp_mul_d.obj \ + $(TMP_DIR)\bn_mp_radix_size.obj \ + $(TMP_DIR)\bn_mp_radix_smap.obj \ + $(TMP_DIR)\bn_mp_read_radix.obj \ + $(TMP_DIR)\bn_mp_rshd.obj \ + $(TMP_DIR)\bn_mp_set.obj \ + $(TMP_DIR)\bn_mp_sqr.obj \ + $(TMP_DIR)\bn_mp_sub.obj \ + $(TMP_DIR)\bn_mp_sub_d.obj \ + $(TMP_DIR)\bn_mp_toom_mul.obj \ + $(TMP_DIR)\bn_mp_toom_sqr.obj \ + $(TMP_DIR)\bn_mp_toradix_n.obj \ + $(TMP_DIR)\bn_mp_zero.obj \ + $(TMP_DIR)\bn_s_mp_add.obj \ + $(TMP_DIR)\bn_s_mp_mul_digs.obj \ + $(TMP_DIR)\bn_s_mp_sqr.obj \ + $(TMP_DIR)\bn_s_mp_sub.obj \ !if !$(STATIC_BUILD) $(TMP_DIR)\tcl.res !endif @@ -342,6 +394,7 @@ TCLSTUBOBJS = $(TMP_DIR)\tclStubLib.obj COMPATDIR = $(ROOT)\compat DOCDIR = $(ROOT)\doc GENERICDIR = $(ROOT)\generic +TOMMATHDIR = $(ROOT)\libtommath TOOLSDIR = $(ROOT)\tools WINDIR = $(ROOT)\win @@ -396,9 +449,9 @@ crt = -MT !endif !endif -TCL_INCLUDES = -I"$(WINDIR)" -I"$(GENERICDIR)" +TCL_INCLUDES = -I"$(WINDIR)" -I"$(GENERICDIR)" -I"$(TOMMATHDIR)" BASE_CFLAGS = $(cflags) $(cdebug) $(crt) $(TCL_INCLUDES) \ - -DTCL_PIPE_DLL=\"$(TCLPIPEDLLNAME)\" + -DTCL_PIPE_DLL=\"$(TCLPIPEDLLNAME)\" -DTCL_TOMMATH CON_CFLAGS = $(cflags) $(cdebug) $(crt) -DCONSOLE TCL_CFLAGS = $(BASE_CFLAGS) $(OPTDEFINES) STUB_CFLAGS = $(cflags) $(cdebug) $(OPTDEFINES) @@ -840,6 +893,11 @@ $(GENERICDIR)\regguts.h: $(GENERICDIR)\regcustom.h $< << +{$(TOMMATHDIR)}.c{$(TMP_DIR)}.obj:: + $(cc32) $(TCL_CFLAGS) -DBUILD_tcl -Fo$(TMP_DIR)\ @<< +$< +<< + {$(GENERICDIR)}.c{$(TMP_DIR)}.obj:: $(cc32) $(TCL_CFLAGS) -DBUILD_tcl -Fo$(TMP_DIR)\ @<< $< diff --git a/win/rules.vc b/win/rules.vc index 411a192..d9b498f 100644 --- a/win/rules.vc +++ b/win/rules.vc @@ -10,7 +10,7 @@ # Copyright (c) 2001-2003 David Gravereaux. # #------------------------------------------------------------------------------ -# RCS: @(#) $Id: rules.vc,v 1.19 2004/06/24 01:29:07 mistachkin Exp $ +# RCS: @(#) $Id: rules.vc,v 1.20 2005/05/10 18:35:36 kennykb Exp $ #------------------------------------------------------------------------------ !ifndef _RULES_VC diff --git a/win/tclWin32Dll.c b/win/tclWin32Dll.c index 59746d2..8303af5 100644 --- a/win/tclWin32Dll.c +++ b/win/tclWin32Dll.c @@ -9,7 +9,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclWin32Dll.c,v 1.40 2004/11/01 16:58:37 kennykb Exp $ + * RCS: @(#) $Id: tclWin32Dll.c,v 1.41 2005/05/10 18:35:37 kennykb Exp $ */ #include "tclWinInt.h" @@ -57,26 +57,7 @@ _except_dllmain_detach_handler( struct _CONTEXT *ContextRecord, void *DispatcherContext); -static -__attribute__ ((cdecl)) -EXCEPTION_DISPOSITION -_except_checkstackspace_handler( - struct _EXCEPTION_RECORD *ExceptionRecord, - void *EstablisherFrame, - struct _CONTEXT *ContextRecord, - void *DispatcherContext); - -static -__attribute__((cdecl)) -EXCEPTION_DISPOSITION -_except_TclWinCPUID_detach_handler( - struct _EXCEPTION_RECORD *ExceptionRecord, - void *EstablisherFrame, - struct _CONTEXT *ContextRecord, - void *DispatcherContext); - -#endif /* HAVE_NO_SEH */ - +#endif /* * VC++ 5.x has no 'cpuid' assembler instruction, so we @@ -327,7 +308,7 @@ DllMain(hInst, reason, reserved) "pushl %%ebp" "\n\t" "pushl %0" "\n\t" "pushl %%fs:0" "\n\t" - "movl %%esp, %%fs:0" + "movl %%esp, %%fs:0" "\n\t" : : "r" (_except_dllmain_detach_handler) ); #else @@ -549,6 +530,7 @@ TclWinNoBackslash( int TclpCheckStackSpace() { + int retval = 0; /* @@ -559,123 +541,103 @@ TclpCheckStackSpace() */ #ifdef HAVE_NO_SEH -# ifdef TCL_MEM_DEBUG __asm__ __volatile__ ( - "movl %%esp, %0" "\n\t" - "movl %%ebp, %1" "\n\t" - "movl %%fs:0, %2" "\n\t" - : "=m"(INITIAL_ESP), - "=m"(INITIAL_EBP), - "=r"(INITIAL_HANDLER) ); -# endif /* TCL_MEM_DEBUG */ - __asm__ __volatile__ ( - "pushl %%ebp" "\n\t" - "pushl %0" "\n\t" - "pushl %%fs:0" "\n\t" - "movl %%esp, %%fs:0" - : - : "r" (_except_checkstackspace_handler) ); -#else + /* + * Build an EXCEPTION_REGISTRATION structure on the stack, and + * stack it on the list of EXCEPTION_REGISTRATIONs + * anchored at the thread information block. + * Put the saved EBP at 0x8 and the address of the status + * return at 0xc. + */ + + "leal %[stat], %%edx" "\n\t" + "pushl %%edx" "\n\t" + "pushl %%ebp" "\n\t" + "leal 1f, %%edx" "\n\t" + "pushl %%edx" "\n\t" + "pushl %%fs:0" "\n\t" + "movl %%esp, %%fs:0" "\n\t" + + /* + * Attempt a call to _alloca, to determine whether there's + * sufficient memory to be had. + */ + + "movl %[size], %%eax" "\n\t" + "pushl %%eax" "\n\t" + "call __alloca" "\n\t" + + /* + * If 'alloca' succeeds, pull back the address of the + * EXCEPTION_REGISTRATION and put a 1 in EAX for status. + */ + + "movl $1, %%eax" "\n\t" + "movl %%fs:0, %%esp" "\n\t" + "jmp 2f" "\n" + + /* + * Come here on an exception. Retrieve the EXCEPTION_REGISTRATION + * from the link in the runtime library's EXCEPTION_REGISTRATION, + * and put a 0 in EAX to indicate failure. + */ + + "1:" "\t" + "movl %%fs:0, %%edx" "\n\t" + "movl $0, %%eax" "\n\t" + "movl 0x8(%%edx), %%esp" "\n" + + /* + * Come here whether or not an exception occurred. The stack + * pointer points to the EXCEPTION_REGISTRATION, and EAX contains + * status. Unstack the EXCEPTION_REGISTRATION and clean up + * the stack. + */ + + "2:" "\t" + "pop %%fs:0" "\n\t" + "addl $4, %%esp" "\n\t" + "pop %%ebp" "\n\t" + "pop %%edx" "\n\t" + "movl %%eax, 0x0(%%edx)" "\n\t" + + : [stat]"=m"(retval) + : [size]"i"(TCL_WIN_STACK_THRESHOLD) + : "%eax","%ebx", "%ecx", "%edx", "%esi", "%edi", "memory" ); + +#else /* !HAVE_NO_SEH */ __try { -#endif /* HAVE_NO_SEH */ #ifdef HAVE_ALLOCA_GCC_INLINE - __asm__ __volatile__ ( + __asm__ __volatile__ ( "movl %0, %%eax" "\n\t" "call __alloca" "\n\t" : : "i"(TCL_WIN_STACK_THRESHOLD) : "%eax"); #else - alloca(TCL_WIN_STACK_THRESHOLD); + alloca(TCL_WIN_STACK_THRESHOLD); #endif /* HAVE_ALLOCA_GCC_INLINE */ - retval = 1; -#ifdef HAVE_NO_SEH - __asm__ __volatile__ ( - "movl %%fs:0, %%esp" "\n\t" - "jmp checkstackspace_pop" "\n" - "checkstackspace_reentry:" "\n\t" - "movl %%fs:0, %%eax" "\n\t" - "movl 0x8(%%eax), %%esp" "\n\t" - "movl 0x8(%%esp), %%ebp" "\n" - "checkstackspace_pop:" "\n\t" - "movl (%%esp), %%eax" "\n\t" - "movl %%eax, %%fs:0" "\n\t" - "add $12, %%esp" "\n\t" - : - : - : "%eax"); - -# ifdef TCL_MEM_DEBUG - __asm__ __volatile__ ( - "movl %%esp, %0" "\n\t" - "movl %%ebp, %1" "\n\t" - "movl %%fs:0, %2" "\n\t" - : "=m"(RESTORED_ESP), - "=m"(RESTORED_EBP), - "=r"(RESTORED_HANDLER) ); - - if (INITIAL_ESP != RESTORED_ESP) - Tcl_Panic("ESP restored incorrectly"); - if (INITIAL_EBP != RESTORED_EBP) - Tcl_Panic("EBP restored incorrectly"); - if (INITIAL_HANDLER != RESTORED_HANDLER) - Tcl_Panic("HANDLER restored incorrectly"); -# endif /* TCL_MEM_DEBUG */ -#else + retval = 1; } __except (EXCEPTION_EXECUTE_HANDLER) {} #endif /* HAVE_NO_SEH */ - - /* - * Avoid using control flow statements in the SEH guarded block! - */ + return retval; } /* *---------------------------------------------------------------------- * - * _except_checkstackspace_handler -- - * - * SEH exception handler for TclpCheckStackSpace. - * - * Results: - * See TclpCheckStackSpace. - * - * Side effects: - * See TclpCheckStackSpace. - * - *---------------------------------------------------------------------- - */ -#ifdef HAVE_NO_SEH -static -__attribute__ ((cdecl)) -EXCEPTION_DISPOSITION -_except_checkstackspace_handler( - struct _EXCEPTION_RECORD *ExceptionRecord, - void *EstablisherFrame, - struct _CONTEXT *ContextRecord, - void *DispatcherContext) -{ - __asm__ __volatile__ ( - "jmp checkstackspace_reentry"); - return 0; /* Function does not return */ -} -#endif /* HAVE_NO_SEH */ - -/* - *---------------------------------------------------------------------- - * * TclWinGetPlatform -- * - * This is a kludge that allows the test library to get access - * the internal tclPlatform variable. + * This is a kludge that allows the test library to get access + * the internal tclPlatform variable. * * Results: - * Returns a pointer to the tclPlatform variable. + * Returns a pointer to the tclPlatform variable. * * Side effects: - * None. + * None. * *---------------------------------------------------------------------- */ @@ -691,123 +653,123 @@ TclWinGetPlatform() * * TclWinSetInterfaces -- * - * A helper proc that allows the test library to change the - * tclWinProcs structure to dispatch to either the wide-character - * or multi-byte versions of the operating system calls, depending - * on whether Unicode is the system encoding. - * - * As well as this, we can also try to load in some additional - * procs which may/may not be present depending on the current - * Windows version (e.g. Win95 will not have the procs below). + * A helper proc that allows the test library to change the + * tclWinProcs structure to dispatch to either the wide-character + * or multi-byte versions of the operating system calls, depending + * on whether Unicode is the system encoding. + * + * As well as this, we can also try to load in some additional + * procs which may/may not be present depending on the current + * Windows version (e.g. Win95 will not have the procs below). * * Results: - * None. + * None. * * Side effects: - * None. + * None. * *--------------------------------------------------------------------------- */ void TclWinSetInterfaces( - int wide) /* Non-zero to use wide interfaces, 0 - * otherwise. */ + int wide) /* Non-zero to use wide interfaces, 0 + * otherwise. */ { Tcl_FreeEncoding(tclWinTCharEncoding); if (wide) { - tclWinProcs = &unicodeProcs; - tclWinTCharEncoding = Tcl_GetEncoding(NULL, "unicode"); - if (tclWinProcs->getFileAttributesExProc == NULL) { - HINSTANCE hInstance = LoadLibraryA("kernel32"); - if (hInstance != NULL) { - tclWinProcs->getFileAttributesExProc = - (BOOL (WINAPI *)(CONST TCHAR *, GET_FILEEX_INFO_LEVELS, - LPVOID)) GetProcAddress(hInstance, "GetFileAttributesExW"); - tclWinProcs->createHardLinkProc = - (BOOL (WINAPI *)(CONST TCHAR *, CONST TCHAR*, - LPSECURITY_ATTRIBUTES)) GetProcAddress(hInstance, - "CreateHardLinkW"); - tclWinProcs->findFirstFileExProc = - (HANDLE (WINAPI *)(CONST TCHAR*, UINT, - LPVOID, UINT, LPVOID, DWORD)) GetProcAddress(hInstance, - "FindFirstFileExW"); - tclWinProcs->getVolumeNameForVMPProc = - (BOOL (WINAPI *)(CONST TCHAR*, TCHAR*, - DWORD)) GetProcAddress(hInstance, - "GetVolumeNameForVolumeMountPointW"); - tclWinProcs->getLongPathNameProc = - (DWORD (WINAPI *)(CONST TCHAR*, TCHAR*, - DWORD)) GetProcAddress(hInstance, - "GetLongPathNameW"); - FreeLibrary(hInstance); - } - hInstance = LoadLibraryA("advapi32"); - if (hInstance != NULL) { - tclWinProcs->getFileSecurityProc = (BOOL (WINAPI *)( - LPCTSTR lpFileName, - SECURITY_INFORMATION RequestedInformation, - PSECURITY_DESCRIPTOR pSecurityDescriptor, DWORD nLength, - LPDWORD lpnLengthNeeded)) GetProcAddress(hInstance, - "GetFileSecurityW"); - tclWinProcs->impersonateSelfProc = (BOOL (WINAPI *) ( - SECURITY_IMPERSONATION_LEVEL ImpersonationLevel)) - GetProcAddress(hInstance, "ImpersonateSelf"); - tclWinProcs->openThreadTokenProc = (BOOL (WINAPI *) ( - HANDLE ThreadHandle, DWORD DesiredAccess, BOOL OpenAsSelf, - PHANDLE TokenHandle)) GetProcAddress(hInstance, - "OpenThreadToken"); - tclWinProcs->revertToSelfProc = (BOOL (WINAPI *) (void)) - GetProcAddress(hInstance, "RevertToSelf"); - tclWinProcs->mapGenericMaskProc = (VOID (WINAPI *) ( - PDWORD AccessMask, PGENERIC_MAPPING GenericMapping)) - GetProcAddress(hInstance, "MapGenericMask"); - tclWinProcs->accessCheckProc = (BOOL (WINAPI *)( - PSECURITY_DESCRIPTOR pSecurityDescriptor, - HANDLE ClientToken, DWORD DesiredAccess, - PGENERIC_MAPPING GenericMapping, - PPRIVILEGE_SET PrivilegeSet, - LPDWORD PrivilegeSetLength, - LPDWORD GrantedAccess, - LPBOOL AccessStatus)) GetProcAddress(hInstance, - "AccessCheck"); - FreeLibrary(hInstance); - } - } + tclWinProcs = &unicodeProcs; + tclWinTCharEncoding = Tcl_GetEncoding(NULL, "unicode"); + if (tclWinProcs->getFileAttributesExProc == NULL) { + HINSTANCE hInstance = LoadLibraryA("kernel32"); + if (hInstance != NULL) { + tclWinProcs->getFileAttributesExProc = + (BOOL (WINAPI *)(CONST TCHAR *, GET_FILEEX_INFO_LEVELS, + LPVOID)) GetProcAddress(hInstance, "GetFileAttributesExW"); + tclWinProcs->createHardLinkProc = + (BOOL (WINAPI *)(CONST TCHAR *, CONST TCHAR*, + LPSECURITY_ATTRIBUTES)) GetProcAddress(hInstance, + "CreateHardLinkW"); + tclWinProcs->findFirstFileExProc = + (HANDLE (WINAPI *)(CONST TCHAR*, UINT, + LPVOID, UINT, LPVOID, DWORD)) GetProcAddress(hInstance, + "FindFirstFileExW"); + tclWinProcs->getVolumeNameForVMPProc = + (BOOL (WINAPI *)(CONST TCHAR*, TCHAR*, + DWORD)) GetProcAddress(hInstance, + "GetVolumeNameForVolumeMountPointW"); + tclWinProcs->getLongPathNameProc = + (DWORD (WINAPI *)(CONST TCHAR*, TCHAR*, + DWORD)) GetProcAddress(hInstance, + "GetLongPathNameW"); + FreeLibrary(hInstance); + } + hInstance = LoadLibraryA("advapi32"); + if (hInstance != NULL) { + tclWinProcs->getFileSecurityProc = (BOOL (WINAPI *)( + LPCTSTR lpFileName, + SECURITY_INFORMATION RequestedInformation, + PSECURITY_DESCRIPTOR pSecurityDescriptor, DWORD nLength, + LPDWORD lpnLengthNeeded)) GetProcAddress(hInstance, + "GetFileSecurityW"); + tclWinProcs->impersonateSelfProc = (BOOL (WINAPI *) ( + SECURITY_IMPERSONATION_LEVEL ImpersonationLevel)) + GetProcAddress(hInstance, "ImpersonateSelf"); + tclWinProcs->openThreadTokenProc = (BOOL (WINAPI *) ( + HANDLE ThreadHandle, DWORD DesiredAccess, BOOL OpenAsSelf, + PHANDLE TokenHandle)) GetProcAddress(hInstance, + "OpenThreadToken"); + tclWinProcs->revertToSelfProc = (BOOL (WINAPI *) (void)) + GetProcAddress(hInstance, "RevertToSelf"); + tclWinProcs->mapGenericMaskProc = (VOID (WINAPI *) ( + PDWORD AccessMask, PGENERIC_MAPPING GenericMapping)) + GetProcAddress(hInstance, "MapGenericMask"); + tclWinProcs->accessCheckProc = (BOOL (WINAPI *)( + PSECURITY_DESCRIPTOR pSecurityDescriptor, + HANDLE ClientToken, DWORD DesiredAccess, + PGENERIC_MAPPING GenericMapping, + PPRIVILEGE_SET PrivilegeSet, + LPDWORD PrivilegeSetLength, + LPDWORD GrantedAccess, + LPBOOL AccessStatus)) GetProcAddress(hInstance, + "AccessCheck"); + FreeLibrary(hInstance); + } + } } else { - tclWinProcs = &asciiProcs; - tclWinTCharEncoding = NULL; - if (tclWinProcs->getFileAttributesExProc == NULL) { - HINSTANCE hInstance = LoadLibraryA("kernel32"); - if (hInstance != NULL) { - tclWinProcs->getFileAttributesExProc = - (BOOL (WINAPI *)(CONST TCHAR *, GET_FILEEX_INFO_LEVELS, - LPVOID)) GetProcAddress(hInstance, "GetFileAttributesExA"); - tclWinProcs->createHardLinkProc = - (BOOL (WINAPI *)(CONST TCHAR *, CONST TCHAR*, - LPSECURITY_ATTRIBUTES)) GetProcAddress(hInstance, - "CreateHardLinkA"); - tclWinProcs->findFirstFileExProc = NULL; - tclWinProcs->getLongPathNameProc = NULL; - /* - * The 'findFirstFileExProc' function exists on some - * of 95/98/ME, but it seems not to work as anticipated. - * Therefore we don't set this function pointer. The - * relevant code will fall back on a slower approach - * using the normal findFirstFileProc. - * - * (HANDLE (WINAPI *)(CONST TCHAR*, UINT, - * LPVOID, UINT, LPVOID, DWORD)) GetProcAddress(hInstance, - * "FindFirstFileExA"); - */ - tclWinProcs->getVolumeNameForVMPProc = - (BOOL (WINAPI *)(CONST TCHAR*, TCHAR*, - DWORD)) GetProcAddress(hInstance, - "GetVolumeNameForVolumeMountPointA"); - FreeLibrary(hInstance); - } - } + tclWinProcs = &asciiProcs; + tclWinTCharEncoding = NULL; + if (tclWinProcs->getFileAttributesExProc == NULL) { + HINSTANCE hInstance = LoadLibraryA("kernel32"); + if (hInstance != NULL) { + tclWinProcs->getFileAttributesExProc = + (BOOL (WINAPI *)(CONST TCHAR *, GET_FILEEX_INFO_LEVELS, + LPVOID)) GetProcAddress(hInstance, "GetFileAttributesExA"); + tclWinProcs->createHardLinkProc = + (BOOL (WINAPI *)(CONST TCHAR *, CONST TCHAR*, + LPSECURITY_ATTRIBUTES)) GetProcAddress(hInstance, + "CreateHardLinkA"); + tclWinProcs->findFirstFileExProc = NULL; + tclWinProcs->getLongPathNameProc = NULL; + /* + * The 'findFirstFileExProc' function exists on some + * of 95/98/ME, but it seems not to work as anticipated. + * Therefore we don't set this function pointer. The + * relevant code will fall back on a slower approach + * using the normal findFirstFileProc. + * + * (HANDLE (WINAPI *)(CONST TCHAR*, UINT, + * LPVOID, UINT, LPVOID, DWORD)) GetProcAddress(hInstance, + * "FindFirstFileExA"); + */ + tclWinProcs->getVolumeNameForVMPProc = + (BOOL (WINAPI *)(CONST TCHAR*, TCHAR*, + DWORD)) GetProcAddress(hInstance, + "GetVolumeNameForVolumeMountPointA"); + FreeLibrary(hInstance); + } + } } } @@ -816,9 +778,9 @@ TclWinSetInterfaces( * * TclWinResetInterfaceEncodings -- * - * Called during finalization to free up any encodings we use. - * The tclWinProcs-> look up table is still ok to use after - * this call, provided no encoding conversion is required. + * Called during finalization to free up any encodings we use. + * The tclWinProcs-> look up table is still ok to use after + * this call, provided no encoding conversion is required. * * We also clean up any memory allocated in our mount point * map which is used to follow certain kinds of symlinks. @@ -826,10 +788,10 @@ TclWinSetInterfaces( * down. * * Results: - * None. + * None. * * Side effects: - * None. + * None. * *--------------------------------------------------------------------------- */ @@ -838,17 +800,17 @@ TclWinResetInterfaceEncodings() { MountPointMap *dlIter, *dlIter2; if (tclWinTCharEncoding != NULL) { - Tcl_FreeEncoding(tclWinTCharEncoding); - tclWinTCharEncoding = NULL; + Tcl_FreeEncoding(tclWinTCharEncoding); + tclWinTCharEncoding = NULL; } /* Clean up the mount point map */ Tcl_MutexLock(&mountPointMap); dlIter = driveLetterLookup; while (dlIter != NULL) { - dlIter2 = dlIter->nextPtr; - ckfree((char*)dlIter->volumeName); - ckfree((char*)dlIter); - dlIter = dlIter2; + dlIter2 = dlIter->nextPtr; + ckfree((char*)dlIter->volumeName); + ckfree((char*)dlIter); + dlIter = dlIter2; } Tcl_MutexUnlock(&mountPointMap); } @@ -858,15 +820,15 @@ TclWinResetInterfaceEncodings() * * TclWinResetInterfaces -- * - * Called during finalization to reset us to a safe state for reuse. - * After this call, it is best not to use the tclWinProcs-> look - * up table since it is likely to be different to what is expected. + * Called during finalization to reset us to a safe state for reuse. + * After this call, it is best not to use the tclWinProcs-> look + * up table since it is likely to be different to what is expected. * * Results: - * None. + * None. * * Side effects: - * None. + * None. * *--------------------------------------------------------------------------- */ @@ -912,84 +874,84 @@ TclWinDriveLetterForVolMountPoint(CONST WCHAR *mountPoint) Tcl_MutexLock(&mountPointMap); dlIter = driveLetterLookup; while (dlIter != NULL) { - if (wcscmp(dlIter->volumeName, mountPoint) == 0) { - /* - * We need to check whether this information is - * still valid, since either the user or various - * programs could have adjusted the mount points on - * the fly. - */ - drive[0] = L'A' + (dlIter->driveLetter - 'A'); - /* Try to read the volume mount point and see where it points */ - if ((*tclWinProcs->getVolumeNameForVMPProc)((TCHAR*)drive, - (TCHAR*)Target, 55) != 0) { - if (wcscmp((WCHAR*)dlIter->volumeName, Target) == 0) { - /* Nothing has changed */ - Tcl_MutexUnlock(&mountPointMap); - return dlIter->driveLetter; - } - } - /* - * If we reach here, unfortunately, this mount point is - * no longer valid at all - */ - if (driveLetterLookup == dlIter) { - dlPtr2 = dlIter; - driveLetterLookup = dlIter->nextPtr; - } else { - for (dlPtr2 = driveLetterLookup; - dlPtr2 != NULL; dlPtr2 = dlPtr2->nextPtr) { - if (dlPtr2->nextPtr == dlIter) { - dlPtr2->nextPtr = dlIter->nextPtr; - dlPtr2 = dlIter; - break; - } - } - } - /* Now dlPtr2 points to the structure to free */ - ckfree((char*)dlPtr2->volumeName); - ckfree((char*)dlPtr2); - /* - * Restart the loop --- we could try to be clever - * and continue half way through, but the logic is a - * bit messy, so it's cleanest just to restart - */ - dlIter = driveLetterLookup; - continue; - } - dlIter = dlIter->nextPtr; + if (wcscmp(dlIter->volumeName, mountPoint) == 0) { + /* + * We need to check whether this information is + * still valid, since either the user or various + * programs could have adjusted the mount points on + * the fly. + */ + drive[0] = L'A' + (dlIter->driveLetter - 'A'); + /* Try to read the volume mount point and see where it points */ + if ((*tclWinProcs->getVolumeNameForVMPProc)((TCHAR*)drive, + (TCHAR*)Target, 55) != 0) { + if (wcscmp((WCHAR*)dlIter->volumeName, Target) == 0) { + /* Nothing has changed */ + Tcl_MutexUnlock(&mountPointMap); + return dlIter->driveLetter; + } + } + /* + * If we reach here, unfortunately, this mount point is + * no longer valid at all + */ + if (driveLetterLookup == dlIter) { + dlPtr2 = dlIter; + driveLetterLookup = dlIter->nextPtr; + } else { + for (dlPtr2 = driveLetterLookup; + dlPtr2 != NULL; dlPtr2 = dlPtr2->nextPtr) { + if (dlPtr2->nextPtr == dlIter) { + dlPtr2->nextPtr = dlIter->nextPtr; + dlPtr2 = dlIter; + break; + } + } + } + /* Now dlPtr2 points to the structure to free */ + ckfree((char*)dlPtr2->volumeName); + ckfree((char*)dlPtr2); + /* + * Restart the loop --- we could try to be clever + * and continue half way through, but the logic is a + * bit messy, so it's cleanest just to restart + */ + dlIter = driveLetterLookup; + continue; + } + dlIter = dlIter->nextPtr; } /* We couldn't find it, so we must iterate over the letters */ for (drive[0] = L'A'; drive[0] <= L'Z'; drive[0]++) { - /* Try to read the volume mount point and see where it points */ - if ((*tclWinProcs->getVolumeNameForVMPProc)((TCHAR*)drive, - (TCHAR*)Target, 55) != 0) { - int alreadyStored = 0; - for (dlIter = driveLetterLookup; dlIter != NULL; - dlIter = dlIter->nextPtr) { - if (wcscmp((WCHAR*)dlIter->volumeName, Target) == 0) { - alreadyStored = 1; - break; - } - } - if (!alreadyStored) { - dlPtr2 = (MountPointMap*) ckalloc(sizeof(MountPointMap)); - dlPtr2->volumeName = TclNativeDupInternalRep(Target); - dlPtr2->driveLetter = 'A' + (drive[0] - L'A'); - dlPtr2->nextPtr = driveLetterLookup; - driveLetterLookup = dlPtr2; - } - } + /* Try to read the volume mount point and see where it points */ + if ((*tclWinProcs->getVolumeNameForVMPProc)((TCHAR*)drive, + (TCHAR*)Target, 55) != 0) { + int alreadyStored = 0; + for (dlIter = driveLetterLookup; dlIter != NULL; + dlIter = dlIter->nextPtr) { + if (wcscmp((WCHAR*)dlIter->volumeName, Target) == 0) { + alreadyStored = 1; + break; + } + } + if (!alreadyStored) { + dlPtr2 = (MountPointMap*) ckalloc(sizeof(MountPointMap)); + dlPtr2->volumeName = TclNativeDupInternalRep(Target); + dlPtr2->driveLetter = 'A' + (drive[0] - L'A'); + dlPtr2->nextPtr = driveLetterLookup; + driveLetterLookup = dlPtr2; + } + } } /* Try again */ for (dlIter = driveLetterLookup; dlIter != NULL; - dlIter = dlIter->nextPtr) { - if (wcscmp(dlIter->volumeName, mountPoint) == 0) { - Tcl_MutexUnlock(&mountPointMap); - return dlIter->driveLetter; - } + dlIter = dlIter->nextPtr) { + if (wcscmp(dlIter->volumeName, mountPoint) == 0) { + Tcl_MutexUnlock(&mountPointMap); + return dlIter->driveLetter; + } } /* * The volume doesn't appear to correspond to a drive letter -- we @@ -1010,78 +972,78 @@ TclWinDriveLetterForVolMountPoint(CONST WCHAR *mountPoint) * * Tcl_WinUtfToTChar, Tcl_WinTCharToUtf -- * - * Convert between UTF-8 and Unicode when running Windows NT or - * the current ANSI code page when running Windows 95. - * - * On Mac, Unix, and Windows 95, all strings exchanged between Tcl - * and the OS are "char" oriented. We need only one Tcl_Encoding to - * convert between UTF-8 and the system's native encoding. We use - * NULL to represent that encoding. - * - * On NT, some strings exchanged between Tcl and the OS are "char" - * oriented, while others are in Unicode. We need two Tcl_Encoding - * APIs depending on whether we are targeting a "char" or Unicode - * interface. - * - * Calling Tcl_UtfToExternal() or Tcl_ExternalToUtf() with an - * encoding of NULL should always used to convert between UTF-8 - * and the system's "char" oriented encoding. The following two - * functions are used in Windows-specific code to convert between - * UTF-8 and Unicode strings (NT) or "char" strings(95). This saves - * you the trouble of writing the following type of fragment over and - * over: - * - * if (running NT) { - * encoding <- Tcl_GetEncoding("unicode"); - * nativeBuffer <- UtfToExternal(encoding, utfBuffer); - * Tcl_FreeEncoding(encoding); - * } else { - * nativeBuffer <- UtfToExternal(NULL, utfBuffer); - * } - * - * By convention, in Windows a TCHAR is a character in the ANSI code - * page on Windows 95, a Unicode character on Windows NT. If you - * plan on targeting a Unicode interfaces when running on NT and a - * "char" oriented interface while running on 95, these functions - * should be used. If you plan on targetting the same "char" - * oriented function on both 95 and NT, use Tcl_UtfToExternal() - * with an encoding of NULL. + * Convert between UTF-8 and Unicode when running Windows NT or + * the current ANSI code page when running Windows 95. + * + * On Mac, Unix, and Windows 95, all strings exchanged between Tcl + * and the OS are "char" oriented. We need only one Tcl_Encoding to + * convert between UTF-8 and the system's native encoding. We use + * NULL to represent that encoding. + * + * On NT, some strings exchanged between Tcl and the OS are "char" + * oriented, while others are in Unicode. We need two Tcl_Encoding + * APIs depending on whether we are targeting a "char" or Unicode + * interface. + * + * Calling Tcl_UtfToExternal() or Tcl_ExternalToUtf() with an + * encoding of NULL should always used to convert between UTF-8 + * and the system's "char" oriented encoding. The following two + * functions are used in Windows-specific code to convert between + * UTF-8 and Unicode strings (NT) or "char" strings(95). This saves + * you the trouble of writing the following type of fragment over and + * over: + * + * if (running NT) { + * encoding <- Tcl_GetEncoding("unicode"); + * nativeBuffer <- UtfToExternal(encoding, utfBuffer); + * Tcl_FreeEncoding(encoding); + * } else { + * nativeBuffer <- UtfToExternal(NULL, utfBuffer); + * } + * + * By convention, in Windows a TCHAR is a character in the ANSI code + * page on Windows 95, a Unicode character on Windows NT. If you + * plan on targeting a Unicode interfaces when running on NT and a + * "char" oriented interface while running on 95, these functions + * should be used. If you plan on targetting the same "char" + * oriented function on both 95 and NT, use Tcl_UtfToExternal() + * with an encoding of NULL. * * Results: - * The result is a pointer to the string in the desired target - * encoding. Storage for the result string is allocated in - * dsPtr; the caller must call Tcl_DStringFree() when the result - * is no longer needed. + * The result is a pointer to the string in the desired target + * encoding. Storage for the result string is allocated in + * dsPtr; the caller must call Tcl_DStringFree() when the result + * is no longer needed. * * Side effects: - * None. + * None. * *--------------------------------------------------------------------------- */ TCHAR * Tcl_WinUtfToTChar(string, len, dsPtr) - CONST char *string; /* Source string in UTF-8. */ - int len; /* Source string length in bytes, or < 0 for - * strlen(). */ - Tcl_DString *dsPtr; /* Uninitialized or free DString in which - * the converted string is stored. */ + CONST char *string; /* Source string in UTF-8. */ + int len; /* Source string length in bytes, or < 0 for + * strlen(). */ + Tcl_DString *dsPtr; /* Uninitialized or free DString in which + * the converted string is stored. */ { return (TCHAR *) Tcl_UtfToExternalDString(tclWinTCharEncoding, - string, len, dsPtr); + string, len, dsPtr); } char * Tcl_WinTCharToUtf(string, len, dsPtr) - CONST TCHAR *string; /* Source string in Unicode when running - * NT, ANSI when running 95. */ - int len; /* Source string length in bytes, or < 0 for - * platform-specific string length. */ - Tcl_DString *dsPtr; /* Uninitialized or free DString in which - * the converted string is stored. */ + CONST TCHAR *string; /* Source string in Unicode when running + * NT, ANSI when running 95. */ + int len; /* Source string length in bytes, or < 0 for + * platform-specific string length. */ + Tcl_DString *dsPtr; /* Uninitialized or free DString in which + * the converted string is stored. */ { return Tcl_ExternalToUtfDString(tclWinTCharEncoding, - (CONST char *) string, len, dsPtr); + (CONST char *) string, len, dsPtr); } /* @@ -1089,14 +1051,14 @@ Tcl_WinTCharToUtf(string, len, dsPtr) * * TclWinCPUID -- * - * Get CPU ID information on an Intel box under Windows + * Get CPU ID information on an Intel box under Windows * * Results: - * Returns TCL_OK if successful, TCL_ERROR if CPUID is not - * supported or fails. + * Returns TCL_OK if successful, TCL_ERROR if CPUID is not + * supported or fails. * * Side effects: - * If successful, stores EAX, EBX, ECX and EDX registers after + * If successful, stores EAX, EBX, ECX and EDX registers after * the CPUID instruction in the four integers designated by 'regsPtr' * *---------------------------------------------------------------------- @@ -1104,70 +1066,79 @@ Tcl_WinTCharToUtf(string, len, dsPtr) int TclWinCPUID( unsigned int index, /* Which CPUID value to retrieve */ - register unsigned int * regsPtr ) /* Registers after the CPUID */ + unsigned int * regsPtr ) /* Registers after the CPUID */ { int status = TCL_ERROR; -#if defined(__GNUC__) - - /* Establish structured exception handling */ +#if defined(__GNUC__) && !defined(_WIN64) -# ifdef HAVE_NO_SEH + /* + * Execute the CPUID instruction with the given index, and + * store results off 'regPtr'. + */ + __asm__ __volatile__ ( - "pushl %%ebp" "\n\t" - "pushl %0" "\n\t" - "pushl %%fs:0" "\n\t" - "movl %%esp, %%fs:0" - : - : "r" (_except_TclWinCPUID_detach_handler) ); -# else - __try { -# endif - - /* - * Execute the CPUID instruction with the given index, and - * store results off 'regPtr'. - */ - - __asm__ __volatile__ ( - "movl %4, %%eax" "\n\t" - "cpuid" "\n\t" - "movl %%eax, %0" "\n\t" - "movl %%ebx, %1" "\n\t" - "movl %%ecx, %2" "\n\t" - "movl %%edx, %3" - : - "=m"(regsPtr[0]), - "=m"(regsPtr[1]), - "=m"(regsPtr[2]), - "=m"(regsPtr[3]) - : "m"(index) - : "%eax", "%ebx", "%ecx", "%edx" ); - status = TCL_OK; - /* End the structured exception handler */ - -# ifndef HAVE_NO_SEH - } __except( EXCEPTION_EXECUTE_HANDLER ) { - /* do nothing */ - } -# else - __asm __volatile__ ( - "jmp TclWinCPUID_detach_pop" "\n" - "TclWinCPUID_detach_reentry:" "\n\t" - "movl %%fs:0, %%eax" "\n\t" - "movl 0x8(%%eax), %%esp" "\n\t" - "movl 0x8(%%esp), %%ebp" "\n" - "TclWinCPUID_detach_pop:" "\n\t" - "movl (%%esp), %%eax" "\n\t" - "movl %%eax, %%fs:0" "\n\t" - "add $12, %%esp" "\n\t" - : - : - : "%eax"); -# endif + /* + * Build an EXCEPTION_REGISTRATION on the stack. Save + * EBP in the EXCEPTION_REGISTRATION's third longword. + * Put the address of the status word at 0x0c relative + * to the EXCEPTION_REGISTRATION. + */ + + "movl %[index], %%eax" "\n\t" + "leal %[stat], %%edx" "\n\t" + "movl %[rptr], %%edi" "\n\t" + "pushl %%edx" "\n\t" + "pushl %%ebp" "\n\t" + "leal 1f, %%edx" "\n\t" + "pushl %%edx" "\n\t" + "pushl %%fs:0" "\n\t" + "movl %%esp, %%fs:0" "\n\t" + + /* + * Do the CPUID instruction, and save the results in + * the 'regsPtr' area + */ + + "cpuid" "\n\t" + "movl %%eax, 0x0(%%edi)" "\n\t" + "movl %%ebx, 0x4(%%edi)" "\n\t" + "movl %%ecx, 0x8(%%edi)" "\n\t" + "movl %%edx, 0xc(%%edi)" "\n\t" + "movl %[ok], %%eax" "\n\t" + "jmp 2f" "\n" + + /* + * Come here on any exception. Retrieve the EXCEPTION_REGISTRATION + * and repair the stack. + */ + + "1:" "\t" + "movl %%fs:0, %%edx" "\n\t" + "movl 0x8(%%edx), %%esp" "\n\t" + "movl %[error], %%eax" "\n" + + /* + * Unstack the EXCEPTION_REGISTRATION, get back the address + * of the status word, and store status. + */ + + "2:" "\t" + "pop %%fs:0" "\n\t" + "addl $4, %%esp" "\n\t" + "pop %%ebp" "\n\t" + "pop %%edx" "\n\t" + "movl %%eax, 0x0(%%edx)" "\n\t" + + : [stat]"=m"(status) + : [index]"m"(index), + [rptr]"m"(regsPtr), + [ok]"i"(TCL_OK), + [error]"i"(TCL_ERROR) + : "%eax", "%ebx", "%ecx", "%edx", "%esi", "%edi", "memory" ); #elif defined(_MSC_VER) && !defined(_WIN64) @@ -1216,36 +1187,4 @@ TclWinCPUID( unsigned int index, /* Which CPUID value to retrieve */ #endif return status; } - -/* - *---------------------------------------------------------------------- - * - * _except_TclWinCPUID_detach_handler -- - * - * SEH exception handler for TclWinCPUID. - * - * Results: - * See TclWinCPUID. - * - * Side effects: - * See TclWinCPUID. - * - *---------------------------------------------------------------------- - */ - -#if defined( HAVE_NO_SEH ) -static -__attribute__((cdecl)) -EXCEPTION_DISPOSITION -_except_TclWinCPUID_detach_handler( - struct _EXCEPTION_RECORD *ExceptionRecord, - void *EstablisherFrame, - struct _CONTEXT *ContextRecord, - void *DispatcherContext) -{ - __asm__ __volatile__ ( - "jmp TclWinCPUID_detach_reentry" ); - return 0; /* Function does not return */ -} -#endif diff --git a/win/tclWinChan.c b/win/tclWinChan.c index d6ea38c..7cee496 100644 --- a/win/tclWinChan.c +++ b/win/tclWinChan.c @@ -9,7 +9,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclWinChan.c,v 1.39 2005/01/27 00:23:32 andreas_kupries Exp $ + * RCS: @(#) $Id: tclWinChan.c,v 1.40 2005/05/10 18:35:37 kennykb Exp $ */ #include "tclWinInt.h" diff --git a/win/tclWinConsole.c b/win/tclWinConsole.c index 1648ad7..2aa08b3 100644 --- a/win/tclWinConsole.c +++ b/win/tclWinConsole.c @@ -9,7 +9,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclWinConsole.c,v 1.13 2005/01/27 00:23:33 andreas_kupries Exp $ + * RCS: @(#) $Id: tclWinConsole.c,v 1.14 2005/05/10 18:35:37 kennykb Exp $ */ #include "tclWinInt.h" diff --git a/win/tclWinFCmd.c b/win/tclWinFCmd.c index 249b051..a5df717 100644 --- a/win/tclWinFCmd.c +++ b/win/tclWinFCmd.c @@ -9,7 +9,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclWinFCmd.c,v 1.44 2005/02/17 18:34:36 hobbs Exp $ + * RCS: @(#) $Id: tclWinFCmd.c,v 1.45 2005/05/10 18:35:37 kennykb Exp $ */ #include "tclWinInt.h" diff --git a/win/tclWinFile.c b/win/tclWinFile.c index 9c37ff4..e0ef6b3 100644 --- a/win/tclWinFile.c +++ b/win/tclWinFile.c @@ -11,7 +11,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclWinFile.c,v 1.73 2005/03/15 18:07:57 vincentdarley Exp $ + * RCS: @(#) $Id: tclWinFile.c,v 1.74 2005/05/10 18:35:38 kennykb Exp $ */ //#define _WIN32_WINNT 0x0500 diff --git a/win/tclWinInit.c b/win/tclWinInit.c index d8d4fc9..08b3d14 100644 --- a/win/tclWinInit.c +++ b/win/tclWinInit.c @@ -7,7 +7,7 @@ * Copyright (c) 1998-1999 by Scriptics Corporation. * All rights reserved. * - * RCS: @(#) $Id: tclWinInit.c,v 1.65 2004/12/04 21:19:19 dgp Exp $ + * RCS: @(#) $Id: tclWinInit.c,v 1.66 2005/05/10 18:35:39 kennykb Exp $ */ #include "tclWinInt.h" diff --git a/win/tclWinNotify.c b/win/tclWinNotify.c index fb92a7d..5a641c1 100644 --- a/win/tclWinNotify.c +++ b/win/tclWinNotify.c @@ -10,7 +10,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclWinNotify.c,v 1.18 2005/04/26 00:45:01 das Exp $ + * RCS: @(#) $Id: tclWinNotify.c,v 1.19 2005/05/10 18:35:40 kennykb Exp $ */ #include "tclInt.h" diff --git a/win/tclWinPipe.c b/win/tclWinPipe.c index d8a893d..34ed29f 100644 --- a/win/tclWinPipe.c +++ b/win/tclWinPipe.c @@ -9,7 +9,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclWinPipe.c,v 1.54 2005/01/27 00:23:34 andreas_kupries Exp $ + * RCS: @(#) $Id: tclWinPipe.c,v 1.55 2005/05/10 18:35:40 kennykb Exp $ */ #include "tclWinInt.h" diff --git a/win/tclWinSerial.c b/win/tclWinSerial.c index e06fb8e..582f952 100644 --- a/win/tclWinSerial.c +++ b/win/tclWinSerial.c @@ -11,7 +11,7 @@ * * Serial functionality implemented by Rolf.Schroedter@dlr.de * - * RCS: @(#) $Id: tclWinSerial.c,v 1.29 2005/01/27 00:23:35 andreas_kupries Exp $ + * RCS: @(#) $Id: tclWinSerial.c,v 1.30 2005/05/10 18:35:40 kennykb Exp $ */ #include "tclWinInt.h" diff --git a/win/tclWinSock.c b/win/tclWinSock.c index 60c535d..e96eb96 100644 --- a/win/tclWinSock.c +++ b/win/tclWinSock.c @@ -8,7 +8,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclWinSock.c,v 1.45 2005/01/27 00:23:35 andreas_kupries Exp $ + * RCS: @(#) $Id: tclWinSock.c,v 1.46 2005/05/10 18:35:41 kennykb Exp $ */ #include "tclWinInt.h" diff --git a/win/tclWinThrd.c b/win/tclWinThrd.c index d1f69ba..2b71f62 100644 --- a/win/tclWinThrd.c +++ b/win/tclWinThrd.c @@ -9,7 +9,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclWinThrd.c,v 1.36 2005/05/05 17:53:02 kennykb Exp $ + * RCS: @(#) $Id: tclWinThrd.c,v 1.37 2005/05/10 18:35:42 kennykb Exp $ */ #include "tclWinInt.h" diff --git a/win/tclWinTime.c b/win/tclWinTime.c index 47294df..25f4296 100644 --- a/win/tclWinTime.c +++ b/win/tclWinTime.c @@ -9,7 +9,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclWinTime.c,v 1.29 2005/01/21 22:25:35 andreas_kupries Exp $ + * RCS: @(#) $Id: tclWinTime.c,v 1.30 2005/05/10 18:35:43 kennykb Exp $ */ #include "tclInt.h" |